commit 66462a1b7d91327f4dd3e0ac9ba0da62ccb3103c Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu Sep 7 17:53:23 2023 +0000 deploy: f0d5e17be72cb5853da24c530d98a5e7bc0072e8 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..10f54f9 --- /dev/null +++ b/404.html @@ -0,0 +1,25 @@ + + + + + +Page Not Found | mf + + + + + + + + + + + + + +
+
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.8480cb83.css b/assets/css/styles.8480cb83.css new file mode 100644 index 0000000..d9292af --- /dev/null +++ b/assets/css/styles.8480cb83.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}.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)}.button--outline.button--active,.button--outline.button--primary:focus,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}: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-white:#fff;--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);--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;--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-tag-list-border:var(--ifm-color-emphasis-300)}.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}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)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{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)}.container_lyt7,.container_lyt7>svg,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,.tabList__CuJ{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_tbUL,.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--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;color:var(--ifm-link-color);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-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--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_S0QG>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q>:last-child,.footer__items,.tabItem_Ymn6>:last-child{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,.title_f1Hy{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;left:0;top:0;visibility:hidden}.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{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.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,.sidebarItemLink_mo7H: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}.DocSearch-Hit[aria-selected=true] mark,.content_knG7 a{text-decoration:underline}.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,.sidebarItemTitle_pO2u,.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)}.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;padding-left:0}.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}:root,[data-theme=dark]{--ifm-color-primary:#1d9bf0;--ifm-color-primary-dark:#0f8ee3;--ifm-color-primary-darker:#0e86d6;--ifm-color-primary-darkest:#0c6eb1;--ifm-color-primary-light:#36a6f2;--ifm-color-primary-lighter:#43acf3;--ifm-color-primary-lightest:#69bcf5}code,kbd,pre,text,tt,var{font-family:Cascadia Code PL,JetBrains Mono,Iosevka,Fira Code,Hack,monospace}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[data-theme=dark] .light-mode-only,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=dark] img[src$="#gh-light-mode-only"],[data-theme=light] .dark-mode-only,[data-theme=light] .darkToggleIcon_wfgR,[data-theme=light] img[src$="#gh-dark-mode-only"],html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.button--outline:focus{--ifm-button-background-color:var(--ifm-button-border-color)}.button__icon{fill:var(--ifm-button-color);display:inline-block;height:18px;margin-right:.5rem;position:relative;top:3px;width:18px}.button--secondary .button__icon{fill:var(--ifm-color-gray-900)}.algoliaLogoPathFill_WdUC,[data-theme=dark] .button--secondary .button__icon,[data-theme=dark] .icon_PlDd,[data-theme=dark] .icon_R7DV{fill:var(--ifm-font-color-base)}[data-theme=dark] .button--outline.button--active .button__icon,[data-theme=dark] .button--outline:active .button__icon,[data-theme=dark] .button--outline:focus .button__icon,[data-theme=dark] .button--outline:hover .button__icon{fill:var(--ifm-font-color-base-inverse)}@font-face{font-family:JetBrains Mono;src:url(/assets/fonts/JetBrainsMono[wght]-9e9649b60ff61727d1aa4e9a1a10a93c.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:italic;src:url(/assets/fonts/JetBrainsMono-Italic[wght]-3b3bdc43604f6a6a23ccdf1b46ad815c.woff2) format("woff2")}[data-theme=dark] code,[data-theme=dark] kbd,[data-theme=dark] pre,[data-theme=dark] text,[data-theme=dark] tt,[data-theme=dark] var{font-weight:350}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.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;z-index:calc(var(--ifm-z-index-fixed) + 1)}.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] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.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}.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}.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%}.sidebar_re4s{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.card_h7vX,.card_n_Wj{border:1px solid var(--ifm-color-emphasis-300);box-shadow:none;margin-bottom:calc(var(--ifm-spacing-horizontal)*2)}.contributionsContainer_vdAK,.eventDetailsContainer_ujlS{border-left:1px solid var(--ifm-color-emphasis-300)}.list_B4_2,.list_DjY4{list-style-type:none;padding-left:0}.buttons_UAd1 a+a,.buttons_jSVm a+a{margin-left:.5em}.icon_PlDd,.icon_R7DV{display:inline-block;height:22px;margin-right:.3rem;position:relative;top:4px;width:22px}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.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}.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 a;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes a{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}.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}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.buttons_AeoN,.features_t9lD{align-items:center;display:flex}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.features_t9lD{padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{justify-content:center}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.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--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-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 b;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}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon,.tocCollapsibleContent_vkbj a{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}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}@keyframes b{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container{z-index:calc(var(--ifm-z-index-fixed) + 1)}.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)}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.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}.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}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.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%}.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}.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)}.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:"#"}.containsTaskList_mC6p{list-style:none}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.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}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.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_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_: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_m80_{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_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{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_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.buttons_UAd1 a+a,.buttons_jSVm a+a,.col{margin-left:0}.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width)}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.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}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.contributionsContainer_vdAK,.eventDetailsContainer_ujlS{border-left:0;border-top:1px solid var(--ifm-color-emphasis-300);padding-top:var(--ifm-spacing-vertical)}.buttons_UAd1>a,.buttons_jSVm>a{margin-top:calc(var(--ifm-spacing-vertical)/2);width:100%}.docItemContainer_F8PC{padding:0 .3rem}}@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 screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@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}.title_f1Hy{font-size:2rem}}@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;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/fonts/JetBrainsMono-Italic[wght]-3b3bdc43604f6a6a23ccdf1b46ad815c.woff2 b/assets/fonts/JetBrainsMono-Italic[wght]-3b3bdc43604f6a6a23ccdf1b46ad815c.woff2 new file mode 100644 index 0000000..ceb9552 Binary files /dev/null and b/assets/fonts/JetBrainsMono-Italic[wght]-3b3bdc43604f6a6a23ccdf1b46ad815c.woff2 differ diff --git a/assets/fonts/JetBrainsMono[wght]-9e9649b60ff61727d1aa4e9a1a10a93c.woff2 b/assets/fonts/JetBrainsMono[wght]-9e9649b60ff61727d1aa4e9a1a10a93c.woff2 new file mode 100644 index 0000000..12a1089 Binary files /dev/null and b/assets/fonts/JetBrainsMono[wght]-9e9649b60ff61727d1aa4e9a1a10a93c.woff2 differ diff --git a/assets/images/bfs_graph_dark-f7a3a78eaf9de049469b4c64e0712867.png b/assets/images/bfs_graph_dark-f7a3a78eaf9de049469b4c64e0712867.png new file mode 100644 index 0000000..2b06433 Binary files /dev/null and b/assets/images/bfs_graph_dark-f7a3a78eaf9de049469b4c64e0712867.png differ diff --git a/assets/images/bfs_graph_light-6e21a942bccd92bcce6840da7c3cb056.png b/assets/images/bfs_graph_light-6e21a942bccd92bcce6840da7c3cb056.png new file mode 100644 index 0000000..3a47c34 Binary files /dev/null and b/assets/images/bfs_graph_light-6e21a942bccd92bcce6840da7c3cb056.png differ diff --git a/assets/images/bfs_graph_with_additional_edge_dark-c2da6c052b067785e877b4654a13f328.png b/assets/images/bfs_graph_with_additional_edge_dark-c2da6c052b067785e877b4654a13f328.png new file mode 100644 index 0000000..e05d0e0 Binary files /dev/null and b/assets/images/bfs_graph_with_additional_edge_dark-c2da6c052b067785e877b4654a13f328.png differ diff --git a/assets/images/bfs_graph_with_additional_edge_light-799673ba333298d16327abe67c90507e.png b/assets/images/bfs_graph_with_additional_edge_light-799673ba333298d16327abe67c90507e.png new file mode 100644 index 0000000..63d9ee2 Binary files /dev/null and b/assets/images/bfs_graph_with_additional_edge_light-799673ba333298d16327abe67c90507e.png differ diff --git a/assets/images/bfs_tree_dark-34f32262c6e4ffc14983b3ebf9a2f5a9.png b/assets/images/bfs_tree_dark-34f32262c6e4ffc14983b3ebf9a2f5a9.png new file mode 100644 index 0000000..443fea5 Binary files /dev/null and b/assets/images/bfs_tree_dark-34f32262c6e4ffc14983b3ebf9a2f5a9.png differ diff --git a/assets/images/bfs_tree_light-61d6723c3c587d565b6280b8b8eca211.png b/assets/images/bfs_tree_light-61d6723c3c587d565b6280b8b8eca211.png new file mode 100644 index 0000000..2cf7ae4 Binary files /dev/null and b/assets/images/bfs_tree_light-61d6723c3c587d565b6280b8b8eca211.png differ diff --git a/assets/images/bfs_tree_with_additional_edge_dark-127aa5b00988d4569669a92f5d841dbf.png b/assets/images/bfs_tree_with_additional_edge_dark-127aa5b00988d4569669a92f5d841dbf.png new file mode 100644 index 0000000..1b1fc63 Binary files /dev/null and b/assets/images/bfs_tree_with_additional_edge_dark-127aa5b00988d4569669a92f5d841dbf.png differ diff --git a/assets/images/bfs_tree_with_additional_edge_light-93df97e1f9f1883467248532809374d0.png b/assets/images/bfs_tree_with_additional_edge_light-93df97e1f9f1883467248532809374d0.png new file mode 100644 index 0000000..fe54693 Binary files /dev/null and b/assets/images/bfs_tree_with_additional_edge_light-93df97e1f9f1883467248532809374d0.png differ diff --git a/assets/images/br_2_dark-e8c35bc37b250271cf480f71904c15a7.png b/assets/images/br_2_dark-e8c35bc37b250271cf480f71904c15a7.png new file mode 100644 index 0000000..e31c482 Binary files /dev/null and b/assets/images/br_2_dark-e8c35bc37b250271cf480f71904c15a7.png differ diff --git a/assets/images/br_2_light-5e6a1d53e559a30e5fb86ee019229bbd.png b/assets/images/br_2_light-5e6a1d53e559a30e5fb86ee019229bbd.png new file mode 100644 index 0000000..fdbf993 Binary files /dev/null and b/assets/images/br_2_light-5e6a1d53e559a30e5fb86ee019229bbd.png differ diff --git a/assets/images/br_3_dark-a2b8248c182059b67c703f75f58f3784.png b/assets/images/br_3_dark-a2b8248c182059b67c703f75f58f3784.png new file mode 100644 index 0000000..5ec0154 Binary files /dev/null and b/assets/images/br_3_dark-a2b8248c182059b67c703f75f58f3784.png differ diff --git a/assets/images/br_3_light-7be3bbcb08f8b7182a1c719693a47615.png b/assets/images/br_3_light-7be3bbcb08f8b7182a1c719693a47615.png new file mode 100644 index 0000000..a6470aa Binary files /dev/null and b/assets/images/br_3_light-7be3bbcb08f8b7182a1c719693a47615.png differ diff --git a/assets/images/br_4_dark-eddf4c315becc51f89b0967320f132d8.png b/assets/images/br_4_dark-eddf4c315becc51f89b0967320f132d8.png new file mode 100644 index 0000000..0878a05 Binary files /dev/null and b/assets/images/br_4_dark-eddf4c315becc51f89b0967320f132d8.png differ diff --git a/assets/images/br_4_light-d72dfa633794ec97eddce8e3a4b02660.png b/assets/images/br_4_light-d72dfa633794ec97eddce8e3a4b02660.png new file mode 100644 index 0000000..891c044 Binary files /dev/null and b/assets/images/br_4_light-d72dfa633794ec97eddce8e3a4b02660.png differ diff --git a/assets/images/br_5_dark-e24da2d7a3fb2ee63ac8e1ea9c2d45a8.png b/assets/images/br_5_dark-e24da2d7a3fb2ee63ac8e1ea9c2d45a8.png new file mode 100644 index 0000000..df8d545 Binary files /dev/null and b/assets/images/br_5_dark-e24da2d7a3fb2ee63ac8e1ea9c2d45a8.png differ diff --git a/assets/images/br_5_light-efb3568bf4aadb19a9dcc57e748f89d8.png b/assets/images/br_5_light-efb3568bf4aadb19a9dcc57e748f89d8.png new file mode 100644 index 0000000..2d18350 Binary files /dev/null and b/assets/images/br_5_light-efb3568bf4aadb19a9dcc57e748f89d8.png differ diff --git a/assets/images/br_6_dark-160fd071a93e279a5339c7976745f8b1.png b/assets/images/br_6_dark-160fd071a93e279a5339c7976745f8b1.png new file mode 100644 index 0000000..4aa0194 Binary files /dev/null and b/assets/images/br_6_dark-160fd071a93e279a5339c7976745f8b1.png differ diff --git a/assets/images/br_6_light-b090675f7b30b574af44d667b083e9b7.png b/assets/images/br_6_light-b090675f7b30b574af44d667b083e9b7.png new file mode 100644 index 0000000..7483fe8 Binary files /dev/null and b/assets/images/br_6_light-b090675f7b30b574af44d667b083e9b7.png differ diff --git a/assets/images/br_7_dark-35ede8f297484f4305ea7fd23cbddc49.png b/assets/images/br_7_dark-35ede8f297484f4305ea7fd23cbddc49.png new file mode 100644 index 0000000..3ea4864 Binary files /dev/null and b/assets/images/br_7_dark-35ede8f297484f4305ea7fd23cbddc49.png differ diff --git a/assets/images/br_7_light-018e13c41ce1fc6257c4c65748aaae27.png b/assets/images/br_7_light-018e13c41ce1fc6257c4c65748aaae27.png new file mode 100644 index 0000000..8e75618 Binary files /dev/null and b/assets/images/br_7_light-018e13c41ce1fc6257c4c65748aaae27.png differ diff --git a/assets/images/br_8_dark-b0f871ab182d06edb5c29bb490ad70bc.png b/assets/images/br_8_dark-b0f871ab182d06edb5c29bb490ad70bc.png new file mode 100644 index 0000000..f68c4c2 Binary files /dev/null and b/assets/images/br_8_dark-b0f871ab182d06edb5c29bb490ad70bc.png differ diff --git a/assets/images/br_8_light-81ac4c8a3988bd43c66f563cd4799d61.png b/assets/images/br_8_light-81ac4c8a3988bd43c66f563cd4799d61.png new file mode 100644 index 0000000..d2cb42b Binary files /dev/null and b/assets/images/br_8_light-81ac4c8a3988bd43c66f563cd4799d61.png differ diff --git a/assets/images/calendar-f891b624f3e0efb34bba582100a7d8df.png b/assets/images/calendar-f891b624f3e0efb34bba582100a7d8df.png new file mode 100644 index 0000000..d7c9bff Binary files /dev/null and b/assets/images/calendar-f891b624f3e0efb34bba582100a7d8df.png differ diff --git a/assets/images/construction_dark-fcb91acb746c787329bf9bd3cb54c5b7.png b/assets/images/construction_dark-fcb91acb746c787329bf9bd3cb54c5b7.png new file mode 100644 index 0000000..58e8fca Binary files /dev/null and b/assets/images/construction_dark-fcb91acb746c787329bf9bd3cb54c5b7.png differ diff --git a/assets/images/construction_light-dda6c5aa625d6e6c14c01589117281c2.png b/assets/images/construction_light-dda6c5aa625d6e6c14c01589117281c2.png new file mode 100644 index 0000000..d5b60de Binary files /dev/null and b/assets/images/construction_light-dda6c5aa625d6e6c14c01589117281c2.png differ diff --git a/assets/images/correct_dark-bbd8d4c1796b145025fed5b6dff03b84.png b/assets/images/correct_dark-bbd8d4c1796b145025fed5b6dff03b84.png new file mode 100644 index 0000000..a6473fa Binary files /dev/null and b/assets/images/correct_dark-bbd8d4c1796b145025fed5b6dff03b84.png differ diff --git a/assets/images/correct_light-bc4770146072f748be4a5aa11abf3a0c.png b/assets/images/correct_light-bc4770146072f748be4a5aa11abf3a0c.png new file mode 100644 index 0000000..26a58d5 Binary files /dev/null and b/assets/images/correct_light-bc4770146072f748be4a5aa11abf3a0c.png differ diff --git a/assets/images/incorrect_dark-9b8b3be328ffad83233de4536c120016.png b/assets/images/incorrect_dark-9b8b3be328ffad83233de4536c120016.png new file mode 100644 index 0000000..397fdc5 Binary files /dev/null and b/assets/images/incorrect_dark-9b8b3be328ffad83233de4536c120016.png differ diff --git a/assets/images/incorrect_light-e787e568e9a1528dcac5bf55ef29fdaa.png b/assets/images/incorrect_light-e787e568e9a1528dcac5bf55ef29fdaa.png new file mode 100644 index 0000000..4e5e452 Binary files /dev/null and b/assets/images/incorrect_light-e787e568e9a1528dcac5bf55ef29fdaa.png differ diff --git a/assets/images/maze-a374d908bc9445061e15faeddc71641e.png b/assets/images/maze-a374d908bc9445061e15faeddc71641e.png new file mode 100644 index 0000000..914cb66 Binary files /dev/null and b/assets/images/maze-a374d908bc9445061e15faeddc71641e.png differ diff --git a/assets/images/rb_dark-c025d61dee7913262c86277087751328.png b/assets/images/rb_dark-c025d61dee7913262c86277087751328.png new file mode 100644 index 0000000..450a983 Binary files /dev/null and b/assets/images/rb_dark-c025d61dee7913262c86277087751328.png differ diff --git a/assets/images/rb_height_dark-75a70ddff74e5e1aff7e9986221b5687.png b/assets/images/rb_height_dark-75a70ddff74e5e1aff7e9986221b5687.png new file mode 100644 index 0000000..0a9c6c7 Binary files /dev/null and b/assets/images/rb_height_dark-75a70ddff74e5e1aff7e9986221b5687.png differ diff --git a/assets/images/rb_height_light-36fa69317ced094d7bb7b0fdf32cb3fe.png b/assets/images/rb_height_light-36fa69317ced094d7bb7b0fdf32cb3fe.png new file mode 100644 index 0000000..1b611c7 Binary files /dev/null and b/assets/images/rb_height_light-36fa69317ced094d7bb7b0fdf32cb3fe.png differ diff --git a/assets/images/rb_light-f53bee3b32ddb2e7a4249828bc03b1a4.png b/assets/images/rb_light-f53bee3b32ddb2e7a4249828bc03b1a4.png new file mode 100644 index 0000000..a73079e Binary files /dev/null and b/assets/images/rb_light-f53bee3b32ddb2e7a4249828bc03b1a4.png differ diff --git a/assets/images/rr_2_dark-e8c35bc37b250271cf480f71904c15a7.png b/assets/images/rr_2_dark-e8c35bc37b250271cf480f71904c15a7.png new file mode 100644 index 0000000..e31c482 Binary files /dev/null and b/assets/images/rr_2_dark-e8c35bc37b250271cf480f71904c15a7.png differ diff --git a/assets/images/rr_2_light-5e6a1d53e559a30e5fb86ee019229bbd.png b/assets/images/rr_2_light-5e6a1d53e559a30e5fb86ee019229bbd.png new file mode 100644 index 0000000..fdbf993 Binary files /dev/null and b/assets/images/rr_2_light-5e6a1d53e559a30e5fb86ee019229bbd.png differ diff --git a/assets/images/rr_3_dark-4e8b2ca938738395e438b7fc2fc5dfe4.png b/assets/images/rr_3_dark-4e8b2ca938738395e438b7fc2fc5dfe4.png new file mode 100644 index 0000000..e8c10fe Binary files /dev/null and b/assets/images/rr_3_dark-4e8b2ca938738395e438b7fc2fc5dfe4.png differ diff --git a/assets/images/rr_3_light-51521ba414ff3a3530ed0109cfab799d.png b/assets/images/rr_3_light-51521ba414ff3a3530ed0109cfab799d.png new file mode 100644 index 0000000..d236d68 Binary files /dev/null and b/assets/images/rr_3_light-51521ba414ff3a3530ed0109cfab799d.png differ diff --git a/assets/images/rr_4_dark-3cc1c8d4b39707d2a51b51f4f1b29dc8.png b/assets/images/rr_4_dark-3cc1c8d4b39707d2a51b51f4f1b29dc8.png new file mode 100644 index 0000000..c5614a0 Binary files /dev/null and b/assets/images/rr_4_dark-3cc1c8d4b39707d2a51b51f4f1b29dc8.png differ diff --git a/assets/images/rr_4_light-631a0b3947be21a12b3a489f0cd0c3c4.png b/assets/images/rr_4_light-631a0b3947be21a12b3a489f0cd0c3c4.png new file mode 100644 index 0000000..80c47f8 Binary files /dev/null and b/assets/images/rr_4_light-631a0b3947be21a12b3a489f0cd0c3c4.png differ diff --git a/assets/images/rr_5_dark-9028cc10e78c05cb669d5d438dcbf93f.png b/assets/images/rr_5_dark-9028cc10e78c05cb669d5d438dcbf93f.png new file mode 100644 index 0000000..b7ce250 Binary files /dev/null and b/assets/images/rr_5_dark-9028cc10e78c05cb669d5d438dcbf93f.png differ diff --git a/assets/images/rr_5_light-6b8f80047906eb1f58472d231eb9b12a.png b/assets/images/rr_5_light-6b8f80047906eb1f58472d231eb9b12a.png new file mode 100644 index 0000000..e32514a Binary files /dev/null and b/assets/images/rr_5_light-6b8f80047906eb1f58472d231eb9b12a.png differ diff --git a/assets/images/rr_6_dark-160fd071a93e279a5339c7976745f8b1.png b/assets/images/rr_6_dark-160fd071a93e279a5339c7976745f8b1.png new file mode 100644 index 0000000..4aa0194 Binary files /dev/null and b/assets/images/rr_6_dark-160fd071a93e279a5339c7976745f8b1.png differ diff --git a/assets/images/rr_6_light-b090675f7b30b574af44d667b083e9b7.png b/assets/images/rr_6_light-b090675f7b30b574af44d667b083e9b7.png new file mode 100644 index 0000000..7483fe8 Binary files /dev/null and b/assets/images/rr_6_light-b090675f7b30b574af44d667b083e9b7.png differ diff --git a/assets/images/rr_7_dark-35ede8f297484f4305ea7fd23cbddc49.png b/assets/images/rr_7_dark-35ede8f297484f4305ea7fd23cbddc49.png new file mode 100644 index 0000000..3ea4864 Binary files /dev/null and b/assets/images/rr_7_dark-35ede8f297484f4305ea7fd23cbddc49.png differ diff --git a/assets/images/rr_7_light-018e13c41ce1fc6257c4c65748aaae27.png b/assets/images/rr_7_light-018e13c41ce1fc6257c4c65748aaae27.png new file mode 100644 index 0000000..8e75618 Binary files /dev/null and b/assets/images/rr_7_light-018e13c41ce1fc6257c4c65748aaae27.png differ diff --git a/assets/images/rr_8_dark-b0f871ab182d06edb5c29bb490ad70bc.png b/assets/images/rr_8_dark-b0f871ab182d06edb5c29bb490ad70bc.png new file mode 100644 index 0000000..f68c4c2 Binary files /dev/null and b/assets/images/rr_8_dark-b0f871ab182d06edb5c29bb490ad70bc.png differ diff --git a/assets/images/rr_8_light-81ac4c8a3988bd43c66f563cd4799d61.png b/assets/images/rr_8_light-81ac4c8a3988bd43c66f563cd4799d61.png new file mode 100644 index 0000000..d2cb42b Binary files /dev/null and b/assets/images/rr_8_light-81ac4c8a3988bd43c66f563cd4799d61.png differ diff --git a/assets/images/stairs-5ee5d03905645aeb13eeaa7774451a64.png b/assets/images/stairs-5ee5d03905645aeb13eeaa7774451a64.png new file mode 100644 index 0000000..9d1d8b1 Binary files /dev/null and b/assets/images/stairs-5ee5d03905645aeb13eeaa7774451a64.png differ diff --git a/assets/images/tdd_lifecycle-327ad9ee0ed8318ed11e19a28e02b2cc.png b/assets/images/tdd_lifecycle-327ad9ee0ed8318ed11e19a28e02b2cc.png new file mode 100644 index 0000000..e3668c1 Binary files /dev/null and b/assets/images/tdd_lifecycle-327ad9ee0ed8318ed11e19a28e02b2cc.png differ diff --git a/assets/images/tree-c9e37f87f9095c00fad33ea034485ce6.png b/assets/images/tree-c9e37f87f9095c00fad33ea034485ce6.png new file mode 100644 index 0000000..47f96d6 Binary files /dev/null and b/assets/images/tree-c9e37f87f9095c00fad33ea034485ce6.png differ diff --git a/assets/js/01a85c17.02ca9acb.js b/assets/js/01a85c17.02ca9acb.js new file mode 100644 index 0000000..ebe9f51 --- /dev/null +++ b/assets/js/01a85c17.02ca9acb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4013],{9058:(e,t,a)=>{a.d(t,{Z:()=>E});var l=a(7294),r=a(6010),n=a(7452),s=a(7524),i=a(9960),c=a(5999);const m={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function o(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,r.Z)(m.sidebar,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,r.Z)(m.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,r.Z)(m.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:m.sidebarItem},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:m.sidebarItemLink,activeClassName:m.sidebarItemLinkActive},e.title)))))))}var u=a(3102);function g(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function d(e){return l.createElement(u.Zo,{component:g,props:e})}function b(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(d,{sidebar:t}):l.createElement(o,{sidebar:t}):null}function E(e){const{sidebar:t,toc:a,children:s,...i}=e,c=t&&t.items.length>0;return l.createElement(n.Z,i,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(b,{sidebar:t}),l.createElement("main",{className:(0,r.Z)("col",{"col--7":c,"col--9 col--offset-1":!c}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},4524:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(7294),r=a(6010),n=a(5155),s=a(833),i=a(5281),c=a(9058),m=a(6090),o=a(197);function u(e){let{tags:t,sidebar:a}=e;const u=(0,n.M)();return l.createElement(s.FG,{className:(0,r.Z)(i.k.wrapper.blogPages,i.k.page.blogTagsListPage)},l.createElement(s.d,{title:u}),l.createElement(o.Z,{tag:"blog_tags_list"}),l.createElement(c.Z,{sidebar:a},l.createElement("h1",null,u),l.createElement(m.Z,{tags:t})))}},3008:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(7294),r=a(6010),n=a(9960);const s={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function i(e){let{permalink:t,label:a,count:i}=e;return l.createElement(n.Z,{href:t,className:(0,r.Z)(s.tag,i?s.tagWithCount:s.tagRegular)},a,i&&l.createElement("span",null,i))}},6090:(e,t,a)=>{a.d(t,{Z:()=>c});var l=a(7294),r=a(5155),n=a(3008);const s={tag:"tag_Nnez"};function i(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:s.tag},l.createElement(n.Z,e))))),l.createElement("hr",null))}function c(e){let{tags:t}=e;const a=(0,r.P)(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(i,{key:e.letter,letterEntry:e}))))}},5155:(e,t,a)=>{a.d(t,{M:()=>r,P:()=>n});var l=a(5999);const r=()=>(0,l.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function n(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/0220f5fc.5b1b8f6e.js b/assets/js/0220f5fc.5b1b8f6e.js new file mode 100644 index 0000000..c1b7a12 --- /dev/null +++ b/assets/js/0220f5fc.5b1b8f6e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1378],{5804:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-blog","id":"blog"}')}}]); \ No newline at end of file diff --git a/assets/js/0608d96f.ee46e047.js b/assets/js/0608d96f.ee46e047.js new file mode 100644 index 0000000..b347ce5 --- /dev/null +++ b/assets/js/0608d96f.ee46e047.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7568],{7158:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/vps","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/09bc59e7.64a221ae.js b/assets/js/09bc59e7.64a221ae.js new file mode 100644 index 0000000..1c18e99 --- /dev/null +++ b/assets/js/09bc59e7.64a221ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4932],{3649:e=>{e.exports=JSON.parse('{"title":"Graphs","description":"Materials related to basic graph algorithms and graph problems.\\n","slug":"/category/graphs","permalink":"/ib002/category/graphs","navigation":{"previous":{"title":"On the rules of the red-black tree","permalink":"/ib002/rb-trees/rules"},"next":{"title":"Iterative algorithms via iterators","permalink":"/ib002/graphs/iterative-and-iterators"}}}')}}]); \ No newline at end of file diff --git a/assets/js/0bfe45d5.58ce388b.js b/assets/js/0bfe45d5.58ce388b.js new file mode 100644 index 0000000..40d7bbb --- /dev/null +++ b/assets/js/0bfe45d5.58ce388b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4269],{3847:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/rust","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/0fcbc6ca.e8ea4c91.js b/assets/js/0fcbc6ca.e8ea4c91.js new file mode 100644 index 0000000..e64d18f --- /dev/null +++ b/assets/js/0fcbc6ca.e8ea4c91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1851],{9900:(e,t,a)=>{a.r(t),a.d(t,{default:()=>S});var n=a(7462),l=a(7294),r=a(7452),c=a(6010);const o="card_h7vX",i="eventDetailsContainer_ujlS",s="list_DjY4",m="buttons_jSVm",v="icon_R7DV";var h,u;function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:a,...n}=e;return l.createElement("svg",d({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":a},n),t?l.createElement("title",{id:a},t):null,h||(h=l.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),u||(u=l.createElement("path",{d:"M2 3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993H2.992A.993.993 0 0 1 2 20.007V3.993zM8 5v14h8V5H8zM4 5v2h2V5H4zm14 0v2h2V5h-2zM4 9v2h2V9H4zm14 0v2h2V9h-2zM4 13v2h2v-2H4zm14 0v2h2v-2h-2zM4 17v2h2v-2H4zm14 0v2h2v-2h-2z"})))};var E,b;function g(){return g=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:a,...n}=e;return l.createElement("svg",g({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":a},n),t?l.createElement("title",{id:a},t):null,E||(E=l.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),b||(b=l.createElement("path",{d:"M13 18v2h4v2H7v-2h4v-2H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-8zM4 5v11h16V5H4zm6 2.5 5 3-5 3v-6z"})))};var w,z;function y(){return y=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:a,...n}=e;return l.createElement("svg",y({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":a},n),t?l.createElement("title",{id:a},t):null,w||(w=l.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),z||(z=l.createElement("path",{d:"M13 21v2.5l-3-2-3 2V21h-.5A3.5 3.5 0 0 1 3 17.5V5a3 3 0 0 1 3-3h14a1 1 0 0 1 1 1v17a1 1 0 0 1-1 1h-7zm0-2h6v-3H6.5a1.5 1.5 0 0 0 0 3H7v-2h6v2zm6-5V4H6v10.035A3.53 3.53 0 0 1 6.5 14H19zM7 5h2v2H7V5zm0 3h2v2H7V8zm0 3h2v2H7v-2z"})))};var O,M;function N(){return N=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:a,...n}=e;return l.createElement("svg",N({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":a},n),t?l.createElement("title",{id:a},t):null,O||(O=l.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),M||(M=l.createElement("path",{d:"M17 3h4a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h4V1h2v2h6V1h2v2zm-2 2H9v2H7V5H4v4h16V5h-3v2h-2V5zm5 6H4v8h16v-8z"})))};var V,_;function k(){return k=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:a,...n}=e;return l.createElement("svg",k({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":a},n),t?l.createElement("title",{id:a},t):null,V||(V=l.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),_||(_=l.createElement("path",{d:"M6.455 19 2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6.455zm-.692-2H20V5H4v13.385L5.763 17zM11 10h2v2h-2v-2zm-4 0h2v2H7v-2zm8 0h2v2h-2v-2z"})))};var P,C;function D(){return D=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:a,...n}=e;return l.createElement("svg",D({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":a},n),t?l.createElement("title",{id:a},t):null,P||(P=l.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),C||(C=l.createElement("path",{d:"m12 23.728-6.364-6.364a9 9 0 1 1 12.728 0L12 23.728zm4.95-7.778a7 7 0 1 0-9.9 0L12 20.9l4.95-4.95zM12 13a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"})))},R=e=>{let{data:t}=e;if(0===t.length)return null;const[a,...n]=t,{name:r,location:c,date:o}=a;return l.createElement("div",{className:"row"},l.createElement("div",{className:"col col--12"},l.createElement("ul",{className:s},l.createElement("li",null,l.createElement(x,{className:v})," ",l.createElement("strong",null,r)),l.createElement("li",null,l.createElement(L,{className:v})," ",c),l.createElement("li",null,l.createElement(j,{className:v})," ",I(o)))),t.length>1&&l.createElement("div",{className:"col col--12"},l.createElement("p",{className:"margin--none"},"Also presented on:"),l.createElement("ul",null,n.map((e=>{let{name:t,location:a,date:n}=e;return l.createElement("li",{key:t},l.createElement("strong",null,t)," in ",a," (",I(n),")")})))))};function I(e){return`${e.getMonth()+1}/${e.getUTCFullYear()}`}const B=e=>{let{title:t,description:a,events:n=[],recordingURL:r,slidesURL:s,repoURL:v}=e;return l.createElement("div",{className:"col col--12"},l.createElement("div",{className:(0,c.Z)("card",o)},l.createElement("div",{className:"card__header"},l.createElement("h2",null,t)),l.createElement("div",{className:"card__body"},l.createElement("div",{className:"row"},l.createElement("div",{className:"col col--7"},a),l.createElement("div",{className:(0,c.Z)("col col--5",i)},l.createElement(R,{data:n})))),l.createElement("div",{className:"card__footer"},l.createElement("div",{className:m},r&&l.createElement("a",{href:r,target:"_blank",className:"button button--primary button--outline"},l.createElement("span",{className:"button__icon"},l.createElement(p,null)),"Watch recording"),s&&l.createElement("a",{href:s,target:"_blank",className:"button button--secondary button--outline"},l.createElement("span",{className:"button__icon"},l.createElement(f,null)),"See slides"),v&&l.createElement("a",{href:v,target:"_blank",className:"button button--secondary button--outline"},l.createElement("span",{className:"button__icon"},l.createElement(H,null)),"See repository")))))},F=[{title:"Packit: RPM integration, all in one",description:l.createElement(l.Fragment,null,"Do you want to automate how you build and test your RPM packages? Do you maintain any package in Fedora and want to automate the releases? Or are you just interested in CI/CD on GitHub or GitLab, Fedora and integration of upstream projects with RPM-based Linux distributions? In this session, we are going to deep-dive into features of Packit that can help you do your day-to-day job."),events:[{name:"DevConf.cz",location:"Brno, Czechia",date:new Date(2023,5,17)},{name:"DevConf.cz Mini",location:"Brno, Czechia",date:new Date(2023,2,31)}],recordingURL:"https://www.youtube.com/watch?v=FxhXzgxWO18",slidesURL:"https://static.sched.com/hosted_files/devconfcz2023/37/DevConf.cz%20June%202023%20Packit%20talk-1.pdf"}],U="Talks",A="Featured talks I presented on various events.";function S(){return l.createElement(r.Z,{title:U,description:A},l.createElement("main",{className:"container container--fluid margin-vert--lg"},l.createElement("h1",null,U),l.createElement("p",null,A),l.createElement("div",{className:"row"},F.map((e=>l.createElement(B,(0,n.Z)({key:e.title},e))))),l.createElement("hr",null),l.createElement("p",null,"Credits to ",l.createElement("a",{href:"https://kosiec.dev/",target:"_blank"},"Pawe\u0142 Kosiec")," for implementing his own React components for talks.")))}}}]); \ No newline at end of file diff --git a/assets/js/1426.d90fc9fa.js b/assets/js/1426.d90fc9fa.js new file mode 100644 index 0000000..cdeb00a --- /dev/null +++ b/assets/js/1426.d90fc9fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1426],{1426:(e,t,r)=>{function n(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;ipn});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);re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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=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;r0&&i("clickedObjectIDsAfterSearch",g(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("clickedObjectIDs",g(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n0&&e.apply(void 0,["clickedFilters"].concat(r))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("convertedObjectIDsAfterSearch",g(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("convertedObjectIDs",g(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n0&&e.apply(void 0,["convertedFilters"].concat(r))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&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;n0&&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);r0&&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 _(e){return _="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)}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"!==_(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==_(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===_(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;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r0},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;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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,_e);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=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;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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(_t,null);default:return yt.createElement(Nt,null)}}function Nt(){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 _t(){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=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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|<\/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=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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(830),fr=["translations"];function mr(){return mr=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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+tPromise.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.19.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 Nr(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 _r={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=>Nr(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===_r.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!==_r.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=>Nr(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===_r.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:_r.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:_r.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:_r.Post,path:Er("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),Qr=e=>(t,r,n)=>e.transporter.read({method:_r.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;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=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,N=mn(I,on),_=sn(yt.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),T=_[0],q=_[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:"",highlightPostTag:"",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.length0&&(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:N,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 diff --git a/assets/js/146d9b84.996dfbcb.js b/assets/js/146d9b84.996dfbcb.js new file mode 100644 index 0000000..bc4ba46 --- /dev/null +++ b/assets/js/146d9b84.996dfbcb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9300],{6671:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/admin","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.9c4e865a.js b/assets/js/14eb3368.9c4e865a.js new file mode 100644 index 0000000..8fe08fa --- /dev/null +++ b/assets/js/14eb3368.9c4e865a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9817],{1310:(e,t,a)=>{a.d(t,{Z:()=>E});var n=a(7462),r=a(7294),i=a(6010),l=a(5281),s=a(3438),c=a(8596),o=a(9960),m=a(5999),d=a(4996);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.createElement("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 h={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},r.createElement(u,{className:h.breadcrumbHomeIcon})))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function g(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:a,index:l,addMicrodata:s}=e;return r.createElement("li",(0,n.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(p,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:n},t.label))})))):null}},4228:(e,t,a)=>{a.r(t),a.d(t,{default:()=>y});var n=a(7294),r=a(833),i=a(3438),l=a(4996),s=a(6010),c=a(9960),o=a(3919),m=a(5999);const d={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:a}=e;return n.createElement(c.Z,{href:t,className:(0,s.Z)("card padding--lg",d.cardContainer)},a)}function h(e){let{href:t,icon:a,title:r,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,s.Z)("text--truncate",d.cardTitle),title:r},a," ",r),i&&n.createElement("p",{className:(0,s.Z)("text--truncate",d.cardDescription),title:i},i))}function b(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(h,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function v(e){let{item:t}=e;const a=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(h,{href:t.href,icon:a,title:t.label,description:t.description??r?.description})}function g(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(v,{item:t});case"category":return n.createElement(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function p(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(E,{items:a.items,className:t})}function E(e){const{items:t,className:a}=e;if(!t)return n.createElement(p,e);const r=(0,i.MN)(t);return n.createElement("section",{className:(0,s.Z)("row",a)},r.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(g,{item:e})))))}var f=a(49),N=a(3120),Z=a(4364),k=a(1310),L=a(7955);const _={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function x(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:_.generatedIndexPage},n.createElement(N.Z,null),n.createElement(k.Z,null),n.createElement(Z.Z,null),n.createElement("header",null,n.createElement(L.Z,{as:"h1",className:_.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(E,{items:a.items,className:_.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(f.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function y(e){return n.createElement(n.Fragment,null,n.createElement(T,e),n.createElement(x,e))}},49:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7462),r=a(7294),i=a(5999),l=a(2244);function s(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&r.createElement(l.Z,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(l.Z,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,a)=>{a.d(t,{Z:()=>c});var n=a(7294),r=a(6010),i=a(5999),l=a(5281),s=a(4477);function c(e){let{className:t}=e;const a=(0,s.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},3120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(7294),r=a(6010),i=a(2263),l=a(9960),s=a(5999),c=a(143),o=a(5281),m=a(373),d=a(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.Z,{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:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(s.Z,{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:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(s.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,c.Jo)(s),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},7955:(e,t,a)=>{a.d(t,{Z:()=>m});var n=a(7462),r=a(7294),i=a(6010),l=a(5999),s=a(6668),c=a(9960);const o={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function m(e){let{as:t,id:a,...m}=e;const{navbar:{hideOnScroll:d}}=(0,s.L)();if("h1"===t||!a)return r.createElement(t,(0,n.Z)({},m,{id:void 0}));const u=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:a});return r.createElement(t,(0,n.Z)({},m,{className:(0,i.Z)("anchor",d?o.anchorWithHideOnScrollNavbar:o.anchorWithStickyNavbar,m.className),id:a}),m.children,r.createElement(c.Z,{className:"hash-link",to:`#${a}`,"aria-label":u,title:u},"\u200b"))}},2244:(e,t,a)=>{a.d(t,{Z:()=>l});var n=a(7294),r=a(6010),i=a(9960);function l(e){const{permalink:t,title:a,subLabel:l,isNext:s}=e;return n.createElement(i.Z,{className:(0,r.Z)("pagination-nav__link",s?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},l&&n.createElement("div",{className:"pagination-nav__sublabel"},l),n.createElement("div",{className:"pagination-nav__label"},a))}}}]); \ No newline at end of file diff --git a/assets/js/17896441.a160e7e2.js b/assets/js/17896441.a160e7e2.js new file mode 100644 index 0000000..f526814 --- /dev/null +++ b/assets/js/17896441.a160e7e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7918],{1310:(e,t,n)=>{n.d(t,{Z:()=>E});var a=n(7462),l=n(7294),o=n(6010),r=n(5281),s=n(3438),c=n(8596),i=n(9960),d=n(5999),m=n(4996);function u(e){return l.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},e),l.createElement("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 v={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,m.Z)("/");return l.createElement("li",{className:"breadcrumbs__item"},l.createElement(i.Z,{"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},l.createElement(u,{className:v.breadcrumbHomeIcon})))}const p={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function h(e){let{children:t,href:n,isLast:a}=e;const o="breadcrumbs__link";return a?l.createElement("span",{className:o,itemProp:"name"},t):n?l.createElement(i.Z,{className:o,href:n,itemProp:"item"},l.createElement("span",{itemProp:"name"},t)):l.createElement("span",{className:o},t)}function f(e){let{children:t,active:n,index:r,addMicrodata:s}=e;return l.createElement("li",(0,a.Z)({},s&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,o.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,l.createElement("meta",{itemProp:"position",content:String(r+1)}))}function E(){const e=(0,s.s1)(),t=(0,c.Ns)();return e?l.createElement("nav",{className:(0,o.Z)(r.k.docs.docBreadcrumbs,p.breadcrumbsContainer),"aria-label":(0,d.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},l.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&l.createElement(b,null),e.map(((t,n)=>{const a=n===e.length-1;return l.createElement(f,{key:n,active:a,index:n,addMicrodata:!!t.href},l.createElement(h,{href:t.href,isLast:a},t.label))})))):null}},5154:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});var a=n(7294),l=n(833),o=n(902);const r=a.createContext(null);function s(e){let{children:t,content:n}=e;const l=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(r.Provider,{value:l},t)}function c(){const e=(0,a.useContext)(r);if(null===e)throw new o.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=c();return a.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(6010),m=n(7524),u=n(49);function v(){const{metadata:e}=c();return a.createElement(u.Z,{previous:e.previous,next:e.next})}var b=n(3120),p=n(4364),h=n(5281),f=n(5999);function E(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(f.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function g(e){let{lastUpdatedBy:t}=e;return a.createElement(f.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function L(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:h.k.common.lastUpdated},a.createElement(f.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(E,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(g,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var C=n(4881),N=n(1526);const Z={lastUpdated:"lastUpdated_vwxv"};function k(e){return a.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(N.Z,e)))}function _(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:o}=e;return a.createElement("div",{className:(0,d.Z)(h.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(C.Z,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",Z.lastUpdated)},(n||l)&&a.createElement(L,{lastUpdatedAt:n,formattedLastUpdatedAt:o,lastUpdatedBy:l})))}function x(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:l,lastUpdatedBy:o,tags:r}=e,s=r.length>0,i=!!(t||n||o);return s||i?a.createElement("footer",{className:(0,d.Z)(h.k.docs.docFooter,"docusaurus-mt-lg")},s&&a.createElement(k,{tags:r}),i&&a.createElement(_,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:o,formattedLastUpdatedAt:l})):null}var T=n(6043),H=n(3743),U=n(7462);const y={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function A(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,U.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",y.tocCollapsibleButton,!t&&y.tocCollapsibleButtonExpanded,n.className)}),a.createElement(f.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const w={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function M(e){let{toc:t,className:n,minHeadingLevel:l,maxHeadingLevel:o}=e;const{collapsed:r,toggleCollapsed:s}=(0,T.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(w.tocCollapsible,!r&&w.tocCollapsibleExpanded,n)},a.createElement(A,{collapsed:r,onClick:s}),a.createElement(T.z,{lazy:!0,className:w.tocCollapsibleContent,collapsed:r},a.createElement(H.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:o})))}const I={tocMobile:"tocMobile_ITEo"};function B(){const{toc:e,frontMatter:t}=c();return a.createElement(M,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(h.k.docs.docTocMobile,I.tocMobile)})}var O=n(9407);function S(){const{toc:e,frontMatter:t}=c();return a.createElement(O.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:h.k.docs.docTocDesktop})}var V=n(7955),P=n(1098);function D(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(h.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(V.Z,{as:"h1"},n)),a.createElement(P.Z,null,t))}var R=n(1310);const F={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function z(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),l=e.hide_table_of_contents,o=!l&&t.length>0;return{hidden:l,mobile:o?a.createElement(B,null):void 0,desktop:!o||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(S,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&F.docItemCol)},a.createElement(b.Z,null),a.createElement("div",{className:F.docItemContainer},a.createElement("article",null,a.createElement(R.Z,null),a.createElement(p.Z,null),n.mobile,a.createElement(D,null,t),a.createElement(x,null)),a.createElement(v,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function j(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(s,{content:e.content},a.createElement(l.FG,{className:t},a.createElement(i,null),a.createElement(z,null,a.createElement(n,null))))}},49:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(7462),l=n(7294),o=n(5999),r=n(2244);function s(e){const{previous:t,next:n}=e;return l.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,o.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&l.createElement(r.Z,(0,a.Z)({},t,{subLabel:l.createElement(o.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&l.createElement(r.Z,(0,a.Z)({},n,{subLabel:l.createElement(o.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},4364:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(7294),l=n(6010),o=n(5999),r=n(5281),s=n(4477);function c(e){let{className:t}=e;const n=(0,s.E)();return n.badge?a.createElement("span",{className:(0,l.Z)(t,r.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(o.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}},3120:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(7294),l=n(6010),o=n(2263),r=n(9960),s=n(5999),c=n(143),i=n(5281),d=n(373),m=n(4477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.Z,{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:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(s.Z,{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:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function v(e){const t=u[e.versionMetadata.banner];return a.createElement(t,e)}function b(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(s.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(r.Z,{to:n,onClick:l},a.createElement(s.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function p(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:r}}=(0,o.Z)(),{pluginId:s}=(0,c.gA)({failfast:!0}),{savePreferredVersionName:m}=(0,d.J)(s),{latestDocSuggestion:u,latestVersionSuggestion:p}=(0,c.Jo)(s),h=u??(f=p).docs.find((e=>e.id===f.mainDocId));var f;return a.createElement("div",{className:(0,l.Z)(t,i.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(v,{siteTitle:r,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(b,{versionLabel:p.label,to:h.path,onClick:()=>m(p.name)})))}function h(e){let{className:t}=e;const n=(0,m.E)();return n.banner?a.createElement(p,{className:t,versionMetadata:n}):null}},9407:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(7462),l=n(7294),o=n(6010),r=n(3743);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",i="table-of-contents__link--active";function d(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,o.Z)(s.tableOfContents,"thin-scrollbar",t)},l.createElement(r.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:i})))}},3743:(e,t,n)=>{n.d(t,{Z:()=>b});var a=n(7462),l=n(7294),o=n(6668);function r(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function s(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=s({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function i(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,l.useRef)(void 0),n=d();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:o,maxHeadingLevel:r}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=i(s,{anchorTopOffset:n.current}),d=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(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:o}=e;return t.length?l.createElement("ul",{className:o?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const v=l.memo(u);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u,...b}=e;const p=(0,o.L)(),h=d??p.tableOfContents.minHeadingLevel,f=u??p.tableOfContents.maxHeadingLevel,E=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>s({toc:r(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:h,maxHeadingLevel:f});return m((0,l.useMemo)((()=>{if(c&&i)return{linkClassName:c,linkActiveClassName:i,minHeadingLevel:h,maxHeadingLevel:f}}),[c,i,h,f])),l.createElement(v,(0,a.Z)({toc:E,className:n,linkClassName:c},b))}}}]); \ No newline at end of file diff --git a/assets/js/18f481e4.35406774.js b/assets/js/18f481e4.35406774.js new file mode 100644 index 0000000..bbcf10c --- /dev/null +++ b/assets/js/18f481e4.35406774.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6057],{1738:i=>{i.exports=JSON.parse('{"label":"java","permalink":"/ib002/tags/java","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"recursion/pyramid-slide-down","title":"Introduction to dynamic programming","description":"Solving a problem in different ways.\\n","permalink":"/ib002/recursion/pyramid-slide-down"}]}')}}]); \ No newline at end of file diff --git a/assets/js/19d7c045.18dfd0ba.js b/assets/js/19d7c045.18dfd0ba.js new file mode 100644 index 0000000..99d4049 --- /dev/null +++ b/assets/js/19d7c045.18dfd0ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4637],{7772:e=>{e.exports=JSON.parse('{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code","allTagsPath":"/blog/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.48f1640b.js b/assets/js/1a4e3797.48f1640b.js new file mode 100644 index 0000000..7eb6821 --- /dev/null +++ b/assets/js/1a4e3797.48f1640b.js @@ -0,0 +1,2 @@ +/*! For license information please see 1a4e3797.48f1640b.js.LICENSE.txt */ +(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7920],{7331: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,a,s,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(a=this._events[e]))return!1;if(r(a))switch(arguments.length){case 1:a.call(this);break;case 2:a.call(this,arguments[1]);break;case 3:a.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),a.apply(this,c)}else if(n(a))for(c=Array.prototype.slice.call(arguments,1),s=(o=a.slice()).length,u=0;u0&&this._events[e].length>s&&(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,a,s,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(s=(i=this._events[e]).length,a=-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=s;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){a=c;break}if(a<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(a,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)}},8131:(e,t,r)=>{"use strict";var n=r(9374),i=r(7775),a=r(3076);function s(e,t,r){return new n(e,t,r)}s.version=r(4336),s.AlgoliaSearchHelper=n,s.SearchParameters=i,s.SearchResults=a,e.exports=s},8078:(e,t,r)=>{"use strict";var n=r(7331);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(4853)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},2437:(e,t,r)=>{"use strict";var n=r(3336),i=r(116),a=r(9803),s={addRefinement:function(e,t,r){if(s.isRefined(e,t,r))return e;var i=""+r,a=e[t]?e[t].concat(i):[i],c={};return c[t]=a,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return s.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return s.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 s.isRefined(e,t,r)?s.removeRefinement(e,t,r):s.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return a(e,[t]);if("function"==typeof t){var n=!1,s=Object.keys(e).reduce((function(i,a){var s=e[a]||[],c=s.filter((function(e){return!t(e,a,r)}));return c.length!==s.length&&(n=!0),i[a]=c,i}),{});return n?s: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=s},7775:(e,t,r)=>{"use strict";var n=r(3336),i=r(7888),a=r(2686),s=r(185),c=r(116),u=r(9803),o=r(8023),h=r(6801),f=r(2437);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 s({},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=s({},this.numericRefinements);return i[e]=s({},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 a=r[i],s={};return a=a||{},Object.keys(a).forEach((function(r){var n=a[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),s[r]=c})),n[i]=s,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 a,s,c=o(r),u=void 0!==(a=this.numericRefinements[e][t],s=c,i(a,(function(e){return l(e,s)})));return n&&u},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=a(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 a(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}),{}),a=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(a)},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},210:(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=a(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,a){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m{"use strict";var n=r(4587),i=r(3336),a=r(4039),s=r(7888),c=r(9725),u=r(2293),o=r(185),h=r(2148),f=a.escapeFacetValue,l=a.unescapeFacetValue,m=r(210);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 a=t[0];this._rawResults=t;var u=this;Object.keys(a).forEach((function(e){u[e]=a[e]})),Object.keys(r||{}).forEach((function(e){u[e]=r[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 h=e.getRefinedDisjunctiveFacets(),f=d(e.facets),v=d(e.disjunctiveFacets),g=1,y=a.facets||{};Object.keys(y).forEach((function(t){var r,n,i=y[t],o=(r=e.hierarchicalFacets,n=t,s(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(o){var h=o.attributes.indexOf(t),l=c(e.hierarchicalFacets,(function(e){return e.name===o.name}));u.hierarchicalFacets[l][h]={attribute:t,data:i,exhaustive:a.exhaustiveFacetsCount}}else{var m,d=-1!==e.disjunctiveFacets.indexOf(t),g=-1!==e.facets.indexOf(t);d&&(m=v[t],u.disjunctiveFacets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(u.disjunctiveFacets[m],a.facets_stats,t)),g&&(m=f[t],u.facets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(u.facets[m],a.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),h.forEach((function(r){var n=t[g],s=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(s).forEach((function(t){var r,f=s[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=v[t];var d=a.facets&&a.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)}))}})),g++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),a=e._getHierarchicalFacetSeparator(n),s=e.getHierarchicalRefinement(r);0===s.length||s[0].split(a).length<2||t.slice(g).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(s.length>0){var m=s[0].split(a)[0];l[m]=u.hierarchicalFacets[h][f].data[m]}u.hierarchicalFacets[h][f].data=i(l,o,u.hierarchicalFacets[h][f].data)}})),g++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=f[t];u.facets[n]={name:t,data:y[t],exhaustive:a.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=s(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=s(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 a=s(e.hierarchicalFacets,r);if(!a)return a;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(a,h,0),a}}function y(e,t,r){e.isRefined=e.name===t[r],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 a=t.data.map((function(t){return R(e,t,r,n+1)})),s=e(a,r[n]);return i({data:s},t)}function F(e,t){var r=s(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var a=s(i,(function(e){return e.name===r})),c=a&&a.data&&a.data[n]?a.data[n]:0,u=a&&a.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 s(this.facets,t)||s(this.disjunctiveFacets,t)||s(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,a=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),s=this;if(Array.isArray(r))n=[e];else n=s._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(a.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(s,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 a,s=t.sortRemainingBy;return"hidden"===s?r:(a="alpha"===s?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(a.sortBy)){var n=u(a.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof a.sortBy)return function(e,t){return t.sort(e)}(a.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),a=e._getHierarchicalFacetSeparator(i),c=r.split(a),u=s(n,(function(e){return e.name===t})),o=c.reduce((function(e,t){var r=e&&s(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},9374:(e,t,r)=>{"use strict";var n=r(7331),i=r(8078),a=r(4039).escapeFacetValue,s=r(4853),c=r(185),u=r(116),o=r(9803),h=r(6394),f=r(7775),l=r(3076),m=r(4336);function d(e,t,r){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.setClient(e);var n=r||{};n.index=t,this.state=f.make(n),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0}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}s(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"])}),a="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(a);var s=this.client.initIndex(n.index);if("function"!=typeof s.findAnswers)throw new Error(a);return s.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,s="function"==typeof this.client.initIndex;if(!i&&!s&&"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}]):s?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=a(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})),a=Array.prototype.concat.apply(n,i),s=this._queryId++;if(this._currentNbQueries++,!a.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,s));try{this.client.search(a).then(this._dispatchAlgoliaResponse.bind(this,r,s)).catch(this._dispatchAlgoliaError.bind(this,s))}catch(c){this.emit("error",{error:c})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){if(!(t0},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},4587:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},3336: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}),{})}},4039: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(/^\\-/,"-")}}},7888:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{"use strict";var n=r(7888);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),a=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!a?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(a[0]),e[1].push(a[1]),e)}),[[],[]])}},4853:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},2686:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},185: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 a=n[i],s=e[i];void 0!==s&&void 0===a||(t(s)&&t(a)?e[i]=r(s,a):e[i]="object"==typeof(c=a)&&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{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},9803:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},2148:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,a=null===t;if(!a&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?a:"desc"===n[i]?-a:a}return e.index-r.index})),i.map((function(e){return e.value}))}},8023: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.")}},6394:(e,t,r)=>{"use strict";var n=r(185);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var a={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:a._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:a._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),s=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(s.length>0&&s[0].split(c).length>1){var u=s[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,s){var c=a._getDisjunctiveFacetSearchParams(t,n.attribute,0===s);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[s-1];c.facetFilters=s>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(a._getHitsHierarchicalFacetsAttributes(e)).sort(),r=a._getFacetFilters(e),s=a._getNumericFilters(e),c=a._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),s.length>0&&(u.numericFilters=s),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var s=a._getFacetFilters(e,t,r),c=a._getNumericFilters(e,t),u=a._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?a._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),s.length>0&&(o.facetFilters=s),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 a=i[e]||[];t!==n&&a.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]||[]).sort().forEach((function(t){n.push(e+":"+t)}))}));var a=e.facetsExcludes||{};Object.keys(a).sort().forEach((function(e){(a[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var s=e.disjunctiveFacetsRefinements||{};Object.keys(s).sort().forEach((function(e){var r=s[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var a=(c[i]||[])[0];if(void 0!==a){var s,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===a.indexOf(h)||!f&&!0===r||f&&f.split(h).length===a.split(h).length)return;f?(u=f.split(h).length-1,a=f):(u=a.split(h).length-2,a=a.slice(0,a.lastIndexOf(h))),s=o.attributes[u]}else u=a.split(h).length-1,s=o.attributes[u];s&&n.push([s+":"+a])}})),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),a=n.split(i).length,s=r.attributes.slice(0,a+1);return t.concat(s)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),a=0;return i&&(a=i.split(n).length),[t.attributes[a]]}var s=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,s+1)},getSearchForFacetQuery:function(e,t,r,s){var c=s.isDisjunctiveFacet(e)?s.clearRefinements(e):s,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},a._getHitsSearchParams(c),u))}};e.exports=a},6801:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},4336:e=>{"use strict";e.exports="3.14.0"},290: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=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=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,a=void 0;try{for(var s,c=e[Symbol.iterator]();!(n=(s=c.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){i=!0,a=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw a}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function a(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return a()[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],a=t[1];return Promise.all([n,a||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=a();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=a();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=a(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()}},a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var s=n(),c=i&&i.miss||function(){return Promise.resolve()};return s.then((function(e){return c(e)})).then((function(){return s}))},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;n0?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 P(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(a(r),a(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 j(e,t,n,i){var s=[],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,a){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(s)};var m={data:c,headers:u,method:o,url:E(h,n.path,f),connectTimeout:a(l,e.timeouts.connect),responseTimeout:a(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return s.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,a)}))},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(s))}};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 P(e.hostsCache,t).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function _(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(e,t,r){var n=x(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function x(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 N=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),a=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,a=e.requestsCache,s=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:a,responsesCache:s,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 j(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 a={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(a,(function(){return f.requestsCache.get(a,(function(){return f.requestsCache.set(a,n()).then((function(e){return Promise.all([f.requestsCache.delete(a),e])}),(function(e){return Promise.all([f.requestsCache.delete(a),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(a,e)}})},write:function(e,t){return j(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:a,appId:t,addAlgoliaAgent:function(e,t){a.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([a.requestsCache.clear(),a.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)}},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:x(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 a=t.params,s=a.facetName,c=a.facetQuery,u=n(a,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(s,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)}},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)}},k=1,D=2,q=3;function V(e,t,n){var i,a={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)},a=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(a),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(a),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(a),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return k>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return D>=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:[s({key:"".concat("4.19.1","-").concat(e)}),u()]}),userAgent:_("4.19.1").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return N(r(r(r({},a),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:A,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:Q}})}}}}))}return V.version="4.19.1",V}()},8824:(e,t,r)=>{"use strict";r.d(t,{c:()=>o});var n=r(7294),i=r(2263);const a=["zero","one","two","few","many","other"];function s(e){return a.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,i.Z)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(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`),c}}),[e])}function o(){const e=u();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),a=r.pluralForms.indexOf(i);return n[Math.min(a,n.length-1)]}(r,t,e)}}},9172:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>x});var n=r(7294),i=r(6010),a=r(8131),s=r.n(a),c=r(290),u=r.n(c),o=r(412),h=r(5742),f=r(9960),l=r(143),m=r(8824),d=r(6177),p=r(902),v=r(833),g=r(2128),y=r(5999),R=r(2263),F=r(6278),b=r(239),P=r(7452);const j={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"};function _(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return n.createElement("div",{className:(0,i.Z)("col","col--3","padding-left--none",j.searchVersionColumn)},r.map((e=>{let[i,a]=e;const s=r.length>1?`${i}: `:"";return n.createElement("select",{key:i,onChange:e=>t.setSearchVersion(i,e.target.value),defaultValue:t.searchVersions[i],className:j.searchVersionInput},a.versions.map(((e,t)=>n.createElement("option",{key:t,label:`${s}${e.label}`,value:e.name}))))})))}function E(){const{i18n:{currentLocale:e}}=(0,R.Z)(),{algolia:{appId:t,apiKey:r,indexName:a}}=(0,F.L)(),c=(0,b.l)(),v=function(){const{selectMessage:e}=(0,m.c)();return t=>e(t,(0,y.I)({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}))}(),E=function(){const e=(0,l._r)(),[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})))}}(),[x,O]=(0,d.K)(),w={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[N,A]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return w;case"loading":return{...e,loading:!0};case"update":return x!==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}}),w),H=u()(t,r),S=s()(H,a,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});S.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:a}}=e;if(""===t||!Array.isArray(r))return void A({type:"reset"});const s=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=>s(r[e].value)));return{title:i.pop(),url:c(t),summary:n.content?`${s(n.content.value)}...`:"",breadcrumbs:i}}));A({type:"update",value:{items:u,query:t,totalResults:i,totalPages:a,lastPage:n,hasMore:a>n+1,loading:!1}})}));const[T,Q]=(0,n.useState)(null),C=(0,n.useRef)(0),I=(0,n.useRef)(o.Z.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&C.current>r&&A({type:"advance"}),C.current=r}),{threshold:1})),k=()=>x?(0,y.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:x}):(0,y.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),D=(0,p.zX)((function(t){void 0===t&&(t=0),S.addDisjunctiveFacetRefinement("docusaurus_tag","default"),S.addDisjunctiveFacetRefinement("language",e),Object.entries(E.searchVersions).forEach((e=>{let[t,r]=e;S.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),S.setQuery(x).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!T)return;const e=I.current;return e?(e.observe(T),()=>e.unobserve(T)):()=>!0}),[T]),(0,n.useEffect)((()=>{A({type:"reset"}),x&&(A({type:"loading"}),setTimeout((()=>{D()}),300))}),[x,E.searchVersions,D]),(0,n.useEffect)((()=>{N.lastPage&&0!==N.lastPage&&D(N.lastPage)}),[D,N.lastPage]),n.createElement(P.Z,null,n.createElement(h.Z,null,n.createElement("title",null,(0,g.p)(k())),n.createElement("meta",{property:"robots",content:"noindex, follow"})),n.createElement("div",{className:"container margin-vert--lg"},n.createElement("h1",null,k()),n.createElement("form",{className:"row",onSubmit:e=>e.preventDefault()},n.createElement("div",{className:(0,i.Z)("col",j.searchQueryColumn,{"col--9":E.versioningEnabled,"col--12":!E.versioningEnabled})},n.createElement("input",{type:"search",name:"q",className:j.searchQueryInput,placeholder:(0,y.I)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,y.I)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>O(e.target.value),value:x,autoComplete:"off",autoFocus:!0})),E.versioningEnabled&&n.createElement(_,{docsSearchVersionsHelpers:E})),n.createElement("div",{className:"row"},n.createElement("div",{className:(0,i.Z)("col","col--8",j.searchResultsColumn)},!!N.totalResults&&v(N.totalResults)),n.createElement("div",{className:(0,i.Z)("col","col--4","text--right",j.searchLogoColumn)},n.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://www.algolia.com/","aria-label":(0,y.I)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"})},n.createElement("svg",{viewBox:"0 0 168 24",className:j.algoliaLogo},n.createElement("g",{fill:"none"},n.createElement("path",{className:j.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"}),n.createElement("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"}),n.createElement("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"})))))),N.items.length>0?n.createElement("main",null,N.items.map(((e,t)=>{let{title:r,url:a,summary:s,breadcrumbs:c}=e;return n.createElement("article",{key:t,className:j.searchResultItem},n.createElement("h2",{className:j.searchResultItemHeading},n.createElement(f.Z,{to:a,dangerouslySetInnerHTML:{__html:r}})),c.length>0&&n.createElement("nav",{"aria-label":"breadcrumbs"},n.createElement("ul",{className:(0,i.Z)("breadcrumbs",j.searchResultItemPath)},c.map(((e,t)=>n.createElement("li",{key:t,className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}}))))),s&&n.createElement("p",{className:j.searchResultItemSummary,dangerouslySetInnerHTML:{__html:s}}))}))):[x&&!N.loading&&n.createElement("p",{key:"no-results"},n.createElement(y.Z,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result"},"No results were found")),!!N.loading&&n.createElement("div",{key:"spinner",className:j.loadingSpinner})],N.hasMore&&n.createElement("div",{className:j.loader,ref:Q},n.createElement(y.Z,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results"},"Fetching new results..."))))}function x(){return n.createElement(v.FG,{className:"search-page-wrapper"},n.createElement(E,null))}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.48f1640b.js.LICENSE.txt b/assets/js/1a4e3797.48f1640b.js.LICENSE.txt new file mode 100644 index 0000000..f167ba6 --- /dev/null +++ b/assets/js/1a4e3797.48f1640b.js.LICENSE.txt @@ -0,0 +1 @@ +/*! algoliasearch-lite.umd.js | 4.19.1 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1be78505.65bfdbb1.js b/assets/js/1be78505.65bfdbb1.js new file mode 100644 index 0000000..0a66ca9 --- /dev/null +++ b/assets/js/1be78505.65bfdbb1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9514,7515],{9963:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ge});var a=n(7294),l=n(6010),o=n(833),r=n(5281),c=n(3320),i=n(3438),s=n(4477),d=n(1116),m=n(7452),u=n(5999),b=n(2466),p=n(5936);const h={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function E(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,l]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(o.current?o.current=!1:a>=r?(c(),l(!1)):a{e.location.hash&&(o.current=!0,l(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,l.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var f=n(1442),g=n(6550),k=n(7524),v=n(6668),_=n(1327),C=n(7462);function S(e){return a.createElement("svg",(0,C.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("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"}),a.createElement("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 I={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function N(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,l.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(9689),Z=n(902);const x=Symbol("EmptyContext"),B=a.createContext(x);function y(e){let{children:t}=e;const[n,l]=(0,a.useState)(null),o=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:l})),[n]);return a.createElement(B.Provider,{value:o},t)}var w=n(6043),L=n(8596),A=n(9960),M=n(2389);function F(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function H(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,v.L)(),f=function(e){const t=(0,M.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,i.Wl)(e):void 0),[e,t])}(t),g=(0,i._F)(t,o),k=(0,L.Mg)(h,o),{collapsed:_,setCollapsed:S}=(0,w.u)({initialState:()=>!!b&&(!g&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===x)throw new Z.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!_),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:l}=e;const o=(0,Z.D9)(t);(0,a.useEffect)((()=>{t&&!o&&n&&l(!1)}),[t,o,n,l])}({isActive:g,collapsed:_,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":_},p)},a.createElement("div",{className:(0,l.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":k})},a.createElement(A.Z,(0,C.Z)({className:(0,l.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":g}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":k?"page":void 0,"aria-expanded":b?!_:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(F,{categoryLabel:u,onClick:e=>{e.preventDefault(),T()}})),a.createElement(w.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:_},a.createElement(j,{items:m,tabIndex:_?-1:0,onItemClick:n,activePath:o,level:c+1})))}var P=n(3919),W=n(9471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:o,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,o),E=(0,P.Z)(m);return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(A.Z,(0,C.Z)({className:(0,l.Z)("menu__link",!E&&D.menuExternalLink,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(W.Z,null)))}const V={menuHtmlItem:"menuHtmlItem_M9Kj"};function z(e){let{item:t,level:n,index:o}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,l.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[V.menuHtmlItem,"menu__list-item"],s),key:o,dangerouslySetInnerHTML:{__html:c}})}function U(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(H,(0,C.Z)({item:t},n));case"html":return a.createElement(z,(0,C.Z)({item:t},n));default:return a.createElement(R,(0,C.Z)({item:t},n))}}function K(e){let{items:t,...n}=e;return a.createElement(y,null,t.map(((e,t)=>a.createElement(U,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),G={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:o}=e;const c=function(){const{isActive:e}=(0,T.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,l.Z)("menu thin-scrollbar",G.menu,c&&G.menuWithAnnouncementBar,o)},a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:o,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,v.L)();return a.createElement("div",{className:(0,l.Z)(q,c&&O,r&&X)},c&&a.createElement(_.Z,{tabIndex:-1,className:J}),a.createElement(Y,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:o}))}const $=a.memo(Q);var ee=n(3102),te=n(3163);const ne=e=>{let{sidebar:t,path:n}=e;const o=(0,te.e)();return a.createElement("ul",{className:(0,l.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&o.toggle(),"link"===e.type&&o.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const le=a.memo(ae);function oe(e){const t=(0,k.i)(),n="desktop"===t||"ssr"===t,l="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),l&&a.createElement(le,e))}const re={expandButton:"expandButton_m80_",expandButtonIcon:"expandButtonIcon_BlDH"};function ce(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:re.expandButton,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({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},a.createElement(S,{className:re.expandButtonIcon}))}const ie={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function se(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function de(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}=e;const{pathname:c}=(0,g.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,f.n)()&&s(!0),o((e=>!e))}),[o,i]);return a.createElement("aside",{className:(0,l.Z)(r.k.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&s(!0)}},a.createElement(se,null,a.createElement("div",{className:(0,l.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(oe,{sidebar:t,path:c,onCollapse:d,isHidden:i}),i&&a.createElement(ce,{toggleSidebar:d}))))}const me={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const o=(0,d.V)();return a.createElement("main",{className:(0,l.Z)(me.docMainContainer,(t||!o)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,l.Z)("container padding-top--md padding-bottom--lg",me.docItemWrapper,t&&me.docItemWrapperEnhanced)},n))}const be={docPage:"docPage__5DB",docsWrapper:"docsWrapper_BCFX"};function pe(e){let{children:t}=e;const n=(0,d.V)(),[l,o]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:be.docsWrapper},a.createElement(E,null),a.createElement("div",{className:be.docPage},n&&a.createElement(de,{sidebar:n.items,hiddenSidebarContainer:l,setHiddenSidebarContainer:o}),a.createElement(ue,{hiddenSidebarContainer:l},t)))}var he=n(4972),Ee=n(197);function fe(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(Ee.Z,{version:t.version,tag:(0,c.os)(t.pluginId,t.version)}),a.createElement(o.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function ge(e){const{versionMetadata:t}=e,n=(0,i.hI)(e);if(!n)return a.createElement(he.default,null);const{docElement:c,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(fe,e),a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(pe,null,c)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(7294),l=n(5999),o=n(833),r=n(7452);function c(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"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/1bebd4ed.a838562f.js b/assets/js/1bebd4ed.a838562f.js new file mode 100644 index 0000000..9839d24 --- /dev/null +++ b/assets/js/1bebd4ed.a838562f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[404],{9623:e=>{e.exports=JSON.parse('{"pluginId":"pb071","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"autogeneratedBar":[{"type":"link","label":"Introduction","href":"/pb071/","docId":"pb071-intro"},{"type":"category","label":"Bonuses","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"3rd seminar","href":"/pb071/bonuses/seminar-03","docId":"bonuses/seminar-03"},{"type":"link","label":"4th seminar","href":"/pb071/bonuses/seminar-04","docId":"bonuses/seminar-04"},{"type":"link","label":"5th and 6th seminar","href":"/pb071/bonuses/seminar-05-06","docId":"bonuses/seminar-05-06"},{"type":"link","label":"8th seminar","href":"/pb071/bonuses/seminar-08","docId":"bonuses/seminar-08"},{"type":"link","label":"10th seminar","href":"/pb071/bonuses/seminar-10","docId":"bonuses/seminar-10"}],"href":"/pb071/category/bonuses"},{"type":"category","label":"Practice Exams","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Practice exam B","href":"/pb071/pexam/garbage_collect","docId":"pexam/b-garbage_collect"},{"type":"link","label":"Practice exam C","href":"/pb071/pexam/cams","docId":"pexam/c-cams"}],"href":"/pb071/category/practice-exams"},{"type":"link","label":"Submitting merge requests","href":"/pb071/mr","docId":"mr"}]},"docs":{"bonuses/seminar-03":{"id":"bonuses/seminar-03","title":"3rd seminar","description":"Select sort implementation on arrays.\\n","sidebar":"autogeneratedBar"},"bonuses/seminar-04":{"id":"bonuses/seminar-04","title":"4th seminar","description":"Robot in a maze.\\n","sidebar":"autogeneratedBar"},"bonuses/seminar-05-06":{"id":"bonuses/seminar-05-06","title":"5th and 6th seminar","description":"200IQ encryption.\\n","sidebar":"autogeneratedBar"},"bonuses/seminar-08":{"id":"bonuses/seminar-08","title":"8th seminar","description":"Manipulating with files only char-by-char and a magic tree.\\n","sidebar":"autogeneratedBar"},"bonuses/seminar-10":{"id":"bonuses/seminar-10","title":"10th seminar","description":"Finding bugs in a hangman.\\n","sidebar":"autogeneratedBar"},"mr":{"id":"mr","title":"Submitting merge requests","description":"This tutorial aims to show you how to follow basic git workflow and submit changes","sidebar":"autogeneratedBar"},"pb071-intro":{"id":"pb071-intro","title":"Introduction","description":"","sidebar":"autogeneratedBar"},"pexam/b-garbage_collect":{"id":"pexam/b-garbage_collect","title":"Practice exam B","description":"Garbage everywhere\u2026\\n","sidebar":"autogeneratedBar"},"pexam/c-cams":{"id":"pexam/c-cams","title":"Practice exam C","description":"Stalking cars\u2026\\n","sidebar":"autogeneratedBar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/1e2009d3.7e268ae7.js b/assets/js/1e2009d3.7e268ae7.js new file mode 100644 index 0000000..bd0120c --- /dev/null +++ b/assets/js/1e2009d3.7e268ae7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3906],{3905:(e,a,t)=>{t.d(a,{Zo:()=>m,kt:()=>u});var n=t(7294);function r(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function l(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var a=1;a=0||(r[t]=e[t]);return r}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var s=n.createContext({}),p=function(e){var a=n.useContext(s),t=a;return e&&(t="function"==typeof e?e(a):o(o({},a),e)),t},m=function(e){var a=p(e.components);return n.createElement(s.Provider,{value:a},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},k=n.forwardRef((function(e,a){var t=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),c=p(t),k=r,u=c["".concat(s,".").concat(k)]||c[k]||d[k]||l;return t?n.createElement(u,o(o({ref:a},m),{},{components:t})):n.createElement(u,o({ref:a},m))}));function u(e,a){var t=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var l=t.length,o=new Array(l);o[0]=k;var i={};for(var s in a)hasOwnProperty.call(a,s)&&(i[s]=a[s]);i.originalType=e,i[c]="string"==typeof e?e:r,o[1]=i;for(var p=2;p{t.r(a),t.d(a,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=t(7462),r=(t(7294),t(3905));const l={id:"applications",title:"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f",description:"Uk\xe1zka pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f v standardn\xedch kni\u017enic\xedch zn\xe1m\xfdch jazyk\u016f.\n",tags:["balanced trees","red-black trees","applications"],last_update:{date:new Date("2022-04-05T00:00:00.000Z")}},o=void 0,i={unversionedId:"rb-trees/applications",id:"rb-trees/applications",title:"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f",description:"Uk\xe1zka pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f v standardn\xedch kni\u017enic\xedch zn\xe1m\xfdch jazyk\u016f.\n",source:"@site/ib002/08-rb-trees/2022-04-05-applications.md",sourceDirName:"08-rb-trees",slug:"/rb-trees/applications",permalink:"/ib002/rb-trees/applications",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/08-rb-trees/2022-04-05-applications.md",tags:[{label:"balanced trees",permalink:"/ib002/tags/balanced-trees"},{label:"red-black trees",permalink:"/ib002/tags/red-black-trees"},{label:"applications",permalink:"/ib002/tags/applications"}],version:"current",lastUpdatedAt:1649116800,formattedLastUpdatedAt:"Apr 5, 2022",frontMatter:{id:"applications",title:"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f",description:"Uk\xe1zka pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f v standardn\xedch kni\u017enic\xedch zn\xe1m\xfdch jazyk\u016f.\n",tags:["balanced trees","red-black trees","applications"],last_update:{date:"2022-04-05T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Red-Black Trees",permalink:"/ib002/category/red-black-trees"},next:{title:"On the rules of the red-black tree",permalink:"/ib002/rb-trees/rules"}},s={},p=[{value:"Pou\u017eit\xed",id:"pou\u017eit\xed",level:2},{value:"R\u016fzn\xe9 implementace",id:"r\u016fzn\xe9-implementace",level:2},{value:"C++",id:"c",level:3},{value:"clang",id:"clang",level:4},{value:"gcc",id:"gcc",level:4},{value:"Java",id:"java",level:3},{value:"C#",id:"c-1",level:3},{value:"Vztah mezi mno\u017einou a mapou",id:"vztah-mezi-mno\u017einou-a-mapou",level:2}],m={toc:p},c="wrapper";function d(e){let{components:a,...t}=e;return(0,r.kt)(c,(0,n.Z)({},m,t,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"pou\u017eit\xed"},"Pou\u017eit\xed"),(0,r.kt)("p",null,"\u010cerveno-\u010dern\xe9 stromy jsou celkem obl\xedben\xe9 pro implementaci ADT mno\u017einy nebo slovn\xedku za p\u0159edpokladu, \u017ee nad vkl\xe1dan\xfdmi kl\xed\u010di existuje uspo\u0159\xe1d\xe1n\xed. Jazyky n\xed\u017ee implementuj\xed dan\xe9 datov\xe9 struktury v 2 variant\xe1ch a to:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"se\u0159azen\xe9: pou\u017e\xedvaj\xed na pozad\xed pr\xe1v\u011b \u010derveno-\u010dern\xfd strom"),(0,r.kt)("li",{parentName:"ul"},"nese\u0159azen\xe9: pou\u017e\xedvaj\xed na pozad\xed ha\u0161ovac\xed tabulku")),(0,r.kt)("p",null,"Pro srovn\xe1n\xed, jak jsme si \u0159\xedkali na cvi\u010den\xed, \u010derveno-\u010dern\xfd strom m\xe1 operace hled\xe1n\xed, vkl\xe1d\xe1n\xed a maz\xe1n\xed v \u010dasov\xe9 slo\u017eitosti ",(0,r.kt)("span",{parentName:"p",className:"math math-inline"},(0,r.kt)("span",{parentName:"span",className:"katex"},(0,r.kt)("span",{parentName:"span",className:"katex-mathml"},(0,r.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,r.kt)("semantics",{parentName:"math"},(0,r.kt)("mrow",{parentName:"semantics"},(0,r.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,r.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,r.kt)("mi",{parentName:"mrow"},"log"),(0,r.kt)("mo",{parentName:"mrow"},"\u2061"),(0,r.kt)("mi",{parentName:"mrow"},"n"),(0,r.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,r.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(\\log n)")))),(0,r.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,r.kt)("span",{parentName:"span",className:"base"},(0,r.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,r.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,r.kt)("span",{parentName:"span",className:"mopen"},"("),(0,r.kt)("span",{parentName:"span",className:"mop"},"lo",(0,r.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,r.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,r.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,r.kt)("span",{parentName:"span",className:"mclose"},")"))))),". Na druhou stranu ha\u0161ovac\xed tabulka m\xe1 ide\xe1ln\u011b konstantn\xed \u010dasovou slo\u017eitost, ale v nejhor\u0161\xedm p\u0159\xedpad\u011b (detaily na posledn\xedm cvi\u010den\xed v semestru) je to bohu\u017eel ",(0,r.kt)("span",{parentName:"p",className:"math math-inline"},(0,r.kt)("span",{parentName:"span",className:"katex"},(0,r.kt)("span",{parentName:"span",className:"katex-mathml"},(0,r.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,r.kt)("semantics",{parentName:"math"},(0,r.kt)("mrow",{parentName:"semantics"},(0,r.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,r.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,r.kt)("mi",{parentName:"mrow"},"n"),(0,r.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,r.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(n)")))),(0,r.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,r.kt)("span",{parentName:"span",className:"base"},(0,r.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,r.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,r.kt)("span",{parentName:"span",className:"mopen"},"("),(0,r.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,r.kt)("span",{parentName:"span",className:"mclose"},")"))))),"."),(0,r.kt)("p",null,"V\xfd\u0161e jsme si uk\xe1zali n\u011bjak\xe9 p\u0159edpoklady nutn\xe9 pro ha\u0161ovac\xed tabulku i \u010derveno-\u010dern\xfd strom. Co je tedy lep\u0161\xed?"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"\u010derveno-\u010dern\xfd strom n\xe1m poskytuje ",(0,r.kt)("em",{parentName:"li"},"stabiln\xed \u010dasovou slo\u017eitost"),", ale za cenu po\u017eadavku ",(0,r.kt)("em",{parentName:"li"},"uspo\u0159\xe1d\xe1n\xed")," nad prvky"),(0,r.kt)("li",{parentName:"ul"},"ha\u0161ovac\xed tabulka n\xe1m poskytuje ",(0,r.kt)("em",{parentName:"li"},"pomyslnou perfektn\xed \u010dasovou slo\u017eitost"))),(0,r.kt)("h2",{id:"r\u016fzn\xe9-implementace"},"R\u016fzn\xe9 implementace"),(0,r.kt)("p",null,"Pro uk\xe1zku pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f v implementac\xedch standardn\xedch knihoven\njsme vybrali n\u011bkolik jazyk\u016f."),(0,r.kt)("p",null,"Pokud V\xe1s zaj\xedmaj\xed r\u016fzn\xe9 implementace, tak bychom doporu\u010dili \u201eprohrab\xe1vat\u201c se p\u0159es n\u011b v n\xe1sleduj\xedc\xedm po\u0159ad\xed: ",(0,r.kt)("inlineCode",{parentName:"p"},"C# \u2192 Java \u2192 C++"),". D\u016fvod pro zvolen\xe9 po\u0159ad\xed vych\xe1z\xed z toho, \u017ee C# implementace je pom\u011brn\u011b \u010diteln\xe1 a obsahuje mno\u017estv\xed vysv\u011btluj\xedc\xedch koment\xe1\u0159\u016f. Implementace v Jav\u011b je stejn\u011b \u010diteln\xe1, a\u010dkoli ji\u017e s minimem koment\xe1\u0159\u016f, kter\xe9 se maxim\xe1ln\u011b odkazuj\xed na CLRS. C++ implementace je \u201ezna\u010dn\u011b pozna\u010den\xe1\u201c podtr\u017e\xedtky ;)"),(0,r.kt)("h3",{id:"c"},"C++"),(0,r.kt)("p",null,"V C++ si m\u016f\u017eeme vybrat mezi 2 r\u016fzn\xfdmi implementacemi (",(0,r.kt)("inlineCode",{parentName:"p"},"clang")," nebo ",(0,r.kt)("inlineCode",{parentName:"p"},"gcc"),")."),(0,r.kt)("h4",{id:"clang"},"clang"),(0,r.kt)("p",null,"Hlavi\u010dkov\xe9 soubory, kter\xe9 pou\u017e\xedv\xe1me p\u0159i pr\xe1ci s mno\u017einou nebo slovn\xedkem (zaj\xedmav\xe9 sekce jsou vyta\u017eeny):"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/llvm/llvm-project/blob/main/libcxx/include/map"},(0,r.kt)("inlineCode",{parentName:"a"},"map"))),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-cpp"},"template ,\n class _Allocator = allocator > >\nclass _LIBCPP_TEMPLATE_VIS map\n{\npublic:\n // types:\n typedef _Key key_type;\n typedef _Tp mapped_type;\n typedef pair value_type;\n\n// \u2026\n\nprivate:\n typedef __tree<__value_type, __vc, __allocator_type> __base;\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/llvm/llvm-project/blob/main/libcxx/include/set"},(0,r.kt)("inlineCode",{parentName:"a"},"set"))),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-cpp"},"template ,\n class _Allocator = allocator<_Key> >\nclass _LIBCPP_TEMPLATE_VIS set\n{\npublic:\n // types:\n typedef _Key key_type;\n typedef key_type value_type;\n\n// \u2026\n\nprivate:\n typedef __tree __base;\n")))),(0,r.kt)("p",null,"U obou hlavi\u010dek si m\u016f\u017eeme v\u0161imnout, \u017ee deklaruj\xed n\u011bjak\xfd soukrom\xfd typ ",(0,r.kt)("inlineCode",{parentName:"p"},"__base"),", kter\xfd je aliasem pro ",(0,r.kt)("inlineCode",{parentName:"p"},"__tree"),". Ten n\xe1s pak vede k hlavi\u010dce ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/llvm/llvm-project/blob/main/libcxx/include/__tree"},(0,r.kt)("inlineCode",{parentName:"a"},"__tree")),"."),(0,r.kt)("p",null,"V\xfd\u0148atek:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-cpp"},"/*\n\n_NodePtr algorithms\n\nThe algorithms taking _NodePtr are red black tree algorithms. Those\nalgorithms taking a parameter named __root should assume that __root\npoints to a proper red black tree (unless otherwise specified).\n\n\u2026\n\n*/\n")),(0,r.kt)("h4",{id:"gcc"},"gcc"),(0,r.kt)("p",null,"Pro ",(0,r.kt)("inlineCode",{parentName:"p"},"gcc")," je postup t\xe9m\u011b\u0159 stejn\xfd. Pro zm\u011bnu v hlavi\u010dk\xe1ch ",(0,r.kt)("inlineCode",{parentName:"p"},"map")," a ",(0,r.kt)("inlineCode",{parentName:"p"},"set")," nenajdeme nic, deklarace jsou a\u017e v hlavi\u010dkov\xfdch souborech:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/include/bits/stl_map.h;h=9c2b0745673431b4b396ba27982170478838137e;hb=HEAD"},(0,r.kt)("inlineCode",{parentName:"a"},"bits/stl_map.h"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/include/bits/stl_set.h;h=9c2b0745673431b4b396ba27982170478838137e;hb=HEAD"},(0,r.kt)("inlineCode",{parentName:"a"},"bits/stl_set.h")))),(0,r.kt)("p",null,"V obou se zase odkazuje na n\u011bjakou hlavi\u010dku ",(0,r.kt)("a",{parentName:"p",href:"https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/include/bits/stl_tree.h;h=a4de61417652a288e361a55fcc8bb7a9838c58a5;hb=HEAD"},(0,r.kt)("inlineCode",{parentName:"a"},"bits/stl_tree.h")),", zase v\xfd\u0148atek:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-cpp"}," // Red-black tree class, designed for use in implementing STL\n // associative containers (set, multiset, map, and multimap). The\n // insertion and deletion algorithms are based on those in Cormen,\n // Leiserson, and Rivest, Introduction to Algorithms (MIT Press,\n // 1990), except that\n //\n // (1) the header cell is maintained with links not only to the root\n // but also to the leftmost node of the tree, to enable constant\n // time begin(), and to the rightmost node of the tree, to enable\n // linear time performance when used with the generic set algorithms\n // (set_union, etc.)\n //\n // (2) when a node being deleted has two children its successor node\n // is relinked into its place, rather than copied, so that the only\n // iterators invalidated are those referring to the deleted node.\n\n enum _Rb_tree_color { _S_red = false, _S_black = true };\n\n struct _Rb_tree_node_base\n {\n typedef _Rb_tree_node_base* _Base_ptr;\n typedef const _Rb_tree_node_base* _Const_Base_ptr;\n\n _Rb_tree_color _M_color;\n _Base_ptr _M_parent;\n _Base_ptr _M_left;\n _Base_ptr _M_right;\n\n static _Base_ptr\n _S_minimum(_Base_ptr __x) _GLIBCXX_NOEXCEPT\n {\n while (__x->_M_left != 0) __x = __x->_M_left;\n return __x;\n }\n\n static _Const_Base_ptr\n _S_minimum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT\n {\n while (__x->_M_left != 0) __x = __x->_M_left;\n return __x;\n }\n\n static _Base_ptr\n _S_maximum(_Base_ptr __x) _GLIBCXX_NOEXCEPT\n {\n while (__x->_M_right != 0) __x = __x->_M_right;\n return __x;\n }\n\n static _Const_Base_ptr\n _S_maximum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT\n {\n while (__x->_M_right != 0) __x = __x->_M_right;\n return __x;\n }\n")),(0,r.kt)("p",null,"Tady u\u017e taky vid\xedme n\u011bjak\xfd k\xf3d pro nalezen\xed minima/maxima ve strom\u011b. Mimo jin\xe9\nje\u0161t\u011b existuje ",(0,r.kt)("a",{parentName:"p",href:"https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/src/c%2B%2B98/tree.cc;h=fd14991589a57c6aa847f57105a938cd2bf4df6f;hb=HEAD"},(0,r.kt)("inlineCode",{parentName:"a"},"tree.cc")),", kde je lze nal\xe9zt t\u0159eba funkci s n\xe1sleduj\xedc\xed hlavi\u010dkou:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-cpp"},"void\n_Rb_tree_insert_and_rebalance(const bool __insert_left,\n _Rb_tree_node_base* __x,\n _Rb_tree_node_base* __p,\n _Rb_tree_node_base& __header) throw ();\n")),(0,r.kt)("h3",{id:"java"},"Java"),(0,r.kt)("p",null,"V Jav\u011b jsou pro n\xe1s kl\xed\u010dov\xe9 implementace ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/TreeSet.java"},(0,r.kt)("inlineCode",{parentName:"a"},"TreeSet"))," a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/TreeMap.java"},(0,r.kt)("inlineCode",{parentName:"a"},"TreeMap")),"."),(0,r.kt)("p",null,"V implementaci ",(0,r.kt)("inlineCode",{parentName:"p"},"TreeSet")," si m\u016f\u017eete pov\u0161imnout:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},"public class TreeSet extends AbstractSet\n implements NavigableSet, Cloneable, java.io.Serializable\n{\n /**\n * The backing map.\n */\n private transient NavigableMap m;\n\n // Dummy value to associate with an Object in the backing Map\n private static final Object PRESENT = new Object();\n")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"TreeSet")," v Jav\u011b tedy pou\u017e\xedv\xe1 na pozad\xed ",(0,r.kt)("inlineCode",{parentName:"p"},"TreeMap")," (co\u017e je vid\u011bt ve v\xfdchoz\xedm konstruktoru, kde se vol\xe1 konstruktor p\u0159eb\xedraj\xedc\xed ",(0,r.kt)("inlineCode",{parentName:"p"},"NavigableMap"),", a je mu p\u0159ed\xe1no ",(0,r.kt)("inlineCode",{parentName:"p"},"new TreeMap<>()"),")."),(0,r.kt)("p",null,"Co se t\xfd\u010de ",(0,r.kt)("inlineCode",{parentName:"p"},"TreeMap"),", tak hned ze za\u010d\xe1tku definice ",(0,r.kt)("inlineCode",{parentName:"p"},"TreeMap")," je vid\u011bt:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"},'public class TreeMap\n extends AbstractMap\n implements NavigableMap, Cloneable, java.io.Serializable\n{\n /**\n * The comparator used to maintain order in this tree map, or\n * null if it uses the natural ordering of its keys.\n *\n * @serial\n */\n @SuppressWarnings("serial") // Conditionally serializable\n private final Comparator comparator;\n\n private transient Entry root;\n')),(0,r.kt)("p",null,"Tak\u017ee m\xe1me \u201en\u011bjak\xfd ko\u0159en\u201c typu ",(0,r.kt)("inlineCode",{parentName:"p"},"Entry"),". Zkus\xedme si naj\xedt definici dan\xe9ho typu\u2026"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-java"}," // Red-black mechanics\n\n private static final boolean RED = false;\n private static final boolean BLACK = true;\n\n /**\n * Node in the Tree. Doubles as a means to pass key-value pairs back to\n * user (see Map.Entry).\n */\n\n static final class Entry implements Map.Entry {\n K key;\n V value;\n Entry left;\n Entry right;\n Entry parent;\n boolean color = BLACK;\n")),(0,r.kt)("p",null,"A m\xe1me RB-tree."),(0,r.kt)("p",null,"(Implementace vych\xe1z\xed z projektu OpenJDK.)"),(0,r.kt)("h3",{id:"c-1"},"C#"),(0,r.kt)("p",null,"V C# se zam\u011b\u0159\xedme na nejnov\u011bj\u0161\xed vyd\xe1n\xed (.NET), kter\xe9 je open-source a podporov\xe1no i na opera\u010dn\xedch syst\xe9mech zalo\u017een\xfdch na Linuxu."),(0,r.kt)("p",null,"Nejd\u0159\xedve se pod\xedv\xe1me na implementaci slovn\xedku (",(0,r.kt)("a",{parentName:"p",href:"https://github.com/dotnet/runtime/blob/main/src/libraries/System.Collections/src/System/Collections/Generic/SortedDictionary.cs"},(0,r.kt)("inlineCode",{parentName:"a"},"SortedDictionary")),")."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-csharp"}," public class SortedDictionary : IDictionary, IDictionary, IReadOnlyDictionary where TKey : notnull\n {\n [NonSerialized]\n private KeyCollection? _keys;\n [NonSerialized]\n private ValueCollection? _values;\n\n private readonly TreeSet> _set; // Do not rename (binary serialization)\n")),(0,r.kt)("p",null,"Na prvn\xed pohled m\xe1me probl\xe9m, proto\u017ee ",(0,r.kt)("inlineCode",{parentName:"p"},"TreeSet")," nen\xed ",(0,r.kt)("inlineCode",{parentName:"p"},"SortedSet"),", kter\xfd by jsme \u010dekali. Kdy\u017e se p\u0159esuneme na konec souboru, tak zjist\xedme, \u017ee ",(0,r.kt)("inlineCode",{parentName:"p"},"TreeSet")," je jenom ",(0,r.kt)("em",{parentName:"p"},"backward-compatible wrapper")," pro ",(0,r.kt)("inlineCode",{parentName:"p"},"SortedSet"),"."),(0,r.kt)("p",null,"P\u0159esuneme se k ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/dotnet/runtime/blob/main/src/libraries/System.Collections/src/System/Collections/Generic/SortedSet.cs"},(0,r.kt)("inlineCode",{parentName:"a"},"SortedSet")),". A hned ze za\u010d\xe1tku vid\xedme:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-cs"},' // A binary search tree is a red-black tree if it satisfies the following red-black properties:\n // 1. Every node is either red or black\n // 2. Every leaf (nil node) is black\n // 3. If a node is red, the both its children are black\n // 4. Every simple path from a node to a descendant leaf contains the same number of black nodes\n //\n // The basic idea of a red-black tree is to represent 2-3-4 trees as standard BSTs but to add one extra bit of information\n // per node to encode 3-nodes and 4-nodes.\n // 4-nodes will be represented as: B\n // R R\n //\n // 3 -node will be represented as: B or B\n // R B B R\n //\n // For a detailed description of the algorithm, take a look at "Algorithms" by Robert Sedgewick.\n\n internal enum NodeColor : byte\n {\n Black,\n Red\n }\n\n internal delegate bool TreeWalkPredicate(SortedSet.Node node);\n\n internal enum TreeRotation : byte\n {\n Left,\n LeftRight,\n Right,\n RightLeft\n }\n')),(0,r.kt)("p",null,"Vysv\u011btlen\xed v koment\xe1\u0159i trochu p\u0159edb\xedh\xe1 n\xe1pl\u0148 cvi\u010den\xed zam\u011b\u0159en\xe9ho na B-stromy ;)"),(0,r.kt)("h2",{id:"vztah-mezi-mno\u017einou-a-mapou"},"Vztah mezi mno\u017einou a mapou"),(0,r.kt)("p",null,"P\u0159i ka\u017ed\xe9 implementaci ve standardn\xed knihovn\u011b jsme si mohli v\u0161imnout, \u017ee strom implementuje v\u017edy jenom jeden typ:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Jazyk"),(0,r.kt)("th",{parentName:"tr",align:null},"Zp\u016fsob implementace"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"C++"),(0,r.kt)("td",{parentName:"tr",align:null},"mapa ukl\xe1d\xe1 dvojice do mno\u017einy")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Java"),(0,r.kt)("td",{parentName:"tr",align:null},"mno\u017eina ukl\xe1d\xe1 prvky s \u201edummy\u201c hodnotou do mapy")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"C#"),(0,r.kt)("td",{parentName:"tr",align:null},"mapa ukl\xe1d\xe1 dvojice do mno\u017einy")))),(0,r.kt)("p",null,"Mapa vy\u017eaduje, aby ka\u017ed\xfd kl\xed\u010d m\u011bl p\u0159i\u0159azenou pr\xe1v\u011b jednu hodnotu, tedy kl\xed\u010de jsou navz\xe1jem mezi sebou unik\xe1tn\xed. To n\xe1m umo\u017e\u0148uje organizovat kl\xed\u010de do mno\u017einy, zde ale naraz\xedme na nep\u0159\xedjemn\xfd probl\xe9m spo\u010d\xedvaj\xedc\xed v tom, \u017ee mus\xedme do mno\u017einy vkladat dvojice prvk\u016f: ",(0,r.kt)("inlineCode",{parentName:"p"},"(key, value)"),". Tenhle p\u0159\xedstup m\xe1 ale z\xe1sadn\xed probl\xe9m:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},"# let's represent dictionary/map as a set\nset_of_values = set()\n\n# let's insert few pairs\nset_of_values.add((1, 2))\nset_of_values.add((0, 42))\n\n# let's set key 1 to value 6\nset_of_values.add((1, 6))\n\nset_of_values\n")),(0,r.kt)("p",null,"A dostaneme:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"{(1, 6), (1, 2), (0, 42)}\n")),(0,r.kt)("p",null,"V jednotliv\xfdch implementac\xedch, kter\xe9 jste mohli vid\u011bt v\xfd\u0161e, se vyu\u017e\xedv\xe1 nasleduj\xedc\xed, kdy\u017e:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"mapa ukl\xe1d\xe1 dvojice do mno\u017einy"),": Dvojice je obalen\xe1 v samostatn\xedm typu, kter\xfd porovn\xe1v\xe1 jenom kl\xed\u010de"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"mno\u017eina ukl\xe1d\xe1 kl\xed\u010de do mapy"),": V map\u011b se ignoruj\xed hodnoty p\u0159i\u0159azen\xe9 kl\xed\u010d\u016fm")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1e298f0c.caf61e40.js b/assets/js/1e298f0c.caf61e40.js new file mode 100644 index 0000000..32fb75e --- /dev/null +++ b/assets/js/1e298f0c.caf61e40.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2732],{3467:e=>{e.exports=JSON.parse('{"label":"bfs","permalink":"/ib002/tags/bfs","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"graphs/bfs-tree","title":"Distance boundaries from BFS tree on undirected graphs","description":"Short explanation of distance boundaries deduced from a BFS tree.\\n","permalink":"/ib002/graphs/bfs-tree"}]}')}}]); \ No newline at end of file diff --git a/assets/js/22a175ec.a5706cf0.js b/assets/js/22a175ec.a5706cf0.js new file mode 100644 index 0000000..b6fc5e9 --- /dev/null +++ b/assets/js/22a175ec.a5706cf0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6890],{707:(e,t,n)=>{n.r(t),n.d(t,{default:()=>E});var r=n(7462),o=n(7294),l=n(7452),a=n(6010);const i="card_n_Wj",s="contributionsContainer_vdAK",c="buttons_UAd1";var u,p;function m(){return m=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{title:t,titleId:n,...r}=e;return o.createElement("svg",m({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-labelledby":n},r),t?o.createElement("title",{id:n},t):null,u||(u=o.createElement("path",{fill:"none",d:"M0 0h24v24H0z"})),p||(p=o.createElement("path",{d:"M13 21v2.5l-3-2-3 2V21h-.5A3.5 3.5 0 0 1 3 17.5V5a3 3 0 0 1 3-3h14a1 1 0 0 1 1 1v17a1 1 0 0 1-1 1h-7zm0-2h6v-3H6.5a1.5 1.5 0 0 0 0 3H7v-2h6v2zm6-5V4H6v10.035A3.53 3.53 0 0 1 6.5 14H19zM7 5h2v2H7V5zm0 3h2v2H7V8zm0 3h2v2H7v-2z"})))},d=e=>{let{title:t,description:n,contribution:r,repoURL:l}=e;return o.createElement("div",{className:"col col--12"},o.createElement("div",{className:(0,a.Z)("card",i)},o.createElement("div",{className:"card__header"},o.createElement("h2",null,t)),o.createElement("div",{className:"card__body"},o.createElement("div",{className:"row"},o.createElement("div",{className:"col col--6"},o.createElement("h6",null,"Description"),n),o.createElement("div",{className:(0,a.Z)("col col--6",s)},o.createElement("h6",null,"Contribution"),r))),o.createElement("div",{className:"card__footer"},o.createElement("div",{className:c},o.createElement("a",{href:l,target:"_blank",className:"button button--secondary button--outline"},o.createElement("span",{className:"button__icon"},o.createElement(h,null)),"See repository")))))},b=[{title:"Fedora Infrastructure Ansible",description:o.createElement("p",null,"Collection of Ansible playbooks that powers the Fedora Infrastructure."),contribution:o.createElement("p",null,"I have adjusted the groups in the Bodhi playbooks after Packit has been granted the privileges to propose updates without restrictions."),repoURL:"https://pagure.io/fedora-infra/ansible"},{title:"Bodhi",description:o.createElement("p",null,"Bodhi is a web-system that facilitates the process of publishing updates for a Fedora-based software distribution."),contribution:o.createElement("p",null,"I have adjusted the client, so that it doesn't show secrets in terminal when you log in to the Bodhi via browser."),repoURL:"https://github.com/fedora-infra/bodhi"},{title:"Gluetool Modules Collection",description:o.createElement("p",null,"Modules for ",o.createElement("code",null,"gluetool")," \u2014 a command line centric framework usable for glueing modules into a pipeline."),contribution:o.createElement("ul",null,o.createElement("li",null,"I have proposed a possible implementation of git merging that was later on extended."),o.createElement("li",null,"I have tried to help out with Copr module after they deprecated older version of their API.")),repoURL:"https://gitlab.com/testing-farm/gluetool-modules"},{title:"Pagure",description:o.createElement("p",null,"Pagure is a git-centered forge, python based using pygit2."),contribution:o.createElement("p",null,"I have added an API endpoint for reopening pull requests."),repoURL:"https://pagure.io/pagure"},{title:"Copr",description:o.createElement("p",null,"RPM build system - upstream for"," ",o.createElement("a",{target:"_blank",href:"https://copr.fedorainfracloud.org/"},"Copr"),"."),contribution:o.createElement("ul",null,o.createElement("li",null,"Supporting external repositories for custom SRPM build method."),o.createElement("li",null,"Allowing admins of Copr repositories to build without the need to ask for explicit ",o.createElement("code",null,"builder")," permissions.")),repoURL:"https://github.com/fedora-copr/copr"},{title:"python-gitlab",description:o.createElement("p",null,"A python wrapper for the GitLab API."),contribution:o.createElement("p",null,"I have contributed support for the ",o.createElement("code",null,"merge_ref")," on merge requests that hasn't been supported, yet it was present in the GitLab API."),repoURL:"https://github.com/python-gitlab/python-gitlab"},{title:"PatternFly React",description:o.createElement("p",null,"A set of React components for the PatternFly project."),contribution:o.createElement("p",null,"When working on Packit Dashboard, I have spotted smaller bugs that were present in this project and fixed them upstream to provide better experience for our users."),repoURL:"https://github.com/patternfly/patternfly-react"},{title:"Fira Code",description:o.createElement("p",null,"Free monospaced font with programming ligatures."),contribution:o.createElement("p",null,"I have set up a GitHub Action for building the font on each push to the default branch allowing users to install ",o.createElement("i",null,"bleeding edge")," ","version of the font."),repoURL:"https://github.com/tonsky/FiraCode"},{title:"nixpkgs",description:o.createElement("p",null,"Nixpkgs is a collection of over 80,000 software packages that can be installed with the Nix package manager. It also implements NixOS, a purely-functional Linux distribution."),contribution:o.createElement("p",null,"When I was trying out the nixpkgs, I have tried to bump .NET Core to the latest version. My changes haven't been accepted as they required bumping of multiple more packages that depended upon the .NET Core."),repoURL:"https://github.com/NixOS/nixpkgs"},{title:"Darcula",description:o.createElement("p",null,"A theme for Visual Studio Code based on Darcula theme from Jetbrains IDEs."),contribution:o.createElement("p",null,"I have contributed support for diff files, though the project doesn't seem to be live anymore, so it hasn't been accepted as of now."),repoURL:"https://github.com/rokoroku/vscode-theme-darcula"},{title:"Packit",description:o.createElement("p",null,"An open source project aiming to ease the integration of your project with Fedora Linux, CentOS Stream and other distributions."),contribution:o.createElement("p",null,"Have a look at my"," ",o.createElement("a",{href:"https://github.com/search?q=is%3Apr%20author%3Amfocko%20org%3Apackit&type=pullrequests",target:"_blank"},"pull requests"),"."),repoURL:"https://github.com/packit"},{title:"Snitch",description:o.createElement(o.Fragment,null,o.createElement("p",null,"Language agnostic tool that collects TODOs in the source code and reports them as Issues.")),contribution:o.createElement("ul",null,o.createElement("li",null,"Environment variable support for self-hosted GitLab instances"),o.createElement("li",null,"GitLab support")),repoURL:"https://github.com/tsoding/snitch"},{title:"Karel the Robot",description:o.createElement(o.Fragment,null,o.createElement("p",null,"Karel the robot is in general an educational programming language for beginners, created by ",o.createElement("i",null,"Richard E. Pattis"),". This is implementation of ",o.createElement("i",null,"Karel the Robot")," for"," ",o.createElement("i",null,"C programming language"),"."),o.createElement("p",null,"This project is used for educational purposes at"," ",o.createElement("a",{target:"_blank",href:"https://fei.tuke.sk"},"TUKE"),".")),contribution:o.createElement("p",null,"I have contributed some refactoring tips to the author of the library."),repoURL:"https://git.kpi.fei.tuke.sk/kpi/karel-the-robot"}],g="Contributions",f="Many of my contributions to open-source projects.";function E(){return o.createElement(l.Z,{title:g,description:f},o.createElement("main",{className:"container container--fluid margin-vert--lg"},o.createElement("h1",null,g),o.createElement("p",null,f),o.createElement("div",{className:"row"},b.map((e=>o.createElement(d,(0,r.Z)({key:e.project},e)))))))}}}]); \ No newline at end of file diff --git a/assets/js/2523321d.50613303.js b/assets/js/2523321d.50613303.js new file mode 100644 index 0000000..470fc9f --- /dev/null +++ b/assets/js/2523321d.50613303.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9193],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>k});var i=n(7294);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 r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=i.createContext({}),u=function(e){var t=i.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=u(e.components);return i.createElement(s.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),m=u(n),d=a,k=m["".concat(s,".").concat(d)]||m[d]||c[d]||r;return n?i.createElement(k,o(o({ref:t},p),{},{components:n})):i.createElement(k,o({ref:t},p))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:a,o[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var i=n(7462),a=(n(7294),n(3905));const r={id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},o="8th seminar bonus assignment",l={unversionedId:"bonuses/seminar-08",id:"bonuses/seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n",source:"@site/pb071/bonuses/08.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-08",permalink:"/pb071/bonuses/seminar-08",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/bonuses/08.md",tags:[],version:"current",lastUpdatedAt:1694108971,formattedLastUpdatedAt:"Sep 7, 2023",frontMatter:{id:"seminar-08",title:"8th seminar",description:"Manipulating with files only char-by-char and a magic tree.\n"},sidebar:"autogeneratedBar",previous:{title:"5th and 6th seminar",permalink:"/pb071/bonuses/seminar-05-06"},next:{title:"10th seminar",permalink:"/pb071/bonuses/seminar-10"}},s={},u=[{value:"Introduction",id:"introduction",level:2},{value:"Warning",id:"warning",level:2},{value:"Testing",id:"testing",level:2},{value:"Task no. 1: Counting (0.75 K\u20a1)",id:"task-no-1-counting-075-k",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Bonus part (0.75 K\u20a1)",id:"bonus-part-075-k",level:3},{value:"Task no. 2: Weird trees (1 K\u20a1)",id:"task-no-2-weird-trees-1-k",level:2},{value:"Submitting",id:"submitting",level:2}],p={toc:u},m="wrapper";function c(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,i.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"8th-seminar-bonus-assignment"},"8th seminar bonus assignment"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"pathname:///files/pb071/bonuses/08.tar.gz"},"Source")),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"In this bonus you can implement two tasks, one of them has a bonus part with generic\nsolution."),(0,a.kt)("p",null,"One is focused on counting ananas or in case of generic version any substring in\nthe file, but with a restriction on the function you use."),(0,a.kt)("p",null,"Other one has a more algorithmic spirit."),(0,a.kt)("p",null,"For this bonus you can get at maximum 2.5 K\u20a1."),(0,a.kt)("h2",{id:"warning"},"Warning"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"DO NOT COMMIT test data")," to your own git repository, since the tests include\nfiles that exceed 10MB by themselves. Even if they are on separate branch, they\ntake up the space."),(0,a.kt)("h2",{id:"testing"},"Testing"),(0,a.kt)("p",null,"For testing you are provided with python script (requires ",(0,a.kt)("inlineCode",{parentName:"p"},"click")," to be installed:\n",(0,a.kt)("inlineCode",{parentName:"p"},"pip3 install --user click"),") and ",(0,a.kt)("inlineCode",{parentName:"p"},"Makefile")," that provides following targets:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"check-counting")," - runs the ",(0,a.kt)("inlineCode",{parentName:"li"},"counting")," tests"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"check-counting-bonus")," - runs the ",(0,a.kt)("inlineCode",{parentName:"li"},"counting")," tests with bonus implemented"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"check")," - runs both ",(0,a.kt)("inlineCode",{parentName:"li"},"counting")," and ",(0,a.kt)("inlineCode",{parentName:"li"},"counting-bonus")," tests"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"clean")," - removes output files from the test runs")),(0,a.kt)("h2",{id:"task-no-1-counting-075-k"},"Task no. 1: Counting (0.75 K\u20a1)"),(0,a.kt)("p",null,"Your first task is to make smallish program that counts occurences of specific\n(or given) word from file and writes the number to other file."),(0,a.kt)("p",null,"Usage of the program is:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"Usage: ./counting [string-to-be-counted]\n")),(0,a.kt)("p",null,"Arguments that are passed to the program represent:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"")," - path to the file where we count the words"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"")," - path to the file where we output the count"),(0,a.kt)("li",{parentName:"ul"},"(optional argument) ",(0,a.kt)("inlineCode",{parentName:"li"},"[string-to-be-counted]")," - in case you implement bonus,\notherwise we default to word ",(0,a.kt)("inlineCode",{parentName:"li"},"ananas")," ;)")),(0,a.kt)("p",null,"In skeleton you are given 3 empty, but documented, functions to implement."),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"count_anything")," - function accepts input file and substring to be counted in\nthe file, returns the count."),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"count_ananas")," - same as ",(0,a.kt)("inlineCode",{parentName:"li"},"count_anything"),", but specialized for ananases, the\ndefault implementation from the skeleton expects you to implement ",(0,a.kt)("inlineCode",{parentName:"li"},"count_anything"),"\nand therefore it just calls the other function."),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"write_number")," - function that writes the number to the file, why would you\nneed the function is explained later :)")),(0,a.kt)("h3",{id:"requirements"},"Requirements"),(0,a.kt)("p",null,"For manipulation with the files you are only allowed to use ",(0,a.kt)("inlineCode",{parentName:"p"},"fopen"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"fclose"),",\n",(0,a.kt)("inlineCode",{parentName:"p"},"fgetc")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"fputc"),". Functions like ",(0,a.kt)("inlineCode",{parentName:"p"},"fprintf")," (except for ",(0,a.kt)("inlineCode",{parentName:"p"},"stderr")," or logging) and\n",(0,a.kt)("inlineCode",{parentName:"p"},"fscanf")," are ",(0,a.kt)("strong",{parentName:"p"},"forbidden"),"."),(0,a.kt)("p",null,"In case you struggle and want to use one of those functions, the solution will be\npenalized by 50% of points."),(0,a.kt)("h3",{id:"bonus-part-075-k"},"Bonus part (0.75 K\u20a1)"),(0,a.kt)("p",null,"Bonus part of this assignment is to implement ",(0,a.kt)("inlineCode",{parentName:"p"},"count_anything")," rather than ",(0,a.kt)("inlineCode",{parentName:"p"},"count_ananas"),"."),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Smaller hint: This task does not need dynamic allocation :) You just need one\ngood helper function and the right idea ;)")),(0,a.kt)("h2",{id:"task-no-2-weird-trees-1-k"},"Task no. 2: Weird trees (1 K\u20a1)"),(0,a.kt)("p",null,"In this task we are crossing our paths with ",(0,a.kt)("em",{parentName:"p"},"algorithms and data structures"),".\nYour task is to write a program that constructs tree from the file that is given\nas an argument and pretty-prints it."),(0,a.kt)("p",null,"Input file consists of lines, that include ",(0,a.kt)("inlineCode",{parentName:"p"},"key")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"rank")," in form ",(0,a.kt)("inlineCode",{parentName:"p"},"key;rank"),"\nor ",(0,a.kt)("inlineCode",{parentName:"p"},"nil"),". Why would we have ",(0,a.kt)("inlineCode",{parentName:"p"},"nil")," in a file? The file represents pre-order iteration\nthrough the tree. Leaves never have rank different than 0, so you can safely assume\n2 non-existing ",(0,a.kt)("inlineCode",{parentName:"p"},"nil"),"s in the input after you read such node ;)"),(0,a.kt)("table",null,(0,a.kt)("tr",null,(0,a.kt)("th",null,"Example input file"),(0,a.kt)("th",null,"Tree it represents")),(0,a.kt)("tr",null,(0,a.kt)("td",null,(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"8;4\n5;3\n3;2\n2;1\n1;0\nnil\n4;0\n7;1\n6;0\nnil\n11;2\n10;1\n9;0\nnil\n12;0\n"))),(0,a.kt)("td",null,(0,a.kt)("p",null,(0,a.kt)("img",{alt:"tree",src:n(4860).Z,width:"633",height:"684"}))))),(0,a.kt)("p",null,"In this task you are only provided with different trees in the ",(0,a.kt)("inlineCode",{parentName:"p"},"test-trees")," directory.\nImplementation and format of the pretty-print is totally up to you. :)"),(0,a.kt)("p",null,"Example of mine for the tree above:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"8 (rank = 4)\n+-- 5 (rank = 3)\n| +-- 3 (rank = 2)\n| | +-- 2 (rank = 1)\n| | | +-- 1 (rank = 0)\n| | +-- 4 (rank = 0)\n| +-- 7 (rank = 1)\n| +-- 6 (rank = 0)\n+-- 11 (rank = 2)\n +-- 10 (rank = 1)\n | +-- 9 (rank = 0)\n +-- 12 (rank = 0)\n")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Can you find out what are those trees? :)")),(0,a.kt)("h2",{id:"submitting"},"Submitting"),(0,a.kt)("p",null,"In case you have any questions, feel free to reach out to me."),(0,a.kt)("hr",null),(0,a.kt)("p",null,"Ideally submit the assignment through the merge request. Step-by-step tutorial is\npresent ",(0,a.kt)("a",{parentName:"p",href:"../mr"},"here"),". For setting assignee my xlogin is ",(0,a.kt)("inlineCode",{parentName:"p"},"xfocko"),"."),(0,a.kt)("p",null,"In case you do not want to experiment on GitLab, send me the source code via email,\nbut please prefix subject with: ",(0,a.kt)("inlineCode",{parentName:"p"},"[PB071/14][seminar-08]")),(0,a.kt)("p",null,"Deadline for the submission of the bonus is ",(0,a.kt)("strong",{parentName:"p"},"May 4th 24:00"),"."))}c.isMDXComponent=!0},4860:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/tree-c9e37f87f9095c00fad33ea034485ce6.png"}}]); \ No newline at end of file diff --git a/assets/js/27470891.d509d6e4.js b/assets/js/27470891.d509d6e4.js new file mode 100644 index 0000000..fa1b7c5 --- /dev/null +++ b/assets/js/27470891.d509d6e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4972],{9249:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"pb071"}')}}]); \ No newline at end of file diff --git a/assets/js/280c26e1.27c7a6b1.js b/assets/js/280c26e1.27c7a6b1.js new file mode 100644 index 0000000..4799726 --- /dev/null +++ b/assets/js/280c26e1.27c7a6b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5529],{3272:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"ib002"}')}}]); \ No newline at end of file diff --git a/assets/js/29694455.a2e2c1d7.js b/assets/js/29694455.a2e2c1d7.js new file mode 100644 index 0000000..acce2ed --- /dev/null +++ b/assets/js/29694455.a2e2c1d7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3388],{9828:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/iterators","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/2a09abcd.15946a52.js b/assets/js/2a09abcd.15946a52.js new file mode 100644 index 0000000..80c4718 --- /dev/null +++ b/assets/js/2a09abcd.15946a52.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1246],{3905:(a,e,t)=>{t.d(e,{Zo:()=>l,kt:()=>k});var n=t(7294);function s(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function m(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function r(a){for(var e=1;e=0||(s[t]=a[t]);return s}(a,e);if(Object.getOwnPropertySymbols){var m=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(s[t]=a[t])}return s}var i=n.createContext({}),o=function(a){var e=n.useContext(i),t=e;return a&&(t="function"==typeof a?a(e):r(r({},e),a)),t},l=function(a){var e=o(a.components);return n.createElement(i.Provider,{value:e},a.children)},h="mdxType",c={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},N=n.forwardRef((function(a,e){var t=a.components,s=a.mdxType,m=a.originalType,i=a.parentName,l=p(a,["components","mdxType","originalType","parentName"]),h=o(t),N=s,k=h["".concat(i,".").concat(N)]||h[N]||c[N]||m;return t?n.createElement(k,r(r({ref:e},l),{},{components:t})):n.createElement(k,r({ref:e},l))}));function k(a,e){var t=arguments,s=e&&e.mdxType;if("string"==typeof a||s){var m=t.length,r=new Array(m);r[0]=N;var p={};for(var i in e)hasOwnProperty.call(e,i)&&(p[i]=e[i]);p.originalType=a,p[h]="string"==typeof a?a:s,r[1]=p;for(var o=2;o{t.r(e),t.d(e,{assets:()=>i,contentTitle:()=>r,default:()=>c,frontMatter:()=>m,metadata:()=>p,toc:()=>o});var n=t(7462),s=(t(7294),t(3905));const m={id:"bfs-tree",title:"Distance boundaries from BFS tree on undirected graphs",description:"Short explanation of distance boundaries deduced from a BFS tree.\n",tags:["graphs","bfs"],last_update:{date:new Date("2022-04-30T00:00:00.000Z")}},r=void 0,p={unversionedId:"graphs/bfs-tree",id:"graphs/bfs-tree",title:"Distance boundaries from BFS tree on undirected graphs",description:"Short explanation of distance boundaries deduced from a BFS tree.\n",source:"@site/ib002/10-graphs/2022-04-30-bfs-tree.md",sourceDirName:"10-graphs",slug:"/graphs/bfs-tree",permalink:"/ib002/graphs/bfs-tree",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/10-graphs/2022-04-30-bfs-tree.md",tags:[{label:"graphs",permalink:"/ib002/tags/graphs"},{label:"bfs",permalink:"/ib002/tags/bfs"}],version:"current",lastUpdatedAt:1651276800,formattedLastUpdatedAt:"Apr 30, 2022",frontMatter:{id:"bfs-tree",title:"Distance boundaries from BFS tree on undirected graphs",description:"Short explanation of distance boundaries deduced from a BFS tree.\n",tags:["graphs","bfs"],last_update:{date:"2022-04-30T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Iterative algorithms via iterators",permalink:"/ib002/graphs/iterative-and-iterators"}},i={},o=[{value:"Introduction",id:"introduction",level:2},{value:"Lower bound",id:"lower-bound",level:2},{value:"Proof by contradiction",id:"proof-by-contradiction",level:2}],l={toc:o},h="wrapper";function c(a){let{components:e,...m}=a;return(0,s.kt)(h,(0,n.Z)({},l,m,{components:e,mdxType:"MDXLayout"}),(0,s.kt)("h2",{id:"introduction"},"Introduction"),(0,s.kt)("p",null,"As we have talked on the seminar, if we construct from some vertex ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"u")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"u")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"u")))))," BFS tree on an undirected graph, we can obtain:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"lower bound of length of the shortest path between 2 vertices from the ",(0,s.kt)("em",{parentName:"li"},"height difference")),(0,s.kt)("li",{parentName:"ul"},"upper bound of length of the shortest path between 2 vertices from the ",(0,s.kt)("em",{parentName:"li"},"path through the root"))),(0,s.kt)("h2",{id:"lower-bound"},"Lower bound"),(0,s.kt)("p",null,"Consider the following graph:"),(0,s.kt)("p",null,(0,s.kt)("img",{src:t(491).Z+"#gh-light-mode-only",width:"252",height:"539"}),"\n",(0,s.kt)("img",{src:t(9257).Z+"#gh-dark-mode-only",width:"252",height:"539"})),(0,s.kt)("p",null,"We run BFS from the vertex ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"a")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"a")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"a")))))," and obtain the following BFS tree:"),(0,s.kt)("p",null,(0,s.kt)("img",{src:t(1281).Z+"#gh-light-mode-only",width:"275",height:"347"}),"\n",(0,s.kt)("img",{src:t(820).Z+"#gh-dark-mode-only",width:"275",height:"347"})),(0,s.kt)("p",null,"Let's consider pair of vertices ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"e")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"e")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"e")))))," and ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"h")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"h")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"h"))))),". For them we can safely lay, from the BFS tree, following properties:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"lower bound: ",(0,s.kt)("span",{parentName:"li",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"2")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"2")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2")))))),(0,s.kt)("li",{parentName:"ul"},"upper bound: ",(0,s.kt)("span",{parentName:"li",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"4")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"4")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"))))))),(0,s.kt)("p",null,"By having a look at the graph we started from, we can see that we have a path \u2039",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"e"),(0,s.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,s.kt)("mi",{parentName:"mrow"},"j"),(0,s.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,s.kt)("mi",{parentName:"mrow"},"h")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"e, j, h")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"e"),(0,s.kt)("span",{parentName:"span",className:"mpunct"},","),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.05724em"}},"j"),(0,s.kt)("span",{parentName:"span",className:"mpunct"},","),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"h"))))),"\u203a that has a length 2. Apart from that we can also notice there is another path from ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"e")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"e")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"e")))))," to ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"h")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"h")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"h")))))," and that is \u2039",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"e"),(0,s.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,s.kt)("mi",{parentName:"mrow"},"a"),(0,s.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,s.kt)("mi",{parentName:"mrow"},"c"),(0,s.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,s.kt)("mi",{parentName:"mrow"},"i"),(0,s.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,s.kt)("mi",{parentName:"mrow"},"d"),(0,s.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,s.kt)("mi",{parentName:"mrow"},"h")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"e, a, c, i, d, h")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"e"),(0,s.kt)("span",{parentName:"span",className:"mpunct"},","),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"a"),(0,s.kt)("span",{parentName:"span",className:"mpunct"},","),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"c"),(0,s.kt)("span",{parentName:"span",className:"mpunct"},","),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"i"),(0,s.kt)("span",{parentName:"span",className:"mpunct"},","),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"d"),(0,s.kt)("span",{parentName:"span",className:"mpunct"},","),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"h"))))),"\u203a. And that path has a length of ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"5")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"5")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"5"))))),". Doesn't this break our statements at the beginning? (",(0,s.kt)("em",{parentName:"p"},"I'm leaving that as an exercise ;)"),")"),(0,s.kt)("h2",{id:"proof-by-contradiction"},"Proof by contradiction"),(0,s.kt)("p",null,"Let's keep the same graph, but break the lower bound, i.e. I have gotten a lower bound ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"2")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"2")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"))))),", but \u201cthere must be a shorter path\u201d! ;)"),(0,s.kt)("p",null,"Now the more important question, is there a shorter path in that graph? The answer is no, there's no shorter path than the one with length ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"2")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"2")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"))))),". So what can we do about it? We'll add an edge to have a shorter path. Now we have gotten a lower bound of ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"2")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"2")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"))))),", which means the only shorter path we can construct has ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"1")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"1")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"1")))))," edge and that is \u2039",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"e"),(0,s.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,s.kt)("mi",{parentName:"mrow"},"h")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"e, h")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"e"),(0,s.kt)("span",{parentName:"span",className:"mpunct"},","),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"h"))))),"\u203a (no intermediary vertices). Let's do this!"),(0,s.kt)("p",null,(0,s.kt)("img",{src:t(340).Z+"#gh-light-mode-only",width:"252",height:"539"}),"\n",(0,s.kt)("img",{src:t(4110).Z+"#gh-dark-mode-only",width:"252",height:"539"})),(0,s.kt)("p",null,"Okay, so we have a graph that breaks the rule we have laid. However, we need to run BFS to obtain the new BFS tree, since we have changed the graph."),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"Do we need to run BFS after ",(0,s.kt)("strong",{parentName:"p"},"every")," change?"),(0,s.kt)("p",{parentName:"admonition"},"\xadI am leaving that as an exercise ;)")),(0,s.kt)("p",null,(0,s.kt)("img",{src:t(6256).Z+"#gh-light-mode-only",width:"371",height:"347"}),"\n",(0,s.kt)("img",{src:t(8680).Z+"#gh-dark-mode-only",width:"371",height:"347"})),(0,s.kt)("p",null,"Oops, we have gotten a new BFS tree, that has a height difference of 1."),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"Try to think about a way this can be generalized for shortening of minimal length 3 to minimal length 2 ;)")))}c.isMDXComponent=!0},9257:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/bfs_graph_dark-f7a3a78eaf9de049469b4c64e0712867.png"},491:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/bfs_graph_light-6e21a942bccd92bcce6840da7c3cb056.png"},4110:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/bfs_graph_with_additional_edge_dark-c2da6c052b067785e877b4654a13f328.png"},340:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/bfs_graph_with_additional_edge_light-799673ba333298d16327abe67c90507e.png"},820:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/bfs_tree_dark-34f32262c6e4ffc14983b3ebf9a2f5a9.png"},1281:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/bfs_tree_light-61d6723c3c587d565b6280b8b8eca211.png"},8680:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/bfs_tree_with_additional_edge_dark-127aa5b00988d4569669a92f5d841dbf.png"},6256:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/bfs_tree_with_additional_edge_light-93df97e1f9f1883467248532809374d0.png"}}]); \ No newline at end of file diff --git a/assets/js/3011a4c0.573f9325.js b/assets/js/3011a4c0.573f9325.js new file mode 100644 index 0000000..edf99fc --- /dev/null +++ b/assets/js/3011a4c0.573f9325.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7926],{1670:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/copr","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/316.d513d091.js b/assets/js/316.d513d091.js new file mode 100644 index 0000000..67fe849 --- /dev/null +++ b/assets/js/316.d513d091.js @@ -0,0 +1,1354 @@ +"use strict"; +exports.id = 316; +exports.ids = [316]; +exports.modules = { + +/***/ 96316: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ diagram: () => (/* binding */ diagram) +/* harmony export */ }); +/* harmony import */ var _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(87115); +/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59373); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(91619); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(12281); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(7201); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(27484); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17967); +/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(20683); +/* harmony import */ var dagre_d3_es_src_dagre_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70277); +/* harmony import */ var dagre_d3_es_src_graphlib_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(45625); +/* harmony import */ var dagre_d3_es_src_graphlib_json_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(39354); +/* harmony import */ var dagre_d3_es__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(91518); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(59542); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(10285); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(28734); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_10__); + + + + + + + + + + + + + + + + + + + + + + +var parser = function() { + var o = function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) + ; + return o2; + }, $V0 = [1, 2], $V1 = [1, 5], $V2 = [6, 9, 11, 17, 18, 20, 22, 23, 26, 27, 28], $V3 = [1, 15], $V4 = [1, 16], $V5 = [1, 17], $V6 = [1, 18], $V7 = [1, 19], $V8 = [1, 23], $V9 = [1, 24], $Va = [1, 27], $Vb = [4, 6, 9, 11, 17, 18, 20, 22, 23, 26, 27, 28]; + var parser2 = { + trace: function trace() { + }, + yy: {}, + symbols_: { "error": 2, "start": 3, "timeline": 4, "document": 5, "EOF": 6, "directive": 7, "line": 8, "SPACE": 9, "statement": 10, "NEWLINE": 11, "openDirective": 12, "typeDirective": 13, "closeDirective": 14, ":": 15, "argDirective": 16, "title": 17, "acc_title": 18, "acc_title_value": 19, "acc_descr": 20, "acc_descr_value": 21, "acc_descr_multiline_value": 22, "section": 23, "period_statement": 24, "event_statement": 25, "period": 26, "event": 27, "open_directive": 28, "type_directive": 29, "arg_directive": 30, "close_directive": 31, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 4: "timeline", 6: "EOF", 9: "SPACE", 11: "NEWLINE", 15: ":", 17: "title", 18: "acc_title", 19: "acc_title_value", 20: "acc_descr", 21: "acc_descr_value", 22: "acc_descr_multiline_value", 23: "section", 26: "period", 27: "event", 28: "open_directive", 29: "type_directive", 30: "arg_directive", 31: "close_directive" }, + productions_: [0, [3, 3], [3, 2], [5, 0], [5, 2], [8, 2], [8, 1], [8, 1], [8, 1], [7, 4], [7, 6], [10, 1], [10, 2], [10, 2], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [24, 1], [25, 1], [12, 1], [13, 1], [16, 1], [14, 1]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 1: + return $$[$0 - 1]; + case 3: + this.$ = []; + break; + case 4: + $$[$0 - 1].push($$[$0]); + this.$ = $$[$0 - 1]; + break; + case 5: + case 6: + this.$ = $$[$0]; + break; + case 7: + case 8: + this.$ = []; + break; + case 11: + yy.getCommonDb().setDiagramTitle($$[$0].substr(6)); + this.$ = $$[$0].substr(6); + break; + case 12: + this.$ = $$[$0].trim(); + yy.getCommonDb().setAccTitle(this.$); + break; + case 13: + case 14: + this.$ = $$[$0].trim(); + yy.getCommonDb().setAccDescription(this.$); + break; + case 15: + yy.addSection($$[$0].substr(8)); + this.$ = $$[$0].substr(8); + break; + case 19: + yy.addTask($$[$0], 0, ""); + this.$ = $$[$0]; + break; + case 20: + yy.addEvent($$[$0].substr(2)); + this.$ = $$[$0]; + break; + case 21: + yy.parseDirective("%%{", "open_directive"); + break; + case 22: + yy.parseDirective($$[$0], "type_directive"); + break; + case 23: + $$[$0] = $$[$0].trim().replace(/'/g, '"'); + yy.parseDirective($$[$0], "arg_directive"); + break; + case 24: + yy.parseDirective("}%%", "close_directive", "timeline"); + break; + } + }, + table: [{ 3: 1, 4: $V0, 7: 3, 12: 4, 28: $V1 }, { 1: [3] }, o($V2, [2, 3], { 5: 6 }), { 3: 7, 4: $V0, 7: 3, 12: 4, 28: $V1 }, { 13: 8, 29: [1, 9] }, { 29: [2, 21] }, { 6: [1, 10], 7: 22, 8: 11, 9: [1, 12], 10: 13, 11: [1, 14], 12: 4, 17: $V3, 18: $V4, 20: $V5, 22: $V6, 23: $V7, 24: 20, 25: 21, 26: $V8, 27: $V9, 28: $V1 }, { 1: [2, 2] }, { 14: 25, 15: [1, 26], 31: $Va }, o([15, 31], [2, 22]), o($V2, [2, 8], { 1: [2, 1] }), o($V2, [2, 4]), { 7: 22, 10: 28, 12: 4, 17: $V3, 18: $V4, 20: $V5, 22: $V6, 23: $V7, 24: 20, 25: 21, 26: $V8, 27: $V9, 28: $V1 }, o($V2, [2, 6]), o($V2, [2, 7]), o($V2, [2, 11]), { 19: [1, 29] }, { 21: [1, 30] }, o($V2, [2, 14]), o($V2, [2, 15]), o($V2, [2, 16]), o($V2, [2, 17]), o($V2, [2, 18]), o($V2, [2, 19]), o($V2, [2, 20]), { 11: [1, 31] }, { 16: 32, 30: [1, 33] }, { 11: [2, 24] }, o($V2, [2, 5]), o($V2, [2, 12]), o($V2, [2, 13]), o($Vb, [2, 9]), { 14: 34, 31: $Va }, { 31: [2, 23] }, { 11: [1, 35] }, o($Vb, [2, 10])], + defaultActions: { 5: [2, 21], 7: [2, 2], 27: [2, 24], 33: [2, 23] }, + parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, + parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + var symbol, state, action, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + var lexer = function() { + var lexer2 = { + EOF: 1, + parseError: function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + // resets the lexer, sets new input + setInput: function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, + // consumes and returns one char from the input + input: function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, + // unshifts one char (or a string) into the input + unput: function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + this._more = true; + return this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, + // retain first n characters of the match + less: function(n) { + this.unput(this.match.slice(n)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, + // return next match in input + next: function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + // return next match that has a token + lex: function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + // pop the previously active lexer condition state off the condition stack + popState: function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + // alias for begin(condition) + pushState: function pushState(condition) { + this.begin(condition); + }, + // return the number of states currently on the stack + stateStackSize: function stateStackSize() { + return this.conditionStack.length; + }, + options: { "case-insensitive": true }, + performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + switch ($avoiding_name_collisions) { + case 0: + this.begin("open_directive"); + return 28; + case 1: + this.begin("type_directive"); + return 29; + case 2: + this.popState(); + this.begin("arg_directive"); + return 15; + case 3: + this.popState(); + this.popState(); + return 31; + case 4: + return 30; + case 5: + break; + case 6: + break; + case 7: + return 11; + case 8: + break; + case 9: + break; + case 10: + return 4; + case 11: + return 17; + case 12: + this.begin("acc_title"); + return 18; + case 13: + this.popState(); + return "acc_title_value"; + case 14: + this.begin("acc_descr"); + return 20; + case 15: + this.popState(); + return "acc_descr_value"; + case 16: + this.begin("acc_descr_multiline"); + break; + case 17: + this.popState(); + break; + case 18: + return "acc_descr_multiline_value"; + case 19: + return 23; + case 20: + return 27; + case 21: + return 26; + case 22: + return 6; + case 23: + return "INVALID"; + } + }, + rules: [/^(?:%%\{)/i, /^(?:((?:(?!\}%%)[^:.])*))/i, /^(?::)/i, /^(?:\}%%)/i, /^(?:((?:(?!\}%%).|\n)*))/i, /^(?:%(?!\{)[^\n]*)/i, /^(?:[^\}]%%[^\n]*)/i, /^(?:[\n]+)/i, /^(?:\s+)/i, /^(?:#[^\n]*)/i, /^(?:timeline\b)/i, /^(?:title\s[^#\n;]+)/i, /^(?:accTitle\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*:\s*)/i, /^(?:(?!\n||)*[^\n]*)/i, /^(?:accDescr\s*\{\s*)/i, /^(?:[\}])/i, /^(?:[^\}]*)/i, /^(?:section\s[^#:\n;]+)/i, /^(?::\s[^#:\n;]+)/i, /^(?:[^#:\n;]+)/i, /^(?:$)/i, /^(?:.)/i], + conditions: { "open_directive": { "rules": [1], "inclusive": false }, "type_directive": { "rules": [2, 3], "inclusive": false }, "arg_directive": { "rules": [3, 4], "inclusive": false }, "acc_descr_multiline": { "rules": [17, 18], "inclusive": false }, "acc_descr": { "rules": [15], "inclusive": false }, "acc_title": { "rules": [13], "inclusive": false }, "INITIAL": { "rules": [0, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 19, 20, 21, 22, 23], "inclusive": true } } + }; + return lexer2; + }(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +}(); +parser.parser = parser; +const parser$1 = parser; +let currentSection = ""; +let currentTaskId = 0; +const sections = []; +const tasks = []; +const rawTasks = []; +const getCommonDb = () => _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.j; +const parseDirective = (statement, context, type) => { + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.k)(globalThis, statement, context, type); +}; +const clear = function() { + sections.length = 0; + tasks.length = 0; + currentSection = ""; + rawTasks.length = 0; + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.m)(); +}; +const addSection = function(txt) { + currentSection = txt; + sections.push(txt); +}; +const getSections = function() { + return sections; +}; +const getTasks = function() { + let allItemsProcessed = compileTasks(); + const maxDepth = 100; + let iterationCount = 0; + while (!allItemsProcessed && iterationCount < maxDepth) { + allItemsProcessed = compileTasks(); + iterationCount++; + } + tasks.push(...rawTasks); + return tasks; +}; +const addTask = function(period, length, event) { + const rawTask = { + id: currentTaskId++, + section: currentSection, + type: currentSection, + task: period, + score: length ? length : 0, + //if event is defined, then add it the events array + events: event ? [event] : [] + }; + rawTasks.push(rawTask); +}; +const addEvent = function(event) { + const currentTask = rawTasks.find((task) => task.id === currentTaskId - 1); + currentTask.events.push(event); +}; +const addTaskOrg = function(descr) { + const newTask = { + section: currentSection, + type: currentSection, + description: descr, + task: descr, + classes: [] + }; + tasks.push(newTask); +}; +const compileTasks = function() { + const compileTask = function(pos) { + return rawTasks[pos].processed; + }; + let allProcessed = true; + for (const [i, rawTask] of rawTasks.entries()) { + compileTask(i); + allProcessed = allProcessed && rawTask.processed; + } + return allProcessed; +}; +const timelineDb = { + clear, + getCommonDb, + addSection, + getSections, + getTasks, + addTask, + addTaskOrg, + addEvent, + parseDirective +}; +const db = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + addEvent, + addSection, + addTask, + addTaskOrg, + clear, + default: timelineDb, + getCommonDb, + getSections, + getTasks, + parseDirective +}, Symbol.toStringTag, { value: "Module" })); +const MAX_SECTIONS = 12; +const drawRect = function(elem, rectData) { + const rectElem = elem.append("rect"); + rectElem.attr("x", rectData.x); + rectElem.attr("y", rectData.y); + rectElem.attr("fill", rectData.fill); + rectElem.attr("stroke", rectData.stroke); + rectElem.attr("width", rectData.width); + rectElem.attr("height", rectData.height); + rectElem.attr("rx", rectData.rx); + rectElem.attr("ry", rectData.ry); + if (rectData.class !== void 0) { + rectElem.attr("class", rectData.class); + } + return rectElem; +}; +const drawFace = function(element, faceData) { + const radius = 15; + const circleElement = element.append("circle").attr("cx", faceData.cx).attr("cy", faceData.cy).attr("class", "face").attr("r", radius).attr("stroke-width", 2).attr("overflow", "visible"); + const face = element.append("g"); + face.append("circle").attr("cx", faceData.cx - radius / 3).attr("cy", faceData.cy - radius / 3).attr("r", 1.5).attr("stroke-width", 2).attr("fill", "#666").attr("stroke", "#666"); + face.append("circle").attr("cx", faceData.cx + radius / 3).attr("cy", faceData.cy - radius / 3).attr("r", 1.5).attr("stroke-width", 2).attr("fill", "#666").attr("stroke", "#666"); + function smile(face2) { + const arc$1 = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .arc */ .Nb1)().startAngle(Math.PI / 2).endAngle(3 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); + face2.append("path").attr("class", "mouth").attr("d", arc$1).attr("transform", "translate(" + faceData.cx + "," + (faceData.cy + 2) + ")"); + } + function sad(face2) { + const arc$1 = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .arc */ .Nb1)().startAngle(3 * Math.PI / 2).endAngle(5 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); + face2.append("path").attr("class", "mouth").attr("d", arc$1).attr("transform", "translate(" + faceData.cx + "," + (faceData.cy + 7) + ")"); + } + function ambivalent(face2) { + face2.append("line").attr("class", "mouth").attr("stroke", 2).attr("x1", faceData.cx - 5).attr("y1", faceData.cy + 7).attr("x2", faceData.cx + 5).attr("y2", faceData.cy + 7).attr("class", "mouth").attr("stroke-width", "1px").attr("stroke", "#666"); + } + if (faceData.score > 3) { + smile(face); + } else if (faceData.score < 3) { + sad(face); + } else { + ambivalent(face); + } + return circleElement; +}; +const drawCircle = function(element, circleData) { + const circleElement = element.append("circle"); + circleElement.attr("cx", circleData.cx); + circleElement.attr("cy", circleData.cy); + circleElement.attr("class", "actor-" + circleData.pos); + circleElement.attr("fill", circleData.fill); + circleElement.attr("stroke", circleData.stroke); + circleElement.attr("r", circleData.r); + if (circleElement.class !== void 0) { + circleElement.attr("class", circleElement.class); + } + if (circleData.title !== void 0) { + circleElement.append("title").text(circleData.title); + } + return circleElement; +}; +const drawText = function(elem, textData) { + const nText = textData.text.replace(//gi, " "); + const textElem = elem.append("text"); + textElem.attr("x", textData.x); + textElem.attr("y", textData.y); + textElem.attr("class", "legend"); + textElem.style("text-anchor", textData.anchor); + if (textData.class !== void 0) { + textElem.attr("class", textData.class); + } + const span = textElem.append("tspan"); + span.attr("x", textData.x + textData.textMargin * 2); + span.text(nText); + return textElem; +}; +const drawLabel = function(elem, txtObject) { + function genPoints(x, y, width, height, cut) { + return x + "," + y + " " + (x + width) + "," + y + " " + (x + width) + "," + (y + height - cut) + " " + (x + width - cut * 1.2) + "," + (y + height) + " " + x + "," + (y + height); + } + const polygon = elem.append("polygon"); + polygon.attr("points", genPoints(txtObject.x, txtObject.y, 50, 20, 7)); + polygon.attr("class", "labelBox"); + txtObject.y = txtObject.y + txtObject.labelMargin; + txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin; + drawText(elem, txtObject); +}; +const drawSection = function(elem, section, conf2) { + const g = elem.append("g"); + const rect = getNoteRect(); + rect.x = section.x; + rect.y = section.y; + rect.fill = section.fill; + rect.width = conf2.width; + rect.height = conf2.height; + rect.class = "journey-section section-type-" + section.num; + rect.rx = 3; + rect.ry = 3; + drawRect(g, rect); + _drawTextCandidateFunc(conf2)( + section.text, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: "journey-section section-type-" + section.num }, + conf2, + section.colour + ); +}; +let taskCount = -1; +const drawTask = function(elem, task, conf2) { + const center = task.x + conf2.width / 2; + const g = elem.append("g"); + taskCount++; + const maxHeight = 300 + 5 * 30; + g.append("line").attr("id", "task" + taskCount).attr("x1", center).attr("y1", task.y).attr("x2", center).attr("y2", maxHeight).attr("class", "task-line").attr("stroke-width", "1px").attr("stroke-dasharray", "4 2").attr("stroke", "#666"); + drawFace(g, { + cx: center, + cy: 300 + (5 - task.score) * 30, + score: task.score + }); + const rect = getNoteRect(); + rect.x = task.x; + rect.y = task.y; + rect.fill = task.fill; + rect.width = conf2.width; + rect.height = conf2.height; + rect.class = "task task-type-" + task.num; + rect.rx = 3; + rect.ry = 3; + drawRect(g, rect); + task.x + 14; + _drawTextCandidateFunc(conf2)( + task.task, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: "task" }, + conf2, + task.colour + ); +}; +const drawBackgroundRect = function(elem, bounds) { + const rectElem = drawRect(elem, { + x: bounds.startx, + y: bounds.starty, + width: bounds.stopx - bounds.startx, + height: bounds.stopy - bounds.starty, + fill: bounds.fill, + class: "rect" + }); + rectElem.lower(); +}; +const getTextObj = function() { + return { + x: 0, + y: 0, + fill: void 0, + "text-anchor": "start", + width: 100, + height: 100, + textMargin: 0, + rx: 0, + ry: 0 + }; +}; +const getNoteRect = function() { + return { + x: 0, + y: 0, + width: 100, + anchor: "start", + height: 100, + rx: 0, + ry: 0 + }; +}; +const _drawTextCandidateFunc = function() { + function byText(content, g, x, y, width, height, textAttrs, colour) { + const text = g.append("text").attr("x", x + width / 2).attr("y", y + height / 2 + 5).style("font-color", colour).style("text-anchor", "middle").text(content); + _setTextAttrs(text, textAttrs); + } + function byTspan(content, g, x, y, width, height, textAttrs, conf2, colour) { + const { taskFontSize, taskFontFamily } = conf2; + const lines = content.split(//gi); + for (let i = 0; i < lines.length; i++) { + const dy = i * taskFontSize - taskFontSize * (lines.length - 1) / 2; + const text = g.append("text").attr("x", x + width / 2).attr("y", y).attr("fill", colour).style("text-anchor", "middle").style("font-size", taskFontSize).style("font-family", taskFontFamily); + text.append("tspan").attr("x", x + width / 2).attr("dy", dy).text(lines[i]); + text.attr("y", y + height / 2).attr("dominant-baseline", "central").attr("alignment-baseline", "central"); + _setTextAttrs(text, textAttrs); + } + } + function byFo(content, g, x, y, width, height, textAttrs, conf2) { + const body = g.append("switch"); + const f = body.append("foreignObject").attr("x", x).attr("y", y).attr("width", width).attr("height", height).attr("position", "fixed"); + const text = f.append("xhtml:div").style("display", "table").style("height", "100%").style("width", "100%"); + text.append("div").attr("class", "label").style("display", "table-cell").style("text-align", "center").style("vertical-align", "middle").text(content); + byTspan(content, body, x, y, width, height, textAttrs, conf2); + _setTextAttrs(text, textAttrs); + } + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (key in fromTextAttrsDict) { + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + return function(conf2) { + return conf2.textPlacement === "fo" ? byFo : conf2.textPlacement === "old" ? byText : byTspan; + }; +}(); +const initGraphics = function(graphics) { + graphics.append("defs").append("marker").attr("id", "arrowhead").attr("refX", 5).attr("refY", 2).attr("markerWidth", 6).attr("markerHeight", 4).attr("orient", "auto").append("path").attr("d", "M 0,0 V 4 L6,2 Z"); +}; +function wrap(text, width) { + text.each(function() { + var text2 = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(this), words = text2.text().split(/(\s+|
)/).reverse(), word, line = [], lineHeight = 1.1, y = text2.attr("y"), dy = parseFloat(text2.attr("dy")), tspan = text2.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em"); + for (let j = 0; j < words.length; j++) { + word = words[words.length - 1 - j]; + line.push(word); + tspan.text(line.join(" ").trim()); + if (tspan.node().getComputedTextLength() > width || word === "
") { + line.pop(); + tspan.text(line.join(" ").trim()); + if (word === "
") { + line = [""]; + } else { + line = [word]; + } + tspan = text2.append("tspan").attr("x", 0).attr("y", y).attr("dy", lineHeight + "em").text(word); + } + } + }); +} +const drawNode = function(elem, node, fullSection, conf2) { + const section = fullSection % MAX_SECTIONS - 1; + const nodeElem = elem.append("g"); + node.section = section; + nodeElem.attr( + "class", + (node.class ? node.class + " " : "") + "timeline-node " + ("section-" + section) + ); + const bkgElem = nodeElem.append("g"); + const textElem = nodeElem.append("g"); + const txt = textElem.append("text").text(node.descr).attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle").call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf2.fontSize && conf2.fontSize.replace ? conf2.fontSize.replace("px", "") : conf2.fontSize; + node.height = bbox.height + fontSize * 1.1 * 0.5 + node.padding; + node.height = Math.max(node.height, node.maxHeight); + node.width = node.width + 2 * node.padding; + textElem.attr("transform", "translate(" + node.width / 2 + ", " + node.padding / 2 + ")"); + defaultBkg(bkgElem, node, section); + return node; +}; +const getVirtualNodeHeight = function(elem, node, conf2) { + const textElem = elem.append("g"); + const txt = textElem.append("text").text(node.descr).attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle").call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf2.fontSize && conf2.fontSize.replace ? conf2.fontSize.replace("px", "") : conf2.fontSize; + textElem.remove(); + return bbox.height + fontSize * 1.1 * 0.5 + node.padding; +}; +const defaultBkg = function(elem, node, section) { + const rd = 5; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + node.type).attr( + "d", + `M0 ${node.height - rd} v${-node.height + 2 * rd} q0,-5 5,-5 h${node.width - 2 * rd} q5,0 5,5 v${node.height - rd} H0 Z` + ); + elem.append("line").attr("class", "node-line-" + section).attr("x1", 0).attr("y1", node.height).attr("x2", node.width).attr("y2", node.height); +}; +const svgDraw = { + drawRect, + drawCircle, + drawSection, + drawText, + drawLabel, + drawTask, + drawBackgroundRect, + getTextObj, + getNoteRect, + initGraphics, + drawNode, + getVirtualNodeHeight +}; +const setConf = function(cnf) { + const keys = Object.keys(cnf); + keys.forEach(function(key) { + conf[key] = cnf[key]; + }); +}; +const draw = function(text, id, version, diagObj) { + const conf2 = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.g)(); + const LEFT_MARGIN = conf2.leftMargin ? conf2.leftMargin : 50; + diagObj.db.clear(); + diagObj.parser.parse(text + "\n"); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("timeline", diagObj.db); + const securityLevel = conf2.securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("#i" + id); + } + const root = securityLevel === "sandbox" ? (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(sandboxElement.nodes()[0].contentDocument.body) : (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body"); + const svg = root.select("#" + id); + svg.append("g"); + const tasks2 = diagObj.db.getTasks(); + const title = diagObj.db.getCommonDb().getDiagramTitle(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("task", tasks2); + svgDraw.initGraphics(svg); + const sections2 = diagObj.db.getSections(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("sections", sections2); + let maxSectionHeight = 0; + let maxTaskHeight = 0; + let depthY = 0; + let sectionBeginY = 0; + let masterX = 50 + LEFT_MARGIN; + let masterY = 50; + sectionBeginY = 50; + let sectionNumber = 0; + let hasSections = true; + sections2.forEach(function(section) { + const sectionNode = { + number: sectionNumber, + descr: section, + section: sectionNumber, + width: 150, + padding: 20, + maxHeight: maxSectionHeight + }; + const sectionHeight = svgDraw.getVirtualNodeHeight(svg, sectionNode, conf2); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("sectionHeight before draw", sectionHeight); + maxSectionHeight = Math.max(maxSectionHeight, sectionHeight + 20); + }); + let maxEventCount = 0; + let maxEventLineLength = 0; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("tasks.length", tasks2.length); + for (const [i, task] of tasks2.entries()) { + const taskNode = { + number: i, + descr: task, + section: task.section, + width: 150, + padding: 20, + maxHeight: maxTaskHeight + }; + const taskHeight = svgDraw.getVirtualNodeHeight(svg, taskNode, conf2); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("taskHeight before draw", taskHeight); + maxTaskHeight = Math.max(maxTaskHeight, taskHeight + 20); + maxEventCount = Math.max(maxEventCount, task.events.length); + let maxEventLineLengthTemp = 0; + for (let j = 0; j < task.events.length; j++) { + const event = task.events[j]; + const eventNode = { + descr: event, + section: task.section, + number: task.section, + width: 150, + padding: 20, + maxHeight: 50 + }; + maxEventLineLengthTemp += svgDraw.getVirtualNodeHeight(svg, eventNode, conf2); + } + maxEventLineLength = Math.max(maxEventLineLength, maxEventLineLengthTemp); + } + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("maxSectionHeight before draw", maxSectionHeight); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("maxTaskHeight before draw", maxTaskHeight); + if (sections2 && sections2.length > 0) { + sections2.forEach((section) => { + const sectionNode = { + number: sectionNumber, + descr: section, + section: sectionNumber, + width: 150, + padding: 20, + maxHeight: maxSectionHeight + }; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("sectionNode", sectionNode); + const sectionNodeWrapper = svg.append("g"); + const node = svgDraw.drawNode(sectionNodeWrapper, sectionNode, sectionNumber, conf2); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("sectionNode output", node); + sectionNodeWrapper.attr("transform", `translate(${masterX}, ${sectionBeginY})`); + masterY += maxSectionHeight + 50; + const tasksForSection = tasks2.filter((task) => task.section === section); + if (tasksForSection.length > 0) { + drawTasks( + svg, + tasksForSection, + sectionNumber, + masterX, + masterY, + maxTaskHeight, + conf2, + maxEventCount, + maxEventLineLength, + maxSectionHeight, + false + ); + } + masterX += 200 * Math.max(tasksForSection.length, 1); + masterY = sectionBeginY; + sectionNumber++; + }); + } else { + hasSections = false; + drawTasks( + svg, + tasks2, + sectionNumber, + masterX, + masterY, + maxTaskHeight, + conf2, + maxEventCount, + maxEventLineLength, + maxSectionHeight, + true + ); + } + const box = svg.node().getBBox(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("bounds", box); + if (title) { + svg.append("text").text(title).attr("x", box.width / 2 - LEFT_MARGIN).attr("font-size", "4ex").attr("font-weight", "bold").attr("y", 20); + } + depthY = hasSections ? maxSectionHeight + maxTaskHeight + 150 : maxTaskHeight + 100; + const lineWrapper = svg.append("g").attr("class", "lineWrapper"); + lineWrapper.append("line").attr("x1", LEFT_MARGIN).attr("y1", depthY).attr("x2", box.width + 3 * LEFT_MARGIN).attr("y2", depthY).attr("stroke-width", 4).attr("stroke", "black").attr("marker-end", "url(#arrowhead)"); + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.s)( + void 0, + svg, + conf2.timeline.padding ? conf2.timeline.padding : 50, + conf2.timeline.useMaxWidth ? conf2.timeline.useMaxWidth : false + ); +}; +const drawTasks = function(diagram2, tasks2, sectionColor, masterX, masterY, maxTaskHeight, conf2, maxEventCount, maxEventLineLength, maxSectionHeight, isWithoutSections) { + for (const task of tasks2) { + const taskNode = { + descr: task.task, + section: sectionColor, + number: sectionColor, + width: 150, + padding: 20, + maxHeight: maxTaskHeight + }; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("taskNode", taskNode); + const taskWrapper = diagram2.append("g").attr("class", "taskWrapper"); + const node = svgDraw.drawNode(taskWrapper, taskNode, sectionColor, conf2); + const taskHeight = node.height; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("taskHeight after draw", taskHeight); + taskWrapper.attr("transform", `translate(${masterX}, ${masterY})`); + maxTaskHeight = Math.max(maxTaskHeight, taskHeight); + if (task.events) { + const lineWrapper = diagram2.append("g").attr("class", "lineWrapper"); + let linelength = maxTaskHeight; + masterY += 100; + linelength = linelength + drawEvents(diagram2, task.events, sectionColor, masterX, masterY, conf2); + masterY -= 100; + lineWrapper.append("line").attr("x1", masterX + 190 / 2).attr("y1", masterY + maxTaskHeight).attr("x2", masterX + 190 / 2).attr( + "y2", + masterY + maxTaskHeight + (isWithoutSections ? maxTaskHeight : maxSectionHeight) + maxEventLineLength + 120 + ).attr("stroke-width", 2).attr("stroke", "black").attr("marker-end", "url(#arrowhead)").attr("stroke-dasharray", "5,5"); + } + masterX = masterX + 200; + if (isWithoutSections && !(0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.g)().timeline.disableMulticolor) { + sectionColor++; + } + } + masterY = masterY - 10; +}; +const drawEvents = function(diagram2, events, sectionColor, masterX, masterY, conf2) { + let maxEventHeight = 0; + const eventBeginY = masterY; + masterY = masterY + 100; + for (const event of events) { + const eventNode = { + descr: event, + section: sectionColor, + number: sectionColor, + width: 150, + padding: 20, + maxHeight: 50 + }; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_11__.l.debug("eventNode", eventNode); + const eventWrapper = diagram2.append("g").attr("class", "eventWrapper"); + const node = svgDraw.drawNode(eventWrapper, eventNode, sectionColor, conf2); + const eventHeight = node.height; + maxEventHeight = maxEventHeight + eventHeight; + eventWrapper.attr("transform", `translate(${masterX}, ${masterY})`); + masterY = masterY + 10 + eventHeight; + } + masterY = eventBeginY; + return maxEventHeight; +}; +const renderer = { + setConf, + draw +}; +const genSections = (options) => { + let sections2 = ""; + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + options["lineColor" + i] = options["lineColor" + i] || options["cScaleInv" + i]; + if ((0,khroma__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .Z)(options["lineColor" + i])) { + options["lineColor" + i] = (0,khroma__WEBPACK_IMPORTED_MODULE_13__/* ["default"] */ .Z)(options["lineColor" + i], 20); + } else { + options["lineColor" + i] = (0,khroma__WEBPACK_IMPORTED_MODULE_14__/* ["default"] */ .Z)(options["lineColor" + i], 20); + } + } + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + const sw = "" + (17 - 3 * i); + sections2 += ` + .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${i - 1} path { + fill: ${options["cScale" + i]}; + } + .section-${i - 1} text { + fill: ${options["cScaleLabel" + i]}; + } + .node-icon-${i - 1} { + font-size: 40px; + color: ${options["cScaleLabel" + i]}; + } + .section-edge-${i - 1}{ + stroke: ${options["cScale" + i]}; + } + .edge-depth-${i - 1}{ + stroke-width: ${sw}; + } + .section-${i - 1} line { + stroke: ${options["cScaleInv" + i]} ; + stroke-width: 3; + } + + .lineWrapper line{ + stroke: ${options["cScaleLabel" + i]} ; + } + + .disabled, .disabled circle, .disabled text { + fill: lightgray; + } + .disabled text { + fill: #efefef; + } + `; + } + return sections2; +}; +const getStyles = (options) => ` + .edge { + stroke-width: 3; + } + ${genSections(options)} + .section-root rect, .section-root path, .section-root circle { + fill: ${options.git0}; + } + .section-root text { + fill: ${options.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`; +const styles = getStyles; +const diagram = { + db, + renderer, + parser: parser$1, + styles +}; + +//# sourceMappingURL=timeline-definition-8e5a9bc6.js.map + + +/***/ }), + +/***/ 91619: +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + Z: () => (/* binding */ is_dark) +}); + +// EXTERNAL MODULE: ./node_modules/khroma/dist/utils/index.js + 3 modules +var utils = __webpack_require__(61691); +// EXTERNAL MODULE: ./node_modules/khroma/dist/color/index.js + 4 modules +var dist_color = __webpack_require__(71610); +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/luminance.js +/* IMPORT */ + + +/* MAIN */ +//SOURCE: https://planetcalc.com/7779 +const luminance = (color) => { + const { r, g, b } = dist_color/* default */.Z.parse(color); + const luminance = .2126 * utils/* default */.Z.channel.toLinear(r) + .7152 * utils/* default */.Z.channel.toLinear(g) + .0722 * utils/* default */.Z.channel.toLinear(b); + return utils/* default */.Z.lang.round(luminance); +}; +/* EXPORT */ +/* harmony default export */ const methods_luminance = (luminance); + +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/is_light.js +/* IMPORT */ + +/* MAIN */ +const isLight = (color) => { + return methods_luminance(color) >= .5; +}; +/* EXPORT */ +/* harmony default export */ const is_light = (isLight); + +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/is_dark.js +/* IMPORT */ + +/* MAIN */ +const isDark = (color) => { + return !is_light(color); +}; +/* EXPORT */ +/* harmony default export */ const is_dark = (isDark); + + +/***/ }) + +}; +; \ No newline at end of file diff --git a/assets/js/337bc122.a2fd825d.js b/assets/js/337bc122.a2fd825d.js new file mode 100644 index 0000000..16ed7a1 --- /dev/null +++ b/assets/js/337bc122.a2fd825d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1731],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(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 i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),l=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=l(r),d=o,b=s["".concat(p,".").concat(d)]||s[d]||f[d]||a;return r?n.createElement(b,i(i({ref:t},u),{},{components:r})):n.createElement(b,i({ref:t},u))}));function b(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[s]="string"==typeof e?e:o,i[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>f,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={id:"pb071-intro",title:"Introduction",slug:"/"},i=void 0,c={unversionedId:"pb071-intro",id:"pb071-intro",title:"Introduction",description:"",source:"@site/pb071/00-intro-pb071.md",sourceDirName:".",slug:"/",permalink:"/pb071/",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/00-intro-pb071.md",tags:[],version:"current",lastUpdatedAt:1694108971,formattedLastUpdatedAt:"Sep 7, 2023",sidebarPosition:0,frontMatter:{id:"pb071-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Bonuses",permalink:"/pb071/category/bonuses"}},p={},l=[],u={toc:l},s="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3593220c.04c28473.js b/assets/js/3593220c.04c28473.js new file mode 100644 index 0000000..21853bc --- /dev/null +++ b/assets/js/3593220c.04c28473.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8167],{2947:i=>{i.exports=JSON.parse('{"label":"greedy","permalink":"/ib002/tags/greedy","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"recursion/pyramid-slide-down","title":"Introduction to dynamic programming","description":"Solving a problem in different ways.\\n","permalink":"/ib002/recursion/pyramid-slide-down"}]}')}}]); \ No newline at end of file diff --git a/assets/js/3720c009.996e811f.js b/assets/js/3720c009.996e811f.js new file mode 100644 index 0000000..1c981ed --- /dev/null +++ b/assets/js/3720c009.996e811f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3751],{727:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(7294),n=a(6010),r=a(5155),c=a(833),s=a(5281),m=a(7452),g=a(6090),o=a(197);function u(e){let{tags:t}=e;const a=(0,r.M)();return l.createElement(c.FG,{className:(0,n.Z)(s.k.wrapper.docsPages,s.k.page.docsTagsListPage)},l.createElement(c.d,{title:a}),l.createElement(o.Z,{tag:"doc_tags_list"}),l.createElement(m.Z,null,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement("main",{className:"col col--8 col--offset-2"},l.createElement("h1",null,a),l.createElement(g.Z,{tags:t}))))))}},3008:(e,t,a)=>{a.d(t,{Z:()=>s});var l=a(7294),n=a(6010),r=a(9960);const c={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function s(e){let{permalink:t,label:a,count:s}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(c.tag,s?c.tagWithCount:c.tagRegular)},a,s&&l.createElement("span",null,s))}},6090:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(7294),n=a(5155),r=a(3008);const c={tag:"tag_Nnez"};function s(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:c.tag},l.createElement(r.Z,e))))),l.createElement("hr",null))}function m(e){let{tags:t}=e;const a=(0,n.P)(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(s,{key:e.letter,letterEntry:e}))))}},5155:(e,t,a)=>{a.d(t,{M:()=>n,P:()=>r});var l=a(5999);const n=()=>(0,l.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/377f3aa1.4c98e03e.js b/assets/js/377f3aa1.4c98e03e.js new file mode 100644 index 0000000..0dc3a78 --- /dev/null +++ b/assets/js/377f3aa1.4c98e03e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1011],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>c});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(n),h=i,c=d["".concat(s,".").concat(h)]||d[h]||m[h]||o;return n?a.createElement(c,r(r({ref:t},u),{},{components:n})):a.createElement(c,r({ref:t},u))}));function c(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:i,r[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var a=n(7462),i=(n(7294),n(3905));const o={title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15",slug:"aoc-2022/2nd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},r=void 0,l={permalink:"/blog/aoc-2022/2nd-week",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md",source:"@site/blog/aoc-2022/02-week-2.md",title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15:00.000Z",formattedDate:"December 25, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:20.875,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15",slug:"aoc-2022/2nd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"},nextItem:{title:"1st week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/1st-week"}},s={authorsImageUrls:[void 0]},p=[{value:"Day 8: Treetop Tree House",id:"day-8-treetop-tree-house",level:2},{value:"Swapping indices",id:"swapping-indices",level:4},{value:"Indexing Vec",id:"indexing-vec",level:4},{value:"Issues",id:"issues",level:5},{value:"Checking bounds",id:"checking-bounds",level:4},{value:"Solution",id:"solution",level:3},{value:"Day 9: Rope Bridge",id:"day-9-rope-bridge",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 10: Cathode-Ray Tube",id:"day-10-cathode-ray-tube",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Day 11: Monkey in the Middle",id:"day-11-monkey-in-the-middle",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 12: Hill Climbing Algorithm",id:"day-12-hill-climbing-algorithm",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 13: Distress Signal",id:"day-13-distress-signal",level:2},{value:"Solution",id:"solution-5",level:3},{value:"Day 14: Regolith Reservoir",id:"day-14-regolith-reservoir",level:2},{value:"Solution",id:"solution-6",level:3},{value:"Post Mortem",id:"post-mortem",level:2},{value:"Indexing",id:"indexing",level:3},{value:"Cause of the problem",id:"cause-of-the-problem",level:4}],u={toc:p},d="wrapper";function m(e){let{components:t,...n}=e;return(0,i.kt)(d,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Let's go through the second week of ",(0,i.kt)("a",{parentName:"p",href:"https://adventofcode.com"},(0,i.kt)("em",{parentName:"a"},"Advent of Code"))," in Rust."),(0,i.kt)("h2",{id:"day-8-treetop-tree-house"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/8"},"Day 8: Treetop Tree House")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"We get a forest and we want to know how many trees are visible from the outside.\nApart from that we want to find the best view.")),(0,i.kt)("p",null,"Nothing interesting. We are moving around 2D map though. And indexing can get a\nbit painful when doing so, let's refactor it a bit ;) During the preparation for\nthe AoC, I have written ",(0,i.kt)("inlineCode",{parentName:"p"},"Vector2D")," and now it's time to extend it with indexing\nof ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," of ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),"s. In my solution I was manipulating with indices in the following\nway:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"swapping them"),(0,i.kt)("li",{parentName:"ul"},"checking whether they are correct indices for the ",(0,i.kt)("inlineCode",{parentName:"li"},"Vec>")),(0,i.kt)("li",{parentName:"ul"},"indexing ",(0,i.kt)("inlineCode",{parentName:"li"},"Vec>")," with them")),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"I'm getting familiar with Rust and starting to \u201cabuse\u201d it\u2026 While doing so, I'm\nalso uncovering some \u201cfeatures\u201d that I don't really like. Therefore I will mark\nall of my rants with ",(0,i.kt)("em",{parentName:"p"},"thicc")," ",(0,i.kt)("strong",{parentName:"p"},"\xab\u21af\xbb")," mark and will try to \u201clock\u201d them into their\nown \u201cbox of hell\u201d.")),(0,i.kt)("h4",{id:"swapping-indices"},"Swapping indices"),(0,i.kt)("p",null,"Relatively simple implementation, just take the values, swap them and return new\nvector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl Vector2D {\n pub fn swap(&self) -> Self {\n Self {\n x: self.y,\n y: self.x,\n }\n }\n}\n")),(0,i.kt)("p",null,"Pretty straight-forward implementation, but let's talk about the ",(0,i.kt)("inlineCode",{parentName:"p"},"T: Copy"),". We\nneed to use it, since we are returning a ",(0,i.kt)("strong",{parentName:"p"},"new")," vector, with swapped ",(0,i.kt)("strong",{parentName:"p"},"values"),".\nIf we had values that cannot be copied, the only thing we could do, would be a\nvector of references (and it would also introduce a lifetime, to which we'll get\nlater on). This is pretty similar with the operations on sets from the first week."),(0,i.kt)("h4",{id:"indexing-vec"},"Indexing ",(0,i.kt)("inlineCode",{parentName:"h4"},"Vec")),(0,i.kt)("p",null,"I will start with the indexing, cause bound-checking is a bit more\u2026 complicated\nthan I would like to."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn index<'a, T, U>(v: &'a [Vec], idx: &Vector2D) -> &'a U\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &v[y][x]\n}\n")),(0,i.kt)("p",null,"Let's talk about this mess\u2026 Body of the function is probably the most easy part\nand should not be hard to understand, we just take the ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"y")," and convert\nthem both to ",(0,i.kt)("inlineCode",{parentName:"p"},"usize")," type that can be used later on for indexing."),(0,i.kt)("p",null,"The type signature of the function is where the fun is at \ud83d\ude09 We are trying\nto convert unknown type to ",(0,i.kt)("inlineCode",{parentName:"p"},"usize"),", so we must bound the ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," as a type that can\nbe converted to ",(0,i.kt)("inlineCode",{parentName:"p"},"usize"),", that's how we got ",(0,i.kt)("inlineCode",{parentName:"p"},"usize: TryFrom")," which basically\nsays that ",(0,i.kt)("inlineCode",{parentName:"p"},"usize")," must implement ",(0,i.kt)("inlineCode",{parentName:"p"},"TryFrom")," trait and therefore allows us to\nconvert the indices to actual ",(0,i.kt)("inlineCode",{parentName:"p"},"usize")," indices. Using ",(0,i.kt)("inlineCode",{parentName:"p"},".unwrap()")," also forces us\nto bound the error that can occur when converting ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," into ",(0,i.kt)("inlineCode",{parentName:"p"},"usize"),", that's how\nwe get ",(0,i.kt)("inlineCode",{parentName:"p"},">::Error: Debug")," which loosely means"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"error during conversion of ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," into ",(0,i.kt)("inlineCode",{parentName:"p"},"usize")," must implement ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug"),",\ni.e. can be printed in some way or other")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"T: Copy")," is required by ",(0,i.kt)("inlineCode",{parentName:"p"},".try_into()")," which takes ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," by-value."),(0,i.kt)("p",null,"And now we are left only with the first line of the definition."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Skilled Rustaceans might notice that this implementation is rather flaky and can\nbreak in multiple places at once. I'll get back to it\u2026")),(0,i.kt)("p",null,"Let's split it in multiple parts:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"v: &'a [Vec]")," represents the 2D ",(0,i.kt)("inlineCode",{parentName:"li"},"Vec"),", we are indexing, ",(0,i.kt)("inlineCode",{parentName:"li"},"Vec")," implements\n",(0,i.kt)("inlineCode",{parentName:"li"},"Slice")," trait and ",(0,i.kt)("em",{parentName:"li"},"clippy")," recommends using ",(0,i.kt)("inlineCode",{parentName:"li"},"&[T]")," to ",(0,i.kt)("inlineCode",{parentName:"li"},"&Vec"),", exact details\nare unknown to me"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"idx: &Vector2D")," represents the ",(0,i.kt)("em",{parentName:"li"},"indices")," which we use, we take them by\nreference to avoid an unnecessary copy"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"-> &'a U")," means that we are returning a ",(0,i.kt)("em",{parentName:"li"},"reference")," to some value of type ",(0,i.kt)("inlineCode",{parentName:"li"},"U"),".\nNow the question is what does the ",(0,i.kt)("inlineCode",{parentName:"li"},"'a")," mean, we can also see it as a generic\ntype declared along ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," and ",(0,i.kt)("inlineCode",{parentName:"li"},"U"),". And the answer is ",(0,i.kt)("em",{parentName:"li"},"relatively")," simple, ",(0,i.kt)("inlineCode",{parentName:"li"},"'a"),"\nrepresents a ",(0,i.kt)("em",{parentName:"li"},"lifetime"),". We take the ",(0,i.kt)("inlineCode",{parentName:"li"},"v")," by a reference and return a reference,\nborrow checker validates all of the ",(0,i.kt)("em",{parentName:"li"},"borrows")," (or references), so we need to\nspecify that our returned value has ",(0,i.kt)("em",{parentName:"li"},"the same lifetime")," as the vector we have\ntaken by a reference, i.e. returned reference must live at least as long as the\n",(0,i.kt)("inlineCode",{parentName:"li"},"v"),". This way we can \u201cbe sure\u201d that the returned reference is valid.")),(0,i.kt)("h5",{id:"issues"},"Issues"),(0,i.kt)("p",null,"First issue that our implementation has is the fact that we cannot get a mutable\nreference out of that function. This could be easily resolved by introducing new\nfunction, e.g. ",(0,i.kt)("inlineCode",{parentName:"p"},"index_mut"),". Which I have actually done while writing this part:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn index_mut<'a, T, U>(v: &'a mut [Vec], idx: &Vector2D) -> &'a mut U\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &mut v[y][x]\n}\n")),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("mdxAdmonitionTitle",{parentName:"admonition"},(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"\xab\u21af\xbb")," Why can't we use one function?"),(0,i.kt)("p",{parentName:"admonition"},"When we consider a ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),", we don't need to consider containers as ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),", Rust\nimplements indexing as traits ",(0,i.kt)("inlineCode",{parentName:"p"},"Index")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"IndexMut")," that do the dirty work\nbehind syntactic sugar of ",(0,i.kt)("inlineCode",{parentName:"p"},"container[idx]"),"."),(0,i.kt)("p",{parentName:"admonition"},"However, implementing of traits is not allowed for ",(0,i.kt)("em",{parentName:"p"},"external")," types, i.e. types\nthat you haven't defined yourself. This means that you can implement indexing\nover containers that you have implemented yourself, but you cannot use your own\ntypes for indexing \u201cbuilt-in\u201d types."),(0,i.kt)("p",{parentName:"admonition"},"Another part of this rabbit hole is trait ",(0,i.kt)("inlineCode",{parentName:"p"},"SliceIndex")," that is of a relevance\nbecause of"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl Index for [T]\nwhere\n I: SliceIndex<[T]>\n\nimpl Index for Vec\nwhere\n I: SliceIndex<[T]>,\n A: Allocator\n\nimpl Index for [T; N]\nwhere\n [T]: Index\n")),(0,i.kt)("p",{parentName:"admonition"},"In other words, if your type implements ",(0,i.kt)("inlineCode",{parentName:"p"},"SliceIndex")," trait, it can be used\nfor indexing. As of now, this trait has all of its required methods experimental\nand is marked as ",(0,i.kt)("inlineCode",{parentName:"p"},"unsafe"),".")),(0,i.kt)("p",null,"Another problem is a requirement for indexing either ",(0,i.kt)("inlineCode",{parentName:"p"},"[Vec]")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec>"),".\nThis requirement could be countered by removing inner type ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," and constraining\nit by a trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Index")," (or ",(0,i.kt)("inlineCode",{parentName:"p"},"IndexMut")," respectively) in a following way"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D) -> &'a C::Output\nwhere\n usize: TryFrom,\n >::Error: Debug,\n T: Copy,\n C: Index\n{\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\n &v[y][x]\n}\n")),(0,i.kt)("p",null,"Given this, we can also give a more meaningful typename for indexing type, such\nas ",(0,i.kt)("inlineCode",{parentName:"p"},"I"),"."),(0,i.kt)("h4",{id:"checking-bounds"},"Checking bounds"),(0,i.kt)("p",null,"Now we can get to the boundary checks, it is very similar, but a more\u2026 dirty.\nFirst approach that came up was to convert the indices in ",(0,i.kt)("inlineCode",{parentName:"p"},"Vector2D")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"usize"),",\nbut when you add the indices up, e.g. when checking the neighbors, you can end\nup with negative values which, unlike in C++, causes an error (instead of underflow\nthat you can use to your advantage; you can easily guess how)."),(0,i.kt)("p",null,"So how can we approach this then? Well\u2026 we will convert the bounds instead of\nthe indices and that lead us to:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\nwhere\n usize: TryInto,\n >::Error: Debug,\n T: PartialOrd + Copy,\n{\n idx.y >= 0.try_into().unwrap()\n && idx.y < v.len().try_into().unwrap()\n && idx.x >= 0.try_into().unwrap()\n && idx.x\n < v[TryInto::::try_into(idx.y).unwrap()]\n .len()\n .try_into()\n .unwrap()\n}\n")),(0,i.kt)("p",null,"You can tell that it's definitely a shitty code. Let's improve it now! We will\nget back to the original idea, but do it better. We know that we cannot convert\nnegative values into ",(0,i.kt)("inlineCode",{parentName:"p"},"usize"),", ",(0,i.kt)("strong",{parentName:"p"},"but")," we also know that conversion like that\nreturns a ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," which we can use to our advantage."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\nwhere\n T: Copy,\n usize: TryFrom,\n{\n usize::try_from(idx.y)\n .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))\n .unwrap_or(false)\n}\n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Result")," is a type similar to ",(0,i.kt)("inlineCode",{parentName:"p"},"Either")," in Haskell and it allows us to chain\nmultiple operations on correct results or propagate the original error without\ndoing anything. Let's dissect it one-by-one."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"try_from")," is a method implemented in ",(0,i.kt)("inlineCode",{parentName:"p"},"TryFrom")," trait, that allows you to convert\ntypes and either successfully convert them or fail (with a reasonable error). This\nmethod returns ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),"."),(0,i.kt)("p",null,"We call ",(0,i.kt)("inlineCode",{parentName:"p"},"and_then")," on that ",(0,i.kt)("em",{parentName:"p"},"result"),", let's have a look at the type signature of\n",(0,i.kt)("inlineCode",{parentName:"p"},"and_then"),", IMO it explains more than enough:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn and_then(self, op: F) -> Result\nwhere\n F: FnOnce(T) -> Result\n")),(0,i.kt)("p",null,"OK\u2026 So it takes the result and a function and returns another result with\ndifferent value and different error. However we can see that the function, which\nrepresents an operation on a result, takes just the value, i.e. it doesn't care\nabout any previous error. To make it short:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("inlineCode",{parentName:"p"},"and_then")," allows us to run an operation, which can fail, on the correct result")),(0,i.kt)("p",null,"We parsed a ",(0,i.kt)("inlineCode",{parentName:"p"},"y")," index and now we try to convert the ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," index with ",(0,i.kt)("inlineCode",{parentName:"p"},"try_from"),"\nagain, but on that result we use ",(0,i.kt)("inlineCode",{parentName:"p"},"map")," rather than ",(0,i.kt)("inlineCode",{parentName:"p"},"and_then"),", why would that be?"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn map(self, op: F) -> Result\nwhere\n F: FnOnce(T) -> U\n")),(0,i.kt)("p",null,"Huh\u2026 ",(0,i.kt)("inlineCode",{parentName:"p"},"map")," performs an operation that ",(0,i.kt)("strong",{parentName:"p"},"cannot")," fail. And finally we use\n",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or")," which takes the value from result, or in case of an error returns the\ndefault that we define."),(0,i.kt)("p",null,"How does this work then? If ",(0,i.kt)("inlineCode",{parentName:"p"},"y")," is negative, the conversion fails and the error\npropagates all the way to ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or"),", if ",(0,i.kt)("inlineCode",{parentName:"p"},"y")," can be a correct ",(0,i.kt)("inlineCode",{parentName:"p"},"usize")," value, then\nwe do the same with ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),". If ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," is negative, we propagate the error as with ",(0,i.kt)("inlineCode",{parentName:"p"},"y"),",\nand if it's not, then we check whether it exceeds the higher bounds or not."),(0,i.kt)("h3",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Relatively simple, you just need follow the rules and not get too smart, otherwise\nit will get back at you."),(0,i.kt)("h2",{id:"day-9-rope-bridge"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/9"},"Day 9: Rope Bridge")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"We get a rope with knots and we want to track how many different positions are\nvisited with the rope's tail.")),(0,i.kt)("p",null,"By this day, I have come to a conclusion that current skeleton for each day\ngenerates a lot of boilerplate. And even though it can be easily copied, it's\njust a waste of space and unnecessary code. Let's \u201csimplify\u201d this (on one end\nwhile creating monster on the other end). I've gone through what we need in the\npreparations for the AoC. Let's sum up our requirements:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"parsing"),(0,i.kt)("li",{parentName:"ul"},"part 1 & 2"),(0,i.kt)("li",{parentName:"ul"},"running on sample / input"),(0,i.kt)("li",{parentName:"ul"},"tests")),(0,i.kt)("p",null,"Parsing and implementation of both parts is code that changes each day and we\ncannot do anything about it. However running and testing can be simplified!"),(0,i.kt)("p",null,"Let's introduce and export a new module ",(0,i.kt)("inlineCode",{parentName:"p"},"solution")," that will take care of all of\nthis. We will start by introducing a trait for each day."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub trait Solution {\n fn parse_input>(pathname: P) -> Input;\n\n fn part_1(input: &Input) -> Output;\n fn part_2(input: &Input) -> Output;\n}\n")),(0,i.kt)("p",null,"This does a lot of work for us already, we have defined a trait and for each day\nwe will create a structure representing a specific day. That structure will also\nimplement the ",(0,i.kt)("inlineCode",{parentName:"p"},"Solution")," trait."),(0,i.kt)("p",null,"Now we need to get rid of the boilerplate, we can't get rid of the ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," function,\nbut we can at least move out the functionality."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn run(type_of_input: &str) -> Result<()>\nwhere\n Self: Sized,\n{\n tracing_subscriber::fmt()\n .with_env_filter(EnvFilter::from_default_env())\n .with_target(false)\n .with_file(true)\n .with_line_number(true)\n .without_time()\n .compact()\n .init();\n color_eyre::install()?;\n\n let input = Self::parse_input(format!("{}s/{}.txt", type_of_input, Self::day()));\n\n info!("Part 1: {}", Self::part_1(&input));\n info!("Part 2: {}", Self::part_2(&input));\n\n Ok(())\n}\n\nfn main() -> Result<()>\nwhere\n Self: Sized,\n{\n Self::run("input")\n}\n')),(0,i.kt)("p",null,"This is all part of the ",(0,i.kt)("inlineCode",{parentName:"p"},"Solution")," trait, which can implement methods while being\ndependent on what is provided by the implementing types. In this case, we just\nneed to bound the ",(0,i.kt)("inlineCode",{parentName:"p"},"Output")," type to implement ",(0,i.kt)("inlineCode",{parentName:"p"},"Display")," that is necessary for the\n",(0,i.kt)("inlineCode",{parentName:"p"},"info!")," and format string there."),(0,i.kt)("p",null,"Now we can get to first of the nasty things we are going to do\u2026 And it is the\n",(0,i.kt)("inlineCode",{parentName:"p"},"day()")," method that you can see being used when constructing path to the input\nfile. That method will generate a name of the file, e.g. ",(0,i.kt)("inlineCode",{parentName:"p"},"day01")," and we know that\nwe can ",(0,i.kt)("em",{parentName:"p"},"somehow")," deduce it from the structure name, given we name it reasonably."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn day() -> String {\n let mut day = String::from(type_name::().split("::").next().unwrap());\n day.make_ascii_lowercase();\n\n day.to_string()\n}\n')),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("mdxAdmonitionTitle",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"type_name")),(0,i.kt)("p",{parentName:"admonition"},"This feature is still experimental and considered to be internal, it is not\nadvised to use it any production code.")),(0,i.kt)("p",null,"And now we can get to the nastiest stuff \ud83d\ude29 We will ",(0,i.kt)("strong",{parentName:"p"},"generate")," the tests!"),(0,i.kt)("p",null,"We want to be able to generate tests for sample input in a following way:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"test_sample!(day_01, Day01, 42, 69);\n")),(0,i.kt)("p",null,"There's not much we can do, so we will write a macro to generate the tests for us."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[macro_export]\nmacro_rules! test_sample {\n ($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {\n #[cfg(test)]\n mod $mod_name {\n use super::*;\n\n #[test]\n fn test_part_1() {\n let sample =\n $day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));\n assert_eq!($day_struct::part_1(&sample), $part_1);\n }\n\n #[test]\n fn test_part_2() {\n let sample =\n $day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));\n assert_eq!($day_struct::part_2(&sample), $part_2);\n }\n }\n };\n}\n')),(0,i.kt)("p",null,"We have used it in a similar way as macros in C/C++, one of the things that we\ncan use to our advantage is defining \u201ctype\u201d of the parameters for the macro. All\nparameters have their name prefixed with ",(0,i.kt)("inlineCode",{parentName:"p"},"$")," sign and you can define various \u201cforms\u201d\nof your macro. Let's go through it!"),(0,i.kt)("p",null,"We have following parameters:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"$mod_name")," which represents the name for the module with tests, it is typed\nwith ",(0,i.kt)("inlineCode",{parentName:"li"},"ident")," which means that we want a valid identifier to be passed in."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"$day_struct")," represents the structure that will be used for tests, it is typed\nwith ",(0,i.kt)("inlineCode",{parentName:"li"},"tt")," which represents a ",(0,i.kt)("em",{parentName:"li"},"token tree"),", in our case it is a type."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"$part_X")," represents the expected output for the ",(0,i.kt)("inlineCode",{parentName:"li"},"X"),"th part and is of type ",(0,i.kt)("inlineCode",{parentName:"li"},"expr"),"\nwhich literally means an ",(0,i.kt)("em",{parentName:"li"},"expression"),".")),(0,i.kt)("p",null,"Apart from that we need to use ",(0,i.kt)("inlineCode",{parentName:"p"},"#[macro_export]")," to mark the macro as exported\nfor usage outside of the module. Now our skeleton looks like:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use aoc_2022::*;\n\ntype Input = String;\ntype Output = String;\n\nstruct DayXX;\nimpl Solution for DayXX {\n fn parse_input>(pathname: P) -> Input {\n file_to_string(pathname)\n }\n\n fn part_1(input: &Input) -> Output {\n todo!()\n }\n\n fn part_2(input: &Input) -> Output {\n todo!()\n }\n}\n\nfn main() -> Result<()> {\n // DayXX::run("sample")\n DayXX::main()\n}\n\n// test_sample!(day_XX, DayXX, , );\n')),(0,i.kt)("h3",{id:"solution-1"},"Solution"),(0,i.kt)("p",null,"Not much to talk about, it is relatively easy to simulate."),(0,i.kt)("h2",{id:"day-10-cathode-ray-tube"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/10"},"Day 10: Cathode-Ray Tube")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Emulating basic arithmetic operations on a CPU and drawing on CRT based on the\nCPU's accumulator.")),(0,i.kt)("p",null,"In this day I have discovered an issue with my design of the ",(0,i.kt)("inlineCode",{parentName:"p"},"Solution")," trait.\nAnd the issue is caused by different types of ",(0,i.kt)("inlineCode",{parentName:"p"},"Output")," for the part 1 and part 2."),(0,i.kt)("p",null,"Problem is relatively simple and consists of simulating a CPU, I have approached\nit in a following way:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {\n instructions\n .iter()\n .fold(State::new(), |state, instruction| {\n state.execute(instruction, &mut out)\n });\n\n out\n}\n")),(0,i.kt)("p",null,"We just take the instructions, we have some state of the CPU and we execute the\ninstructions one-by-one. Perfect usage of the ",(0,i.kt)("inlineCode",{parentName:"p"},"fold")," (or ",(0,i.kt)("inlineCode",{parentName:"p"},"reduce")," as you may know\nit from other languages)."),(0,i.kt)("p",null,"You can also see that we have an ",(0,i.kt)("inlineCode",{parentName:"p"},"Output")," type, so the question is how can we fix\nthat problem. And the answer is very simple and ",(0,i.kt)("em",{parentName:"p"},"functional"),". Rust allows you to\nhave an ",(0,i.kt)("inlineCode",{parentName:"p"},"enumeration")," that can ",(0,i.kt)("em",{parentName:"p"},"bear")," some other values apart from the type itself."),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"We could've seen something like this with the ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," type that can be\ndefined as"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Result {\n Ok(T),\n Err(E)\n}\n")),(0,i.kt)("h6",{parentName:"admonition",id:"what-does-that-mean-though"},"What does that mean though?"),(0,i.kt)("p",{parentName:"admonition"},"When we have an ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok")," value, it has the result itself, and when we get an ",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),"\nvalue, it has the error. This also allows us to handle ",(0,i.kt)("em",{parentName:"p"},"results")," in a rather\npretty way:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match do_something(x) {\n Ok(y) => {\n println!("SUCCESS: {}", y);\n },\n Err(y) => {\n eprintln!("ERROR: {}", y);\n }\n}\n'))),(0,i.kt)("p",null,"My solution has a following outline:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn execute(&self, i: &Instruction, output: &mut Output) -> State {\n // execute the instruction\n\n // collect results if necessary\n match output {\n Output::Part1(x) => self.execute_part_1(y, x),\n Output::Part2(x) => self.execute_part_2(y, x),\n }\n\n // return the obtained state\n new_state\n}\n")),(0,i.kt)("p",null,"You might think that it's a perfectly reasonable thing to do. Yes, ",(0,i.kt)("strong",{parentName:"p"},"but")," notice\nthat the ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," statement doesn't ",(0,i.kt)("em",{parentName:"p"},"collect")," the changes in any way and also we\npass ",(0,i.kt)("inlineCode",{parentName:"p"},"output")," by ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut"),", so it is shared across each ",(0,i.kt)("em",{parentName:"p"},"iteration")," of the ",(0,i.kt)("inlineCode",{parentName:"p"},"fold"),"."),(0,i.kt)("p",null,"The dirty and ingenious thing is that ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),"s are passed by ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," too and therefore\nthey are directly modified by the helper functions. To sum it up and let it sit"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"We are ",(0,i.kt)("strong",{parentName:"p"},"collecting")," the result ",(0,i.kt)("strong",{parentName:"p"},"into")," an ",(0,i.kt)("strong",{parentName:"p"},"enumeration")," that is ",(0,i.kt)("strong",{parentName:"p"},"shared"),"\nacross ",(0,i.kt)("strong",{parentName:"p"},"all")," iterations of ",(0,i.kt)("inlineCode",{parentName:"p"},"fold"),".")),(0,i.kt)("h3",{id:"solution-2"},"Solution"),(0,i.kt)("p",null,"Similar to ",(0,i.kt)("em",{parentName:"p"},"Day 9"),", but there are some technical details that can get you."),(0,i.kt)("h2",{id:"day-11-monkey-in-the-middle"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/11"},"Day 11: Monkey in the Middle")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Simulation of monkeys throwing stuff around and measuring your stress levels\nwhile your stuff is being passed around.")),(0,i.kt)("p",null,"I think I decided to use regular expressions here for the first time, cause\nparsing the input was a pain."),(0,i.kt)("p",null,"Also I didn't expect to implement Euclidean algorithm in Rust\u2026"),(0,i.kt)("h3",{id:"solution-3"},"Solution"),(0,i.kt)("p",null,"Again, we're just running a simulation. Though I must admit it was very easy to\nmake a small technical mistakes that could affect the final results very late."),(0,i.kt)("h2",{id:"day-12-hill-climbing-algorithm"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/12"},"Day 12: Hill Climbing Algorithm")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Finding shortest path up the hill and also shortest path down to the ground while\nalso rolling down the hill\u2026")),(0,i.kt)("p",null,"As I have said in the ",(0,i.kt)("em",{parentName:"p"},"tl;dr"),", we are looking for the shortest path, but the start\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\nto a BFS algorithm that takes necessary parameters via functions:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn bfs(\n graph: &[Vec], start: &Position, has_edge: F, is_target: G\n) -> Option\nwhere\n F: Fn(&[Vec], &Position, &Position) -> bool,\n G: Fn(&[Vec], &Position) -> bool\n")),(0,i.kt)("p",null,"We pass the initial vertex from the caller and everything else is left to the BFS\nalgorithm, based on the ",(0,i.kt)("inlineCode",{parentName:"p"},"has_edge")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"is_target")," functions."),(0,i.kt)("p",null,"This was easy! And that is not very usual in Rust once you want to pass around\nfunctions. \ud83d\udc40"),(0,i.kt)("h3",{id:"solution-4"},"Solution"),(0,i.kt)("p",null,"Looking for the shortest path\u2026 Must be Dijkstra, right? ",(0,i.kt)("strong",{parentName:"p"},"Nope!")," Half of the\nReddit got jebaited though. In all fairness, nothing stops you from implementing\nthe Dijkstra's algorithm for finding the shortest path, ",(0,i.kt)("strong",{parentName:"p"},"but")," if you know that\nall connected vertices are in a unit (actually ",(0,i.kt)("span",{parentName:"p",className:"math math-inline"},(0,i.kt)("span",{parentName:"span",className:"katex"},(0,i.kt)("span",{parentName:"span",className:"katex-mathml"},(0,i.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,i.kt)("semantics",{parentName:"math"},(0,i.kt)("mrow",{parentName:"semantics"},(0,i.kt)("mi",{parentName:"mrow"},"d"),(0,i.kt)("mo",{parentName:"mrow"},"="),(0,i.kt)("mn",{parentName:"mrow"},"1")),(0,i.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"d = 1")))),(0,i.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,i.kt)("span",{parentName:"span",className:"base"},(0,i.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6944em"}}),(0,i.kt)("span",{parentName:"span",className:"mord mathnormal"},"d"),(0,i.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,i.kt)("span",{parentName:"span",className:"mrel"},"="),(0,i.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,i.kt)("span",{parentName:"span",className:"base"},(0,i.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,i.kt)("span",{parentName:"span",className:"mord"},"1"))))),") distance from each other,\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\ntime complexity, because of the priority heap instead of the queue."),(0,i.kt)("h2",{id:"day-13-distress-signal"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/13"},"Day 13: Distress Signal")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Processing packets with structured data from the distress signal.")),(0,i.kt)("p",null,"You can implement a lot of traits if you want to. It is ",(0,i.kt)("em",{parentName:"p"},"imperative")," to implement\nordering on the packets. I had a typo, so I also proceeded to implement a ",(0,i.kt)("inlineCode",{parentName:"p"},"Display"),"\ntrait for debugging purposes:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'impl Display for Packet {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n match self {\n Packet::Integer(x) => write!(f, "{x}"),\n Packet::List(lst) => write!(f, "[{}]", lst.iter().map(|p| format!("{p}")).join(",")),\n }\n }\n}\n')),(0,i.kt)("h3",{id:"solution-5"},"Solution"),(0,i.kt)("p",null,"A lot of technical details\u2026 Parsing is nasty too\u2026"),(0,i.kt)("h2",{id:"day-14-regolith-reservoir"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/14"},"Day 14: Regolith Reservoir")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Let's simulate falling sand grain-by-grain.")),(0,i.kt)("p",null,"Again, both parts are relatively similar with minimal changes, so it is a good\nidea to refactor it a bit. Similar approach to the ",(0,i.kt)("a",{parentName:"p",href:"#day-12-hill-climbing-algorithm"},"BFS above"),". Also this is the\nfirst day where I ran into efficiency issues and had to redo my solution to speed\nit up just a bit."),(0,i.kt)("h3",{id:"solution-6"},"Solution"),(0,i.kt)("p",null,"Tedious."),(0,i.kt)("h2",{id:"post-mortem"},"Post Mortem"),(0,i.kt)("h3",{id:"indexing"},"Indexing"),(0,i.kt)("p",null,"I was asked about the indexing after publishing the blog. And truly it is rather\ncomplicated topic, especially after releasing ",(0,i.kt)("inlineCode",{parentName:"p"},"SliceIndex")," trait. I couldn't\nleave it be, so I tried to implement the ",(0,i.kt)("inlineCode",{parentName:"p"},"Index")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"IndexMut")," trait."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"I have also mentioned that the ",(0,i.kt)("inlineCode",{parentName:"p"},"SliceIndex")," trait is ",(0,i.kt)("inlineCode",{parentName:"p"},"unsafe"),", but truth be told,\nonly ",(0,i.kt)("em",{parentName:"p"},"unsafe")," part are the 2 methods that are named ",(0,i.kt)("inlineCode",{parentName:"p"},"*unchecked*"),". Anyways, I will\nbe implementing the ",(0,i.kt)("inlineCode",{parentName:"p"},"Index*")," traits for now, rather than the ",(0,i.kt)("inlineCode",{parentName:"p"},"SliceIndex"),".")),(0,i.kt)("p",null,"It's relatively straightforward\u2026"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl Index> for [C]\nwhere\n I: Copy + TryInto,\n >::Error: Debug,\n C: Index,\n{\n type Output = C::Output;\n\n fn index(&self, index: Vector2D) -> &Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &self[y][x]\n }\n}\n\nimpl IndexMut> for [C]\nwhere\n I: Copy + TryInto,\n >::Error: Debug,\n C: IndexMut,\n{\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &mut self[y][x]\n }\n}\n")),(0,i.kt)("p",null,"We can see a lot of similarities to the implementation of ",(0,i.kt)("inlineCode",{parentName:"p"},"index")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"index_mut"),"\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\nsyntax sugar for ",(0,i.kt)("inlineCode",{parentName:"p"},"container[idx]"),"."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"I have also switched from using the ",(0,i.kt)("inlineCode",{parentName:"p"},"TryFrom")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"TryInto")," trait, since it better\nmatches what we are using, the ",(0,i.kt)("inlineCode",{parentName:"p"},".try_into")," rather than ",(0,i.kt)("inlineCode",{parentName:"p"},"usize::try_from"),"."),(0,i.kt)("p",{parentName:"admonition"},"Also implementing ",(0,i.kt)("inlineCode",{parentName:"p"},"TryFrom")," automatically provides you with a ",(0,i.kt)("inlineCode",{parentName:"p"},"TryInto")," trait,\nsince it is relatively easy to implement. Just compare the following:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub trait TryFrom: Sized {\n type Error;\n\n fn try_from(value: T) -> Result;\n}\n\npub trait TryInto: Sized {\n type Error;\n\n fn try_into(self) -> Result;\n}\n"))),(0,i.kt)("p",null,"OK, so we have our trait implemented, we should be able to use ",(0,i.kt)("inlineCode",{parentName:"p"},"container[index]"),",\nright? Yes\u2026 but actually no \ud83d\ude26"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"error[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:26:18\n |\n26 | if trees[pos] > tallest {\n | ^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:30:28\n |\n30 | max(tallest, trees[pos])\n | ^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\n --\x3e src/bin/day08.rs:52:28\n |\n52 | let max_height = trees[position];\n | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`\n |\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\n")),(0,i.kt)("p",null,"Why? We have it implemented for the slices (",(0,i.kt)("inlineCode",{parentName:"p"},"[C]"),"), why doesn't it work? Well,\nthe fun part consists of the fact that in other place, where we were using it,\nwe were passing the ",(0,i.kt)("inlineCode",{parentName:"p"},"&[Vec]"),", but this is coming from a helper functions that\ntake ",(0,i.kt)("inlineCode",{parentName:"p"},"&Vec>")," instead. And\u2026 we don't implement ",(0,i.kt)("inlineCode",{parentName:"p"},"Index")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"IndexMut")," for\nthose. Just for the slices. \ud83e\udd2f ",(0,i.kt)("em",{parentName:"p"},"What are we going to do about it?")),(0,i.kt)("p",null,"We can either start copy-pasting or be smarter about it\u2026 I choose to be smarter,\nso let's implement a macro! The only difference across the implementations are\nthe types of the outer containers. Implementation doesn't differ ",(0,i.kt)("strong",{parentName:"p"},"at all"),"!"),(0,i.kt)("p",null,"Implementing the macro can be done in a following way:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"macro_rules! generate_indices {\n ($container:ty) => {\n impl Index> for $container\n where\n I: Copy + TryInto,\n >::Error: Debug,\n C: Index,\n {\n type Output = C::Output;\n\n fn index(&self, index: Vector2D) -> &Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &self[y][x]\n }\n }\n\n impl IndexMut> for $container\n where\n I: Copy + TryInto,\n >::Error: Debug,\n C: IndexMut,\n {\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\n let (x, y): (usize, usize) =\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\n &mut self[y][x]\n }\n }\n };\n}\n")),(0,i.kt)("p",null,"And now we can simply do"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"generate_indices!(VecDeque);\ngenerate_indices!([C]);\ngenerate_indices!(Vec);\n// generate_indices!([C; N], const N: usize);\n")),(0,i.kt)("p",null,"The last type (I took the inspiration from the implementations of the ",(0,i.kt)("inlineCode",{parentName:"p"},"Index")," and\n",(0,i.kt)("inlineCode",{parentName:"p"},"IndexMut")," traits) is a bit problematic, because of the ",(0,i.kt)("inlineCode",{parentName:"p"},"const N: usize")," part,\nwhich I haven't managed to be able to parse. And that's how I got rid of the error."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If I were to use 2D-indexing over ",(0,i.kt)("inlineCode",{parentName:"p"},"[C; N]")," slices, I'd probably just go with the\ncopy-paste, cause the cost of this \u201cmonstrosity\u201d outweighs the benefits of no DRY.")),(0,i.kt)("h4",{id:"cause-of-the-problem"},"Cause of the problem"),(0,i.kt)("p",null,"This issue is relatively funny. If you don't use any type aliases, just the raw\ntypes, you'll get suggested certain changes by the ",(0,i.kt)("em",{parentName:"p"},"clippy"),". For example if you\nconsider the following piece of code"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn get_sum(nums: &Vec) -> i32 {\n nums.iter().sum()\n}\n\nfn main() {\n let nums = vec![1, 2, 3];\n println!("Sum: {}", get_sum(&nums));\n}\n')),(0,i.kt)("p",null,"and you run ",(0,i.kt)("em",{parentName:"p"},"clippy")," on it, you will get"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},'Checking playground v0.0.1 (/playground)\nwarning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do\n --\x3e src/main.rs:1:18\n |\n1 | fn get_sum(nums: &Vec) -> i32 {\n | ^^^^^^^^^ help: change this to: `&[i32]`\n |\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg\n = note: `#[warn(clippy::ptr_arg)]` on by default\n\nwarning: `playground` (bin "playground") generated 1 warning\n Finished dev [unoptimized + debuginfo] target(s) in 0.61s\n')),(0,i.kt)("p",null,"However, if you introduce a type alias, such as"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"type Numbers = Vec;\n")),(0,i.kt)("p",null,"Then ",(0,i.kt)("em",{parentName:"p"},"clippy")," won't say anything, cause there is literally nothing to suggest.\nHowever the outcome is not the same\u2026"))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/37cf4872.0b06d100.js b/assets/js/37cf4872.0b06d100.js new file mode 100644 index 0000000..c98a0f7 --- /dev/null +++ b/assets/js/37cf4872.0b06d100.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7979],{821:i=>{i.exports=JSON.parse('{"label":"postconditions","permalink":"/ib002/tags/postconditions","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"algorithms-correctness/postcondition-ambiguity","title":"Vague postconditions and proving correctness of algorithms","description":"Debugging and testing with precise postconditions.\\n","permalink":"/ib002/algorithms-correctness/postcondition-ambiguity"}]}')}}]); \ No newline at end of file diff --git a/assets/js/3aef4518.ae37468c.js b/assets/js/3aef4518.ae37468c.js new file mode 100644 index 0000000..0e69deb --- /dev/null +++ b/assets/js/3aef4518.ae37468c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1505],{1921:t=>{t.exports=JSON.parse('{"label":"iterative","permalink":"/ib002/tags/iterative","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"graphs/iterative-and-iterators","title":"Iterative algorithms via iterators","description":"Iterative DFS using iterators.\\n","permalink":"/ib002/graphs/iterative-and-iterators"}]}')}}]); \ No newline at end of file diff --git a/assets/js/3da4b779.a33bbff3.js b/assets/js/3da4b779.a33bbff3.js new file mode 100644 index 0000000..526c2be --- /dev/null +++ b/assets/js/3da4b779.a33bbff3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2177],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>c});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=p(n),h=i,c=m["".concat(l,".").concat(h)]||m[h]||d[h]||o;return n?a.createElement(c,r(r({ref:t},u),{},{components:n})):a.createElement(c,r({ref:t},u))}));function c(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:i,r[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(7462),i=(n(7294),n(3905));const o={title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14",slug:"aoc-2022/4th-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},r=void 0,s={permalink:"/blog/aoc-2022/4th-week",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md",source:"@site/blog/aoc-2022/04-week-4.md",title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:15.175,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14",slug:"aoc-2022/4th-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"How can Copr help with broken dependencies",permalink:"/blog/2023/08/02/copr"},nextItem:{title:"3rd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/3rd-week"}},l={authorsImageUrls:[void 0]},p=[{value:"Day 22: Monkey Map",id:"day-22-monkey-map",level:2},{value:"Solution",id:"solution",level:3},{value:"Column iterator",id:"column-iterator",level:4},{value:"Walking around the map",id:"walking-around-the-map",level:4},{value:"Problems",id:"problems",level:4},{value:"Clippy",id:"clippy",level:4},{value:"Day 23: Unstable Diffusion",id:"day-23-unstable-diffusion",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 24: Blizzard Basin",id:"day-24-blizzard-basin",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Breakdown",id:"breakdown",level:4},{value:"Evaluating the blizzards",id:"evaluating-the-blizzards",level:4},{value:"Shortest-path algorithm",id:"shortest-path-algorithm",level:4},{value:"Min-heap",id:"min-heap",level:4},{value:"Day 25: Full of Hot Air",id:"day-25-full-of-hot-air",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Converting from &str",id:"converting-from-str",level:4},{value:"Converting to String",id:"converting-to-string",level:4},{value:"Adjusting the code",id:"adjusting-the-code",level:4},{value:"Summary",id:"summary",level:2},{value:"Advent of Code",id:"advent-of-code",level:3},{value:"with Rust",id:"with-rust",level:3}],u={toc:p},m="wrapper";function d(e){let{components:t,...o}=e;return(0,i.kt)(m,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Let's go through the fourth week of ",(0,i.kt)("a",{parentName:"p",href:"https://adventofcode.com"},(0,i.kt)("em",{parentName:"a"},"Advent of Code"))," in Rust."),(0,i.kt)("h2",{id:"day-22-monkey-map"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/22"},"Day 22: Monkey Map")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Simulating a movement on a 2D map with given instructions. Map becomes a cube in\nthe 2nd part\u2026")),(0,i.kt)("admonition",{title:"Rant",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"This was the most obnoxious problem of this year\u2026 and a lot of Rust issues have\nbeen hit.")),(0,i.kt)("h3",{id:"solution"},"Solution"),(0,i.kt)("p",null,"It seems like a very simple problem to solve, but with very obnoxious changes in\nthe 2nd part and also it's relatively hard to decompose \xbbproperly\xab."),(0,i.kt)("h4",{id:"column-iterator"},"Column iterator"),(0,i.kt)("p",null,"In the first part of the problem it was needed to know the boundaries of each\nrow and column, since I stored them in ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec>")," and padded with spaces\nto ensure I have a rectangular 2D \u201carray\u201d. However when you wanted to go through\neach row and column to determine the boundaries, it was very easy to do for the\nrows (cause each row is a ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," element), but not for the columns, since they\nspan multiple rows."),(0,i.kt)("p",null,"For this use case I have implemented my own ",(0,i.kt)("em",{parentName:"p"},"column iterator"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub struct ColumnIterator<'a, T> {\n map: &'a [Vec],\n column: usize,\n\n i: usize,\n}\n\nimpl<'a, T> ColumnIterator<'a, T> {\n pub fn new(map: &'a [Vec], column: usize) -> ColumnIterator<'a, T> {\n Self { map, column, i: 0 }\n }\n}\n\nimpl<'a, T> Iterator for ColumnIterator<'a, T> {\n type Item = &'a T;\n\n fn next(&mut self) -> Option {\n if self.i >= self.map.len() {\n return None;\n }\n\n self.i += 1;\n Some(&self.map[self.i - 1][self.column])\n }\n}\n")),(0,i.kt)("p",null,"Given this piece of an iterator, it is very easy to factor out the common\nfunctionality between the rows and columns into:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut find_boundaries = |constructor: fn(usize) -> Orientation,\n iterator: &mut dyn Iterator,\n upper_bound,\n i| {\n let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');\n let start = first_non_empty.next().unwrap().0 as isize;\n\n let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');\n let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;\n\n boundaries.insert(constructor(i), start..end);\n};\n")),(0,i.kt)("p",null,"And then use it as such:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// construct all horizontal boundaries\n(0..map.len()).for_each(|row| {\n find_boundaries(\n Orientation::horizontal,\n &mut map[row].iter(),\n map[row].len(),\n row,\n );\n});\n\n// construct all vertical boundaries\n(0..map[0].len()).for_each(|col| {\n find_boundaries(\n Orientation::vertical,\n &mut ColumnIterator::new(&map, col),\n map.len(),\n col,\n );\n});\n")),(0,i.kt)("h4",{id:"walking-around-the-map"},"Walking around the map"),(0,i.kt)("p",null,"Once the 2nd part got introduced, you start to think about a way how not to\ncopy-paste a lot of stuff (I haven't avoided it anyways\u2026). In this problem, I've\nchosen to introduce a trait (i.e. ",(0,i.kt)("em",{parentName:"p"},"interface"),") for 2D and 3D walker."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"trait Wrap: Clone {\n type State;\n\n // simulation\n fn is_blocked(&self) -> bool;\n fn step(&mut self, steps: isize);\n fn turn_left(&mut self);\n fn turn_right(&mut self);\n\n // movement\n fn next(&self) -> (Self::State, Direction);\n\n // final answer\n fn answer(&self) -> Output;\n}\n")),(0,i.kt)("p",null,"Each walker maintains its own state and also provides the functions that are\nused during the simulation. The \u201cpromised\u201d methods are separated into:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("em",{parentName:"li"},"simulation"),"-related: that are used during the simulation from the ",(0,i.kt)("inlineCode",{parentName:"li"},".fold()")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("em",{parentName:"li"},"movement"),"-related: just a one method that holds most of the logic differences\nbetween 2D and 3D"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("em",{parentName:"li"},"final answer"),": which extracts the ",(0,i.kt)("em",{parentName:"li"},"proof of solution")," from the\nimplementation-specific walker")),(0,i.kt)("p",null,"Both 2D and 3D versions borrow the original input and therefore you must\nannotate the lifetime of it:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct Wrap2D<'a> {\n input: &'a Input,\n position: Position,\n direction: Direction,\n}\nimpl<'a> Wrap2D<'a> {\n fn new(input: &'a Input) -> Wrap2D<'a> {\n// \u2026\n")),(0,i.kt)("h4",{id:"problems"},"Problems"),(0,i.kt)("p",null,"I have used a lot of closures for this problem and once I introduced a parameter\nthat was of unknown type (apart from the fact it implements a specific trait), I\ngot suggested a \u201cfix\u201d for the compilation error that resulted in something that\nwas not possible to parse, cause it, more than likely, violated the grammar."),(0,i.kt)("p",null,"In a similar fashion, I have been suggested changes that led to a code that\ndidn't make sense by just looking at it (there was no need to try the changes),\nfor example one suggested change in the closure parameter caused disapperance of\nthe parameter name. \ud83d\ude04"),(0,i.kt)("h4",{id:"clippy"},"Clippy"),(0,i.kt)("p",null,"I have to admit that Clippy was rather helpful here, I'll include two examples\nof rather smart suggestions."),(0,i.kt)("p",null,"When writing the parsing for this problem, the first thing I have spotted on the\n",(0,i.kt)("inlineCode",{parentName:"p"},"char")," was the ",(0,i.kt)("inlineCode",{parentName:"p"},".is_digit()")," function that takes a radix as a parameter. Clippy\nnoticed that I use ",(0,i.kt)("inlineCode",{parentName:"p"},"radix = 10")," and suggested switching to ",(0,i.kt)("inlineCode",{parentName:"p"},".is_ascii_digit()"),"\nthat does exactly the same thing:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-diff"},"- .take_while(|c| c.is_digit(10))\n+ .take_while(|c| c.is_ascii_digit())\n")),(0,i.kt)("p",null,"Another useful suggestion appeared when working with the iterators and I wanted\nto get the ",(0,i.kt)("span",{parentName:"p",className:"math math-inline"},(0,i.kt)("span",{parentName:"span",className:"katex"},(0,i.kt)("span",{parentName:"span",className:"katex-mathml"},(0,i.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,i.kt)("semantics",{parentName:"math"},(0,i.kt)("mrow",{parentName:"semantics"},(0,i.kt)("mi",{parentName:"mrow"},"n")),(0,i.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"n")))),(0,i.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,i.kt)("span",{parentName:"span",className:"base"},(0,i.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,i.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"))))),"-th element from it. You know the ",(0,i.kt)("inlineCode",{parentName:"p"},".skip()"),", you know the\n",(0,i.kt)("inlineCode",{parentName:"p"},".next()"),", just \u201cslap\u201d them together and we're done for \ud83d\ude01 Well, I got\nsuggested to use ",(0,i.kt)("inlineCode",{parentName:"p"},".nth()")," that does exactly the combination of the two mentioned\nmethods on iterators:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-diff"},"- match it.clone().skip(skip).next().unwrap() {\n+ match it.clone().nth(skip).unwrap() {\n")),(0,i.kt)("h2",{id:"day-23-unstable-diffusion"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/23"},"Day 23: Unstable Diffusion")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Simulating movement of elves around with a set of specific rules.")),(0,i.kt)("h3",{id:"solution-1"},"Solution"),(0,i.kt)("p",null,"There's not much to mention since it's just a cellular automaton simulation\n(even though the AoC rules for cellular automatons usually get out of hand\n\ud83d\ude09)."),(0,i.kt)("p",null,"Although I had a need to determine boundaries of the elves' positions and ended\nup with a nasty DRY violation. Knowing that you you're looking for maximum and\nminimum that are, of course, exactly the same except for initial values and\ncomparators, it looks like a rather simple fix, but typing in Rust is something\nelse, right? In the end I settled for a function that computes both boundaries\nwithout any duplication while using a closure:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn get_bounds(positions: &Input) -> (Vector2D, Vector2D) {\n let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {\n positions\n .iter()\n .fold(Vector2D::new(init, init), |acc, elf| {\n Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))\n })\n };\n\n (f(isize::MAX, &min::), f(isize::MIN, &max::))\n}\n")),(0,i.kt)("p",null,"This function returns a pair of 2D vectors that represent opposite points of the\nbounding rectangle of all elves."),(0,i.kt)("p",null,"You might ask why would we need a closure and the answer is that ",(0,i.kt)("inlineCode",{parentName:"p"},"positions"),"\ncannot be captured from within the nested function, only via closure. One more\nfun fact on top of that is the type of the comparator"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"&dyn Fn(isize, isize) -> isize\n")),(0,i.kt)("p",null,"Once we remove the ",(0,i.kt)("inlineCode",{parentName:"p"},"dyn")," keyword, compiler yells at us and also includes a way\nhow to get a more thorough explanation of the error by running"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ rustc --explain E0782\n")),(0,i.kt)("p",null,"which shows us"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Trait objects must include the `dyn` keyword.\n\nErroneous code example:\n\n```\ntrait Foo {}\nfn test(arg: Box) {} // error!\n```\n\nTrait objects are a way to call methods on types that are not known until\nruntime but conform to some trait.\n\nTrait objects should be formed with `Box`, but in the code above\n`dyn` is left off.\n\nThis makes it harder to see that `arg` is a trait object and not a\nsimply a heap allocated type called `Foo`.\n\nTo fix this issue, add `dyn` before the trait name.\n\n```\ntrait Foo {}\nfn test(arg: Box) {} // ok!\n```\n\nThis used to be allowed before edition 2021, but is now an error.\n")),(0,i.kt)("admonition",{title:"Rant",type:"danger"},(0,i.kt)("p",{parentName:"admonition"},"Not all of the explanations are helpful though, in some cases they might be even\nmore confusing than helpful, since they address ",(0,i.kt)("em",{parentName:"p"},"very simple")," use cases."),(0,i.kt)("p",{parentName:"admonition"},"As you can see, even in this case there are two sides to the explanations:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},"it explains why you need to use ",(0,i.kt)("inlineCode",{parentName:"li"},"dyn"),", but"),(0,i.kt)("li",{parentName:"ul"},"it still mentions that trait objects need to be heap-allocated via ",(0,i.kt)("inlineCode",{parentName:"li"},"Box"),"\nthat, as you can see in my snippet, ",(0,i.kt)("strong",{parentName:"li"},"does not")," apply here \ud83d\ude04 IMO it's\ncaused by the fact that we are borrowing it and therefore we don't need to\ncare about the size or whereabouts of it."))),(0,i.kt)("admonition",{title:"C++ parallel",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you dive into the explanation above, you can notice that the ",(0,i.kt)("inlineCode",{parentName:"p"},"Box"),"\npattern is very helpful for using types that are not known during compile-time.\nYou would use a very similar approach in C++ when parsing some data structure\nfrom input (let's say JSON for example)."),(0,i.kt)("p",{parentName:"admonition"},"On the other hand, in this case, it doesn't really make much sense, cause you\ncan clearly see that the types ",(0,i.kt)("strong",{parentName:"p"},"are known")," during the compile-time, which in\nC++ could be easily resolved by templating the helper function.")),(0,i.kt)("h2",{id:"day-24-blizzard-basin"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/24"},"Day 24: Blizzard Basin")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Navigating your way through a basin with series of blizzards that move around\nyou as you move.")),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"It's second to last day and I went \u201c",(0,i.kt)("em",{parentName:"p"},"bonkers"),"\u201d on the Rust \ud83d\ude04 Proceed to\nread ",(0,i.kt)("em",{parentName:"p"},"Solution")," part on your own risk.")),(0,i.kt)("h3",{id:"solution-2"},"Solution"),(0,i.kt)("p",null,"You are given a map with blizzards all over the place and you're supposed to\nfind the minimum time it requires you to walk through the basin without getting\nin any of the blizzards."),(0,i.kt)("h4",{id:"breakdown"},"Breakdown"),(0,i.kt)("p",null,"Relatively simple, yet a bit annoying, approach can be taken. It's technically\na shortest-path algorithm implementation with some relaxation restrictions and\nbeing able to stay on one position for some time, so each ",(0,i.kt)("em",{parentName:"p"},"vertex")," of the graph\nis determined by the position on the map and the ",(0,i.kt)("em",{parentName:"p"},"timestamp"),". I have chosen to\nuse ",(0,i.kt)("inlineCode",{parentName:"p"},"Vector3D"),", since ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"y")," attributes can be used for the position\nand, well, let's use ",(0,i.kt)("inlineCode",{parentName:"p"},"z")," for a timestamp, cause why not, right? \ud83d\ude09"),(0,i.kt)("h4",{id:"evaluating-the-blizzards"},"Evaluating the blizzards"),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"I think that this is the most perverted abuse of the traits in the whole 4 weeks\nof AoC in Rust\u2026")),(0,i.kt)("p",null,"The blizzards move along their respective directions in time and loop around in\ntheir respective row/column. Each vertex holds position ",(0,i.kt)("strong",{parentName:"p"},"and")," time, so we can\n",(0,i.kt)("em",{parentName:"p"},"just")," index the basin with the vertex itself, right? Yes, we can \ud83d\ude08"),(0,i.kt)("admonition",{title:"Fun fact",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"While writing this part, I've recognized unnecessary verbosity in the code and\ncleaned it up a bit. The changed version is shown here and the original was just\nmore verbose.")),(0,i.kt)("p",null,"I'll skip the boring parts of checking bounds and entry/exit of the basin \ud83d\ude09\nWe can easily calculate positions of the blizzards using a modular arithmetics:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl Index for Basin {\n type Output = char;\n\n fn index(&self, index: Position) -> &Self::Output {\n // \u2039skipped boring parts\u203a\n\n // We need to account for the loops of the blizzards\n let width = self.cols - 2;\n let height = self.rows - 2;\n\n let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;\n [\n (\n index.y() as usize,\n blizzard_origin(width, -1, index.z(), index.x()),\n '>',\n ),\n (\n index.y() as usize,\n blizzard_origin(width, 1, index.z(), index.x()),\n '<',\n ),\n (\n blizzard_origin(height, -1, index.z(), index.y()),\n index.x() as usize,\n 'v',\n ),\n (\n blizzard_origin(height, 1, index.z(), index.y()),\n index.x() as usize,\n '^',\n ),\n ]\n .iter()\n .find_map(|&(y, x, direction)| {\n if self.map[y][x] == direction {\n Some(&self.map[y][x])\n } else {\n None\n }\n })\n .unwrap_or(&'.')\n }\n}\n")),(0,i.kt)("p",null,"As you can see, there is an expression for calculating the original position and\nit's used multiple times, so why not take it out to a lambda, right? \ud83d\ude09"),(0,i.kt)("p",null,"I couldn't get the ",(0,i.kt)("inlineCode",{parentName:"p"},"rustfmt")," to format the ",(0,i.kt)("inlineCode",{parentName:"p"},"for"),"-loop nicely, so I've just\ndecided to go with iterating over an elements of a slice. I have used, once\nagain, a combination of two functions (",(0,i.kt)("inlineCode",{parentName:"p"},"find_map")," in this case) to do 2 things\nat once and at the end, if we haven't found any blizzard, we just return the\nempty space."),(0,i.kt)("p",null,"I think it's a very ",(0,i.kt)("em",{parentName:"p"},"nice")," (and naughty) way how to use the ",(0,i.kt)("inlineCode",{parentName:"p"},"Index")," trait, don't\nyou think?"),(0,i.kt)("h4",{id:"shortest-path-algorithm"},"Shortest-path algorithm"),(0,i.kt)("p",null,"For the shortest path you can choose and adjust any of the common shortest-path\nalgorithms, in my case, I have decided to use ",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/A*_search_algorithm"},(0,i.kt)("em",{parentName:"a"},"A","*"))," instead of Dijkstra's\nalgorithm, since it better reflects the ",(0,i.kt)("em",{parentName:"p"},"cost")," function."),(0,i.kt)("admonition",{title:"Comparison of costs",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"With the Dijkstra's algorithm I would proceed with the ",(0,i.kt)("inlineCode",{parentName:"p"},"time")," attribute used as\na priority for the queue."),(0,i.kt)("p",{parentName:"admonition"},"Whereas with the ",(0,i.kt)("em",{parentName:"p"},"A","*"),", I have chosen to use both time and Manhattan distance\nthat promotes vertices closer to the exit ",(0,i.kt)("strong",{parentName:"p"},"and")," with a minimum time taken.")),(0,i.kt)("p",null,"Cost function is, of course, a closure \ud83d\ude09"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());\n")),(0,i.kt)("p",null,"And also for checking the possible moves from the current vertex, I have\nimplemented, yet another, closure that yields an iterator with the next moves:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let next_positions = |p| {\n [(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]\n .iter()\n .filter_map(move |&(x, y, t)| {\n let next_p = p + Vector3D::new(x, y, t);\n\n if basin[next_p] == '.' {\n Some(next_p)\n } else {\n None\n }\n })\n};\n")),(0,i.kt)("h4",{id:"min-heap"},"Min-heap"),(0,i.kt)("p",null,"In this case I had a need to use the priority queue taking the elements with the\nlowest cost as the prioritized ones. Rust only offers you the ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html"},(0,i.kt)("inlineCode",{parentName:"a"},"BinaryHeap"))," and\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\nelements in wrapped in a ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/cmp/struct.Reverse.html"},(0,i.kt)("inlineCode",{parentName:"a"},"Reverse"))," (as is even showed in the linked ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap"},"docs of\nthe ",(0,i.kt)("inlineCode",{parentName:"a"},"BinaryHeap")),"). However the wrapping affects the type of the heap and also\npopping the most prioritized elements yields values wrapped in the ",(0,i.kt)("inlineCode",{parentName:"p"},"Reverse"),"."),(0,i.kt)("p",null,"For this purpose I have just taken the max-heap and wrapped it as a whole in a\nseparate structure providing just the desired methods:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::cmp::{Ord, Reverse};\nuse std::collections::BinaryHeap;\n\npub struct MinHeap {\n heap: BinaryHeap>,\n}\n\nimpl MinHeap {\n pub fn new() -> MinHeap {\n MinHeap {\n heap: BinaryHeap::new(),\n }\n }\n\n pub fn push(&mut self, item: T) {\n self.heap.push(Reverse(item))\n }\n\n pub fn pop(&mut self) -> Option {\n self.heap.pop().map(|Reverse(x)| x)\n }\n}\n\nimpl Default for MinHeap {\n fn default() -> Self {\n Self::new()\n }\n}\n")),(0,i.kt)("p",null,"Rest is just the algorithm implementation which is not that interesting."),(0,i.kt)("h2",{id:"day-25-full-of-hot-air"},(0,i.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/25"},"Day 25: Full of Hot Air")),(0,i.kt)("admonition",{title:"tl;dr",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Playing around with a numbers in a ",(0,i.kt)("em",{parentName:"p"},"special")," base.")),(0,i.kt)("p",null,"Getting flashbacks to the ",(0,i.kt)("em",{parentName:"p"},"IB111 Foundations of Programming"),"\u2026 Very nice \u201cproblem\u201d\nwith a rather easy solution, as the last day always seems to be."),(0,i.kt)("h3",{id:"solution-3"},"Solution"),(0,i.kt)("p",null,"Implementing 2 functions, converting from the ",(0,i.kt)("em",{parentName:"p"},"SNAFU base")," and back to the ",(0,i.kt)("em",{parentName:"p"},"SNAFU"),"\n",(0,i.kt)("em",{parentName:"p"},"base")," representation. Let's do a bit more though! I have implemented two functions:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"from_snafu")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"to_snafu"))),(0,i.kt)("p",null,"Now it is apparent that all I do is number to string and string to number. Hmm\u2026\nthat sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers\nand implement the traits that we need."),(0,i.kt)("p",null,"Let's start with a structure:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]\nstruct SNAFU {\n value: i64,\n}\n")),(0,i.kt)("h4",{id:"converting-from-str"},"Converting from ",(0,i.kt)("inlineCode",{parentName:"h4"},"&str")),(0,i.kt)("p",null,"We will start by implementing the ",(0,i.kt)("inlineCode",{parentName:"p"},"FromStr")," trait that will help us parse our input.\nThis is rather simple, I can just take the ",(0,i.kt)("inlineCode",{parentName:"p"},"from_snafu")," function, copy-paste it\ninto the ",(0,i.kt)("inlineCode",{parentName:"p"},"from_str")," method and the number I get will be wrapped in ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," and\n",(0,i.kt)("inlineCode",{parentName:"p"},"SNAFU")," structure."),(0,i.kt)("h4",{id:"converting-to-string"},"Converting to ",(0,i.kt)("inlineCode",{parentName:"h4"},"String")),(0,i.kt)("p",null,"This is more fun. In some cases you need to implement only one trait and others\nare automatically implemented using that one trait. In our case, if you look in\nthe documentation, you can see that ",(0,i.kt)("inlineCode",{parentName:"p"},"ToString")," trait is automatically implemented\nfor any type that implements ",(0,i.kt)("inlineCode",{parentName:"p"},"Display")," trait."),(0,i.kt)("p",null,"Let's implement the ",(0,i.kt)("inlineCode",{parentName:"p"},"Display")," trait then. We should be able to use the ",(0,i.kt)("inlineCode",{parentName:"p"},"to_snafu"),"\nfunction and just take the ",(0,i.kt)("inlineCode",{parentName:"p"},"self.value")," from the ",(0,i.kt)("inlineCode",{parentName:"p"},"SNAFU")," structure."),(0,i.kt)("p",null,"And for the convenience of tests, we can also implement a rather simple ",(0,i.kt)("inlineCode",{parentName:"p"},"From"),"\ntrait for the ",(0,i.kt)("inlineCode",{parentName:"p"},"SNAFU"),"."),(0,i.kt)("h4",{id:"adjusting-the-code"},"Adjusting the code"),(0,i.kt)("p",null,"After those changes we need to adjust the code and tests."),(0,i.kt)("p",null,"Parsing of the input is very easy, before we have used the lines, now we parse\neverything:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-diff"}," fn parse_input>(pathname: P) -> Input {\n- file_to_lines(pathname)\n+ file_to_structs(pathname)\n }\n")),(0,i.kt)("p",null,"Part 1 needs to be adjusted a bit too:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-diff"}," fn part_1(input: &Input) -> Output {\n- to_snafu(input.iter().map(|s| from_snafu(s)).sum())\n+ SNAFU::from(input.iter().map(|s| s.value).sum::()).to_string()\n }\n")),(0,i.kt)("p",null,"You can also see that it simplifies the meaning a bit and it is more explicit than\nthe previous versions."),(0,i.kt)("p",null,"And for the tests:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-diff"}," #[test]\n fn test_from() {\n- for (n, s) in EXAMPLES.iter() {\n- assert_eq!(from_snafu(s), *n);\n+ for (&n, s) in EXAMPLES.iter() {\n+ assert_eq!(s.parse::().unwrap().value, n);\n }\n }\n \n #[test]\n fn test_to() {\n- for (n, s) in EXAMPLES.iter() {\n- assert_eq!(to_snafu(*n), s.to_string());\n+ for (&n, s) in EXAMPLES.iter() {\n+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());\n }\n")),(0,i.kt)("h2",{id:"summary"},"Summary"),(0,i.kt)("p",null,"Let's wrap the whole thing up! Keeping in mind both AoC and the Rust\u2026"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Finished advent calendar :smile:",src:n(3321).Z,width:"2417",height:"1984"})),(0,i.kt)("h3",{id:"advent-of-code"},"Advent of Code"),(0,i.kt)("p",null,"This year was quite fun, even though most of the solutions and posts came in\nlater on (",(0,i.kt)("em",{parentName:"p"},"cough")," in '23 ",(0,i.kt)("em",{parentName:"p"},"cough"),"). Day 22 was the most obnoxious one\u2026 And also\nit feels like I used priority queues and tree data structures ",(0,i.kt)("strong",{parentName:"p"},"a lot")," \ud83d\udc40"),(0,i.kt)("h3",{id:"with-rust"},"with Rust"),(0,i.kt)("p",null,"I must admit that a lot of compiler warnings and errors were very useful. Even\nthough I still found some instances where they didn't help at all or cause even\nworse issues than I had. Compilation times have been addressed with the caching."),(0,i.kt)("p",null,"Building my first tree data structure in Rust has been a very \u201cinteresting\u201d\njourney. Being able to write a more generic BFS algorithm that allows you to not\nduplicate code while still mantaining the desired functionality contributes to\na very readable code."),(0,i.kt)("p",null,"I am definitely much more aware of the basic things that bloated Python is\nmissing, yet Rust has them\u2026"),(0,i.kt)("p",null,"Using explicit types and writing down placeholder functions with ",(0,i.kt)("inlineCode",{parentName:"p"},"todo!()"),"\nmacros is very pleasant, since it allows you to easily navigate the type system\nduring the development when you don't even need to be sure how are you going to\nput the smaller pieces together."),(0,i.kt)("p",null,"I have used a plethora of traits and also implemented some of them to either be\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\ncopying, equality comparison, etc."),(0,i.kt)("p",null,"I confess to touching more \u201ccursed\u201d parts of the Rust, such as macros to\ndeclutter the copy-paste for tests or writing my own structures that need to\ncarry a lifetime for their own fields."),(0,i.kt)("p",null,"tl;dr Relatively pleasant language until you hit brick wall \ud83d\ude09"),(0,i.kt)("hr",null),(0,i.kt)("p",null,"See you next year! Maybe in Rust, maybe not \ud83d\ude43"))}d.isMDXComponent=!0},3321:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/calendar-f891b624f3e0efb34bba582100a7d8df.png"}}]); \ No newline at end of file diff --git a/assets/js/3de247b5.66851c3c.js b/assets/js/3de247b5.66851c3c.js new file mode 100644 index 0000000..ae8ce8a --- /dev/null +++ b/assets/js/3de247b5.66851c3c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3184],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>k});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),m=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},h=function(e){var t=m(e.components);return n.createElement(o.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,s=e.originalType,o=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),c=m(a),p=r,k=c["".concat(o,".").concat(p)]||c[p]||d[p]||s;return a?n.createElement(k,i(i({ref:t},h),{},{components:a})):n.createElement(k,i({ref:t},h))}));function k(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=a.length,i=new Array(s);i[0]=p;var l={};for(var o in t)hasOwnProperty.call(t,o)&&(l[o]=t[o]);l.originalType=e,l[c]="string"==typeof e?e:r,i[1]=l;for(var m=2;m{a.r(t),a.d(t,{assets:()=>V,contentTitle:()=>x,default:()=>W,frontMatter:()=>O,metadata:()=>U,toc:()=>M});var n=a(7462),r=a(7294),s=a(3905),i=a(6010),l=a(2466),o=a(6550),m=a(1980),h=a(7392),c=a(12);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:r}}=e;return{value:t,label:a,attributes:n,default:r}}))}function p(e){const{values:t,children:a}=e;return(0,r.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,h.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,a])}function k(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function g(e){let{queryString:t=!1,groupId:a}=e;const n=(0,o.k6)(),s=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,m._X)(s),(0,r.useCallback)((e=>{if(!s)return;const t=new URLSearchParams(n.location.search);t.set(s,e),n.replace({...n.location,search:t.toString()})}),[s,n])]}function u(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,s=p(e),[i,l]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!k({value:t,tabValues:a}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s}))),[o,m]=g({queryString:a,groupId:n}),[h,d]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,s]=(0,c.Nk)(a);return[n,(0,r.useCallback)((e=>{a&&s.set(e)}),[a,s])]}({groupId:n}),u=(()=>{const e=o??h;return k({value:e,tabValues:s})?e:null})();(0,r.useLayoutEffect)((()=>{u&&l(u)}),[u]);return{selectedValue:i,selectValue:(0,r.useCallback)((e=>{if(!k({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),m(e),d(e)}),[m,d,s]),tabValues:s}}var b=a(2389);const N={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function y(e){let{className:t,block:a,selectedValue:s,selectValue:o,tabValues:m}=e;const h=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.o5)(),d=e=>{const t=e.currentTarget,a=h.indexOf(t),n=m[a].value;n!==s&&(c(t),o(n))},p=e=>{let t=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const a=h.indexOf(e.currentTarget)+1;t=h[a]??h[0];break}case"ArrowLeft":{const a=h.indexOf(e.currentTarget)-1;t=h[a]??h[h.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.Z)("tabs",{"tabs--block":a},t)},m.map((e=>{let{value:t,label:a,attributes:l}=e;return r.createElement("li",(0,n.Z)({role:"tab",tabIndex:s===t?0:-1,"aria-selected":s===t,key:t,ref:e=>h.push(e),onKeyDown:p,onClick:d},l,{className:(0,i.Z)("tabs__item",N.tabItem,l?.className,{"tabs__item--active":s===t})}),a??t)})))}function f(e){let{lazy:t,children:a,selectedValue:n}=e;const s=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=s.find((e=>e.props.value===n));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},s.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function R(e){const t=u(e);return r.createElement("div",{className:(0,i.Z)("tabs-container",N.tabList)},r.createElement(y,(0,n.Z)({},e,t)),r.createElement(f,(0,n.Z)({},e,t)))}function w(e){const t=(0,b.Z)();return r.createElement(R,(0,n.Z)({key:String(t)},e))}const Z={tabItem:"tabItem_Ymn6"};function v(e){let{children:t,hidden:a,className:n}=e;return r.createElement("div",{role:"tabpanel",className:(0,i.Z)(Z.tabItem,n),hidden:a},t)}const O={id:"rules",title:"On the rules of the red-black tree",description:"Shower thoughts on the rules of the red-black tree.\n",tags:["red-black trees","balanced trees"],last_update:{date:new Date("2023-06-10T00:00:00.000Z")}},x=void 0,U={unversionedId:"rb-trees/rules",id:"rb-trees/rules",title:"On the rules of the red-black tree",description:"Shower thoughts on the rules of the red-black tree.\n",source:"@site/ib002/08-rb-trees/2023-06-10-rules.md",sourceDirName:"08-rb-trees",slug:"/rb-trees/rules",permalink:"/ib002/rb-trees/rules",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/08-rb-trees/2023-06-10-rules.md",tags:[{label:"red-black trees",permalink:"/ib002/tags/red-black-trees"},{label:"balanced trees",permalink:"/ib002/tags/balanced-trees"}],version:"current",lastUpdatedAt:1686355200,formattedLastUpdatedAt:"Jun 10, 2023",frontMatter:{id:"rules",title:"On the rules of the red-black tree",description:"Shower thoughts on the rules of the red-black tree.\n",tags:["red-black trees","balanced trees"],last_update:{date:"2023-06-10T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f",permalink:"/ib002/rb-trees/applications"},next:{title:"Graphs",permalink:"/ib002/category/graphs"}},V={},M=[{value:"Introduction",id:"introduction",level:2},{value:"1\xaa Every node is either red or black.",id:"1\xaa-every-node-is-either-red-or-black",level:2},{value:"Do I really need the nodes to be explicitly colored?",id:"do-i-really-need-the-nodes-to-be-explicitly-colored",level:3},{value:"Black height",id:"black-height",level:4},{value:"Isomorphic trees",id:"isomorphic-trees",level:4},{value:"2\xaa The root is black.",id:"2\xaa-the-root-is-black",level:2},{value:"3\xaa Every leaf (nil) is black.",id:"3\xaa-every-leaf-nil-is-black",level:2},{value:"4\xaa If a node is red, then both its children are black.",id:"4\xaa-if-a-node-is-red-then-both-its-children-are-black",level:2},{value:"5\xaa For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.",id:"5\xaa-for-each-node-all-simple-paths-from-the-node-to-descendant-leaves-contain-the-same-number-of-black-nodes",level:2}],j={toc:M},E="wrapper";function W(e){let{components:t,...r}=e;return(0,s.kt)(E,(0,n.Z)({},j,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h2",{id:"introduction"},"Introduction"),(0,s.kt)("p",null,"Have you ever thought about the red-black tree rules in more depth? Why are they\nformulated the way they are? How come they keep the tree balanced? Let's go through\neach of the red-black tree rules and try to change, break and contemplate about\nthem."),(0,s.kt)("p",null,"We expect that you are familiar with the following set of the rules",(0,s.kt)("sup",{parentName:"p",id:"fnref-1"},(0,s.kt)("a",{parentName:"sup",href:"#fn-1",className:"footnote-ref"},"1")),":"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"Every node is either red or black."),(0,s.kt)("li",{parentName:"ol"},"The root is black."),(0,s.kt)("li",{parentName:"ol"},"Every leaf (",(0,s.kt)("inlineCode",{parentName:"li"},"nil"),") is black."),(0,s.kt)("li",{parentName:"ol"},"If a node is red, then both its children are black."),(0,s.kt)("li",{parentName:"ol"},"For each node, all simple paths from the node to descendant leaves contain the\nsame number of black nodes.")),(0,s.kt)("p",null,"Each section will go into ",(0,s.kt)("em",{parentName:"p"},"reasonable")," details of each rule."),(0,s.kt)("h2",{id:"1\xaa-every-node-is-either-red-or-black"},"1\xaa Every node is either red or black."),(0,s.kt)("p",null,"OK\u2026 This one is very simple. It is just a definition and is used in all other\nrules. Not much to talk about here. Or is there?"),(0,s.kt)("h3",{id:"do-i-really-need-the-nodes-to-be-explicitly-colored"},"Do I really need the nodes to be explicitly colored?"),(0,s.kt)("p",null,"The answer is no. Balancing of the red-black trees is \u201cenforced\u201d by the 4th and\n5th rule in the enumeration above. There are many ways you can avoid using colors."),(0,s.kt)("h4",{id:"black-height"},"Black height"),(0,s.kt)("p",null,"We mentioned the 4th and 5th rule and that it enforces the balancing. What does\nit mean for us?"),(0,s.kt)("p",null,"Well, we definitely do not have to use the colors, which even as a ",(0,s.kt)("em",{parentName:"p"},"boolean")," flag\nwould take at least 1 byte of space (and usually even more), cause\u2026 well, it is\neasier for the CPU to work with words rather than single bits."),(0,s.kt)("p",null,"We could use the black height, couldn't we? It would mean more memory used, cause\nit should be ideally big and unsigned. Can we tell the color of a node from the\nblack height? Of course we can, if my child has the same black height as I do,\nit means that there was no black node added on the path between us and therefore\nmy child would be colored red."),(0,s.kt)("p",null,"Example of a red-black tree that keeps count of black nodes on paths to the\nleaves follows:"),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Red-black tree with black height",src:a(5021).Z+"#gh-light-mode-only",width:"923",height:"539"}),"\n",(0,s.kt)("img",{alt:"Red-black tree with black height",src:a(9493).Z+"#gh-dark-mode-only",width:"923",height:"539"})),(0,s.kt)("p",null,"We mark the ",(0,s.kt)("em",{parentName:"p"},"black heights")," in superscript. You can see that all leaves have the\nblack height equal to ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"1")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"1")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"1"))))),". Let's take a look at some of the interesting cases:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"If we take a look at the node with ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mtext",{parentName:"mrow"},"key"),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mn",{parentName:"mrow"},"9")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\text{key} = 9")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord text"},(0,s.kt)("span",{parentName:"span",className:"mord"},"key")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"9"))))),", we can see that it is\ncoloured red and its black height is 1, because it is a leaf."),(0,s.kt)("p",{parentName:"li"},"Let's look at its parent (node with ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mtext",{parentName:"mrow"},"key"),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mn",{parentName:"mrow"},"8")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\text{key} = 8")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord text"},(0,s.kt)("span",{parentName:"span",className:"mord"},"key")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"8"))))),"). On its left side it has\n",(0,s.kt)("inlineCode",{parentName:"p"},"nil")," and on its right side the ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"9")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"9")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"9"))))),". And its black height is still ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"1")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"1")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"1"))))),", cause\nexcept for the ",(0,s.kt)("inlineCode",{parentName:"p"},"nil")," leaves, there are no other black nodes."),(0,s.kt)("p",{parentName:"li"},"We can clearly see that if a node has the same black height as its parent, it\nis a red node.")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"Now let's take a look at the root with ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mtext",{parentName:"mrow"},"key"),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mn",{parentName:"mrow"},"3")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\text{key} = 3")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mord text"},(0,s.kt)("span",{parentName:"span",className:"mord"},"key")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"))))),". It has a black height\nof 3. Both of its children are black nodes and have black height of 2."),(0,s.kt)("p",{parentName:"li"},"We can see that if a node has its height 1 lower than its parent, it is a black\nnode."),(0,s.kt)("p",{parentName:"li"},"The reasoning behind it is rather simple, we count the black nodes all the way\nto the leaves, therefore if my parent has a higher black height, it means that\non the path from me to my parent there is a black node, but the only node added\nis me, therefore I must be black."))),(0,s.kt)("h4",{id:"isomorphic-trees"},"Isomorphic trees"),(0,s.kt)("p",null,"One of the other ways to avoid using color is storing the red-black tree in some\nisomorphic tree. The structure of 2-3-4 tree allows us to avoid using the color\ncompletely. This is a bit different approach, cause we would be basically using\ndifferent tree, so we keep this note in just as a \u201chack\u201d."),(0,s.kt)("h2",{id:"2\xaa-the-root-is-black"},"2\xaa The root is black."),(0,s.kt)("p",null,"This rule might seem like a very important one, but overall is not. You can safely\nomit this rule, but you also need to deal with the consequences."),(0,s.kt)("p",null,"Let's refresh our memory with the algorithm of ",(0,s.kt)("em",{parentName:"p"},"insert fixup"),":"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"},"WHILE z.p.color == Red\n IF z.p == z.p.p.left\n y = z.p.p.right\n\n IF y.color == Red\n z.p.color = Black\n y.color = Black\n z.p.p.color = Red\n z = z.p.p\n ELSE\n IF z == z.p.right\n z = z.p\n Left-Rotate(T, z)\n z.p.color = Black\n z.p.p.color = Red\n Right-Rotate(T, z.p.p)\n ELSE (same as above with \u201cright\u201d and \u201cleft\u201d exchanged)\n\nT.root.color = Black\n")),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"If you have tried to implement any of the more complex data structures, such as\nred-black trees, etc., in a statically typed language that also checks you for\n",(0,s.kt)("inlineCode",{parentName:"p"},"NULL"),"-correctness (e.g. ",(0,s.kt)("em",{parentName:"p"},"mypy")," or even C# with nullable reference types), you\nmight have run into numerous issues in the cases where you are 100% sure that you\ncannot obtain ",(0,s.kt)("inlineCode",{parentName:"p"},"NULL")," because of the invariants, but the static type checking\ndoesn't know that."),(0,s.kt)("p",{parentName:"admonition"},"The issue we hit with the ",(0,s.kt)("em",{parentName:"p"},"insert fixup")," is very similar.")),(0,s.kt)("p",null,"You might not realize the issue at the first sight, but the algorithm described\nwith the pseudocode above expects that the root of the red-black tree is black by\nboth relying on the invariant in the algorithm and afterwards by enforcing the\nblack root property."),(0,s.kt)("p",null,"If we decide to omit this condition, we need to address it in the pseudocodes\naccordingly."),(0,s.kt)("table",null,(0,s.kt)("thead",{parentName:"table"},(0,s.kt)("tr",{parentName:"thead"},(0,s.kt)("th",{parentName:"tr",align:"center"},"Usual algorithm with black root"),(0,s.kt)("th",{parentName:"tr",align:"center"},"Allowing red root"))),(0,s.kt)("tbody",{parentName:"table"},(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"1\xaa insertion",src:a(3416).Z+"#gh-light-mode-only",width:"179",height:"155"}),(0,s.kt)("img",{alt:"1\xaa insertion",src:a(4522).Z+"#gh-dark-mode-only",width:"179",height:"155"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"1\xaa insertion",src:a(477).Z+"#gh-light-mode-only",width:"179",height:"155"}),(0,s.kt)("img",{alt:"1\xaa insertion",src:a(8125).Z+"#gh-dark-mode-only",width:"179",height:"155"}))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"2\xaa insertion",src:a(6850).Z+"#gh-light-mode-only",width:"227",height:"251"}),(0,s.kt)("img",{alt:"2\xaa insertion",src:a(8983).Z+"#gh-dark-mode-only",width:"227",height:"251"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"2\xaa insertion",src:a(446).Z+"#gh-light-mode-only",width:"227",height:"251"}),(0,s.kt)("img",{alt:"2\xaa insertion",src:a(9905).Z+"#gh-dark-mode-only",width:"227",height:"251"}))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"3\xaa insertion",src:a(9657).Z+"#gh-light-mode-only",width:"371",height:"251"}),(0,s.kt)("img",{alt:"3\xaa insertion",src:a(9296).Z+"#gh-dark-mode-only",width:"371",height:"251"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"3\xaa insertion",src:a(841).Z+"#gh-light-mode-only",width:"371",height:"251"}),(0,s.kt)("img",{alt:"3\xaa insertion",src:a(7659).Z+"#gh-dark-mode-only",width:"371",height:"251"}))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"4\xaa insertion",src:a(515).Z+"#gh-light-mode-only",width:"419",height:"347"}),(0,s.kt)("img",{alt:"4\xaa insertion",src:a(9123).Z+"#gh-dark-mode-only",width:"419",height:"347"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"4\xaa insertion",src:a(2658).Z+"#gh-light-mode-only",width:"419",height:"347"}),(0,s.kt)("img",{alt:"4\xaa insertion",src:a(2979).Z+"#gh-dark-mode-only",width:"419",height:"347"}))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"5\xaa insertion",src:a(8747).Z+"#gh-light-mode-only",width:"419",height:"347"}),(0,s.kt)("img",{alt:"5\xaa insertion",src:a(7518).Z+"#gh-dark-mode-only",width:"419",height:"347"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"5\xaa insertion",src:a(2014).Z+"#gh-light-mode-only",width:"419",height:"347"}),(0,s.kt)("img",{alt:"5\xaa insertion",src:a(5959).Z+"#gh-dark-mode-only",width:"419",height:"347"}))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"6\xaa insertion",src:a(8317).Z+"#gh-light-mode-only",width:"563",height:"347"}),(0,s.kt)("img",{alt:"6\xaa insertion",src:a(2193).Z+"#gh-dark-mode-only",width:"563",height:"347"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"6\xaa insertion",src:a(162).Z+"#gh-light-mode-only",width:"563",height:"347"}),(0,s.kt)("img",{alt:"6\xaa insertion",src:a(1105).Z+"#gh-dark-mode-only",width:"563",height:"347"}))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"7\xaa insertion",src:a(8204).Z+"#gh-light-mode-only",width:"563",height:"443"}),(0,s.kt)("img",{alt:"7\xaa insertion",src:a(6986).Z+"#gh-dark-mode-only",width:"563",height:"443"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"7\xaa insertion",src:a(355).Z+"#gh-light-mode-only",width:"563",height:"443"}),(0,s.kt)("img",{alt:"7\xaa insertion",src:a(4300).Z+"#gh-dark-mode-only",width:"563",height:"443"}))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"8\xaa insertion",src:a(345).Z+"#gh-light-mode-only",width:"635",height:"443"}),(0,s.kt)("img",{alt:"8\xaa insertion",src:a(1988).Z+"#gh-dark-mode-only",width:"635",height:"443"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"8\xaa insertion",src:a(2530).Z+"#gh-light-mode-only",width:"635",height:"443"}),(0,s.kt)("img",{alt:"8\xaa insertion",src:a(363).Z+"#gh-dark-mode-only",width:"635",height:"443"}))),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"9\xaa insertion",src:a(6464).Z+"#gh-light-mode-only",width:"755",height:"443"}),(0,s.kt)("img",{alt:"9\xaa insertion",src:a(437).Z+"#gh-dark-mode-only",width:"755",height:"443"})),(0,s.kt)("td",{parentName:"tr",align:"center"},(0,s.kt)("img",{alt:"9\xaa insertion",src:a(6039).Z+"#gh-light-mode-only",width:"755",height:"443"}),(0,s.kt)("img",{alt:"9\xaa insertion",src:a(3122).Z+"#gh-dark-mode-only",width:"755",height:"443"}))))),(0,s.kt)("h2",{id:"3\xaa-every-leaf-nil-is-black"},"3\xaa Every leaf (",(0,s.kt)("inlineCode",{parentName:"h2"},"nil"),") is black."),(0,s.kt)("p",null,"Now, this rule is a funny one. What does this imply and can I interpret this in\nsome other way? Let's go through some of the possible ways I can look at this and\nhow would they affect the other rules and balancing."),(0,s.kt)("p",null,"We will experiment with the following tree:\n",(0,s.kt)("img",{src:a(6769).Z+"#gh-light-mode-only",width:"899",height:"539"}),"\n",(0,s.kt)("img",{src:a(4086).Z+"#gh-dark-mode-only",width:"899",height:"539"})),(0,s.kt)("p",null,"We should start by counting the black nodes from root to the ",(0,s.kt)("inlineCode",{parentName:"p"},"nil")," leaves based\non the rules. We have multiple similar paths, so we will pick only the interesting\nones."),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"What happens if we do not count the ",(0,s.kt)("inlineCode",{parentName:"li"},"nil")," leaves?"),(0,s.kt)("li",{parentName:"ol"},"What happens if we consider leaves the nodes with ",(0,s.kt)("em",{parentName:"li"},"no descendants"),", i.e. both\nof node's children are ",(0,s.kt)("inlineCode",{parentName:"li"},"nil"),"?"),(0,s.kt)("li",{parentName:"ol"},"What happens if we do not count the ",(0,s.kt)("inlineCode",{parentName:"li"},"nil")," leaves, but consider nodes with at\nleast one ",(0,s.kt)("inlineCode",{parentName:"li"},"nil")," descendant as leaves?")),(0,s.kt)("table",null,(0,s.kt)("thead",{parentName:"table"},(0,s.kt)("tr",{parentName:"thead"},(0,s.kt)("th",{parentName:"tr",align:"right"},"path"),(0,s.kt)("th",{parentName:"tr",align:"right"},"black nodes"),(0,s.kt)("th",{parentName:"tr",align:"right"},"1\xaa idea"),(0,s.kt)("th",{parentName:"tr",align:"right"},"2\xaa idea"),(0,s.kt)("th",{parentName:"tr",align:"right"},"3\xaa idea"))),(0,s.kt)("tbody",{parentName:"table"},(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"right"},(0,s.kt)("inlineCode",{parentName:"td"},"3 \u2192 1 \u2192 0 \u2192 nil")),(0,s.kt)("td",{parentName:"tr",align:"right"},"4"),(0,s.kt)("td",{parentName:"tr",align:"right"},"3"),(0,s.kt)("td",{parentName:"tr",align:"right"},"4"),(0,s.kt)("td",{parentName:"tr",align:"right"},"3")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"right"},(0,s.kt)("inlineCode",{parentName:"td"},"3 \u2192 5 \u2192 7 \u2192 8 \u2192 nil")),(0,s.kt)("td",{parentName:"tr",align:"right"},"4"),(0,s.kt)("td",{parentName:"tr",align:"right"},"3"),(0,s.kt)("td",{parentName:"tr",align:"right"},"-"),(0,s.kt)("td",{parentName:"tr",align:"right"},"3")),(0,s.kt)("tr",{parentName:"tbody"},(0,s.kt)("td",{parentName:"tr",align:"right"},(0,s.kt)("inlineCode",{parentName:"td"},"3 \u2192 5 \u2192 7 \u2192 8 \u2192 9 \u2192 nil")),(0,s.kt)("td",{parentName:"tr",align:"right"},"4"),(0,s.kt)("td",{parentName:"tr",align:"right"},"3"),(0,s.kt)("td",{parentName:"tr",align:"right"},"4"),(0,s.kt)("td",{parentName:"tr",align:"right"},"3")))),(0,s.kt)("p",null,"First idea is very easy to execute and it is also very easy to argue about its\ncorrectness. It is correct, because we just subtract one from each of the paths.\nThis affects ",(0,s.kt)("strong",{parentName:"p"},"all")," paths and therefore results in global decrease by one."),(0,s.kt)("p",null,"Second idea is a bit more complicated. We count the ",(0,s.kt)("inlineCode",{parentName:"p"},"nil"),"s, so the count is ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"4")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"4")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"))))),"\nas it should be. However, there is one difference. Second path no longer satisfies\nthe condition of a ",(0,s.kt)("em",{parentName:"p"},"leaf"),". Technically it relaxes the 5th rule, because we leave\nout some of the nodes. We should probably avoid that."),(0,s.kt)("admonition",{type:"caution"},(0,s.kt)("p",{parentName:"admonition"},"With the second idea, you may also feel that we are \u201cbending\u201d the rules a bit,\nespecially the definition of the \u201cleaf\u201d nodes."),(0,s.kt)("p",{parentName:"admonition"},"Given the definition of the red-black tree, where ",(0,s.kt)("inlineCode",{parentName:"p"},"nil")," is considered to be an\nexternal node, we have decided that bending it a bit just to stir a thought about\nit won't hurt anybody. \ud83d\ude09")),(0,s.kt)("h2",{id:"4\xaa-if-a-node-is-red-then-both-its-children-are-black"},"4\xaa If a node is red, then both its children are black."),(0,s.kt)("p",null,"This rule might seem rather silly on the first look, but there are 2 important\nfunctions:"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"it allows the algorithms to ",(0,s.kt)("em",{parentName:"li"},"\u201cnotice\u201d")," that something went wrong (i.e. the\ntree needs to be rebalanced), and"),(0,s.kt)("li",{parentName:"ol"},"it holds the balancing and height of the tree ",(0,s.kt)("em",{parentName:"li"},"\u201cin check\u201d")," (with the help of\nthe 5th rule).")),(0,s.kt)("p",null,"When we have a look at the algorithms that are used for fixing up the red-black\ntree after an insertion or deletion, we will notice that all the algorithms need\nis the color of the node. "),(0,s.kt)("blockquote",null,(0,s.kt)("p",{parentName:"blockquote"},"How come it is the only thing that we need?\nHow come such na\xefve thing can be enough?")),(0,s.kt)("p",null,"Let's say we perform an insertion into the tree\u2026 We go with the usual and pretty\nprimitive insertion into the binary-search tree and then, if needed, we \u201cfix up\u201d\nbroken invariants. ",(0,s.kt)("em",{parentName:"p"},"How can that be enough?")," With each insertion and deletion we\nmaintain the invariants, therefore if we break them with one operation, there's\nonly one path on which the invariants were ",(0,s.kt)("em",{parentName:"p"},"felled"),". If we know that rest of the\ntree is correct, it allows us to fix the issues just by propagating it to the\nroot and ",(0,s.kt)("em",{parentName:"p"},"abusing")," the siblings (which are, of course, correct red-black\nsubtrees) to fix or at least partially mitigate the issues and propagate them\nfurther."),(0,s.kt)("p",null,"Let's assume that we do not enforce this rule, you can see how it breaks the\nbalancing of the tree below."),(0,s.kt)(w,{mdxType:"Tabs"},(0,s.kt)(v,{value:"enforcing",label:"Enforcing this rule",mdxType:"TabItem"},(0,s.kt)("p",null,(0,s.kt)("img",{src:a(772).Z+"#gh-light-mode-only",width:"755",height:"347"}),"\n",(0,s.kt)("img",{src:a(8663).Z+"#gh-dark-mode-only",width:"755",height:"347"}))),(0,s.kt)(v,{value:"omitting",label:"Omitting this rule",mdxType:"TabItem"},(0,s.kt)("p",null,(0,s.kt)("img",{src:a(4130).Z+"#gh-light-mode-only",width:"803",height:"443"}),"\n",(0,s.kt)("img",{src:a(2683).Z+"#gh-dark-mode-only",width:"803",height:"443"})))),(0,s.kt)("p",null,"We can create a ",(0,s.kt)("strong",{parentName:"p"},"big")," subtree with only red nodes and ",(0,s.kt)("strong",{parentName:"p"},"even")," when keeping\nthe rest of the rules maintained, it will break the time complexity. It stops us\nfrom \u201chacking\u201d the black height requirement laid by the 5th rule."),(0,s.kt)("h2",{id:"5\xaa-for-each-node-all-simple-paths-from-the-node-to-descendant-leaves-contain-the-same-number-of-black-nodes"},"5\xaa For each node, all simple paths from the node to descendant leaves contain the same number of black nodes."),(0,s.kt)("p",null,"As it was mentioned, with the 4th rule they hold the balancing of the red-black\ntree."),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"An important observation here is the fact that the red-black tree is a\n",(0,s.kt)("strong",{parentName:"p"},"height"),"-balanced tree.")),(0,s.kt)("p",null,"Enforcing this rule (together with the 4th rule) keeps the tree balanced:"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"4th rule makes sure we can't \u201chack\u201d this requirement."),(0,s.kt)("li",{parentName:"ol"},"This rule ensures that we have \u201csimilar\u201d",(0,s.kt)("sup",{parentName:"li",id:"fnref-2"},(0,s.kt)("a",{parentName:"sup",href:"#fn-2",className:"footnote-ref"},"2"))," length to each of the leaves.")),(0,s.kt)("admonition",{title:"AVL tree",type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"You might have heard about an ",(0,s.kt)("em",{parentName:"p"},"AVL tree")," before. It is the first self-balanced\ntree to be ever introduced and works in a very similar nature as the red-black\ntree, the only difference is that it does not deal with the ",(0,s.kt)("em",{parentName:"p"},"black height"),", but\nthe height in general."),(0,s.kt)("p",{parentName:"admonition"},"If you were to compare AVL with the red-black tree, you can say that AVL is much\nmore strict while red-black tree can still maintain the same asymptotic time\ncomplexity for the operations, but having more relaxed rules.")),(0,s.kt)("div",{className:"footnotes"},(0,s.kt)("hr",{parentName:"div"}),(0,s.kt)("ol",{parentName:"div"},(0,s.kt)("li",{parentName:"ol",id:"fn-1"},"CORMEN, Thomas. Introduction to algorithms. Cambridge, Mass: MIT Press, 2009. isbn 9780262033848.",(0,s.kt)("a",{parentName:"li",href:"#fnref-1",className:"footnote-backref"},"\u21a9")),(0,s.kt)("li",{parentName:"ol",id:"fn-2"},"red nodes still exist",(0,s.kt)("a",{parentName:"li",href:"#fnref-2",className:"footnote-backref"},"\u21a9")))))}W.isMDXComponent=!0},4086:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rb_dark-c025d61dee7913262c86277087751328.png"},9493:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rb_height_dark-75a70ddff74e5e1aff7e9986221b5687.png"},5021:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rb_height_light-36fa69317ced094d7bb7b0fdf32cb3fe.png"},6769:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rb_light-f53bee3b32ddb2e7a4249828bc03b1a4.png"},8663:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/correct_dark-bbd8d4c1796b145025fed5b6dff03b84.png"},772:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/correct_light-bc4770146072f748be4a5aa11abf3a0c.png"},2683:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/incorrect_dark-9b8b3be328ffad83233de4536c120016.png"},4130:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/incorrect_light-e787e568e9a1528dcac5bf55ef29fdaa.png"},4522:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAACbCAYAAAAp66qoAAAABmJLR0QA/wD/AP+gvaeTAAAT30lEQVR4nO3deVjU1eLH8TczDAYiiigIKIyZYO5ZKNqi4p43ct9ALdMKFQUVbqndem71pJaKopXiSqhsLpgoofnTMhNudPW6k8iSG8oqssry+8P0ccnSYubA4bz+gmGeOZ+H58PhzHy/3/M1cXRsUYWi1H5RGtEJFKW6qDIr0lBlVqRhKjqATLRaLU2aNKFp0yZYWTVEq9VQv74lpqZaiouLKSsro6SkhPz861y9epW8vDzRkaWiyvwXPPHEE3Tq1Im2bZ/G1dUVFxcX9HpnbGxs0Gq1j/w6paWlXL58mZSU85w9e5azZ89y/PgJfvnlF6qq1Pvyx2WiPs34cxqNhmeeeQYPj950796dzp07YWZmRl5e3m8lTCYlJYWrV6+SmZnJtWtZ5OXlUVlZSWFhIeXl5Zibm2NmZka9evVo1KgRzZrZYWtri4ODAy4urXFxcaF169bodDqys7NJTEzk8OEfiY/fy8WLF0X/CmqDKFXmP+Dm9hxDhw5lwID+2NnZkZ6ezuHDP3LkyBGOHEmo9pKZmprStm1b3N274e7uTvfu7lhaWnL8+HFiY3cTHb2VzMzMah1TIqrM96tfvz4jRgxn/Hhv2rRpw+nTp9m9ew979sRx5swZo2bR6XQ8//zzDBo0kEGDBmJlZcW+ffsIDf2K77773qhZagFV5tvq16/PmDGjmT59GlZWVuzdu49Nmzbx/feHREcDbhV7wID+eHl58cILz3PmzBmWLVtObOxutb6+RZVZo9Hg7e1FQMAcTE11rFu3jpCQNTX6k4YOHdrj7+9Pv359OXbsGPPmvcexY8dExxKtbpe5Q4f2LFjwCe3atWPNmrWsWLGyRpf4fu3bt+P99/9Ft27d2LRpM598soDr16+LjiVK3TycbWJiwtSpPnz99U5KSkro338gH330ca0qMsCJEycZNWoMfn6zGDhwAPHx3/Dcc8+KjiVMnStzw4YNCQv7isDAABYuXMSIEaNITk4WHesvq6qqYtu2bfTp04+zZ88SHR2Fj8/bomMJobWyaviB6BDG4uDgQGRkOPb2zRg3zptdu2JFR6o2xcXFxMTEUFRUxNy572Jra8uBAwfr0pvDU3XmCKBerycqKoL8/Hw8PYdw5coV0ZGqXVVVFatXh5CRkcGKFcHY2Ngwbdp0ysvLRUczijqxzLC1tWXz5jAyMzMZNmyElEW+W1zcN3h5eePh0ZsFCz7BxMREdCSjkH6ZYW5uTlRUBGDCmDHjat2bvL/q4sWLnDx5infffQeNRsOPPx4RHcnQTklf5g8//Ddubs8xbNgwMjOvio5jVKmpqWRlZTFv3lyOHEngwoULoiMZ0implxn9+vX97YDIP7lwoW6erBMWtok9e+JYvjwIKysr0XEMStoy63Q6PvjgfXbs2MHu3bsNNk7jxo0ZO3YMoaEbSE1N4cKFDHr16vXA8ywsLBg7diyRkeH8/PNPpKamcOjQd8ybN5cGDSwNlg8gMPCfmJmZ4es73aDjiCbtpxkTJ07Azs6OTz5ZaNBxgoOX0bNnzz993pQpkwkImHPPY3q9Hh+ft+nbty+enq9SUFBgkIz5+fkEBS1n/vy5bNy4Udr/UlLOzBqNhilTJhMa+hWXLl0y6FjZ2dmEh0cwceJrbNmy5aHPKywsJCoqGi8vb9zcuuHi0gYvL2+uXLlC69ZPMWXKZIPmDAsLIysri4kTJxp0HJGknJlffPEFHB0d2bx5s8HHmjHD787XvXv3fujz1qxZ+8BjBw9+x8cff0Jw8DI6duxokHy33bx5k4iISMaPH8/ChYuk/OxZypnZ09OTpKQkzp1LER3lT/36awYAOTk5Bh8rMjKSJk1seP75HgYfSwQpy9ytW9dac/L67TeL27dvN/hYFy5cJC0tDTc3N4OPJYJ0ZW7cuDHOzs4kJf0sOsqfateuHT4+b7NjR4zRLgL46acknn1WzjPrpCtz8+aOmJiYcP58zV5iODm1YMOGdZw+fZqAgECjjXv+/HlatGhutPGMSboyW1s3BiA3N1dwkodzcmpBVFQk169fx9t7AsXFxUYbOzc3F2tra6ONZ0zSldnc/AkAiotLBCf5fc7OzkRHR1FcXMKYMWONfq5IYWERFhYWRh3TWKQrc15ePgCNGjUUnORBrVq1YuvWKEpKShg1ajTXrmUZPYO1dSNpT7aSrsy3lxeNG9sITnIvFxcXoqOjKCoqYuTI0Vy9KuakJxsbmxq9BPs7pDtokpqaSmlpKe3btzfK5VCzZvkza5b/PY+FhYXe+bpXr96cO5fCpEmv07TprX3okpL+88DrJCcn4+HR1+B5O3Roz+nTxt3/w1ikm5nLyso4ceJEnb6w82FMTEzo0qULSUlJoqMYhJRbDQQEzGHUqJG4u/egoqJCdJwaw93dnejoyDsXv0pGzq0GIiIiadasGS+++KLoKDXK2LFjOHbsmIxFBiRcZgBkZGSQkJBg8DPRahN7e3sGD36ZzZsffmZfbSdlmQE+/XQxPXu+RM+eL4mOUiMEBMzh2rUsoqKiRUcxGGnLnJCQwN69+3j//X9Rr1490XGE6tKlC8OHD2PhwkWUlZWJjmMw0pYZYN68+djZ2TF//lzRUYSpX78+y5Yt5dChQ8TExIiOY1BSX51dUFDAxYsXmTt3LikpKZw9W3u34forNBoNK1cGo9fr8fLyprCwSHQkQ5J/R6OYmJ0888wzBAUtJScnh0OHfhAdyWg++uhDPDw8GDfOS8ihc2OTeplx27///SGxsbGsWRNCjx5yXmVxNxMTE957bz5eXuOYNm06CQmJoiMZRZ0oc2VlJf7+s/n22/2EhYXy6queoiMZjE6nIzh4GZMmvc7Mmf7ExX0jOpLRSL1mvltlZSVxcXFYWVnx3nvzMTc358cfj1BZWSk6WrVp3tyRDRvW4+bWlUmT3iA+Pl50JGOSf3uuu1VVVXHw4HdcvnwZf38/+vTx4PDhH8nPzxcd7W8bPPhlQkM3Ul5+E2/v8fz3v/8VHcnY5N6e62HCwyMYPPgfPPHEE3z77V78/GZiZmYmOtZfcuvyq/WsWvUlu3bF8vLL/6jVm6f/HXVqZr5bTk4OW7aEU1paiq/vdEaOHEFeXj7Jycm1YoNuGxsb/P39CApaCpjw9ttTWb9+g5T7YTyiU1KeNfe47O3tCQwMYOjQIaSnp7Ny5efExOyktLRUdLQHODg48PrrrzFhwniKi4tZsWIlGzZsrMslvq1u323qfnq9nhkzfBk6dAiFhYVER29l8+Ytwv9tm5qa0qtXT7y8vPDw6E1OTg5ffrmK0NCvjHoxbA2nyvx7mjZtwujRoxk3bhxOTi04dy6F3bt3Exf3DSdPnjTKOdKWlpb06NGdQYMG0a9fXxo2bMgPPxwmLCyMb76J5+bNmwbPUMuoMv8RjUaDm9tzDBo0iIEDB9K8uSMFBQUkJv6HxMRETpw4wZkzZ//2/axNTU1p2VKPq6srXbp0oVu3rrRr1w6NRkNS0s/s2bOHPXv28OuvUm8W/nepMj8OV1dXund3Z8qUKTRubE2DBg0AyMvL4/z581y9eo3Lly+RlZXN9esFlJWVUlxcQllZKZaWlmi1WiwtLbG0tMTBwYGmTZvg6OjIk08+iU6no7y8nJKSEhISEomKiiIhIaFOHIauJqrMj8vFxYV9++KZNm06hw79QJs2bXB1dUGv19O0aVOaNWtG06ZNaNCgAWZmZlhYWKDT6SgsLKS8vJwbN25w48YNrly58lv5L3PuXArJyWdJTv6FFSuW06pVK/r1GyDVAR0jUGV+XCEhq3jyyScNVra7/1i+/npXtb++xOS8BtBQOnRoz8CBA1m06FODzZrJycns3LnztxvTS39SY7VSZX4Mc+bM4fjxE8TH7zXoOIsXL8XJyYkhQ1416DiyUWV+RJ06dcLDozeLFn1q8COEqampbN26jdmzZ6PT6Qw6lkxUmR/RO+/8k59+SuLAgQNGGW/p0qU0a2bHyJEjjTKeDFSZH0HXrm68+OILfPrpZ0Yb88KFi2zZEs7Mmb619iQoY1NlfgSBgQEcOvQDhw8fNuq4QUHLsLGxwctrnFHHra1Umf9Ez549cXd3Z+nSpUYf++rVq4SFbcLXdzrm5uZGH7+2UWX+E3PmzGL//v3CrqMLDl6BhYUFEydOEDJ+baLK/Af69+9H586dWbIkSFiG7OxsQkO/YupUHywtDXtb4tpOlfkhTExMmD17FnFxcRw9elRoli+++BKdzoxJk14XmqOmU2V+iMGDX+bpp59m6dJloqOQm5tLSEgIb7/9Fg0b1rzbW9QUqsy/Q6vVMmvWLHbu/JpTp06JjgNASMgaKisr1c6mf0CV+XcMGfIqrVo9SVCQuLXy/QoKCli1ajVTpkymSZOadb+WmkKV+T5arZYZM3zZunVbjbv39tq16ygqKubNN98UHaVGUmW+z6hRo3B2diYoSPxa+X5FRUV88cUXTJr0OnZ2dqLj1DiqzHfR6XT4+k4nPDyCjIwM0XF+18aNoeTm5jJ1qo/oKDWOKvNdvLzG0ayZHcuXB4uO8lClpaWsXPk548d74+DgIDpOjaLK/Jt69eoxbdpUvvoqjEuXLomO84c2bdrMlSuZzJjhKzpKjaLK/JuJEydgbW3N559/ITrKn7p58ybBwSsYM2Y0Tk5OouPUGKrMgIWFBT4+Pqxbt/5vbxtgLJGRkaSnp+PnN1N0lBpDlRl4441JWFiYs3r1atFRHllFRQXLlwczfPgwnnqqleg4NUKdL3ODBg146603CQlZQ1ZWtug4j2XHjhhSUs7j5+cnOkqNUOfLPGXKZDQaDSEha0RHeWwVFRUsWbIET89XaNu2reg4wtXpMjds2JDJk9/gyy9X1doNx2Njd3P69GlmzVKzc50u87RpUykvL2fduvWio/xlVVVVLF68hAEDBtC5c2fRcYSqs2W2sbFhwoTxfP75F9y4cUN0nL8lPn4vR48erfOzc50ts6/vdIqLi9m4MVR0lGrx2WdL8PDwoFu3rqKjCFMny2xra4u3txfLl6+QZrPugwcPcuTIEfz9/UVHEaZOltnPbybZ2dls2rRJdJRqtWjRp7zwwvN14sadv6fOlbl5c0fGjh3DsmXBlJWViY5TrRIT/8P33x8iMDBAdBQh6lyZ/fz8uHIlk6ioKNFRDGLBgoU8+2wXevXqJTqK0dWpMrds2ZIRI4azePFiae8JcuzYMfbv/z8CAwMwMTERHceopCyzvb09HTt2eODx2bP9ycjIYMeOGAGpjGfBgoW0b9+O/v373fO4Vqulb98+glIZnpRl7ty5M7Gxu1izZjVt2rQBbu1I7+npyWefLZb+nnmnT58mLi6OwMAANBoNGo2GV175B/v27SUkZDVarVZ0RIOQcmt2vd6Z/Px8nJyciI+PY+fOr7G2bsQvv/zCrl2xouMZxWefLWHfvnjmzn2Xnj1fwtXVlcTERFq3fgpHRwcyMn4VHbHaSTkz6/V6Tp06xYABg3jjjcm4uLTmpZdeIjc3t86czG5nZ8vly5d56603uXjxEoMGDeatt25dN+js7Cw4nWFIW+a0tDSqqqrYu3cfAwe+jI/PVGxtbTlwYD/LlgVJW+quXd2Iiopgy5bNnD+fyuDBr/Daa69z8uRJsrOzKSgoUGWuTZydnUlLS7/zfWVlJbt2xeLh0Zd3351Ljx7dOXBgv1T7Hmu1WtatW8u2bVuprKzC03MIY8eO43//+989z0tNTUOv14sJaWDSldnMzAwHB3vS09Mf+Fl5eTnHjx/HzMyMo0ePsXPn1wISGkZFRQUrV37O9evXqaio4MyZM7/7vPT0dFXm2sLJqQUajeaemfm2Tp06ER5+68bu48dPoKCgQEBCw0lKSmLIkGG0aeNKVFQEjRo1euA5aWlp6PVqmVEr3J517p+Zu3fvTkTEFn76KQlv7wkUFhYKSGd4ycnJjBw5GltbW8LDt2Bjc+++dOnp6Tg7O0t5QEXKMl+7lnXPOcp9+ngQFhbKt9/uZ/LkKZSWlgpMaHgpKSkMHToMS8v6bN0ajb29/Z2fpaWlY25ujq2trcCEhiFdmW+9+Uu7872n5yusXbuG6Oit+PrOkP6AyW0XLlxk6NDhlJffZNu2rXc+wbj9u5FxqSFdmfV65ztLjOHDh7F8+TLCwjbxzjvv1rkbq1+7do0RI0aRnZ3F9u1bcXV1JTMzk+LiYinfBEpYZj3p6em89tpEli5dwurVIcyf/57B76paU+Xl5TF2rBfp6RlERGyhbdu2ZGRkSPlZs1SHs7VaLc2bN6dv3z507NiRjz76mFWras/GLoZSUFCAl5c369atJTIynJycHDUz13SOjo7odDo6duzIv/71gSryXYqKihg/fgKHDx+mZcuWas1c0+n1zpSXlzNjhh/r19fe7QMM5ebNm/j4TCMmZqeamWs6R0dHfHymsX37dtFRaqxbf+wziY2NxdraWnScamXi6NhCmndG9erVk/4z5OpiYmKCTqeT6TrIKKlmZlXkR1dVVSVTkQHJlhlK3abKrEhDlVmRhiqzIg1VZkUaqsyKNFSZFWmoMivSUGVWpKHKrEhDlVmRhiqzIg1VZkUaqsyKNFSZFWmoMivSUGVWpKHKrEhDlVmRhiqzIg1VZkUaqsyKNFSZFWmoMivSUGVWpKHKrEhDlVmRhiqzIg1VZkUaqsyKNFSZFWmoMivSUGVWpKHKrEhDlVmRhiqzIg1VZkUaqsyKNFSZFWmoMivSUGVWpKHKrEhDlVmRhiqzIg1VZkUaqsyKNFSZFWmoMivSMAWiRIdQlGpw5P8BB5zaK3NKi9YAAAAASUVORK5CYII="},3416:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAACbCAYAAAAp66qoAAAABmJLR0QA/wD/AP+gvaeTAAASYklEQVR4nO3deVSU1R8G8Ocdhh0FwQVBfyaoECCeLEsMBVMwj1tJLkFJWrnXCcXlZG7Z4QRamNvxmGZFLoBLmkKIiigkirugssqiICAuIOAMzHx/fxQezd2Y9w537ucc/nCcw32AZy6Xd973vhIREQSh+YtVsE4gCE1FlFnghiizwA0l6wA80Wg0KCsrQ1lZGW7dugWNRoPq6mo0NDTAwsICpqamMDc3h42NDdq3bw9bW1vWkbkiyvwC6urqkJ6ejnPnziEjIwOZmZnIy8tDeXk5NBrNM38eMzMzdOjQAS4uLvDw8IC7uzt69uwJNzc3SJKkw6+AT5I4mvF0Wq0Wx44dQ1xcHA4dOoT09HSoVCrY2treK6GLiwvat28PBwcHtGvXDra2tlAoFGjRogWUSiVqa2uhUqlw9+5d3LhxAyUlJSgtLUVxcTEuXLiAzMxMXLx4EWq1Gm3atEHfvn3Rv39/DB8+HP/73/9Yfwuag1hR5idITU3Fpk2bsGvXLpSUlMDZ2Rm+vr7w8fGBj49Pk5esoaEBZ86cweHDh5GcnIzk5GRUVVXh1VdfRUBAAMaNGwcHB4cmHZMjsSDhAdXV1bR69Wrq3r07ASBPT09avHgxnTt3TvYsKpWK4uPjaeLEidS6dWtSKpX07rvv0r59+2TP0gzEiDL/o7q6mpYvX0729vZkZmZGo0aNosTERNax7lGpVBQTE0MDBw4kSZLI09OTYmJiSKvVso6mL0SZNRoNrVmzhuzs7Khly5b01VdfUWVlJetYT3Ty5EkaPnw4SZJEr7/+Oh0/fpx1JH1g2GU+efIk9erVi4yNjSk0NFTvS/xvp06dIl9fX1IoFDR58mS6efMm60gsGWaZtVothYeHk7GxMfXr148yMjJYR3phWq2WoqKiyN7enjp16kSpqamsI7FieGW+ceMG+fv7k7GxMUVERHCz5qyoqKAhQ4aQUqmkiIgI1nFYMKwyFxUVkbu7O3Xs2JHLdaZWq6XvvvuOjIyMaMqUKdTQ0MA6kpxiDOYdwNzcXPTv3x+tWrXC0aNH4ejoyDpSk5MkCTNmzICTkxMCAwNRUVGBLVu2QKk0jB+zQZxoVFpaikGDBsHBwQGHDx/mssj3e+edd5CQkIC4uDhMmjQJZCDvi3Ff5traWgwePBgmJibYu3cvbGxsWEeSRd++fREbG4uoqCgsXryYdRx5sF7o6NrkyZOpVatWVFBQwDoKE2vXriWFQkFJSUmso+ga338A7t69myRJom3btrGOwtR7771HHTp04P04dAy3ywy1Wo2QkBAEBgYiICBAZ+Ncv34dGzZswJAhQ2BqagpJkvDnn38+9LyamhqsX78eb731FhwcHGBqaoquXbti9uzZqKqq0lk+AFi3bh1UKhXCwsJ0Og5zrF9OuhIZGUnm5uZUVFSk03EGDRpEAB74iI+Pf+h5S5Yseeh5jR8vv/wy3bp1S6c5V6xYQWZmZjwvt/icmbVaLSIjIzFlyhR07NhRp2O1adMGEyZMwJ49e/DJJ5889nlWVlYIDg5GQkICiouLcefOHSQkJMDR0REXL17E8uXLdZpz0qRJaNu2LVavXq3TcZhi/XLShYSEBAJAFy9elHXcadOmPXZmfpzffvuNANDQoUN1mOxvCxcupHbt2pFardb5WAzwOTNv3boVXl5ecHV1ZR3lqTp37gwAaN26tc7HGj9+PMrLy5GUlKTzsVjgssxHjhyBn58f6xjPpPGPxaCgIJ2P1alTJ3Tp0gUpKSk6H4sF7sp8/fp15OXlwcvLi3WUpzpz5gyWLl2K999/HwMHDpRlzD59+uDo0aOyjCU37spcWFgIIoKLiwvrKE90+fJlDBs2DJ6enli/fr1s43br1g0FBQWyjScn7sp8/fp1AICdnR3jJI93+fJl+Pr6wsbGBvHx8bCwsJBtbDs7O1RWVso2npy4K3NdXR0AwNzcnHGSR8vLy4OPjw8sLCywf/9+2TeCsbKyQk1NjaxjyoW7Mrdq1QoAcPPmTcZJHpaVlQUfHx+Ym5vj4MGDaNeunewZKisrud1JibsyNy4vKioqGCd5UGZmJnx8fGBpaYmkpCS0b9+eSY6Kigq9XoL9F9yVuWvXrjAzM8Pp06dlGW/RokWQJAmSJN17d23w4MH3Hrt06RIAYOXKlSgrK0N2djYcHR3v/X/jh4eHhyx5T506he7du8sylty4K7OpqSleeeUV/PXXX6yj6B0iQlpaWrM4bPkiuNyea/78+fj5559RUFAAIyMj1nH0RnJyMnx9fXH+/HnZfhPIiM+d88ePH4+rV68iMTGRdRS9smHDBvTq1YvHIgPgcJkBAE5OTujXrx8iIyNZR9EbV65cwbZt2554Zl9zx+UyAwAOHz4MHx8fJCQkwN/fn3Uc5saPH49Dhw7h0qVLMDU1ZR1HF/je0nb48OHIz8/HiRMnYGZmxjoOM2lpafD29savv/6KwMBA1nF0he8yFxcXo0ePHvjggw+wYsUK1nGYuHPnDnr27AknJyfEx8fzvCM/n38ANurYsSPWrFmDVatWITo6mnUc2Wm1WgQHB6O6uhq//PILz0UGYAD3NBk7diyOHTuG4OBgtG7dGgMGDGAdSTbTp09HXFwc9u3bx+Stc9mxusZFThqNhoKCgqhFixZ08OBB1nF0TqvV0syZM8nIyIh27tzJOo5c+N43435qtZrGjh1LpqamtGXLFtZxdEalUlFgYCCZmJjQpk2bWMeRk+GUmejvGXrGjBkkSRLNmTOHuws7CwoKqE+fPtSyZUu9uoWFTAyrzI02bNhAlpaW1Lt3b8rNzWUdp0nExsZSq1atyN3dvVlvnv4fGGaZiYguXLhAPXr0IHNzc/r666/p7t27rCO9kPz8fBo6dCgBoIkTJ1JtbS3rSKwYbpmJ/l5HR0REkJWVFXXp0oWioqKazQbd5eXlNGfOHDI3Nyc3NzdD2BjxaQy7zI2Ki4spODiYlEolubi40MaNG6muro51rEcqKiqiWbNmkZWVFbVt25YiIyO5W/u/IFHm++Xk5NBHH31EJiYmZGtrS1988YVerD/VajX98ccfNGzYMDIyMiJ7e3tatmwZ1dTUsI6mT0SZH+XatWsUFhZGnTt3JgDk6upK8+bNo/T0dNmWIVVVVbRr1y4KDg4mW1tbkiSJBgwYQDExMaRSqWTJ0MzEcH1uxn+l1WqRmpqKHTt2YOfOnSgsLIS1tTW8vb3h7e2Nnj17wsPD4z/fz7qhoQE5OTnIyMhAWloajhw5gtOnT0Or1cLLywsjR47EyJEj8dJLLzXNF8Ynvk80amoZGRlITk7G999/j8rKSty+fRsAYGtri27dusHe3h4dO3ZE27ZtYW1tDVNTU1hYWMDU1BTV1dVoaGhAdXU1qqqqUFxcjLKyMhQVFSE7OxtqtRpKpRLm5ubo168fgoOD0a9fP8N4G7ppiDI/r8zMTHh6emLLli0YMGAAzp8/j8zMTOTm5uLatWu4evUqysrKUFVVBZVKhZqaGqjValhZWcHY2BgtWrRAy5Yt4ejoCHt7e3To0AGurq5wd3eHm5sbgoKCkJWVhbNnz0Kh4Po8sKYmyvy8AgICkJ2drbOy3f9iGT16dJN/fo6JMj+PU6dO4bXXXsPOnTsxYsQInY0TFBSEEydOIDMz02Du4dcERJmfx9ChQ3Ht2jWkp6fr9NzgnJwcuLm5YcOGDRg3bpzOxuGMKPOzSk9PxxtvvIG4uDi8/fbbOh9vwoQJSEpKQlZWFkxMTHQ+HgdEmZ+Vn58f6urqZNuou7CwEN26dcOqVavw6aefyjJmMyfK/CxSUlLQt29fHDx4EP3795dt3KlTp2Lv3r3Izs7m9YrqpiTK/Cx8fX2hVCqxf/9+WcctLS2Fs7MzIiIiMH36dFnHbob4vqC1KSQkJCA5ORkLFy6Ufez27dtj0qRJCAsLQ21trezjNzdiZn6K3r17w87ODnv37mUyfkVFBZydnbFgwQKEhoYyydBMiJn5SXbv3o3jx48zmZUbtWnTBlOnTkV4eDiqq6uZ5WgOxMz8GER0b/OU7du3M81SWVkJJycnzJ49G/PmzWOaRY+Jmflxtm3bhnPnzmHBggWso8DOzg4hISFYtmyZXt7eQl+IMj+CRqPBokWLMGbMGPTo0YN1HABASEgIFAqF2Nn0CUSZH2Hz5s3IysrSi1m5kbW1NWbOnInIyEiUl5ezjqOXxJr5XzQaDdzd3eHl5YWNGzeyjvOAmpoaODs7Izg4GOHh4azj6BuxZv63jRs3Ij8/H/Pnz2cd5SGWlpaYPXs2Vq5ciZKSEtZx9I6Yme+jVqvh6uoKf39/rF27lnWcR7p79y66du2KgIAALF++nHUcfSJm5vv9+OOPKCkp0evDX2ZmZpg7dy7Wrl2L4uJi1nH0ipiZ/9GcZrzm8BuEATEzN1qzZg0qKysxe/Zs1lGeysTEBF9++SV++ukn5Ofns46jN8TMjOZ5lECfj7owImZmAPjhhx9QU1ODmTNnso7yzIyMjDBv3jxERUXdu6WxoTP4mfn27dtwcnLCtGnT8PXXX7OO81w0Gg08PT3Ro0cPbN68mXUc1sTMHBkZCa1Wi5CQENZRnpuRkREWLVqE6OhonD17lnUc5gx6Zr558yacnJwQGhqq14fjnqTx7L7OnTtjx44drOOwZNgzc3h4OJRKJT7//HPWUV6YJElYvHgxfv/9dxw/fpx1HKYMdmbm7QoO1lfE6AHDnZnDwsJgaWmJqVOnso7SJBYvXoy4uDgcOXKEdRRmDHJmbrzqOTw8HJ999hnrOE2G1VXkesIwZ+YlS5agTZs2mDhxIusoTeqbb77BgQMHkJSUxDoKEwY3M/O+U5Cfnx9qa2uRmprKOorcDG8TmI8//hgHDx7kdg83uffE0yOGVWZD2V1Trt1K9Qyfa+YrV67g5MmTDz2+aNEiODk5ITAwkEEq+YSFheH06dPYvXv3A49rNBrs2bOHUSoZNP1Nf9jbvn07SZJEw4cPp3PnzhERUUZGBikUCtq6dSvjdPIICAggDw8P0mg0pNFoKDo6mrp06ULGxsbN5sadz4nPW6dFRESQUqkkpVJJkiTR6NGjyd/f/94P1xA0vnhDQ0PJzc2NJEkihUJBACg/P591PF2I4XKZkZubC0mS0NDQACLCzp07kZiYCFtbW4M5mb20tBQODg5YtmwZsrKyQETQarUAgLy8PMbpdIPLMl+6dAn19fX3/l1fXw8iwtGjR+Hq6ooPP/yQ21KnpKTA29sbfn5+uHbtGoC/18qNlEqlKHNzkpOT88jH6+vrodFoEB0dDVdXV6xbt07mZLqj0WgwYsQI9O3bF8eOHQPw980y/02hUCA3N1fueLLgrswqlerejPQ49M9pk2PGjJEple4ZGRlh7ty5sLKyeuLz6uvrkZ2dLVMqeXFX5suXL4OecOhcqVSid+/e2L9/P6ytrWVMpnteXl5IS0uDjY3NY2+5RkTcXmbFXZmf9CtUqVTCz88PiYmJT53Bmit3d3ekpKTAzs4OxsbGj3xOYWHhE1/wzRWXZX7UD1GhUGDkyJHYtWsXzMzMGCSTj4uLC44dOwYHB4dHfi9UKhVKS0sZJNMt7sqcl5f30Fu4CoUCEyZMwJYtWx47W/GmU6dOSEtLg7Oz8yO/Zh6PaHBX5uzsbKjV6nv/VigUmDx5MtatW2dwN1a3t7dHamoqPDw8Hii0kZERl0c0uPvp3v/HjSRJmDVrFlavXm1IJ9w8wNbWFklJSejZs+e9QvN6rJmrMms0mge2el26dCm+/fZbhon0g7W1NQ4cOIA333wTSqUSarX6scfimzOuylxYWIiGhgZIkoQVK1Y0qx2KdM3S0hIJCQkYMmQIiAgXL15kHanJcVXmvLw8KJVKREVFcXVtX1MxMTFBbGwsRo8ejaKiItZxmhxXZS4qKkJ0dDSCgoJYR9FbxsbG2Lx5M0aNGoXKykrWcZoUV1ea3L17l/tjyE2FiKBWq3m6wTxfV5qIIj87SZJ4KjIAzpYZgmETZRa4IcoscEOUWeCGKLPADVFmgRuizAI3RJkFbogyC9wQZRa4IcoscEOUWeCGKLPADVFmgRuizAI3RJkFbogyC9wQZRa4IcoscEOUWeCGKLPADVFmgRuizAI3RJkFbogyC9wQZRa4IcoscEOUWeCGKLPADVFmgRuizAI3RJkFbogyC9wQZRa4IcoscEOUWeCGKLPADVFmgRuizAI3RJkFbogyC9wQZRa4IcoscEOUWeCGKLPADVFmgRuizAI3RJkFbigBxLIOIQhNIO3/u4oGcQFqHUsAAAAASUVORK5CYII="},8983:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOMAAAD7CAYAAACYCyO6AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dd3hUZcL+8e/UZJJJQgoJJEhiIwiIiEu1gBEEZEW6QCiCIFINSFjFtu/qvmKhgwpBVAw1gICUCOjPwiKguGChRANJBCG9TCaTqef3B8ZXigXMzDlz5vlcl5cwGXhuYO48pz5Hk5BwjYQgCHLL0sqdQBCE80QZBUEhRBkFQSH0cgcQlEOn0xETE0PDhjGEh0eg02kJDTWj1+uw2Ww4HA5qa2uprKyiqKiIiooKuSOriihjAAoODuaWW26hRYubSE5OplmzZiQlJRIdHY1Op/vTv4/dbufs2bPk5p7kxIkTnDhxgm+++Zbvv/8eSRLHBa+URhxNVT+tVsutt95KSsrddOrUiTZtbsFoNFJRUfFziXLIzc2lqKiIwsJCiotLqKiowOPxYLVacblcmEwmjEYjQUFBNGjQgEaN4oiNjSU+Pp5mzW6kWbNm3HjjjRgMBkpLSzl48CD79n3Orl27OXPmjNx/Bf4gS5RRxdq1+xv9+vWjR497iYuLIz8/n337Pmf//v3s33+g3kui1+tp0aIFHTt2oGPHjnTq1BGz2cw333zD9u072LBhI4WFhfU6poqIMqpNaGgoAwcOYMSI4TRv3pxjx46xY8dOdu7M5vjx4z7NYjAYuP322+nVqye9evUkPDycPXv2sHLlu3z66Wc+zeIHRBnVIjQ0lCFDHmTy5EmEh4eze/ceVq1axWef7ZU7GnC+mD163Etqaip33HE7x48fZ8GChWzfvkPsX54nyujvtFotw4enkp4+A73ewIoVK8jIWK7oI50339yKadOm0b17N44cOcJTTz3DkSNH5I4lN1FGf3bzza2YPftFWrZsyfLlb7J48RJFl/BirVq15LnnnqVDhw6sWrWaF1+cTVVVldyx5CIuh/NHGo2GiRMn8P77W6mtreXee3vywgv/9qsiAnz77XcMHjyEtLTp9OzZg127PuBvf7tN7liyEWX0MxEREWRmvsvMmem89NLLDBw4mJycHLljXTVJkti0aRP33NOdEydOsGFDFhMmPCp3LFnowsMj/il3COHPiY+PZ/36tTRu3Ihhw4azbdt2uSPVG5vNxpYtW6ipqWHWrCeJjY3l448/CaSDO0fFFTh+IikpiaysdVRWVtKnT1/OnTsnd6R6J0kSy5ZlUFBQwOLFi4iOjmbSpMm4XC65o/mE2Ez1A7GxsaxenUlhYSH9+w9UZRF/LTv7A1JTh5OScjezZ7+IRqORO5JPiM1UhTOZTGRlrQM0DBkyzO8O0lytM2fO8N13R3nyySfQarV8/vl+uSN521FRRoV7/vl/0a7d3+jfvz+FhUVyx/GpU6dOUVJSwlNPzWL//gOcPn1a7kjedFRspipY9+7dfj6h/w9Onw7Mi60zM1exc2c2CxfOJzw8XO44XiXKqFAGg4F//vM5Nm/ezI4dO7w2TlRUFEOHDmHlyrc5dSqX06cL6Nq16yXvCwkJYejQoaxfv5avvvqSU6dy2bv3U556ahZhYWav5QOYOfMfGI1GpkyZ7NVx5CaOpirUqFEjiYuL48UXX/LqOIsWLaBLly5/+L5x48aSnj7jgteSkpKYMOFRunXrRp8+D2CxWLySsbKykvnzF/L007N45513VLuVIGZGBdJqtYwbN5aVK9/lp59+8upYpaWlrF27jlGjHmLNmjW/+T6r1UpW1gZSU4fTrl0HmjVrTmrqcM6dO8eNN97AuHFjvZozMzOTkpISRo0a5dVx5CRmRgW68847SEhIYPXq1V4fa+rUtF9+fPfdd//m+5Yvf/OS1z755FP+/e8XWbRoAa1bt/ZKvjpOp5N169YzYsQIXnrpZVWeexQzowL16dOHQ4cO8cMPuXJH+UM//lgAQFlZmdfHWr9+PTEx0dx+e2evjyUHUUYF6tChvd/cfFt3sOe9997z+linT58hLy+Pdu3aeX0sOYgyKkxUVBSJiYkcOvSV3FH+UMuWLZkw4VE2b97is5uYv/zyELfdps47O0QZFaZJkwQ0Gg0nTyp7E7Vp02t4++0VHDt2jPT0mT4b9+TJk1xzTROfjedLoowKExkZBUB5ebnMSX5b06bXkJW1nqqqKoYPH4nNZvPZ2OXl5URGRvpsPF8SZVQYkykYAJutVuYkl5eYmMiGDVnYbLUMGTLU59fKWq01hISE+HRMXxFlVJiKikoAGjSIkDnJpa6//no2bsyitraWwYMfpLi4xOcZIiMbqPZieVFGhanbPI2KipY5yYWaNWvGhg1Z1NTUMGjQgxQVyXPRenR0tKI34f8KcdJfYU6dOoXdbqdVq1Y+WU5j+vRpTJ8+7YLXMjNX/vLjrl3v5ocfchkzZjQNG55/DsehQ19c8vvk5OSQktLN63lvvrkVx475dv1XXxEzo8I4HA6+/fbbgF6Y6bdoNBratm3LoUOH5I7iFWKpRgVKT5/B4MGD6NixM263W+44itGxY0c2bFj/y+JVKiOWalSidevW06hRI+688065oyjK0KFDOHLkiBqLCIjNVEUqKCjgwIEDXr8Twp80btyY3r3vY/Xq376zxN+JMirUK6/MoUuXu+jS5S65oyhCevoMiotLyMraIHcUrxFlVKgDBw6we/cennvuWYKCguSOI6u2bdsyYEB/XnrpZRwOh9xxvEaUUcGeeupp4uLiePrpWXJHkU1oaCgLFsxj7969bNmyRe44XiVWh1Mwi8XCmTNnmDVrFrm5uZw44b/L+F8NrVbLkiWLSEpKIjV1OFZrjdyRvEmsKK50W7Zs5dZbb2X+/HmUlZWxd+9/5I7kMy+88DwpKSkMG5Yqy6V3viY2U/3Av/71PNu3b2f58gw6d1bnXe6/ptFoeOaZp0lNHcakSZM5cOCg3JF8QpTRD3g8HqZNe5wPP/yIzMyVPPBAH7kjeY3BYGDRogWMGTOaxx6bRnb2B3JH8hmxz+gnPB4P2dnZhIeH88wzT2Mymfj88/14PB65o9WbJk0SePvtt2jXrj1jxjzMrl275I7kS2J5f38iSRKffPIpZ8+eZdq0NO65J4V9+z6nsrJS7mh/We/e97Fy5Tu4XE6GDx/Bf//7X7kj+ZpY3t8frV27jt69/05wcDAffribtLTHMBqNcse6KueX73iLpUvfYNu27dx339/9+uGvf4WYGf1UWVkZa9asxW63M2XKZAYNGkhFRSU5OTl+8YDR6Ohopk1LY/78eYCGRx+dyFtvva3K9VD/pKPirg0VaNy4MTNnptOvX1/y8/NZsuQ1tmzZit1ulzvaJeLj4xk9+iFGjhyBzWZj8eIlvP32O4FcwjpZoowqkpSUxNSpU+jXry9Wq5UNGzayevUa2Tf79Ho9Xbt2ITU1lZSUuykrK+ONN5aycuW7Pl3MSuFEGdWoYcMYHnzwQYYNG0bTptfwww+57Nixg+zsD/juu+98co+k2Wymc+dO9OrVi+7duxEREcF//rOPzMxMPvhgF06n0+sZ/Iwoo5pptVratfsbvXr1omfPnjRpkoDFYuHgwS84ePAg3377LcePn6CwsPAvjaPX67n22iSSk5Np27YtHTq0p2XLlmi1Wg4d+oqdO3eyc+dOfvxR1Q87/atEGQNJcnIynTp1ZNwXXxDV5S7CZp2/AL2iooKTJ09SVFTM2bM/UVJSSlWVBYfDjs1Wi8Nhx2w2o9PpMJvNmM1m4uPjadgwhoSEBK677joMBgMul4va2loOHDhIVlYWBw4cCIjL2OqJKGOgaeZ0sqfoHJOiotkbn0Dz5s1JTm5GUlISDRs2pFGjRjRsGENYWBhGo5GQkBAMBgNWqxWXy0V1dTXV1dWcO3fu5/Ke5YcfcsnJOUFOzvcsXryQ66+/nu7de6jqggQfEGUMNBllJVznctE9thHeqEqzZs3Ys2cXkyZN5v33t3lhBNUSa+AEkpudDnrabLwcHuGVIsL5JRu3bt1KevoM9HpxU9CVEGUMIDOqqvjGYGRXsMmr48yZM4+mTZvSt+8DXh1HbUQZA8QtDgcptednRW/vl5w6dYqNGzfx+OOPYzAYvDyaeogyBognqir50hjEx8HBPhlv3rx5NGoUx6BBg3wynhqIMgaA9g47d9preSXcdw/TOX36DGvWrOWxx6b47UXsvibKGABmVlWyNyiYfT5eZW7+/AVER0eTmjrMp+P6K1FGletSW0tHu5154eE+H7uoqIjMzFVMmTIZk8m7B43UQJRR5WZYKvkoOJgDRnnWXl20aDEhISGMGjVSlvH9iSijit1ba6ONw8HcMPkevFpaWsrKle8yceIEzGazbDn8gSijSmmAx6sqyTaZOCzzAZTXX38Dg8HImDGjZc2hdKKMKtXbVsNNTifzZJwV65SXl5ORkcGjj44nIkL+PEolyqhCOmB6VRVbTSEcVchJ94yM5Xg8HvFkrd8hyqhCfWusXO9yMl+GI6i/xWKxsHTpMsaNG0tMTLTccRRJlFFldMBUSxUbQ0L5Qa+MWbHOm2+uoKbGxiOPPCJ3FEUSZVSZwVYriW4388OUMyvWqamp4fXXX2fMmNHExcXJHUdxRBlVxCBJTLFUsTYklAKF3r70zjsrKS8vZ+LECXJHURxRRhVJrbHSyONmoQJnxTp2u50lS15jxIjhxMfHyx1HUUQZVSJIkphkqeLdUDM/6XRyx/ldq1at5ty5QqZOnSJ3FEURZVSJUdZqIj0eXjOHyR3lDzmdThYtWsyQIQ/StGlTueMohiijCoRIEhMsFlaEmilU+KxYZ/369eTn55OW9pjcURRDlFEFHq62ECJ5WBam/FmxjtvtZuHCRQwY0J8bbrhe7jiKIMro58I8HsZXW8gwh1Gi9Y9Zsc7mzVvIzT1JWlqa3FEUQZTRz42rtqAFMvxgX/FibrebuXPn0qfP/bRo0ULuOLITZfRjER4PY63VvGEOo1Lrn/+U27fv4NixY0yfLmZH//wXFACYVG3BBazww1mxjiRJzJkzlx49etCmTRu548hKlNFPRXs8jKy28FpYONUajdxx/pJdu3Zz+PDhgJ8dRRn91BRLFTatlndC1XH3/KuvziUlJYUOHdrLHUU2oox+KNbtZri1moXmcGx+PivW+eSTT9i/fz/Tpk2TO4psRBn9UJqlilKtllWhoXJHqVcvv/wKd9xxO507d5Y7iixEGf1ME7eLoTVWFoRF4FDJrFjn4MEv+OyzvcycmS53FFmIMvqZtKoqzml1ZIWEyB3FK2bPfonbbmtL165d5Y7ic6KMfuRal4uBNVbmhIfjVNmsWOfIkSN89NH/Y+bMdDQq/TP+FlFGBWrsdtPa6bjk9cctlRTo9WwOUde+4sVmz36JVq1acu+93S94XafT0a3bPTKl8j5RRgVq43CwvaiQ5WUlNHc6gfOP/+5TU8Or4RG4ZM7nbceOHSM7O5uZM9PRarVotVruv//v7Nmzm4yMZej85M6UK6XMtRkCXJLbRaVWS1OXi11F59hqCiFS8vC9wcA2kzr3FS/26qtz2bNnF7NmPUmXLneRnJzMwYMHufHGG0hIiKeg4Ee5I9Y7MTMqUJLLxVGDgR6xjXg4OoZmLid31dZS/nNBA0FcXCxnz55l/PhHOHPmJ3r16s348efXzUlMTJQ5nXeIMipQkstFnl6PBOwONtEzthEToqKJdbv5uOgcC8rLVFvK9u3bkZW1jjVrVnPy5Cl6976fhx4azXfffUdpaSkWi0WUUfCdRJeLPN3/7UF4gG2mEFLiGvNkg0g622v5uOgcqdZq+ULWM51Ox4oVb7Jp00Y8Hok+ffoydOgwvv766wved+pUHklJSfKE9DJRRoUxShLxbhf5l1lq0QV8YzBglCQOG4xsVdH+o9vtZsmS16iqqsLtdnP8+PHLvi8/P1+UUfCNpm4XWiDvMquB3+JwsLakmByDgRExDbH46T2Mv+XQoUP07duf5s2TycpaR4MGDS55T15eHklJYjNV8IGkn/cFL54ZO9ntrCsp4ktjEMOjG2JV6QnxnJwcBg16kNjYWNauXUN09IXP5cjPzycxMVGVFwSIMipMkstFsVZ3wT2K99TayCwt5sNgE2OjorGr8IP4a7m5ufTr1x+zOZSNGzfQuHHjX76Wl5ePyWQiNjZWxoTeIcqoMIk/H0mt08dWw5tlpWwICWVKVDQulRexzunTZ+jXbwAul5NNmzb+cgQ1Ly8PQJWbqqKMCpP0q4M3A2qsLCwrJTMklCcaROKROZuvFRcXM3DgYEpLS3jvvY0kJydTWFiIzWZT5UEcUUaFSXKdL+ND1mrmlZexLCycpxtEIskdTCYVFRUMHZpKfn4B69atoUWLFhQUFKjyXKO4HK4e6YAYt5uGHjfhHgkdEqEeCT0SNo0Gh0ZDrUZDpUZLkU5HxUVHQ3VAE7ebbrU2WjscvBDRgKV+vNhUfbFYLKSmDmfFijdZv34tZWVlqpwZRRmvQrAkcYvDQQuXk2Snk2ZOJ0luF9FuN1dyCbNdo+GsTkeu3sAJg4ESrRaDJNHa4eDZiEjeMqtjfZv6UFNTw4gRI3nttcX06tULi8Uid6R6p0lIuCZQt4D+NC1wq8NBSq2NTnY7bZwOjJJEhVbLCYOBE3oDuXo9RTodhTodxdrzs54HsGq1uACTJGGUJIIkiQYeD408bmLdbuLdbpq5zhe6mcuFXpKo1mj4LDiYfUHB7Ao2cUaldylcDb1ez4IF87n77q60aNFK7jj1KUuU8Xe0c9jpV1NDj1obcW43+Xo9+4xB7A8KYn9QcL2XJLXGSrjbg1sDHe12OjnsmD0evjEa2R5sYkNIqN882MabdDods2f/L//7v7MpLy+XO059EWW8WKgkMbDGyghrNc2dTo4ZDOwwhbAz2MRxw6VXxdSnIEm64ByiQZK43W6nV62NXrYawj0e9phMrAw182lQsFezKJ1Go8FgMOBwXHoTtp8SZawTKkkMsVYzudpCuMfD7mATq0JD+UwhH3qDJNGj1kaq1cod9lqOGwwsCAtnuykkYI+0qowooxYYbq0mvaoSvQQrzGYyzGGXHOlUkpudDqZVVdG91sYRo5GnIiI5YjTKHUv4awK7jDc7HcyuKKel08nyUDOLw8IVXcKLtXI6eK6ygg52O6tCzbwYHkGVH+UXLpAVkP9yGmBitYX3i4uo1Wi4t2EcL0Q08KsiAnxrMDI4Jpa0yGh61trYVVTI3xx2uWMJV8m/Pn31IMLjIbOkmJlVlbwUHsHAmFhyvHxgxpskYFNICPfENuKEwcCG4iImVKvvHFwgCKiT/vFuN5mlxZg9Hh6IiVXVflaZVstD0TGMq7bwVGUF17hcPNMgErfcwYQ/LWDKmORykVVSRKVWS5+GcZxT4fk6CVhmDqNAr2dxWSnRHg+ToqJVv7SjWgTEZmqs283q0mIKdTr6x8Sqsoi/lh1sIjWmISm1NmaXlxEYN135P9WX0SRJZJYW40DDyOiGAXO08YAxiPFRMQy01TCtqlLuOMKfoPpP5rOVFSS43QyPiaEsQIpY56PgYJ6OaECapYpOdnGUVelU/ensXms7f0K/QRSndQGze3yBzFAzO00hLCwvJdwTaLcn+xfVnvQ3SBIfF53jK6ORKZHRf/wL6klUVBRff334sl+zWCzcdFNLn2WpE+Hx8GnhWdaHhPLviEtXXBMUQb0n/UdZq4lzu3kxXHz4KrVa5odFMMZaTRO3OLaqVKosoxYYV21hZaiZn2Q6cpqVtYEmTZpe8J8cs2KdzNBQSrRaRlWrZxVytVFlGe+015LgdrNaZc+8/yucGg3rQkIZWFODXlLlnonfU2UZ+9TUcMho5IfLrModyNaHhhLjcXO7uH5VkVRZxg4Ou+w3395xx+0cOvQFp07l8tlnnzBr1pOYZV7T5rROT55eTztxmkORVFfGKI+HRJeLQ8YgWXM0btyYuLg4DAYD1157LRMnTmDz5k2EhclbyC+NQdymnrvjVUV1ZWzidqEBThrkOa8oSRLZ2dn07duP5s1bcOutbZk0aTLnzp2jefPmPProo7LkqnNSr+cacURVkVRXxkj3+RPb5TJdbVNeXs7YsY/w5ZeHqK6upri4hC1btjJp0mQAunfvJkuuX/JptUSKk/+KpLoymn5eEcamsMujv/rqv0iSRExMjKw5rBotIeJoqiKprowVmvN/pAaSsr77t27dGo1GQ3Fxsaw5Ij1uv1vRIFCo7oLNus3TKLeHEq3vT/g///z/UFJSyu7de8jPzycoKIj27dvz3HPPAvDBB7t8nunXoj0e2Tbhhd+nujKe0uuxazS0cjplWU4jLi6O0aNHk54+45Kvff3117zxxlKfZ/q1m50Ojonzr4qkCw+P+KfcIeqTW6PhnlobBuDDYJPPx//iiy9xu92YzaEEB58/15mbm8vbb79Devo/sNlsPs9URwM8X1nBppAQ/ivzqR/hEkdVeddGelUlg2usdGwUL9aA+ZWOdjsbSop+WbxKUBR13rWxLiSURm43d9bWyh1FUYbWWDliNIoiKpQqy1ig13MgKIhxYsnCXzR2u+ltq2F1iLh4XqlUWUaAV8Ii6GKvpYtdzI5wftO9WKsjS5RRsVRbxgNBQewONvFcZQVBAX6Su63DwYAaKy+FR+DQKOtiCOH/qLaMAE81iCTO7ebpqgq5o8gmVJJYUF7K3uBgtoSEyB1H+B2qLuNPOh2zGkTyUHU1fWw1csfxOS0wv7wUsySRFhklHh2ncKo76X+xLaYQbjU7mF9eRplWy16FPG/RF16oKCeltpZhMQ0pluFqJOHKqHpmrPOviAZsN5lYXlpC5wC4sVYDPFNZQaq1mklR0RwQJ/j9QkCU0QNMaxDFh8EmMkuLeUDFm6wGSWJReSljrNU8FhlNtgxXIQlXR3WXw/0Wj0ZDtimEcI+HZyorMAGfG4PwqOjoYhO3i7dLS2lndzAmOoZdJlFEP3I0IGbGOh7Ob7KmR0bxULWFTSVFJLrUcdd7b1sNHxQVEi55eKBhLJ8F0L6xWgRUGeusDQmld2wcwZLEh0XnSLNUYfTTc5FN3S7eLi1haVkp20wh3Ncwzq8f/hrIAmYz9WJlWh1rQkKxa7VMsVQxyFZDhVZHjsHgF6cAoj0eplmqmF9eBsCjUTG8ZTbjUtFmd4BR510bV6qx283Mqkr61VjJ1+tZEhbOFlMIdgV+sOPdbkZXWxhprcam0bA4LJy3Q0UJVSBLlPFXklwuplqq6GerwarRsCEklNUhobJv9uklia72WlKtVlJqbZTpdLxhDmNlqBmbKKFaiDJeTkOPmwetVoZZrTR1u/hBb2CHyUR2sInvjEaf3CNpliQ622vpZbPRvdZGhMfDf4KCyQwN5YNgE05RQrURZfw9WqCdw04vm42eNhtN3C4sWi0HjUEcNBr51mjkuN5A4V98uI4euNblJNnppK3DQQeHnZYOB1rgkDGInSYTO00mfgzQZ0wGCFHGK5HsdNLJYWfc3DlEHTlC2IIFAFRotZzU6ynS6jir11Gi1VGl0eLQgO3n/5slCZ0kYZYkzB4P8W43DT1uEtxurnO5MEgSLoOB2vfe48C775K1ew8HgoLEZWyBI0t8q70CJwwGpJYt+deoUUyaNJm9jRNo7nSS7HKS5HLR0O2mhcNJQ08tYZKEUZIIkSQMkoRVo8Gl0VCt0VCt1XJOp6NIq+Nbw/kH9OQY9OToDSzWaLj+f/6HHfv24xGLDQcUMTNeoYyMpVx33XV0797DK2Vp1qwZe/bsYtKkybz//rZ6//0FxVLnGjjecvPNrejZsycvv/yK12atnJwctm7dSnr6DPR6seESSEQZr8CMGTP45ptv2bVrt1fHmTNnHk2bNqVv3we8Oo6gLKKMf9Itt9xCSsrdvPzyK0hevnTu1KlTbNy4iccffxyDuLQtYIgy/klPPPEPvvzyEB9//LFPxps3bx6NGsUxaNAgn4wnyE+U8U9o374dd955B6+88qrPxjx9+gxr1qzlscemYDQafTauIB9Rxj9h5sx09u79D/v27fPpuPPnLyA6OprU1GE+HVeQhyjjH+jSpQsdO3Zk3rx5Ph+7qKiIzMxVTJkyGZO4UVj1RBn/wIwZ0/noo484cOCgLOMvWrSYkJAQRo0aKcv4gu+IMv6Oe+/tTps2bZg7d75sGUpLS1m58l0mTpyA2WyWLYfgfaKMv0Gj0fD449PJzs7m8OHDsmZ5/fU3MBiMjBkzWtYcgneJMv6G3r3v46abbmLevAVyR6G8vJyMjAwefXQ8ERERcscRvESU8TJ0Oh3Tp09n69b3OXr0qNxxAMjIWI7H42HcuLFyRxG8RJTxMvr2fYDrr7+O+fPl21e8mMViYenSZYwbN5aYmGi54wheIMp4EZ1Ox9SpU9i4cRM//JArd5wLvPnmCmpqbDzyyCNyRxG8QJTxIoMHDyYxMZH58+XfV7xYTU0Nr7/+OmPGjCYuLk7uOEI9E2X8FYPBwJQpk1m7dh0FBQVyx7msd95ZSXl5ORMnTpA7ilDPRBl/JTV1GI0axbFw4SK5o/wmu93OkiWvMWLEcOLj4+WOI9QjUcafBQUFMWnSRN59N5OffvpJ7ji/a9Wq1Zw7V8jUqVPkjiLUI1HGn40aNZLIyEhee+11uaP8IafTyaJFixky5EGaNm0qdxyhnogyAiEhIUyYMIEVK96isLBQ7jh/yvr168nPzyct7TG5owj1RJQRePjhMYSEmFi2bJncUf40t9vNwoWLGDCgPzfccL3ccYR6EPBlDAsLY/z4R8jIWE5JSancca7I5s1byM09SVpamtxRhHoQ8GUcN24sWq2WjIzlcke5Ym63m7lz59Knz/20aNFC7jjCXxTQZYyIiGDs2Id5442lVFZWyh3nqmzfvoNjx44xfbqYHf1dQJdx0qSJuFwuVqx4S+4oV02SJObMmUuPHj1o06aN3HGEvyBgyxgdHc3IkSN47bXXqa6uljvOX7Jr124OHz4sZkc/F7BlnDJlMjabjXfeWSl3lHrx6qtzSSZE5YUAAAWpSURBVElJoUOH9nJHEa5SQJYxNjaW4cNTWbhwMTabTe449eKTTz5h//79TJs2Te4owlUKyDKmpT1GaWkpq1atkjtKvXr55Ve4447b6dy5s9xRhKsQcGVs0iSBoUOHsGDBIhwOh9xx6tXBg1/w2Wd7mTkzXe4owlUIuDKmpaVx7lwhWVlZckfxitmzX+K229rStWtXuaMIVyigynjttdcycOAA5syZg9PplDuOVxw5coSPPvp/zJyZjkajkTuOcAVUWcbGjRvTuvXNl7z++OPTKCgoYPPmLTKk8p3Zs1+iVauW3Htv9wte1+l0dOt2j0yphD+iyjK2adOG7du3sXz5Mpo3bw6cfyJwnz59ePXVObhcLpkTetexY8fIzs5m5sx0tFotWq2W++//O3v27CYjYxk6nU7uiMJlqPLRuElJiVRWVtK0aVN27cpm69b3iYxswPfff8+2bdvljucTr746lz17djFr1pN06XIXycnJHDx4kBtvvIGEhHgKCn6UO6JwEVXOjElJSRw9epQePXrx8MNjadbsRu666y7Ky8sD5mbcuLhYzp49y/jxj3DmzE/06tWb8ePPr5uTmJgoczrhclRbxry8PCRJYvfuPfTseR8TJkwkNjaWjz/+iAUL5qu2lO3btyMrax1r1qzm5MlT9O59Pw89NJrvvvuO0tJSLBaLKKNCqbKMiYmJ5OXl//Jzj8fDtm3bSUnpxpNPzqJz5058/PFHqnruoU6nY8WKN9m0aSMej0SfPn0ZOnQYX3/99QXvO3Uqj6SkJHlCCr9LdWU0Go3ExzcmPz//kq+5XC6++eYbjEYjhw8fYevW92VI6B1ut5slS16jqqoKt9vN8ePHL/u+/Px8UUaFUl0Zmza9Bq1We8HMWOeWW25h7do15OTkMGLESCwWiwwJvefQoUP07duf5s2TycpaR4MGDS55T15eHklJYjNViVRXxrrv+hfPjJ06dWLdujV8+eUhhg8fidVqlSGd9+Xk5DBo0IPExsaydu0aoqMvfC5Hfn4+iYmJ4oIABVJlGYuLSy64R/Gee1LIzFzJhx9+xNix47Db7TIm9L7c3Fz69euP2RzKxo0baNy48S9fy8vLx2QyERsbK2NC4XJUV8bzB2/yfvl5nz738+aby9mwYSNTpkxV/Qn/OqdPn6FfvwG4XE42bdr4yxHUur8bsamqPKorY1JS4i+bqAMG9GfhwgVkZq7iiSeexOPxyJzOt4qLixk4cDClpSW8995GkpOTKSwsxGaziYM4CqTCMiaRn5/PQw+NYt68uSxblsHTTz+DJElyR5NFRUUFQ4emkp9fwLp1a2jRogUFBQXiXKMCqepyOJ1OR5MmTejW7R5at27NCy/8m6VL/WdhYm+xWCykpg5nxYo3Wb9+LWVlZWJmVCBVzYwJCQkYDAZat27Ns8/+UxTxV2pqahgxYiT79u3j2muvFfuMCqSqMiYlJeJyuZg6NY233vLf5Re9xel0MmHCJLZs2SpmRgVSVRkTEhKYMGES7733ntxRFOv8N6vH2L59O5GRkXLHEX5Fk5BwjWqObAQFBan+HGJ90Wg0GAwG1a0D5MeyVDUziiL+eZIkiSIqjKrKKAj+TJRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEIPZMkdQhAE9v9/Cq8iB0C/dl8AAAAASUVORK5CYII="},6850:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOMAAAD7CAYAAACYCyO6AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3de1yUVf4H8M8MAwOCouAFIdcEFVYQf1JuYopYYZl3WczVktVt85K1ixfypVleig21xcT8+fNauYmoQd5Q8oIoJIqXVAi5KmJcREJBbgMz5/fHWUwTDY15zjPPfN+v17xccfJ8dPl4nnku56gYYwyEENF2qkUnIIRwVEZCZILKSIhMaEQHIPKh1+tRUlKCkpIS3Lp1C3q9HpWVlWhoaECrVq2g1WphY2ODtm3bonPnznBwcBAdWVGojGaopqYGqampuHjxItLS0pCeno7c3FzcuHEDer2+2b+PtbU1nnrqKbi7u8PLywuenp7w8fFBr169oFKpjPgnUCYVnU1VPoPBgFOnTiEuLg7Hjh1Damoq6urq4ODgcLdE7u7u6Ny5M5ydndGpUyc4ODhArVajdevW0Gg0qK6uRl1dHWpra/Hzzz+jsLAQRUVFKCgowI8//oj09HRkZGRAp9OhQ4cOGDRoEIYMGYJRo0bhD3/4g+i/AlOwk8qoYMnJyfj666+xe/duFBYWws3NDf7+/hg8eDAGDx7c4iVpaGjADz/8gOPHjyMxMRGJiYmoqKjAM888g8DAQEyePBnOzs4tOqaCUBmV5s6dO/jqq6+wbt06XLp0Cd7e3ggMDMTYsWPRu3dvSbPodDocPXoUsbGxiImJwa1btzBy5EjMmDEDAQEBkmYxATvBiCJUVlayVatWMScnJ2Ztbc2CgoLYoUOHRMe6q66uju3YsYO99NJLTKVSMW9vb7Zjxw5mMBhER5OLHVRGE6fX69natWuZo6Mja9OmDXv//fdZWVmZ6FiPdPbsWTZq1CimUqnYn/70J3b69GnRkeSAymjKzp49y/r168csLS3Z3LlzZV/CXzt37hzz9/dnarWaTZ8+nZWXl4uOJBKV0RQZDAYWHh7OLC0tmZ+fH0tLSxMd6YkZDAa2detW5uTkxLp27cqSk5NFRxKFymhqfv75ZzZ06FBmaWnJli9frpjPXKWlpWz48OFMo9Gw5cuXi44jwg666G9CCgoKMGzYMFRUVCA5ORn9+vUTHanFtG/fHnv37kVERARCQ0Nx5coVREZGwsLCQnQ0yVAZTUROTg6GDBmCdu3a4eTJk3BxcREdqcWpVCrMnj0brq6umDhxIkpLSxEVFQWNxjy+TelGcRNQVFSEl19+Gc7Ozjh+/Lgii3ivMWPGID4+HnFxcZg2bRqYmVwKpzLKXHV1NYYNGwYrKyvs378fbdu2FR1JEoMGDcLOnTuxdetWLFmyRHQcSVAZZW7OnDm4du0aDh48iPbt24uOI6lXX30VkZGRWLZsGY4dOyY6jtHR7XAytnfvXowePRo7d+5EYGCg6DjCBAUFISUlBZcuXVLykQEtuyFXOp0OISEhmDhxolGLePPmTWzatAnDhw+HVquFSqXCwYMHH3hfVVUVNm7ciBdeeAHOzs7QarXo0aMHQkNDUVFRYbR8ALB+/XrU1dUhLCzMqOMIJ/jaCnmIiIgIZmNjw65du2bUcV5++WUG4L7XgQMHHnjfsmXLHnhf4+uPf/wju3XrllFzrl69mllbW7OrV68adRyBdtDMKEMGgwERERGYMWMGunTpYtSxOnTogKlTp2Lfvn148803H/o+Ozs7BAcHIz4+HgUFBbhz5w7i4+Ph4uKCjIwMrFq1yqg5p02bho4dO+Lzzz836jhCif7ngDwoPj6eAWAZGRmSjvv2228/dGZ8mP/85z8MABsxYoQRk3Effvgh69SpE9PpdEYfSwCaGeVo+/bt8PX1hYeHh+gov6lbt24AIMmZ3ilTpuDGjRtISEgw+lgiUBll6MSJEybz8G3jyZ5JkyYZfayuXbuie/fuSEpKMvpYIlAZZebmzZvIzc2Fr6+v6Ci/6YcffsCKFSvwl7/8BS+99JIkYw4YMAAnT56UZCypURllJj8/H4wxuLu7i47ySFeuXMHIkSPh7e2NjRs3SjZuz549cfXqVcnGkxKVUWZu3rwJAHB0dBSc5OGuXLkCf39/tG3bFgcOHECrVq0kG9vR0RFlZWWSjSclKqPM1NTUAABsbGwEJ2labm4uBg8ejFatWuHw4cOSL2RsZ2eHqqoqSceUCpVRZtq1awcAKC8vF5zkQZmZmRg8eDBsbGxw9OhRdOrUSfIMZWVlil3JnMooM42Hp6WlpYKT3C89PR2DBw+Gra0tEhIS0LlzZyE5SktLZX0I/3tQGWWmR48esLa2xvnz5yUZb/HixVCpVFCpVHfvbhk2bNjdr12+fBkAEBkZiZKSEmRlZcHFxeXurze+vLy8JMl77tw5ydd/lQqVUWa0Wi369u2L77//XnQU2WGMISUlxSQu+zwJeoRKhhYtWoQvvvgCV69eNas1YH5LYmIi/P39cenSJclmYgnRI1RyNGXKFPz00084dOiQ6CiysmnTJvTr10+JRQRAh6my5OrqCj8/P0RERIiOIhvXr1/Hrl27Hvlkiamjw1SZOn78OAYPHoz4+HgMHTpUdBzhpkyZgmPHjuHy5cvQarWi4xgD7UIlZ6NGjUJeXh7OnDkDa2tr0XGESUlJwcCBA/HVV19h4sSJouMYC5VRzgoKCtCnTx+8/vrrWL16teg4Qty5cwc+Pj5wdXXFgQMHlLwjMp3AkbMuXbpg7dq1WLNmDaKjo0XHkZzBYEBwcDAqKyvx5ZdfKrmIAGhFcdmbMGECTp06heDgYLRv3x4vvvii6EiSmTVrFuLi4vDdd98JufVOcqLWGCDNp9fr2aRJk1jr1q3Z0aNHRccxOoPBwObMmcMsLCxYbGys6DhSoV2oTIVOp2MTJkxgWq2WRUVFiY5jNHV1dWzixInMysqKff3116LjSInKaEr0ej2bPXs2U6lU7L333lPcwkxXr15lAwYMYG3atJHVFugSoQWpTIlarcann36KjRs3Ys2aNfDz80Nubq7oWC1i165d6Nu3L27fvo3vv/9esmU85ITKaIKmTp2K1NRU1NTUoHfv3li2bBnq6upEx3oijct3BAUFISgoCKmpqfD09BQdSwzRczN5cjqdji1fvpzZ2dmx7t27s61bt7KGhgbRsZrlxo0b7L333mM2NjasV69eLCEhQXQk0egzoxIUFBSw4OBgptFomLu7O9uyZQurqakRHatJ165dY/PmzWN2dnasY8eOLCIiQnGffZ8QlVFJsrOz2V//+ldmZWXFHBwc2D//+U+WlpYmOhbT6XRs7969bOTIkczCwoI5OTmxlStXsqqqKtHR5GQH3Q6nQCUlJdi8eTM2bNiAK1euwMPDA4GBgRgzZgz69u0ryTOSlZWVSEhIQExMDPbu3Yvy8nK88MILmDZtGkaPHg0rKyujZzAxdG+qkhkMBiQnJyMmJgaxsbHIz8+Hvb09Bg4ciIEDB8LHxwdeXl5wdnb+XeM0NDQgOzsbaWlpSElJwYkTJ3D+/HkYDAb4+vpi3LhxGDduHJ5++umW+YMpE5XRnKSlpSExMREe//43jpWV4aPbtwEADg4O6NmzJ5ycnNClSxd07NgR9vb20Gq1aNWqFbRaLSorK9HQ0IDKykpUVFSgoKAAJSUluHbtGrKysqDT6aDRaGBjYwM/Pz8EBwfDz8/PPG5jaxlURrOTng54ewNRUSh78UVcunQJ6enpyMnJQXFxMX766SeUlJSgoqICdXV1qKqqgk6ng52dHSwtLdG6dWu0adMGLi4ucHJywlNPPQUPDw94enqiV69emDRpEjIzM3HhwgWo1XTl7DFQGc1OYCCQlQVcuAAYoSzp6enw9vZGVFQUxo8f3+K/v4JRGc3KuXPAs88CsbHA6NFGG2bSpEk4c+YM0tPTodHQg0HNRGU0KyNGAMXFQGoqYMRnA7Ozs9GrVy9s2rQJkydPNto4CkNlNBupqcBzzwFxccArrxh9uKlTpyIhIQGZmZl0GaN5qIxmIyAAqKkBJNpoND8/Hz179sSaNWvw97//XZIxTRyV0SwkJQGDBgFHjwJDhkg27MyZM7F//35kZWUpdUW3lkRlNAv+/oBGAxw+LOmwRUVFcHNzw/LlyzFr1ixJxzZBtCCV4sXHA4mJwIcfSj50586dMW3aNISFhaG6ulry8U0NlVHpPvwQePVVfpgqwIIFC3Dnzh2sXbtWyPimhMqoZHv2AKdPC5kVG3Xo0AEzZ85EeHg4KisrheUwBVRGpWKMl3DsWOBPfxIaZd68edDpdGa7EHNzURmVatcu4OJF4IMPRCeBo6MjQkJCsHLlSllujy4XVEYl0uuBxYuB114D+vQRnQYAEBISArVaTTtrPQKVUYm2bQMyM2UxKzayt7fHnDlzEBERgRs3boiOI0tURqXR64GPPwbeeAPw8BCd5j7/+Mc/YGtri08//VR0FFmiMirNli1AXh6waJHoJA+wtbVFaGgoIiMjUVhYKDqO7NAdOEqi0/HZcOhQYN060WmaVFtbix49eiAwMBCrVq0SHUdO6A4cRdmwASgsBBYuFJ3koaytrTF//nysW7cOBQUFouPICs2MSlFbC/TowZ/kl/mMo9Pp4OHhgaFDh2KdTGdwAWhmVIy1a4GyMiA0VHSS32RlZYUFCxZg8+bNyMvLEx1HNmhmVIKqKsDNDQgOBsLDRadpFr1eD09PT/j6+mLLli2i48gBzYyK8NlnvJBz5ohO0mwWFhZYuHAhtm7disuXL4uOIws0M5q627cBV1fg7beBpUtFp3kser0e3t7e6NOnD7Zt2yY6jmg0M5q8iAjAYABCQkQneWwWFhZYvHgxoqOjceHCBdFxhKOZ0ZSVl/NZce5cWV/OeBTGGHx8fNCtWzfExMSIjiMSzYwmLTycL6fx7ruikzwxlUqFJUuW4Ntvv8Xp06dFxxGKZkZTVVrKz6B+8AGfGU1c//794ejoiP3794uOIgrNjCYrLAywtQVmzhSdpEUsWbIEcXFxOHHihOgowtDMaIqKivisGB4OvPOO6DQtxt/fHxqNBoclXsVOJmhmNEnLlgEdOgBvvSU6SYv66KOPcOTIESQkJIiOIgTNjKYmPx/o2RNYswZQ4ErdAQEBqK6uRnJysugoUqOZ0eQsXQo4O/Nb3xQoLCwMJ0+exMGDB0VHkRzNjKYkOxvo1QvYtAlQ8O5OI0aMQHFxMVJTU6Ey4m5ZMkMzoyxdvw6cPfvg1xcv5hf5J06UPJKUwsLCcP78eezZs+e+r+v1euzbt09QKuOjMsrR6dNAv358Q9NLl/jX0tOB7dv5YarCNyD19vbG2LFj8f7778NgMMBgMGDHjh3w8PDAuHHjoNfrRUc0CjpMlaMVK4AFC/j/1uuBoCDg1i3+FL+Rtv+Wm8btyGfPno24uDhkZGRApVLBYDAgLy8P3bp1Ex2xpdFhqizl5PCdhRsa+MrgsbHAoUOAgwNfbMoMFBUVwdnZGStXrkRmZiYYYzAYDACA3NxcwemMg8ooR5cvA/X1v/y8vp6X8uRJvuDUG28otpRJSUkYOHAgAgICUFxcDAD3HZZqNBoqI5FQdnbTX6+v54et0dG8lOvXS5vLiPR6PUaPHo1Bgwbh1KlTAICGhoYH3qdWq5GTkyN1PElQGeWmrg7474zwUIwBPj58+X6FsLCwwPz582FnZ/fI99XX1yMrK0uiVNKiMsrNlSu8bA+j0QD9+/NdiO3tpcslAV9fX6SkpKBt27bQPOSMMWNMsct0UBnl5lGHYBoNEBDAT+b8xgxiqjw9PZGUlARHR0dYWlo2+Z78/Hwo8SIAlVFucnKApr4J1Wpg3Dhg927A2lr6XBJyd3fHqVOn4Ozs3GQh6+rqUFRUJCCZcVEZ5SY3l1/WuJdaDUydCkRFNV1UBeratStSUlLg5ubWZCGVeEaVyig3WVl8z4xGajUwfTo/c2oGF/vv5eTkhOTkZHh5ed1XSAsLC0WeUTWv/3dNwb0nJ1QqYN484PPPH5wtzYSDgwMSEhLg4+Nzt5BKvdao7JscpabXAyUl/HXrFv95ZSW/k6ZVK0CrBWxsgLZtgc6d+R01v/7v790qbcUKk1qY2Fjs7e1x5MgRjBgxAklJSdDpdMh+2LVYE0ZlfBI1NUBqKnDxIpCWxm/izs0FbtzghWoua2vgqacAd3fAy4s/vd/QwGfBzz5T1JIav5etrS3i4+Mxfvx47N69GxkZGaIjtTi6Ubw5DAbg1CkgLg44dowXsa6Oz2xeXoCnJy9U5878wd9OnfivqdVA69b8kkR1Nf9vamuBn3/mM2BREVBQAPz4Iy90ejovY5s2wEsvAUOGAKNGAX/4g+i/Admor6/H66+/jvj4eNy6dUt0nJa0k8r4KMnJwNdf88sJhYV8ESh/f2DwYP5q6ZJs2MAPby0sgMRE/qqoAJ55hm/1NnkyL7uZ0+v1mD59Oj755BM4OjqKjtNSqIwPuHMH+OorvvPvpUuAtzcvwtixQO/exh27tvb+a4g6HXD0KH9qIyaGF3XkSGDGDH7x34wxxqDT6aDVakVHaSlUxrvu3OHLWXzyyS/f9G+9xQ8X5UCn4zP0+vXAkSP8H4b33wf+/GezPdOqMPQ8IwwG4H//F3j6ab4695tvAj/9BOzYIZ8iAoCVFX/I+NAh4MwZnve11/h9qqmpotORFmDeZTx3jn8z/+MfwJQp/CbtZcsevOQgNz4+fJY8e5ZfMunfnx+6KuuEhtkxzzIyBixfzr+JbWyA8+f5NT25l/DX+vblnym//BL49lvgf/4H+P570anIEzK/MpaXA6+8wj9vffwxv1Th6Sk61ZNTqYDXX+cnm7y8+FneFStEpyJPwLwu+hcUAMOG8csFycl8BTalaN8e2LuXb54aGsoPuSMj+WUSYhLMp4w5Ofwiert2fC0ZFxfRiVqeSgXMnv3L2qqlpfxJD4Uv7agU5nGYWlQEvPwyv2B+/Lgyi3ivMWOA+Hh+x9C0aY9eOYDIhvLLWF3ND02trID9+/lN2uZg0CBg505g61ZgyRLRaUgzKL+Mc+YA164BBw/yz1Xm5NVX+efGZcv4iSoia8q+A2fvXr5E/s6d/JY2cxUUBKSk8DOu5nJkYHoUfAeOTgeEhPATGRIW8ebNm1CpVE2+2ooqwvr1/ImRsDAx45NmUW4Z167lT1r861+ik4jXrh2waBE/ZM3PF52GPIQyy2gw8OttM2YAXboIiRAcHAzG2H0voc/fTZsGdOzIl/AgsqTMMh4+zE/aKHCb7SdmZcXvv/3qq/v38SCyocwybt8O+Pry/SjIL6ZM4UuDJCSITkKaoMwynjgh/OHbI0eOwMXFBVqtFj179sT8+fNRWVkpNBO6dgW6dweSksTmIE1SXhlv3uSLQ/n6Co1x/fp1FBYW3l3JLDw8HM8//zwqKiqE5sKAAfx2QCI7yitjfj6//cvdXcjwKpUKY8eORXJyMioqKlBcXIyoqCi4uLjg0qVLWCH6iYqePYGrV8VmIE1SXhlv3uQ/ClqoyNHRETExMRgwYABat26NTp06YcKECYiKigIA7N27V0iuewICZWViM5AmKa+MNTX8RxsbsTl+5bnnnoNKpcKNGzfEBrGzA6qqxGYgTVJeGdu14z+Wl4vN8Stnz54FYwydOnUSG6SszPRWNDATynvQrfHwtLSUX+SW2LvvvouOHTti5MiRcHNzQ21tLU6cOIHZs2cDAEaPHi15pvuUlgo7hCePprwy9ujB1x49f17IchqFhYWIjIzEokWLHvi1Z599FvPmzZM8033OnTP++q/kiSjvMFWr5Qs1CVqY6bPPPsO8efPg7e0Ne3t7WFtbw8vLC0uXLsXx48dha2srJBcAfpY5JUX4ZR/SNGU+QrVoEfDFF/wUPq0B84vERL49QePiVUROFPoI1ZQpfCHiQ4dEJ5GXTZv4IlxURFlSZhldXQE/P/7kBuGuXwd27eIrphNZUmYZAWDpUuC77/iL8EP3Tp2A4GDRSchDKPMzY6NRo4C8PL43xb27O5mblBRg4ED++NTEiaLTkKYpfBeqggKgTx++4vbq1aLTiHHnDt+bw9UVOHCAdqySL4WewGnUpQtffmPNGiA6WnQa6RkM/LC0spLvx0FFlDXlXfT/tQkT+BbgwcF8qcYXXxSdSDqzZvGFjL/7jn9eJLKm7Jmx0aef8k1Fx441j6fcGQPmzuWrwkVF8QWNieyZRxnVamDLFmD4cL66+PbtohMZj07HPyNHRvITNmPGiE5Emsk8yggAlpbA118Db7/NzyjOn6+8hZny8/nmPvv28a0M6MypSTGfMgJ8hvz0U2DjRn5Sx8+PL9GhBLt28Xtyb9/m9+XKaQt00izmVcZGU6cCqan8QeTevfleFHV1olM9mStXgJEj+RL+QUH8z2XKm7+aMfMsIwD88Y/8G3fJEr6luJcX8J//AHq96GTNU1rKD7U9PfmNDQkJwP/9n+xWOCDNZ75lBPjnyHnzgIwM4Pnn+Q3mnp78iY/aWtHpmlZQwHcmdnXlJ6XCwoAffuBPYxCTpuw7cB5XTg7w8cfAtm18rZjJk/mN1aIP++rr+ean69fz64YdOvBLFzNmAK1aic1GWorCb4d7UiUlwObNwIYN/DOZhwffyWrMGH6SRIpnJCsr+aFnTAzf2q68HHjhBb5nxujRfLl+oiRUxkcyGIDkZF6I2Fh+6cDent90PXAgv+fTy4tvT/57NDQA2dlAWhq/qfvECb5siMHAn8ofN46/nn66Rf5YRJaojI8lLQ1ITMRb//43epeV4Z3bt/nXHRz44sBOTvx+2I4deWm1Wn4YqdXyma6hgf9YUcE/+5WU8A16srIAnQ71Gg3G2djgTT8/jA4O5pde6DY2c0FlfFzp6enw9vZGVFQUxr/4Il/CIj2df94sLuYrDJSU8MLV1fE1SnU6/hnU0hJo3Rpo0wZwceHlfeopfhjs6Qn06oU/T5qEzMxMXLhwAWq1eZ9fMzNUxscVGBiIrKwso5XlvrKPH9/ivz+RLSrj4zh37hyeffZZxMbGGnX900mTJuHMmTNIT0+HRqP8B2sIACrj4xkxYgSKi4uRmpoKlRGfDczOzkavXr2wadMmTJ482WjjEFmhMjZXamoqnnvuOcTFxeGVV14x+nhTp05FQkICMjMzYUWXMcwBlbG5AgICUFNTgySJNhrNz89Hz549sWbNGvydtkM3B1TG5khKSsKgQYNw9OhRDBkyRLJxZ86cif379yMrKwtarVaycYkQVMbm8Pf3h0ajweHDhyUdt6ioCG5ubli+fDlmzZol6dhEcgpfkKoFxMfHIzExER9++KHkY3fu3BnTpk1DWFgYqqurJR+fSItmxt/Qv39/ODo6Yv/+/ULGLy0thZubGz744APMnTtXSAYiCZoZH2XPnj04ffq0kFmxUYcOHTBz5kyEh4ejsrJSWA5ifDQzPgRjDD4+PnB1dcU333wjNEtZWRlcXV0RGhqKhQsXCs1CjIZmxofZtWsXLl68iA8++EB0FDg6OiIkJAQrV65Eucy2Rycth8rYBL1ej8WLF+O1115Dnz59RMcBAISEhECtViOCdtZSLCpjE7Zt24bMzExZzIqN7O3tMWfOHERERODGjRui4xAjoM+Mv6LX6+Hp6QlfX19s2bJFdJz7VFVVwc3NDcHBwQgPDxcdh7Qs+sz4a1u2bEFeXh4WLVokOsoDbG1tERoaisjISBQWFoqOQ1oYzYz30Ol08PDwwNChQ7Fu3TrRcZpUW1uLHj16IDAwEKtWrRIdh7QcmhnvtWHDBhQWFsr68oG1tTXmz5+PdevWoaCgQHQc0oJoZvwvU5pxTGEGJ4+NZsZGa9euRVlZGUJDQ0VH+U1WVlZYsGABNm/ejLy8PNFxSAuhmRGmeZZSzmd9yROhmREAPvvsM1RVVWHOnDmiozSbhYUFFi5ciK1bt+Ly5cui45AWYPYz4+3bt+Hq6oq3334bS5cuFR3nsej1enh7e6NPnz7Ytm2b6Djk96GZMSIiAgaDASEhIaKjPDYLCwssXrwY0dHRuHDhgug45Hcy65mxvLwcrq6umDt3rqwvZzxK49Ml3bp1Q0xMjOg45MmZ98wYHh4OjUaDd999V3SUJ6ZSqbBkyRJ8++23OH36tOg45Hcw25lRaU/Qi16RgPxu5jszhoWFwdbWFjNnzhQdpUUsWbIEcXFxOHHihOgo5AmZ5czYuOpaeHg43nnnHdFxWoyoVexIizDPmXHZsmXo0KED3nrrLdFRWtRHH32EI0eOICEhQXQU8gTMbmZU+krdAQEBqK6uRnJysugo5PGY3yLGf/vb33D06FHF7mEh9Z4gpMWYVxnNZXcnqXbLIi1KmZ8Zr1+/jrNnzz7w9cWLF8PV1RUTJ04UkEo6YWFhOH/+PPbs2XPf1/V6Pfbt2ycoFflNTIG++eYbplKp2KhRo9jFixcZY4ylpaUxtVrNtm/fLjidNAIDA5mXlxfT6/VMr9ez6Oho1r17d2ZpackaGhpExyMP2qHIw9QVK1ZgwYIFAPhsEBQUhFu3bqGwsNBo23/LTeN25LNnz0ZcXBwyMjKgUqlgMBiQl5eHbt26iY5I7qfMw9ScnByoVCo0NDSAMYbY2FgcOnQIDg4OZvMwblFREZydnbFy5UpkZmaCMQaDwQAAyM3NFZyONEWRZbx8+TLq6+vv/ry+vh6MMZw8eRIeHh544403FFvKpKQkDBw4EAEBASguLgbAjw4aaTQaKqNMKbKM2dnZTX69vr4eer0e0dHR8PDwwPr16yVOZjx6vR6jR4/GoEGDcOrUKQBAQ0PDA+9Tq9XIycmROh5pBsWVsa6u7u6M8DDsv48dvfbaaxKlMj4LCwvMnz8fdnZ2j3xffX09srKyJEpFHofiynjlyhU86pyURqNB//79cfjwYdjb20uYzPh8fX2RkpKCtm3bQqPRNPkexhgt0yFTiivjow7BNBoNAgICcOjQod+cQUyVp6cnkpKS4OjoCEtLyybfk5+f/8h/sIgYiixjU9+EarUa48aNw+7du2FtbS0gmXTc3d1x6rDolIQAAAI8SURBVNQpODs7N/l3UVdXh6KiIgHJyKMoroy5ubkP3AKmVqsxdepUREVFPXS2UJquXbsiJSUFbm5uTf6Z6Yyq/CiujFlZWdDpdHd/rlarMX36dKxfv94sLvbfy8nJCcnJyfDy8rqvkBYWFnRGVYYU991578kJlUqFefPm4fPPPzfbG6YdHByQkJAAHx+fu4Wka43ypKgy6vX6+7ZKW7FiBT755BOBieTB3t4eR44cwfPPPw+NRgOdTvfQa7FEHEWVMT8/Hw0NDVCpVFi9erVJrRBubLa2toiPj8fw4cPBGENGRoboSORXFFXG3NxcaDQabN26VVFr27QUKysr7Ny5E+PHj8e1a9dExyG/oqgyXrt2DdHR0Zg0aZLoKLJlaWmJbdu2ISgoCGVlZaLjkHso6hGq2tpaxV9DbCmMMeh0Omi1WtFRCKesR6ioiM2nUqmoiDKjqDISYsqojITIBJWREJmgMhIiE1RGQmSCykiITFAZCZEJKiMhMkFlJEQmqIyEyASVkRCZoDISIhNURkJkgspIiExQGQmRCSojITJBZSREJqiMhMgElZEQmaAyEiITVEZCZILKSIhMUBkJkQkqIyEyQWUkRCaojITIBJWREJmgMhIiE1RGQmSCykiITFAZCZEJKiMhMkFlJEQmqIyEyASVkRCZoDISIhNURkJkgspIiExQGQmRCSojITJBZSREJqiMhMgElZEQmaAyEiITVEZCZILKSIhMUBkJkQkqIyEyoQGwU3QIQghS/h8yWeCKfG/IcQAAAABJRU5ErkJggg=="},9296:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_2_dark-e8c35bc37b250271cf480f71904c15a7.png"},9657:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_2_light-5e6a1d53e559a30e5fb86ee019229bbd.png"},9123:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_3_dark-a2b8248c182059b67c703f75f58f3784.png"},515:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_3_light-7be3bbcb08f8b7182a1c719693a47615.png"},7518:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_4_dark-eddf4c315becc51f89b0967320f132d8.png"},8747:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_4_light-d72dfa633794ec97eddce8e3a4b02660.png"},2193:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_5_dark-e24da2d7a3fb2ee63ac8e1ea9c2d45a8.png"},8317:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_5_light-efb3568bf4aadb19a9dcc57e748f89d8.png"},6986:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_6_dark-160fd071a93e279a5339c7976745f8b1.png"},8204:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_6_light-b090675f7b30b574af44d667b083e9b7.png"},1988:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_7_dark-35ede8f297484f4305ea7fd23cbddc49.png"},345:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_7_light-018e13c41ce1fc6257c4c65748aaae27.png"},437:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_8_dark-b0f871ab182d06edb5c29bb490ad70bc.png"},6464:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/br_8_light-81ac4c8a3988bd43c66f563cd4799d61.png"},8125:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAACbCAYAAAAp66qoAAAABmJLR0QA/wD/AP+gvaeTAAATHUlEQVR4nO3deXhTZaLH8W9OtibpvrEU2iIKDCgwzkWBUUFEweGKIItg2UQQC4Jlva6zPc4zLuy4QQEViyxlF5QB5OLIcIGReWBQwCpCKyq0pHuaZjk5949aHkEZAZuc9M37+QcIefr+oL+8Pet7DGlpLTUkqfHLV/ROIEkNRZZZEoYssyQMk94BRGIEklWVlIBKbEDDiIYjoGFCw20w4DUYqDUYqDAoFBuNlCtyLmlIsszXIErT6OT10t7vo63PRxufj0zVT5KqYryKr+MxGPjOaOSkycznZjOfm0wcNVv4wmxG7pVfPVnmK6AAv/Z66VXrppvHQ2efF4umUa4ofG42c8JsZpvNRrHRyDmjkRKlbtYNAC5FwQ/YNA2LpmHVNOIDAZoGVFJVleaqShu/j561bsb7/Zg1DaeicNBqZZ81ih1RNr4xXs1HJHIZ5KG5y+vi9TCwpoY+tW6aqCqFJhP7LFb2W63st0Y1eMlMQHuvl65eD109Hrp5PUQHAhy1WNgWZWOd3cE5WezLyZdlvoRD0xhc42Kkq5p2Ph/HzWbet9n5IMrGCbM5pFnMmsZvPR7urXVzr7uG2ECAXTYbKxzR/N0aFdIsjYAscz2HpjHMVc3j1VXEBgLsjLKx0uHg4zApjVnT6FPrJsvl4jZPLSfMZhbExLLNZpfb13VkmRVghKuamZUVmDRYHh1NbnRMWB9puMnnZWplJXfXujlisfBMXAJHLBa9Y+ktsst8k8/LC+VldPD5WOqI5pWY2LAu8aVu9Hn5Q0U5t3o8rHRE89fYOCobUf4GFpmnsw3AxOoq3ispptZg4J6UJjwfF9+oigzwqdnC0ORUchKS6FvrZkfxOf7L69E7lm4a13evAcQFAuSdL2FWZQUvxsYxODmVghDv2DUkDdhgt3NXalM+N5tZV1JMdnWV3rF0EVHHmZurKnnOEqIDAe5PThVqO7NUURiTlMz46iqeqSinpd/Pc/EJqHoHC6GIKXOm30/++WIqFIX+KU04K+DxWg1YEh1DkcnEK6VOkgIBJiUm4dc7WIhExGZGqqryrrOEc0YjDySnClnkH9oeZSMrOYVetW5eKCvFoHegEBG+zDZNI89ZghcDo5JSImZv/4DFyoTEZAa7a5haWaF3nJAQ/jv7+4py0lSVEcnJlEZIkevtjori2bh4cqoq6eYR/yiH0N/du2vddSdE4hM5Y4yY3YOL5Dmi+cBmZ2GZk9hAQO84QSVsmc2axh8rytlkt/O+zRa0cRITExk+fBgrVrzFqVMnOXOmiJ49e/7ofXa7neHDh7N27Wr+9a9POHXqJHv3/p1nnnmamJjooOUDmBWfgEXTmFxVGdRx9CbsdDXaVU0TVeWvsfFBHWfRogX06NHjZ983fvw4Zs6ccdFrmZmZZGc/Ru/evenf/36qqoJzfLhCUZgfE8ezleW8HR0t7E8pIWdmBRhfXcUKRzTfBvnIhdPpZPXqNYwePYZVq1Zd9n0ul4v8/HVkZY2gS5dbadOmHVlZIzh79iw33HA948ePC2rOPIeD84rC6OrqoI6jJyE/ord7aklTVd51OII+1pQpORd+f+edd172fUuXLvvRax999Hf+8pe/smjRAjp27BiUfPV8BgNr7A5Guly8GBuH3yDeATshZ+b+NTUcslj40hT+p6m//roIgNLS0qCPtdbhIDmg8ltBr98Qssy3ej2N5uL1+p3FjRs3Bn2sM0YTp00mugh6mE64MicGAmT4/RyyWPWO8rM6dOhAdvZjbNq0mY8/3huSMT+xWPmN1xuSsUJNuDK3UP0YgK/M4b07kJ7ekrfeWs7x48eZOXNWyMb9ymSipSrm1RrClTlBrTsxUBbGZ/vS01uSn7+WyspKRowYhdvtDtnYZYpCgqAnT8L3O36NbN/fEecO08trMjIyWLcuH7e7lmHDhlNeXh7S8V0GBbsm5s1FwpW53FD3T4rXwm/2ad26NevX51NbW8vQoQ9SUnI+5BkSAmqju6PmSgn3r6rfvEhUw6vMbdq0Yd26fGpqahgy5EGKi4t1yZEUCIT1JtgvEd57SdfglMmEx2DgRp8vJLdDTZs2lWnTpl70Wl7eigu/79nzTr788iRjxz5MSkoyKSnJHDr0zx99nYKCAnr16h30vDf5vBxvBMffr4VwH1GvwcCnZnNE39h5OQbgZq+XQwLdLvZDQi41MLOygqE1Lro2bR5R98D9nK4eD+vOF1+4+VUwYi41sMbuoKmqcnttrd5RwsrwGhdHLBYRiwwIuJkBUGQyccBqZXyE3nL/U5qpKv3cNbxrD/7FV3oRsswAL8fE0cNTSw+PnJ2hbtOrRDGSL8vc+BywWtkZZeMPFeVYBT1JcKVu9noZVFN36adXwEs/6wlbZoBn4hNooqo8Wxnas2zhxKFpLChzsjcqis12u95xgkroMn9rNPJ0fAJjqqvp767RO07IKcD8MifRmkZOQqLwS98Kd9LkUpttdn4d7WV+WSmlisLeRnKdc0N4vryMXrW1PJScQoki9sI3IPjMXO/PcfFss9lY6jxPd0EvTP8hA/BcRTlZrmomJSZxoBFc290QIqLMAWBqfCIfRtnIc5Zwv8CbHGZNY1GZk7Guap5ISGJ7VPCWWQg3xtjYuD/qHSIUAgYD2212YgMBnqsoxwb8n8VKQKC9+xaqn7ecTrp4vIxNSmZHENcLCUPHImJmrhegbpNjZkIiY6qr2HC+mAy/GHdd9HPX8Lfic8RqAe5PSQ2bZ7GEUkSVud5qu4N+qU2I0jQ+LD5LTlUllkZ6LDpd9fOW8zyLS51stdn5XUqTRr14+i8RMZsZlypVjKyyO/AoCpOrKhnirqFcMVLQSJ6OmhQIMLWqkvlldUsUPJaYzJvR0UKuh3GFjgl51dzVaqaqzKqsYGCNi0KTiVdjYtlss+MJw2I0V1Uerq5ilKsat8HAKzGxvOWI6BLXi+ynTV0q0+9nSlUlA901uAwG1tkdvGt36P5j26Rp9PTUkuVy0avWTanRyBvRMaxwROOWJa4ny/xTUgIqD7pcPORyka76+dJk5n2bje1RNj6zWEJyjXS0ptHdU8u9bjd317qJCwT4hzWKPIeDv0XZ8MkSX0qW+T9RqHt+9r1uN33dblqofqoUhYMWKwctFj61WDhhMv/i51mbgFZ+H219Pm72ernV66GD14sCHLJY+cBm4wObja8FXb2zgcgyX422Ph/dvB7Gz51D4pEjxCxYAEC5ovCVyUSxYuQ7k5HzipFKg4LXAO7vf43WNIyaRrSmER0I0FxVSQmopKkq1/n9mDUNv9lM7caNHHjnHfJ37uKA1RoRp6EbSL78qF+Fz81mtA4d+PPo0Uya9Dh7m6XRzuejrd9Hpt9PiqrS3usjJVBLjKZh0TTsmoZZ03AZDPgNBqoNBqoVhbNGI8WKkU/NdQs8FphNFJjMvGIw0PpPf+L9ffsJCLpYS7DImfkq5eYu5rrrruPuu/sEpWxt2rRh164dTJr0OO+9t7XBv77AxLwHMFhuuulG+vbty0svvRy0WbOgoIAtW7Ywc+YMTCb5g/NqyDJfhRkzZnD06Kfs2LEzqOPMmTOP9PR0Bgy4P6jjiEaW+Qp16tSJXr3u5KWXXkYL8qnvU6dOsX79BqZPn445Qk9NXwtZ5iv05JP/wyefHGLPnj0hGW/evHk0bdqEIUOGhGQ8EcgyX4FbbunC7bffxssvzw7ZmGfOfMOqVat54onJWARdgaihyTJfgVmzZrJ37z/Yt29fSMedP38BSUlJZGU9FNJxGytZ5p/Ro0cPunbtyrx580I+dnFxMXl5K5k8+XFskXWh/TWRZf4ZM2ZMY/fu3Rw4cFCX8RctegW73c7o0aN0Gb8xkWX+D+655246d+7M3LnzdcvgdDpZseIdJk7MJjo6uI8lbuxkmS/DYDAwffo0tm/fzuHDh3XN8vrrb2A2Wxg79mFdc4Q7WebL6Nfvd/zqV79i3rwFekehrKyM3NxcHntsAnFxcXrHCVuyzD/BaDQybdo0tmx5j2PHjukdB4Dc3KUEAoGgP2O7MZNl/gkDBtxP69bXMX++ftvKl6qqqmLx4iWMHz+O5OQkveOEJVnmSxiNRqZMmcz69Rv48suTese5yLJly6mpcfPoo4/qHSUsyTJfYujQoWRkZDB/vv7bypeqqanh9ddfZ+zYh2nSpIneccKOLPMPmM1mJk9+nNWr11BUVKR3nJ/09tsrKCsrY+LEbL2jhB1Z5h/IynqIpk2bsHDhIr2jXJbH4+HVV19j5MgRNG/eXO84YUWW+XtWq5VJkybyzjt5fPvtt3rH+Y9WrnyXs2fPMWXKZL2jhBVZ5u+NHj2KhIQEXnvtdb2j/Cyfz8eiRa8wbNiDpKen6x0nbMgyA3a7nezsbJYvf5Nz587pHeeKrF27lsLCQnJyntA7StiQZQYeeWQsdruNJUuW6B3liqmqysKFixg06AGuv7613nHCQsSXOSYmhgkTHiU3dynnzzv1jnNVNm3azMmTX5GTk6N3lLAQ8WUeP34ciqKQm7tU7yhXTVVV5s6dS//+99G+fXu94+guosscFxfHuHGP8MYbi6moqNA7zjXZtu19jh8/zrRpcnaO6DJPmjQRv9/P8uVv6h3lmmmaxpw5c+nTpw+dO3fWO46uIrbMSUlJjBo1ktdee53q6mq94/wiO3bs5PDhwxE/O0dsmSdPfhy3283bb6/QO0qDmD17Lr169eLWW2/RO4puIrLMqampjBiRxcKFr+B2u/WO0yA++ugj9u/fz9SpU/WOopuILHNOzhM4nU5Wrlypd5QG9dJLL3Pbbb+le/fuekfRRcSVuUWLNIYPH8aCBYvwer16x2lQBw/+k48/3susWTP1jqKLiCtzTk4OZ8+eIz8/X+8oQfHCCy/ym9/cTM+ePfWOEnIRVeZWrVoxePAg5syZg8/n0ztOUBw5coTdu/+XWbNmYoiw554IWeZmzZrRseNNP3p9+vSpFBUVsWnTZh1Shc4LL7zIjTd24J577r7odaPRSO/ed+mUKviELHPnzp3Ztm0rS5cuoV27dkDdivT9+/dn9uw5+AV5xPDlHD9+nO3btzNr1kwURUFRFO6777/ZtWsnublLMP7CBwqFKyGXZs/MzKCiooL09HR27NjOli3vkZAQzxdffMHWrdv0jhcSs2fPZdeuHTz99FP06HEHbdu25eDBg9xww/WkpTWnqOhrvSM2OCFn5szMTI4dO0afPvfyyCPjaNPmBu644w7Kysoi5mL2Jk1S+e6775gw4VG++eZb7r23HxMm1N03mJGRoXO64BC2zKdPn0bTNHbu3EXfvr8jO3siqamp7NmzmwUL5gtb6ltu6UJ+/hpWrXqXr746Rb9+9zFmzMN89tlnOJ1OqqqqZJkbk4yMDE6fLrzw50AgwNat2+jVqzdPPfU03bt3Y8+e3UKte2w0Glm+fBkbNqwnENDo338Aw4c/xL///e+L3nfq1GkyMzP1CRlkwpXZYrHQvHkzCgsLf/R3fr+fo0ePYrFYOHz4CFu2vKdDwuBQVZVXX32NyspKVFXlxIkTP/m+wsJCWebGIj29JYqiXDQz1+vUqROrV6+ioKCAkSNHUVVVpUPC4Dl06BADBjxAu3Ztyc9fQ3x8/I/ec/r0aTIz5WZGo1A/61w6M3fr1o01a1bxySeHGDFiFC6XS4d0wVdQUMCQIQ+SmprK6tWrSEq6eF26wsJCMjIyhDyhImSZS0rOX3SN8l139SIvbwUffribcePG4/F4dEwYfCdPnmTgwAeIjnawfv06mjVrduHvTp8uxGazkZqaqmPC4BCuzHU7f6cv/Ll///tYtmwp69atZ/LkKcKfMKl35sw3DBw4CL/fx4YN6y8cwaj/vxFxU0O4MmdmZlzYxBg06AEWLlxAXt5KnnzyqYh7sHpJSQmDBw/F6TzPxo3radu2LefOncPtdgu5EyhgmTMpLCxkzJjRzJs3lyVLcnn22eeC/lTVcFVeXs7w4VkUFhaxZs0q2rdvT1FRkZDHmoU6nW00GmnRogW9e99Fx44def75v7B4ceNZ2CVYqqqqyMoawfLly1i7djWlpaVyZg53aWlpmM1mOnbsyO9//0dZ5B+oqalh5MhR7Nu3j1atWslt5nCXmZmB3+9nypQc3nyz8S4fECw+n4/s7Els3rxFzszhLi0tjezsSWzcuFHvKGGr7sP+BNu2bSMhIUHvOA3KkJbWUpg9I6vVKvwx5IZiMBgwm80i3QeZL9TMLIt85TRNE6nIgGCbGVJkk2WWhCHLLAlDllkShiyzJAxZZkkYssySMGSZJWHIMkvCkGWWhCHLLAlDllkShiyzJAxZZkkYssySMGSZJWHIMkvCkGWWhCHLLAlDllkShiyzJAxZZkkYssySMGSZJWHIMkvCkGWWhCHLLAlDllkShiyzJAxZZkkYssySMGSZJWHIMkvCkGWWhCHLLAlDllkShiyzJAxZZkkYssySMGSZJWHIMkvCkGWWhCHLLAlDllkShiyzJAxZZkkYssySMGSZJWGYgHy9Q0hSA9j//wN+ievL+PypAAAAAElFTkSuQmCC"},477:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAACbCAYAAAAp66qoAAAABmJLR0QA/wD/AP+gvaeTAAARC0lEQVR4nO3de1RUxx0H8O9dlpeQYCD4wKTWRQWBYEvTBhoRNeKjKliJ2kgjlTxM1KSlIscTo4IknCCmGFGP9UVbLYjvtxIUaoSK4rtQBAQCWBGRoiIgyy7TPyZYjYBodu/szp3POXs44CbzU74Mc+femZEIIQSCYP52qFhXIAiGIsIscEOEWeCGmnUBXNHrgZoa+rp9m37e0ADodECPHoC1NWBrC/TsCfTtCzg6sq6YKyLMz6K5GcjLAy5fBvLzgYICoLQUuHmTBri7bGyAl14C3NwALy/A0xPw8QE8PABJMl79nJLEbEY3tLUBp08Dhw8D//gHDXJLC+1Z20Po5kZ7WxcXoHdv+mcqFfDcc4BaDTQ10f/m/n3gv/8Frl8HqquBqirg3/+mPxCFhYBWCzg7A/7+wMiRQFAQ8KMfsf4XMAc7RJi7kpMD/P3vwL59NHyursCIEUBAAH0ZOmQ6HXDxIvDNN8CJE/R19y7ws58BISHAzJn0h0XoiAjzY+7dA/72N2DdOuBf/wK8vWmQfv1r4JVX5K1FqwUyM4E9e4Ddu+k4fNIk4MMPgcBAeWsxfTtABKqhgZCVKwnp04cQGxtCpk4lJCODdVX/19JCyPbthIweTYgkEeLtTT9va2NdmanYLsKs1xOydi0hTk6EPP88IZ9+SkhdHeuqunbuHCFBQTTUv/gFIWfOsK7IFGxX9jzz+fOAry/w+98Ds2YB5eVAbKzpT5n5+NBx/LlzdMrP15cOPW7fZl0ZU8oMMyHA8uU0BLa2wIULQEKC6Yf4+376Uzqm/utfgb17gZ/8BPjnP1lXxYzywlxfD4wbB3z6KfD553SqzdOTdVXPTpKA3/6WXqx6edFZloQE1lUxoaybJlVVwPjxdLorJwf4+c9ZV2Q4L74IHDgAJCYCUVF0yJSUBFhYsK5MNsoJ89Wr9CbECy8Ap04B/fqxrsjwJAn44x8BjQaYMQOorQVSU+lNGwVQxjCjuhoYO5becPjmGz6D/LDJk4H0dHrHcvZseo2gAPyHuamJDi2srIBDh+hDPkrg7w/s2AFs2QLExLCuRhb8h3n+fKCyEjh6lI4rleRXv6Lj5thYeqHLOb5vZx84AAQH0x4qJIR1NexMnQrk5tIZD35/M3G8bEqrBSIi6IWQEYN869YtbNq0CRMmTIC1tTUkScLRo0cfe19jYyM2btyIUaNGwcXFBdbW1hg0aBCioqJw9+5do9UHAFi/nj6xFxdn3HZYY30P0mgSEwmxtSWkstKozYwdO5YAeOR15MiRx94XGxv72PvaX0OGDCG3b982ap1k1Sr6zMm33xq3HXY4vZ3d1kbnWz/8EHj5ZaM25ezsjPDwcBw8eBDvvvtup++zt7dHWFgY0tPTUVVVhXv37iE9PR39+vVDYWEhVq5cadQ6MXs20KsXsGaNcdthifWPk1GkpxMCEFJYKGuzc+fO7bRn7szWrVsJADJx4kQjVvadpUsJ6d2bEK3W+G3Jj9Oeeds2wM8PcHdnXckTDRgwAADwohwzLbNm0aVdWVnGb4sBPsN88qTZPLzefrEYGhpq/Mb69wcGDgSys43fFgP8hfnWLbq41M+PdSVPdPHiRSQkJOCtt97C6NGj5Wn0l7+kt/M5xF+YKyro7Vs3N9aVdKm8vByTJk2Ct7c3Nm7cKF/DgwcD334rX3sy4i/Mt27Rj05ObOvoQnl5OUaMGIGePXviyJEj6NGjh3yNOzkBdXXytScj/sLc3Ew/2tqyraMTpaWlCAgIQI8ePXDs2DE4yr0gwN4eaGyUt02Z8BfmF16gH+vr2dbRgaKiIgQEBMDW1haZmZno3bu3/EXU1Znfippu4i/M7cOL2lq2dXxPQUEBAgICYGdnh6ysLPTt25dNIbW1Jj0E+yH4C/OgQXTbqwsXZGkuOjoakiRBkiSs+e7u2vjx4x987cqVKwCApKQk1NTUoLi4GP369Xvw5+0vLy8vWerF+fPy7/8hE/7CbG1NF3oqeGFnpwihT8+ZwbTls+DzEdDFi4G//IVOQSloDdwTnThBtxdrX/zKF04fAZ01C/jPf4CMDNaVmJZNm+giXv6CDIDHYQZAF3QOH06fnBOoa9eAnTuBLp7sM3d8hhkAli0Dvv6avgQ69OrdGwgLY12J0fA5Zm4XFASUlQFnz9IZDqXKzQWGDaO7m86YwboaY+F8S9uqKmDoULrjz6pVrKth4949ujedRgMcOcLzjvycXgC2e/llYO1aYPVqIC2NdTXya2ujw4qGBrofHb9BBqCEHY1+8xt6hENYGN1q4I03WFckn3nz6EYwX39Nx8uc47tnbvfll8Cbb9Ld7zldZfEIQoDISLoqOzWVbgijAMoIs0oFJCcDEybQ3Y22bWNdkfFotfQaISmJXvBNnsy6ItkoI8wAYGlJD9uZO5de0S9cCLS2sq7KsCoq6OaQBw/Srcj4nbnokHLCDNAe+ssvgY0b6UXh8OF0iRUPdu6kz6TcuUOfS5FrGZYJUVaY24WH07P8mpvpE2SxsXTHH3NUXk5PoJo6lb7y8sx78/QfQJlhBoAhQ+g3PiaGHgnh5QVs3fp0J6yyVFtLh0qenvTGUFYW8Oc/m+wKG1mw3LXDZFRVERIWRohaTYibGyHJyYQ0N7OuqmOVlYQsWECIvT0hvXrRbcj43NTlaYmj0x5RUkLI735HiJUVIY6OhPzhD4Tk57Ouiob1wAFCJk0ixMKCnlW4YgUhjY2sKzMl2/m+nf2samqAzZuBDRvomNTdne4kOnkyvciS4xnphgY6dNi9m27NW18PjBpF94wLDqabpwsP4/zZjB+qrY0e5LN7Nz3yt6ICcHCgD+0MG0afefDy+uHnWet0QEkJkJ9PHwo6eZIu+2pro6tCpkyhrx//2CB/LU6JMD+V/HzgxAm8/6c/4ZW6Onx05w79uqMj3VylTx/6PEivXjT01tb00Elra9rT6nT049279CGomhq6q39xMaDVolWtxhRbW7w7fDiCw8Lo1KECbkMbiAjz0yooKIC3tzdSU1Mx7Y036BKkggJ6mtWNG3SFS00NDWxLC92jQqul+1VYWgLPPQc8/zw9JKhPH+Cll+gwxtMT8PDAm6GhKCoqwqVLl6BSKXey6RmIMD+tkJAQFBcXGy1sj/ywTJtm8P8/x0SYn8b58+fx6quvYs+ePQgODjZaO6GhoTh79iwKCgqgVsgZfgYgwvw0Jk6ciBs3biAvLw+SEZ8NLikpgYeHBzZt2oSZM2carR3OiDB3V15eHl577TUcPnwY48aNM3p74eHhyMrKQlFREazENFx3iDB3V2BgIJqbm5Et00bdFRUVGDx4MFavXo333ntPljbNnAhzd2RnZ8Pf3x+ZmZkYOXKkbO3OmTMHhw4dQnFxMaytrWVr10yJMHfHiBEjoFarcezYMVnbra6uhqurK5YvX4558+bJ2rYZ4nxBqwGkp6fjxIkTWLp0qext9+3bF7Nnz0ZcXByamppkb9/ciJ75CXx9feHk5IRDhw4xab+2thaurq5YsmQJIiMjmdRgJkTP3JX9+/fjzJkzTHrlds7OzpgzZw7i4+PR0NDArA5zIHrmThBC4OPjA41Gg127djGtpa6uDhqNBlFRUVi0aBHTWkyY6Jk7s3PnTly+fBlLlixhXQqcnJwQERGBFStWoN4Ej7cwFSLMHdDr9YiOjsb06dMxdOhQ1uUAACIiIqBSqZAodjbtlAhzB1JSUlBUVGQSvXI7BwcHzJ8/H4mJibh58ybrckySGDN/j16vh6enJ/z8/JCcnMy6nEc0NjbC1dUVYWFhiI+PZ12OqRFj5u9LTk5GWVkZFi9ezLqUx9jZ2SEqKgpJSUm4fv0663JMjuiZH6LVauHu7o4xY8Zg3bp1rMvp0P379zFo0CCEhIRg5cqVrMsxJaJnftiGDRtw/fp1k57+srGxwcKFC7Fu3TpUVVWxLsekiJ75O+bU45nDbxAGRM/cbu3atairq0NUVBTrUp7IysoKn3zyCTZv3oyysjLW5ZgM0TPDPGcJTHnWhRHRMwPAV199hcbGRsyfP591Kd1mYWGBRYsWYcuWLQ+ONFY6xffMd+7cgUajwdy5c7Fs2TLW5TwVvV4Pb29vDB06FCkpKazLYU30zImJiWhra0NERATrUp6ahYUFoqOjkZaWhkuXLrEuhzlF98z19fXQaDSIjIw06em4rrQ/3TdgwADs3r2bdTksKbtnjo+Ph1qtxscff8y6lGcmSRJiYmKwd+9enDlzhnU5TCm2Z+ZtBQfrFTEmQLk9c1xcHOzs7DBnzhzWpRhETEwMDh8+jJMnT7IuhRlF9sztq57j4+Px0UcfsS7HYFitIjcRyuyZY2Nj4ezsjPfff591KQb12Wef4fjx48hSwsGdHVBcz8z7TkGBgYFoampCTk4O61LkprxNYN555x1kZmZyu4eb3HvimRBlhVkpu2vKtVupieFzzHzt2jWcO3fusa9HR0dDo9FgBufH8MbFxeHChQvYv3//I1/X6/U4ePAgo6pkYOjzq0zBrl27iCRJJCgoiFy+fJkQQkh+fj5RqVRk27ZtjKuTR0hICPHy8iJ6vZ7o9XqSlpZGBg4cSCwtLYlOp2NdnjHweQ7g8uXLiVqtJmq1mkiSRKZNm0bGjBnz4JurBO0/vJGRkcTDw4NIkkRUKhUBQMrKyliXZwzbuRxmXL16FZIkQafTgRCCPXv2ICMjA46Ojop5mL26uhouLi5YsWIFioqKQAhBW1sbAKC0tJRxdcbBZZivXLmC1tbWB5+3traCEIJTp07B3d0db7/9Nrehzs7OxrBhwxAYGIgbN24AoGPldmq1WoTZnJSUlHT49dbWVuj1eqSlpcHd3R3r16+XuTLj0ev1CA4Ohr+/P06fPg0A0Ol0j71PpVLh6tWrcpcnC+7C3NLS8qBH6gz57rHJ6dOny1SV8VlYWGDhwoWwt7fv8n2tra0oLi6WqSp5cRfm8vJykC6mztVqNXx9fXHs2DE4ODjIWJnx+fn5ITc3Fz179uz0yDVCCLfLrLgLc1e/QtVqNQIDA5GRkfHEHsxceXp6Ijs7G05OTrC0tOzwPRUVFV3+wJsrLsPc0TdRpVJhypQp2LdvH2xsbBhUJh83NzecPn0aLi4uHf5btLS0oLq6mkFlxsVdmEtLSx+7hatSqRAeHo7U1NROeyve9O/fH7m5uXB1de3w78zjjAZ3YS4uLoZWq33wuUqlwgcffID169cr7mD1Pn36ICcnB15eXo8E2sLCgssZDe6+uw9f3EiShAULFmDNmjVKeuDmEY6OjsjKyoKPj8+DQPM618xVmPV6/SNbvSYkJOCLL75gWJFpcHBwwPHjx/H6669DrVZDq9V2OhdvzrgKc0VFBXQ6HSRJwqpVq8xqhyJjs7OzQ3p6OiZMmABCCAoLC1mXZHBchbm0tBRqtRpbtmzham2foVhZWWHHjh2YNm0aKisrWZdjcFyFubKyEmlpaQgNDWVdismytLRESkoKpk6dirq6OtblGBRXK03u37/P/RyyoRBCoNVqeTpgnq+VJiLI3SdJEk9BBsDZMENQNhFmgRsizAI3RJgFbogwC9wQYRa4IcIscEOEWeCGCLPADRFmgRsizAI3RJgFbogwC9wQYRa4IcIscEOEWeCGCLPADRFmgRsizAI3RJgFbogwC9wQYRa4IcIscEOEWeCGCLPADRFmgRsizAI3RJgFbogwC9wQYRa4IcIscEOEWeCGCLPADRFmgRsizAI3RJgFbogwC9wQYRa4IcIscEOEWeCGCLPADRFmgRsizAI3RJgFbogwC9wQYRa4IcIscEOEWeCGGsAO1kUIggHk/g8regxl1dWQgAAAAABJRU5ErkJggg=="},9905:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOMAAAD7CAYAAACYCyO6AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dd3hUZcL+8e/UZJJJQgoJJEhiIwiIiEu1gBEEZEW6QCiCIFINSFjFtu/qvmKhgwpBVAw1gICUCOjPwiKguGChRANJBCG9TCaTqef3B8ZXigXMzDlz5vlcl5cwGXhuYO48pz5Hk5BwjYQgCHLL0sqdQBCE80QZBUEhRBkFQSH0cgcQlEOn0xETE0PDhjGEh0eg02kJDTWj1+uw2Ww4HA5qa2uprKyiqKiIiooKuSOriihjAAoODuaWW26hRYubSE5OplmzZiQlJRIdHY1Op/vTv4/dbufs2bPk5p7kxIkTnDhxgm+++Zbvv/8eSRLHBa+URhxNVT+tVsutt95KSsrddOrUiTZtbsFoNFJRUfFziXLIzc2lqKiIwsJCiotLqKiowOPxYLVacblcmEwmjEYjQUFBNGjQgEaN4oiNjSU+Pp5mzW6kWbNm3HjjjRgMBkpLSzl48CD79n3Orl27OXPmjNx/Bf4gS5RRxdq1+xv9+vWjR497iYuLIz8/n337Pmf//v3s33+g3kui1+tp0aIFHTt2oGPHjnTq1BGz2cw333zD9u072LBhI4WFhfU6poqIMqpNaGgoAwcOYMSI4TRv3pxjx46xY8dOdu7M5vjx4z7NYjAYuP322+nVqye9evUkPDycPXv2sHLlu3z66Wc+zeIHRBnVIjQ0lCFDHmTy5EmEh4eze/ceVq1axWef7ZU7GnC+mD163Etqaip33HE7x48fZ8GChWzfvkPsX54nyujvtFotw4enkp4+A73ewIoVK8jIWK7oI50339yKadOm0b17N44cOcJTTz3DkSNH5I4lN1FGf3bzza2YPftFWrZsyfLlb7J48RJFl/BirVq15LnnnqVDhw6sWrWaF1+cTVVVldyx5CIuh/NHGo2GiRMn8P77W6mtreXee3vywgv/9qsiAnz77XcMHjyEtLTp9OzZg127PuBvf7tN7liyEWX0MxEREWRmvsvMmem89NLLDBw4mJycHLljXTVJkti0aRP33NOdEydOsGFDFhMmPCp3LFnowsMj/il3COHPiY+PZ/36tTRu3Ihhw4azbdt2uSPVG5vNxpYtW6ipqWHWrCeJjY3l448/CaSDO0fFFTh+IikpiaysdVRWVtKnT1/OnTsnd6R6J0kSy5ZlUFBQwOLFi4iOjmbSpMm4XC65o/mE2Ez1A7GxsaxenUlhYSH9+w9UZRF/LTv7A1JTh5OScjezZ7+IRqORO5JPiM1UhTOZTGRlrQM0DBkyzO8O0lytM2fO8N13R3nyySfQarV8/vl+uSN521FRRoV7/vl/0a7d3+jfvz+FhUVyx/GpU6dOUVJSwlNPzWL//gOcPn1a7kjedFRspipY9+7dfj6h/w9Onw7Mi60zM1exc2c2CxfOJzw8XO44XiXKqFAGg4F//vM5Nm/ezI4dO7w2TlRUFEOHDmHlyrc5dSqX06cL6Nq16yXvCwkJYejQoaxfv5avvvqSU6dy2bv3U556ahZhYWav5QOYOfMfGI1GpkyZ7NVx5CaOpirUqFEjiYuL48UXX/LqOIsWLaBLly5/+L5x48aSnj7jgteSkpKYMOFRunXrRp8+D2CxWLySsbKykvnzF/L007N45513VLuVIGZGBdJqtYwbN5aVK9/lp59+8upYpaWlrF27jlGjHmLNmjW/+T6r1UpW1gZSU4fTrl0HmjVrTmrqcM6dO8eNN97AuHFjvZozMzOTkpISRo0a5dVx5CRmRgW68847SEhIYPXq1V4fa+rUtF9+fPfdd//m+5Yvf/OS1z755FP+/e8XWbRoAa1bt/ZKvjpOp5N169YzYsQIXnrpZVWeexQzowL16dOHQ4cO8cMPuXJH+UM//lgAQFlZmdfHWr9+PTEx0dx+e2evjyUHUUYF6tChvd/cfFt3sOe9997z+linT58hLy+Pdu3aeX0sOYgyKkxUVBSJiYkcOvSV3FH+UMuWLZkw4VE2b97is5uYv/zyELfdps47O0QZFaZJkwQ0Gg0nTyp7E7Vp02t4++0VHDt2jPT0mT4b9+TJk1xzTROfjedLoowKExkZBUB5ebnMSX5b06bXkJW1nqqqKoYPH4nNZvPZ2OXl5URGRvpsPF8SZVQYkykYAJutVuYkl5eYmMiGDVnYbLUMGTLU59fKWq01hISE+HRMXxFlVJiKikoAGjSIkDnJpa6//no2bsyitraWwYMfpLi4xOcZIiMbqPZieVFGhanbPI2KipY5yYWaNWvGhg1Z1NTUMGjQgxQVyXPRenR0tKI34f8KcdJfYU6dOoXdbqdVq1Y+WU5j+vRpTJ8+7YLXMjNX/vLjrl3v5ocfchkzZjQNG55/DsehQ19c8vvk5OSQktLN63lvvrkVx475dv1XXxEzo8I4HA6+/fbbgF6Y6bdoNBratm3LoUOH5I7iFWKpRgVKT5/B4MGD6NixM263W+44itGxY0c2bFj/y+JVKiOWalSidevW06hRI+688065oyjK0KFDOHLkiBqLCIjNVEUqKCjgwIEDXr8Twp80btyY3r3vY/Xq376zxN+JMirUK6/MoUuXu+jS5S65oyhCevoMiotLyMraIHcUrxFlVKgDBw6we/cennvuWYKCguSOI6u2bdsyYEB/XnrpZRwOh9xxvEaUUcGeeupp4uLiePrpWXJHkU1oaCgLFsxj7969bNmyRe44XiVWh1Mwi8XCmTNnmDVrFrm5uZw44b/L+F8NrVbLkiWLSEpKIjV1OFZrjdyRvEmsKK50W7Zs5dZbb2X+/HmUlZWxd+9/5I7kMy+88DwpKSkMG5Yqy6V3viY2U/3Av/71PNu3b2f58gw6d1bnXe6/ptFoeOaZp0lNHcakSZM5cOCg3JF8QpTRD3g8HqZNe5wPP/yIzMyVPPBAH7kjeY3BYGDRogWMGTOaxx6bRnb2B3JH8hmxz+gnPB4P2dnZhIeH88wzT2Mymfj88/14PB65o9WbJk0SePvtt2jXrj1jxjzMrl275I7kS2J5f38iSRKffPIpZ8+eZdq0NO65J4V9+z6nsrJS7mh/We/e97Fy5Tu4XE6GDx/Bf//7X7kj+ZpY3t8frV27jt69/05wcDAffribtLTHMBqNcse6KueX73iLpUvfYNu27dx339/9+uGvf4WYGf1UWVkZa9asxW63M2XKZAYNGkhFRSU5OTl+8YDR6Ohopk1LY/78eYCGRx+dyFtvva3K9VD/pKPirg0VaNy4MTNnptOvX1/y8/NZsuQ1tmzZit1ulzvaJeLj4xk9+iFGjhyBzWZj8eIlvP32O4FcwjpZoowqkpSUxNSpU+jXry9Wq5UNGzayevUa2Tf79Ho9Xbt2ITU1lZSUuykrK+ONN5aycuW7Pl3MSuFEGdWoYcMYHnzwQYYNG0bTptfwww+57Nixg+zsD/juu+98co+k2Wymc+dO9OrVi+7duxEREcF//rOPzMxMPvhgF06n0+sZ/Iwoo5pptVratfsbvXr1omfPnjRpkoDFYuHgwS84ePAg3377LcePn6CwsPAvjaPX67n22iSSk5Np27YtHTq0p2XLlmi1Wg4d+oqdO3eyc+dOfvxR1Q87/atEGQNJcnIynTp1ZNwXXxDV5S7CZp2/AL2iooKTJ09SVFTM2bM/UVJSSlWVBYfDjs1Wi8Nhx2w2o9PpMJvNmM1m4uPjadgwhoSEBK677joMBgMul4va2loOHDhIVlYWBw4cCIjL2OqJKGOgaeZ0sqfoHJOiotkbn0Dz5s1JTm5GUlISDRs2pFGjRjRsGENYWBhGo5GQkBAMBgNWqxWXy0V1dTXV1dWcO3fu5/Ke5YcfcsnJOUFOzvcsXryQ66+/nu7de6jqggQfEGUMNBllJVznctE9thHeqEqzZs3Ys2cXkyZN5v33t3lhBNUSa+AEkpudDnrabLwcHuGVIsL5JRu3bt1KevoM9HpxU9CVEGUMIDOqqvjGYGRXsMmr48yZM4+mTZvSt+8DXh1HbUQZA8QtDgcptednRW/vl5w6dYqNGzfx+OOPYzAYvDyaeogyBognqir50hjEx8HBPhlv3rx5NGoUx6BBg3wynhqIMgaA9g47d9preSXcdw/TOX36DGvWrOWxx6b47UXsvibKGABmVlWyNyiYfT5eZW7+/AVER0eTmjrMp+P6K1FGletSW0tHu5154eE+H7uoqIjMzFVMmTIZk8m7B43UQJRR5WZYKvkoOJgDRnnWXl20aDEhISGMGjVSlvH9iSijit1ba6ONw8HcMPkevFpaWsrKle8yceIEzGazbDn8gSijSmmAx6sqyTaZOCzzAZTXX38Dg8HImDGjZc2hdKKMKtXbVsNNTifzZJwV65SXl5ORkcGjj44nIkL+PEolyqhCOmB6VRVbTSEcVchJ94yM5Xg8HvFkrd8hyqhCfWusXO9yMl+GI6i/xWKxsHTpMsaNG0tMTLTccRRJlFFldMBUSxUbQ0L5Qa+MWbHOm2+uoKbGxiOPPCJ3FEUSZVSZwVYriW4388OUMyvWqamp4fXXX2fMmNHExcXJHUdxRBlVxCBJTLFUsTYklAKF3r70zjsrKS8vZ+LECXJHURxRRhVJrbHSyONmoQJnxTp2u50lS15jxIjhxMfHyx1HUUQZVSJIkphkqeLdUDM/6XRyx/ldq1at5ty5QqZOnSJ3FEURZVSJUdZqIj0eXjOHyR3lDzmdThYtWsyQIQ/StGlTueMohiijCoRIEhMsFlaEmilU+KxYZ/369eTn55OW9pjcURRDlFEFHq62ECJ5WBam/FmxjtvtZuHCRQwY0J8bbrhe7jiKIMro58I8HsZXW8gwh1Gi9Y9Zsc7mzVvIzT1JWlqa3FEUQZTRz42rtqAFMvxgX/FibrebuXPn0qfP/bRo0ULuOLITZfRjER4PY63VvGEOo1Lrn/+U27fv4NixY0yfLmZH//wXFACYVG3BBazww1mxjiRJzJkzlx49etCmTRu548hKlNFPRXs8jKy28FpYONUajdxx/pJdu3Zz+PDhgJ8dRRn91BRLFTatlndC1XH3/KuvziUlJYUOHdrLHUU2oox+KNbtZri1moXmcGx+PivW+eSTT9i/fz/Tpk2TO4psRBn9UJqlilKtllWhoXJHqVcvv/wKd9xxO507d5Y7iixEGf1ME7eLoTVWFoRF4FDJrFjn4MEv+OyzvcycmS53FFmIMvqZtKoqzml1ZIWEyB3FK2bPfonbbmtL165d5Y7ic6KMfuRal4uBNVbmhIfjVNmsWOfIkSN89NH/Y+bMdDQq/TP+FlFGBWrsdtPa6bjk9cctlRTo9WwOUde+4sVmz36JVq1acu+93S94XafT0a3bPTKl8j5RRgVq43CwvaiQ5WUlNHc6gfOP/+5TU8Or4RG4ZM7nbceOHSM7O5uZM9PRarVotVruv//v7Nmzm4yMZej85M6UK6XMtRkCXJLbRaVWS1OXi11F59hqCiFS8vC9wcA2kzr3FS/26qtz2bNnF7NmPUmXLneRnJzMwYMHufHGG0hIiKeg4Ee5I9Y7MTMqUJLLxVGDgR6xjXg4OoZmLid31dZS/nNBA0FcXCxnz55l/PhHOHPmJ3r16s348efXzUlMTJQ5nXeIMipQkstFnl6PBOwONtEzthEToqKJdbv5uOgcC8rLVFvK9u3bkZW1jjVrVnPy5Cl6976fhx4azXfffUdpaSkWi0WUUfCdRJeLPN3/7UF4gG2mEFLiGvNkg0g622v5uOgcqdZq+ULWM51Ox4oVb7Jp00Y8Hok+ffoydOgwvv766wved+pUHklJSfKE9DJRRoUxShLxbhf5l1lq0QV8YzBglCQOG4xsVdH+o9vtZsmS16iqqsLtdnP8+PHLvi8/P1+UUfCNpm4XWiDvMquB3+JwsLakmByDgRExDbH46T2Mv+XQoUP07duf5s2TycpaR4MGDS55T15eHklJYjNV8IGkn/cFL54ZO9ntrCsp4ktjEMOjG2JV6QnxnJwcBg16kNjYWNauXUN09IXP5cjPzycxMVGVFwSIMipMkstFsVZ3wT2K99TayCwt5sNgE2OjorGr8IP4a7m5ufTr1x+zOZSNGzfQuHHjX76Wl5ePyWQiNjZWxoTeIcqoMIk/H0mt08dWw5tlpWwICWVKVDQulRexzunTZ+jXbwAul5NNmzb+cgQ1Ly8PQJWbqqKMCpP0q4M3A2qsLCwrJTMklCcaROKROZuvFRcXM3DgYEpLS3jvvY0kJydTWFiIzWZT5UEcUUaFSXKdL+ND1mrmlZexLCycpxtEIskdTCYVFRUMHZpKfn4B69atoUWLFhQUFKjyXKO4HK4e6YAYt5uGHjfhHgkdEqEeCT0SNo0Gh0ZDrUZDpUZLkU5HxUVHQ3VAE7ebbrU2WjscvBDRgKV+vNhUfbFYLKSmDmfFijdZv34tZWVlqpwZRRmvQrAkcYvDQQuXk2Snk2ZOJ0luF9FuN1dyCbNdo+GsTkeu3sAJg4ESrRaDJNHa4eDZiEjeMqtjfZv6UFNTw4gRI3nttcX06tULi8Uid6R6p0lIuCZQt4D+NC1wq8NBSq2NTnY7bZwOjJJEhVbLCYOBE3oDuXo9RTodhTodxdrzs54HsGq1uACTJGGUJIIkiQYeD408bmLdbuLdbpq5zhe6mcuFXpKo1mj4LDiYfUHB7Ao2cUaldylcDb1ez4IF87n77q60aNFK7jj1KUuU8Xe0c9jpV1NDj1obcW43+Xo9+4xB7A8KYn9QcL2XJLXGSrjbg1sDHe12OjnsmD0evjEa2R5sYkNIqN882MabdDods2f/L//7v7MpLy+XO059EWW8WKgkMbDGyghrNc2dTo4ZDOwwhbAz2MRxw6VXxdSnIEm64ByiQZK43W6nV62NXrYawj0e9phMrAw182lQsFezKJ1Go8FgMOBwXHoTtp8SZawTKkkMsVYzudpCuMfD7mATq0JD+UwhH3qDJNGj1kaq1cod9lqOGwwsCAtnuykkYI+0qowooxYYbq0mvaoSvQQrzGYyzGGXHOlUkpudDqZVVdG91sYRo5GnIiI5YjTKHUv4awK7jDc7HcyuKKel08nyUDOLw8IVXcKLtXI6eK6ygg52O6tCzbwYHkGVH+UXLpAVkP9yGmBitYX3i4uo1Wi4t2EcL0Q08KsiAnxrMDI4Jpa0yGh61trYVVTI3xx2uWMJV8m/Pn31IMLjIbOkmJlVlbwUHsHAmFhyvHxgxpskYFNICPfENuKEwcCG4iImVKvvHFwgCKiT/vFuN5mlxZg9Hh6IiVXVflaZVstD0TGMq7bwVGUF17hcPNMgErfcwYQ/LWDKmORykVVSRKVWS5+GcZxT4fk6CVhmDqNAr2dxWSnRHg+ToqJVv7SjWgTEZmqs283q0mIKdTr6x8Sqsoi/lh1sIjWmISm1NmaXlxEYN135P9WX0SRJZJYW40DDyOiGAXO08YAxiPFRMQy01TCtqlLuOMKfoPpP5rOVFSS43QyPiaEsQIpY56PgYJ6OaECapYpOdnGUVelU/ensXms7f0K/QRSndQGze3yBzFAzO00hLCwvJdwTaLcn+xfVnvQ3SBIfF53jK6ORKZHRf/wL6klUVBRff334sl+zWCzcdFNLn2WpE+Hx8GnhWdaHhPLviEtXXBMUQb0n/UdZq4lzu3kxXHz4KrVa5odFMMZaTRO3OLaqVKosoxYYV21hZaiZn2Q6cpqVtYEmTZpe8J8cs2KdzNBQSrRaRlWrZxVytVFlGe+015LgdrNaZc+8/yucGg3rQkIZWFODXlLlnonfU2UZ+9TUcMho5IfLrModyNaHhhLjcXO7uH5VkVRZxg4Ou+w3395xx+0cOvQFp07l8tlnnzBr1pOYZV7T5rROT55eTztxmkORVFfGKI+HRJeLQ8YgWXM0btyYuLg4DAYD1157LRMnTmDz5k2EhclbyC+NQdymnrvjVUV1ZWzidqEBThrkOa8oSRLZ2dn07duP5s1bcOutbZk0aTLnzp2jefPmPProo7LkqnNSr+cacURVkVRXxkj3+RPb5TJdbVNeXs7YsY/w5ZeHqK6upri4hC1btjJp0mQAunfvJkuuX/JptUSKk/+KpLoymn5eEcamsMujv/rqv0iSRExMjKw5rBotIeJoqiKprowVmvN/pAaSsr77t27dGo1GQ3Fxsaw5Ij1uv1vRIFCo7oLNus3TKLeHEq3vT/g///z/UFJSyu7de8jPzycoKIj27dvz3HPPAvDBB7t8nunXoj0e2Tbhhd+nujKe0uuxazS0cjplWU4jLi6O0aNHk54+45Kvff3117zxxlKfZ/q1m50Ojonzr4qkCw+P+KfcIeqTW6PhnlobBuDDYJPPx//iiy9xu92YzaEEB58/15mbm8vbb79Devo/sNlsPs9URwM8X1nBppAQ/ivzqR/hEkdVeddGelUlg2usdGwUL9aA+ZWOdjsbSop+WbxKUBR13rWxLiSURm43d9bWyh1FUYbWWDliNIoiKpQqy1ig13MgKIhxYsnCXzR2u+ltq2F1iLh4XqlUWUaAV8Ii6GKvpYtdzI5wftO9WKsjS5RRsVRbxgNBQewONvFcZQVBAX6Su63DwYAaKy+FR+DQKOtiCOH/qLaMAE81iCTO7ebpqgq5o8gmVJJYUF7K3uBgtoSEyB1H+B2qLuNPOh2zGkTyUHU1fWw1csfxOS0wv7wUsySRFhklHh2ncKo76X+xLaYQbjU7mF9eRplWy16FPG/RF16oKCeltpZhMQ0pluFqJOHKqHpmrPOviAZsN5lYXlpC5wC4sVYDPFNZQaq1mklR0RwQJ/j9QkCU0QNMaxDFh8EmMkuLeUDFm6wGSWJReSljrNU8FhlNtgxXIQlXR3WXw/0Wj0ZDtimEcI+HZyorMAGfG4PwqOjoYhO3i7dLS2lndzAmOoZdJlFEP3I0IGbGOh7Ob7KmR0bxULWFTSVFJLrUcdd7b1sNHxQVEi55eKBhLJ8F0L6xWgRUGeusDQmld2wcwZLEh0XnSLNUYfTTc5FN3S7eLi1haVkp20wh3Ncwzq8f/hrIAmYz9WJlWh1rQkKxa7VMsVQxyFZDhVZHjsHgF6cAoj0eplmqmF9eBsCjUTG8ZTbjUtFmd4BR510bV6qx283Mqkr61VjJ1+tZEhbOFlMIdgV+sOPdbkZXWxhprcam0bA4LJy3Q0UJVSBLlPFXklwuplqq6GerwarRsCEklNUhobJv9uklia72WlKtVlJqbZTpdLxhDmNlqBmbKKFaiDJeTkOPmwetVoZZrTR1u/hBb2CHyUR2sInvjEaf3CNpliQ622vpZbPRvdZGhMfDf4KCyQwN5YNgE05RQrURZfw9WqCdw04vm42eNhtN3C4sWi0HjUEcNBr51mjkuN5A4V98uI4euNblJNnppK3DQQeHnZYOB1rgkDGInSYTO00mfgzQZ0wGCFHGK5HsdNLJYWfc3DlEHTlC2IIFAFRotZzU6ynS6jir11Gi1VGl0eLQgO3n/5slCZ0kYZYkzB4P8W43DT1uEtxurnO5MEgSLoOB2vfe48C775K1ew8HgoLEZWyBI0t8q70CJwwGpJYt+deoUUyaNJm9jRNo7nSS7HKS5HLR0O2mhcNJQ08tYZKEUZIIkSQMkoRVo8Gl0VCt0VCt1XJOp6NIq+Nbw/kH9OQY9OToDSzWaLj+f/6HHfv24xGLDQcUMTNeoYyMpVx33XV0797DK2Vp1qwZe/bsYtKkybz//rZ6//0FxVLnGjjecvPNrejZsycvv/yK12atnJwctm7dSnr6DPR6seESSEQZr8CMGTP45ptv2bVrt1fHmTNnHk2bNqVv3we8Oo6gLKKMf9Itt9xCSsrdvPzyK0hevnTu1KlTbNy4iccffxyDuLQtYIgy/klPPPEPvvzyEB9//LFPxps3bx6NGsUxaNAgn4wnyE+U8U9o374dd955B6+88qrPxjx9+gxr1qzlscemYDQafTauIB9Rxj9h5sx09u79D/v27fPpuPPnLyA6OprU1GE+HVeQhyjjH+jSpQsdO3Zk3rx5Ph+7qKiIzMxVTJkyGZO4UVj1RBn/wIwZ0/noo484cOCgLOMvWrSYkJAQRo0aKcv4gu+IMv6Oe+/tTps2bZg7d75sGUpLS1m58l0mTpyA2WyWLYfgfaKMv0Gj0fD449PJzs7m8OHDsmZ5/fU3MBiMjBkzWtYcgneJMv6G3r3v46abbmLevAVyR6G8vJyMjAwefXQ8ERERcscRvESU8TJ0Oh3Tp09n69b3OXr0qNxxAMjIWI7H42HcuLFyRxG8RJTxMvr2fYDrr7+O+fPl21e8mMViYenSZYwbN5aYmGi54wheIMp4EZ1Ox9SpU9i4cRM//JArd5wLvPnmCmpqbDzyyCNyRxG8QJTxIoMHDyYxMZH58+XfV7xYTU0Nr7/+OmPGjCYuLk7uOEI9E2X8FYPBwJQpk1m7dh0FBQVyx7msd95ZSXl5ORMnTpA7ilDPRBl/JTV1GI0axbFw4SK5o/wmu93OkiWvMWLEcOLj4+WOI9QjUcafBQUFMWnSRN59N5OffvpJ7ji/a9Wq1Zw7V8jUqVPkjiLUI1HGn40aNZLIyEhee+11uaP8IafTyaJFixky5EGaNm0qdxyhnogyAiEhIUyYMIEVK96isLBQ7jh/yvr168nPzyct7TG5owj1RJQRePjhMYSEmFi2bJncUf40t9vNwoWLGDCgPzfccL3ccYR6EPBlDAsLY/z4R8jIWE5JSancca7I5s1byM09SVpamtxRhHoQ8GUcN24sWq2WjIzlcke5Ym63m7lz59Knz/20aNFC7jjCXxTQZYyIiGDs2Id5442lVFZWyh3nqmzfvoNjx44xfbqYHf1dQJdx0qSJuFwuVqx4S+4oV02SJObMmUuPHj1o06aN3HGEvyBgyxgdHc3IkSN47bXXqa6uljvOX7Jr124OHz4sZkc/F7BlnDJlMjabjXfeWSl3lHrx6qtzSSZE5YUAAAWpSURBVElJoUOH9nJHEa5SQJYxNjaW4cNTWbhwMTabTe449eKTTz5h//79TJs2Te4owlUKyDKmpT1GaWkpq1atkjtKvXr55Ve4447b6dy5s9xRhKsQcGVs0iSBoUOHsGDBIhwOh9xx6tXBg1/w2Wd7mTkzXe4owlUIuDKmpaVx7lwhWVlZckfxitmzX+K229rStWtXuaMIVyigynjttdcycOAA5syZg9PplDuOVxw5coSPPvp/zJyZjkajkTuOcAVUWcbGjRvTuvXNl7z++OPTKCgoYPPmLTKk8p3Zs1+iVauW3Htv9wte1+l0dOt2j0yphD+iyjK2adOG7du3sXz5Mpo3bw6cfyJwnz59ePXVObhcLpkTetexY8fIzs5m5sx0tFotWq2W++//O3v27CYjYxk6nU7uiMJlqPLRuElJiVRWVtK0aVN27cpm69b3iYxswPfff8+2bdvljucTr746lz17djFr1pN06XIXycnJHDx4kBtvvIGEhHgKCn6UO6JwEVXOjElJSRw9epQePXrx8MNjadbsRu666y7Ky8sD5mbcuLhYzp49y/jxj3DmzE/06tWb8ePPr5uTmJgoczrhclRbxry8PCRJYvfuPfTseR8TJkwkNjaWjz/+iAUL5qu2lO3btyMrax1r1qzm5MlT9O59Pw89NJrvvvuO0tJSLBaLKKNCqbKMiYmJ5OXl//Jzj8fDtm3bSUnpxpNPzqJz5058/PFHqnruoU6nY8WKN9m0aSMej0SfPn0ZOnQYX3/99QXvO3Uqj6SkJHlCCr9LdWU0Go3ExzcmPz//kq+5XC6++eYbjEYjhw8fYevW92VI6B1ut5slS16jqqoKt9vN8ePHL/u+/Px8UUaFUl0Zmza9Bq1We8HMWOeWW25h7do15OTkMGLESCwWiwwJvefQoUP07duf5s2TycpaR4MGDS55T15eHklJYjNViVRXxrrv+hfPjJ06dWLdujV8+eUhhg8fidVqlSGd9+Xk5DBo0IPExsaydu0aoqMvfC5Hfn4+iYmJ4oIABVJlGYuLSy64R/Gee1LIzFzJhx9+xNix47Db7TIm9L7c3Fz69euP2RzKxo0baNy48S9fy8vLx2QyERsbK2NC4XJUV8bzB2/yfvl5nz738+aby9mwYSNTpkxV/Qn/OqdPn6FfvwG4XE42bdr4yxHUur8bsamqPKorY1JS4i+bqAMG9GfhwgVkZq7iiSeexOPxyJzOt4qLixk4cDClpSW8995GkpOTKSwsxGaziYM4CqTCMiaRn5/PQw+NYt68uSxblsHTTz+DJElyR5NFRUUFQ4emkp9fwLp1a2jRogUFBQXiXKMCqepyOJ1OR5MmTejW7R5at27NCy/8m6VL/WdhYm+xWCykpg5nxYo3Wb9+LWVlZWJmVCBVzYwJCQkYDAZat27Ns8/+UxTxV2pqahgxYiT79u3j2muvFfuMCqSqMiYlJeJyuZg6NY233vLf5Re9xel0MmHCJLZs2SpmRgVSVRkTEhKYMGES7733ntxRFOv8N6vH2L59O5GRkXLHEX5Fk5BwjWqObAQFBan+HGJ90Wg0GAwG1a0D5MeyVDUziiL+eZIkiSIqjKrKKAj+TJRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEKUURAUQpRREBRClFEQFEIPZMkdQhAE9v9/Cq8iB0C/dl8AAAAASUVORK5CYII="},446:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOMAAAD7CAYAAACYCyO6AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3de1yUVf4H8M8MAwOCouAFIdcEFVYQf1JuYopYYZl3WczVktVt85K1ixfypVleig21xcT8+fNauYmoQd5Q8oIoJIqXVAi5KmJcREJBbgMz5/fHWUwTDY15zjPPfN+v17xccfJ8dPl4nnku56gYYwyEENF2qkUnIIRwVEZCZILKSIhMaEQHIPKh1+tRUlKCkpIS3Lp1C3q9HpWVlWhoaECrVq2g1WphY2ODtm3bonPnznBwcBAdWVGojGaopqYGqampuHjxItLS0pCeno7c3FzcuHEDer2+2b+PtbU1nnrqKbi7u8PLywuenp7w8fFBr169oFKpjPgnUCYVnU1VPoPBgFOnTiEuLg7Hjh1Damoq6urq4ODgcLdE7u7u6Ny5M5ydndGpUyc4ODhArVajdevW0Gg0qK6uRl1dHWpra/Hzzz+jsLAQRUVFKCgowI8//oj09HRkZGRAp9OhQ4cOGDRoEIYMGYJRo0bhD3/4g+i/AlOwk8qoYMnJyfj666+xe/duFBYWws3NDf7+/hg8eDAGDx7c4iVpaGjADz/8gOPHjyMxMRGJiYmoqKjAM888g8DAQEyePBnOzs4tOqaCUBmV5s6dO/jqq6+wbt06XLp0Cd7e3ggMDMTYsWPRu3dvSbPodDocPXoUsbGxiImJwa1btzBy5EjMmDEDAQEBkmYxATvBiCJUVlayVatWMScnJ2Ztbc2CgoLYoUOHRMe6q66uju3YsYO99NJLTKVSMW9vb7Zjxw5mMBhER5OLHVRGE6fX69natWuZo6Mja9OmDXv//fdZWVmZ6FiPdPbsWTZq1CimUqnYn/70J3b69GnRkeSAymjKzp49y/r168csLS3Z3LlzZV/CXzt37hzz9/dnarWaTZ8+nZWXl4uOJBKV0RQZDAYWHh7OLC0tmZ+fH0tLSxMd6YkZDAa2detW5uTkxLp27cqSk5NFRxKFymhqfv75ZzZ06FBmaWnJli9frpjPXKWlpWz48OFMo9Gw5cuXi44jwg666G9CCgoKMGzYMFRUVCA5ORn9+vUTHanFtG/fHnv37kVERARCQ0Nx5coVREZGwsLCQnQ0yVAZTUROTg6GDBmCdu3a4eTJk3BxcREdqcWpVCrMnj0brq6umDhxIkpLSxEVFQWNxjy+TelGcRNQVFSEl19+Gc7Ozjh+/Lgii3ivMWPGID4+HnFxcZg2bRqYmVwKpzLKXHV1NYYNGwYrKyvs378fbdu2FR1JEoMGDcLOnTuxdetWLFmyRHQcSVAZZW7OnDm4du0aDh48iPbt24uOI6lXX30VkZGRWLZsGY4dOyY6jtHR7XAytnfvXowePRo7d+5EYGCg6DjCBAUFISUlBZcuXVLykQEtuyFXOp0OISEhmDhxolGLePPmTWzatAnDhw+HVquFSqXCwYMHH3hfVVUVNm7ciBdeeAHOzs7QarXo0aMHQkNDUVFRYbR8ALB+/XrU1dUhLCzMqOMIJ/jaCnmIiIgIZmNjw65du2bUcV5++WUG4L7XgQMHHnjfsmXLHnhf4+uPf/wju3XrllFzrl69mllbW7OrV68adRyBdtDMKEMGgwERERGYMWMGunTpYtSxOnTogKlTp2Lfvn148803H/o+Ozs7BAcHIz4+HgUFBbhz5w7i4+Ph4uKCjIwMrFq1yqg5p02bho4dO+Lzzz836jhCif7ngDwoPj6eAWAZGRmSjvv2228/dGZ8mP/85z8MABsxYoQRk3Effvgh69SpE9PpdEYfSwCaGeVo+/bt8PX1hYeHh+gov6lbt24AIMmZ3ilTpuDGjRtISEgw+lgiUBll6MSJEybz8G3jyZ5JkyYZfayuXbuie/fuSEpKMvpYIlAZZebmzZvIzc2Fr6+v6Ci/6YcffsCKFSvwl7/8BS+99JIkYw4YMAAnT56UZCypURllJj8/H4wxuLu7i47ySFeuXMHIkSPh7e2NjRs3SjZuz549cfXqVcnGkxKVUWZu3rwJAHB0dBSc5OGuXLkCf39/tG3bFgcOHECrVq0kG9vR0RFlZWWSjSclKqPM1NTUAABsbGwEJ2labm4uBg8ejFatWuHw4cOSL2RsZ2eHqqoqSceUCpVRZtq1awcAKC8vF5zkQZmZmRg8eDBsbGxw9OhRdOrUSfIMZWVlil3JnMooM42Hp6WlpYKT3C89PR2DBw+Gra0tEhIS0LlzZyE5SktLZX0I/3tQGWWmR48esLa2xvnz5yUZb/HixVCpVFCpVHfvbhk2bNjdr12+fBkAEBkZiZKSEmRlZcHFxeXurze+vLy8JMl77tw5ydd/lQqVUWa0Wi369u2L77//XnQU2WGMISUlxSQu+zwJeoRKhhYtWoQvvvgCV69eNas1YH5LYmIi/P39cenSJclmYgnRI1RyNGXKFPz00084dOiQ6CiysmnTJvTr10+JRQRAh6my5OrqCj8/P0RERIiOIhvXr1/Hrl27Hvlkiamjw1SZOn78OAYPHoz4+HgMHTpUdBzhpkyZgmPHjuHy5cvQarWi4xgD7UIlZ6NGjUJeXh7OnDkDa2tr0XGESUlJwcCBA/HVV19h4sSJouMYC5VRzgoKCtCnTx+8/vrrWL16teg4Qty5cwc+Pj5wdXXFgQMHlLwjMp3AkbMuXbpg7dq1WLNmDaKjo0XHkZzBYEBwcDAqKyvx5ZdfKrmIAGhFcdmbMGECTp06heDgYLRv3x4vvvii6EiSmTVrFuLi4vDdd98JufVOcqLWGCDNp9fr2aRJk1jr1q3Z0aNHRccxOoPBwObMmcMsLCxYbGys6DhSoV2oTIVOp2MTJkxgWq2WRUVFiY5jNHV1dWzixInMysqKff3116LjSInKaEr0ej2bPXs2U6lU7L333lPcwkxXr15lAwYMYG3atJHVFugSoQWpTIlarcann36KjRs3Ys2aNfDz80Nubq7oWC1i165d6Nu3L27fvo3vv/9esmU85ITKaIKmTp2K1NRU1NTUoHfv3li2bBnq6upEx3oijct3BAUFISgoCKmpqfD09BQdSwzRczN5cjqdji1fvpzZ2dmx7t27s61bt7KGhgbRsZrlxo0b7L333mM2NjasV69eLCEhQXQk0egzoxIUFBSw4OBgptFomLu7O9uyZQurqakRHatJ165dY/PmzWN2dnasY8eOLCIiQnGffZ8QlVFJsrOz2V//+ldmZWXFHBwc2D//+U+WlpYmOhbT6XRs7969bOTIkczCwoI5OTmxlStXsqqqKtHR5GQH3Q6nQCUlJdi8eTM2bNiAK1euwMPDA4GBgRgzZgz69u0ryTOSlZWVSEhIQExMDPbu3Yvy8nK88MILmDZtGkaPHg0rKyujZzAxdG+qkhkMBiQnJyMmJgaxsbHIz8+Hvb09Bg4ciIEDB8LHxwdeXl5wdnb+XeM0NDQgOzsbaWlpSElJwYkTJ3D+/HkYDAb4+vpi3LhxGDduHJ5++umW+YMpE5XRnKSlpSExMREe//43jpWV4aPbtwEADg4O6NmzJ5ycnNClSxd07NgR9vb20Gq1aNWqFbRaLSorK9HQ0IDKykpUVFSgoKAAJSUluHbtGrKysqDT6aDRaGBjYwM/Pz8EBwfDz8/PPG5jaxlURrOTng54ewNRUSh78UVcunQJ6enpyMnJQXFxMX766SeUlJSgoqICdXV1qKqqgk6ng52dHSwtLdG6dWu0adMGLi4ucHJywlNPPQUPDw94enqiV69emDRpEjIzM3HhwgWo1XTl7DFQGc1OYCCQlQVcuAAYoSzp6enw9vZGVFQUxo8f3+K/v4JRGc3KuXPAs88CsbHA6NFGG2bSpEk4c+YM0tPTodHQg0HNRGU0KyNGAMXFQGoqYMRnA7Ozs9GrVy9s2rQJkydPNto4CkNlNBupqcBzzwFxccArrxh9uKlTpyIhIQGZmZl0GaN5qIxmIyAAqKkBJNpoND8/Hz179sSaNWvw97//XZIxTRyV0SwkJQGDBgFHjwJDhkg27MyZM7F//35kZWUpdUW3lkRlNAv+/oBGAxw+LOmwRUVFcHNzw/LlyzFr1ixJxzZBtCCV4sXHA4mJwIcfSj50586dMW3aNISFhaG6ulry8U0NlVHpPvwQePVVfpgqwIIFC3Dnzh2sXbtWyPimhMqoZHv2AKdPC5kVG3Xo0AEzZ85EeHg4KisrheUwBVRGpWKMl3DsWOBPfxIaZd68edDpdGa7EHNzURmVatcu4OJF4IMPRCeBo6MjQkJCsHLlSllujy4XVEYl0uuBxYuB114D+vQRnQYAEBISArVaTTtrPQKVUYm2bQMyM2UxKzayt7fHnDlzEBERgRs3boiOI0tURqXR64GPPwbeeAPw8BCd5j7/+Mc/YGtri08//VR0FFmiMirNli1AXh6waJHoJA+wtbVFaGgoIiMjUVhYKDqO7NAdOEqi0/HZcOhQYN060WmaVFtbix49eiAwMBCrVq0SHUdO6A4cRdmwASgsBBYuFJ3koaytrTF//nysW7cOBQUFouPICs2MSlFbC/TowZ/kl/mMo9Pp4OHhgaFDh2KdTGdwAWhmVIy1a4GyMiA0VHSS32RlZYUFCxZg8+bNyMvLEx1HNmhmVIKqKsDNDQgOBsLDRadpFr1eD09PT/j6+mLLli2i48gBzYyK8NlnvJBz5ohO0mwWFhZYuHAhtm7disuXL4uOIws0M5q627cBV1fg7beBpUtFp3kser0e3t7e6NOnD7Zt2yY6jmg0M5q8iAjAYABCQkQneWwWFhZYvHgxoqOjceHCBdFxhKOZ0ZSVl/NZce5cWV/OeBTGGHx8fNCtWzfExMSIjiMSzYwmLTycL6fx7ruikzwxlUqFJUuW4Ntvv8Xp06dFxxGKZkZTVVrKz6B+8AGfGU1c//794ejoiP3794uOIgrNjCYrLAywtQVmzhSdpEUsWbIEcXFxOHHihOgowtDMaIqKivisGB4OvPOO6DQtxt/fHxqNBoclXsVOJmhmNEnLlgEdOgBvvSU6SYv66KOPcOTIESQkJIiOIgTNjKYmPx/o2RNYswZQ4ErdAQEBqK6uRnJysugoUqOZ0eQsXQo4O/Nb3xQoLCwMJ0+exMGDB0VHkRzNjKYkOxvo1QvYtAlQ8O5OI0aMQHFxMVJTU6Ey4m5ZMkMzoyxdvw6cPfvg1xcv5hf5J06UPJKUwsLCcP78eezZs+e+r+v1euzbt09QKuOjMsrR6dNAv358Q9NLl/jX0tOB7dv5YarCNyD19vbG2LFj8f7778NgMMBgMGDHjh3w8PDAuHHjoNfrRUc0CjpMlaMVK4AFC/j/1uuBoCDg1i3+FL+Rtv+Wm8btyGfPno24uDhkZGRApVLBYDAgLy8P3bp1Ex2xpdFhqizl5PCdhRsa+MrgsbHAoUOAgwNfbMoMFBUVwdnZGStXrkRmZiYYYzAYDACA3NxcwemMg8ooR5cvA/X1v/y8vp6X8uRJvuDUG28otpRJSUkYOHAgAgICUFxcDAD3HZZqNBoqI5FQdnbTX6+v54et0dG8lOvXS5vLiPR6PUaPHo1Bgwbh1KlTAICGhoYH3qdWq5GTkyN1PElQGeWmrg7474zwUIwBPj58+X6FsLCwwPz582FnZ/fI99XX1yMrK0uiVNKiMsrNlSu8bA+j0QD9+/NdiO3tpcslAV9fX6SkpKBt27bQPOSMMWNMsct0UBnl5lGHYBoNEBDAT+b8xgxiqjw9PZGUlARHR0dYWlo2+Z78/Hwo8SIAlVFucnKApr4J1Wpg3Dhg927A2lr6XBJyd3fHqVOn4Ozs3GQh6+rqUFRUJCCZcVEZ5SY3l1/WuJdaDUydCkRFNV1UBeratStSUlLg5ubWZCGVeEaVyig3WVl8z4xGajUwfTo/c2oGF/vv5eTkhOTkZHh5ed1XSAsLC0WeUTWv/3dNwb0nJ1QqYN484PPPH5wtzYSDgwMSEhLg4+Nzt5BKvdao7JscpabXAyUl/HXrFv95ZSW/k6ZVK0CrBWxsgLZtgc6d+R01v/7v790qbcUKk1qY2Fjs7e1x5MgRjBgxAklJSdDpdMh+2LVYE0ZlfBI1NUBqKnDxIpCWxm/izs0FbtzghWoua2vgqacAd3fAy4s/vd/QwGfBzz5T1JIav5etrS3i4+Mxfvx47N69GxkZGaIjtTi6Ubw5DAbg1CkgLg44dowXsa6Oz2xeXoCnJy9U5878wd9OnfivqdVA69b8kkR1Nf9vamuBn3/mM2BREVBQAPz4Iy90ejovY5s2wEsvAUOGAKNGAX/4g+i/Admor6/H66+/jvj4eNy6dUt0nJa0k8r4KMnJwNdf88sJhYV8ESh/f2DwYP5q6ZJs2MAPby0sgMRE/qqoAJ55hm/1NnkyL7uZ0+v1mD59Oj755BM4OjqKjtNSqIwPuHMH+OorvvPvpUuAtzcvwtixQO/exh27tvb+a4g6HXD0KH9qIyaGF3XkSGDGDH7x34wxxqDT6aDVakVHaSlUxrvu3OHLWXzyyS/f9G+9xQ8X5UCn4zP0+vXAkSP8H4b33wf+/GezPdOqMPQ8IwwG4H//F3j6ab4695tvAj/9BOzYIZ8iAoCVFX/I+NAh4MwZnve11/h9qqmpotORFmDeZTx3jn8z/+MfwJQp/CbtZcsevOQgNz4+fJY8e5ZfMunfnx+6KuuEhtkxzzIyBixfzr+JbWyA8+f5NT25l/DX+vblnym//BL49lvgf/4H+P570anIEzK/MpaXA6+8wj9vffwxv1Th6Sk61ZNTqYDXX+cnm7y8+FneFStEpyJPwLwu+hcUAMOG8csFycl8BTalaN8e2LuXb54aGsoPuSMj+WUSYhLMp4w5Ofwiert2fC0ZFxfRiVqeSgXMnv3L2qqlpfxJD4Uv7agU5nGYWlQEvPwyv2B+/Lgyi3ivMWOA+Hh+x9C0aY9eOYDIhvLLWF3ND02trID9+/lN2uZg0CBg505g61ZgyRLRaUgzKL+Mc+YA164BBw/yz1Xm5NVX+efGZcv4iSoia8q+A2fvXr5E/s6d/JY2cxUUBKSk8DOu5nJkYHoUfAeOTgeEhPATGRIW8ebNm1CpVE2+2ooqwvr1/ImRsDAx45NmUW4Z167lT1r861+ik4jXrh2waBE/ZM3PF52GPIQyy2gw8OttM2YAXboIiRAcHAzG2H0voc/fTZsGdOzIl/AgsqTMMh4+zE/aKHCb7SdmZcXvv/3qq/v38SCyocwybt8O+Pry/SjIL6ZM4UuDJCSITkKaoMwynjgh/OHbI0eOwMXFBVqtFj179sT8+fNRWVkpNBO6dgW6dweSksTmIE1SXhlv3uSLQ/n6Co1x/fp1FBYW3l3JLDw8HM8//zwqKiqE5sKAAfx2QCI7yitjfj6//cvdXcjwKpUKY8eORXJyMioqKlBcXIyoqCi4uLjg0qVLWCH6iYqePYGrV8VmIE1SXhlv3uQ/ClqoyNHRETExMRgwYABat26NTp06YcKECYiKigIA7N27V0iuewICZWViM5AmKa+MNTX8RxsbsTl+5bnnnoNKpcKNGzfEBrGzA6qqxGYgTVJeGdu14z+Wl4vN8Stnz54FYwydOnUSG6SszPRWNDATynvQrfHwtLSUX+SW2LvvvouOHTti5MiRcHNzQ21tLU6cOIHZs2cDAEaPHi15pvuUlgo7hCePprwy9ujB1x49f17IchqFhYWIjIzEokWLHvi1Z599FvPmzZM8033OnTP++q/kiSjvMFWr5Qs1CVqY6bPPPsO8efPg7e0Ne3t7WFtbw8vLC0uXLsXx48dha2srJBcAfpY5JUX4ZR/SNGU+QrVoEfDFF/wUPq0B84vERL49QePiVUROFPoI1ZQpfCHiQ4dEJ5GXTZv4IlxURFlSZhldXQE/P/7kBuGuXwd27eIrphNZUmYZAWDpUuC77/iL8EP3Tp2A4GDRSchDKPMzY6NRo4C8PL43xb27O5mblBRg4ED++NTEiaLTkKYpfBeqggKgTx++4vbq1aLTiHHnDt+bw9UVOHCAdqySL4WewGnUpQtffmPNGiA6WnQa6RkM/LC0spLvx0FFlDXlXfT/tQkT+BbgwcF8qcYXXxSdSDqzZvGFjL/7jn9eJLKm7Jmx0aef8k1Fx441j6fcGQPmzuWrwkVF8QWNieyZRxnVamDLFmD4cL66+PbtohMZj07HPyNHRvITNmPGiE5Emsk8yggAlpbA118Db7/NzyjOn6+8hZny8/nmPvv28a0M6MypSTGfMgJ8hvz0U2DjRn5Sx8+PL9GhBLt28Xtyb9/m9+XKaQt00izmVcZGU6cCqan8QeTevfleFHV1olM9mStXgJEj+RL+QUH8z2XKm7+aMfMsIwD88Y/8G3fJEr6luJcX8J//AHq96GTNU1rKD7U9PfmNDQkJwP/9n+xWOCDNZ75lBPjnyHnzgIwM4Pnn+Q3mnp78iY/aWtHpmlZQwHcmdnXlJ6XCwoAffuBPYxCTpuw7cB5XTg7w8cfAtm18rZjJk/mN1aIP++rr+ean69fz64YdOvBLFzNmAK1aic1GWorCb4d7UiUlwObNwIYN/DOZhwffyWrMGH6SRIpnJCsr+aFnTAzf2q68HHjhBb5nxujRfLl+oiRUxkcyGIDkZF6I2Fh+6cDent90PXAgv+fTy4tvT/57NDQA2dlAWhq/qfvECb5siMHAn8ofN46/nn66Rf5YRJaojI8lLQ1ITMRb//43epeV4Z3bt/nXHRz44sBOTvx+2I4deWm1Wn4YqdXyma6hgf9YUcE/+5WU8A16srIAnQ71Gg3G2djgTT8/jA4O5pde6DY2c0FlfFzp6enw9vZGVFQUxr/4Il/CIj2df94sLuYrDJSU8MLV1fE1SnU6/hnU0hJo3Rpo0wZwceHlfeopfhjs6Qn06oU/T5qEzMxMXLhwAWq1eZ9fMzNUxscVGBiIrKwso5XlvrKPH9/ivz+RLSrj4zh37hyeffZZxMbGGnX900mTJuHMmTNIT0+HRqP8B2sIACrj4xkxYgSKi4uRmpoKlRGfDczOzkavXr2wadMmTJ482WjjEFmhMjZXamoqnnvuOcTFxeGVV14x+nhTp05FQkICMjMzYUWXMcwBlbG5AgICUFNTgySJNhrNz89Hz549sWbNGvydtkM3B1TG5khKSsKgQYNw9OhRDBkyRLJxZ86cif379yMrKwtarVaycYkQVMbm8Pf3h0ajweHDhyUdt6ioCG5ubli+fDlmzZol6dhEcgpfkKoFxMfHIzExER9++KHkY3fu3BnTpk1DWFgYqqurJR+fSItmxt/Qv39/ODo6Yv/+/ULGLy0thZubGz744APMnTtXSAYiCZoZH2XPnj04ffq0kFmxUYcOHTBz5kyEh4ejsrJSWA5ifDQzPgRjDD4+PnB1dcU333wjNEtZWRlcXV0RGhqKhQsXCs1CjIZmxofZtWsXLl68iA8++EB0FDg6OiIkJAQrV65Eucy2Rycth8rYBL1ej8WLF+O1115Dnz59RMcBAISEhECtViOCdtZSLCpjE7Zt24bMzExZzIqN7O3tMWfOHERERODGjRui4xAjoM+Mv6LX6+Hp6QlfX19s2bJFdJz7VFVVwc3NDcHBwQgPDxcdh7Qs+sz4a1u2bEFeXh4WLVokOsoDbG1tERoaisjISBQWFoqOQ1oYzYz30Ol08PDwwNChQ7Fu3TrRcZpUW1uLHj16IDAwEKtWrRIdh7QcmhnvtWHDBhQWFsr68oG1tTXmz5+PdevWoaCgQHQc0oJoZvwvU5pxTGEGJ4+NZsZGa9euRVlZGUJDQ0VH+U1WVlZYsGABNm/ejLy8PNFxSAuhmRGmeZZSzmd9yROhmREAPvvsM1RVVWHOnDmiozSbhYUFFi5ciK1bt+Ly5cui45AWYPYz4+3bt+Hq6oq3334bS5cuFR3nsej1enh7e6NPnz7Ytm2b6Djk96GZMSIiAgaDASEhIaKjPDYLCwssXrwY0dHRuHDhgug45Hcy65mxvLwcrq6umDt3rqwvZzxK49Ml3bp1Q0xMjOg45MmZ98wYHh4OjUaDd999V3SUJ6ZSqbBkyRJ8++23OH36tOg45Hcw25lRaU/Qi16RgPxu5jszhoWFwdbWFjNnzhQdpUUsWbIEcXFxOHHihOgo5AmZ5czYuOpaeHg43nnnHdFxWoyoVexIizDPmXHZsmXo0KED3nrrLdFRWtRHH32EI0eOICEhQXQU8gTMbmZU+krdAQEBqK6uRnJysugo5PGY3yLGf/vb33D06FHF7mEh9Z4gpMWYVxnNZXcnqXbLIi1KmZ8Zr1+/jrNnzz7w9cWLF8PV1RUTJ04UkEo6YWFhOH/+PPbs2XPf1/V6Pfbt2ycoFflNTIG++eYbplKp2KhRo9jFixcZY4ylpaUxtVrNtm/fLjidNAIDA5mXlxfT6/VMr9ez6Oho1r17d2ZpackaGhpExyMP2qHIw9QVK1ZgwYIFAPhsEBQUhFu3bqGwsNBo23/LTeN25LNnz0ZcXBwyMjKgUqlgMBiQl5eHbt26iY5I7qfMw9ScnByoVCo0NDSAMYbY2FgcOnQIDg4OZvMwblFREZydnbFy5UpkZmaCMQaDwQAAyM3NFZyONEWRZbx8+TLq6+vv/ry+vh6MMZw8eRIeHh544403FFvKpKQkDBw4EAEBASguLgbAjw4aaTQaKqNMKbKM2dnZTX69vr4eer0e0dHR8PDwwPr16yVOZjx6vR6jR4/GoEGDcOrUKQBAQ0PDA+9Tq9XIycmROh5pBsWVsa6u7u6M8DDsv48dvfbaaxKlMj4LCwvMnz8fdnZ2j3xffX09srKyJEpFHofiynjlyhU86pyURqNB//79cfjwYdjb20uYzPh8fX2RkpKCtm3bQqPRNPkexhgt0yFTiivjow7BNBoNAgICcOjQod+cQUyVp6cnkpKS4OjoCEtLyybfk5+f/8h/sIgYiixjU9+EarUa48aNw+7du2FtbS0gmXTc3d1x6rDolIQAAAI8SURBVNQpODs7N/l3UVdXh6KiIgHJyKMoroy5ubkP3AKmVqsxdepUREVFPXS2UJquXbsiJSUFbm5uTf6Z6Yyq/CiujFlZWdDpdHd/rlarMX36dKxfv94sLvbfy8nJCcnJyfDy8rqvkBYWFnRGVYYU991578kJlUqFefPm4fPPPzfbG6YdHByQkJAAHx+fu4Wka43ypKgy6vX6+7ZKW7FiBT755BOBieTB3t4eR44cwfPPPw+NRgOdTvfQa7FEHEWVMT8/Hw0NDVCpVFi9erVJrRBubLa2toiPj8fw4cPBGENGRoboSORXFFXG3NxcaDQabN26VVFr27QUKysr7Ny5E+PHj8e1a9dExyG/oqgyXrt2DdHR0Zg0aZLoKLJlaWmJbdu2ISgoCGVlZaLjkHso6hGq2tpaxV9DbCmMMeh0Omi1WtFRCKesR6ioiM2nUqmoiDKjqDISYsqojITIBJWREJmgMhIiE1RGQmSCykiITFAZCZEJKiMhMkFlJEQmqIyEyASVkRCZoDISIhNURkJkgspIiExQGQmRCSojITJBZSREJqiMhMgElZEQmaAyEiITVEZCZILKSIhMUBkJkQkqIyEyQWUkRCaojITIBJWREJmgMhIiE1RGQmSCykiITFAZCZEJKiMhMkFlJEQmqIyEyASVkRCZoDISIhNURkJkgspIiExQGQmRCSojITJBZSREJqiMhMgElZEQmaAyEiITVEZCZILKSIhMUBkJkQkqIyEyoQGwU3QIQghS/h8yWeCKfG/IcQAAAABJRU5ErkJggg=="},7659:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_2_dark-e8c35bc37b250271cf480f71904c15a7.png"},841:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_2_light-5e6a1d53e559a30e5fb86ee019229bbd.png"},2979:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_3_dark-4e8b2ca938738395e438b7fc2fc5dfe4.png"},2658:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_3_light-51521ba414ff3a3530ed0109cfab799d.png"},5959:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_4_dark-3cc1c8d4b39707d2a51b51f4f1b29dc8.png"},2014:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_4_light-631a0b3947be21a12b3a489f0cd0c3c4.png"},1105:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_5_dark-9028cc10e78c05cb669d5d438dcbf93f.png"},162:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_5_light-6b8f80047906eb1f58472d231eb9b12a.png"},4300:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_6_dark-160fd071a93e279a5339c7976745f8b1.png"},355:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_6_light-b090675f7b30b574af44d667b083e9b7.png"},363:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_7_dark-35ede8f297484f4305ea7fd23cbddc49.png"},2530:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_7_light-018e13c41ce1fc6257c4c65748aaae27.png"},3122:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_8_dark-b0f871ab182d06edb5c29bb490ad70bc.png"},6039:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/rr_8_light-81ac4c8a3988bd43c66f563cd4799d61.png"}}]); \ No newline at end of file diff --git a/assets/js/4200b1a9.e4798bae.js b/assets/js/4200b1a9.e4798bae.js new file mode 100644 index 0000000..1e15330 --- /dev/null +++ b/assets/js/4200b1a9.e4798bae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[866],{4612:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"/2023/08/02/copr","metadata":{"permalink":"/blog/2023/08/02/copr","editUrl":"https://gitlab.com/mfocko/blog/tree/main/blog/2023-08-02-copr.md","source":"@site/blog/2023-08-02-copr.md","title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","formattedDate":"August 2, 2023","tags":[{"label":"\ud83c\udfed","permalink":"/blog/tags/\ud83c\udfed"},{"label":"red-hat","permalink":"/blog/tags/red-hat"},{"label":"copr","permalink":"/blog/tags/copr"},{"label":"admin","permalink":"/blog/tags/admin"},{"label":"vps","permalink":"/blog/tags/vps"}],"readingTime":3.44,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. your opinionated admin","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"How can Copr help with broken dependencies","description":"Copr comes to save you when maintainer doesn\'t care.","date":"2023-08-02T00:00:00.000Z","authors":[{"key":"mf","title":"a.k.a. your opinionated admin"}],"tags":["\ud83c\udfed","red-hat","copr","admin","vps"]},"nextItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"}},"content":"When you decide to run Fedora on your VPS, you might get screwed over by using\\nrandom repositories\u2026\\n\\n\x3c!--truncate--\x3e\\n\\nWhen I \u201creserved\u201d my VPS[^1] back in June \'20, I slapped Fedora on it without\\nthinking. I bet 99% of people would say that I\'m crazy for doing such thing[^2],\\n**BUT** I\'ve been using Fedora on my PCs for some time already and it felt very\\nstable and natural to just use, even for VPS.\\n\\nOne of the first things I\'ve done was setting up a mail server. You may guess\\nwhat\'s the fun part about having a mail server\u2026 Yes, it\'s all the spam you\\nreceive and only then you realize how much \u201ccrap\u201d gets filtered on free mail\\nservices. To battle this problem I chose to use\\n[rspamd](https://github.com/rspamd/rspamd) that had CentOS support, but someone\\nhad a [Copr](https://copr.fedorainfracloud.org/) repository that I used to\\ninstall it.\\n\\n## How does Copr repositories work?\\n\\nIf you have ever used Ubuntu, you might be familiar with the concept since it is\\nvery close to [PPAs](https://help.ubuntu.com/community/PPA).\\n\\ntl;dr of the whole process consists of\\n1. enabling the Copr repository, and\\n2. installing the desired package.\\n\\nSo in shell you would do\\n```\\n# dnf copr enable \u2039copr-repository\u203a\\n# dnf install \u2039package-from-the-repository\u203a\\n```\\n\\nAnd\u2026 that\'s it! Nothing else needed! Simple, right? And literally same process\\nas you would do for the PPA.\\n\\n:::tip AUR\\n\\nOn the other hand, if you are familiar with the archLinux, you definitely know\\nAUR and what it can do for you. Copr repository is pretty similar, but the\\npackages are prebuilt in Copr and Copr repositories can carry the required\\ndependencies for said packages, which simplifies the distribution, and can even\\nhelp with installing singular packages (when you just need the dependency, not\\neverything).\\n\\n:::\\n\\n## My issue\\n\\nNow you might wonder how would I use it on my VPS. It\'s rather simple, once in\\n6 months a new Fedora release comes out. And you need to upgrade to newer\\nrelease\u2026 You don\'t need to do it right away and for such setup it probably isn\'t\\neven recommended.\\n\\n:::tip\\n\\nFedora releases are supported for a year, i.e. they live 6 months till the next\\nrelease and then another 6 months till another release.\\n\\nSome people prefer to run one version \u201cbehind\u201d. If you ever decide to run it on\\nyour home server or in a similar setup, it might be a pretty good idea to\\nfollow. I\'m using the \u201clatest greatest\u201d, cause why not :smile:\\n\\nOne way or another, you still need to bump the release every six months, unless\\nyou\'d bump 2 releases at once every year, which would be a decision, since, at\\nleast I, cannot see any benefits in it\u2026 You don\'t go for \u201cstability\u201d, cause once\\na year you switch to the latest release and then, before you bump, you use one\\nyear old software, so you\'re not even using the latest.\\n\\n:::\\n\\nFast-forward 2 years in the future, new Fedora release came out (October \'22)\\nand I was doing an upgrade. Dependencies of the rspamd have been updated and\\nrspamd builds in Copr have failed and no one fixed it. Cool, so now I can\\nupgrade, but can either ignore the dependencies or uninstall the rspamd\u2026\\n\\n## How can Copr help?\\n\\nI have managed to find\\n[specfile](https://github.com/rspamd/rspamd/blob/master/rpm/rspamd.spec) for the\\nrspamd package that they use for CentOS. There were some files apart from the\\nspecfile, so I had to make an SRPM locally and then\u2026 I just uploaded the SRPM\\nto the Copr to\\n[build](https://copr.fedorainfracloud.org/coprs/mfocko/rspamd/build/5046567/)\\nan RPM.\\n\\nI have switched the previous Copr repository for rspamd with my own and happily\\nproceeded with the upgrade.\\n\\n## Conclusion\\n\\nCopr is heavily used for testing builds on the upstream with\\n[Packit](https://packit.dev). However, as you can see, it is possible to use it\\n**very well** for packaging your own stuff and avoiding issues (such as the one\\nI have described above), if need be.\\n\\n[^1]: [vpsFree.cz](https://vpsfree.cz)\\n[^2]: Even though I\'ve been running archLinux on some Raspberry Pi\'s and also\\n on one of my \u201chome servers\u201d, before getting the VPS. You could say I like\\n to live on the edge\u2026"},{"id":"aoc-2022/4th-week","metadata":{"permalink":"/blog/aoc-2022/4th-week","editUrl":"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md","source":"@site/blog/aoc-2022/04-week-4.md","title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14:00.000Z","formattedDate":"July 7, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":15.175,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"4th week of Advent of Code \'22 in Rust","description":"Surviving fourth week in Rust.","date":"2023-07-07T15:14","slug":"aoc-2022/4th-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"prevItem":{"title":"How can Copr help with broken dependencies","permalink":"/blog/2023/08/02/copr"},"nextItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"}},"content":"Let\'s go through the fourth week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 22: Monkey Map](https://adventofcode.com/2022/day/22)\\n\\n:::info tl;dr\\n\\nSimulating a movement on a 2D map with given instructions. Map becomes a cube in\\nthe 2nd part\u2026\\n\\n:::\\n\\n:::caution Rant\\n\\nThis was the most obnoxious problem of this year\u2026 and a lot of Rust issues have\\nbeen hit.\\n\\n:::\\n\\n### Solution\\n\\nIt seems like a very simple problem to solve, but with very obnoxious changes in\\nthe 2nd part and also it\'s relatively hard to decompose \xbbproperly\xab.\\n\\n#### Column iterator\\n\\nIn the first part of the problem it was needed to know the boundaries of each\\nrow and column, since I stored them in `Vec>` and padded with spaces\\nto ensure I have a rectangular 2D \u201carray\u201d. However when you wanted to go through\\neach row and column to determine the boundaries, it was very easy to do for the\\nrows (cause each row is a `Vec` element), but not for the columns, since they\\nspan multiple rows.\\n\\nFor this use case I have implemented my own _column iterator_:\\n```rust\\npub struct ColumnIterator<\'a, T> {\\n map: &\'a [Vec],\\n column: usize,\\n\\n i: usize,\\n}\\n\\nimpl<\'a, T> ColumnIterator<\'a, T> {\\n pub fn new(map: &\'a [Vec], column: usize) -> ColumnIterator<\'a, T> {\\n Self { map, column, i: 0 }\\n }\\n}\\n\\nimpl<\'a, T> Iterator for ColumnIterator<\'a, T> {\\n type Item = &\'a T;\\n\\n fn next(&mut self) -> Option {\\n if self.i >= self.map.len() {\\n return None;\\n }\\n\\n self.i += 1;\\n Some(&self.map[self.i - 1][self.column])\\n }\\n}\\n```\\n\\nGiven this piece of an iterator, it is very easy to factor out the common\\nfunctionality between the rows and columns into:\\n```rust\\nlet mut find_boundaries = |constructor: fn(usize) -> Orientation,\\n iterator: &mut dyn Iterator,\\n upper_bound,\\n i| {\\n let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == \' \');\\n let start = first_non_empty.next().unwrap().0 as isize;\\n\\n let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != \' \');\\n let end = last_non_empty.next().unwrap_or((upper_bound, &\'_\')).0 as isize;\\n\\n boundaries.insert(constructor(i), start..end);\\n};\\n```\\n\\nAnd then use it as such:\\n```rust\\n// construct all horizontal boundaries\\n(0..map.len()).for_each(|row| {\\n find_boundaries(\\n Orientation::horizontal,\\n &mut map[row].iter(),\\n map[row].len(),\\n row,\\n );\\n});\\n\\n// construct all vertical boundaries\\n(0..map[0].len()).for_each(|col| {\\n find_boundaries(\\n Orientation::vertical,\\n &mut ColumnIterator::new(&map, col),\\n map.len(),\\n col,\\n );\\n});\\n```\\n\\n#### Walking around the map\\n\\nOnce the 2nd part got introduced, you start to think about a way how not to\\ncopy-paste a lot of stuff (I haven\'t avoided it anyways\u2026). In this problem, I\'ve\\nchosen to introduce a trait (i.e. _interface_) for 2D and 3D walker.\\n```rust\\ntrait Wrap: Clone {\\n type State;\\n\\n // simulation\\n fn is_blocked(&self) -> bool;\\n fn step(&mut self, steps: isize);\\n fn turn_left(&mut self);\\n fn turn_right(&mut self);\\n\\n // movement\\n fn next(&self) -> (Self::State, Direction);\\n\\n // final answer\\n fn answer(&self) -> Output;\\n}\\n```\\n\\nEach walker maintains its own state and also provides the functions that are\\nused during the simulation. The \u201cpromised\u201d methods are separated into:\\n* _simulation_-related: that are used during the simulation from the `.fold()`\\n* _movement_-related: just a one method that holds most of the logic differences\\n between 2D and 3D\\n* _final answer_: which extracts the _proof of solution_ from the\\n implementation-specific walker\\n\\nBoth 2D and 3D versions borrow the original input and therefore you must\\nannotate the lifetime of it:\\n```rust\\nstruct Wrap2D<\'a> {\\n input: &\'a Input,\\n position: Position,\\n direction: Direction,\\n}\\nimpl<\'a> Wrap2D<\'a> {\\n fn new(input: &\'a Input) -> Wrap2D<\'a> {\\n// \u2026\\n```\\n\\n#### Problems\\n\\nI have used a lot of closures for this problem and once I introduced a parameter\\nthat was of unknown type (apart from the fact it implements a specific trait), I\\ngot suggested a \u201cfix\u201d for the compilation error that resulted in something that\\nwas not possible to parse, cause it, more than likely, violated the grammar.\\n\\nIn a similar fashion, I have been suggested changes that led to a code that\\ndidn\'t make sense by just looking at it (there was no need to try the changes),\\nfor example one suggested change in the closure parameter caused disapperance of\\nthe parameter name. :smile:\\n\\n#### Clippy\\n\\nI have to admit that Clippy was rather helpful here, I\'ll include two examples\\nof rather smart suggestions.\\n\\nWhen writing the parsing for this problem, the first thing I have spotted on the\\n`char` was the `.is_digit()` function that takes a radix as a parameter. Clippy\\nnoticed that I use `radix = 10` and suggested switching to `.is_ascii_digit()`\\nthat does exactly the same thing:\\n```diff\\n- .take_while(|c| c.is_digit(10))\\n+ .take_while(|c| c.is_ascii_digit())\\n```\\n\\nAnother useful suggestion appeared when working with the iterators and I wanted\\nto get the $n$-th element from it. You know the `.skip()`, you know the\\n`.next()`, just \u201cslap\u201d them together and we\'re done for :grin: Well, I got\\nsuggested to use `.nth()` that does exactly the combination of the two mentioned\\nmethods on iterators:\\n```diff\\n- match it.clone().skip(skip).next().unwrap() {\\n+ match it.clone().nth(skip).unwrap() {\\n```\\n\\n## [Day 23: Unstable Diffusion](https://adventofcode.com/2022/day/23)\\n\\n:::info tl;dr\\n\\nSimulating movement of elves around with a set of specific rules.\\n\\n:::\\n\\n### Solution\\n\\nThere\'s not much to mention since it\'s just a cellular automaton simulation\\n(even though the AoC rules for cellular automatons usually get out of hand\\n:wink:).\\n\\nAlthough I had a need to determine boundaries of the elves\' positions and ended\\nup with a nasty DRY violation. Knowing that you you\'re looking for maximum and\\nminimum that are, of course, exactly the same except for initial values and\\ncomparators, it looks like a rather simple fix, but typing in Rust is something\\nelse, right? In the end I settled for a function that computes both boundaries\\nwithout any duplication while using a closure:\\n```rust\\nfn get_bounds(positions: &Input) -> (Vector2D, Vector2D) {\\n let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {\\n positions\\n .iter()\\n .fold(Vector2D::new(init, init), |acc, elf| {\\n Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))\\n })\\n };\\n\\n (f(isize::MAX, &min::), f(isize::MIN, &max::))\\n}\\n```\\n\\nThis function returns a pair of 2D vectors that represent opposite points of the\\nbounding rectangle of all elves.\\n\\nYou might ask why would we need a closure and the answer is that `positions`\\ncannot be captured from within the nested function, only via closure. One more\\nfun fact on top of that is the type of the comparator\\n```rust\\n&dyn Fn(isize, isize) -> isize\\n```\\nOnce we remove the `dyn` keyword, compiler yells at us and also includes a way\\nhow to get a more thorough explanation of the error by running\\n\\n $ rustc --explain E0782\\n\\nwhich shows us\\n\\n Trait objects must include the `dyn` keyword.\\n \\n Erroneous code example:\\n \\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // error!\\n ```\\n \\n Trait objects are a way to call methods on types that are not known until\\n runtime but conform to some trait.\\n \\n Trait objects should be formed with `Box`, but in the code above\\n `dyn` is left off.\\n \\n This makes it harder to see that `arg` is a trait object and not a\\n simply a heap allocated type called `Foo`.\\n \\n To fix this issue, add `dyn` before the trait name.\\n \\n ```\\n trait Foo {}\\n fn test(arg: Box) {} // ok!\\n ```\\n \\n This used to be allowed before edition 2021, but is now an error.\\n\\n:::danger Rant\\n\\nNot all of the explanations are helpful though, in some cases they might be even\\nmore confusing than helpful, since they address _very simple_ use cases.\\n\\nAs you can see, even in this case there are two sides to the explanations:\\n* it explains why you need to use `dyn`, but\\n* it still mentions that trait objects need to be heap-allocated via `Box`\\n that, as you can see in my snippet, **does not** apply here :smile: IMO it\'s\\n caused by the fact that we are borrowing it and therefore we don\'t need to\\n care about the size or whereabouts of it.\\n\\n:::\\n\\n:::info C++ parallel\\n\\nIf you dive into the explanation above, you can notice that the `Box`\\npattern is very helpful for using types that are not known during compile-time.\\nYou would use a very similar approach in C++ when parsing some data structure\\nfrom input (let\'s say JSON for example).\\n\\nOn the other hand, in this case, it doesn\'t really make much sense, cause you\\ncan clearly see that the types **are known** during the compile-time, which in\\nC++ could be easily resolved by templating the helper function.\\n\\n:::\\n\\n## [Day 24: Blizzard Basin](https://adventofcode.com/2022/day/24)\\n\\n:::info tl;dr\\n\\nNavigating your way through a basin with series of blizzards that move around\\nyou as you move.\\n\\n:::\\n\\n:::caution\\n\\nIt\'s second to last day and I went \u201c_bonkers_\u201d on the Rust :smile: Proceed to\\nread _Solution_ part on your own risk.\\n\\n:::\\n\\n### Solution\\n\\nYou are given a map with blizzards all over the place and you\'re supposed to\\nfind the minimum time it requires you to walk through the basin without getting\\nin any of the blizzards.\\n\\n#### Breakdown\\n\\nRelatively simple, yet a bit annoying, approach can be taken. It\'s technically\\na shortest-path algorithm implementation with some relaxation restrictions and\\nbeing able to stay on one position for some time, so each _vertex_ of the graph\\nis determined by the position on the map and the _timestamp_. I have chosen to\\nuse `Vector3D`, since `x` and `y` attributes can be used for the position\\nand, well, let\'s use `z` for a timestamp, cause why not, right? :wink:\\n\\n#### Evaluating the blizzards\\n\\n:::caution\\n\\nI think that this is the most perverted abuse of the traits in the whole 4 weeks\\nof AoC in Rust\u2026\\n\\n:::\\n\\nThe blizzards move along their respective directions in time and loop around in\\ntheir respective row/column. Each vertex holds position **and** time, so we can\\n_just_ index the basin with the vertex itself, right? Yes, we can :smiling_imp:\\n\\n:::tip Fun fact\\n\\nWhile writing this part, I\'ve recognized unnecessary verbosity in the code and\\ncleaned it up a bit. The changed version is shown here and the original was just\\nmore verbose.\\n\\n:::\\n\\nI\'ll skip the boring parts of checking bounds and entry/exit of the basin :wink:\\nWe can easily calculate positions of the blizzards using a modular arithmetics:\\n```rust\\nimpl Index for Basin {\\n type Output = char;\\n\\n fn index(&self, index: Position) -> &Self::Output {\\n // \u2039skipped boring parts\u203a\\n\\n // We need to account for the loops of the blizzards\\n let width = self.cols - 2;\\n let height = self.rows - 2;\\n\\n let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;\\n [\\n (\\n index.y() as usize,\\n blizzard_origin(width, -1, index.z(), index.x()),\\n \'>\',\\n ),\\n (\\n index.y() as usize,\\n blizzard_origin(width, 1, index.z(), index.x()),\\n \'<\',\\n ),\\n (\\n blizzard_origin(height, -1, index.z(), index.y()),\\n index.x() as usize,\\n \'v\',\\n ),\\n (\\n blizzard_origin(height, 1, index.z(), index.y()),\\n index.x() as usize,\\n \'^\',\\n ),\\n ]\\n .iter()\\n .find_map(|&(y, x, direction)| {\\n if self.map[y][x] == direction {\\n Some(&self.map[y][x])\\n } else {\\n None\\n }\\n })\\n .unwrap_or(&\'.\')\\n }\\n}\\n```\\n\\nAs you can see, there is an expression for calculating the original position and\\nit\'s used multiple times, so why not take it out to a lambda, right? :wink:\\n\\nI couldn\'t get the `rustfmt` to format the `for`-loop nicely, so I\'ve just\\ndecided to go with iterating over an elements of a slice. I have used, once\\nagain, a combination of two functions (`find_map` in this case) to do 2 things\\nat once and at the end, if we haven\'t found any blizzard, we just return the\\nempty space.\\n\\nI think it\'s a very _nice_ (and naughty) way how to use the `Index` trait, don\'t\\nyou think?\\n\\n#### Shortest-path algorithm\\n\\nFor the shortest path you can choose and adjust any of the common shortest-path\\nalgorithms, in my case, I have decided to use [_A\\\\*_] instead of Dijkstra\'s\\nalgorithm, since it better reflects the _cost_ function.\\n\\n:::info Comparison of costs\\n\\nWith the Dijkstra\'s algorithm I would proceed with the `time` attribute used as\\na priority for the queue.\\n\\nWhereas with the _A\\\\*_, I have chosen to use both time and Manhattan distance\\nthat promotes vertices closer to the exit **and** with a minimum time taken.\\n\\n:::\\n\\nCost function is, of course, a closure :wink:\\n```rust\\nlet cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());\\n```\\n\\nAnd also for checking the possible moves from the current vertex, I have\\nimplemented, yet another, closure that yields an iterator with the next moves:\\n```rust\\nlet next_positions = |p| {\\n [(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]\\n .iter()\\n .filter_map(move |&(x, y, t)| {\\n let next_p = p + Vector3D::new(x, y, t);\\n\\n if basin[next_p] == \'.\' {\\n Some(next_p)\\n } else {\\n None\\n }\\n })\\n};\\n```\\n\\n#### Min-heap\\n\\nIn this case I had a need to use the priority queue taking the elements with the\\nlowest cost as the prioritized ones. Rust only offers you the [`BinaryHeap`] and\\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\\nelements in wrapped in a [`Reverse`] (as is even showed in the linked [docs of\\nthe `BinaryHeap`]). However the wrapping affects the type of the heap and also\\npopping the most prioritized elements yields values wrapped in the `Reverse`.\\n\\nFor this purpose I have just taken the max-heap and wrapped it as a whole in a\\nseparate structure providing just the desired methods:\\n```rust\\nuse std::cmp::{Ord, Reverse};\\nuse std::collections::BinaryHeap;\\n\\npub struct MinHeap {\\n heap: BinaryHeap>,\\n}\\n\\nimpl MinHeap {\\n pub fn new() -> MinHeap {\\n MinHeap {\\n heap: BinaryHeap::new(),\\n }\\n }\\n\\n pub fn push(&mut self, item: T) {\\n self.heap.push(Reverse(item))\\n }\\n\\n pub fn pop(&mut self) -> Option {\\n self.heap.pop().map(|Reverse(x)| x)\\n }\\n}\\n\\nimpl Default for MinHeap {\\n fn default() -> Self {\\n Self::new()\\n }\\n}\\n```\\n\\nRest is just the algorithm implementation which is not that interesting.\\n\\n## [Day 25: Full of Hot Air](https://adventofcode.com/2022/day/25)\\n\\n:::info tl;dr\\n\\nPlaying around with a numbers in a _special_ base.\\n\\n:::\\n\\nGetting flashbacks to the _IB111 Foundations of Programming_\u2026 Very nice \u201cproblem\u201d\\nwith a rather easy solution, as the last day always seems to be.\\n\\n### Solution\\n\\nImplementing 2 functions, converting from the _SNAFU base_ and back to the _SNAFU_\\n_base_ representation. Let\'s do a bit more though! I have implemented two functions:\\n* `from_snafu`\\n* `to_snafu`\\n\\nNow it is apparent that all I do is number to string and string to number. Hmm\u2026\\nthat sounds familiar, doesn\'t it? Let\'s introduce a structure for the SNAFU numbers\\nand implement the traits that we need.\\n\\nLet\'s start with a structure:\\n```rust\\n#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]\\nstruct SNAFU {\\n value: i64,\\n}\\n```\\n\\n#### Converting from `&str`\\n\\nWe will start by implementing the `FromStr` trait that will help us parse our input.\\nThis is rather simple, I can just take the `from_snafu` function, copy-paste it\\ninto the `from_str` method and the number I get will be wrapped in `Result` and\\n`SNAFU` structure.\\n\\n#### Converting to `String`\\n\\nThis is more fun. In some cases you need to implement only one trait and others\\nare automatically implemented using that one trait. In our case, if you look in\\nthe documentation, you can see that `ToString` trait is automatically implemented\\nfor any type that implements `Display` trait.\\n\\nLet\'s implement the `Display` trait then. We should be able to use the `to_snafu`\\nfunction and just take the `self.value` from the `SNAFU` structure.\\n\\nAnd for the convenience of tests, we can also implement a rather simple `From`\\ntrait for the `SNAFU`.\\n\\n#### Adjusting the code\\n\\nAfter those changes we need to adjust the code and tests.\\n\\nParsing of the input is very easy, before we have used the lines, now we parse\\neverything:\\n```diff\\n fn parse_input>(pathname: P) -> Input {\\n- file_to_lines(pathname)\\n+ file_to_structs(pathname)\\n }\\n```\\n\\nPart 1 needs to be adjusted a bit too:\\n```diff\\n fn part_1(input: &Input) -> Output {\\n- to_snafu(input.iter().map(|s| from_snafu(s)).sum())\\n+ SNAFU::from(input.iter().map(|s| s.value).sum::()).to_string()\\n }\\n```\\n\\nYou can also see that it simplifies the meaning a bit and it is more explicit than\\nthe previous versions.\\n\\nAnd for the tests:\\n```diff\\n #[test]\\n fn test_from() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(from_snafu(s), *n);\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(s.parse::().unwrap().value, n);\\n }\\n }\\n \\n #[test]\\n fn test_to() {\\n- for (n, s) in EXAMPLES.iter() {\\n- assert_eq!(to_snafu(*n), s.to_string());\\n+ for (&n, s) in EXAMPLES.iter() {\\n+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());\\n }\\n```\\n\\n## Summary\\n\\nLet\'s wrap the whole thing up! Keeping in mind both AoC and the Rust\u2026\\n\\n![Finished advent calendar :smile:](/img/blog/aoc-2022/04-week-4/calendar.png)\\n\\n### Advent of Code\\n\\nThis year was quite fun, even though most of the solutions and posts came in\\nlater on (*cough* in \'23 *cough*). Day 22 was the most obnoxious one\u2026 And also\\nit feels like I used priority queues and tree data structures **a lot** :eyes:\\n\\n### with Rust\\n\\nI must admit that a lot of compiler warnings and errors were very useful. Even\\nthough I still found some instances where they didn\'t help at all or cause even\\nworse issues than I had. Compilation times have been addressed with the caching.\\n\\nBuilding my first tree data structure in Rust has been a very \u201cinteresting\u201d\\njourney. Being able to write a more generic BFS algorithm that allows you to not\\nduplicate code while still mantaining the desired functionality contributes to\\na very readable code.\\n\\nI am definitely much more aware of the basic things that bloated Python is\\nmissing, yet Rust has them\u2026\\n\\nUsing explicit types and writing down placeholder functions with `todo!()`\\nmacros is very pleasant, since it allows you to easily navigate the type system\\nduring the development when you don\'t even need to be sure how are you going to\\nput the smaller pieces together.\\n\\nI have used a plethora of traits and also implemented some of them to either be\\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\\ncopying, equality comparison, etc.\\n\\nI confess to touching more \u201ccursed\u201d parts of the Rust, such as macros to\\ndeclutter the copy-paste for tests or writing my own structures that need to\\ncarry a lifetime for their own fields.\\n\\ntl;dr Relatively pleasant language until you hit brick wall :wink:\\n\\n---\\n\\nSee you next year! Maybe in Rust, maybe not :upside_down_face:\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[_A\\\\*_]: https://en.wikipedia.org/wiki/A*_search_algorithm\\n[`BinaryHeap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html\\n[`Reverse`]: https://doc.rust-lang.org/std/cmp/struct.Reverse.html\\n[docs of the `BinaryHeap`]: https://doc.rust-lang.org/std/collections/struct.BinaryHeap.html#min-heap"},{"id":"aoc-2022/3rd-week","metadata":{"permalink":"/blog/aoc-2022/3rd-week","editUrl":"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md","source":"@site/blog/aoc-2022/03-week-3.md","title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00:00.000Z","formattedDate":"July 6, 2023","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":11.565,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"3rd week of Advent of Code \'22 in Rust","description":"Surviving third week in Rust.","date":"2023-07-06T21:00","slug":"aoc-2022/3rd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"prevItem":{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"},"nextItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"}},"content":"Let\'s go through the third week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 15: Beacon Exclusion Zone](https://adventofcode.com/2022/day/15)\\n\\n:::info tl;dr\\n\\nTriangulating a distress beacon based on the information from the sensors.\\n\\n:::\\n\\n### Solution\\n\\nRelatively easy thing to implement, no major Rust issues hit.\\n\\n## [Day 16: Proboscidea Volcanium](https://adventofcode.com/2022/day/16)\\n\\n:::info tl;dr\\n\\nFinding a max flow in a graph given some time constraints.\\n\\n:::\\n\\n### Solution\\n\\nI have used some interesting things to implement this and make it easier for me.\\n\\n#### Indexing in graph\\n\\nI have come across a situation where I needed to keep more information regarding\\nthe graph\u2026 In that case you can, of course, create a structure and keep it in,\\nbut once you have multiple members in the structure it gets harder to work with\\nsince you need to address the fields in the structure. When you work with graph,\\nyou frequently need to access the vertices and in this case it felt a lot easier\\nto implement the indexing in a graph, rather than explicitly access the\\nunderlying data structure.\\n\\nHere you can see a rather short snippet from the solution that allows you to\\n\u201cindex\u201d the graph:\\n```rust\\nimpl Index<&str> for Graph {\\n type Output = Vertex;\\n\\n fn index(&self, index: &str) -> &Self::Output {\\n &self.g[index]\\n }\\n}\\n```\\n\\n#### Cartesian product\\n\\nDuring the implementation I had to utilize Floyd-Warshall algorithm for finding\\nthe shortest path between pairs of vertices and utilized the `iproduct!` macro\\nfrom the [`itertools`]. It is a very useful higher-order function that allows\\nyou to keep the nesting of the loops at a minimum level while still maintaining\\nthe same functionality.\\n\\n#### \u201cImplementing\u201d an iterator\\n\\nFor the second part, you get to split the work between 2 actors. That way you\\ncan achieve higher efficiency of the whole process that you\'re planning, but it\\nalso makes it harder to evaluate algorithmically, since you need to check the\\ndifferent ways the work can be split.\\n\\nBeing affected by _functional programming brain damage_:tm:, I have chosen to\\ndo this part by function that returns an iterator over the possible ways:\\n```rust\\nfn pairings(\\n valves: &BTreeSet,\\n) -> impl Iterator, BTreeSet)> + \'_ {\\n let mapping = valves.iter().collect_vec();\\n\\n let max_mask = 1 << (valves.len() - 1);\\n\\n (0..max_mask).map(move |mask| {\\n let mut elephant = BTreeSet::new();\\n let mut human = BTreeSet::new();\\n\\n for (i, &v) in mapping.iter().enumerate() {\\n if (mask & (1 << i)) == 0 {\\n human.insert(v.clone());\\n } else {\\n elephant.insert(v.clone());\\n }\\n }\\n\\n (human, elephant)\\n })\\n}\\n```\\n\\n## [Day 17: Pyroclastic Flow](https://adventofcode.com/2022/day/17)\\n\\n:::info tl;dr\\n\\nSimulating an autonomous Tetris where pieces get affected by a series of jets of\\nhot gas.\\n\\n:::\\n\\n### Solution\\n\\nSimilarly to the previous day I have created some iterators :smile:\\n\\n#### Collision detection\\n\\nOnce you need to check for collisions it is very helpful to be able to just\\niterate through the positions that can actually collide with the wall or other\\npiece.\\n\\nTo get the desired behaviour, you can just compose few smaller functions:\\n```rust\\nfn occupied(shape: &[Vec]) -> impl Iterator + \'_ {\\n shape.iter().enumerate().flat_map(|(y, row)| {\\n row.iter().enumerate().filter_map(move |(x, c)| {\\n if c == &\'#\' {\\n Some(Vector2D::new(x as isize, y as isize))\\n } else {\\n None\\n }\\n })\\n })\\n}\\n```\\n\\nIn the end, we get relative positions which we can adjust later when given the\\nspecific positions from iterator. You can see some interesting parts in this:\\n\\n* `.enumerate()` allows us to get both the indices (coordinates) and the line\\n or, later on, the character itself,\\n* `.flat_map()` flattens the iterator, i.e. when we return another iterator,\\n they just get chained instead of iterating over iterators (which sounds pretty\\n disturbing, doesn\'t it?),\\n* and finally `.filter_map()` which is pretty similar to the \u201cbasic\u201d `.map()`\\n with a one, key, difference that it expects the items of an iterator to be\\n mapped to an `Option` from which it ignores nothing (as in `None` :wink:)\\n and also unwraps the values from `Some(\u2026)`.\\n\\n#### Infinite iterator\\n\\nIn the solution we cycle through both Tetris-like shapes that fall down and the\\njets that move our pieces around. Initially I have implemented my own infinite\\niterator that just yields the indices. It is a very simple, yet powerful, piece\\nof code:\\n```rust\\nstruct InfiniteIndex {\\n size: usize,\\n i: usize,\\n}\\n\\nimpl InfiniteIndex {\\n fn new(size: usize) -> InfiniteIndex {\\n InfiniteIndex { size, i: size - 1 }\\n }\\n}\\n\\nimpl Iterator for InfiniteIndex {\\n type Item = usize;\\n\\n fn next(&mut self) -> Option {\\n self.i = (self.i + 1) % self.size;\\n Some(self.i)\\n }\\n}\\n```\\n\\nHowever when I\'m looking at the code now, it doesn\'t really make much sense\u2026\\nGuess what, we can use a built-in function that is implemented on iterators for\\nthat! The function is called `.cycle()`\\n\\nOn the other hand, I am not going to switch to that function, since it would\\nintroduce an another myriad of issues caused by the fact that I create iterators\\nright away in the constructor of my structure and the iterators would borrow\\nboth the jets and shapes which would introduce a lifetime dependency into the\\nstructure.\\n\\n## [Day 18: Boiling Boulders](https://adventofcode.com/2022/day/18) \\n\\n:::info tl;dr\\n\\nLet\'s compute a surface area of some obsidian approximated via coordinates of\\ncubes.\\n\\n:::\\n\\n### Solution\\n\\nThis day is kinda interesting, because it shows how easily you can complicate the\\nproblem and also how much can you screw yourself over with the optimization and\\n\u201csmart\u201d approach.\\n\\nFor the first part you need to find the surface area of an obsidian that is\\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\\nof already added cubes, and check if the newly added cube touches any face of any\\nother cube. Simple, and with a `BTreeSet` relatively efficient way to do it.\\n\\nHowever the second part lets you on a secret that there may be some surface area\\nfrom the \u201cinside\u201d too and you want to know only the one from the outside of the\\nobsidian. I have seen some solutions later, but if you check your data, you might\\nnotice that the bounding box of all the cubes isn\'t that big at all. Therefore I\\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\\nBFS turning all the lava on the outside into the air. Now you just need to check\\ncubes and count how many of their faces touch the air.\\n\\n## [Day 19: Not Enough Minerals](https://adventofcode.com/2022/day/19)\\n\\n:::info tl;dr\\n\\nFinding out the best strategy for building robots to collect geodes.\\n\\n:::\\n\\n### Solution\\n\\nNot much interesting stuff to mention apart from the suggestion to never believe\\nthat the default implementation given by `derive` macro is what you want, it\\ndoesn\'t have to be. :smile:\\n\\n## [Day 20: Grove Positioning System](https://adventofcode.com/2022/day/20)\\n\\n:::info tl;dr\\n\\nShuffling around the _circular linked list_ to find the coordinates.\\n\\n:::\\n\\nNow, small rant for this day is in place. They\'ve never mentioned that coordinates\\ncan repeat and therefore the values are non-unique. This is something that did\\nnot happen in the given sample, but was present in the user input. It took \xbba lot\xab\\nto realize that this is the issue.\\n\\n### Solution\\n\\nI have tried implementing a circular linked list for this\u2026 and I have failed\\nmiserably. To be fair, I still have no clue why. It was \u201cfun\u201d to play around with\\nthe `Rc>`. In the end I failed on _wrong answer_. I have also encountered\\na rather interesting issue with `.borrow_mut()` method being used on `Rc>`.\\n\\n#### `.borrow_mut()`\\n\\nConsider the following snippet of the code (taken from the documentation):\\n```rust\\nuse std::cell::{RefCell, RefMut};\\nuse std::collections::HashMap;\\nuse std::rc::Rc;\\n// use std::borrow::BorrowMut;\\n\\nfn main() {\\n let shared_map: Rc> = Rc::new(RefCell::new(HashMap::new()));\\n // Create a new block to limit the scope of the dynamic borrow\\n {\\n let mut map: RefMut<_> = shared_map.borrow_mut();\\n map.insert(\\"africa\\", 92388);\\n map.insert(\\"kyoto\\", 11837);\\n map.insert(\\"piccadilly\\", 11826);\\n map.insert(\\"marbles\\", 38);\\n }\\n\\n // Note that if we had not let the previous borrow of the cache fall out\\n // of scope then the subsequent borrow would cause a dynamic thread panic.\\n // This is the major hazard of using `RefCell`.\\n let total: i32 = shared_map.borrow().values().sum();\\n println!(\\"{total}\\");\\n}\\n```\\n\\nWe allocate a hash map on the heap and then in the inner block, we borrow it as\\na mutable reference, so that we can use it.\\n\\n:::note\\n\\nIt is a very primitive example for `Rc>` and mutable borrow.\\n\\n:::\\n\\nIf you uncomment the 4th line with `use std::borrow::BorrowMut;`, you cannot\\ncompile the code anymore, because of\\n```\\n Compiling playground v0.0.1 (/playground)\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:34\\n |\\n10 | let mut map: RefMut<_> = shared_map.borrow_mut();\\n | --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference\\n | |\\n | expected due to this\\n |\\n = note: expected struct `RefMut<\'_, _>`\\n found mutable reference `&mut Rc>>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:11:13\\n |\\n11 | map.insert(\\"africa\\", 92388);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:12:13\\n |\\n12 | map.insert(\\"kyoto\\", 11837);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:13:13\\n |\\n13 | map.insert(\\"piccadilly\\", 11826);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nerror[E0599]: no method named `insert` found for struct `RefMut<\'_, _>` in the current scope\\n --\x3e src/main.rs:14:13\\n |\\n14 | map.insert(\\"marbles\\", 38);\\n | ^^^^^^ method not found in `RefMut<\'_, _>`\\n\\nSome errors have detailed explanations: E0308, E0599.\\nFor more information about an error, try `rustc --explain E0308`.\\nerror: could not compile `playground` due to 5 previous errors\\n```\\n\\nIt might seem **a bit** ridiculous. However, I got to a point where the compiler\\nsuggested `use std::borrow::BorrowMut;` and it resulted in breaking parts of the\\ncode that worked previously. I think it may be a good idea to go over what is\\nhappening here.\\n\\n##### `.borrow_mut()` on `Rc>`\\n\\nLet\'s consider a variable `x` of type `Rc>`. What happens when you\\ncall `.borrow_mut()` on it? We can look at the `Rc` type, and\u2026 hang on! There is\\nneither `.borrow_mut()` method or `BorrowMut` trait implemented. How can we do it\\nthen?\\n\\nLet\'s go further and we can see that `RefCell` implements a `.borrow_mut()`\\nmethod. OK, but how can we call it on the `Rc`? Easily! `Rc` implements\\n`Deref` and therefore you can call methods on `Rc` objects as if they were\\n`T` objects. If we read on _`Deref` coercion_, we can see the following:\\n\\n> If `T` implements `Deref`, \u2026:\\n> * \u2026\\n> * `T` implicitly implements all the (immutable) methods of the type `U`.\\n\\nWhat is the requirement for the `.borrow_mut()` on `RefCell`? Well, it needs\\n`&self`, so the `Deref` implements the `.borrow_mut()` for the `Rc>`.\\n\\n##### `BorrowMut` trait\\n\\nI have not been able to find a lot on this trait. My guess is that it provides a\\nmethod instead of a syntactic sugar (`&mut x`) for the mutable borrow. And also\\nit provides default implementations for the types:\\n```rust\\nimpl BorrowMut for String\\n\\nimpl BorrowMut for &mut T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut for T\\nwhere\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for Vec\\nwhere\\n A: Allocator,\\n\\nimpl BorrowMut for Box\\nwhere\\n A: Allocator,\\n T: ?Sized,\\n\\nimpl BorrowMut<[T]> for [T; N]\\n```\\n\\n##### Conflict\\n\\nNow the question is why did it break the code\u2026 My first take was that the type\\n`Rc>` has some _specialized_ implementation of the `.borrow_mut()` and\\nthe `use` overrides it with the default, which is true **in a sense**. However\\nthere is no _specialized_ implementation. Let\'s have a look at the trait and the\\ntype signature on the `RefCell`:\\n```rust\\n// trait\\npub trait BorrowMut: Borrow\\nwhere\\n Borrowed: ?Sized,\\n{\\n fn borrow_mut(&mut self) -> &mut Borrowed;\\n}\\n\\n// \u2039RefCell.borrow_mut()\u203a type signature\\npub fn borrow_mut(&self) -> RefMut<\'_, T>\\n```\\n\\nI think that we can definitely agree on the fact that `RefMut<\'_, T>` is not the\\n`RefCell`.\\n\\n**In my opinion**, `RefCell` implements a **separate** `.borrow_mut()` rather\\nthan implementing the interface, because it **cannot** satisfy the type requirements\\nof the trait.\\n\\n:::caution\\n\\nI wonder how are we expected to deal with this conflict, if and when, we need\\nboth the `.borrow_mut()` of the trait and `.borrow_mut()` of the `RefCell`.\\n\\n:::\\n\\n:::tip Fun fact\\n\\nI was suggested by the compiler to do `use std::borrow::BorrowMut;` and break the\\ncode.\\n\\nSo much for the _almighty_ and _helpful_ compiler\u2026\\n\\n:::\\n\\n## [Day 21: Monkey Math](https://adventofcode.com/2022/day/21)\\n\\n:::info tl;dr\\n\\nComputing an expression tree and then also finding ideal value for a node.\\n\\n:::\\n\\n### Solution\\n\\nRelatively simple, until you get to the 2nd part where you start to practice\\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\\nthough :) Let\'s go through the details.\\n\\n#### `Default` trait\\n\\nFor the first time and twice I had a need to have a default value for my types,\\nenumerations in this case. Rust offers a very nice trait[^1] that is described\\nas:\\n\\n> A trait for giving a type a useful default value.\\n\\nI guess it sums it up nicely. The more interesting part about this is the fact\\nthat you can use the _macro machinery_ to save yourself some typing. If you have\\nenumeration of which the default value doesn\'t bear any parameter, you can just\\ndo[^2]:\\n\\n```rust\\n#[derive(Default)]\\nenum Color {\\n #[default]\\n White,\\n Gray,\\n Black,\\n}\\n```\\n\\n#### Abusing negation\\n\\nIf you want to use a _unary minus_ operator on your own type, you can implement\\na `Neg` trait[^3]. I was dealing with a binary tree and needed a way how to look\\nat the other side, so I have just implemented the negation for flipping between\\nleft and right :smile:\\n\\n[^1]: [`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) docs\\n[^2]: Pardon my example from the graph algorithms ;)\\n[^3]: [`Neg`](https://doc.rust-lang.org/std/ops/trait.Neg.html) docs\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[`itertools`]: https://crates.io/crates/itertools\\n[this Reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"},{"id":"leetcode/sort-diagonally","metadata":{"permalink":"/blog/leetcode/sort-diagonally","editUrl":"https://gitlab.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md","source":"@site/blog/leetcode/sort-matrix-diagonally.md","title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15:00.000Z","formattedDate":"March 4, 2023","tags":[{"label":"cpp","permalink":"/blog/tags/cpp"},{"label":"leetcode","permalink":"/blog/tags/leetcode"},{"label":"iterators","permalink":"/blog/tags/iterators"}],"readingTime":16.99,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Sort the matrix diagonally","description":"Compiler assisted development.","date":"2023-03-04T23:15","slug":"leetcode/sort-diagonally","authors":"mf","tags":["cpp","leetcode","iterators"],"hide_table_of_contents":false},"prevItem":{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"},"nextItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"}},"content":"Let\'s try to solve one of the LeetCode challenges in easy and hard mode at the\\nsame time.\\n\\n\x3c!--truncate--\x3e\\n\\n* Link to the problem: https://leetcode.com/problems/sort-the-matrix-diagonally/\\n\\n## Problem description\\n\\nA **matrix diagonal** is a diagonal line of cells starting from some cell in\\neither the topmost row or leftmost column and going in the bottom-right direction\\nuntil reaching the matrix\'s end. For example, the **matrix diagonal** starting\\nfrom `mat[2][0]`, where `mat` is a `6 x 3` matrix, includes cells `mat[2][0]`,\\n`mat[3][1]`, and `mat[4][2]`.\\n\\nGiven an `m x n` matrix `mat` of integers, sort each matrix diagonal in ascending\\norder and return the resulting matrix.\\n\\n### Example\\n\\n![Image describing the problem](https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png)\\n\\n## Skeleton and initial adjustments\\n\\nWe are given the following skeleton for the C++ and the given challenge:\\n\\n```cpp\\nclass Solution {\\npublic:\\n vector> diagonalSort(vector>& mat) {\\n \\n }\\n};\\n```\\n\\nThe task is to sort the passed matrix diagonally and then return it. First of all,\\nI don\'t like to solve this in a web browser, so we\'ll need to adjust it accordingly\\nfor running it locally. We\'ll start by including the `vector` header and using\\nfully-qualified namespaces[^1] and also adding few tests:\\n\\n```cpp\\n#include \\n#include \\n\\nusing matrix = std::vector>;\\n\\nclass Solution {\\npublic:\\n matrix diagonalSort(matrix& mat)\\n {\\n }\\n};\\n\\nstatic void test_case_1()\\n{\\n // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]\\n // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },\\n std::vector { 2, 2, 1, 2 },\\n std::vector { 1, 1, 1, 2 } })\\n == std::vector { std::vector { 1, 1, 1, 1 },\\n std::vector { 1, 2, 2, 2 },\\n std::vector { 1, 2, 3, 3 } }));\\n}\\n\\nstatic void test_case_2()\\n{\\n // Input: mat =\\n // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]\\n // Output:\\n // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]\\n\\n Solution s;\\n assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },\\n std::vector { 23, 55, 17, 45, 15, 52 },\\n std::vector { 75, 31, 36, 44, 58, 8 },\\n std::vector { 22, 27, 33, 25, 68, 4 },\\n std::vector { 84, 28, 14, 11, 5, 50 } })\\n == std::vector { std::vector { 5, 17, 4, 1, 52, 7 },\\n std::vector { 11, 11, 25, 45, 8, 69 },\\n std::vector { 14, 23, 25, 44, 58, 15 },\\n std::vector { 22, 27, 31, 36, 50, 66 },\\n std::vector { 84, 28, 75, 33, 55, 68 } }));\\n}\\n\\nint main()\\n{\\n test_case_1();\\n test_case_2();\\n\\n return 0;\\n}\\n```\\n\\nWe need to return the matrix, but we\'re given a reference to the input matrix. We\\ncan easily abuse the C++ here and just switch the reference to value, this way\\nthe matrix will be copied when passed to the function, we can sort the copy and\\njust return it back. And we also get yelled by the compiler for the fact that the\\nmethod doesn\'t return anything yet, so to make it \u201cshut up\u201d we will just return\\nthe input for now:\\n\\n```diff\\n- matrix diagonalSort(matrix& mat)\\n+ matrix diagonalSort(matrix mat)\\n {\\n+ return mat;\\n }\\n```\\n\\nNow, we get the copy and we\'re good to go.\\n\\n## Na\xefve solution\\n\\nAs you may know, C++ offers a plethora of functions that can be used to your\\nadvantage, given that you know how to \u201cbend\u201d the data structures accordingly.\\n\\nWhat does that mean for us? Well, we have an `std::sort`, we can use it, right?\\nLet\'s have a look at it:\\n```cpp\\ntemplate< class RandomIt >\\nvoid sort( RandomIt first, RandomIt last );\\n```\\n\\nThis overload is more than we need. What does it do? It just sorts the elements\\nin the range `[first, last)` using `operator<` on them. We can\'t sort the whole\\nmatrix using this, but\u2026 we can sort just \xbbone\xab diagonal without doing much work\\non our end.\\n\\nWhat is the `RandomIt` type though? If we look more into the documentation, we\\ncan easily find the requirements for it and also learn that it\'s a _random access_\\n_iterator_ and allows swapping its values at the same time.\\n\\n:::tip Random access iterator\\n\\nWhat is the _random access iterator_ though? We can find it in a documentation\\nand see the following description:\\n\\n> A **LegacyRandomAccessIterator** is a [LegacyBidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator)\\n> that can be moved to point to any element in constant time.\\n\\nAfter that we can see all the requirements for it being listed. I don\'t feel like\\nreading them right now, so we will just use it and see where the compilation blows\\nup, i.e. \u201c_compiler-assisted development_\u201d[^2] if you will ;)\\n\\n:::\\n\\nNow we know that we can use `std::sort` to sort the diagonal itself, but we also\\nneed to get the diagonals somehow. I\'m rather lazy, so I\'ll just delegate it to\\nsomeone else[^3]. And that way we get\\n```cpp\\nmatrix diagonalSort(matrix mat)\\n{\\n // we iterate over the diagonals\\n for (auto d : diagonals(mat)) {\\n // and we sort each diagonal\\n std::sort(d.begin(), d.end());\\n }\\n\\n // we take the matrix by copy, so we can sort in-situ and return the copy\\n // that we sorted\\n return mat;\\n}\\n```\\n\\nThis solution looks very simple, doesn\'t it? Well, cause it is.\\nLet\'s try compiling it:\\n```\\nmatrix-sort.cpp:11:23: error: use of undeclared identifier \'diagonals\' [clang-diagnostic-error]\\n for (auto d : diagonals(mat)) {\\n ^\\nFound compiler error(s).\\nmake: *** [makefile:14: tidy] Error 1\\n```\\n\\nOK, seems about right. We haven\'t implemented the `diagonals` yet. And based on\\nwhat we\'ve written so far, we need a function or a class `diagonals` that will\\ngive us the diagonals we need.\\n\\n## Implementing the `diagonals`\\n\\nCool, so we need the function that will let us go through each and every diagonal\\nin our matrix. We use the _for-range_ loop, so whatever we get back from the\\n`diagonals` must support `.begin()` and `.end()`. Since I am a masochist, we will\\ndo such functionality for a matrix of any type, not just the `int` from the challenge.\\n\\nAs I said, we need to be able to\\n* construct the object\\n* get the beginning\\n* get the end (the \u201csentinel\u201d)\\n\\n```cpp\\ntemplate \\nclass diagonals {\\n using matrix_t = std::vector>;\\n\\n matrix_t& _matrix;\\n\\npublic:\\n diagonals(matrix_t& m)\\n : _matrix(m)\\n {\\n }\\n diagonals_iter begin()\\n {\\n /* TODO */\\n }\\n diagonals_iter end()\\n {\\n /* TODO */\\n }\\n};\\n```\\n\\nNow we have a `diagonals` that we can use to go through the diagonals. We haven\'t\\nimplemented the core of it yet. Let\'s go through what we have for now.\\n\\nWe have a templated class with templated `T` that is used as a placeholder for any\\ntype we would store in the matrix. Because I\'m lazy, I have defined the `matrix_t`\\ntype that is a \u201cshortcut\u201d for `std::vector>`, so I don\'t have to\\ntype it out all the time. Of course, we need to store the matrix, we are given,\\nas a private attribute. And then just have the constructor and the 2 methods we\\nneed for the _for-range_.\\n\\n### Iterating over diagonals\\n\\nNow that we have an object that will allow us to iterate through the diagonals,\\nwe need to implement the iterating itself. We need to go through all of them, so\\nwe have multiple options how to do so. I have decided to start from the \u201cmain\u201d\\ndiagonal that starts at `(0, 0)` index and then proceed with the diagonals starting\\nin the first row, followed by the rest of the diagonals in the first column.\\n\\nWe need to be able to tell that we\'ve iterated through all of them, and also we\\nneed to know which diagonal is next. For that purpose we will pass the indices\\nof the first cell on the diagonal. That way we can always tell how to move forward.\\n\\nWe will start by updating the `begin` and `end` to reflect our choice accordingly.\\n\\n```cpp\\ndiagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }\\ndiagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }\\n```\\n\\nFor the `begin` we return the first diagonal that starts at `(0, 0)`. And because\\nwe have decided to do the diagonals in the first column at the end, the first\\ndiagonal that is not a valid one is the one at `(0, height)`. Apart from the\\nindices, we also need to pass reference to the matrix itself.\\n\\n:::note\\n\\nYou may have noticed that we also include the diagonals that have length 1,\\nspecifically the ones at `(0, height - 1)` and `(width - 1, 0)`. We are implementing\\nan iterator that **should not** care about the way it\'s being used. Therefore, we\\ndon\'t care about the fact they don\'t need to be sorted.\\n\\n:::\\n\\nCool, let\'s leave the iterator itself to someone else, right?[^4]\\n\\n### Implementing the iterator over diagonals\\n\\nWe can start with a simple skeleton based on the information that we pass from\\nthe `diagonals`. Also to utilize the `matrix_t` and also contain implementation\\ndetails hidden away, we will put this code into the `diagonals` class.\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n};\\n```\\n\\nIn this case we will be implementing a \u201csimple\u201d forward iterator, so we don\'t\\nneed to implement a lot. Notably it will be:\\n* inequality operator (we need to know when we reach the end and have nothing to\\n iterate over)\\n* preincrementation operator (we need to be able to move around the iterable)\\n* dereference operator (we need to be able to retrieve the objects we iterate\\n over)\\n\\n```cpp\\nclass diagonals_iter {\\n matrix_t& m;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator!=(const diagonals_iter& rhs) const\\n {\\n // iterators are not equal if they reference different matrices, or\\n // their positions differ\\n return m != rhs.m || x != rhs.x || y != rhs.y;\\n }\\n\\n diagonals_iter& operator++()\\n {\\n if (y != 0) {\\n // iterating through diagonals down the first column\\n y++;\\n return *this;\\n }\\n\\n // iterating the diagonals along the first row\\n x++;\\n if (x == m.front().size()) {\\n // switching to diagonals in the first column\\n x = 0;\\n y++;\\n }\\n\\n return *this;\\n }\\n\\n diagonal operator*() const { return diagonal { m, x, y }; }\\n};\\n```\\n\\nLet\'s go one-by-one. Inequality operator is rather simple, just compare iterator\'s\\nattributes field-by-field. If you think about it, checking inequality of two 2D\\nvectors may be a bit inefficient, therefore, we can swap around and check it as\\na last thing.\\n\\n```diff\\n- return m != rhs.m || x != rhs.x || y != rhs.y;\\n+ return x != rhs.x || y != rhs.y || m != rhs.m;\\n```\\n\\nPreincrementation is where the magic happens. If you have a better look, you can\\nsee two branches of this operation:\\n\\n1. When `y != 0` (we\'re iterating over the diagonals in the first column)\\n In this case, we just bump the row and we\'re done.\\n2. When `y == 0` (we\'re iterating over the diagonals in the first row)\\n In this case, we bump the column and check if we haven\'t gotten out of bounds,\\n i.e. the end of the first row. If we get out of the bounds, we\'re continuing\\n with the second diagonal in the first column.\\n\\nDereferencing the iterator must \u201cyield\u201d something. In our case it will be the\\ndiagonal that we want to sort. For sorting we need just the iterators that can\\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\\nsomething else. In our case it will be a class called `diagonal`.\\n\\n## Implementing the `diagonal` itself\\n\\nAfter implementing the iterator over diagonals, we know that all we need to describe\\na diagonal is the matrix itself and the \u201cstart\u201d of the diagonal (row and column).\\nAnd we also know that the diagonal must provide some iterators for the `std::sort`\\nfunction. We can start with the following skeleton:\\n```cpp\\ntemplate \\nclass diagonal {\\n using matrix_t = std::vector>;\\n\\n matrix_t& matrix;\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n diagonal(matrix_t& matrix, std::size_t x, std::size_t y)\\n : matrix(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }\\n\\n diagonal_iter end() const\\n {\\n auto max_x = matrix[y].size();\\n auto max_y = matrix.size();\\n\\n // we need to find the distance in which we get out of bounds (either in\\n // column or row)\\n auto steps = std::min(max_x - x, max_y - y);\\n\\n return diagonal_iter { matrix, x + steps, y + steps };\\n }\\n};\\n```\\n\\nInitialization is rather simple, we just \u201ckeep\u201d the stuff we get, `begin` is the\\nsimplest, we just delegate.\\n\\nIn case of the `end`, it gets more complicated. We need to know where is the \u201cend\u201d\\nof the diagonal. Since `end` should point to the first element \u201cafter\u201d the iterable,\\nwe know that it\'s the first position of the iterator where either `y` becomes\\n`matrix.size()` or `x` becomes `matrix[y].size()`. Also we are moving along diagonal,\\nduh, therefore we can deduce the first \u201cposition\u201d afterwards by minimal amount of\\nsteps to get out of the any column or row, hence `std::min(max_x - x, max_y - y)`.\\nFinal position is then computed simply by adding the steps to the beginning of\\nthe diagonal.\\n\\nNow we just need to finish the iterator for the diagonal itself and we\'re done.\\n\\n### Implementing `diagonal_iter`\\n\\nThis part is the hardest from all we need to do. It\'s because of the requirements\\nof the `std::sort` that requires us to implement a _random access iterator_. I have\\nbriefly described it above, and \u201cin a nutshell\u201d it means that we need to implement\\nan iterator that can move in constant time along the diagonal in any amount of\\nsteps.\\n\\nLet\'s go through all of the functionality that our iterator needs to support to\\nbe used in `std::sort`. We need the usual operations like:\\n\\n* equality/inequality\\n* incrementation\\n* dereferencing\\n\\nWe will also add all the types that our iterator uses with the category of the\\niterator, i.e. what interface it supports:\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n};\\n```\\n\\nThis is pretty similar to the previous iterator, but now we need to implement the\\nremaining requirements of the _random access iterator_. Let\'s see what those are:\\n\\n* decrementation - cause we need to be able to move backwards too, since _random _\\n _access iterator_ extends the interface of _bidirectional iterator_\\n* moving the iterator in either direction by steps given as an integer\\n* being able to tell the distance between two iterators\\n* define an ordering on the iterators\\n\\nLet\'s fill them in:\\n```cpp\\nclass diagonal_iter {\\n // we need to keep reference to the matrix itself\\n matrix_t& m;\\n\\n // we need to be able to tell our current position\\n std::size_t x;\\n std::size_t y;\\n\\npublic:\\n using difference_type = std::ptrdiff_t;\\n using value_type = T;\\n using pointer = T*;\\n using reference = T&;\\n using iterator_category = std::random_access_iterator_tag;\\n\\n diagonal_iter(matrix_t& matrix,\\n std::size_t x,\\n std::size_t y)\\n : m(matrix)\\n , x(x)\\n , y(y)\\n {\\n }\\n\\n bool operator==(const diagonal_iter& rhs) const\\n {\\n return x == rhs.x && y == rhs.y && m == rhs.m;\\n }\\n\\n diagonal_iter& operator++()\\n {\\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\\n // the same time\\n x++;\\n y++;\\n return *this;\\n }\\n\\n reference operator*() const { return m[y][x]; }\\n\\n // exactly opposite to the incrementation\\n diagonal_iter operator--()\\n {\\n x--;\\n y--;\\n return *this;\\n }\\n\\n // moving \u2039n\u203a steps back is same as calling decrementation \u2039n\u203a-times, so we\\n // can just return a new iterator and subtract \u2039n\u203a from both coordinates in\\n // the matrix\\n diagonal_iter operator-(difference_type n) const\\n {\\n return diagonal_iter { m, x - n, y - n };\\n }\\n\\n // here we assume that we are given two iterators on the same diagonal\\n difference_type operator-(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x - rhs.x;\\n }\\n\\n // counterpart of moving \u2039n\u203a steps backwards\\n diagonal_iter operator+(difference_type n) const\\n {\\n return diagonal_iter { m, x + n, y + n };\\n }\\n\\n // we compare the coordinates, and also assume that those 2 iterators are\\n // lying on the same diagonal\\n bool operator<(const diagonal_iter& rhs) const\\n {\\n assert(m == rhs.m);\\n return x < rhs.x && y < rhs.y;\\n }\\n};\\n```\\n\\nAt this point we could probably try and compile it, right? If we do so, we will\\nget yelled at by a compiler for the following reasons:\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __next;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization \'std::__unguarded_linear_insert::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>\' requested here\\n std::__unguarded_linear_insert(__i,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization \'std::__insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to \'__unguarded_linear_insert\' [clang-diagnostic-error]\\n std::__unguarded_linear_insert(__i,\\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization \'std::__unguarded_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization \'std::__final_insertion_sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__final_insertion_sort(__first, __last, __comp);\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]\\n __unguarded_linear_insert(_RandomAccessIterator __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n __last = __cut;\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization \'std::__introsort_loop::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__introsort_loop(__first, __last,\\n ^\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization \'std::__sort::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>\' requested here\\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\\n ^\\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization \'std::sort::diagonal_iter>\' requested here\\n std::sort(d.begin(), d.end());\\n ^\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nThat\'s a lot of noise, isn\'t it? Let\'s focus on the important parts:\\n```\\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type \'diagonal::diagonal_iter\' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\\n\u2026\\nmatrix-sort.cpp:17:19: note: copy assignment operator of \'diagonal_iter\' is implicitly deleted because field \'m\' is of reference type \'diagonal::matrix_t &\' (aka \'vector> &\')\\n matrix_t& m;\\n ^\\n```\\n\\nAh! We have a reference in our iterator, and this prevents us from having a copy\\nassignment operator (that is used \u201csomewhere\u201d in the sorting algorithm). Well\u2026\\nLet\'s just wrap it!\\n```diff\\n# we need to keep a different type than reference\\n- matrix_t& m;\\n+ std::reference_wrapper m;\\n\\n# in comparison we need to get the reference out of the wrapper first\\n- return x == rhs.x && y == rhs.y && m == rhs.m;\\n+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();\\n\\n# same when we return a reference to the \u201ccell\u201d in the matrix\\n- reference operator*() const { return m[y][x]; }\\n+ reference operator*() const { return m.get()[y][x]; }\\n\\n# and finally in the assertions that we set for the \u201cdistance\u201d and \u201cless than\u201d\\n- assert(m == rhs.m);\\n+ assert(m.get() == rhs.m.get());\\n```\\n\\nWe\'re done now! We have written an iterator over diagonals for a 2D `vector`. You can have a look at the final result [here](pathname:///files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp).\\n\\n[^1]: just because I\'m used to it and don\'t care about your opinion ;)\\n[^2]: exercise at your own risk\\n[^3]: me in 5 minutes in fact, but don\'t make me scared\\n[^4]: me in the next section\u2026"},{"id":"aoc-2022/2nd-week","metadata":{"permalink":"/blog/aoc-2022/2nd-week","editUrl":"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md","source":"@site/blog/aoc-2022/02-week-2.md","title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15:00.000Z","formattedDate":"December 25, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":20.875,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"2nd week of Advent of Code \'22 in Rust","description":"Surviving second week in Rust.","date":"2022-12-25T23:15","slug":"aoc-2022/2nd-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"prevItem":{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"},"nextItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s go through the second week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n## [Day 8: Treetop Tree House](https://adventofcode.com/2022/day/8)\\n\\n:::info tl;dr\\n\\nWe get a forest and we want to know how many trees are visible from the outside.\\nApart from that we want to find the best view.\\n\\n:::\\n\\nNothing interesting. We are moving around 2D map though. And indexing can get a\\nbit painful when doing so, let\'s refactor it a bit ;) During the preparation for\\nthe AoC, I have written `Vector2D` and now it\'s time to extend it with indexing\\nof `Vec` of `Vec`s. In my solution I was manipulating with indices in the following\\nway:\\n\\n- swapping them\\n- checking whether they are correct indices for the `Vec>`\\n- indexing `Vec>` with them\\n\\n:::caution\\n\\nI\'m getting familiar with Rust and starting to \u201cabuse\u201d it\u2026 While doing so, I\'m\\nalso uncovering some \u201cfeatures\u201d that I don\'t really like. Therefore I will mark\\nall of my rants with _thicc_ **\xab\u21af\xbb** mark and will try to \u201clock\u201d them into their\\nown \u201cbox of hell\u201d.\\n\\n:::\\n\\n#### Swapping indices\\n\\nRelatively simple implementation, just take the values, swap them and return new\\nvector.\\n\\n```rust\\nimpl Vector2D {\\n pub fn swap(&self) -> Self {\\n Self {\\n x: self.y,\\n y: self.x,\\n }\\n }\\n}\\n```\\n\\nPretty straight-forward implementation, but let\'s talk about the `T: Copy`. We\\nneed to use it, since we are returning a **new** vector, with swapped **values**.\\nIf we had values that cannot be copied, the only thing we could do, would be a\\nvector of references (and it would also introduce a lifetime, to which we\'ll get\\nlater on). This is pretty similar with the operations on sets from the first week.\\n\\n#### Indexing `Vec`\\n\\nI will start with the indexing, cause bound-checking is a bit more\u2026 complicated\\nthan I would like to.\\n\\n```rust\\npub fn index<\'a, T, U>(v: &\'a [Vec], idx: &Vector2D) -> &\'a U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nLet\'s talk about this mess\u2026 Body of the function is probably the most easy part\\nand should not be hard to understand, we just take the `x` and `y` and convert\\nthem both to `usize` type that can be used later on for indexing.\\n\\nThe type signature of the function is where the fun is at :wink: We are trying\\nto convert unknown type to `usize`, so we must bound the `T` as a type that can\\nbe converted to `usize`, that\'s how we got `usize: TryFrom` which basically\\nsays that `usize` must implement `TryFrom` trait and therefore allows us to\\nconvert the indices to actual `usize` indices. Using `.unwrap()` also forces us\\nto bound the error that can occur when converting `T` into `usize`, that\'s how\\nwe get `>::Error: Debug` which loosely means\\n\\n> error during conversion of `T` into `usize` must implement `Debug`,\\n> i.e. can be printed in some way or other\\n\\n`T: Copy` is required by `.try_into()` which takes `T` by-value.\\n\\nAnd now we are left only with the first line of the definition.\\n\\n:::note\\n\\nSkilled Rustaceans might notice that this implementation is rather flaky and can\\nbreak in multiple places at once. I\'ll get back to it\u2026\\n\\n:::\\n\\nLet\'s split it in multiple parts:\\n- `v: &\'a [Vec]` represents the 2D `Vec`, we are indexing, `Vec` implements\\n `Slice` trait and _clippy_ recommends using `&[T]` to `&Vec`, exact details\\n are unknown to me\\n- `idx: &Vector2D` represents the _indices_ which we use, we take them by\\n reference to avoid an unnecessary copy\\n- `-> &\'a U` means that we are returning a _reference_ to some value of type `U`.\\n Now the question is what does the `\'a` mean, we can also see it as a generic\\n type declared along `T` and `U`. And the answer is _relatively_ simple, `\'a`\\n represents a _lifetime_. We take the `v` by a reference and return a reference,\\n borrow checker validates all of the _borrows_ (or references), so we need to\\n specify that our returned value has _the same lifetime_ as the vector we have\\n taken by a reference, i.e. returned reference must live at least as long as the\\n `v`. This way we can \u201cbe sure\u201d that the returned reference is valid.\\n\\n##### Issues\\n\\nFirst issue that our implementation has is the fact that we cannot get a mutable\\nreference out of that function. This could be easily resolved by introducing new\\nfunction, e.g. `index_mut`. Which I have actually done while writing this part:\\n```rust\\npub fn index_mut<\'a, T, U>(v: &\'a mut [Vec], idx: &Vector2D) -> &\'a mut U\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &mut v[y][x]\\n}\\n```\\n\\n:::caution **\xab\u21af\xbb** Why can\'t we use one function?\\n\\nWhen we consider a `Vec`, we don\'t need to consider containers as `T`, Rust\\nimplements indexing as traits `Index` and `IndexMut` that do the dirty work\\nbehind syntactic sugar of `container[idx]`.\\n\\nHowever, implementing of traits is not allowed for _external_ types, i.e. types\\nthat you haven\'t defined yourself. This means that you can implement indexing\\nover containers that you have implemented yourself, but you cannot use your own\\ntypes for indexing \u201cbuilt-in\u201d types.\\n\\nAnother part of this rabbit hole is trait `SliceIndex` that is of a relevance\\nbecause of\\n```rust\\nimpl Index for [T]\\nwhere\\n I: SliceIndex<[T]>\\n\\nimpl Index for Vec\\nwhere\\n I: SliceIndex<[T]>,\\n A: Allocator\\n\\nimpl Index for [T; N]\\nwhere\\n [T]: Index\\n```\\n\\nIn other words, if your type implements `SliceIndex` trait, it can be used\\nfor indexing. As of now, this trait has all of its required methods experimental\\nand is marked as `unsafe`.\\n\\n:::\\n\\nAnother problem is a requirement for indexing either `[Vec]` or `Vec>`.\\nThis requirement could be countered by removing inner type `Vec` and constraining\\nit by a trait `Index` (or `IndexMut` respectively) in a following way\\n```rust\\npub fn index<\'a, C, T>(v: &\'a [C], idx: &Vector2D) -> &\'a C::Output\\nwhere\\n usize: TryFrom,\\n >::Error: Debug,\\n T: Copy,\\n C: Index\\n{\\n let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());\\n &v[y][x]\\n}\\n```\\n\\nGiven this, we can also give a more meaningful typename for indexing type, such\\nas `I`.\\n\\n#### Checking bounds\\n\\nNow we can get to the boundary checks, it is very similar, but a more\u2026 dirty.\\nFirst approach that came up was to convert the indices in `Vector2D` to `usize`,\\nbut when you add the indices up, e.g. when checking the neighbors, you can end\\nup with negative values which, unlike in C++, causes an error (instead of underflow\\nthat you can use to your advantage; you can easily guess how).\\n\\nSo how can we approach this then? Well\u2026 we will convert the bounds instead of\\nthe indices and that lead us to:\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n usize: TryInto,\\n >::Error: Debug,\\n T: PartialOrd + Copy,\\n{\\n idx.y >= 0.try_into().unwrap()\\n && idx.y < v.len().try_into().unwrap()\\n && idx.x >= 0.try_into().unwrap()\\n && idx.x\\n < v[TryInto::::try_into(idx.y).unwrap()]\\n .len()\\n .try_into()\\n .unwrap()\\n}\\n```\\n\\nYou can tell that it\'s definitely a shitty code. Let\'s improve it now! We will\\nget back to the original idea, but do it better. We know that we cannot convert\\nnegative values into `usize`, **but** we also know that conversion like that\\nreturns a `Result` which we can use to our advantage.\\n```rust\\npub fn in_range(v: &[Vec], idx: &Vector2D) -> bool\\nwhere\\n T: Copy,\\n usize: TryFrom,\\n{\\n usize::try_from(idx.y)\\n .and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))\\n .unwrap_or(false)\\n}\\n```\\n\\n`Result` is a type similar to `Either` in Haskell and it allows us to chain\\nmultiple operations on correct results or propagate the original error without\\ndoing anything. Let\'s dissect it one-by-one.\\n\\n`try_from` is a method implemented in `TryFrom` trait, that allows you to convert\\ntypes and either successfully convert them or fail (with a reasonable error). This\\nmethod returns `Result`.\\n\\nWe call `and_then` on that _result_, let\'s have a look at the type signature of\\n`and_then`, IMO it explains more than enough:\\n```rust\\npub fn and_then(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> Result\\n```\\n\\nOK\u2026 So it takes the result and a function and returns another result with\\ndifferent value and different error. However we can see that the function, which\\nrepresents an operation on a result, takes just the value, i.e. it doesn\'t care\\nabout any previous error. To make it short:\\n\\n> `and_then` allows us to run an operation, which can fail, on the correct result\\n\\nWe parsed a `y` index and now we try to convert the `x` index with `try_from`\\nagain, but on that result we use `map` rather than `and_then`, why would that be?\\n\\n```rust\\npub fn map(self, op: F) -> Result\\nwhere\\n F: FnOnce(T) -> U\\n```\\n\\nHuh\u2026 `map` performs an operation that **cannot** fail. And finally we use\\n`unwrap_or` which takes the value from result, or in case of an error returns the\\ndefault that we define.\\n\\nHow does this work then? If `y` is negative, the conversion fails and the error\\npropagates all the way to `unwrap_or`, if `y` can be a correct `usize` value, then\\nwe do the same with `x`. If `x` is negative, we propagate the error as with `y`,\\nand if it\'s not, then we check whether it exceeds the higher bounds or not.\\n\\n### Solution\\n\\nRelatively simple, you just need follow the rules and not get too smart, otherwise\\nit will get back at you.\\n\\n## [Day 9: Rope Bridge](https://adventofcode.com/2022/day/9)\\n\\n:::info tl;dr\\n\\nWe get a rope with knots and we want to track how many different positions are\\nvisited with the rope\'s tail.\\n\\n:::\\n\\nBy this day, I have come to a conclusion that current skeleton for each day\\ngenerates a lot of boilerplate. And even though it can be easily copied, it\'s\\njust a waste of space and unnecessary code. Let\'s \u201csimplify\u201d this (on one end\\nwhile creating monster on the other end). I\'ve gone through what we need in the\\npreparations for the AoC. Let\'s sum up our requirements:\\n- parsing\\n- part 1 & 2\\n- running on sample / input\\n- tests\\n\\nParsing and implementation of both parts is code that changes each day and we\\ncannot do anything about it. However running and testing can be simplified!\\n\\nLet\'s introduce and export a new module `solution` that will take care of all of\\nthis. We will start by introducing a trait for each day.\\n```rust\\npub trait Solution {\\n fn parse_input>(pathname: P) -> Input;\\n\\n fn part_1(input: &Input) -> Output;\\n fn part_2(input: &Input) -> Output;\\n}\\n```\\n\\nThis does a lot of work for us already, we have defined a trait and for each day\\nwe will create a structure representing a specific day. That structure will also\\nimplement the `Solution` trait.\\n\\nNow we need to get rid of the boilerplate, we can\'t get rid of the `main` function,\\nbut we can at least move out the functionality.\\n```rust\\nfn run(type_of_input: &str) -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = Self::parse_input(format!(\\"{}s/{}.txt\\", type_of_input, Self::day()));\\n\\n info!(\\"Part 1: {}\\", Self::part_1(&input));\\n info!(\\"Part 2: {}\\", Self::part_2(&input));\\n\\n Ok(())\\n}\\n\\nfn main() -> Result<()>\\nwhere\\n Self: Sized,\\n{\\n Self::run(\\"input\\")\\n}\\n```\\n\\nThis is all part of the `Solution` trait, which can implement methods while being\\ndependent on what is provided by the implementing types. In this case, we just\\nneed to bound the `Output` type to implement `Display` that is necessary for the\\n`info!` and format string there.\\n\\nNow we can get to first of the nasty things we are going to do\u2026 And it is the\\n`day()` method that you can see being used when constructing path to the input\\nfile. That method will generate a name of the file, e.g. `day01` and we know that\\nwe can _somehow_ deduce it from the structure name, given we name it reasonably.\\n\\n```rust\\nfn day() -> String {\\n let mut day = String::from(type_name::().split(\\"::\\").next().unwrap());\\n day.make_ascii_lowercase();\\n\\n day.to_string()\\n}\\n```\\n\\n:::caution `type_name`\\n\\nThis feature is still experimental and considered to be internal, it is not\\nadvised to use it any production code.\\n\\n:::\\n\\nAnd now we can get to the nastiest stuff :weary: We will **generate** the tests!\\n\\nWe want to be able to generate tests for sample input in a following way:\\n```rust\\ntest_sample!(day_01, Day01, 42, 69);\\n```\\n\\nThere\'s not much we can do, so we will write a macro to generate the tests for us.\\n\\n```rust\\n#[macro_export]\\nmacro_rules! test_sample {\\n ($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {\\n #[cfg(test)]\\n mod $mod_name {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_1(&sample), $part_1);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample =\\n $day_struct::parse_input(&format!(\\"samples/{}.txt\\", $day_struct::day()));\\n assert_eq!($day_struct::part_2(&sample), $part_2);\\n }\\n }\\n };\\n}\\n```\\n\\nWe have used it in a similar way as macros in C/C++, one of the things that we\\ncan use to our advantage is defining \u201ctype\u201d of the parameters for the macro. All\\nparameters have their name prefixed with `$` sign and you can define various \u201cforms\u201d\\nof your macro. Let\'s go through it!\\n\\nWe have following parameters:\\n- `$mod_name` which represents the name for the module with tests, it is typed\\n with `ident` which means that we want a valid identifier to be passed in.\\n- `$day_struct` represents the structure that will be used for tests, it is typed\\n with `tt` which represents a _token tree_, in our case it is a type.\\n- `$part_X` represents the expected output for the `X`th part and is of type `expr`\\n which literally means an _expression_.\\n\\nApart from that we need to use `#[macro_export]` to mark the macro as exported\\nfor usage outside of the module. Now our skeleton looks like:\\n```rust\\nuse aoc_2022::*;\\n\\ntype Input = String;\\ntype Output = String;\\n\\nstruct DayXX;\\nimpl Solution for DayXX {\\n fn parse_input>(pathname: P) -> Input {\\n file_to_string(pathname)\\n }\\n\\n fn part_1(input: &Input) -> Output {\\n todo!()\\n }\\n\\n fn part_2(input: &Input) -> Output {\\n todo!()\\n }\\n}\\n\\nfn main() -> Result<()> {\\n // DayXX::run(\\"sample\\")\\n DayXX::main()\\n}\\n\\n// test_sample!(day_XX, DayXX, , );\\n```\\n\\n### Solution\\n\\nNot much to talk about, it is relatively easy to simulate.\\n\\n## [Day 10: Cathode-Ray Tube](https://adventofcode.com/2022/day/10)\\n\\n:::info tl;dr\\n\\nEmulating basic arithmetic operations on a CPU and drawing on CRT based on the\\nCPU\'s accumulator.\\n\\n:::\\n\\nIn this day I have discovered an issue with my design of the `Solution` trait.\\nAnd the issue is caused by different types of `Output` for the part 1 and part 2.\\n\\nProblem is relatively simple and consists of simulating a CPU, I have approached\\nit in a following way:\\n```rust\\nfn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {\\n instructions\\n .iter()\\n .fold(State::new(), |state, instruction| {\\n state.execute(instruction, &mut out)\\n });\\n\\n out\\n}\\n```\\n\\nWe just take the instructions, we have some state of the CPU and we execute the\\ninstructions one-by-one. Perfect usage of the `fold` (or `reduce` as you may know\\nit from other languages).\\n\\nYou can also see that we have an `Output` type, so the question is how can we fix\\nthat problem. And the answer is very simple and _functional_. Rust allows you to\\nhave an `enumeration` that can _bear_ some other values apart from the type itself.\\n\\n:::tip\\n\\nWe could\'ve seen something like this with the `Result` type that can be\\ndefined as\\n```rust\\nenum Result {\\n Ok(T),\\n Err(E)\\n}\\n```\\n\\n###### What does that mean though?\\n\\nWhen we have an `Ok` value, it has the result itself, and when we get an `Err`\\nvalue, it has the error. This also allows us to handle _results_ in a rather\\npretty way:\\n```rust\\nmatch do_something(x) {\\n Ok(y) => {\\n println!(\\"SUCCESS: {}\\", y);\\n },\\n Err(y) => {\\n eprintln!(\\"ERROR: {}\\", y);\\n }\\n}\\n```\\n\\n:::\\n\\nMy solution has a following outline:\\n```rust\\nfn execute(&self, i: &Instruction, output: &mut Output) -> State {\\n // execute the instruction\\n\\n // collect results if necessary\\n match output {\\n Output::Part1(x) => self.execute_part_1(y, x),\\n Output::Part2(x) => self.execute_part_2(y, x),\\n }\\n\\n // return the obtained state\\n new_state\\n}\\n```\\n\\nYou might think that it\'s a perfectly reasonable thing to do. Yes, **but** notice\\nthat the `match` statement doesn\'t _collect_ the changes in any way and also we\\npass `output` by `&mut`, so it is shared across each _iteration_ of the `fold`.\\n\\nThe dirty and ingenious thing is that `x`s are passed by `&mut` too and therefore\\nthey are directly modified by the helper functions. To sum it up and let it sit\\n\\n> We are **collecting** the result **into** an **enumeration** that is **shared**\\n> across **all** iterations of `fold`.\\n\\n### Solution\\n\\nSimilar to _Day 9_, but there are some technical details that can get you.\\n\\n## [Day 11: Monkey in the Middle](https://adventofcode.com/2022/day/11)\\n\\n:::info tl;dr\\n\\nSimulation of monkeys throwing stuff around and measuring your stress levels\\nwhile your stuff is being passed around.\\n\\n:::\\n\\nI think I decided to use regular expressions here for the first time, cause\\nparsing the input was a pain.\\n\\nAlso I didn\'t expect to implement Euclidean algorithm in Rust\u2026\\n\\n### Solution\\n\\nAgain, we\'re just running a simulation. Though I must admit it was very easy to\\nmake a small technical mistakes that could affect the final results very late.\\n\\n## [Day 12: Hill Climbing Algorithm](https://adventofcode.com/2022/day/12)\\n\\n:::info tl;dr\\n\\nFinding shortest path up the hill and also shortest path down to the ground while\\nalso rolling down the hill\u2026\\n\\n:::\\n\\nAs I have said in the _tl;dr_, we are looking for the shortest path, but the start\\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\\nto a BFS algorithm that takes necessary parameters via functions:\\n```rust\\nfn bfs(\\n graph: &[Vec], start: &Position, has_edge: F, is_target: G\\n) -> Option\\nwhere\\n F: Fn(&[Vec], &Position, &Position) -> bool,\\n G: Fn(&[Vec], &Position) -> bool\\n```\\n\\nWe pass the initial vertex from the caller and everything else is left to the BFS\\nalgorithm, based on the `has_edge` and `is_target` functions.\\n\\nThis was easy! And that is not very usual in Rust once you want to pass around\\nfunctions. :eyes:\\n\\n### Solution\\n\\nLooking for the shortest path\u2026 Must be Dijkstra, right? **Nope!** Half of the\\nReddit got jebaited though. In all fairness, nothing stops you from implementing\\nthe Dijkstra\'s algorithm for finding the shortest path, **but** if you know that\\nall connected vertices are in a unit (actually $d = 1$) distance from each other,\\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\\ntime complexity, because of the priority heap instead of the queue.\\n\\n## [Day 13: Distress Signal](https://adventofcode.com/2022/day/13)\\n\\n:::info tl;dr\\n\\nProcessing packets with structured data from the distress signal.\\n\\n:::\\n\\nYou can implement a lot of traits if you want to. It is _imperative_ to implement\\nordering on the packets. I had a typo, so I also proceeded to implement a `Display`\\ntrait for debugging purposes:\\n```rust\\nimpl Display for Packet {\\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\\n match self {\\n Packet::Integer(x) => write!(f, \\"{x}\\"),\\n Packet::List(lst) => write!(f, \\"[{}]\\", lst.iter().map(|p| format!(\\"{p}\\")).join(\\",\\")),\\n }\\n }\\n}\\n```\\n\\n### Solution\\n\\nA lot of technical details\u2026 Parsing is nasty too\u2026\\n\\n## [Day 14: Regolith Reservoir](https://adventofcode.com/2022/day/14)\\n\\n:::info tl;dr\\n\\nLet\'s simulate falling sand grain-by-grain.\\n\\n:::\\n\\nAgain, both parts are relatively similar with minimal changes, so it is a good\\nidea to refactor it a bit. Similar approach to the [BFS above]. Also this is the\\nfirst day where I ran into efficiency issues and had to redo my solution to speed\\nit up just a bit.\\n\\n### Solution\\n\\nTedious.\\n\\n## Post Mortem\\n\\n### Indexing\\n\\nI was asked about the indexing after publishing the blog. And truly it is rather\\ncomplicated topic, especially after releasing `SliceIndex` trait. I couldn\'t\\nleave it be, so I tried to implement the `Index` and `IndexMut` trait.\\n\\n:::note\\n\\nI have also mentioned that the `SliceIndex` trait is `unsafe`, but truth be told,\\nonly _unsafe_ part are the 2 methods that are named `*unchecked*`. Anyways, I will\\nbe implementing the `Index*` traits for now, rather than the `SliceIndex`.\\n\\n:::\\n\\nIt\'s relatively straightforward\u2026\\n\\n```rust\\nimpl Index> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n{\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n}\\n\\nimpl IndexMut> for [C]\\nwhere\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n{\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n}\\n```\\n\\nWe can see a lot of similarities to the implementation of `index` and `index_mut`\\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\\nsyntax sugar for `container[idx]`.\\n\\n:::note\\n\\nI have also switched from using the `TryFrom` to `TryInto` trait, since it better\\nmatches what we are using, the `.try_into` rather than `usize::try_from`.\\n\\nAlso implementing `TryFrom` automatically provides you with a `TryInto` trait,\\nsince it is relatively easy to implement. Just compare the following:\\n\\n```rust\\npub trait TryFrom: Sized {\\n type Error;\\n\\n fn try_from(value: T) -> Result;\\n}\\n\\npub trait TryInto: Sized {\\n type Error;\\n\\n fn try_into(self) -> Result;\\n}\\n```\\n\\n:::\\n\\nOK, so we have our trait implemented, we should be able to use `container[index]`,\\nright? Yes\u2026 but actually no :frowning:\\n\\n```\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:26:18\\n |\\n26 | if trees[pos] > tallest {\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:30:28\\n |\\n30 | max(tallest, trees[pos])\\n | ^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n\\nerror[E0277]: the type `[std::vec::Vec]` cannot be indexed by `aoc_2022::Vector2D`\\n --\x3e src/bin/day08.rs:52:28\\n |\\n52 | let max_height = trees[position];\\n | ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`\\n |\\n = help: the trait `std::slice::SliceIndex<[std::vec::Vec]>` is not implemented for `aoc_2022::Vector2D`\\n = note: required for `std::vec::Vec>` to implement `std::ops::Index>`\\n```\\n\\nWhy? We have it implemented for the slices (`[C]`), why doesn\'t it work? Well,\\nthe fun part consists of the fact that in other place, where we were using it,\\nwe were passing the `&[Vec]`, but this is coming from a helper functions that\\ntake `&Vec>` instead. And\u2026 we don\'t implement `Index` and `IndexMut` for\\nthose. Just for the slices. :exploding_head: *What are we going to do about it?*\\n\\nWe can either start copy-pasting or be smarter about it\u2026 I choose to be smarter,\\nso let\'s implement a macro! The only difference across the implementations are\\nthe types of the outer containers. Implementation doesn\'t differ **at all**!\\n\\nImplementing the macro can be done in a following way:\\n```rust\\nmacro_rules! generate_indices {\\n ($container:ty) => {\\n impl Index> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: Index,\\n {\\n type Output = C::Output;\\n\\n fn index(&self, index: Vector2D) -> &Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &self[y][x]\\n }\\n }\\n\\n impl IndexMut> for $container\\n where\\n I: Copy + TryInto,\\n >::Error: Debug,\\n C: IndexMut,\\n {\\n fn index_mut(&mut self, index: Vector2D) -> &mut Self::Output {\\n let (x, y): (usize, usize) =\\n (index.x.try_into().unwrap(), index.y.try_into().unwrap());\\n &mut self[y][x]\\n }\\n }\\n };\\n}\\n```\\n\\nAnd now we can simply do\\n```rust\\ngenerate_indices!(VecDeque);\\ngenerate_indices!([C]);\\ngenerate_indices!(Vec);\\n// generate_indices!([C; N], const N: usize);\\n```\\n\\nThe last type (I took the inspiration from the implementations of the `Index` and\\n`IndexMut` traits) is a bit problematic, because of the `const N: usize` part,\\nwhich I haven\'t managed to be able to parse. And that\'s how I got rid of the error.\\n\\n:::note\\n\\nIf I were to use 2D-indexing over `[C; N]` slices, I\'d probably just go with the\\ncopy-paste, cause the cost of this \u201cmonstrosity\u201d outweighs the benefits of no DRY.\\n\\n:::\\n\\n#### Cause of the problem\\n\\nThis issue is relatively funny. If you don\'t use any type aliases, just the raw\\ntypes, you\'ll get suggested certain changes by the _clippy_. For example if you\\nconsider the following piece of code\\n```rust\\nfn get_sum(nums: &Vec) -> i32 {\\n nums.iter().sum()\\n}\\n\\nfn main() {\\n let nums = vec![1, 2, 3];\\n println!(\\"Sum: {}\\", get_sum(&nums));\\n}\\n```\\n\\nand you run _clippy_ on it, you will get\\n```\\nChecking playground v0.0.1 (/playground)\\nwarning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do\\n --\x3e src/main.rs:1:18\\n |\\n1 | fn get_sum(nums: &Vec) -> i32 {\\n | ^^^^^^^^^ help: change this to: `&[i32]`\\n |\\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg\\n = note: `#[warn(clippy::ptr_arg)]` on by default\\n\\nwarning: `playground` (bin \\"playground\\") generated 1 warning\\n Finished dev [unoptimized + debuginfo] target(s) in 0.61s\\n```\\n\\nHowever, if you introduce a type alias, such as\\n```rust\\ntype Numbers = Vec;\\n```\\n\\nThen _clippy_ won\'t say anything, cause there is literally nothing to suggest.\\nHowever the outcome is not the same\u2026\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[BFS above]: #day-12-hill-climbing-algorithm"},{"id":"aoc-2022/1st-week","metadata":{"permalink":"/blog/aoc-2022/1st-week","editUrl":"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md","source":"@site/blog/aoc-2022/01-week-1.md","title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15:00.000Z","formattedDate":"December 15, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":12.4,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"1st week of Advent of Code \'22 in Rust","description":"Surviving first week in Rust.","date":"2022-12-15T01:15","slug":"aoc-2022/1st-week","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"prevItem":{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"},"nextItem":{"title":"Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/intro"}},"content":"Let\'s go through the first week of [_Advent of Code_] in Rust.\\n\\n\x3c!--truncate--\x3e\\n\\n:::note\\n\\nIf you wish to have a look at the solutions, you can follow them on my [GitLab].\\nMore specifically in the [`/src/bin/`].\\n\\n:::\\n\\nI will try to summarize my experience with using Rust for the AoC. Trying it out\\nages ago, I believe it will be _pain and suffering_, but we will see. For each\\nday I will also try to give a tl;dr of the problem, so that you can better imagine\\nthe relation to my woes or :+1: moments.\\n\\n## [Day 1: Calorie Counting](https://adventofcode.com/2022/day/1)\\n\\n:::info tl;dr\\n\\nAs the name suggests, we get the calories of the food contained in the elves\\nbackpacks and we want to choose the elf that has the most food ;)\\n\\n:::\\n\\n> Wakey wakey!\\n\\nProgramming in Rust at 6am definitely hits. I\'ve also forgotten to mention how I\\nhandle samples. With each puzzle you usually get a sample input and expected\\noutput. You can use them to verify that your solution works, or usually doesn\'t.\\n\\nAt first I\'ve decided to put asserts into my `main`, something like\\n```rust\\nassert_eq!(part_1(&sample), 24000);\\ninfo!(\\"Part 1: {}\\", part_1(&input));\\n\\nassert_eq!(part_2(&sample), 45000);\\ninfo!(\\"Part 2: {}\\", part_2(&input));\\n```\\n\\nHowever, once you get further, the sample input may take some time to run itself.\\nSo in the end, I have decided to turn them into unit tests:\\n```rust\\n#[cfg(test)]\\nmod tests {\\n use super::*;\\n\\n #[test]\\n fn test_part_1() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_1(&sample), 24000);\\n }\\n\\n #[test]\\n fn test_part_2() {\\n let sample = parse_input(\\"samples/day01.txt\\");\\n assert_eq!(part_2(&sample), 45000);\\n }\\n}\\n```\\n\\nAnd later on I have noticed, it\'s hard to tell the difference between the days,\\nso I further renamed the `mod` from generic `tests` to reflect the days.\\n\\nAlso after finishing the first day puzzle, I have installed an [`sccache`] to\\ncache the builds, so that the build time is lower, cause it was kinda unbearable.\\n\\n### Solution\\n\\nWell, it\'s a pretty simple problem. You just take the input, sum the calories and\\nfind the biggest one. However, if we try to generalize to more than the biggest\\none, the fun appears. We have few options:\\n\\n- keep all the calories, sort them, take what we need\\n- keep all the calories and use max heap\\n- use min heap and maintain at most N calories that we need\\n\\n## [Day 2: Rock Paper Scissors](https://adventofcode.com/2022/day/2)\\n\\n:::info tl;dr\\n\\nYou want to know what score did you achieve while playing _Rock Paper Scissors_.\\nAnd then you want to be strategic about it.\\n\\n:::\\n\\nApart from the technical details of the puzzle, it went relatively smooth.\\n\\n### Solution\\n\\nI took relatively na\xefve approach and then tried to simplify it.\\n\\n## [Day 3: Rucksack Reorganization](https://adventofcode.com/2022/day/3)\\n\\n:::info tl;dr\\n\\nLet\'s go reorganize elves\' backpacks! Each backpacks has 2 compartments and you\\nwant to find the common item among those compartments. Each of them has priority,\\nyou care only about the sum.\\n\\n:::\\n\\nThis is the day where I started to fight the compiler and neither of us decided\\nto give up. Let\'s dive into it \\\\o/\\n\\n:::tip Fun fact\\n\\nFighting the compiler took me 30 minutes.\\n\\n:::\\n\\nWe need to find a common item among 2 collections, that\'s an easy task, right?\\nWe can construct 2 sets and find an intersection:\\n```rust\\nlet top: HashSet = [1, 2, 3].iter().collect();\\nlet bottom: HashSet = [3, 4, 5].iter().collect();\\n```\\n\\nNow, the first issue that we encounter is caused by the fact that we are using\\na slice (the `[\u2026]`), iterator of that returns **references** to the numbers.\\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\\nafter running the `.collect`. To fix this, we can use `.into_iter`:\\n```rust\\nlet top: HashSet = [1, 2, 3].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5].into_iter().collect();\\n```\\n\\nThis way the numbers will get copied instead of referenced. OK, let\'s find the\\nintersection of those 2 collections:\\n```rust\\nprintln!(\\"Common elements: {:?}\\", top.intersection(&bottom));\\n```\\n```\\nCommon elements: [3]\\n```\\n\\n:::caution\\n\\nNotice that we need to do `&bottom`. It explicitly specifies that `.intersection`\\n**borrows** the `bottom`, i.e. takes an immutable reference to it.\\n\\n:::\\n\\nThat\'s what we want, right? Looks like it! \\\\o/\\n\\nNext part wants us to find the common element among all of the backpacks. OK, so\\nthat should be fairly easy, we have an intersection and we want to find intersection\\nover all of them.\\n\\nLet\'s have a look at the type of the `.intersection`\\n```rust\\npub fn intersection<\'a>(\\n\xa0\xa0\xa0\xa0&\'a self,\\n\xa0\xa0\xa0\xa0other: &\'a HashSet\\n) -> Intersection<\'a, T, S>\\n```\\n\\nOK\u2026 Huh\u2026 But we have an example there!\\n```rust\\nlet intersection: HashSet<_> = a.intersection(&b).collect();\\n```\\n\\nCool, that\'s all we need.\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n```\\nIntersection: {3, 4}\\n```\\n\\nCool, so let\'s do the intersection with the `top_2`:\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n\\nAnd we get yelled at by the compiler:\\n```\\nerror[E0308]: mismatched types\\n --\x3e src/main.rs:10:58\\n |\\n10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();\\n | ------------ ^^^^^^ expected `&i32`, found `i32`\\n | |\\n | arguments to this function are incorrect\\n |\\n = note: expected reference `&HashSet<&i32>`\\n found reference `&HashSet`\\n```\\n\\n/o\\\\ What the hell is going on here? Well, the funny thing is, that this operation\\ndoesn\'t return the elements themselves, but the references to them and when we pass\\nthe third set, it has just the values themselves, without any references.\\n\\n:::tip\\n\\nIt may seem as a very weird decision, but in fact it makes some sense\u2026 It allows\\nyou to do intersection of items that may not be possible to copy. Overall this is\\na \u201ctax\u201d for having a borrow checker ~~drilling your ass~~ having your back and\\nmaking sure you\'re not doing something naughty that may cause an **undefined**\\n**behavior**.\\n\\n:::\\n\\nTo resolve this we need to get an iterator that **clones** the elements:\\n```rust\\nlet top: HashSet = [1, 2, 3, 4].into_iter().collect();\\nlet bottom: HashSet = [3, 4, 5, 6].into_iter().collect();\\nlet top_2: HashSet = [2, 3, 4, 5, 6].into_iter().collect();\\nlet bottom_2: HashSet = [4, 5, 6].into_iter().collect();\\n\\nlet intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();\\nlet intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();\\nprintln!(\\"Intersection: {:?}\\", intersection);\\n```\\n```\\nIntersection: {4}\\n```\\n\\n### Solution\\n\\nThe approach is pretty simple, if you omit the _1on1 with the compiler_. You just\\nhave some fun with the set operations :)\\n\\n## [Day 4: Camp Cleanup](https://adventofcode.com/2022/day/4)\\n\\n:::info tl;dr\\n\\nElves are cleaning up the camp and they got overlapping sections to clean up.\\nFind how many overlap and can take the day off.\\n\\n:::\\n\\n[`RangeInclusive`] is your friend not an enemy :)\\n\\n### Solution\\n\\nRelatively easy, you just need to parse the input and know what you want. Rust\'s\\n`RangeInclusive` type helped a lot, cause it took care of all abstractions.\\n\\n## [Day 5: Supply Stacks](https://adventofcode.com/2022/day/5)\\n\\n:::info tl;dr\\n\\nLet\'s play with stacks of crates.\\n\\n:::\\n\\nVery easy problem with very annoying input. You can judge yourself:\\n```\\n [D] \\n[N] [C] \\n[Z] [M] [P]\\n 1 2 3 \\n\\nmove 1 from 2 to 1\\nmove 3 from 1 to 3\\nmove 2 from 2 to 1\\nmove 1 from 1 to 2\\n```\\n\\nGood luck transforming that into something reasonable :)\\n\\n\\n:::tip Fun fact\\n\\nTook me 40 minutes to parse this reasonably, including fighting the compiler.\\n\\n:::\\n\\n### Solution\\n\\nFor the initial solution I went with a manual solution (as in _I have done all_\\n_the work_. Later on I have decided to explore the `std` and interface of the\\n`std::vec::Vec` and found [`split_off`] which takes an index and splits (duh)\\nthe vector:\\n```rust\\nlet mut vec = vec![1, 2, 3];\\nlet vec2 = vec.split_off(1);\\nassert_eq!(vec, [1]);\\nassert_eq!(vec2, [2, 3]);\\n```\\n\\nThis helped me simplify my solution a lot and also get rid of some _edge cases_.\\n\\n## [Day 6: Tuning Trouble](https://adventofcode.com/2022/day/6)\\n\\n:::info tl;dr\\n\\nFinding start of the message in a very weird protocol. Start of the message is\\ndenoted by $N$ unique consecutive characters.\\n\\n:::\\n\\n### Solution\\n\\nA lot of different approaches, knowing that we are dealing with input consisting\\nsolely of ASCII letters, I bit the bullet and went with sliding window and\\nconstructing sets from that window, checking if the set is as big as the window.\\n\\nOne possible optimization could consist of keeping a bit-vector (i.e. `usize`\\nvariable) of encountered characters and updating it as we go. However this has\\na different issue and that is removal of the characters from the left side of the\\nwindow. We don\'t know if the same character is not included later on.\\n\\nOther option is to do similar thing, but keeping the frequencies of the letters,\\nand again knowing we have only ASCII letters we can optimize by having a vector\\nof 26 elements that keeps count for each lowercase letter.\\n\\n## [Day 7: No Space Left On Device](https://adventofcode.com/2022/day/7)\\n\\n:::info tl;dr\\n\\nLet\'s simulate [`du`] to get some stats about our file system and then pinpoint\\ndirectories that take a lot of space and should be deleted.\\n\\n:::\\n\\n> I was waiting for this moment, and yet it got me!\\n> *imagine me swearing for hours*\\n\\n### Solution\\n\\nWe need to \u201c_build_\u201d a file system from the input that is given in a following form:\\n```\\n$ cd /\\n$ ls\\ndir a\\n14848514 b.txt\\n8504156 c.dat\\ndir d\\n$ cd a\\n$ ls\\ndir e\\n29116 f\\n2557 g\\n62596 h.lst\\n$ cd e\\n$ ls\\n584 i\\n$ cd ..\\n$ cd ..\\n$ cd d\\n$ ls\\n4060174 j\\n8033020 d.log\\n5626152 d.ext\\n7214296 k\\n```\\n\\nThere are few ways in which you can achieve this and also you can assume some\\npreconditions, but why would we do that, right? :)\\n\\nYou can \u201cslap\u201d this in either [`HashMap`] or [`BTreeMap`] and call it a day.\\nAnd that would be boring\u2026\\n\\n:::tip\\n\\n`BTreeMap` is quite fitting for this, don\'t you think?\\n\\n:::\\n\\nI always wanted to try allocation on heap in Rust, so I chose to implement a tree.\\nI fought with the `Box` for some time and was losing\u2026\\n\\nThen I looked up some implementations of trees or linked lists and decided to try\\n`Rc>`. And I got my _ass whopped_ by the compiler once again. /o\\\\\\n\\n:::tip\\n\\n`Box` represents a dynamically allocated memory on heap. It is a single pointer,\\nyou can imagine this as `std::unique_ptr` in C++.\\n\\n`Rc` represents a dynamically allocated memory on heap. On top of that it is\\n_reference counted_ (that\'s what the `Rc` stands for). You can imagine this as\\n`std::shared_ptr` in C++.\\n\\nNow the fun stuff. Neither of them lets you **mutate** the contents of the memory.\\n\\n`Cell` allows you to mutate the memory. Can be used reasonably with types that\\ncan be copied, because the memory safety is guaranteed by copying the contents\\nwhen there is more than one **mutable** reference to the memory.\\n\\n`RefCell` is similar to the `Cell`, but the borrowing rules (how many mutable\\nreferences are present) are checked dynamically.\\n\\nSo in the end, if you want something like `std::shared_ptr` in Rust, you want\\nto have `Rc>`.\\n\\n:::\\n\\nSo, how are we going to represent the file system then? We will use an enumeration,\\nhehe, which is an algebraic data type that can store some stuff in itself :weary:\\n```rust\\ntype FileHandle = Rc>;\\n\\n#[derive(Debug)]\\nenum AocFile {\\n File(usize),\\n Directory(BTreeMap),\\n}\\n```\\n\\nLet\'s go over it! `FileHandle` represents dynamically allocated `AocFile`, not\\nmuch to discuss. What does the `#[derive(Debug)]` do though? It lets us to print\\nout the value of that enumeration, it\'s derived, so it\'s not as good as if we had\\nimplemented it ourselves, but it\'s good enough for debugging, hence the name.\\n\\nNow to the fun part! `AocFile` value can be represented in two ways:\\n- `File(usize)`, e.g. `AocFile::File(123)` and we can pattern match it, if we\\n need to\\n- `Directory(BTreeMap)` will represent the directory and will\\n contain map matching the name of the files (or directories) within to their\\n respective file handles\\n\\nI will omit the details about constructing this file system, cause there are a lot\\nof technicalities introduced by the nature of the input. However if you are\\ninterested, you can have a look at my solution.\\n\\nWe need to find small enough directories and also find the smallest directory that\\nwill free enough space. Now the question is, how could we do that. And there are\\nmultiple ways I will describe.\\n\\nI have chosen to implement [_tree catamorphism_] :weary:. It is basically a fold\\nover a tree data structure. We descent down into the leaves and propagate computed\\nresults all the way to the root. You can also notice that this approach is very\\nsimilar to _dynamic programming_, we find overlapping sections of the computation\\nand try to minimize the additional work (in this case: we need to know sizes of\\nour descendants, but we have already been there).\\n\\nAnother approach that has been suggested to me few days later is running DFS on\\nthe graph. And, funnily enough, we would still need to combine what we found in\\nthe branches where we descent. So in the end, it would work very similarly to my\\nsolution.\\n\\nOne of the more exotic options would be precomputing the required information at\\nthe same time as parsing. That could be done by adding additional fields to the\\nnodes which would allow storing such information and updating it as we construct\\nthe file system.\\n\\n## Post Mortem\\n\\nThings that have been brought up in the discussion later on.\\n\\n### `Rc` vs `Rc>`\\n\\nIt has been brought up that I have a contradicting statement regarding the\\ndynamically allocated memory. Specifically:\\n\\n- You can imagine `Rc` as an `std::shared_ptr` (in C++)\\n- When you want an equivalent of `std::shared_ptr`, you want to use\\n `Rc>`\\n\\nNow, in Rust it is a bit more complicated, because the type that represents the\\n\u201cshared pointer\u201d is `Rc`. What `RefCell` does is making sure that there is\\nonly one \u201cowner\u201d of a mutable reference at a time (and dynamically, as opposed\\nto the `Cell`).\\n\\nTherefore to be precise and correct about the equivalents of `std::shared_ptr`\\nin Rust, we can say that\\n\\n- `Rc` is an equivalent of a `const std::shared_ptr`,\\n- and `Rc>` is an equivalent of a `std::shared_ptr`.\\n\\nYou can easily see that they only differ in the mutability. (And even that is not\\nas simple as it seems, because there is also `Cell`)\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[GitLab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[`/src/bin/`]: https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin\\n[`sccache`]: https://github.com/mozilla/sccache\\n[`RangeInclusive`]: https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html\\n[`split_off`]: https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off\\n[`du`]: https://www.man7.org/linux/man-pages/man1/du.1.html\\n[`HashMap`]: https://doc.rust-lang.org/std/collections/struct.HashMap.html\\n[`BTreeMap`]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html\\n[_tree catamorphism_]: https://en.wikipedia.org/wiki/Catamorphism#Tree_fold"},{"id":"aoc-2022/intro","metadata":{"permalink":"/blog/aoc-2022/intro","editUrl":"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/00-intro.md","source":"@site/blog/aoc-2022/00-intro.md","title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45:00.000Z","formattedDate":"December 14, 2022","tags":[{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code"},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022"},{"label":"rust","permalink":"/blog/tags/rust"}],"readingTime":8.665,"hasTruncateMarker":true,"authors":[{"name":"Matej Focko","email":"me+blog@mfocko.xyz","title":"a.k.a. @mf","url":"https://gitlab.com/mfocko","imageURL":"https://github.com/mfocko.png","key":"mf"}],"frontMatter":{"title":"Advent of Code \'22 in Rust","description":"Preparing for Advent of Code \'22.","date":"2022-12-14T21:45","slug":"aoc-2022/intro","authors":"mf","tags":["advent-of-code","advent-of-code-2022","rust"],"hide_table_of_contents":false},"prevItem":{"title":"1st week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/1st-week"}},"content":"Let\'s talk about the preparations for this year\'s [_Advent of Code_].\\n\\n\x3c!--truncate--\x3e\\n\\n## Choosing a language\\n\\nWhen choosing a language for AoC, you usually want a language that gives you a\\nquick feedback which allows you to iterate quickly to the solution of the puzzle.\\nOne of the most common choices is Python, many people also use JavaScript or Ruby.\\n\\nGiven the competitive nature of the AoC and popularity among competitive programming,\\nC++ might be also a very good choice. Only if you are familiar with it, I guess\u2026\\n\\nIf you want a challenge, you might also choose to rotate the languages each day.\\nThough I prefer to use only one language.\\n\\nFor this year I have been deciding between _Rust_, _C++_ and _Pascal_ or _Ada_.\\n\\nI have tried Rust last year and have survived with it for 3 days and then gave\\nup and switched to _Kotlin_, which was pretty good given it is \u201cJava undercover\u201d.\\nI pretty much like the ideas behind Rust, I am not sure about the whole cult and\\nimplementation of those ideas though. After some years with C/C++, I would say\\nthat Rust feels _too safe_ for my taste and tries to \u201c_punish me_\u201d even for the\\nmost trivial things.\\n\\nC++ is a very robust, but also comes with a wide variety of options providing you\\nthe ability to shoot yourself in the leg. I have tried to solve few days of previous\\nAdvent of Code events, it was _relatively easy_ to solve the problems in C++, given\\nthat I do not admit writing my own iterator for `enumerate`\u2026\\n\\nPascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a\\npretty nice standard library that offers enough to be able to quickly solve some\\nproblems in it. However the toolkit is questionable :/\\n\\n## Choosing libraries\\n\\n## Preparations for Rust\\n\\nAll of the sources, later on including solutions, can be found at my\\n[GitLab].\\n\\n### Toolkit\\n\\nSince we are using Rust, we are going to use a [Cargo] and more than likely VSCode\\nwith [`rust-analyzer`]. Because of my choice of libraries, we will also introduce\\na `.envrc` file that can be used by [`direnv`], which allows you to set specific\\nenvironment variables when you enter a directory. In our case, we will use\\n```bash\\n# to show nice backtrace when using the color-eyre\\nexport RUST_BACKTRACE=1\\n\\n# to catch logs generated by tracing\\nexport RUST_LOG=trace\\n```\\n\\nAnd for the one of the most obnoxious things ever, we will use a script to download\\nthe inputs instead of \u201c_clicking, opening and copying to a file_\u201d[^1]. There is\\nno need to be _fancy_, so we will adjust Python script by Martin[^2].\\n```py\\n#!/usr/bin/env python3\\n\\nimport datetime\\nimport yaml\\nimport requests\\nimport sys\\n\\n\\ndef load_config():\\n with open(\\"env.yaml\\", \\"r\\") as f:\\n js = yaml.load(f, Loader=yaml.Loader)\\n return js[\\"session\\"], js[\\"year\\"]\\n\\n\\ndef get_input(session, year, day):\\n return requests.get(\\n f\\"https://adventofcode.com/{year}/day/{day}/input\\",\\n cookies={\\"session\\": session},\\n headers={\\n \\"User-Agent\\": \\"{repo} by {mail}\\".format(\\n repo=\\"gitlab.com/mfocko/advent-of-code-2022\\",\\n mail=\\"me@mfocko.xyz\\",\\n )\\n },\\n ).content.decode(\\"utf-8\\")\\n\\n\\ndef main():\\n day = datetime.datetime.now().day\\n if len(sys.argv) == 2:\\n day = sys.argv[1]\\n\\n session, year = load_config()\\n problem_input = get_input(session, year, day)\\n\\n with open(f\\"./inputs/day{day:>02}.txt\\", \\"w\\") as f:\\n f.write(problem_input)\\n\\n\\nif __name__ == \\"__main__\\":\\n main()\\n```\\n\\nIf the script is called without any arguments, it will deduce the day from the\\nsystem, so we do not need to change the day every morning. It also requires a\\nconfiguration file:\\n```yaml\\n# env.yaml\\nsession: \u2039your session cookie\u203a\\nyear: 2022\\n```\\n\\n### Libraries\\n\\nLooking at the list of the libraries, I have chosen \u201ca lot\u201d of them. Let\'s walk\\nthrough each of them.\\n\\n[`tracing`] and [`tracing-subscriber`] are the crates that can be used for tracing\\nand logging of your Rust programs, there are also other crates that can help you\\nwith providing backtrace to the Sentry in case you have deployed your application\\nsomewhere and you want to watch over it. In our use case we will just utilize the\\nmacros for debugging in the terminal.\\n\\n[`thiserror`], [`anyhow`] and [`color-eyre`] are used for error reporting.\\n`thiserror` is a very good choice for libraries, cause it extends the `Error`\\nfrom the `std` and allows you to create more convenient error types. Next is\\n`anyhow` which kinda builds on top of the `thiserror` and provides you with simpler\\nerror handling in binaries[^3]. And finally we have `color-eyre` which, as I found\\nout later, is a colorful (_wink wink_) extension of `eyre` which is fork of `anyhow`\\nwhile supporting customized reports.\\n\\nIn the end I have decided to remove `thiserror` and `anyhow`, since first one is\\nsuitable for libraries and the latter was basically fully replaced by `{color-,}eyre`.\\n\\n[`regex`] and [`lazy_static`] are a very good and also, I hope, self-explanatory\\ncombination. `lazy_static` allows you to have static variables that must be initialized\\nduring runtime.\\n\\n[`itertools`] provides some nice extensions to the iterators from the `std`.\\n\\n### My own \u201clibrary\u201d\\n\\nWhen creating the crate for this year\'s Advent of Code, I have chosen a library\\ntype. Even though standard library is huge, some things might not be included and\\nalso we can follow _KISS_. I have 2 modules that my \u201clibrary\u201d exports, one for\\nparsing and one for 2D vector (that gets used quite often during Advent of Code).\\n\\nKey part is, of course, processing the input and my library exports following\\nfunctions that get used a lot:\\n```rust\\n/// Reads file to the string.\\npub fn file_to_string>(pathname: P) -> String;\\n\\n/// Reads file and returns it as a vector of characters.\\npub fn file_to_chars>(pathname: P) -> Vec;\\n\\n/// Reads file and returns a vector of parsed structures. Expects each structure\\n/// on its own line in the file. And `T` needs to implement `FromStr` trait.\\npub fn file_to_structs, T: FromStr>(pathname: P) -> Vec\\nwhere\\n ::Err: Debug;\\n\\n/// Converts iterator over strings to a vector of parsed structures. `T` needs\\n/// to implement `FromStr` trait and its error must derive `Debug` trait.\\npub fn strings_to_structs(\\n iter: impl Iterator\\n) -> Vec\\nwhere\\n ::Err: std::fmt::Debug,\\n U: Deref;\\n\\n/// Reads file and returns it as a vector of its lines.\\npub fn file_to_lines>(pathname: P) -> Vec;\\n```\\n\\nAs for the vector, I went with a rather simple implementation that allows only\\naddition of the vectors for now and accessing the elements via functions `x()`\\nand `y()`. Also the vector is generic, so we can use it with any numeric type we\\nneed.\\n\\n### Skeleton\\n\\nWe can also prepare a template to quickly bootstrap each of the days. We know\\nthat each puzzle has 2 parts, which means that we can start with 2 functions that\\nwill solve them.\\n```rust\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n```\\n\\nBoth functions take reference to the input and return some output (in majority\\nof puzzles, it is the same type). `todo!()` can be used as a nice placeholder,\\nit also causes a panic when reached and we could also provide some string with\\nan explanation, e.g. `todo!(\\"part 1\\")`. We have not given functions a specific\\ntype and to avoid as much copy-paste as possible, we will introduce type aliases.\\n```rust\\ntype Input = String;\\ntype Output = i32;\\n```\\n\\n:::tip\\n\\nThis allows us to quickly adjust the types only in one place without the need to\\ndo _regex-replace_ or replace them manually.\\n\\n:::\\n\\nFor each day we get a personalized input that is provided as a text file. Almost\\nall the time, we would like to get some structured type out of that input, and\\ntherefore it makes sense to introduce a new function that will provide the parsing\\nof the input.\\n```rust\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n```\\n\\nThis \u201cparser\u201d will take a path to the file, just in case we would like to run the\\nsample instead of input.\\n\\nOK, so now we can write a `main` function that will take all of the pieces and\\nrun them.\\n```rust\\nfn main() {\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n println!(\\"Part 1: {}\\", part_1(&input));\\n println!(\\"Part 2: {}\\", part_2(&input));\\n}\\n```\\n\\nThis would definitely do :) But we have installed a few libraries and we want to\\nuse them. In this part we are going to utilize _[`tracing`]_ (for tracing, duh\u2026)\\nand _[`color-eyre`]_ (for better error reporting, e.g. from parsing).\\n```rust\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\nThe first statement will set up tracing and configure it to print out the logs to\\nterminal, based on the environment variable. We also change the formatting a bit,\\nsince we do not need all the _fancy_ features of the logger. Pure initialization\\nwould get us logs like this:\\n```\\n2022-12-11T19:53:19.975343Z INFO day01: Part 1: 0\\n```\\n\\nHowever after running that command, we will get the following:\\n```\\n INFO src/bin/day01.rs:35: Part 1: 0\\n```\\n\\nAnd the `color_eyre::install()?` is quite straightforward. We just initialize the\\nerror reporting by _color eyre_.\\n\\n:::caution\\n\\nNotice that we had to add `Ok(())` to the end of the function and adjust the\\nreturn type of the `main` to `Result<()>`. It is caused by the _color eyre_ that\\ncan be installed only once and therefore it can fail, that is how we got the `?`\\nat the end of the `::install` which _unwraps_ the **\xbbresult\xab** of the installation.\\n\\n:::\\n\\nOverall we will get to a template like this:\\n```rust\\nuse aoc_2022::*;\\n\\nuse color_eyre::eyre::Result;\\nuse tracing::info;\\nuse tracing_subscriber::EnvFilter;\\n\\ntype Input = String;\\ntype Output = i32;\\n\\nfn parse_input(path: &str) -> Input {\\n todo!()\\n}\\n\\nfn part1(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn part2(input: &Input) -> Output {\\n todo!()\\n}\\n\\nfn main() -> Result<()> {\\n tracing_subscriber::fmt()\\n .with_env_filter(EnvFilter::from_default_env())\\n .with_target(false)\\n .with_file(true)\\n .with_line_number(true)\\n .without_time()\\n .compact()\\n .init();\\n color_eyre::install()?;\\n\\n let input = parse_input(\\"inputs/dayXX.txt\\");\\n\\n info!(\\"Part 1: {}\\", part_1(&input));\\n info!(\\"Part 2: {}\\", part_2(&input));\\n\\n Ok(())\\n}\\n```\\n\\n[^1]: Copy-pasting might be a relaxing thing to do, but you can also discover\\nnasty stuff about your PC. See [this Reddit post and the comment].\\n[^2]: [GitHub profile](https://github.com/martinjonas)\\n[^3]: Even though you can use it even for libraries, but handling errors from\\nlibraries using `anyhow` is nasty\u2026 You will be the stinky one ;)\\n\\n[_Advent of Code_]: https://adventofcode.com\\n[GitLab]: https://gitlab.com/mfocko/advent-of-code-2022\\n[Cargo]: https://doc.rust-lang.org/cargo/\\n[`rust-analyzer`]: https://rust-analyzer.github.io/\\n[`direnv`]: https://direnv.net/\\n[`tracing`]: https://crates.io/crates/tracing\\n[`tracing-subscriber`]: https://crates.io/crates/tracing-subscriber\\n[`thiserror`]: https://crates.io/crates/thiserror\\n[`anyhow`]: https://crates.io/crates/anyhow\\n[`color-eyre`]: https://crates.io/crates/color-eyre\\n[`regex`]: https://crates.io/crates/regex\\n[`lazy_static`]: https://crates.io/crates/lazy_static\\n[`itertools`]: https://crates.io/crates/itertools\\n[this Reddit post and the comment]: https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"}]}')}}]); \ No newline at end of file diff --git a/assets/js/4621632b.f101cb78.js b/assets/js/4621632b.f101cb78.js new file mode 100644 index 0000000..3a8b6cf --- /dev/null +++ b/assets/js/4621632b.f101cb78.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3519],{9760:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cpp","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/4688cd57.4f084bfb.js b/assets/js/4688cd57.4f084bfb.js new file mode 100644 index 0000000..dfcee9b --- /dev/null +++ b/assets/js/4688cd57.4f084bfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[932],{2647:e=>{e.exports=JSON.parse('{"title":"Bonuses","description":"Bonus assignments for Kontr Coins.\\n","slug":"/category/bonuses","permalink":"/pb071/category/bonuses","navigation":{"previous":{"title":"Introduction","permalink":"/pb071/"},"next":{"title":"3rd seminar","permalink":"/pb071/bonuses/seminar-03"}}}')}}]); \ No newline at end of file diff --git a/assets/js/470a9204.f961c4a3.js b/assets/js/470a9204.f961c4a3.js new file mode 100644 index 0000000..55b999b --- /dev/null +++ b/assets/js/470a9204.f961c4a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3936],{4439:i=>{i.exports=JSON.parse('{"label":"applications","permalink":"/ib002/tags/applications","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"rb-trees/applications","title":"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f","description":"Uk\xe1zka pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f v standardn\xedch kni\u017enic\xedch zn\xe1m\xfdch jazyk\u016f.\\n","permalink":"/ib002/rb-trees/applications"}]}')}}]); \ No newline at end of file diff --git a/assets/js/487.7b135b0c.js b/assets/js/487.7b135b0c.js new file mode 100644 index 0000000..9a656f4 --- /dev/null +++ b/assets/js/487.7b135b0c.js @@ -0,0 +1,7370 @@ +exports.id = 487; +exports.ids = [487]; +exports.modules = { + +/***/ 17295: +/***/ ((module) => { + +(function(f){if(true){module.exports=f()}else { var g; }})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=undefined;if(!f&&c)return require(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=undefined,i=0;i 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$defaultLayoutOpt = _ref.defaultLayoutOptions, + defaultLayoutOptions = _ref$defaultLayoutOpt === undefined ? {} : _ref$defaultLayoutOpt, + _ref$algorithms = _ref.algorithms, + algorithms = _ref$algorithms === undefined ? ['layered', 'stress', 'mrtree', 'radial', 'force', 'disco', 'sporeOverlap', 'sporeCompaction', 'rectpacking'] : _ref$algorithms, + workerFactory = _ref.workerFactory, + workerUrl = _ref.workerUrl; + + _classCallCheck(this, ELK); + + this.defaultLayoutOptions = defaultLayoutOptions; + this.initialized = false; + + // check valid worker construction possible + if (typeof workerUrl === 'undefined' && typeof workerFactory === 'undefined') { + throw new Error("Cannot construct an ELK without both 'workerUrl' and 'workerFactory'."); + } + var factory = workerFactory; + if (typeof workerUrl !== 'undefined' && typeof workerFactory === 'undefined') { + // use default Web Worker + factory = function factory(url) { + return new Worker(url); + }; + } + + // create the worker + var worker = factory(workerUrl); + if (typeof worker.postMessage !== 'function') { + throw new TypeError("Created worker does not provide" + " the required 'postMessage' function."); + } + + // wrap the worker to return promises + this.worker = new PromisedWorker(worker); + + // initially register algorithms + this.worker.postMessage({ + cmd: 'register', + algorithms: algorithms + }).then(function (r) { + return _this.initialized = true; + }).catch(console.err); + } + + _createClass(ELK, [{ + key: 'layout', + value: function layout(graph) { + var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref2$layoutOptions = _ref2.layoutOptions, + layoutOptions = _ref2$layoutOptions === undefined ? this.defaultLayoutOptions : _ref2$layoutOptions, + _ref2$logging = _ref2.logging, + logging = _ref2$logging === undefined ? false : _ref2$logging, + _ref2$measureExecutio = _ref2.measureExecutionTime, + measureExecutionTime = _ref2$measureExecutio === undefined ? false : _ref2$measureExecutio; + + if (!graph) { + return Promise.reject(new Error("Missing mandatory parameter 'graph'.")); + } + return this.worker.postMessage({ + cmd: 'layout', + graph: graph, + layoutOptions: layoutOptions, + options: { + logging: logging, + measureExecutionTime: measureExecutionTime + } + }); + } + }, { + key: 'knownLayoutAlgorithms', + value: function knownLayoutAlgorithms() { + return this.worker.postMessage({ cmd: 'algorithms' }); + } + }, { + key: 'knownLayoutOptions', + value: function knownLayoutOptions() { + return this.worker.postMessage({ cmd: 'options' }); + } + }, { + key: 'knownLayoutCategories', + value: function knownLayoutCategories() { + return this.worker.postMessage({ cmd: 'categories' }); + } + }, { + key: 'terminateWorker', + value: function terminateWorker() { + this.worker.terminate(); + } + }]); + + return ELK; +}(); + +exports.default = ELK; + +var PromisedWorker = function () { + function PromisedWorker(worker) { + var _this2 = this; + + _classCallCheck(this, PromisedWorker); + + if (worker === undefined) { + throw new Error("Missing mandatory parameter 'worker'."); + } + this.resolvers = {}; + this.worker = worker; + this.worker.onmessage = function (answer) { + // why is this necessary? + setTimeout(function () { + _this2.receive(_this2, answer); + }, 0); + }; + } + + _createClass(PromisedWorker, [{ + key: 'postMessage', + value: function postMessage(msg) { + var id = this.id || 0; + this.id = id + 1; + msg.id = id; + var self = this; + return new Promise(function (resolve, reject) { + // prepare the resolver + self.resolvers[id] = function (err, res) { + if (err) { + self.convertGwtStyleError(err); + reject(err); + } else { + resolve(res); + } + }; + // post the message + self.worker.postMessage(msg); + }); + } + }, { + key: 'receive', + value: function receive(self, answer) { + var json = answer.data; + var resolver = self.resolvers[json.id]; + if (resolver) { + delete self.resolvers[json.id]; + if (json.error) { + resolver(json.error); + } else { + resolver(null, json.data); + } + } + } + }, { + key: 'terminate', + value: function terminate() { + if (this.worker.terminate) { + this.worker.terminate(); + } + } + }, { + key: 'convertGwtStyleError', + value: function convertGwtStyleError(err) { + if (!err) { + return; + } + // Somewhat flatten the way GWT stores nested exception(s) + var javaException = err['__java$exception']; + if (javaException) { + // Note that the property name of the nested exception is different + // in the non-minified ('cause') and the minified (not deterministic) version. + // Hence, the version below only works for the non-minified version. + // However, as the minified stack trace is not of much use anyway, one + // should switch the used version for debugging in such a case. + if (javaException.cause && javaException.cause.backingJsObject) { + err.cause = javaException.cause.backingJsObject; + this.convertGwtStyleError(err.cause); + } + delete err['__java$exception']; + } + } + }]); + + return PromisedWorker; +}(); +},{}],2:[function(require,module,exports){ +(function (global){(function (){ +'use strict'; + +// -------------- FAKE ELEMENTS GWT ASSUMES EXIST -------------- +var $wnd; +if (typeof window !== 'undefined') + $wnd = window +else if (typeof global !== 'undefined') + $wnd = global // nodejs +else if (typeof self !== 'undefined') + $wnd = self // web worker + +var $moduleName, + $moduleBase; + +// -------------- WORKAROUND STRICT MODE, SEE #127 -------------- +var g, i, o; + +// -------------- GENERATED CODE -------------- +function nb(){} +function xb(){} +function Fd(){} +function $g(){} +function _p(){} +function yq(){} +function Sq(){} +function Es(){} +function Jw(){} +function Vw(){} +function VA(){} +function dA(){} +function MA(){} +function PA(){} +function PB(){} +function bx(){} +function cx(){} +function vy(){} +function Nz(){} +function Yz(){} +function Ylb(){} +function Ymb(){} +function xmb(){} +function Fmb(){} +function Qmb(){} +function gcb(){} +function ccb(){} +function jcb(){} +function jtb(){} +function otb(){} +function qtb(){} +function _fb(){} +function bpb(){} +function kpb(){} +function ppb(){} +function Gpb(){} +function drb(){} +function dzb(){} +function fzb(){} +function fxb(){} +function Vxb(){} +function Ovb(){} +function byb(){} +function zyb(){} +function Zyb(){} +function _yb(){} +function hzb(){} +function jzb(){} +function lzb(){} +function nzb(){} +function rzb(){} +function zzb(){} +function Czb(){} +function Ezb(){} +function Gzb(){} +function Izb(){} +function Mzb(){} +function bBb(){} +function NBb(){} +function PBb(){} +function RBb(){} +function iCb(){} +function OCb(){} +function SCb(){} +function GDb(){} +function JDb(){} +function fEb(){} +function xEb(){} +function CEb(){} +function GEb(){} +function yFb(){} +function KGb(){} +function tIb(){} +function vIb(){} +function xIb(){} +function zIb(){} +function OIb(){} +function SIb(){} +function TJb(){} +function VJb(){} +function XJb(){} +function XKb(){} +function fKb(){} +function VKb(){} +function VLb(){} +function jLb(){} +function nLb(){} +function GLb(){} +function KLb(){} +function MLb(){} +function OLb(){} +function RLb(){} +function YLb(){} +function bMb(){} +function gMb(){} +function lMb(){} +function pMb(){} +function wMb(){} +function zMb(){} +function CMb(){} +function FMb(){} +function LMb(){} +function zNb(){} +function PNb(){} +function kOb(){} +function pOb(){} +function tOb(){} +function yOb(){} +function FOb(){} +function GPb(){} +function aQb(){} +function cQb(){} +function eQb(){} +function gQb(){} +function iQb(){} +function CQb(){} +function MQb(){} +function OQb(){} +function ASb(){} +function fTb(){} +function kTb(){} +function STb(){} +function fUb(){} +function DUb(){} +function VUb(){} +function YUb(){} +function _Ub(){} +function _Wb(){} +function QWb(){} +function XWb(){} +function jVb(){} +function DVb(){} +function VVb(){} +function $Vb(){} +function dXb(){} +function hXb(){} +function lXb(){} +function gYb(){} +function HYb(){} +function SYb(){} +function VYb(){} +function dZb(){} +function P$b(){} +function T$b(){} +function h1b(){} +function m1b(){} +function q1b(){} +function u1b(){} +function y1b(){} +function C1b(){} +function e2b(){} +function g2b(){} +function m2b(){} +function q2b(){} +function u2b(){} +function S2b(){} +function U2b(){} +function W2b(){} +function _2b(){} +function e3b(){} +function h3b(){} +function p3b(){} +function t3b(){} +function w3b(){} +function y3b(){} +function A3b(){} +function M3b(){} +function Q3b(){} +function U3b(){} +function Y3b(){} +function l4b(){} +function q4b(){} +function s4b(){} +function u4b(){} +function w4b(){} +function y4b(){} +function L4b(){} +function N4b(){} +function P4b(){} +function R4b(){} +function T4b(){} +function X4b(){} +function I5b(){} +function Q5b(){} +function T5b(){} +function Z5b(){} +function l6b(){} +function o6b(){} +function t6b(){} +function z6b(){} +function L6b(){} +function M6b(){} +function P6b(){} +function X6b(){} +function $6b(){} +function a7b(){} +function c7b(){} +function g7b(){} +function j7b(){} +function m7b(){} +function r7b(){} +function x7b(){} +function D7b(){} +function D9b(){} +function b9b(){} +function h9b(){} +function j9b(){} +function l9b(){} +function w9b(){} +function F9b(){} +function hac(){} +function jac(){} +function pac(){} +function uac(){} +function Iac(){} +function Kac(){} +function Sac(){} +function obc(){} +function rbc(){} +function vbc(){} +function Fbc(){} +function Jbc(){} +function Xbc(){} +function ccc(){} +function fcc(){} +function lcc(){} +function occ(){} +function tcc(){} +function ycc(){} +function Acc(){} +function Ccc(){} +function Ecc(){} +function Gcc(){} +function Zcc(){} +function _cc(){} +function bdc(){} +function fdc(){} +function jdc(){} +function pdc(){} +function sdc(){} +function ydc(){} +function Adc(){} +function Cdc(){} +function Edc(){} +function Idc(){} +function Ndc(){} +function Qdc(){} +function Sdc(){} +function Udc(){} +function Wdc(){} +function Ydc(){} +function aec(){} +function hec(){} +function jec(){} +function lec(){} +function nec(){} +function uec(){} +function wec(){} +function yec(){} +function Aec(){} +function Fec(){} +function Jec(){} +function Lec(){} +function Nec(){} +function Rec(){} +function Uec(){} +function Zec(){} +function Zfc(){} +function lfc(){} +function tfc(){} +function xfc(){} +function zfc(){} +function Ffc(){} +function Jfc(){} +function Nfc(){} +function Pfc(){} +function Vfc(){} +function _fc(){} +function fgc(){} +function jgc(){} +function lgc(){} +function Bgc(){} +function ehc(){} +function ghc(){} +function ihc(){} +function khc(){} +function mhc(){} +function ohc(){} +function qhc(){} +function yhc(){} +function Ahc(){} +function Ghc(){} +function Ihc(){} +function Khc(){} +function Mhc(){} +function Shc(){} +function Uhc(){} +function Whc(){} +function dic(){} +function dlc(){} +function blc(){} +function flc(){} +function hlc(){} +function jlc(){} +function Glc(){} +function Ilc(){} +function Klc(){} +function Mlc(){} +function Mjc(){} +function Qjc(){} +function Qlc(){} +function Ulc(){} +function Ylc(){} +function Lkc(){} +function Nkc(){} +function Pkc(){} +function Rkc(){} +function Xkc(){} +function _kc(){} +function gmc(){} +function kmc(){} +function zmc(){} +function Fmc(){} +function Wmc(){} +function $mc(){} +function anc(){} +function mnc(){} +function wnc(){} +function Hnc(){} +function Jnc(){} +function Lnc(){} +function Nnc(){} +function Pnc(){} +function Ync(){} +function eoc(){} +function Aoc(){} +function Coc(){} +function Eoc(){} +function Joc(){} +function Loc(){} +function Zoc(){} +function _oc(){} +function bpc(){} +function hpc(){} +function kpc(){} +function ppc(){} +function pFc(){} +function Ryc(){} +function QCc(){} +function PDc(){} +function xGc(){} +function HGc(){} +function JGc(){} +function NGc(){} +function GIc(){} +function iKc(){} +function mKc(){} +function wKc(){} +function yKc(){} +function AKc(){} +function EKc(){} +function KKc(){} +function OKc(){} +function QKc(){} +function SKc(){} +function UKc(){} +function YKc(){} +function aLc(){} +function fLc(){} +function hLc(){} +function nLc(){} +function pLc(){} +function tLc(){} +function vLc(){} +function zLc(){} +function BLc(){} +function DLc(){} +function FLc(){} +function sMc(){} +function JMc(){} +function hNc(){} +function RNc(){} +function ZNc(){} +function _Nc(){} +function bOc(){} +function dOc(){} +function fOc(){} +function hOc(){} +function hRc(){} +function jRc(){} +function KRc(){} +function NRc(){} +function NQc(){} +function LQc(){} +function _Qc(){} +function cPc(){} +function iPc(){} +function kPc(){} +function mPc(){} +function xPc(){} +function zPc(){} +function zSc(){} +function BSc(){} +function GSc(){} +function ISc(){} +function NSc(){} +function TSc(){} +function NTc(){} +function NVc(){} +function oVc(){} +function SVc(){} +function VVc(){} +function XVc(){} +function ZVc(){} +function bWc(){} +function bXc(){} +function CXc(){} +function FXc(){} +function IXc(){} +function MXc(){} +function UXc(){} +function bYc(){} +function fYc(){} +function oYc(){} +function qYc(){} +function uYc(){} +function pZc(){} +function G$c(){} +function h0c(){} +function N0c(){} +function k1c(){} +function I1c(){} +function Q1c(){} +function f2c(){} +function i2c(){} +function k2c(){} +function w2c(){} +function O2c(){} +function S2c(){} +function Z2c(){} +function v3c(){} +function x3c(){} +function R3c(){} +function U3c(){} +function e4c(){} +function w4c(){} +function x4c(){} +function z4c(){} +function B4c(){} +function D4c(){} +function F4c(){} +function H4c(){} +function J4c(){} +function L4c(){} +function N4c(){} +function P4c(){} +function R4c(){} +function T4c(){} +function V4c(){} +function X4c(){} +function Z4c(){} +function _4c(){} +function _7c(){} +function b5c(){} +function d5c(){} +function f5c(){} +function h5c(){} +function H5c(){} +function Hfd(){} +function Zfd(){} +function Zed(){} +function ged(){} +function Jed(){} +function Ned(){} +function Red(){} +function Ved(){} +function bbd(){} +function mdd(){} +function _fd(){} +function fgd(){} +function kgd(){} +function Mgd(){} +function Ahd(){} +function Ald(){} +function Tld(){} +function xkd(){} +function rmd(){} +function knd(){} +function Jod(){} +function JCd(){} +function Bpd(){} +function BFd(){} +function oFd(){} +function bqd(){} +function bvd(){} +function jvd(){} +function yud(){} +function Hxd(){} +function EBd(){} +function aDd(){} +function MGd(){} +function vHd(){} +function RHd(){} +function wNd(){} +function zNd(){} +function CNd(){} +function KNd(){} +function XNd(){} +function $Nd(){} +function HPd(){} +function lUd(){} +function XUd(){} +function DWd(){} +function GWd(){} +function JWd(){} +function MWd(){} +function PWd(){} +function SWd(){} +function VWd(){} +function YWd(){} +function _Wd(){} +function xYd(){} +function BYd(){} +function mZd(){} +function EZd(){} +function GZd(){} +function JZd(){} +function MZd(){} +function PZd(){} +function SZd(){} +function VZd(){} +function YZd(){} +function _Zd(){} +function c$d(){} +function f$d(){} +function i$d(){} +function l$d(){} +function o$d(){} +function r$d(){} +function u$d(){} +function x$d(){} +function A$d(){} +function D$d(){} +function G$d(){} +function J$d(){} +function M$d(){} +function P$d(){} +function S$d(){} +function V$d(){} +function Y$d(){} +function _$d(){} +function c_d(){} +function f_d(){} +function i_d(){} +function l_d(){} +function o_d(){} +function r_d(){} +function u_d(){} +function x_d(){} +function A_d(){} +function D_d(){} +function G_d(){} +function J_d(){} +function M_d(){} +function P_d(){} +function S_d(){} +function V_d(){} +function Y_d(){} +function h5d(){} +function U6d(){} +function U9d(){} +function _8d(){} +function fae(){} +function hae(){} +function kae(){} +function nae(){} +function qae(){} +function tae(){} +function wae(){} +function zae(){} +function Cae(){} +function Fae(){} +function Iae(){} +function Lae(){} +function Oae(){} +function Rae(){} +function Uae(){} +function Xae(){} +function $ae(){} +function bbe(){} +function ebe(){} +function hbe(){} +function kbe(){} +function nbe(){} +function qbe(){} +function tbe(){} +function wbe(){} +function zbe(){} +function Cbe(){} +function Fbe(){} +function Ibe(){} +function Lbe(){} +function Obe(){} +function Rbe(){} +function Ube(){} +function Xbe(){} +function $be(){} +function bce(){} +function ece(){} +function hce(){} +function kce(){} +function nce(){} +function qce(){} +function tce(){} +function wce(){} +function zce(){} +function Cce(){} +function Fce(){} +function Ice(){} +function Lce(){} +function Oce(){} +function Rce(){} +function Uce(){} +function Xce(){} +function ude(){} +function Vge(){} +function dhe(){} +function s_b(a){} +function jSd(a){} +function ol(){wb()} +function oPb(){nPb()} +function EPb(){CPb()} +function gFb(){fFb()} +function TRb(){SRb()} +function ySb(){wSb()} +function PSb(){OSb()} +function dTb(){bTb()} +function i4b(){b4b()} +function D2b(){x2b()} +function J6b(){D6b()} +function u9b(){q9b()} +function $9b(){I9b()} +function Umc(){Imc()} +function abc(){Vac()} +function ZCc(){VCc()} +function kCc(){hCc()} +function rCc(){oCc()} +function Tcc(){Occ()} +function xkc(){gkc()} +function xDc(){rDc()} +function iDc(){cDc()} +function kwc(){jwc()} +function tJc(){jJc()} +function dJc(){aJc()} +function Pyc(){Nyc()} +function VBc(){SBc()} +function CFc(){yFc()} +function CUc(){wUc()} +function lUc(){fUc()} +function sUc(){pUc()} +function IUc(){GUc()} +function IWc(){HWc()} +function _Wc(){ZWc()} +function fHc(){dHc()} +function f0c(){d0c()} +function B0c(){A0c()} +function L0c(){J0c()} +function LTc(){JTc()} +function sTc(){rTc()} +function KLc(){ILc()} +function wNc(){tNc()} +function PYc(){OYc()} +function nZc(){lZc()} +function q3c(){p3c()} +function Z7c(){X7c()} +function Z9c(){Y9c()} +function _ad(){Zad()} +function kdd(){idd()} +function $md(){Smd()} +function HGd(){tGd()} +function hLd(){NKd()} +function J6d(){Uge()} +function Mvb(a){uCb(a)} +function Yb(a){this.a=a} +function cc(a){this.a=a} +function cj(a){this.a=a} +function ij(a){this.a=a} +function Dj(a){this.a=a} +function df(a){this.a=a} +function kf(a){this.a=a} +function ah(a){this.a=a} +function lh(a){this.a=a} +function th(a){this.a=a} +function Ph(a){this.a=a} +function vi(a){this.a=a} +function Ci(a){this.a=a} +function Fk(a){this.a=a} +function Ln(a){this.a=a} +function ap(a){this.a=a} +function zp(a){this.a=a} +function Yp(a){this.a=a} +function qq(a){this.a=a} +function Dq(a){this.a=a} +function wr(a){this.a=a} +function Ir(a){this.b=a} +function sj(a){this.c=a} +function sw(a){this.a=a} +function fw(a){this.a=a} +function xw(a){this.a=a} +function Cw(a){this.a=a} +function Qw(a){this.a=a} +function Rw(a){this.a=a} +function Xw(a){this.a=a} +function Xv(a){this.a=a} +function Sv(a){this.a=a} +function eu(a){this.a=a} +function Zx(a){this.a=a} +function _x(a){this.a=a} +function xy(a){this.a=a} +function xB(a){this.a=a} +function HB(a){this.a=a} +function TB(a){this.a=a} +function fC(a){this.a=a} +function wB(){this.a=[]} +function MBb(a,b){a.a=b} +function w_b(a,b){a.a=b} +function x_b(a,b){a.b=b} +function YOb(a,b){a.b=b} +function $Ob(a,b){a.b=b} +function ZGb(a,b){a.j=b} +function qNb(a,b){a.g=b} +function rNb(a,b){a.i=b} +function dRb(a,b){a.c=b} +function eRb(a,b){a.d=b} +function z_b(a,b){a.d=b} +function y_b(a,b){a.c=b} +function __b(a,b){a.k=b} +function E0b(a,b){a.c=b} +function njc(a,b){a.c=b} +function mjc(a,b){a.a=b} +function dFc(a,b){a.a=b} +function eFc(a,b){a.f=b} +function nOc(a,b){a.a=b} +function oOc(a,b){a.b=b} +function pOc(a,b){a.d=b} +function qOc(a,b){a.i=b} +function rOc(a,b){a.o=b} +function sOc(a,b){a.r=b} +function $Pc(a,b){a.a=b} +function _Pc(a,b){a.b=b} +function DVc(a,b){a.e=b} +function EVc(a,b){a.f=b} +function FVc(a,b){a.g=b} +function SZc(a,b){a.e=b} +function TZc(a,b){a.f=b} +function c$c(a,b){a.f=b} +function bJd(a,b){a.n=b} +function A1d(a,b){a.a=b} +function J1d(a,b){a.a=b} +function B1d(a,b){a.c=b} +function K1d(a,b){a.c=b} +function L1d(a,b){a.d=b} +function M1d(a,b){a.e=b} +function N1d(a,b){a.g=b} +function d2d(a,b){a.a=b} +function e2d(a,b){a.c=b} +function f2d(a,b){a.d=b} +function g2d(a,b){a.e=b} +function h2d(a,b){a.f=b} +function i2d(a,b){a.j=b} +function Z8d(a,b){a.a=b} +function $8d(a,b){a.b=b} +function g9d(a,b){a.a=b} +function Cic(a){a.b=a.a} +function Dg(a){a.c=a.d.d} +function vib(a){this.d=a} +function eib(a){this.a=a} +function Pib(a){this.a=a} +function Vib(a){this.a=a} +function $ib(a){this.a=a} +function mcb(a){this.a=a} +function Mcb(a){this.a=a} +function Xcb(a){this.a=a} +function Ndb(a){this.a=a} +function _db(a){this.a=a} +function teb(a){this.a=a} +function Qeb(a){this.a=a} +function djb(a){this.a=a} +function Gjb(a){this.a=a} +function Njb(a){this.a=a} +function Bjb(a){this.b=a} +function lnb(a){this.b=a} +function Dnb(a){this.b=a} +function anb(a){this.a=a} +function Mob(a){this.a=a} +function Rob(a){this.a=a} +function iob(a){this.c=a} +function olb(a){this.c=a} +function qub(a){this.c=a} +function Tub(a){this.a=a} +function Vub(a){this.a=a} +function Xub(a){this.a=a} +function Zub(a){this.a=a} +function tpb(a){this.a=a} +function _pb(a){this.a=a} +function Wqb(a){this.a=a} +function nsb(a){this.a=a} +function Rxb(a){this.a=a} +function Txb(a){this.a=a} +function Xxb(a){this.a=a} +function bzb(a){this.a=a} +function tzb(a){this.a=a} +function vzb(a){this.a=a} +function xzb(a){this.a=a} +function Kzb(a){this.a=a} +function Ozb(a){this.a=a} +function iAb(a){this.a=a} +function kAb(a){this.a=a} +function mAb(a){this.a=a} +function BAb(a){this.a=a} +function hBb(a){this.a=a} +function jBb(a){this.a=a} +function nBb(a){this.a=a} +function TBb(a){this.a=a} +function XBb(a){this.a=a} +function QCb(a){this.a=a} +function WCb(a){this.a=a} +function _Cb(a){this.a=a} +function dEb(a){this.a=a} +function QGb(a){this.a=a} +function YGb(a){this.a=a} +function tKb(a){this.a=a} +function CLb(a){this.a=a} +function JMb(a){this.a=a} +function RNb(a){this.a=a} +function kQb(a){this.a=a} +function mQb(a){this.a=a} +function FQb(a){this.a=a} +function ETb(a){this.a=a} +function UTb(a){this.a=a} +function dUb(a){this.a=a} +function hUb(a){this.a=a} +function EZb(a){this.a=a} +function j$b(a){this.a=a} +function v$b(a){this.e=a} +function J0b(a){this.a=a} +function M0b(a){this.a=a} +function R0b(a){this.a=a} +function U0b(a){this.a=a} +function i2b(a){this.a=a} +function k2b(a){this.a=a} +function o2b(a){this.a=a} +function s2b(a){this.a=a} +function G2b(a){this.a=a} +function I2b(a){this.a=a} +function K2b(a){this.a=a} +function M2b(a){this.a=a} +function W3b(a){this.a=a} +function $3b(a){this.a=a} +function V4b(a){this.a=a} +function u5b(a){this.a=a} +function A7b(a){this.a=a} +function G7b(a){this.a=a} +function J7b(a){this.a=a} +function M7b(a){this.a=a} +function Mbc(a){this.a=a} +function Pbc(a){this.a=a} +function lac(a){this.a=a} +function nac(a){this.a=a} +function qcc(a){this.a=a} +function Gdc(a){this.a=a} +function $dc(a){this.a=a} +function cec(a){this.a=a} +function _ec(a){this.a=a} +function pfc(a){this.a=a} +function Bfc(a){this.a=a} +function Lfc(a){this.a=a} +function ygc(a){this.a=a} +function Dgc(a){this.a=a} +function shc(a){this.a=a} +function uhc(a){this.a=a} +function whc(a){this.a=a} +function Chc(a){this.a=a} +function Ehc(a){this.a=a} +function Ohc(a){this.a=a} +function Yhc(a){this.a=a} +function Tkc(a){this.a=a} +function Vkc(a){this.a=a} +function Olc(a){this.a=a} +function pnc(a){this.a=a} +function rnc(a){this.a=a} +function dpc(a){this.a=a} +function fpc(a){this.a=a} +function GCc(a){this.a=a} +function KCc(a){this.a=a} +function mDc(a){this.a=a} +function jEc(a){this.a=a} +function HEc(a){this.a=a} +function FEc(a){this.c=a} +function qoc(a){this.b=a} +function bFc(a){this.a=a} +function GFc(a){this.a=a} +function iGc(a){this.a=a} +function kGc(a){this.a=a} +function mGc(a){this.a=a} +function $Gc(a){this.a=a} +function hIc(a){this.a=a} +function lIc(a){this.a=a} +function pIc(a){this.a=a} +function tIc(a){this.a=a} +function xIc(a){this.a=a} +function zIc(a){this.a=a} +function CIc(a){this.a=a} +function LIc(a){this.a=a} +function CKc(a){this.a=a} +function IKc(a){this.a=a} +function MKc(a){this.a=a} +function $Kc(a){this.a=a} +function cLc(a){this.a=a} +function jLc(a){this.a=a} +function rLc(a){this.a=a} +function xLc(a){this.a=a} +function OMc(a){this.a=a} +function ZOc(a){this.a=a} +function ZRc(a){this.a=a} +function aSc(a){this.a=a} +function I$c(a){this.a=a} +function K$c(a){this.a=a} +function M$c(a){this.a=a} +function O$c(a){this.a=a} +function U$c(a){this.a=a} +function n1c(a){this.a=a} +function z1c(a){this.a=a} +function B1c(a){this.a=a} +function Q2c(a){this.a=a} +function U2c(a){this.a=a} +function z3c(a){this.a=a} +function med(a){this.a=a} +function Xed(a){this.a=a} +function _ed(a){this.a=a} +function Qfd(a){this.a=a} +function Bgd(a){this.a=a} +function $gd(a){this.a=a} +function lrd(a){this.a=a} +function urd(a){this.a=a} +function vrd(a){this.a=a} +function wrd(a){this.a=a} +function xrd(a){this.a=a} +function yrd(a){this.a=a} +function zrd(a){this.a=a} +function Ard(a){this.a=a} +function Brd(a){this.a=a} +function Crd(a){this.a=a} +function Ird(a){this.a=a} +function Krd(a){this.a=a} +function Lrd(a){this.a=a} +function Mrd(a){this.a=a} +function Nrd(a){this.a=a} +function Prd(a){this.a=a} +function Srd(a){this.a=a} +function Yrd(a){this.a=a} +function Zrd(a){this.a=a} +function _rd(a){this.a=a} +function asd(a){this.a=a} +function bsd(a){this.a=a} +function csd(a){this.a=a} +function dsd(a){this.a=a} +function msd(a){this.a=a} +function osd(a){this.a=a} +function qsd(a){this.a=a} +function ssd(a){this.a=a} +function Wsd(a){this.a=a} +function Lsd(a){this.b=a} +function thd(a){this.f=a} +function qtd(a){this.a=a} +function yBd(a){this.a=a} +function GBd(a){this.a=a} +function MBd(a){this.a=a} +function SBd(a){this.a=a} +function iCd(a){this.a=a} +function YMd(a){this.a=a} +function GNd(a){this.a=a} +function EPd(a){this.a=a} +function EQd(a){this.a=a} +function NTd(a){this.a=a} +function qOd(a){this.b=a} +function lVd(a){this.c=a} +function VVd(a){this.e=a} +function iYd(a){this.a=a} +function RYd(a){this.a=a} +function ZYd(a){this.a=a} +function z0d(a){this.a=a} +function O0d(a){this.a=a} +function s0d(a){this.d=a} +function W5d(a){this.a=a} +function cge(a){this.a=a} +function xfe(a){this.e=a} +function Tfd(){this.a=0} +function jkb(){Vjb(this)} +function Rkb(){Ckb(this)} +function Lqb(){Uhb(this)} +function lEb(){kEb(this)} +function A_b(){s_b(this)} +function UQd(){this.c=FQd} +function v6d(a,b){b.Wb(a)} +function moc(a,b){a.b+=b} +function yXb(a){a.b=new Ji} +function vbb(a){return a.e} +function DB(a){return a.a} +function LB(a){return a.a} +function ZB(a){return a.a} +function lC(a){return a.a} +function EC(a){return a.a} +function wC(){return null} +function SB(){return null} +function hcb(){mvd();ovd()} +function zJb(a){a.b.tf(a.e)} +function j5b(a,b){a.b=b-a.b} +function g5b(a,b){a.a=b-a.a} +function PXc(a,b){b.ad(a.a)} +function plc(a,b){G0b(b,a)} +function hp(a,b,c){a.Od(c,b)} +function As(a,b){a.e=b;b.b=a} +function Zl(a){Ql();this.a=a} +function jq(a){Ql();this.a=a} +function sq(a){Ql();this.a=a} +function Fq(a){im();this.a=a} +function Sz(a){Rz();Qz.be(a)} +function gz(){Xy.call(this)} +function xcb(){Xy.call(this)} +function pcb(){gz.call(this)} +function tcb(){gz.call(this)} +function Bdb(){gz.call(this)} +function Vdb(){gz.call(this)} +function Ydb(){gz.call(this)} +function Geb(){gz.call(this)} +function bgb(){gz.call(this)} +function Apb(){gz.call(this)} +function Jpb(){gz.call(this)} +function utb(){gz.call(this)} +function x2c(){gz.call(this)} +function rQd(){this.a=this} +function MPd(){this.Bb|=256} +function tTb(){this.b=new mt} +function fA(){fA=ccb;new Lqb} +function rcb(){pcb.call(this)} +function dCb(a,b){a.length=b} +function Tvb(a,b){Ekb(a.a,b)} +function sKb(a,b){UHb(a.c,b)} +function SMc(a,b){Qqb(a.b,b)} +function vBd(a,b){uAd(a.a,b)} +function wBd(a,b){vAd(a.a,b)} +function GLd(a,b){Uhd(a.e,b)} +function d7d(a){D2d(a.c,a.b)} +function mj(a,b){a.kc().Nb(b)} +function Odb(a){this.a=Tdb(a)} +function Tqb(){this.a=new Lqb} +function gyb(){this.a=new Lqb} +function Wvb(){this.a=new Rkb} +function KFb(){this.a=new Rkb} +function PFb(){this.a=new Rkb} +function FFb(){this.a=new yFb} +function pGb(){this.a=new MFb} +function ZQb(){this.a=new MQb} +function Gxb(){this.a=new Pwb} +function jUb(){this.a=new PTb} +function sDb(){this.a=new oDb} +function zDb(){this.a=new tDb} +function CWb(){this.a=new Rkb} +function HXb(){this.a=new Rkb} +function nYb(){this.a=new Rkb} +function BYb(){this.a=new Rkb} +function fLb(){this.d=new Rkb} +function vYb(){this.a=new Tqb} +function a2b(){this.a=new Lqb} +function wZb(){this.b=new Lqb} +function TCc(){this.b=new Rkb} +function zJc(){this.e=new Rkb} +function uMc(){this.d=new Rkb} +function wdc(){this.a=new xkc} +function vKc(){Rkb.call(this)} +function twb(){Wvb.call(this)} +function oHb(){$Gb.call(this)} +function LXb(){HXb.call(this)} +function L_b(){H_b.call(this)} +function H_b(){A_b.call(this)} +function p0b(){A_b.call(this)} +function s0b(){p0b.call(this)} +function WMc(){VMc.call(this)} +function bNc(){VMc.call(this)} +function EPc(){CPc.call(this)} +function JPc(){CPc.call(this)} +function OPc(){CPc.call(this)} +function w1c(){s1c.call(this)} +function s7c(){Psb.call(this)} +function apd(){Ald.call(this)} +function ppd(){Ald.call(this)} +function lDd(){YCd.call(this)} +function NDd(){YCd.call(this)} +function mFd(){Lqb.call(this)} +function vFd(){Lqb.call(this)} +function GFd(){Lqb.call(this)} +function KPd(){Tqb.call(this)} +function OJd(){hJd.call(this)} +function aQd(){MPd.call(this)} +function SSd(){FId.call(this)} +function rUd(){FId.call(this)} +function oUd(){Lqb.call(this)} +function NYd(){Lqb.call(this)} +function cZd(){Lqb.call(this)} +function R8d(){MGd.call(this)} +function o9d(){MGd.call(this)} +function i9d(){R8d.call(this)} +function hee(){ude.call(this)} +function Dd(a){yd.call(this,a)} +function Hd(a){yd.call(this,a)} +function ph(a){lh.call(this,a)} +function Sh(a){Wc.call(this,a)} +function oi(a){Sh.call(this,a)} +function Ii(a){Wc.call(this,a)} +function Zdd(){this.a=new Psb} +function CPc(){this.a=new Tqb} +function s1c(){this.a=new Lqb} +function QSc(){this.a=new Rkb} +function D2c(){this.j=new Rkb} +function QXc(){this.a=new UXc} +function e_c(){this.a=new d_c} +function YCd(){this.a=new aDd} +function _k(){_k=ccb;$k=new al} +function Lk(){Lk=ccb;Kk=new Mk} +function wb(){wb=ccb;vb=new xb} +function hs(){hs=ccb;gs=new is} +function rs(a){Sh.call(this,a)} +function Gp(a){Sh.call(this,a)} +function xp(a){Lo.call(this,a)} +function Ep(a){Lo.call(this,a)} +function Tp(a){Wn.call(this,a)} +function wx(a){un.call(this,a)} +function ov(a){dv.call(this,a)} +function Mv(a){Br.call(this,a)} +function Ov(a){Br.call(this,a)} +function Lw(a){Br.call(this,a)} +function hz(a){Yy.call(this,a)} +function MB(a){hz.call(this,a)} +function eC(){fC.call(this,{})} +function Ftb(a){Atb();this.a=a} +function zwb(a){a.b=null;a.c=0} +function Vy(a,b){a.e=b;Sy(a,b)} +function LVb(a,b){a.a=b;NVb(a)} +function lIb(a,b,c){a.a[b.g]=c} +function vfd(a,b,c){Dfd(c,a,b)} +function Odc(a,b){rjc(b.i,a.n)} +function Wyc(a,b){Xyc(a).td(b)} +function ERb(a,b){return a*a/b} +function Xr(a,b){return a.g-b.g} +function tC(a){return new TB(a)} +function vC(a){return new yC(a)} +function ocb(a){hz.call(this,a)} +function qcb(a){hz.call(this,a)} +function ucb(a){hz.call(this,a)} +function vcb(a){Yy.call(this,a)} +function fGc(a){LFc();this.a=a} +function c0d(a){kzd();this.a=a} +function bhd(a){Rgd();this.f=a} +function dhd(a){Rgd();this.f=a} +function Cdb(a){hz.call(this,a)} +function Wdb(a){hz.call(this,a)} +function Zdb(a){hz.call(this,a)} +function Feb(a){hz.call(this,a)} +function Heb(a){hz.call(this,a)} +function Ccb(a){return uCb(a),a} +function Edb(a){return uCb(a),a} +function Gdb(a){return uCb(a),a} +function jfb(a){return uCb(a),a} +function tfb(a){return uCb(a),a} +function akb(a){return a.b==a.c} +function Hwb(a){return !!a&&a.b} +function pIb(a){return !!a&&a.k} +function qIb(a){return !!a&&a.j} +function amb(a){uCb(a);this.a=a} +function wVb(a){qVb(a);return a} +function Blb(a){Glb(a,a.length)} +function cgb(a){hz.call(this,a)} +function cqd(a){hz.call(this,a)} +function n8d(a){hz.call(this,a)} +function y2c(a){hz.call(this,a)} +function z2c(a){hz.call(this,a)} +function mde(a){hz.call(this,a)} +function pc(a){qc.call(this,a,0)} +function Ji(){Ki.call(this,12,3)} +function Kz(){Kz=ccb;Jz=new Nz} +function jz(){jz=ccb;iz=new nb} +function KA(){KA=ccb;JA=new MA} +function OB(){OB=ccb;NB=new PB} +function jc(){throw vbb(new bgb)} +function zh(){throw vbb(new bgb)} +function Pi(){throw vbb(new bgb)} +function Pj(){throw vbb(new bgb)} +function Qj(){throw vbb(new bgb)} +function Ym(){throw vbb(new bgb)} +function Gb(){this.a=GD(Qb(She))} +function oy(a){Ql();this.a=Qb(a)} +function Bs(a,b){a.Td(b);b.Sd(a)} +function iw(a,b){a.a.ec().Mc(b)} +function CYb(a,b,c){a.c.lf(b,c)} +function scb(a){qcb.call(this,a)} +function Oeb(a){Wdb.call(this,a)} +function Hfb(){mcb.call(this,'')} +function Ifb(){mcb.call(this,'')} +function Ufb(){mcb.call(this,'')} +function Vfb(){mcb.call(this,'')} +function Xfb(a){qcb.call(this,a)} +function zob(a){lnb.call(this,a)} +function Yob(a){Inb.call(this,a)} +function Gob(a){zob.call(this,a)} +function Mk(){Fk.call(this,null)} +function al(){Fk.call(this,null)} +function Az(){Az=ccb;!!(Rz(),Qz)} +function wrb(){wrb=ccb;vrb=yrb()} +function Mtb(a){return a.a?a.b:0} +function Vtb(a){return a.a?a.b:0} +function Lcb(a,b){return a.a-b.a} +function Wcb(a,b){return a.a-b.a} +function Peb(a,b){return a.a-b.a} +function eCb(a,b){return PC(a,b)} +function GC(a,b){return rdb(a,b)} +function _B(b,a){return a in b.a} +function _Db(a,b){a.f=b;return a} +function ZDb(a,b){a.b=b;return a} +function $Db(a,b){a.c=b;return a} +function aEb(a,b){a.g=b;return a} +function HGb(a,b){a.a=b;return a} +function IGb(a,b){a.f=b;return a} +function JGb(a,b){a.k=b;return a} +function dLb(a,b){a.a=b;return a} +function eLb(a,b){a.e=b;return a} +function zVb(a,b){a.e=b;return a} +function AVb(a,b){a.f=b;return a} +function KOb(a,b){a.b=true;a.d=b} +function DHb(a,b){a.b=new g7c(b)} +function uvb(a,b,c){b.td(a.a[c])} +function zvb(a,b,c){b.we(a.a[c])} +function wJc(a,b){return a.b-b.b} +function kOc(a,b){return a.g-b.g} +function WQc(a,b){return a.s-b.s} +function Lic(a,b){return a?0:b-1} +function SFc(a,b){return a?0:b-1} +function RFc(a,b){return a?b-1:0} +function M2c(a,b){return b.Yf(a)} +function M3c(a,b){a.b=b;return a} +function L3c(a,b){a.a=b;return a} +function N3c(a,b){a.c=b;return a} +function O3c(a,b){a.d=b;return a} +function P3c(a,b){a.e=b;return a} +function Q3c(a,b){a.f=b;return a} +function b4c(a,b){a.a=b;return a} +function c4c(a,b){a.b=b;return a} +function d4c(a,b){a.c=b;return a} +function z5c(a,b){a.c=b;return a} +function y5c(a,b){a.b=b;return a} +function A5c(a,b){a.d=b;return a} +function B5c(a,b){a.e=b;return a} +function C5c(a,b){a.f=b;return a} +function D5c(a,b){a.g=b;return a} +function E5c(a,b){a.a=b;return a} +function F5c(a,b){a.i=b;return a} +function G5c(a,b){a.j=b;return a} +function Vdd(a,b){a.k=b;return a} +function Wdd(a,b){a.j=b;return a} +function ykc(a,b){gkc();F0b(b,a)} +function T$c(a,b,c){R$c(a.a,b,c)} +function RGc(a){cEc.call(this,a)} +function iHc(a){cEc.call(this,a)} +function t7c(a){Qsb.call(this,a)} +function aPb(a){_Ob.call(this,a)} +function Ixd(a){zud.call(this,a)} +function dCd(a){ZBd.call(this,a)} +function fCd(a){ZBd.call(this,a)} +function p_b(){q_b.call(this,'')} +function d7c(){this.a=0;this.b=0} +function aPc(){this.b=0;this.a=0} +function NJd(a,b){a.b=0;DId(a,b)} +function X1d(a,b){a.c=b;a.b=true} +function Oc(a,b){return a.c._b(b)} +function gdb(a){return a.e&&a.e()} +function Vd(a){return !a?null:a.d} +function sn(a,b){return Gv(a.b,b)} +function Fv(a){return !a?null:a.g} +function Kv(a){return !a?null:a.i} +function hdb(a){fdb(a);return a.o} +function Fhd(){Fhd=ccb;Ehd=ond()} +function Hhd(){Hhd=ccb;Ghd=Cod()} +function LFd(){LFd=ccb;KFd=qZd()} +function p8d(){p8d=ccb;o8d=Y9d()} +function r8d(){r8d=ccb;q8d=dae()} +function mvd(){mvd=ccb;lvd=n4c()} +function Srb(){throw vbb(new bgb)} +function enb(){throw vbb(new bgb)} +function fnb(){throw vbb(new bgb)} +function gnb(){throw vbb(new bgb)} +function jnb(){throw vbb(new bgb)} +function Cnb(){throw vbb(new bgb)} +function Uqb(a){this.a=new Mqb(a)} +function tgb(a){lgb();ngb(this,a)} +function Hxb(a){this.a=new Qwb(a)} +function _ub(a,b){while(a.ye(b));} +function Sub(a,b){while(a.sd(b));} +function Bfb(a,b){a.a+=b;return a} +function Cfb(a,b){a.a+=b;return a} +function Ffb(a,b){a.a+=b;return a} +function Lfb(a,b){a.a+=b;return a} +function WAb(a){Tzb(a);return a.a} +function Wsb(a){return a.b!=a.d.c} +function pD(a){return a.l|a.m<<22} +function aIc(a,b){return a.d[b.p]} +function h2c(a,b){return c2c(a,b)} +function cCb(a,b,c){a.splice(b,c)} +function WHb(a){a.c?VHb(a):XHb(a)} +function jVc(a){this.a=0;this.b=a} +function ZUc(){this.a=new L2c(K$)} +function tRc(){this.b=new L2c(h$)} +function Q$c(){this.b=new L2c(J_)} +function d_c(){this.b=new L2c(J_)} +function OCd(){throw vbb(new bgb)} +function PCd(){throw vbb(new bgb)} +function QCd(){throw vbb(new bgb)} +function RCd(){throw vbb(new bgb)} +function SCd(){throw vbb(new bgb)} +function TCd(){throw vbb(new bgb)} +function UCd(){throw vbb(new bgb)} +function VCd(){throw vbb(new bgb)} +function WCd(){throw vbb(new bgb)} +function XCd(){throw vbb(new bgb)} +function ahe(){throw vbb(new utb)} +function bhe(){throw vbb(new utb)} +function Rge(a){this.a=new ege(a)} +function ege(a){dge(this,a,Vee())} +function Fhe(a){return !a||Ehe(a)} +function dde(a){return $ce[a]!=-1} +function Iz(){xz!=0&&(xz=0);zz=-1} +function Ybb(){Wbb==null&&(Wbb=[])} +function ONd(a,b){Rxd(ZKd(a.a),b)} +function TNd(a,b){Rxd(ZKd(a.a),b)} +function Yf(a,b){zf.call(this,a,b)} +function $f(a,b){Yf.call(this,a,b)} +function Hf(a,b){this.b=a;this.c=b} +function rk(a,b){this.b=a;this.a=b} +function ek(a,b){this.a=a;this.b=b} +function gk(a,b){this.a=a;this.b=b} +function pk(a,b){this.a=a;this.b=b} +function yk(a,b){this.a=a;this.b=b} +function Ak(a,b){this.a=a;this.b=b} +function Fj(a,b){this.a=a;this.b=b} +function _j(a,b){this.a=a;this.b=b} +function dr(a,b){this.a=a;this.b=b} +function zr(a,b){this.b=a;this.a=b} +function So(a,b){this.b=a;this.a=b} +function qp(a,b){this.b=a;this.a=b} +function $q(a,b){this.b=a;this.a=b} +function $r(a,b){this.f=a;this.g=b} +function ne(a,b){this.e=a;this.d=b} +function Wo(a,b){this.g=a;this.i=b} +function bu(a,b){this.a=a;this.b=b} +function qu(a,b){this.a=a;this.f=b} +function qv(a,b){this.b=a;this.c=b} +function ox(a,b){this.a=a;this.b=b} +function Px(a,b){this.a=a;this.b=b} +function mC(a,b){this.a=a;this.b=b} +function Wc(a){Lb(a.dc());this.c=a} +function rf(a){this.b=BD(Qb(a),83)} +function Zv(a){this.a=BD(Qb(a),83)} +function dv(a){this.a=BD(Qb(a),15)} +function $u(a){this.a=BD(Qb(a),15)} +function Br(a){this.b=BD(Qb(a),47)} +function eB(){this.q=new $wnd.Date} +function Zfb(){Zfb=ccb;Yfb=new jcb} +function Emb(){Emb=ccb;Dmb=new Fmb} +function Vhb(a){return a.f.c+a.g.c} +function hnb(a,b){return a.b.Hc(b)} +function inb(a,b){return a.b.Ic(b)} +function knb(a,b){return a.b.Qc(b)} +function Dob(a,b){return a.b.Hc(b)} +function dob(a,b){return a.c.uc(b)} +function Rqb(a,b){return a.a._b(b)} +function fob(a,b){return pb(a.c,b)} +function jt(a,b){return Mhb(a.b,b)} +function Lp(a,b){return a>b&&b0} +function Gbb(a,b){return ybb(a,b)<0} +function Crb(a,b){return a.a.get(b)} +function icb(b,a){return a.split(b)} +function Vrb(a,b){return Mhb(a.e,b)} +function Nvb(a){return uCb(a),false} +function Rub(a){Kub.call(this,a,21)} +function wcb(a,b){Zy.call(this,a,b)} +function mxb(a,b){$r.call(this,a,b)} +function Gyb(a,b){$r.call(this,a,b)} +function zx(a){yx();Wn.call(this,a)} +function zlb(a,b){Dlb(a,a.length,b)} +function Alb(a,b){Flb(a,a.length,b)} +function ABb(a,b,c){b.ud(a.a.Ge(c))} +function uBb(a,b,c){b.we(a.a.Fe(c))} +function GBb(a,b,c){b.td(a.a.Kb(c))} +function Zq(a,b,c){a.Mb(c)&&b.td(c)} +function aCb(a,b,c){a.splice(b,0,c)} +function lDb(a,b){return uqb(a.e,b)} +function pjb(a,b){this.d=a;this.e=b} +function kqb(a,b){this.b=a;this.a=b} +function VBb(a,b){this.b=a;this.a=b} +function BEb(a,b){this.b=a;this.a=b} +function sBb(a,b){this.a=a;this.b=b} +function yBb(a,b){this.a=a;this.b=b} +function EBb(a,b){this.a=a;this.b=b} +function KBb(a,b){this.a=a;this.b=b} +function aDb(a,b){this.a=a;this.b=b} +function tMb(a,b){this.b=a;this.a=b} +function oOb(a,b){this.b=a;this.a=b} +function SOb(a,b){$r.call(this,a,b)} +function SMb(a,b){$r.call(this,a,b)} +function NEb(a,b){$r.call(this,a,b)} +function VEb(a,b){$r.call(this,a,b)} +function sFb(a,b){$r.call(this,a,b)} +function hHb(a,b){$r.call(this,a,b)} +function OHb(a,b){$r.call(this,a,b)} +function FIb(a,b){$r.call(this,a,b)} +function wLb(a,b){$r.call(this,a,b)} +function YRb(a,b){$r.call(this,a,b)} +function zTb(a,b){$r.call(this,a,b)} +function rUb(a,b){$r.call(this,a,b)} +function oWb(a,b){$r.call(this,a,b)} +function SXb(a,b){$r.call(this,a,b)} +function k0b(a,b){$r.call(this,a,b)} +function z5b(a,b){$r.call(this,a,b)} +function T8b(a,b){$r.call(this,a,b)} +function ibc(a,b){$r.call(this,a,b)} +function Cec(a,b){this.a=a;this.b=b} +function rfc(a,b){this.a=a;this.b=b} +function Rfc(a,b){this.a=a;this.b=b} +function Tfc(a,b){this.a=a;this.b=b} +function bgc(a,b){this.a=a;this.b=b} +function ngc(a,b){this.a=a;this.b=b} +function Qhc(a,b){this.a=a;this.b=b} +function $hc(a,b){this.a=a;this.b=b} +function Z0b(a,b){this.a=a;this.b=b} +function ZVb(a,b){this.b=a;this.a=b} +function Dfc(a,b){this.b=a;this.a=b} +function dgc(a,b){this.b=a;this.a=b} +function Bmc(a,b){this.b=a;this.a=b} +function cWb(a,b){this.c=a;this.d=b} +function I$b(a,b){this.e=a;this.d=b} +function Unc(a,b){this.a=a;this.b=b} +function Oic(a,b){this.b=b;this.c=a} +function Bjc(a,b){$r.call(this,a,b)} +function Yjc(a,b){$r.call(this,a,b)} +function Gkc(a,b){$r.call(this,a,b)} +function Bpc(a,b){$r.call(this,a,b)} +function Jpc(a,b){$r.call(this,a,b)} +function Tpc(a,b){$r.call(this,a,b)} +function cqc(a,b){$r.call(this,a,b)} +function oqc(a,b){$r.call(this,a,b)} +function yqc(a,b){$r.call(this,a,b)} +function Hqc(a,b){$r.call(this,a,b)} +function Uqc(a,b){$r.call(this,a,b)} +function arc(a,b){$r.call(this,a,b)} +function mrc(a,b){$r.call(this,a,b)} +function zrc(a,b){$r.call(this,a,b)} +function Prc(a,b){$r.call(this,a,b)} +function Yrc(a,b){$r.call(this,a,b)} +function fsc(a,b){$r.call(this,a,b)} +function nsc(a,b){$r.call(this,a,b)} +function nzc(a,b){$r.call(this,a,b)} +function zzc(a,b){$r.call(this,a,b)} +function Kzc(a,b){$r.call(this,a,b)} +function Xzc(a,b){$r.call(this,a,b)} +function Dtc(a,b){$r.call(this,a,b)} +function lAc(a,b){$r.call(this,a,b)} +function uAc(a,b){$r.call(this,a,b)} +function CAc(a,b){$r.call(this,a,b)} +function LAc(a,b){$r.call(this,a,b)} +function UAc(a,b){$r.call(this,a,b)} +function aBc(a,b){$r.call(this,a,b)} +function uBc(a,b){$r.call(this,a,b)} +function DBc(a,b){$r.call(this,a,b)} +function MBc(a,b){$r.call(this,a,b)} +function sGc(a,b){$r.call(this,a,b)} +function VIc(a,b){$r.call(this,a,b)} +function EIc(a,b){this.b=a;this.a=b} +function qKc(a,b){this.a=a;this.b=b} +function GKc(a,b){this.a=a;this.b=b} +function lLc(a,b){this.a=a;this.b=b} +function mMc(a,b){this.a=a;this.b=b} +function fMc(a,b){$r.call(this,a,b)} +function ZLc(a,b){$r.call(this,a,b)} +function ZMc(a,b){this.b=a;this.d=b} +function IOc(a,b){$r.call(this,a,b)} +function GQc(a,b){$r.call(this,a,b)} +function PQc(a,b){this.a=a;this.b=b} +function RQc(a,b){this.a=a;this.b=b} +function ARc(a,b){$r.call(this,a,b)} +function rSc(a,b){$r.call(this,a,b)} +function TTc(a,b){$r.call(this,a,b)} +function _Tc(a,b){$r.call(this,a,b)} +function RUc(a,b){$r.call(this,a,b)} +function uVc(a,b){$r.call(this,a,b)} +function hWc(a,b){$r.call(this,a,b)} +function rWc(a,b){$r.call(this,a,b)} +function kXc(a,b){$r.call(this,a,b)} +function uXc(a,b){$r.call(this,a,b)} +function AYc(a,b){$r.call(this,a,b)} +function l$c(a,b){$r.call(this,a,b)} +function Z$c(a,b){$r.call(this,a,b)} +function D_c(a,b){$r.call(this,a,b)} +function O_c(a,b){$r.call(this,a,b)} +function c1c(a,b){$r.call(this,a,b)} +function cVb(a,b){return uqb(a.c,b)} +function nnc(a,b){return uqb(b.b,a)} +function x1c(a,b){return -a.b.Je(b)} +function D3c(a,b){return uqb(a.g,b)} +function O5c(a,b){$r.call(this,a,b)} +function a6c(a,b){$r.call(this,a,b)} +function m2c(a,b){this.a=a;this.b=b} +function W2c(a,b){this.a=a;this.b=b} +function f7c(a,b){this.a=a;this.b=b} +function G7c(a,b){$r.call(this,a,b)} +function j8c(a,b){$r.call(this,a,b)} +function iad(a,b){$r.call(this,a,b)} +function rad(a,b){$r.call(this,a,b)} +function Bad(a,b){$r.call(this,a,b)} +function Nad(a,b){$r.call(this,a,b)} +function ibd(a,b){$r.call(this,a,b)} +function tbd(a,b){$r.call(this,a,b)} +function Ibd(a,b){$r.call(this,a,b)} +function Ubd(a,b){$r.call(this,a,b)} +function gcd(a,b){$r.call(this,a,b)} +function scd(a,b){$r.call(this,a,b)} +function Ycd(a,b){$r.call(this,a,b)} +function udd(a,b){$r.call(this,a,b)} +function Jdd(a,b){$r.call(this,a,b)} +function Eed(a,b){$r.call(this,a,b)} +function bfd(a,b){this.a=a;this.b=b} +function dfd(a,b){this.a=a;this.b=b} +function ffd(a,b){this.a=a;this.b=b} +function Kfd(a,b){this.a=a;this.b=b} +function Mfd(a,b){this.a=a;this.b=b} +function Ofd(a,b){this.a=a;this.b=b} +function vgd(a,b){this.a=a;this.b=b} +function qgd(a,b){$r.call(this,a,b)} +function jrd(a,b){this.a=a;this.b=b} +function krd(a,b){this.a=a;this.b=b} +function mrd(a,b){this.a=a;this.b=b} +function nrd(a,b){this.a=a;this.b=b} +function qrd(a,b){this.a=a;this.b=b} +function rrd(a,b){this.a=a;this.b=b} +function srd(a,b){this.b=a;this.a=b} +function trd(a,b){this.b=a;this.a=b} +function Drd(a,b){this.b=a;this.a=b} +function Frd(a,b){this.b=a;this.a=b} +function Hrd(a,b){this.a=a;this.b=b} +function Jrd(a,b){this.a=a;this.b=b} +function Ord(a,b){Xqd(a.a,BD(b,56))} +function BIc(a,b){gIc(a.a,BD(b,11))} +function fIc(a,b){FHc();return b!=a} +function Arb(){wrb();return new vrb} +function CMc(){wMc();this.b=new Tqb} +function NNc(){FNc();this.a=new Tqb} +function eCc(){ZBc();aCc.call(this)} +function Dsd(a,b){$r.call(this,a,b)} +function Urd(a,b){this.a=a;this.b=b} +function Wrd(a,b){this.a=a;this.b=b} +function kGd(a,b){this.a=a;this.b=b} +function nGd(a,b){this.a=a;this.b=b} +function bUd(a,b){this.a=a;this.b=b} +function zVd(a,b){this.a=a;this.b=b} +function C1d(a,b){this.d=a;this.b=b} +function MLd(a,b){this.d=a;this.e=b} +function Wud(a,b){this.f=a;this.c=b} +function f7d(a,b){this.b=a;this.c=b} +function _zd(a,b){this.i=a;this.g=b} +function Y1d(a,b){this.e=a;this.a=b} +function c8d(a,b){this.a=a;this.b=b} +function $Id(a,b){a.i=null;_Id(a,b)} +function ivd(a,b){!!a&&Rhb(cvd,a,b)} +function hCd(a,b){return qAd(a.a,b)} +function e7d(a){return R2d(a.c,a.b)} +function Wd(a){return !a?null:a.dd()} +function PD(a){return a==null?null:a} +function KD(a){return typeof a===Khe} +function LD(a){return typeof a===Lhe} +function ND(a){return typeof a===Mhe} +function Em(a,b){return a.Hd().Xb(b)} +function Kq(a,b){return hr(a.Kc(),b)} +function Bbb(a,b){return ybb(a,b)==0} +function Ebb(a,b){return ybb(a,b)>=0} +function Kbb(a,b){return ybb(a,b)!=0} +function Jdb(a){return ''+(uCb(a),a)} +function pfb(a,b){return a.substr(b)} +function cg(a){ag(a);return a.d.gc()} +function oVb(a){pVb(a,a.c);return a} +function RD(a){CCb(a==null);return a} +function Dfb(a,b){a.a+=''+b;return a} +function Efb(a,b){a.a+=''+b;return a} +function Nfb(a,b){a.a+=''+b;return a} +function Pfb(a,b){a.a+=''+b;return a} +function Qfb(a,b){a.a+=''+b;return a} +function Mfb(a,b){return a.a+=''+b,a} +function Esb(a,b){Gsb(a,b,a.a,a.a.a)} +function Fsb(a,b){Gsb(a,b,a.c.b,a.c)} +function Mqd(a,b,c){Rpd(b,kqd(a,c))} +function Nqd(a,b,c){Rpd(b,kqd(a,c))} +function Dhe(a,b){Hhe(new Fyd(a),b)} +function cB(a,b){a.q.setTime(Sbb(b))} +function fvb(a,b){bvb.call(this,a,b)} +function jvb(a,b){bvb.call(this,a,b)} +function nvb(a,b){bvb.call(this,a,b)} +function Nqb(a){Uhb(this);Ld(this,a)} +function wmb(a){tCb(a,0);return null} +function X6c(a){a.a=0;a.b=0;return a} +function f3c(a,b){a.a=b.g+1;return a} +function PJc(a,b){return a.j[b.p]==2} +function _Pb(a){return VPb(BD(a,79))} +function yJb(){yJb=ccb;xJb=as(wJb())} +function Y8b(){Y8b=ccb;X8b=as(W8b())} +function mt(){this.b=new Mqb(Cv(12))} +function Otb(){this.b=0;this.a=false} +function Wtb(){this.b=0;this.a=false} +function sl(a){this.a=a;ol.call(this)} +function vl(a){this.a=a;ol.call(this)} +function Nsd(a,b){Msd.call(this,a,b)} +function $zd(a,b){Cyd.call(this,a,b)} +function nNd(a,b){_zd.call(this,a,b)} +function s4d(a,b){p4d.call(this,a,b)} +function w4d(a,b){qRd.call(this,a,b)} +function rEd(a,b){pEd();Rhb(oEd,a,b)} +function lcb(a,b){return qfb(a.a,0,b)} +function ww(a,b){return a.a.a.a.cc(b)} +function mb(a,b){return PD(a)===PD(b)} +function Mdb(a,b){return Kdb(a.a,b.a)} +function $db(a,b){return beb(a.a,b.a)} +function seb(a,b){return ueb(a.a,b.a)} +function hfb(a,b){return a.indexOf(b)} +function Ny(a,b){return a==b?0:a?1:-1} +function kB(a){return a<10?'0'+a:''+a} +function Mq(a){return Qb(a),new sl(a)} +function SC(a){return TC(a.l,a.m,a.h)} +function Hdb(a){return QD((uCb(a),a))} +function Idb(a){return QD((uCb(a),a))} +function NIb(a,b){return beb(a.g,b.g)} +function Fbb(a){return typeof a===Lhe} +function mWb(a){return a==hWb||a==kWb} +function nWb(a){return a==hWb||a==iWb} +function G1b(a){return Jkb(a.b.b,a,0)} +function lrb(a){this.a=Arb();this.b=a} +function Frb(a){this.a=Arb();this.b=a} +function swb(a,b){Ekb(a.a,b);return b} +function Z1c(a,b){Ekb(a.c,b);return a} +function E2c(a,b){d3c(a.a,b);return a} +function _gc(a,b){Hgc();return b.a+=a} +function bhc(a,b){Hgc();return b.a+=a} +function ahc(a,b){Hgc();return b.c+=a} +function Nlb(a,b){Klb(a,0,a.length,b)} +function zsb(){Wqb.call(this,new $rb)} +function I_b(){B_b.call(this,0,0,0,0)} +function I6c(){J6c.call(this,0,0,0,0)} +function g7c(a){this.a=a.a;this.b=a.b} +function fad(a){return a==aad||a==bad} +function gad(a){return a==dad||a==_9c} +function Jzc(a){return a==Fzc||a==Ezc} +function fcd(a){return a!=bcd&&a!=ccd} +function oid(a){return a.Lg()&&a.Mg()} +function Gfd(a){return Kkd(BD(a,118))} +function k3c(a){return d3c(new j3c,a)} +function y2d(a,b){return new p4d(b,a)} +function z2d(a,b){return new p4d(b,a)} +function ukd(a,b,c){vkd(a,b);wkd(a,c)} +function _kd(a,b,c){cld(a,b);ald(a,c)} +function bld(a,b,c){dld(a,b);eld(a,c)} +function gmd(a,b,c){hmd(a,b);imd(a,c)} +function nmd(a,b,c){omd(a,b);pmd(a,c)} +function iKd(a,b){$Jd(a,b);_Jd(a,a.D)} +function _ud(a){Wud.call(this,a,true)} +function Xg(a,b,c){Vg.call(this,a,b,c)} +function Ygb(a){Hgb();Zgb.call(this,a)} +function rxb(){mxb.call(this,'Head',1)} +function wxb(){mxb.call(this,'Tail',3)} +function Ckb(a){a.c=KC(SI,Uhe,1,0,5,1)} +function Vjb(a){a.a=KC(SI,Uhe,1,8,5,1)} +function MGb(a){Hkb(a.xf(),new QGb(a))} +function xtb(a){return a!=null?tb(a):0} +function b2b(a,b){return ntd(b,mpd(a))} +function c2b(a,b){return ntd(b,mpd(a))} +function dAb(a,b){return a[a.length]=b} +function gAb(a,b){return a[a.length]=b} +function Vq(a){return lr(a.b.Kc(),a.a)} +function dqd(a,b){return _o(qo(a.d),b)} +function eqd(a,b){return _o(qo(a.g),b)} +function fqd(a,b){return _o(qo(a.j),b)} +function Osd(a,b){Msd.call(this,a.b,b)} +function q0b(a){B_b.call(this,a,a,a,a)} +function HOb(a){a.b&&LOb(a);return a.a} +function IOb(a){a.b&&LOb(a);return a.c} +function uyb(a,b){if(lyb){return}a.b=b} +function lzd(a,b,c){NC(a,b,c);return c} +function mBc(a,b,c){NC(a.c[b.g],b.g,c)} +function _Hd(a,b,c){BD(a.c,69).Xh(b,c)} +function wfd(a,b,c){bld(c,c.i+a,c.j+b)} +function UOd(a,b){wtd(VKd(a.a),XOd(b))} +function bTd(a,b){wtd(QSd(a.a),eTd(b))} +function Lge(a){wfe();xfe.call(this,a)} +function CAd(a){return a==null?0:tb(a)} +function fNc(){fNc=ccb;eNc=new Rpb(v1)} +function h0d(){h0d=ccb;new i0d;new Rkb} +function i0d(){new Lqb;new Lqb;new Lqb} +function GA(){GA=ccb;fA();FA=new Lqb} +function Iy(){Iy=ccb;$wnd.Math.log(2)} +function UVd(){UVd=ccb;TVd=(AFd(),zFd)} +function _ge(){throw vbb(new cgb(Cxe))} +function ohe(){throw vbb(new cgb(Cxe))} +function che(){throw vbb(new cgb(Dxe))} +function rhe(){throw vbb(new cgb(Dxe))} +function Mg(a){this.a=a;Gg.call(this,a)} +function up(a){this.a=a;rf.call(this,a)} +function Bp(a){this.a=a;rf.call(this,a)} +function Okb(a,b){Mlb(a.c,a.c.length,b)} +function llb(a){return a.ab?1:0} +function Deb(a,b){return ybb(a,b)>0?a:b} +function TC(a,b,c){return {l:a,m:b,h:c}} +function Ctb(a,b){a.a!=null&&BIc(b,a.a)} +function Csb(a){a.a=new jtb;a.c=new jtb} +function hDb(a){this.b=a;this.a=new Rkb} +function dOb(a){this.b=new pOb;this.a=a} +function q_b(a){n_b.call(this);this.a=a} +function txb(){mxb.call(this,'Range',2)} +function bUb(){ZTb();this.a=new L2c(zP)} +function Bh(a,b){Qb(b);Ah(a).Jc(new Vw)} +function fKc(a,b){FJc();return b.n.b+=a} +function Tgc(a,b,c){return Rhb(a.g,c,b)} +function LJc(a,b,c){return Rhb(a.k,c,b)} +function r1c(a,b){return Rhb(a.a,b.a,b)} +function jBc(a,b,c){return hBc(b,c,a.c)} +function E6c(a){return new f7c(a.c,a.d)} +function F6c(a){return new f7c(a.c,a.d)} +function R6c(a){return new f7c(a.a,a.b)} +function CQd(a,b){return hA(a.a,b,null)} +function fec(a){QZb(a,null);RZb(a,null)} +function AOc(a){BOc(a,null);COc(a,null)} +function u4d(){qRd.call(this,null,null)} +function y4d(){RRd.call(this,null,null)} +function a7d(a){this.a=a;Lqb.call(this)} +function Pp(a){this.b=(mmb(),new iob(a))} +function Py(a){a.j=KC(VI,nie,310,0,0,1)} +function oAd(a,b,c){a.c.Vc(b,BD(c,133))} +function GAd(a,b,c){a.c.ji(b,BD(c,133))} +function JLd(a,b){Uxd(a);a.Gc(BD(b,15))} +function b7d(a,b){return t2d(a.c,a.b,b)} +function Bv(a,b){return new Qv(a.Kc(),b)} +function Lq(a,b){return rr(a.Kc(),b)!=-1} +function Sqb(a,b){return a.a.Bc(b)!=null} +function pr(a){return a.Ob()?a.Pb():null} +function yfb(a){return zfb(a,0,a.length)} +function JD(a,b){return a!=null&&AD(a,b)} +function $A(a,b){a.q.setHours(b);YA(a,b)} +function Yrb(a,b){if(a.c){jsb(b);isb(b)}} +function nk(a,b,c){BD(a.Kb(c),164).Nb(b)} +function RJc(a,b,c){SJc(a,b,c);return c} +function Eub(a,b,c){a.a=b^1502;a.b=c^kke} +function xHb(a,b,c){return a.a[b.g][c.g]} +function REc(a,b){return a.a[b.c.p][b.p]} +function aEc(a,b){return a.e[b.c.p][b.p]} +function tEc(a,b){return a.c[b.c.p][b.p]} +function OJc(a,b){return a.j[b.p]=aKc(b)} +function k5c(a,b){return cfb(a.f,b.tg())} +function Isd(a,b){return cfb(a.b,b.tg())} +function Sfd(a,b){return a.a0?b*b/a:b*b*100} +function CRb(a,b){return a>0?b/(a*a):b*100} +function G2c(a,b,c){return Ekb(b,I2c(a,c))} +function t3c(a,b,c){p3c();a.Xe(b)&&c.td(a)} +function St(a,b,c){var d;d=a.Zc(b);d.Rb(c)} +function O6c(a,b,c){a.a+=b;a.b+=c;return a} +function Z6c(a,b,c){a.a*=b;a.b*=c;return a} +function b7c(a,b,c){a.a-=b;a.b-=c;return a} +function a7c(a,b){a.a=b.a;a.b=b.b;return a} +function V6c(a){a.a=-a.a;a.b=-a.b;return a} +function Dic(a){this.c=a;this.a=1;this.b=1} +function xed(a){this.c=a;dld(a,0);eld(a,0)} +function u7c(a){Psb.call(this);n7c(this,a)} +function AXb(a){xXb();yXb(this);this.mf(a)} +function GRd(a,b){nRd();qRd.call(this,a,b)} +function dSd(a,b){LRd();RRd.call(this,a,b)} +function hSd(a,b){LRd();RRd.call(this,a,b)} +function fSd(a,b){LRd();dSd.call(this,a,b)} +function sId(a,b,c){dId.call(this,a,b,c,2)} +function zXd(a,b){UVd();nXd.call(this,a,b)} +function BXd(a,b){UVd();zXd.call(this,a,b)} +function DXd(a,b){UVd();zXd.call(this,a,b)} +function FXd(a,b){UVd();DXd.call(this,a,b)} +function PXd(a,b){UVd();nXd.call(this,a,b)} +function RXd(a,b){UVd();PXd.call(this,a,b)} +function XXd(a,b){UVd();nXd.call(this,a,b)} +function pAd(a,b){return a.c.Fc(BD(b,133))} +function w1d(a,b,c){return V1d(p1d(a,b),c)} +function N2d(a,b,c){return b.Qk(a.e,a.c,c)} +function P2d(a,b,c){return b.Rk(a.e,a.c,c)} +function a3d(a,b){return xid(a.e,BD(b,49))} +function aTd(a,b,c){vtd(QSd(a.a),b,eTd(c))} +function TOd(a,b,c){vtd(VKd(a.a),b,XOd(c))} +function ypb(a,b){b.$modCount=a.$modCount} +function MUc(){MUc=ccb;LUc=new Lsd('root')} +function LCd(){LCd=ccb;KCd=new lDd;new NDd} +function KVc(){this.a=new Hp;this.b=new Hp} +function FUd(){hJd.call(this);this.Bb|=Tje} +function t_c(){$r.call(this,'GROW_TREE',0)} +function C9d(a){return a==null?null:cde(a)} +function G9d(a){return a==null?null:jde(a)} +function J9d(a){return a==null?null:fcb(a)} +function K9d(a){return a==null?null:fcb(a)} +function fdb(a){if(a.o!=null){return}vdb(a)} +function DD(a){CCb(a==null||KD(a));return a} +function ED(a){CCb(a==null||LD(a));return a} +function GD(a){CCb(a==null||ND(a));return a} +function gB(a){this.q=new $wnd.Date(Sbb(a))} +function Mf(a,b){this.c=a;ne.call(this,a,b)} +function Sf(a,b){this.a=a;Mf.call(this,a,b)} +function Hg(a,b){this.d=a;Dg(this);this.b=b} +function bAb(a,b){Vzb.call(this,a);this.a=b} +function vAb(a,b){Vzb.call(this,a);this.a=b} +function sNb(a){pNb.call(this,0,0);this.f=a} +function Vg(a,b,c){dg.call(this,a,b,c,null)} +function Yg(a,b,c){dg.call(this,a,b,c,null)} +function Pxb(a,b,c){return a.ue(b,c)<=0?c:b} +function Qxb(a,b,c){return a.ue(b,c)<=0?b:c} +function g4c(a,b){return BD(Wrb(a.b,b),149)} +function i4c(a,b){return BD(Wrb(a.c,b),229)} +function wic(a){return BD(Ikb(a.a,a.b),287)} +function B6c(a){return new f7c(a.c,a.d+a.a)} +function eLc(a){return FJc(),Jzc(BD(a,197))} +function $Jb(){$Jb=ccb;ZJb=pqb((tdd(),sdd))} +function fOb(a,b){b.a?gOb(a,b):Fxb(a.a,b.b)} +function qyb(a,b){if(lyb){return}Ekb(a.a,b)} +function F2b(a,b){x2b();return f_b(b.d.i,a)} +function _9b(a,b){I9b();return new gac(b,a)} +function _Hb(a,b){ytb(b,lle);a.f=b;return a} +function Kld(a,b,c){c=_hd(a,b,3,c);return c} +function bmd(a,b,c){c=_hd(a,b,6,c);return c} +function kpd(a,b,c){c=_hd(a,b,9,c);return c} +function Cvd(a,b,c){++a.j;a.Ki();Atd(a,b,c)} +function Avd(a,b,c){++a.j;a.Hi(b,a.oi(b,c))} +function bRd(a,b,c){var d;d=a.Zc(b);d.Rb(c)} +function c7d(a,b,c){return C2d(a.c,a.b,b,c)} +function DAd(a,b){return (b&Ohe)%a.d.length} +function Msd(a,b){Lsd.call(this,a);this.a=b} +function uVd(a,b){lVd.call(this,a);this.a=b} +function sYd(a,b){lVd.call(this,a);this.a=b} +function zyd(a,b){this.c=a;zud.call(this,b)} +function YOd(a,b){this.a=a;qOd.call(this,b)} +function fTd(a,b){this.a=a;qOd.call(this,b)} +function Xp(a){this.a=(Xj(a,Jie),new Skb(a))} +function cq(a){this.a=(Xj(a,Jie),new Skb(a))} +function LA(a){!a.a&&(a.a=new VA);return a.a} +function XMb(a){if(a>8){return 0}return a+1} +function Ecb(a,b){Bcb();return a==b?0:a?1:-1} +function Opb(a,b,c){return Npb(a,BD(b,22),c)} +function Bz(a,b,c){return a.apply(b,c);var d} +function Sfb(a,b,c){a.a+=zfb(b,0,c);return a} +function ijb(a,b){var c;c=a.e;a.e=b;return c} +function trb(a,b){var c;c=a[hke];c.call(a,b)} +function urb(a,b){var c;c=a[hke];c.call(a,b)} +function Aib(a,b){a.a.Vc(a.b,b);++a.b;a.c=-1} +function Urb(a){Uhb(a.e);a.d.b=a.d;a.d.a=a.d} +function _f(a){a.b?_f(a.b):a.f.c.zc(a.e,a.d)} +function _Ab(a,b,c){EAb();MBb(a,b.Ce(a.a,c))} +function Bxb(a,b){return Vd(Cwb(a.a,b,true))} +function Cxb(a,b){return Vd(Dwb(a.a,b,true))} +function _Bb(a,b){return eCb(new Array(b),a)} +function HD(a){return String.fromCharCode(a)} +function mz(a){return a==null?null:a.message} +function gRb(){this.a=new Rkb;this.b=new Rkb} +function iTb(){this.a=new MQb;this.b=new tTb} +function tDb(){this.b=new d7c;this.c=new Rkb} +function _Qb(){this.d=new d7c;this.e=new d7c} +function n_b(){this.n=new d7c;this.o=new d7c} +function $Gb(){this.n=new p0b;this.i=new I6c} +function sec(){this.a=new Umc;this.b=new mnc} +function NIc(){this.a=new Rkb;this.d=new Rkb} +function LDc(){this.b=new Tqb;this.a=new Tqb} +function hSc(){this.b=new Lqb;this.a=new Lqb} +function HRc(){this.b=new tRc;this.a=new hRc} +function aHb(){$Gb.call(this);this.a=new d7c} +function Ywb(a){Zwb.call(this,a,(lxb(),hxb))} +function J_b(a,b,c,d){B_b.call(this,a,b,c,d)} +function sqd(a,b,c){c!=null&&kmd(b,Wqd(a,c))} +function tqd(a,b,c){c!=null&&lmd(b,Wqd(a,c))} +function Tod(a,b,c){c=_hd(a,b,11,c);return c} +function P6c(a,b){a.a+=b.a;a.b+=b.b;return a} +function c7c(a,b){a.a-=b.a;a.b-=b.b;return a} +function u7b(a,b){return a.n.a=(uCb(b),b)+10} +function v7b(a,b){return a.n.a=(uCb(b),b)+10} +function dLd(a,b){return b==a||pud(UKd(b),a)} +function PYd(a,b){return Rhb(a.a,b,'')==null} +function E2b(a,b){x2b();return !f_b(b.d.i,a)} +function rjc(a,b){fad(a.f)?sjc(a,b):tjc(a,b)} +function h1d(a,b){var c;c=b.Hh(a.a);return c} +function Cyd(a,b){qcb.call(this,gve+a+mue+b)} +function gUd(a,b,c,d){cUd.call(this,a,b,c,d)} +function Q4d(a,b,c,d){cUd.call(this,a,b,c,d)} +function U4d(a,b,c,d){Q4d.call(this,a,b,c,d)} +function n5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function p5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function v5d(a,b,c,d){i5d.call(this,a,b,c,d)} +function t5d(a,b,c,d){p5d.call(this,a,b,c,d)} +function A5d(a,b,c,d){p5d.call(this,a,b,c,d)} +function y5d(a,b,c,d){v5d.call(this,a,b,c,d)} +function D5d(a,b,c,d){A5d.call(this,a,b,c,d)} +function d6d(a,b,c,d){Y5d.call(this,a,b,c,d)} +function Vp(a,b,c){this.a=a;qc.call(this,b,c)} +function tk(a,b,c){this.c=b;this.b=c;this.a=a} +function ik(a,b,c){return a.d=BD(b.Kb(c),164)} +function j6d(a,b){return a.Aj().Nh().Kh(a,b)} +function h6d(a,b){return a.Aj().Nh().Ih(a,b)} +function Fdb(a,b){return uCb(a),PD(a)===PD(b)} +function dfb(a,b){return uCb(a),PD(a)===PD(b)} +function Dxb(a,b){return Vd(Cwb(a.a,b,false))} +function Exb(a,b){return Vd(Dwb(a.a,b,false))} +function vBb(a,b){return a.b.sd(new yBb(a,b))} +function BBb(a,b){return a.b.sd(new EBb(a,b))} +function HBb(a,b){return a.b.sd(new KBb(a,b))} +function lfb(a,b,c){return a.lastIndexOf(b,c)} +function uTb(a,b,c){return Kdb(a[b.b],a[c.b])} +function RTb(a,b){return yNb(b,(Nyc(),Cwc),a)} +function fmc(a,b){return beb(b.a.d.p,a.a.d.p)} +function emc(a,b){return beb(a.a.d.p,b.a.d.p)} +function _Oc(a,b){return Kdb(a.c-a.s,b.c-b.s)} +function S_b(a){return !a.c?-1:Jkb(a.c.a,a,0)} +function Vxd(a){return a<100?null:new Ixd(a)} +function ecd(a){return a==Zbd||a==_bd||a==$bd} +function zAd(a,b){return JD(b,15)&&Btd(a.c,b)} +function vyb(a,b){if(lyb){return}!!b&&(a.d=b)} +function ujb(a,b){var c;c=b;return !!Awb(a,c)} +function czd(a,b){this.c=a;Pyd.call(this,a,b)} +function fBb(a){this.c=a;nvb.call(this,rie,0)} +function Avb(a,b){Bvb.call(this,a,a.length,b)} +function aId(a,b,c){return BD(a.c,69).lk(b,c)} +function bId(a,b,c){return BD(a.c,69).mk(b,c)} +function O2d(a,b,c){return N2d(a,BD(b,332),c)} +function Q2d(a,b,c){return P2d(a,BD(b,332),c)} +function i3d(a,b,c){return h3d(a,BD(b,332),c)} +function k3d(a,b,c){return j3d(a,BD(b,332),c)} +function tn(a,b){return b==null?null:Hv(a.b,b)} +function Kcb(a){return LD(a)?(uCb(a),a):a.ke()} +function Ldb(a){return !isNaN(a)&&!isFinite(a)} +function Wn(a){Ql();this.a=(mmb(),new zob(a))} +function dIc(a){FHc();this.d=a;this.a=new jkb} +function xqb(a,b,c){this.a=a;this.b=b;this.c=c} +function Nrb(a,b,c){this.a=a;this.b=b;this.c=c} +function $sb(a,b,c){this.d=a;this.b=c;this.a=b} +function Qsb(a){Csb(this);Osb(this);ye(this,a)} +function Tkb(a){Ckb(this);bCb(this.c,0,a.Pc())} +function Xwb(a){uib(a.a);Kwb(a.c,a.b);a.b=null} +function iyb(a){this.a=a;Zfb();Cbb(Date.now())} +function JCb(){JCb=ccb;GCb=new nb;ICb=new nb} +function ntb(){ntb=ccb;ltb=new otb;mtb=new qtb} +function kzd(){kzd=ccb;jzd=KC(SI,Uhe,1,0,5,1)} +function tGd(){tGd=ccb;sGd=KC(SI,Uhe,1,0,5,1)} +function $Gd(){$Gd=ccb;ZGd=KC(SI,Uhe,1,0,5,1)} +function Ql(){Ql=ccb;new Zl((mmb(),mmb(),jmb))} +function pxb(a){lxb();return es((zxb(),yxb),a)} +function Hyb(a){Fyb();return es((Kyb(),Jyb),a)} +function OEb(a){MEb();return es((REb(),QEb),a)} +function WEb(a){UEb();return es((ZEb(),YEb),a)} +function tFb(a){rFb();return es((wFb(),vFb),a)} +function iHb(a){gHb();return es((lHb(),kHb),a)} +function PHb(a){NHb();return es((SHb(),RHb),a)} +function GIb(a){EIb();return es((JIb(),IIb),a)} +function vJb(a){qJb();return es((yJb(),xJb),a)} +function xLb(a){vLb();return es((ALb(),zLb),a)} +function TMb(a){RMb();return es((WMb(),VMb),a)} +function TOb(a){ROb();return es((WOb(),VOb),a)} +function ePb(a){cPb();return es((hPb(),gPb),a)} +function ZRb(a){XRb();return es((aSb(),_Rb),a)} +function ATb(a){yTb();return es((DTb(),CTb),a)} +function sUb(a){qUb();return es((vUb(),uUb),a)} +function rWb(a){lWb();return es((uWb(),tWb),a)} +function TXb(a){RXb();return es((WXb(),VXb),a)} +function Mb(a,b){if(!a){throw vbb(new Wdb(b))}} +function l0b(a){j0b();return es((o0b(),n0b),a)} +function r0b(a){B_b.call(this,a.d,a.c,a.a,a.b)} +function K_b(a){B_b.call(this,a.d,a.c,a.a,a.b)} +function mKb(a,b,c){this.b=a;this.c=b;this.a=c} +function BZb(a,b,c){this.b=a;this.a=b;this.c=c} +function TNb(a,b,c){this.a=a;this.b=b;this.c=c} +function uOb(a,b,c){this.a=a;this.b=b;this.c=c} +function S3b(a,b,c){this.a=a;this.b=b;this.c=c} +function Z6b(a,b,c){this.a=a;this.b=b;this.c=c} +function n9b(a,b,c){this.b=a;this.a=b;this.c=c} +function x$b(a,b,c){this.e=b;this.b=a;this.d=c} +function $Ab(a,b,c){EAb();a.a.Od(b,c);return b} +function LGb(a){var b;b=new KGb;b.e=a;return b} +function iLb(a){var b;b=new fLb;b.b=a;return b} +function D6b(){D6b=ccb;B6b=new M6b;C6b=new P6b} +function Hgc(){Hgc=ccb;Fgc=new ghc;Ggc=new ihc} +function jbc(a){gbc();return es((mbc(),lbc),a)} +function Cjc(a){Ajc();return es((Fjc(),Ejc),a)} +function Clc(a){Alc();return es((Flc(),Elc),a)} +function Cpc(a){Apc();return es((Fpc(),Epc),a)} +function Kpc(a){Ipc();return es((Npc(),Mpc),a)} +function Wpc(a){Rpc();return es((Zpc(),Ypc),a)} +function $jc(a){Xjc();return es((bkc(),akc),a)} +function Hkc(a){Fkc();return es((Kkc(),Jkc),a)} +function dqc(a){bqc();return es((gqc(),fqc),a)} +function rqc(a){mqc();return es((uqc(),tqc),a)} +function zqc(a){xqc();return es((Cqc(),Bqc),a)} +function Iqc(a){Gqc();return es((Lqc(),Kqc),a)} +function Vqc(a){Sqc();return es((Yqc(),Xqc),a)} +function brc(a){_qc();return es((erc(),drc),a)} +function nrc(a){lrc();return es((qrc(),prc),a)} +function Arc(a){yrc();return es((Drc(),Crc),a)} +function Qrc(a){Orc();return es((Trc(),Src),a)} +function Zrc(a){Xrc();return es((asc(),_rc),a)} +function gsc(a){esc();return es((jsc(),isc),a)} +function osc(a){msc();return es((rsc(),qsc),a)} +function Etc(a){Ctc();return es((Htc(),Gtc),a)} +function qzc(a){lzc();return es((tzc(),szc),a)} +function Azc(a){xzc();return es((Dzc(),Czc),a)} +function Mzc(a){Izc();return es((Pzc(),Ozc),a)} +function MAc(a){KAc();return es((PAc(),OAc),a)} +function mAc(a){kAc();return es((pAc(),oAc),a)} +function vAc(a){tAc();return es((yAc(),xAc),a)} +function DAc(a){BAc();return es((GAc(),FAc),a)} +function VAc(a){TAc();return es((YAc(),XAc),a)} +function $zc(a){Vzc();return es((bAc(),aAc),a)} +function bBc(a){_Ac();return es((eBc(),dBc),a)} +function vBc(a){tBc();return es((yBc(),xBc),a)} +function EBc(a){CBc();return es((HBc(),GBc),a)} +function NBc(a){LBc();return es((QBc(),PBc),a)} +function tGc(a){rGc();return es((wGc(),vGc),a)} +function WIc(a){UIc();return es((ZIc(),YIc),a)} +function $Lc(a){YLc();return es((bMc(),aMc),a)} +function gMc(a){eMc();return es((jMc(),iMc),a)} +function JOc(a){HOc();return es((MOc(),LOc),a)} +function HQc(a){FQc();return es((KQc(),JQc),a)} +function DRc(a){yRc();return es((GRc(),FRc),a)} +function tSc(a){qSc();return es((wSc(),vSc),a)} +function UTc(a){STc();return es((XTc(),WTc),a)} +function UUc(a){PUc();return es((XUc(),WUc),a)} +function aUc(a){$Tc();return es((dUc(),cUc),a)} +function wVc(a){tVc();return es((zVc(),yVc),a)} +function iWc(a){fWc();return es((lWc(),kWc),a)} +function sWc(a){pWc();return es((vWc(),uWc),a)} +function lXc(a){iXc();return es((oXc(),nXc),a)} +function vXc(a){sXc();return es((yXc(),xXc),a)} +function BYc(a){zYc();return es((EYc(),DYc),a)} +function m$c(a){k$c();return es((p$c(),o$c),a)} +function $$c(a){Y$c();return es((b_c(),a_c),a)} +function n_c(a){i_c();return es((q_c(),p_c),a)} +function w_c(a){s_c();return es((z_c(),y_c),a)} +function E_c(a){C_c();return es((H_c(),G_c),a)} +function P_c(a){N_c();return es((S_c(),R_c),a)} +function W0c(a){R0c();return es((Z0c(),Y0c),a)} +function f1c(a){a1c();return es((i1c(),h1c),a)} +function P5c(a){N5c();return es((S5c(),R5c),a)} +function b6c(a){_5c();return es((e6c(),d6c),a)} +function H7c(a){F7c();return es((K7c(),J7c),a)} +function k8c(a){i8c();return es((n8c(),m8c),a)} +function V8b(a){S8b();return es((Y8b(),X8b),a)} +function A5b(a){y5b();return es((D5b(),C5b),a)} +function jad(a){ead();return es((mad(),lad),a)} +function sad(a){qad();return es((vad(),uad),a)} +function Cad(a){Aad();return es((Fad(),Ead),a)} +function Oad(a){Mad();return es((Rad(),Qad),a)} +function jbd(a){hbd();return es((mbd(),lbd),a)} +function ubd(a){rbd();return es((xbd(),wbd),a)} +function Kbd(a){Hbd();return es((Nbd(),Mbd),a)} +function Vbd(a){Tbd();return es((Ybd(),Xbd),a)} +function hcd(a){dcd();return es((kcd(),jcd),a)} +function vcd(a){rcd();return es((ycd(),xcd),a)} +function vdd(a){tdd();return es((ydd(),xdd),a)} +function Kdd(a){Idd();return es((Ndd(),Mdd),a)} +function $cd(a){Ucd();return es((cdd(),bdd),a)} +function Fed(a){Ded();return es((Ied(),Hed),a)} +function rgd(a){pgd();return es((ugd(),tgd),a)} +function Esd(a){Csd();return es((Hsd(),Gsd),a)} +function Yoc(a,b){return (uCb(a),a)+(uCb(b),b)} +function NNd(a,b){Zfb();return wtd(ZKd(a.a),b)} +function SNd(a,b){Zfb();return wtd(ZKd(a.a),b)} +function bPc(a,b){this.c=a;this.a=b;this.b=b-a} +function nYc(a,b,c){this.a=a;this.b=b;this.c=c} +function L1c(a,b,c){this.a=a;this.b=b;this.c=c} +function T1c(a,b,c){this.a=a;this.b=b;this.c=c} +function Rrd(a,b,c){this.a=a;this.b=b;this.c=c} +function zCd(a,b,c){this.a=a;this.b=b;this.c=c} +function IVd(a,b,c){this.e=a;this.a=b;this.c=c} +function kWd(a,b,c){UVd();cWd.call(this,a,b,c)} +function HXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function TXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function ZXd(a,b,c){UVd();oXd.call(this,a,b,c)} +function JXd(a,b,c){UVd();HXd.call(this,a,b,c)} +function LXd(a,b,c){UVd();HXd.call(this,a,b,c)} +function NXd(a,b,c){UVd();LXd.call(this,a,b,c)} +function VXd(a,b,c){UVd();TXd.call(this,a,b,c)} +function _Xd(a,b,c){UVd();ZXd.call(this,a,b,c)} +function $j(a,b){Qb(a);Qb(b);return new _j(a,b)} +function Nq(a,b){Qb(a);Qb(b);return new Wq(a,b)} +function Rq(a,b){Qb(a);Qb(b);return new ar(a,b)} +function lr(a,b){Qb(a);Qb(b);return new zr(a,b)} +function BD(a,b){CCb(a==null||AD(a,b));return a} +function Nu(a){var b;b=new Rkb;fr(b,a);return b} +function Ex(a){var b;b=new Tqb;fr(b,a);return b} +function Hx(a){var b;b=new Gxb;Jq(b,a);return b} +function Ru(a){var b;b=new Psb;Jq(b,a);return b} +function YEc(a){!a.e&&(a.e=new Rkb);return a.e} +function SMd(a){!a.c&&(a.c=new xYd);return a.c} +function Ekb(a,b){a.c[a.c.length]=b;return true} +function WA(a,b){this.c=a;this.b=b;this.a=false} +function Gg(a){this.d=a;Dg(this);this.b=ed(a.d)} +function pzb(){this.a=';,;';this.b='';this.c=''} +function Bvb(a,b,c){qvb.call(this,b,c);this.a=a} +function fAb(a,b,c){this.b=a;fvb.call(this,b,c)} +function lsb(a,b,c){this.c=a;pjb.call(this,b,c)} +function bCb(a,b,c){$Bb(c,0,a,b,c.length,false)} +function HVb(a,b,c,d,e){a.b=b;a.c=c;a.d=d;a.a=e} +function eBb(a,b){if(b){a.b=b;a.a=(Tzb(b),b.a)}} +function v_b(a,b,c,d,e){a.d=b;a.c=c;a.a=d;a.b=e} +function h5b(a){var b,c;b=a.b;c=a.c;a.b=c;a.c=b} +function k5b(a){var b,c;c=a.d;b=a.a;a.d=b;a.a=c} +function Lbb(a){return zbb(iD(Fbb(a)?Rbb(a):a))} +function rlc(a,b){return beb(D0b(a.d),D0b(b.d))} +function uic(a,b){return b==(Ucd(),Tcd)?a.c:a.d} +function FHc(){FHc=ccb;DHc=(Ucd(),Tcd);EHc=zcd} +function DRb(){this.b=Edb(ED(Ksd((wSb(),vSb))))} +function aBb(a){return EAb(),KC(SI,Uhe,1,a,5,1)} +function C6c(a){return new f7c(a.c+a.b,a.d+a.a)} +function Vmc(a,b){Imc();return beb(a.d.p,b.d.p)} +function Lsb(a){sCb(a.b!=0);return Nsb(a,a.a.a)} +function Msb(a){sCb(a.b!=0);return Nsb(a,a.c.b)} +function rCb(a,b){if(!a){throw vbb(new ucb(b))}} +function mCb(a,b){if(!a){throw vbb(new Wdb(b))}} +function dWb(a,b,c){cWb.call(this,a,b);this.b=c} +function pMd(a,b,c){MLd.call(this,a,b);this.c=c} +function Dnc(a,b,c){Cnc.call(this,b,c);this.d=a} +function _Gd(a){$Gd();MGd.call(this);this.th(a)} +function PNd(a,b,c){this.a=a;nNd.call(this,b,c)} +function UNd(a,b,c){this.a=a;nNd.call(this,b,c)} +function k2d(a,b,c){MLd.call(this,a,b);this.c=c} +function y1d(){T0d();z1d.call(this,(yFd(),xFd))} +function gFd(a){return a!=null&&!OEd(a,CEd,DEd)} +function dFd(a,b){return (jFd(a)<<4|jFd(b))&aje} +function ln(a,b){return Vm(),Wj(a,b),new iy(a,b)} +function Sdd(a,b){var c;if(a.n){c=b;Ekb(a.f,c)}} +function Upd(a,b,c){var d;d=new yC(c);cC(a,b,d)} +function WUd(a,b){var c;c=a.c;VUd(a,b);return c} +function Ydd(a,b){b<0?(a.g=-1):(a.g=b);return a} +function $6c(a,b){W6c(a);a.a*=b;a.b*=b;return a} +function G6c(a,b,c,d,e){a.c=b;a.d=c;a.b=d;a.a=e} +function Dsb(a,b){Gsb(a,b,a.c.b,a.c);return true} +function jsb(a){a.a.b=a.b;a.b.a=a.a;a.a=a.b=null} +function Aq(a){this.b=a;this.a=Wm(this.b.a).Ed()} +function Wq(a,b){this.b=a;this.a=b;ol.call(this)} +function ar(a,b){this.a=a;this.b=b;ol.call(this)} +function vvb(a,b){qvb.call(this,b,1040);this.a=a} +function Eeb(a){return a==0||isNaN(a)?a:a<0?-1:1} +function WPb(a){QPb();return jtd(a)==Xod(ltd(a))} +function XPb(a){QPb();return ltd(a)==Xod(jtd(a))} +function iYb(a,b){return hYb(a,new cWb(b.a,b.b))} +function NZb(a){return !OZb(a)&&a.c.i.c==a.d.i.c} +function _Gb(a){var b;b=a.n;return a.a.b+b.d+b.a} +function YHb(a){var b;b=a.n;return a.e.b+b.d+b.a} +function ZHb(a){var b;b=a.n;return a.e.a+b.b+b.c} +function zfe(a){wfe();++vfe;return new ige(0,a)} +function o_b(a){if(a.a){return a.a}return JZb(a)} +function CCb(a){if(!a){throw vbb(new Cdb(null))}} +function X6d(){X6d=ccb;W6d=(mmb(),new anb(Fwe))} +function ex(){ex=ccb;new gx((_k(),$k),(Lk(),Kk))} +function oeb(){oeb=ccb;neb=KC(JI,nie,19,256,0,1)} +function d$c(a,b,c,d){e$c.call(this,a,b,c,d,0,0)} +function sQc(a,b,c){return Rhb(a.b,BD(c.b,17),b)} +function tQc(a,b,c){return Rhb(a.b,BD(c.b,17),b)} +function xfd(a,b){return Ekb(a,new f7c(b.a,b.b))} +function Bic(a,b){return a.c=b){throw vbb(new rcb)}} +function Pyb(a,b,c){NC(b,0,Bzb(b[0],c[0]));return b} +function _yc(a,b,c){b.Ye(c,Edb(ED(Ohb(a.b,c)))*a.a)} +function n6c(a,b,c){i6c();return m6c(a,b)&&m6c(a,c)} +function tcd(a){rcd();return !a.Hc(ncd)&&!a.Hc(pcd)} +function D6c(a){return new f7c(a.c+a.b/2,a.d+a.a/2)} +function oOd(a,b){return b.kh()?xid(a.b,BD(b,49)):b} +function bvb(a,b){this.e=a;this.d=(b&64)!=0?b|oie:b} +function qvb(a,b){this.c=0;this.d=a;this.b=b|64|oie} +function gub(a){this.b=new Skb(11);this.a=(ipb(),a)} +function Qwb(a){this.b=null;this.a=(ipb(),!a?fpb:a)} +function nHc(a){this.a=lHc(a.a);this.b=new Tkb(a.b)} +function Pzd(a){this.b=a;Oyd.call(this,a);Ozd(this)} +function Xzd(a){this.b=a;bzd.call(this,a);Wzd(this)} +function jUd(a,b,c){this.a=a;gUd.call(this,b,c,5,6)} +function Y5d(a,b,c,d){this.b=a;xMd.call(this,b,c,d)} +function nSd(a,b,c,d,e){oSd.call(this,a,b,c,d,e,-1)} +function DSd(a,b,c,d,e){ESd.call(this,a,b,c,d,e,-1)} +function cUd(a,b,c,d){xMd.call(this,a,b,c);this.b=d} +function i5d(a,b,c,d){pMd.call(this,a,b,c);this.b=d} +function x0d(a){Wud.call(this,a,false);this.a=false} +function Lj(a,b){this.b=a;sj.call(this,a.b);this.a=b} +function px(a,b){im();ox.call(this,a,Dm(new amb(b)))} +function Cfe(a,b){wfe();++vfe;return new Dge(a,b,0)} +function Efe(a,b){wfe();++vfe;return new Dge(6,a,b)} +function nfb(a,b){return dfb(a.substr(0,b.length),b)} +function Mhb(a,b){return ND(b)?Qhb(a,b):!!irb(a.f,b)} +function Rrb(a,b){uCb(b);while(a.Ob()){b.td(a.Pb())}} +function Vgb(a,b,c){Hgb();this.e=a;this.d=b;this.a=c} +function amc(a,b,c,d){var e;e=a.i;e.i=b;e.a=c;e.b=d} +function xJc(a){var b;b=a;while(b.f){b=b.f}return b} +function fkb(a){var b;b=bkb(a);sCb(b!=null);return b} +function gkb(a){var b;b=ckb(a);sCb(b!=null);return b} +function cv(a,b){var c;c=a.a.gc();Sb(b,c);return c-b} +function Glb(a,b){var c;for(c=0;c0?$wnd.Math.log(a/b):-100} +function ueb(a,b){return ybb(a,b)<0?-1:ybb(a,b)>0?1:0} +function HMb(a,b,c){return IMb(a,BD(b,46),BD(c,167))} +function iq(a,b){return BD(Rl(Wm(a.a)).Xb(b),42).cd()} +function Olb(a,b){return avb(b,a.length),new vvb(a,b)} +function Pyd(a,b){this.d=a;Fyd.call(this,a);this.e=b} +function Lub(a){this.d=(uCb(a),a);this.a=0;this.c=rie} +function rge(a,b){xfe.call(this,1);this.a=a;this.b=b} +function Rzb(a,b){!a.c?Ekb(a.b,b):Rzb(a.c,b);return a} +function uB(a,b,c){var d;d=tB(a,b);vB(a,b,c);return d} +function ZBb(a,b){var c;c=a.slice(0,b);return PC(c,a)} +function Flb(a,b,c){var d;for(d=0;d=a.g} +function NHc(a,b,c){var d;d=THc(a,b,c);return MHc(a,d)} +function Qpd(a,b){var c;c=a.a.length;tB(a,c);vB(a,c,b)} +function gCb(a,b){var c;c=console[a];c.call(console,b)} +function Bvd(a,b){var c;++a.j;c=a.Vi();a.Ii(a.oi(c,b))} +function E1c(a,b,c){BD(b.b,65);Hkb(b.a,new L1c(a,c,b))} +function oXd(a,b,c){VVd.call(this,b);this.a=a;this.b=c} +function Dge(a,b,c){xfe.call(this,a);this.a=b;this.b=c} +function dYd(a,b,c){this.a=a;lVd.call(this,b);this.b=c} +function f0d(a,b,c){this.a=a;mxd.call(this,8,b,null,c)} +function z1d(a){this.a=(uCb(Rve),Rve);this.b=a;new oUd} +function ct(a){this.c=a;this.b=this.c.a;this.a=this.c.e} +function usb(a){this.c=a;this.b=a.a.d.a;ypb(a.a.e,this)} +function uib(a){yCb(a.c!=-1);a.d.$c(a.c);a.b=a.c;a.c=-1} +function U6c(a){return $wnd.Math.sqrt(a.a*a.a+a.b*a.b)} +function Uvb(a,b){return _vb(b,a.a.c.length),Ikb(a.a,b)} +function Hb(a,b){return PD(a)===PD(b)||a!=null&&pb(a,b)} +function oAb(a){if(0>=a){return new yAb}return pAb(a-1)} +function Nfe(a){if(!bfe)return false;return Qhb(bfe,a)} +function Ehe(a){if(a)return a.dc();return !a.Kc().Ob()} +function Q_b(a){if(!a.a&&!!a.c){return a.c.b}return a.a} +function LHd(a){!a.a&&(a.a=new xMd(m5,a,4));return a.a} +function LQd(a){!a.d&&(a.d=new xMd(j5,a,1));return a.d} +function uCb(a){if(a==null){throw vbb(new Geb)}return a} +function Qzb(a){if(!a.c){a.d=true;Szb(a)}else{a.c.He()}} +function Tzb(a){if(!a.c){Uzb(a);a.d=true}else{Tzb(a.c)}} +function Kpb(a){Ae(a.a);a.b=KC(SI,Uhe,1,a.b.length,5,1)} +function qlc(a,b){return beb(b.j.c.length,a.j.c.length)} +function igd(a,b){a.c<0||a.b.b=0?a.Bh(c):vid(a,b)} +function WHc(a){var b,c;b=a.c.i.c;c=a.d.i.c;return b==c} +function Wwd(a){if(a.p!=4)throw vbb(new Ydb);return a.e} +function Vwd(a){if(a.p!=3)throw vbb(new Ydb);return a.e} +function Ywd(a){if(a.p!=6)throw vbb(new Ydb);return a.f} +function fxd(a){if(a.p!=6)throw vbb(new Ydb);return a.k} +function cxd(a){if(a.p!=3)throw vbb(new Ydb);return a.j} +function dxd(a){if(a.p!=4)throw vbb(new Ydb);return a.j} +function AYd(a){!a.b&&(a.b=new RYd(new NYd));return a.b} +function $1d(a){a.c==-2&&e2d(a,X0d(a.g,a.b));return a.c} +function pdb(a,b){var c;c=ldb('',a);c.n=b;c.i=1;return c} +function MNb(a,b){$Nb(BD(b.b,65),a);Hkb(b.a,new RNb(a))} +function Cnd(a,b){wtd((!a.a&&(a.a=new fTd(a,a)),a.a),b)} +function Qzd(a,b){this.b=a;Pyd.call(this,a,b);Ozd(this)} +function Yzd(a,b){this.b=a;czd.call(this,a,b);Wzd(this)} +function Ms(a,b,c,d){Wo.call(this,a,b);this.d=c;this.a=d} +function $o(a,b,c,d){Wo.call(this,a,c);this.a=b;this.f=d} +function iy(a,b){Pp.call(this,umb(Qb(a),Qb(b)));this.a=b} +function cae(){fod.call(this,Ewe,(p8d(),o8d));$9d(this)} +function AZd(){fod.call(this,_ve,(LFd(),KFd));uZd(this)} +function T0c(){$r.call(this,'DELAUNAY_TRIANGULATION',0)} +function vfb(a){return String.fromCharCode.apply(null,a)} +function Rhb(a,b,c){return ND(b)?Shb(a,b,c):jrb(a.f,b,c)} +function tmb(a){mmb();return !a?(ipb(),ipb(),hpb):a.ve()} +function d2c(a,b,c){Y1c();return c.pg(a,BD(b.cd(),146))} +function ix(a,b){ex();return new gx(new il(a),new Uk(b))} +function Iu(a){Xj(a,Mie);return Oy(wbb(wbb(5,a),a/10|0))} +function Vm(){Vm=ccb;Um=new wx(OC(GC(CK,1),zie,42,0,[]))} +function hob(a){!a.d&&(a.d=new lnb(a.c.Cc()));return a.d} +function eob(a){!a.a&&(a.a=new Gob(a.c.vc()));return a.a} +function gob(a){!a.b&&(a.b=new zob(a.c.ec()));return a.b} +function keb(a,b){while(b-->0){a=a<<1|(a<0?1:0)}return a} +function wtb(a,b){return PD(a)===PD(b)||a!=null&&pb(a,b)} +function Gbc(a,b){return Bcb(),BD(b.b,19).ad&&++d;return d} +function Nnd(a){var b,c;c=(b=new UQd,b);NQd(c,a);return c} +function Ond(a){var b,c;c=(b=new UQd,b);RQd(c,a);return c} +function hqd(a,b){var c;c=Ohb(a.f,b);Yqd(b,c);return null} +function JZb(a){var b;b=P2b(a);if(b){return b}return null} +function Wod(a){!a.b&&(a.b=new cUd(B2,a,12,3));return a.b} +function YEd(a){return a!=null&&hnb(GEd,a.toLowerCase())} +function ied(a,b){return Kdb(red(a)*qed(a),red(b)*qed(b))} +function jed(a,b){return Kdb(red(a)*qed(a),red(b)*qed(b))} +function wEb(a,b){return Kdb(a.d.c+a.d.b/2,b.d.c+b.d.b/2)} +function UVb(a,b){return Kdb(a.g.c+a.g.b/2,b.g.c+b.g.b/2)} +function pQb(a,b,c){c.a?eld(a,b.b-a.f/2):dld(a,b.a-a.g/2)} +function prd(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d} +function ord(a,b,c,d){this.a=a;this.b=b;this.c=c;this.d=d} +function JVd(a,b,c,d){this.e=a;this.a=b;this.c=c;this.d=d} +function ZVd(a,b,c,d){this.a=a;this.c=b;this.d=c;this.b=d} +function cXd(a,b,c,d){UVd();mWd.call(this,b,c,d);this.a=a} +function jXd(a,b,c,d){UVd();mWd.call(this,b,c,d);this.a=a} +function Ng(a,b){this.a=a;Hg.call(this,a,BD(a.d,15).Zc(b))} +function ZBd(a){this.f=a;this.c=this.f.e;a.f>0&&YBd(this)} +function lBb(a,b,c,d){this.b=a;this.c=d;nvb.call(this,b,c)} +function tib(a){sCb(a.b=0&&dfb(a.substr(c,b.length),b)} +function H2d(a,b,c,d,e,f,g){return new O7d(a.e,b,c,d,e,f,g)} +function Cxd(a,b,c,d,e,f){this.a=a;nxd.call(this,b,c,d,e,f)} +function vyd(a,b,c,d,e,f){this.a=a;nxd.call(this,b,c,d,e,f)} +function $Ec(a,b){this.g=a;this.d=OC(GC(OQ,1),kne,10,0,[b])} +function KVd(a,b){this.e=a;this.a=SI;this.b=R5d(b);this.c=b} +function cIb(a,b){$Gb.call(this);THb(this);this.a=a;this.c=b} +function kBc(a,b,c,d){NC(a.c[b.g],c.g,d);NC(a.c[c.g],b.g,d)} +function nBc(a,b,c,d){NC(a.c[b.g],b.g,c);NC(a.b[b.g],b.g,d)} +function cBc(){_Ac();return OC(GC(fX,1),Kie,376,0,[$Ac,ZAc])} +function crc(){_qc();return OC(GC(MW,1),Kie,479,0,[$qc,Zqc])} +function Aqc(){xqc();return OC(GC(JW,1),Kie,419,0,[vqc,wqc])} +function Lpc(){Ipc();return OC(GC(FW,1),Kie,422,0,[Gpc,Hpc])} +function psc(){msc();return OC(GC(SW,1),Kie,420,0,[ksc,lsc])} +function EAc(){BAc();return OC(GC(cX,1),Kie,421,0,[zAc,AAc])} +function XIc(){UIc();return OC(GC(mY,1),Kie,523,0,[TIc,SIc])} +function KOc(){HOc();return OC(GC(DZ,1),Kie,520,0,[GOc,FOc])} +function _Lc(){YLc();return OC(GC(fZ,1),Kie,516,0,[XLc,WLc])} +function hMc(){eMc();return OC(GC(gZ,1),Kie,515,0,[cMc,dMc])} +function IQc(){FQc();return OC(GC(YZ,1),Kie,455,0,[DQc,EQc])} +function bUc(){$Tc();return OC(GC(F$,1),Kie,425,0,[ZTc,YTc])} +function VTc(){STc();return OC(GC(E$,1),Kie,480,0,[QTc,RTc])} +function VUc(){PUc();return OC(GC(K$,1),Kie,495,0,[NUc,OUc])} +function jWc(){fWc();return OC(GC(X$,1),Kie,426,0,[dWc,eWc])} +function g1c(){a1c();return OC(GC(X_,1),Kie,429,0,[_0c,$0c])} +function F_c(){C_c();return OC(GC(P_,1),Kie,430,0,[B_c,A_c])} +function PEb(){MEb();return OC(GC(aN,1),Kie,428,0,[LEb,KEb])} +function XEb(){UEb();return OC(GC(bN,1),Kie,427,0,[SEb,TEb])} +function $Rb(){XRb();return OC(GC(gP,1),Kie,424,0,[VRb,WRb])} +function B5b(){y5b();return OC(GC(ZR,1),Kie,511,0,[x5b,w5b])} +function lid(a,b,c,d){return c>=0?a.jh(b,c,d):a.Sg(null,c,d)} +function hgd(a){if(a.b.b==0){return a.a.$e()}return Lsb(a.b)} +function Xwd(a){if(a.p!=5)throw vbb(new Ydb);return Tbb(a.f)} +function exd(a){if(a.p!=5)throw vbb(new Ydb);return Tbb(a.k)} +function pNd(a){PD(a.a)===PD((NKd(),MKd))&&qNd(a);return a.a} +function by(a){this.a=BD(Qb(a),271);this.b=(mmb(),new Zob(a))} +function bQc(a,b){$Pc(this,new f7c(a.a,a.b));_Pc(this,Ru(b))} +function FQc(){FQc=ccb;DQc=new GQc(jle,0);EQc=new GQc(kle,1)} +function YLc(){YLc=ccb;XLc=new ZLc(kle,0);WLc=new ZLc(jle,1)} +function Hp(){Gp.call(this,new Mqb(Cv(12)));Lb(true);this.a=2} +function Hge(a,b,c){wfe();xfe.call(this,a);this.b=b;this.a=c} +function cWd(a,b,c){UVd();VVd.call(this,b);this.a=a;this.b=c} +function aIb(a){$Gb.call(this);THb(this);this.a=a;this.c=true} +function isb(a){var b;b=a.c.d.b;a.b=b;a.a=a.c.d;b.a=a.c.d.b=a} +function $Cb(a){var b;NGb(a.a);MGb(a.a);b=new YGb(a.a);UGb(b)} +function iKb(a,b){hKb(a,true);Hkb(a.e.wf(),new mKb(a,true,b))} +function tlb(a,b){pCb(b);return vlb(a,KC(WD,oje,25,b,15,1),b)} +function YPb(a,b){QPb();return a==Xod(jtd(b))||a==Xod(ltd(b))} +function Phb(a,b){return b==null?Wd(irb(a.f,null)):Crb(a.g,b)} +function Ksb(a){return a.b==0?null:(sCb(a.b!=0),Nsb(a,a.a.a))} +function QD(a){return Math.max(Math.min(a,Ohe),-2147483648)|0} +function uz(a,b){var c=tz[a.charCodeAt(0)];return c==null?a:c} +function Cx(a,b){Rb(a,'set1');Rb(b,'set2');return new Px(a,b)} +function QUb(a,b){var c;c=zUb(a.f,b);return P6c(V6c(c),a.f.d)} +function Jwb(a,b){var c,d;c=b;d=new fxb;Lwb(a,c,d);return d.d} +function NJb(a,b,c,d){var e;e=new aHb;b.a[c.g]=e;Npb(a.b,d,e)} +function zid(a,b,c){var d;d=a.Yg(b);d>=0?a.sh(d,c):uid(a,b,c)} +function hvd(a,b,c){evd();!!a&&Rhb(dvd,a,b);!!a&&Rhb(cvd,a,c)} +function g_c(a,b,c){this.i=new Rkb;this.b=a;this.g=b;this.a=c} +function VZc(a,b,c){this.c=new Rkb;this.e=a;this.f=b;this.b=c} +function b$c(a,b,c){this.a=new Rkb;this.e=a;this.f=b;this.c=c} +function Zy(a,b){Py(this);this.f=b;this.g=a;Ry(this);this._d()} +function ZA(a,b){var c;c=a.q.getHours();a.q.setDate(b);YA(a,c)} +function no(a,b){var c;Qb(b);for(c=a.a;c;c=c.c){b.Od(c.g,c.i)}} +function Fx(a){var b;b=new Uqb(Cv(a.length));nmb(b,a);return b} +function ecb(a){function b(){} +;b.prototype=a||{};return new b} +function dkb(a,b){if(Zjb(a,b)){wkb(a);return true}return false} +function aC(a,b){if(b==null){throw vbb(new Geb)}return bC(a,b)} +function tdb(a){if(a.qe()){return null}var b=a.n;return _bb[b]} +function Mld(a){if(a.Db>>16!=3)return null;return BD(a.Cb,33)} +function mpd(a){if(a.Db>>16!=9)return null;return BD(a.Cb,33)} +function fmd(a){if(a.Db>>16!=6)return null;return BD(a.Cb,79)} +function Ind(a){if(a.Db>>16!=7)return null;return BD(a.Cb,235)} +function Fod(a){if(a.Db>>16!=7)return null;return BD(a.Cb,160)} +function Xod(a){if(a.Db>>16!=11)return null;return BD(a.Cb,33)} +function nid(a,b){var c;c=a.Yg(b);return c>=0?a.lh(c):tid(a,b)} +function Dtd(a,b){var c;c=new Bsb(b);Ve(c,a);return new Tkb(c)} +function Uud(a){var b;b=a.d;b=a.si(a.f);wtd(a,b);return b.Ob()} +function t_b(a,b){a.b+=b.b;a.c+=b.c;a.d+=b.d;a.a+=b.a;return a} +function A4b(a,b){return $wnd.Math.abs(a)<$wnd.Math.abs(b)?a:b} +function Zod(a){return !a.a&&(a.a=new cUd(E2,a,10,11)),a.a.i>0} +function oDb(){this.a=new zsb;this.e=new Tqb;this.g=0;this.i=0} +function BGc(a){this.a=a;this.b=KC(SX,nie,1944,a.e.length,0,2)} +function RHc(a,b,c){var d;d=SHc(a,b,c);a.b=new BHc(d.c.length)} +function eMc(){eMc=ccb;cMc=new fMc(vle,0);dMc=new fMc('UP',1)} +function STc(){STc=ccb;QTc=new TTc(Yqe,0);RTc=new TTc('FAN',1)} +function evd(){evd=ccb;dvd=new Lqb;cvd=new Lqb;ivd(hK,new jvd)} +function Swd(a){if(a.p!=0)throw vbb(new Ydb);return Kbb(a.f,0)} +function _wd(a){if(a.p!=0)throw vbb(new Ydb);return Kbb(a.k,0)} +function MHd(a){if(a.Db>>16!=3)return null;return BD(a.Cb,147)} +function ZJd(a){if(a.Db>>16!=6)return null;return BD(a.Cb,235)} +function WId(a){if(a.Db>>16!=17)return null;return BD(a.Cb,26)} +function rdb(a,b){var c=a.a=a.a||[];return c[b]||(c[b]=a.le(b))} +function hrb(a,b){var c;c=a.a.get(b);return c==null?new Array:c} +function aB(a,b){var c;c=a.q.getHours();a.q.setMonth(b);YA(a,c)} +function Shb(a,b,c){return b==null?jrb(a.f,null,c):Drb(a.g,b,c)} +function FLd(a,b,c,d,e,f){return new pSd(a.e,b,a.aj(),c,d,e,f)} +function Tfb(a,b,c){a.a=qfb(a.a,0,b)+(''+c)+pfb(a.a,b);return a} +function bq(a,b,c){Ekb(a.a,(Vm(),Wj(b,c),new Wo(b,c)));return a} +function uu(a){ot(a.c);a.e=a.a=a.c;a.c=a.c.c;++a.d;return a.a.f} +function vu(a){ot(a.e);a.c=a.a=a.e;a.e=a.e.e;--a.d;return a.a.f} +function RZb(a,b){!!a.d&&Lkb(a.d.e,a);a.d=b;!!a.d&&Ekb(a.d.e,a)} +function QZb(a,b){!!a.c&&Lkb(a.c.g,a);a.c=b;!!a.c&&Ekb(a.c.g,a)} +function $_b(a,b){!!a.c&&Lkb(a.c.a,a);a.c=b;!!a.c&&Ekb(a.c.a,a)} +function F0b(a,b){!!a.i&&Lkb(a.i.j,a);a.i=b;!!a.i&&Ekb(a.i.j,a)} +function jDb(a,b,c){this.a=b;this.c=a;this.b=(Qb(c),new Tkb(c))} +function qXb(a,b,c){this.a=b;this.c=a;this.b=(Qb(c),new Tkb(c))} +function aOb(a,b){this.a=a;this.c=R6c(this.a);this.b=new K6c(b)} +function IAb(a){var b;Uzb(a);b=new Tqb;return JAb(a,new jBb(b))} +function wCb(a,b){if(a<0||a>b){throw vbb(new qcb(Ake+a+Bke+b))}} +function Ppb(a,b){return vqb(a.a,b)?Qpb(a,BD(b,22).g,null):null} +function WUb(a){LUb();return Bcb(),BD(a.a,81).d.e!=0?true:false} +function qs(){qs=ccb;ps=as((hs(),OC(GC(yG,1),Kie,538,0,[gs])))} +function SBc(){SBc=ccb;RBc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function ZBc(){ZBc=ccb;YBc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function oCc(){oCc=ccb;nCc=c3c(new j3c,(qUb(),pUb),(S8b(),J8b))} +function aJc(){aJc=ccb;_Ic=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function FJc(){FJc=ccb;EJc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function ILc(){ILc=ccb;HLc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function wMc(){wMc=ccb;vMc=e3c(new j3c,(qUb(),pUb),(S8b(),h8b))} +function fUc(){fUc=ccb;eUc=c3c(new j3c,(yRc(),xRc),(qSc(),kSc))} +function DOc(a,b,c,d){this.c=a;this.d=d;BOc(this,b);COc(this,c)} +function W3c(a){this.c=new Psb;this.b=a.b;this.d=a.c;this.a=a.a} +function e7c(a){this.a=$wnd.Math.cos(a);this.b=$wnd.Math.sin(a)} +function BOc(a,b){!!a.a&&Lkb(a.a.k,a);a.a=b;!!a.a&&Ekb(a.a.k,a)} +function COc(a,b){!!a.b&&Lkb(a.b.f,a);a.b=b;!!a.b&&Ekb(a.b.f,a)} +function D1c(a,b){E1c(a,a.b,a.c);BD(a.b.b,65);!!b&&BD(b.b,65).b} +function BUd(a,b){CUd(a,b);JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),2)} +function cJd(a,b){JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),4);pnd(a,b)} +function lKd(a,b){JD(a.Cb,179)&&(BD(a.Cb,179).tb=null);pnd(a,b)} +function T2d(a,b){return Q6d(),YId(b)?new R7d(b,a):new f7d(b,a)} +function jsd(a,b){var c,d;c=b.c;d=c!=null;d&&Qpd(a,new yC(b.c))} +function XOd(a){var b,c;c=(LFd(),b=new UQd,b);NQd(c,a);return c} +function eTd(a){var b,c;c=(LFd(),b=new UQd,b);NQd(c,a);return c} +function yCc(a,b){var c;c=new H1b(a);b.c[b.c.length]=c;return c} +function Aw(a,b){var c;c=BD(Hv(nd(a.a),b),14);return !c?0:c.gc()} +function UAb(a){var b;Uzb(a);b=(ipb(),ipb(),gpb);return VAb(a,b)} +function nr(a){var b;while(true){b=a.Pb();if(!a.Ob()){return b}}} +function Ki(a,b){Ii.call(this,new Mqb(Cv(a)));Xj(b,mie);this.a=b} +function Jib(a,b,c){xCb(b,c,a.gc());this.c=a;this.a=b;this.b=c-b} +function Mkb(a,b,c){var d;xCb(b,c,a.c.length);d=c-b;cCb(a.c,b,d)} +function Fub(a,b){Eub(a,Tbb(xbb(Obb(b,24),nke)),Tbb(xbb(b,nke)))} +function tCb(a,b){if(a<0||a>=b){throw vbb(new qcb(Ake+a+Bke+b))}} +function BCb(a,b){if(a<0||a>=b){throw vbb(new Xfb(Ake+a+Bke+b))}} +function Kub(a,b){this.b=(uCb(a),a);this.a=(b&Rje)==0?b|64|oie:b} +function kkb(a){Vjb(this);dCb(this.a,geb($wnd.Math.max(8,a))<<1)} +function A0b(a){return l7c(OC(GC(m1,1),nie,8,0,[a.i.n,a.n,a.a]))} +function Iyb(){Fyb();return OC(GC(xL,1),Kie,132,0,[Cyb,Dyb,Eyb])} +function jHb(){gHb();return OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])} +function QHb(){NHb();return OC(GC(sN,1),Kie,461,0,[LHb,KHb,MHb])} +function HIb(){EIb();return OC(GC(zN,1),Kie,462,0,[DIb,CIb,BIb])} +function UXb(){RXb();return OC(GC(hQ,1),Kie,423,0,[QXb,PXb,OXb])} +function BTb(){yTb();return OC(GC(oP,1),Kie,379,0,[wTb,vTb,xTb])} +function Bzc(){xzc();return OC(GC(ZW,1),Kie,378,0,[uzc,vzc,wzc])} +function Xpc(){Rpc();return OC(GC(GW,1),Kie,314,0,[Ppc,Opc,Qpc])} +function eqc(){bqc();return OC(GC(HW,1),Kie,337,0,[$pc,aqc,_pc])} +function Jqc(){Gqc();return OC(GC(KW,1),Kie,450,0,[Eqc,Dqc,Fqc])} +function Ikc(){Fkc();return OC(GC(vV,1),Kie,361,0,[Ekc,Dkc,Ckc])} +function hsc(){esc();return OC(GC(RW,1),Kie,303,0,[csc,dsc,bsc])} +function $rc(){Xrc();return OC(GC(QW,1),Kie,292,0,[Vrc,Wrc,Urc])} +function NAc(){KAc();return OC(GC(dX,1),Kie,452,0,[JAc,HAc,IAc])} +function wAc(){tAc();return OC(GC(bX,1),Kie,339,0,[rAc,qAc,sAc])} +function WAc(){TAc();return OC(GC(eX,1),Kie,375,0,[QAc,RAc,SAc])} +function OBc(){LBc();return OC(GC(jX,1),Kie,377,0,[JBc,KBc,IBc])} +function wBc(){tBc();return OC(GC(hX,1),Kie,336,0,[qBc,rBc,sBc])} +function FBc(){CBc();return OC(GC(iX,1),Kie,338,0,[BBc,zBc,ABc])} +function uGc(){rGc();return OC(GC(PX,1),Kie,454,0,[oGc,pGc,qGc])} +function xVc(){tVc();return OC(GC(O$,1),Kie,442,0,[sVc,qVc,rVc])} +function tWc(){pWc();return OC(GC(Y$,1),Kie,380,0,[mWc,nWc,oWc])} +function CYc(){zYc();return OC(GC(q_,1),Kie,381,0,[xYc,yYc,wYc])} +function wXc(){sXc();return OC(GC(b_,1),Kie,293,0,[qXc,rXc,pXc])} +function _$c(){Y$c();return OC(GC(J_,1),Kie,437,0,[V$c,W$c,X$c])} +function kbd(){hbd();return OC(GC(z1,1),Kie,334,0,[fbd,ebd,gbd])} +function tad(){qad();return OC(GC(u1,1),Kie,272,0,[nad,oad,pad])} +function o3d(a,b){return p3d(a,b,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function LZc(a,b,c){var d;d=MZc(a,b,false);return d.b<=b&&d.a<=c} +function tMc(a,b,c){var d;d=new sMc;d.b=b;d.a=c;++b.b;Ekb(a.d,d)} +function fs(a,b){var c;c=(uCb(a),a).g;lCb(!!c);uCb(b);return c(b)} +function av(a,b){var c,d;d=cv(a,b);c=a.a.Zc(d);return new qv(a,c)} +function cKd(a){if(a.Db>>16!=6)return null;return BD(aid(a),235)} +function Uwd(a){if(a.p!=2)throw vbb(new Ydb);return Tbb(a.f)&aje} +function bxd(a){if(a.p!=2)throw vbb(new Ydb);return Tbb(a.k)&aje} +function Z1d(a){a.a==(T0d(),S0d)&&d2d(a,U0d(a.g,a.b));return a.a} +function _1d(a){a.d==(T0d(),S0d)&&f2d(a,Y0d(a.g,a.b));return a.d} +function mlb(a){sCb(a.ad?1:0} +function bjc(a,b){var c,d;c=ajc(b);d=c;return BD(Ohb(a.c,d),19).a} +function iSc(a,b){var c;c=a+'';while(c.length0&&a.a[--a.d]==0);a.a[a.d++]==0&&(a.e=0)} +function wwb(a){return !a.a?a.c:a.e.length==0?a.a.a:a.a.a+(''+a.e)} +function RSd(a){return !!a.a&&QSd(a.a.a).i!=0&&!(!!a.b&&QTd(a.b))} +function cLd(a){return !!a.u&&VKd(a.u.a).i!=0&&!(!!a.n&&FMd(a.n))} +function $i(a){return Zj(a.e.Hd().gc()*a.c.Hd().gc(),16,new ij(a))} +function XA(a,b){return ueb(Cbb(a.q.getTime()),Cbb(b.q.getTime()))} +function k_b(a){return BD(Qkb(a,KC(AQ,jne,17,a.c.length,0,1)),474)} +function l_b(a){return BD(Qkb(a,KC(OQ,kne,10,a.c.length,0,1)),193)} +function cKc(a){FJc();return !OZb(a)&&!(!OZb(a)&&a.c.i.c==a.d.i.c)} +function kDb(a,b,c){var d;d=(Qb(a),new Tkb(a));iDb(new jDb(d,b,c))} +function rXb(a,b,c){var d;d=(Qb(a),new Tkb(a));pXb(new qXb(d,b,c))} +function Nwb(a,b){var c;c=1-b;a.a[c]=Owb(a.a[c],c);return Owb(a,b)} +function YXc(a,b){var c;a.e=new QXc;c=gVc(b);Okb(c,a.c);ZXc(a,c,0)} +function o4c(a,b,c,d){var e;e=new w4c;e.a=b;e.b=c;e.c=d;Dsb(a.a,e)} +function p4c(a,b,c,d){var e;e=new w4c;e.a=b;e.b=c;e.c=d;Dsb(a.b,e)} +function i6d(a){var b,c,d;b=new A6d;c=s6d(b,a);z6d(b);d=c;return d} +function vZd(){var a,b,c;b=(c=(a=new UQd,a),c);Ekb(rZd,b);return b} +function H2c(a){a.j.c=KC(SI,Uhe,1,0,5,1);Ae(a.c);h3c(a.a);return a} +function tgc(a){qgc();if(JD(a.g,10)){return BD(a.g,10)}return null} +function Zw(a){if(Ah(a).dc()){return false}Bh(a,new bx);return true} +function _y(b){if(!('stack' in b)){try{throw b}catch(a){}}return b} +function Pb(a,b){if(a<0||a>=b){throw vbb(new qcb(Ib(a,b)))}return a} +function Tb(a,b,c){if(a<0||bc){throw vbb(new qcb(Kb(a,b,c)))}} +function eVb(a,b){Qqb(a.a,b);if(b.d){throw vbb(new hz(Hke))}b.d=a} +function xpb(a,b){if(b.$modCount!=a.$modCount){throw vbb(new Apb)}} +function $pb(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function dib(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function msb(a,b){if(JD(b,42)){return Jd(a.a,BD(b,42))}return false} +function qAb(a,b){if(a.a<=a.b){b.ud(a.a++);return true}return false} +function Sbb(a){var b;if(Fbb(a)){b=a;return b==-0.?0:b}return oD(a)} +function tAb(a){var b;Tzb(a);b=new drb;_ub(a.a,new BAb(b));return b} +function Yzb(a){var b;Tzb(a);b=new Gpb;_ub(a.a,new mAb(b));return b} +function Bib(a,b){this.a=a;vib.call(this,a);wCb(b,a.gc());this.b=b} +function orb(a){this.e=a;this.b=this.e.a.entries();this.a=new Array} +function Oi(a){return Zj(a.e.Hd().gc()*a.c.Hd().gc(),273,new cj(a))} +function Qu(a){return new Skb((Xj(a,Mie),Oy(wbb(wbb(5,a),a/10|0))))} +function m_b(a){return BD(Qkb(a,KC(aR,lne,11,a.c.length,0,1)),1943)} +function sMb(a,b,c){return c.f.c.length>0?HMb(a.a,b,c):HMb(a.b,b,c)} +function SZb(a,b,c){!!a.d&&Lkb(a.d.e,a);a.d=b;!!a.d&&Dkb(a.d.e,c,a)} +function a5b(a,b){i5b(b,a);k5b(a.d);k5b(BD(vNb(a,(Nyc(),wxc)),207))} +function _4b(a,b){f5b(b,a);h5b(a.d);h5b(BD(vNb(a,(Nyc(),wxc)),207))} +function Ypd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=c.fe());return d} +function Zpd(a,b){var c,d;c=tB(a,b);d=null;!!c&&(d=c.ie());return d} +function $pd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=c.ie());return d} +function _pd(a,b){var c,d;c=aC(a,b);d=null;!!c&&(d=aqd(c));return d} +function Tqd(a,b,c){var d;d=Wpd(c);ro(a.g,d,b);ro(a.i,b,c);return b} +function Ez(a,b,c){var d;d=Cz();try{return Bz(a,b,c)}finally{Fz(d)}} +function C6d(a){var b;b=a.Wg();this.a=JD(b,69)?BD(b,69).Zh():b.Kc()} +function j3c(){D2c.call(this);this.j.c=KC(SI,Uhe,1,0,5,1);this.a=-1} +function mxd(a,b,c,d){this.d=a;this.n=b;this.g=c;this.o=d;this.p=-1} +function jk(a,b,c,d){this.e=d;this.d=null;this.c=a;this.a=b;this.b=c} +function uEc(a,b,c){this.d=new HEc(this);this.e=a;this.i=b;this.f=c} +function msc(){msc=ccb;ksc=new nsc(gle,0);lsc=new nsc('TOP_LEFT',1)} +function cDc(){cDc=ccb;bDc=ix(meb(1),meb(4));aDc=ix(meb(1),meb(2))} +function z_c(){z_c=ccb;y_c=as((s_c(),OC(GC(O_,1),Kie,551,0,[r_c])))} +function q_c(){q_c=ccb;p_c=as((i_c(),OC(GC(N_,1),Kie,482,0,[h_c])))} +function Z0c(){Z0c=ccb;Y0c=as((R0c(),OC(GC(W_,1),Kie,530,0,[Q0c])))} +function hPb(){hPb=ccb;gPb=as((cPb(),OC(GC(GO,1),Kie,481,0,[bPb])))} +function yLb(){vLb();return OC(GC(PN,1),Kie,406,0,[uLb,rLb,sLb,tLb])} +function qxb(){lxb();return OC(GC(iL,1),Kie,297,0,[hxb,ixb,jxb,kxb])} +function UOb(){ROb();return OC(GC(CO,1),Kie,394,0,[OOb,NOb,POb,QOb])} +function UMb(){RMb();return OC(GC(jO,1),Kie,323,0,[OMb,NMb,PMb,QMb])} +function sWb(){lWb();return OC(GC(SP,1),Kie,405,0,[hWb,kWb,iWb,jWb])} +function kbc(){gbc();return OC(GC(VS,1),Kie,360,0,[fbc,dbc,ebc,cbc])} +function Vc(a,b,c,d){return JD(c,54)?new Cg(a,b,c,d):new qg(a,b,c,d)} +function Djc(){Ajc();return OC(GC(mV,1),Kie,411,0,[wjc,xjc,yjc,zjc])} +function okc(a){var b;return a.j==(Ucd(),Rcd)&&(b=pkc(a),uqb(b,zcd))} +function Mdc(a,b){var c;c=b.a;QZb(c,b.c.d);RZb(c,b.d.d);q7c(c.a,a.n)} +function Smc(a,b){return BD(Btb(QAb(BD(Qc(a.k,b),15).Oc(),Hmc)),113)} +function Tmc(a,b){return BD(Btb(RAb(BD(Qc(a.k,b),15).Oc(),Hmc)),113)} +function _w(a){return new Kub(rmb(BD(a.a.dd(),14).gc(),a.a.cd()),16)} +function Qq(a){if(JD(a,14)){return BD(a,14).dc()}return !a.Kc().Ob()} +function ugc(a){qgc();if(JD(a.g,145)){return BD(a.g,145)}return null} +function Ko(a){if(a.e.g!=a.b){throw vbb(new Apb)}return !!a.c&&a.d>0} +function Xsb(a){sCb(a.b!=a.d.c);a.c=a.b;a.b=a.b.a;++a.a;return a.c.c} +function Xjb(a,b){uCb(b);NC(a.a,a.c,b);a.c=a.c+1&a.a.length-1;_jb(a)} +function Wjb(a,b){uCb(b);a.b=a.b-1&a.a.length-1;NC(a.a,a.b,b);_jb(a)} +function A2c(a,b){var c;for(c=a.j.c.length;c0&&$fb(a.g,0,b,0,a.i);return b} +function qEd(a,b){pEd();var c;c=BD(Ohb(oEd,a),55);return !c||c.wj(b)} +function Twd(a){if(a.p!=1)throw vbb(new Ydb);return Tbb(a.f)<<24>>24} +function axd(a){if(a.p!=1)throw vbb(new Ydb);return Tbb(a.k)<<24>>24} +function gxd(a){if(a.p!=7)throw vbb(new Ydb);return Tbb(a.k)<<16>>16} +function Zwd(a){if(a.p!=7)throw vbb(new Ydb);return Tbb(a.f)<<16>>16} +function sr(a){var b;b=0;while(a.Ob()){a.Pb();b=wbb(b,1)}return Oy(b)} +function nx(a,b){var c;c=new Vfb;a.xd(c);c.a+='..';b.yd(c);return c.a} +function Sgc(a,b,c){var d;d=BD(Ohb(a.g,c),57);Ekb(a.a.c,new vgd(b,d))} +function VCb(a,b,c){return Ddb(ED(Wd(irb(a.f,b))),ED(Wd(irb(a.f,c))))} +function E2d(a,b,c){return F2d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function L2d(a,b,c){return M2d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function q3d(a,b,c){return r3d(a,b,c,JD(b,99)&&(BD(b,18).Bb&Tje)!=0)} +function JJc(a,b){return a==(j0b(),h0b)&&b==h0b?4:a==h0b||b==h0b?8:32} +function Nd(a,b){return PD(b)===PD(a)?'(this Map)':b==null?Xhe:fcb(b)} +function kFd(a,b){return BD(b==null?Wd(irb(a.f,null)):Crb(a.g,b),281)} +function Rqd(a,b,c){var d;d=Wpd(c);Rhb(a.b,d,b);Rhb(a.c,b,c);return b} +function Bfd(a,b){var c;c=b;while(c){O6c(a,c.i,c.j);c=Xod(c)}return a} +function kt(a,b){var c;c=vmb(Nu(new wu(a,b)));ir(new wu(a,b));return c} +function R6d(a,b){Q6d();var c;c=BD(a,66).Mj();kVd(c,b);return c.Ok(b)} +function TOc(a,b,c,d,e){var f;f=OOc(e,c,d);Ekb(b,tOc(e,f));XOc(a,e,b)} +function mic(a,b,c){a.i=0;a.e=0;if(b==c){return}lic(a,b,c);kic(a,b,c)} +function dB(a,b){var c;c=a.q.getHours();a.q.setFullYear(b+nje);YA(a,c)} +function dC(d,a,b){if(b){var c=b.ee();d.a[a]=c(b)}else{delete d.a[a]}} +function vB(d,a,b){if(b){var c=b.ee();b=c(b)}else{b=undefined}d.a[a]=b} +function pCb(a){if(a<0){throw vbb(new Feb('Negative array size: '+a))}} +function VKd(a){if(!a.n){$Kd(a);a.n=new JMd(a,j5,a);_Kd(a)}return a.n} +function Fqb(a){sCb(a.a=0&&a.a[c]===b[c];c--);return c<0} +function Ucc(a,b){Occ();var c;c=a.j.g-b.j.g;if(c!=0){return c}return 0} +function Dtb(a,b){uCb(b);if(a.a!=null){return Itb(b.Kb(a.a))}return ztb} +function Gx(a){var b;if(a){return new Bsb(a)}b=new zsb;Jq(b,a);return b} +function GAb(a,b){var c;return b.b.Kb(SAb(a,b.c.Ee(),(c=new TBb(b),c)))} +function Hub(a){zub();Eub(this,Tbb(xbb(Obb(a,24),nke)),Tbb(xbb(a,nke)))} +function REb(){REb=ccb;QEb=as((MEb(),OC(GC(aN,1),Kie,428,0,[LEb,KEb])))} +function ZEb(){ZEb=ccb;YEb=as((UEb(),OC(GC(bN,1),Kie,427,0,[SEb,TEb])))} +function aSb(){aSb=ccb;_Rb=as((XRb(),OC(GC(gP,1),Kie,424,0,[VRb,WRb])))} +function D5b(){D5b=ccb;C5b=as((y5b(),OC(GC(ZR,1),Kie,511,0,[x5b,w5b])))} +function Cqc(){Cqc=ccb;Bqc=as((xqc(),OC(GC(JW,1),Kie,419,0,[vqc,wqc])))} +function erc(){erc=ccb;drc=as((_qc(),OC(GC(MW,1),Kie,479,0,[$qc,Zqc])))} +function eBc(){eBc=ccb;dBc=as((_Ac(),OC(GC(fX,1),Kie,376,0,[$Ac,ZAc])))} +function GAc(){GAc=ccb;FAc=as((BAc(),OC(GC(cX,1),Kie,421,0,[zAc,AAc])))} +function Npc(){Npc=ccb;Mpc=as((Ipc(),OC(GC(FW,1),Kie,422,0,[Gpc,Hpc])))} +function rsc(){rsc=ccb;qsc=as((msc(),OC(GC(SW,1),Kie,420,0,[ksc,lsc])))} +function MOc(){MOc=ccb;LOc=as((HOc(),OC(GC(DZ,1),Kie,520,0,[GOc,FOc])))} +function ZIc(){ZIc=ccb;YIc=as((UIc(),OC(GC(mY,1),Kie,523,0,[TIc,SIc])))} +function bMc(){bMc=ccb;aMc=as((YLc(),OC(GC(fZ,1),Kie,516,0,[XLc,WLc])))} +function jMc(){jMc=ccb;iMc=as((eMc(),OC(GC(gZ,1),Kie,515,0,[cMc,dMc])))} +function KQc(){KQc=ccb;JQc=as((FQc(),OC(GC(YZ,1),Kie,455,0,[DQc,EQc])))} +function dUc(){dUc=ccb;cUc=as(($Tc(),OC(GC(F$,1),Kie,425,0,[ZTc,YTc])))} +function XUc(){XUc=ccb;WUc=as((PUc(),OC(GC(K$,1),Kie,495,0,[NUc,OUc])))} +function XTc(){XTc=ccb;WTc=as((STc(),OC(GC(E$,1),Kie,480,0,[QTc,RTc])))} +function lWc(){lWc=ccb;kWc=as((fWc(),OC(GC(X$,1),Kie,426,0,[dWc,eWc])))} +function i1c(){i1c=ccb;h1c=as((a1c(),OC(GC(X_,1),Kie,429,0,[_0c,$0c])))} +function H_c(){H_c=ccb;G_c=as((C_c(),OC(GC(P_,1),Kie,430,0,[B_c,A_c])))} +function UIc(){UIc=ccb;TIc=new VIc('UPPER',0);SIc=new VIc('LOWER',1)} +function Lqd(a,b){var c;c=new eC;Spd(c,'x',b.a);Spd(c,'y',b.b);Qpd(a,c)} +function Oqd(a,b){var c;c=new eC;Spd(c,'x',b.a);Spd(c,'y',b.b);Qpd(a,c)} +function Jic(a,b){var c,d;d=false;do{c=Mic(a,b);d=d|c}while(c);return d} +function zHc(a,b){var c,d;c=b;d=0;while(c>0){d+=a.a[c];c-=c&-c}return d} +function Cfd(a,b){var c;c=b;while(c){O6c(a,-c.i,-c.j);c=Xod(c)}return a} +function reb(a,b){var c,d;uCb(b);for(d=a.Kc();d.Ob();){c=d.Pb();b.td(c)}} +function me(a,b){var c;c=b.cd();return new Wo(c,a.e.pc(c,BD(b.dd(),14)))} +function Gsb(a,b,c,d){var e;e=new jtb;e.c=b;e.b=c;e.a=d;d.b=c.a=e;++a.b} +function Nkb(a,b,c){var d;d=(tCb(b,a.c.length),a.c[b]);a.c[b]=c;return d} +function lFd(a,b,c){return BD(b==null?jrb(a.f,null,c):Drb(a.g,b,c),281)} +function fRb(a){return !!a.c&&!!a.d?oRb(a.c)+'->'+oRb(a.d):'e_'+FCb(a)} +function FAb(a,b){return (Uzb(a),WAb(new YAb(a,new qBb(b,a.a)))).sd(DAb)} +function tUb(){qUb();return OC(GC(zP,1),Kie,356,0,[lUb,mUb,nUb,oUb,pUb])} +function _cd(){Ucd();return OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])} +function Dz(b){Az();return function(){return Ez(b,this,arguments);var a}} +function sz(){if(Date.now){return Date.now()}return (new Date).getTime()} +function OZb(a){if(!a.c||!a.d){return false}return !!a.c.i&&a.c.i==a.d.i} +function pv(a){if(!a.c.Sb()){throw vbb(new utb)}a.a=true;return a.c.Ub()} +function ko(a){a.i=0;Alb(a.b,null);Alb(a.c,null);a.a=null;a.e=null;++a.g} +function ycb(a){wcb.call(this,a==null?Xhe:fcb(a),JD(a,78)?BD(a,78):null)} +function PYb(a){MYb();yXb(this);this.a=new Psb;NYb(this,a);Dsb(this.a,a)} +function jYb(){Ckb(this);this.b=new f7c(Pje,Pje);this.a=new f7c(Qje,Qje)} +function rAb(a,b){this.c=0;this.b=b;jvb.call(this,a,17493);this.a=this.c} +function wyb(a){oyb();if(lyb){return}this.c=a;this.e=true;this.a=new Rkb} +function oyb(){oyb=ccb;lyb=true;jyb=false;kyb=false;nyb=false;myb=false} +function C3c(a,b){if(JD(b,149)){return dfb(a.c,BD(b,149).c)}return false} +function zUc(a,b){var c;c=0;!!a&&(c+=a.f.a/2);!!b&&(c+=b.f.a/2);return c} +function j4c(a,b){var c;c=BD(Wrb(a.d,b),23);return c?c:BD(Wrb(a.e,b),23)} +function Lzd(a){this.b=a;Fyd.call(this,a);this.a=BD(Ajd(this.b.a,4),126)} +function Uzd(a){this.b=a;$yd.call(this,a);this.a=BD(Ajd(this.b.a,4),126)} +function $Kd(a){if(!a.t){a.t=new YMd(a);vtd(new c0d(a),0,a.t)}return a.t} +function kad(){ead();return OC(GC(t1,1),Kie,103,0,[cad,bad,aad,_9c,dad])} +function Wbd(){Tbd();return OC(GC(C1,1),Kie,249,0,[Qbd,Sbd,Obd,Pbd,Rbd])} +function Q5c(){N5c();return OC(GC(e1,1),Kie,175,0,[L5c,K5c,I5c,M5c,J5c])} +function Q_c(){N_c();return OC(GC(Q_,1),Kie,316,0,[I_c,J_c,M_c,K_c,L_c])} +function _zc(){Vzc();return OC(GC(_W,1),Kie,315,0,[Uzc,Rzc,Szc,Qzc,Tzc])} +function sqc(){mqc();return OC(GC(IW,1),Kie,335,0,[iqc,hqc,kqc,lqc,jqc])} +function n$c(){k$c();return OC(GC(y_,1),Kie,355,0,[g$c,f$c,i$c,h$c,j$c])} +function _jc(){Xjc();return OC(GC(uV,1),Kie,363,0,[Tjc,Vjc,Wjc,Ujc,Sjc])} +function Ftc(){Ctc();return OC(GC(TW,1),Kie,163,0,[Btc,xtc,ytc,ztc,Atc])} +function T0d(){T0d=ccb;var a,b;R0d=(LFd(),b=new MPd,b);S0d=(a=new OJd,a)} +function yUd(a){var b;if(!a.c){b=a.r;JD(b,88)&&(a.c=BD(b,26))}return a.c} +function zc(a){a.e=3;a.d=a.Yb();if(a.e!=2){a.e=0;return true}return false} +function RC(a){var b,c,d;b=a&Eje;c=a>>22&Eje;d=a<0?Fje:0;return TC(b,c,d)} +function uy(a){var b,c,d,e;for(c=a,d=0,e=c.length;d0?ihb(a,b):lhb(a,-b)} +function Rgb(a,b){if(b==0||a.e==0){return a}return b>0?lhb(a,b):ihb(a,-b)} +function Rr(a){if(Qr(a)){a.c=a.a;return a.a.Pb()}else{throw vbb(new utb)}} +function Yac(a){var b,c;b=a.c.i;c=a.d.i;return b.k==(j0b(),e0b)&&c.k==e0b} +function kZb(a){var b;b=new UZb;tNb(b,a);yNb(b,(Nyc(),jxc),null);return b} +function hid(a,b,c){var d;return d=a.Yg(b),d>=0?a._g(d,c,true):sid(a,b,c)} +function uHb(a,b,c,d){var e;for(e=0;eb){throw vbb(new qcb(Jb(a,b,'index')))}return a} +function zhb(a,b,c,d){var e;e=KC(WD,oje,25,b,15,1);Ahb(e,a,b,c,d);return e} +function _A(a,b){var c;c=a.q.getHours()+(b/60|0);a.q.setMinutes(b);YA(a,c)} +function A$c(a,b){return $wnd.Math.min(S6c(b.a,a.d.d.c),S6c(b.b,a.d.d.c))} +function Thb(a,b){return ND(b)?b==null?krb(a.f,null):Erb(a.g,b):krb(a.f,b)} +function b1b(a){this.c=a;this.a=new olb(this.c.a);this.b=new olb(this.c.b)} +function kRb(){this.e=new Rkb;this.c=new Rkb;this.d=new Rkb;this.b=new Rkb} +function MFb(){this.g=new PFb;this.b=new PFb;this.a=new Rkb;this.k=new Rkb} +function Gjc(a,b,c){this.a=a;this.c=b;this.d=c;Ekb(b.e,this);Ekb(c.b,this)} +function wBb(a,b){fvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function CBb(a,b){jvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function IBb(a,b){nvb.call(this,b.rd(),b.qd()&-6);uCb(a);this.a=a;this.b=b} +function BQc(a,b,c){this.a=a;this.b=b;this.c=c;Ekb(a.t,this);Ekb(b.i,this)} +function SRc(){this.b=new Psb;this.a=new Psb;this.b=new Psb;this.a=new Psb} +function g6c(){g6c=ccb;f6c=new Lsd('org.eclipse.elk.labels.labelManager')} +function Vac(){Vac=ccb;Uac=new Msd('separateLayerConnections',(gbc(),fbc))} +function HOc(){HOc=ccb;GOc=new IOc('REGULAR',0);FOc=new IOc('CRITICAL',1)} +function _Ac(){_Ac=ccb;$Ac=new aBc('STACKED',0);ZAc=new aBc('SEQUENCED',1)} +function C_c(){C_c=ccb;B_c=new D_c('FIXED',0);A_c=new D_c('CENTER_NODE',1)} +function PHc(a,b){var c;c=VHc(a,b);a.b=new BHc(c.c.length);return OHc(a,c)} +function KAd(a,b,c){var d;++a.e;--a.f;d=BD(a.d[b].$c(c),133);return d.dd()} +function JJd(a){var b;if(!a.a){b=a.r;JD(b,148)&&(a.a=BD(b,148))}return a.a} +function poc(a){if(a.a){if(a.e){return poc(a.e)}}else{return a}return null} +function ODc(a,b){if(a.pb.p){return -1}return 0} +function pvb(a,b){uCb(b);if(a.c=0,'Initial capacity must not be negative')} +function lHb(){lHb=ccb;kHb=as((gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])))} +function SHb(){SHb=ccb;RHb=as((NHb(),OC(GC(sN,1),Kie,461,0,[LHb,KHb,MHb])))} +function JIb(){JIb=ccb;IIb=as((EIb(),OC(GC(zN,1),Kie,462,0,[DIb,CIb,BIb])))} +function Kyb(){Kyb=ccb;Jyb=as((Fyb(),OC(GC(xL,1),Kie,132,0,[Cyb,Dyb,Eyb])))} +function DTb(){DTb=ccb;CTb=as((yTb(),OC(GC(oP,1),Kie,379,0,[wTb,vTb,xTb])))} +function WXb(){WXb=ccb;VXb=as((RXb(),OC(GC(hQ,1),Kie,423,0,[QXb,PXb,OXb])))} +function Zpc(){Zpc=ccb;Ypc=as((Rpc(),OC(GC(GW,1),Kie,314,0,[Ppc,Opc,Qpc])))} +function gqc(){gqc=ccb;fqc=as((bqc(),OC(GC(HW,1),Kie,337,0,[$pc,aqc,_pc])))} +function Lqc(){Lqc=ccb;Kqc=as((Gqc(),OC(GC(KW,1),Kie,450,0,[Eqc,Dqc,Fqc])))} +function Kkc(){Kkc=ccb;Jkc=as((Fkc(),OC(GC(vV,1),Kie,361,0,[Ekc,Dkc,Ckc])))} +function jsc(){jsc=ccb;isc=as((esc(),OC(GC(RW,1),Kie,303,0,[csc,dsc,bsc])))} +function asc(){asc=ccb;_rc=as((Xrc(),OC(GC(QW,1),Kie,292,0,[Vrc,Wrc,Urc])))} +function Dzc(){Dzc=ccb;Czc=as((xzc(),OC(GC(ZW,1),Kie,378,0,[uzc,vzc,wzc])))} +function YAc(){YAc=ccb;XAc=as((TAc(),OC(GC(eX,1),Kie,375,0,[QAc,RAc,SAc])))} +function yAc(){yAc=ccb;xAc=as((tAc(),OC(GC(bX,1),Kie,339,0,[rAc,qAc,sAc])))} +function PAc(){PAc=ccb;OAc=as((KAc(),OC(GC(dX,1),Kie,452,0,[JAc,HAc,IAc])))} +function QBc(){QBc=ccb;PBc=as((LBc(),OC(GC(jX,1),Kie,377,0,[JBc,KBc,IBc])))} +function yBc(){yBc=ccb;xBc=as((tBc(),OC(GC(hX,1),Kie,336,0,[qBc,rBc,sBc])))} +function HBc(){HBc=ccb;GBc=as((CBc(),OC(GC(iX,1),Kie,338,0,[BBc,zBc,ABc])))} +function wGc(){wGc=ccb;vGc=as((rGc(),OC(GC(PX,1),Kie,454,0,[oGc,pGc,qGc])))} +function zVc(){zVc=ccb;yVc=as((tVc(),OC(GC(O$,1),Kie,442,0,[sVc,qVc,rVc])))} +function vWc(){vWc=ccb;uWc=as((pWc(),OC(GC(Y$,1),Kie,380,0,[mWc,nWc,oWc])))} +function EYc(){EYc=ccb;DYc=as((zYc(),OC(GC(q_,1),Kie,381,0,[xYc,yYc,wYc])))} +function yXc(){yXc=ccb;xXc=as((sXc(),OC(GC(b_,1),Kie,293,0,[qXc,rXc,pXc])))} +function b_c(){b_c=ccb;a_c=as((Y$c(),OC(GC(J_,1),Kie,437,0,[V$c,W$c,X$c])))} +function mbd(){mbd=ccb;lbd=as((hbd(),OC(GC(z1,1),Kie,334,0,[fbd,ebd,gbd])))} +function vad(){vad=ccb;uad=as((qad(),OC(GC(u1,1),Kie,272,0,[nad,oad,pad])))} +function icd(){dcd();return OC(GC(D1,1),Kie,98,0,[ccd,bcd,acd,Zbd,_bd,$bd])} +function ikd(a,b){return !a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),qAd(a.o,b)} +function NAd(a){!a.g&&(a.g=new JCd);!a.g.d&&(a.g.d=new MBd(a));return a.g.d} +function yAd(a){!a.g&&(a.g=new JCd);!a.g.a&&(a.g.a=new SBd(a));return a.g.a} +function EAd(a){!a.g&&(a.g=new JCd);!a.g.b&&(a.g.b=new GBd(a));return a.g.b} +function FAd(a){!a.g&&(a.g=new JCd);!a.g.c&&(a.g.c=new iCd(a));return a.g.c} +function A2d(a,b,c){var d,e;e=new p4d(b,a);for(d=0;dc||b=0?a._g(c,true,true):sid(a,b,true)} +function s6b(a,b){return Kdb(Edb(ED(vNb(a,(wtc(),htc)))),Edb(ED(vNb(b,htc))))} +function pUc(){pUc=ccb;oUc=b3c(b3c(g3c(new j3c,(yRc(),vRc)),(qSc(),pSc)),lSc)} +function IHc(a,b,c){var d;d=SHc(a,b,c);a.b=new BHc(d.c.length);return KHc(a,d)} +function qhe(a){if(a.b<=0)throw vbb(new utb);--a.b;a.a-=a.c.c;return meb(a.a)} +function ptd(a){var b;if(!a.a){throw vbb(new vtb)}b=a.a;a.a=Xod(a.a);return b} +function dBb(a){while(!a.a){if(!HBb(a.c,new hBb(a))){return false}}return true} +function vr(a){var b;Qb(a);if(JD(a,198)){b=BD(a,198);return b}return new wr(a)} +function r3c(a){p3c();BD(a.We((Y9c(),x9c)),174).Fc((rcd(),ocd));a.Ye(w9c,null)} +function p3c(){p3c=ccb;m3c=new v3c;o3c=new x3c;n3c=mn((Y9c(),w9c),m3c,b9c,o3c)} +function fWc(){fWc=ccb;dWc=new hWc('LEAF_NUMBER',0);eWc=new hWc('NODE_SIZE',1)} +function UMc(a,b,c){a.a=b;a.c=c;a.b.a.$b();Osb(a.d);a.e.a.c=KC(SI,Uhe,1,0,5,1)} +function yHc(a){a.a=KC(WD,oje,25,a.b+1,15,1);a.c=KC(WD,oje,25,a.b,15,1);a.d=0} +function MWb(a,b){if(a.a.ue(b.d,a.b)>0){Ekb(a.c,new dWb(b.c,b.d,a.d));a.b=b.d}} +function nud(a,b){if(a.g==null||b>=a.i)throw vbb(new $zd(b,a.i));return a.g[b]} +function pOd(a,b,c){Itd(a,c);if(c!=null&&!a.wj(c)){throw vbb(new tcb)}return c} +function KLd(a){var b;if(a.Ek()){for(b=a.i-1;b>=0;--b){qud(a,b)}}return wud(a)} +function Bwb(a){var b,c;if(!a.b){return null}c=a.b;while(b=c.a[0]){c=b}return c} +function ulb(a,b){var c,d;pCb(b);return c=(d=a.slice(0,b),PC(d,a)),c.length=b,c} +function Klb(a,b,c,d){var e;d=(ipb(),!d?fpb:d);e=a.slice(b,c);Llb(e,a,b,c,-b,d)} +function bid(a,b,c,d,e){return b<0?sid(a,c,d):BD(c,66).Nj().Pj(a,a.yh(),b,d,e)} +function hZd(a){if(JD(a,172)){return ''+BD(a,172).a}return a==null?null:fcb(a)} +function iZd(a){if(JD(a,172)){return ''+BD(a,172).a}return a==null?null:fcb(a)} +function nDb(a,b){if(b.a){throw vbb(new hz(Hke))}Qqb(a.a,b);b.a=a;!a.j&&(a.j=b)} +function qBb(a,b){nvb.call(this,b.rd(),b.qd()&-16449);uCb(a);this.a=a;this.c=b} +function Ti(a,b){var c,d;d=b/a.c.Hd().gc()|0;c=b%a.c.Hd().gc();return Mi(a,d,c)} +function NHb(){NHb=ccb;LHb=new OHb(jle,0);KHb=new OHb(gle,1);MHb=new OHb(kle,2)} +function lxb(){lxb=ccb;hxb=new mxb('All',0);ixb=new rxb;jxb=new txb;kxb=new wxb} +function zxb(){zxb=ccb;yxb=as((lxb(),OC(GC(iL,1),Kie,297,0,[hxb,ixb,jxb,kxb])))} +function uWb(){uWb=ccb;tWb=as((lWb(),OC(GC(SP,1),Kie,405,0,[hWb,kWb,iWb,jWb])))} +function ALb(){ALb=ccb;zLb=as((vLb(),OC(GC(PN,1),Kie,406,0,[uLb,rLb,sLb,tLb])))} +function WMb(){WMb=ccb;VMb=as((RMb(),OC(GC(jO,1),Kie,323,0,[OMb,NMb,PMb,QMb])))} +function WOb(){WOb=ccb;VOb=as((ROb(),OC(GC(CO,1),Kie,394,0,[OOb,NOb,POb,QOb])))} +function GRc(){GRc=ccb;FRc=as((yRc(),OC(GC(h$,1),Kie,393,0,[uRc,vRc,wRc,xRc])))} +function mbc(){mbc=ccb;lbc=as((gbc(),OC(GC(VS,1),Kie,360,0,[fbc,dbc,ebc,cbc])))} +function oXc(){oXc=ccb;nXc=as((iXc(),OC(GC(a_,1),Kie,340,0,[hXc,fXc,gXc,eXc])))} +function Fjc(){Fjc=ccb;Ejc=as((Ajc(),OC(GC(mV,1),Kie,411,0,[wjc,xjc,yjc,zjc])))} +function Pzc(){Pzc=ccb;Ozc=as((Izc(),OC(GC($W,1),Kie,197,0,[Gzc,Hzc,Fzc,Ezc])))} +function ugd(){ugd=ccb;tgd=as((pgd(),OC(GC(k2,1),Kie,396,0,[mgd,ngd,lgd,ogd])))} +function xbd(){xbd=ccb;wbd=as((rbd(),OC(GC(A1,1),Kie,285,0,[qbd,nbd,obd,pbd])))} +function Fad(){Fad=ccb;Ead=as((Aad(),OC(GC(v1,1),Kie,218,0,[zad,xad,wad,yad])))} +function Ied(){Ied=ccb;Hed=as((Ded(),OC(GC(O1,1),Kie,311,0,[Ced,zed,Bed,Aed])))} +function ydd(){ydd=ccb;xdd=as((tdd(),OC(GC(I1,1),Kie,374,0,[rdd,sdd,qdd,pdd])))} +function A9d(){A9d=ccb;Smd();x9d=Pje;w9d=Qje;z9d=new Ndb(Pje);y9d=new Ndb(Qje)} +function _qc(){_qc=ccb;$qc=new arc(ane,0);Zqc=new arc('IMPROVE_STRAIGHTNESS',1)} +function eIc(a,b){FHc();return Ekb(a,new vgd(b,meb(b.e.c.length+b.g.c.length)))} +function gIc(a,b){FHc();return Ekb(a,new vgd(b,meb(b.e.c.length+b.g.c.length)))} +function PC(a,b){HC(b)!=10&&OC(rb(b),b.hm,b.__elementTypeId$,HC(b),a);return a} +function Lkb(a,b){var c;c=Jkb(a,b,0);if(c==-1){return false}Kkb(a,c);return true} +function Zrb(a,b){var c;c=BD(Thb(a.e,b),387);if(c){jsb(c);return c.e}return null} +function Jbb(a){var b;if(Fbb(a)){b=0-a;if(!isNaN(b)){return b}}return zbb(hD(a))} +function Jkb(a,b,c){for(;c=0?fid(a,c,true,true):sid(a,b,true)} +function vgc(a,b){qgc();var c,d;c=ugc(a);d=ugc(b);return !!c&&!!d&&!omb(c.k,d.k)} +function Gqd(a,b){dld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Hqd(a,b){eld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Iqd(a,b){cld(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function Jqd(a,b){ald(a,b==null||Ldb((uCb(b),b))||isNaN((uCb(b),b))?0:(uCb(b),b))} +function agd(a){(!this.q?(mmb(),mmb(),kmb):this.q).Ac(!a.q?(mmb(),mmb(),kmb):a.q)} +function S2d(a,b){return JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a)} +function U2d(a,b){return JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a)} +function INb(a,b){HNb=new tOb;FNb=b;GNb=a;BD(GNb.b,65);KNb(GNb,HNb,null);JNb(GNb)} +function uud(a,b,c){var d;d=a.g[b];mud(a,b,a.oi(b,c));a.gi(b,c,d);a.ci();return d} +function Ftd(a,b){var c;c=a.Xc(b);if(c>=0){a.$c(c);return true}else{return false}} +function YId(a){var b;if(a.d!=a.r){b=wId(a);a.e=!!b&&b.Cj()==Bve;a.d=b}return a.e} +function fr(a,b){var c;Qb(a);Qb(b);c=false;while(b.Ob()){c=c|a.Fc(b.Pb())}return c} +function Wrb(a,b){var c;c=BD(Ohb(a.e,b),387);if(c){Yrb(a,c);return c.e}return null} +function UA(a){var b,c;b=a/60|0;c=a%60;if(c==0){return ''+b}return ''+b+':'+(''+c)} +function LAb(a,b){var c,d;Uzb(a);d=new IBb(b,a.a);c=new fBb(d);return new YAb(a,c)} +function tB(d,a){var b=d.a[a];var c=(rC(),qC)[typeof b];return c?c(b):xC(typeof b)} +function yzc(a){switch(a.g){case 0:return Ohe;case 1:return -1;default:return 0;}} +function oD(a){if(eD(a,(wD(),vD))<0){return -aD(hD(a))}return a.l+a.m*Hje+a.h*Ije} +function HC(a){return a.__elementTypeCategory$==null?10:a.__elementTypeCategory$} +function dub(a){var b;b=a.b.c.length==0?null:Ikb(a.b,0);b!=null&&fub(a,0);return b} +function uA(a,b){while(b[0]=0){++b[0]}} +function sgb(a,b){this.e=b;this.a=vgb(a);this.a<54?(this.f=Sbb(a)):(this.c=ghb(a))} +function vge(a,b,c,d){wfe();xfe.call(this,26);this.c=a;this.a=b;this.d=c;this.b=d} +function EA(a,b,c){var d,e;d=10;for(e=0;ea.a[d]&&(d=c)}return d} +function fic(a,b){var c;c=Jy(a.e.c,b.e.c);if(c==0){return Kdb(a.e.d,b.e.d)}return c} +function Ogb(a,b){if(b.e==0){return Ggb}if(a.e==0){return Ggb}return Dhb(),Ehb(a,b)} +function nCb(a,b){if(!a){throw vbb(new Wdb(DCb('Enum constant undefined: %s',b)))}} +function AWb(){AWb=ccb;xWb=new XWb;yWb=new _Wb;vWb=new dXb;wWb=new hXb;zWb=new lXb} +function UEb(){UEb=ccb;SEb=new VEb('BY_SIZE',0);TEb=new VEb('BY_SIZE_AND_SHAPE',1)} +function XRb(){XRb=ccb;VRb=new YRb('EADES',0);WRb=new YRb('FRUCHTERMAN_REINGOLD',1)} +function xqc(){xqc=ccb;vqc=new yqc('READING_DIRECTION',0);wqc=new yqc('ROTATION',1)} +function uqc(){uqc=ccb;tqc=as((mqc(),OC(GC(IW,1),Kie,335,0,[iqc,hqc,kqc,lqc,jqc])))} +function bAc(){bAc=ccb;aAc=as((Vzc(),OC(GC(_W,1),Kie,315,0,[Uzc,Rzc,Szc,Qzc,Tzc])))} +function bkc(){bkc=ccb;akc=as((Xjc(),OC(GC(uV,1),Kie,363,0,[Tjc,Vjc,Wjc,Ujc,Sjc])))} +function Htc(){Htc=ccb;Gtc=as((Ctc(),OC(GC(TW,1),Kie,163,0,[Btc,xtc,ytc,ztc,Atc])))} +function S_c(){S_c=ccb;R_c=as((N_c(),OC(GC(Q_,1),Kie,316,0,[I_c,J_c,M_c,K_c,L_c])))} +function S5c(){S5c=ccb;R5c=as((N5c(),OC(GC(e1,1),Kie,175,0,[L5c,K5c,I5c,M5c,J5c])))} +function p$c(){p$c=ccb;o$c=as((k$c(),OC(GC(y_,1),Kie,355,0,[g$c,f$c,i$c,h$c,j$c])))} +function vUb(){vUb=ccb;uUb=as((qUb(),OC(GC(zP,1),Kie,356,0,[lUb,mUb,nUb,oUb,pUb])))} +function mad(){mad=ccb;lad=as((ead(),OC(GC(t1,1),Kie,103,0,[cad,bad,aad,_9c,dad])))} +function Ybd(){Ybd=ccb;Xbd=as((Tbd(),OC(GC(C1,1),Kie,249,0,[Qbd,Sbd,Obd,Pbd,Rbd])))} +function cdd(){cdd=ccb;bdd=as((Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])))} +function _1c(a,b){var c;c=BD(Ohb(a.a,b),134);if(!c){c=new zNb;Rhb(a.a,b,c)}return c} +function hoc(a){var b;b=BD(vNb(a,(wtc(),usc)),305);if(b){return b.a==a}return false} +function ioc(a){var b;b=BD(vNb(a,(wtc(),usc)),305);if(b){return b.i==a}return false} +function Jub(a,b){uCb(b);Iub(a);if(a.d.Ob()){b.td(a.d.Pb());return true}return false} +function Oy(a){if(ybb(a,Ohe)>0){return Ohe}if(ybb(a,Rie)<0){return Rie}return Tbb(a)} +function Cv(a){if(a<3){Xj(a,Hie);return a+1}if(a=0&&b=-0.01&&a.a<=ple&&(a.a=0);a.b>=-0.01&&a.b<=ple&&(a.b=0);return a} +function sfb(a,b){return b==(ntb(),ntb(),mtb)?a.toLocaleLowerCase():a.toLowerCase()} +function idb(a){return ((a.i&2)!=0?'interface ':(a.i&1)!=0?'':'class ')+(fdb(a),a.o)} +function Pnd(a){var b,c;c=(b=new SSd,b);wtd((!a.q&&(a.q=new cUd(n5,a,11,10)),a.q),c)} +function Pdd(a,b){var c;c=b>0?b-1:b;return Vdd(Wdd(Xdd(Ydd(new Zdd,c),a.n),a.j),a.k)} +function u2d(a,b,c,d){var e;a.j=-1;Qxd(a,I2d(a,b,c),(Q6d(),e=BD(b,66).Mj(),e.Ok(d)))} +function VWb(a){this.g=a;this.f=new Rkb;this.a=$wnd.Math.min(this.g.c.c,this.g.d.c)} +function mDb(a){this.b=new Rkb;this.a=new Rkb;this.c=new Rkb;this.d=new Rkb;this.e=a} +function Cnc(a,b){this.a=new Lqb;this.e=new Lqb;this.b=(xzc(),wzc);this.c=a;this.b=b} +function bIb(a,b,c){$Gb.call(this);THb(this);this.a=a;this.c=c;this.b=b.d;this.f=b.e} +function yd(a){this.d=a;this.c=a.c.vc().Kc();this.b=null;this.a=null;this.e=(hs(),gs)} +function zud(a){if(a<0){throw vbb(new Wdb('Illegal Capacity: '+a))}this.g=this.ri(a)} +function avb(a,b){if(0>a||a>b){throw vbb(new scb('fromIndex: 0, toIndex: '+a+oke+b))}} +function Gs(a){var b;if(a.a==a.b.a){throw vbb(new utb)}b=a.a;a.c=b;a.a=a.a.e;return b} +function Zsb(a){var b;yCb(!!a.c);b=a.c.a;Nsb(a.d,a.c);a.b==a.c?(a.b=b):--a.a;a.c=null} +function VAb(a,b){var c;Uzb(a);c=new lBb(a,a.a.rd(),a.a.qd()|4,b);return new YAb(a,c)} +function ke(a,b){var c,d;c=BD(Hv(a.d,b),14);if(!c){return null}d=b;return a.e.pc(d,c)} +function xac(a,b){var c,d;for(d=a.Kc();d.Ob();){c=BD(d.Pb(),70);yNb(c,(wtc(),Ssc),b)}} +function t9b(a){var b;b=Edb(ED(vNb(a,(Nyc(),Zwc))));if(b<0){b=0;yNb(a,Zwc,b)}return b} +function ifc(a,b,c){var d;d=$wnd.Math.max(0,a.b/2-0.5);cfc(c,d,1);Ekb(b,new rfc(c,d))} +function NMc(a,b,c){var d;d=a.a.e[BD(b.a,10).p]-a.a.e[BD(c.a,10).p];return QD(Eeb(d))} +function iZb(a,b,c,d,e,f){var g;g=kZb(d);QZb(g,e);RZb(g,f);Rc(a.a,d,new BZb(g,b,c.f))} +function Bid(a,b){var c;c=YKd(a.Tg(),b);if(!c){throw vbb(new Wdb(ite+b+lte))}return c} +function ntd(a,b){var c;c=a;while(Xod(c)){c=Xod(c);if(c==b){return true}}return false} +function Uw(a,b){var c,d,e;d=b.a.cd();c=BD(b.a.dd(),14).gc();for(e=0;e0){a.a/=b;a.b/=b}return a} +function bKd(a){var b;if(a.w){return a.w}else{b=cKd(a);!!b&&!b.kh()&&(a.w=b);return b}} +function gZd(a){var b;if(a==null){return null}else{b=BD(a,190);return Umd(b,b.length)}} +function qud(a,b){if(a.g==null||b>=a.i)throw vbb(new $zd(b,a.i));return a.li(b,a.g[b])} +function Mmc(a){var b,c;b=a.a.d.j;c=a.c.d.j;while(b!=c){rqb(a.b,b);b=Xcd(b)}rqb(a.b,b)} +function Jmc(a){var b;for(b=0;b=14&&b<=16)));return a} +function dcb(a,b,c){var d=function(){return a.apply(d,arguments)};b.apply(d,c);return d} +function TLc(a,b,c){var d,e;d=b;do{e=Edb(a.p[d.p])+c;a.p[d.p]=e;d=a.a[d.p]}while(d!=b)} +function NQd(a,b){var c,d;d=a.a;c=OQd(a,b,null);d!=b&&!a.e&&(c=QQd(a,b,c));!!c&&c.Fi()} +function ADb(a,b){return Iy(),My(Qie),$wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)} +function Ky(a,b){Iy();My(Qie);return $wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)} +function Akc(a,b){gkc();return beb(a.b.c.length-a.e.c.length,b.b.c.length-b.e.c.length)} +function oo(a,b){return Kv(uo(a,b,Tbb(Ibb(Eie,keb(Tbb(Ibb(b==null?0:tb(b),Fie)),15)))))} +function o0b(){o0b=ccb;n0b=as((j0b(),OC(GC(NQ,1),Kie,267,0,[h0b,g0b,e0b,i0b,f0b,d0b])))} +function n8c(){n8c=ccb;m8c=as((i8c(),OC(GC(r1,1),Kie,291,0,[h8c,g8c,f8c,d8c,c8c,e8c])))} +function K7c(){K7c=ccb;J7c=as((F7c(),OC(GC(o1,1),Kie,248,0,[z7c,C7c,D7c,E7c,A7c,B7c])))} +function Fpc(){Fpc=ccb;Epc=as((Apc(),OC(GC(EW,1),Kie,227,0,[wpc,ypc,vpc,xpc,zpc,upc])))} +function Drc(){Drc=ccb;Crc=as((yrc(),OC(GC(OW,1),Kie,275,0,[wrc,trc,xrc,vrc,urc,rrc])))} +function qrc(){qrc=ccb;prc=as((lrc(),OC(GC(NW,1),Kie,274,0,[irc,hrc,krc,grc,jrc,frc])))} +function tzc(){tzc=ccb;szc=as((lzc(),OC(GC(YW,1),Kie,313,0,[jzc,hzc,fzc,gzc,kzc,izc])))} +function Yqc(){Yqc=ccb;Xqc=as((Sqc(),OC(GC(LW,1),Kie,276,0,[Nqc,Mqc,Pqc,Oqc,Rqc,Qqc])))} +function wSc(){wSc=ccb;vSc=as((qSc(),OC(GC(t$,1),Kie,327,0,[pSc,lSc,nSc,mSc,oSc,kSc])))} +function ycd(){ycd=ccb;xcd=as((rcd(),OC(GC(E1,1),Kie,273,0,[pcd,ncd,ocd,mcd,lcd,qcd])))} +function Rad(){Rad=ccb;Qad=as((Mad(),OC(GC(w1,1),Kie,312,0,[Kad,Iad,Lad,Gad,Jad,Had])))} +function Lbd(){Hbd();return OC(GC(B1,1),Kie,93,0,[zbd,ybd,Bbd,Gbd,Fbd,Ebd,Cbd,Dbd,Abd])} +function vkd(a,b){var c;c=a.a;a.a=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,0,c,a.a))} +function wkd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,1,c,a.b))} +function hmd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,3,c,a.b))} +function ald(a,b){var c;c=a.f;a.f=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,3,c,a.f))} +function cld(a,b){var c;c=a.g;a.g=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,4,c,a.g))} +function dld(a,b){var c;c=a.i;a.i=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,5,c,a.i))} +function eld(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,6,c,a.j))} +function omd(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,1,c,a.j))} +function imd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,4,c,a.c))} +function pmd(a,b){var c;c=a.k;a.k=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new lSd(a,2,c,a.k))} +function qQd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,2,c,a.d))} +function AId(a,b){var c;c=a.s;a.s=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,4,c,a.s))} +function DId(a,b){var c;c=a.t;a.t=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new mSd(a,5,c,a.t))} +function _Jd(a,b){var c;c=a.F;a.F=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,5,c,b))} +function izd(a,b){var c;c=BD(Ohb((pEd(),oEd),a),55);return c?c.xj(b):KC(SI,Uhe,1,b,5,1)} +function Xpd(a,b){var c,d;c=b in a.a;if(c){d=aC(a,b).he();if(d){return d.a}}return null} +function ftd(a,b){var c,d,e;c=(d=(Fhd(),e=new Jod,e),!!b&&God(d,b),d);Hod(c,a);return c} +function LLd(a,b,c){Itd(a,c);if(!a.Bk()&&c!=null&&!a.wj(c)){throw vbb(new tcb)}return c} +function Xdd(a,b){a.n=b;if(a.n){a.f=new Rkb;a.e=new Rkb}else{a.f=null;a.e=null}return a} +function ndb(a,b,c,d,e,f){var g;g=ldb(a,b);zdb(c,g);g.i=e?8:0;g.f=d;g.e=e;g.g=f;return g} +function rSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=1;this.c=a;this.a=c} +function tSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=2;this.c=a;this.a=c} +function BSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=6;this.c=a;this.a=c} +function GSd(a,b,c,d,e){this.d=b;this.k=d;this.f=e;this.o=-1;this.p=7;this.c=a;this.a=c} +function xSd(a,b,c,d,e){this.d=b;this.j=d;this.e=e;this.o=-1;this.p=4;this.c=a;this.a=c} +function rDb(a,b){var c,d,e,f;for(d=b,e=0,f=d.length;e=0);if(ekb(a.d,a.c)<0){a.a=a.a-1&a.d.a.length-1;a.b=a.d.c}a.c=-1} +function pgb(a){if(a.a<54){return a.f<0?-1:a.f>0?1:0}return (!a.c&&(a.c=fhb(a.f)),a.c).e} +function My(a){if(!(a>=0)){throw vbb(new Wdb('tolerance ('+a+') must be >= 0'))}return a} +function n4c(){if(!f4c){f4c=new m4c;l4c(f4c,OC(GC(C0,1),Uhe,130,0,[new Z9c]))}return f4c} +function KAc(){KAc=ccb;JAc=new LAc(ole,0);HAc=new LAc('INPUT',1);IAc=new LAc('OUTPUT',2)} +function bqc(){bqc=ccb;$pc=new cqc('ARD',0);aqc=new cqc('MSD',1);_pc=new cqc('MANUAL',2)} +function rGc(){rGc=ccb;oGc=new sGc('BARYCENTER',0);pGc=new sGc(Bne,1);qGc=new sGc(Cne,2)} +function ztd(a,b){var c;c=a.gc();if(b<0||b>c)throw vbb(new Cyd(b,c));return new czd(a,b)} +function JAd(a,b){var c;if(JD(b,42)){return a.c.Mc(b)}else{c=qAd(a,b);LAd(a,b);return c}} +function $nd(a,b,c){yId(a,b);pnd(a,c);AId(a,0);DId(a,1);CId(a,true);BId(a,true);return a} +function Xj(a,b){if(a<0){throw vbb(new Wdb(b+' cannot be negative but was: '+a))}return a} +function Bt(a,b){var c,d;for(c=0,d=a.gc();c0){return BD(Ikb(c.a,d-1),10)}return null} +function Lkd(a,b){var c;c=a.k;a.k=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,2,c,a.k))} +function kmd(a,b){var c;c=a.f;a.f=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,8,c,a.f))} +function lmd(a,b){var c;c=a.i;a.i=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,7,c,a.i))} +function Hod(a,b){var c;c=a.a;a.a=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,8,c,a.a))} +function zpd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,c,a.b))} +function UUd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,c,a.b))} +function VUd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.c))} +function Apd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.c))} +function pQd(a,b){var c;c=a.c;a.c=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,4,c,a.c))} +function PHd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,1,c,a.d))} +function jKd(a,b){var c;c=a.D;a.D=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,2,c,a.D))} +function Rdd(a,b){if(a.r>0&&a.c0&&a.g!=0&&Rdd(a.i,b/a.r*a.i.d)}} +function dge(a,b,c){var d;a.b=b;a.a=c;d=(a.a&512)==512?new hee:new ude;a.c=ode(d,a.b,a.a)} +function g3d(a,b){return T6d(a.e,b)?(Q6d(),YId(b)?new R7d(b,a):new f7d(b,a)):new c8d(b,a)} +function _o(a,b){return Fv(vo(a.a,b,Tbb(Ibb(Eie,keb(Tbb(Ibb(b==null?0:tb(b),Fie)),15)))))} +function Nyb(a,b,c){return Ayb(a,new Kzb(b),new Mzb,new Ozb(c),OC(GC(xL,1),Kie,132,0,[]))} +function pAb(a){var b,c;if(0>a){return new yAb}b=a+1;c=new rAb(b,a);return new vAb(null,c)} +function umb(a,b){mmb();var c;c=new Mqb(1);ND(a)?Shb(c,a,b):jrb(c.f,a,b);return new iob(c)} +function aMb(a,b){var c,d;c=a.o+a.p;d=b.o+b.p;if(cb){b<<=1;return b>0?b:Iie}return b} +function xc(a){Ub(a.e!=3);switch(a.e){case 2:return false;case 0:return true;}return zc(a)} +function T6c(a,b){var c;if(JD(b,8)){c=BD(b,8);return a.a==c.a&&a.b==c.b}else{return false}} +function _Mb(a,b,c){var d,e,f;f=b>>5;e=b&31;d=xbb(Pbb(a.n[c][f],Tbb(Nbb(e,1))),3);return d} +function IAd(a,b){var c,d;for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);HAd(a,c.cd(),c.dd())}} +function N1c(a,b){var c;c=new tOb;BD(b.b,65);BD(b.b,65);BD(b.b,65);Hkb(b.a,new T1c(a,c,b))} +function DUd(a,b){var c;c=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,21,c,a.b))} +function jmd(a,b){var c;c=a.d;a.d=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,11,c,a.d))} +function _Id(a,b){var c;c=a.j;a.j=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,13,c,a.j))} +function $jb(a,b,c){var d,e,f;f=a.a.length-1;for(e=a.b,d=0;d>>31}d!=0&&(a[c]=d)} +function rmb(a,b){mmb();var c,d;d=new Rkb;for(c=0;c0){this.g=this.ri(this.i+(this.i/8|0)+1);a.Qc(this.g)}} +function u3d(a,b){k2d.call(this,D9,a,b);this.b=this;this.a=S6d(a.Tg(),XKd(this.e.Tg(),this.c))} +function Ld(a,b){var c,d;uCb(b);for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);a.zc(c.cd(),c.dd())}} +function G2d(a,b,c){var d;for(d=c.Kc();d.Ob();){if(!E2d(a,b,d.Pb())){return false}}return true} +function sVd(a,b,c,d,e){var f;if(c){f=bLd(b.Tg(),a.c);e=c.gh(b,-1-(f==-1?d:f),null,e)}return e} +function tVd(a,b,c,d,e){var f;if(c){f=bLd(b.Tg(),a.c);e=c.ih(b,-1-(f==-1?d:f),null,e)}return e} +function Mgb(a){var b;if(a.b==-2){if(a.e==0){b=-1}else{for(b=0;a.a[b]==0;b++);}a.b=b}return a.b} +function Z4b(a){switch(a.g){case 2:return Ucd(),Tcd;case 4:return Ucd(),zcd;default:return a;}} +function $4b(a){switch(a.g){case 1:return Ucd(),Rcd;case 3:return Ucd(),Acd;default:return a;}} +function nkc(a){var b,c,d;return a.j==(Ucd(),Acd)&&(b=pkc(a),c=uqb(b,zcd),d=uqb(b,Tcd),d||d&&c)} +function oqb(a){var b,c;b=BD(a.e&&a.e(),9);c=BD(ZBb(b,b.length),9);return new xqb(b,c,b.length)} +function l7b(a,b){Odd(b,zne,1);UGb(TGb(new YGb((a$b(),new l$b(a,false,false,new T$b)))));Qdd(b)} +function Fcb(a,b){Bcb();return ND(a)?cfb(a,GD(b)):LD(a)?Ddb(a,ED(b)):KD(a)?Dcb(a,DD(b)):a.wd(b)} +function WZc(a,b){b.q=a;a.d=$wnd.Math.max(a.d,b.r);a.b+=b.d+(a.a.c.length==0?0:a.c);Ekb(a.a,b)} +function m6c(a,b){var c,d,e,f;e=a.c;c=a.c+a.b;f=a.d;d=a.d+a.a;return b.a>e&&b.af&&b.b1||a.Ob()){++a.a;a.g=0;b=a.i;a.Ob();return b}else{throw vbb(new utb)}} +function kNc(a){fNc();var b;if(!Lpb(eNc,a)){b=new hNc;b.a=a;Opb(eNc,a,b)}return BD(Mpb(eNc,a),635)} +function Rbb(a){var b,c,d,e;e=a;d=0;if(e<0){e+=Ije;d=Fje}c=QD(e/Hje);b=QD(e-c*Hje);return TC(b,c,d)} +function Ox(a){var b,c,d;d=0;for(c=new Gqb(a.a);c.a>22);e=a.h+b.h+(d>>22);return TC(c&Eje,d&Eje,e&Fje)} +function nD(a,b){var c,d,e;c=a.l-b.l;d=a.m-b.m+(c>>22);e=a.h-b.h+(d>>22);return TC(c&Eje,d&Eje,e&Fje)} +function bdb(a){var b;if(a<128){b=(ddb(),cdb)[a];!b&&(b=cdb[a]=new Xcb(a));return b}return new Xcb(a)} +function ubb(a){var b;if(JD(a,78)){return a}b=a&&a.__java$exception;if(!b){b=new lz(a);Sz(b)}return b} +function btd(a){if(JD(a,186)){return BD(a,118)}else if(!a){throw vbb(new Heb(gue))}else{return null}} +function Zjb(a,b){if(b==null){return false}while(a.a!=a.b){if(pb(b,vkb(a))){return true}}return false} +function kib(a){if(a.a.Ob()){return true}if(a.a!=a.d){return false}a.a=new orb(a.e.f);return a.a.Ob()} +function Gkb(a,b){var c,d;c=b.Pc();d=c.length;if(d==0){return false}bCb(a.c,a.c.length,c);return true} +function Vyb(a,b,c){var d,e;for(e=b.vc().Kc();e.Ob();){d=BD(e.Pb(),42);a.yc(d.cd(),d.dd(),c)}return a} +function yac(a,b){var c,d;for(d=new olb(a.b);d.a=0,'Negative initial capacity');mCb(b>=0,'Non-positive load factor');Uhb(this)} +function _Ed(a,b,c){if(a>=128)return false;return a<64?Kbb(xbb(Nbb(1,a),c),0):Kbb(xbb(Nbb(1,a-64),b),0)} +function bOb(a,b){if(!a||!b||a==b){return false}return Jy(a.b.c,b.b.c+b.b.b)<0&&Jy(b.b.c,a.b.c+a.b.b)<0} +function I4b(a){var b,c,d;c=a.n;d=a.o;b=a.d;return new J6c(c.a-b.b,c.b-b.d,d.a+(b.b+b.c),d.b+(b.d+b.a))} +function $ic(a){var b,c,d,e;for(c=a.a,d=0,e=c.length;dd)throw vbb(new Cyd(b,d));a.hi()&&(c=Dtd(a,c));return a.Vh(b,c)} +function xNb(a,b,c){return c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c)),a} +function yNb(a,b,c){c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c));return a} +function TQb(a){var b,c;c=new kRb;tNb(c,a);yNb(c,(HSb(),FSb),a);b=new Lqb;VQb(a,c,b);UQb(a,c,b);return c} +function j6c(a){i6c();var b,c,d;c=KC(m1,nie,8,2,0,1);d=0;for(b=0;b<2;b++){d+=0.5;c[b]=r6c(d,a)}return c} +function Mic(a,b){var c,d,e,f;c=false;d=a.a[b].length;for(f=0;f>=1);return b}} +function $C(a){var b,c;c=heb(a.h);if(c==32){b=heb(a.m);return b==32?heb(a.l)+32:b+20-10}else{return c-12}} +function bkb(a){var b;b=a.a[a.b];if(b==null){return null}NC(a.a,a.b,null);a.b=a.b+1&a.a.length-1;return b} +function EDc(a){var b,c;b=a.t-a.k[a.o.p]*a.d+a.j[a.o.p]>a.f;c=a.u+a.e[a.o.p]*a.d>a.f*a.s*a.d;return b||c} +function Iwb(a,b,c){var d,e;d=new exb(b,c);e=new fxb;a.b=Gwb(a,a.b,d,e);e.b||++a.c;a.b.b=false;return e.d} +function djc(a,b,c){var d,e,f,g;g=CHc(b,c);f=0;for(e=g.Kc();e.Ob();){d=BD(e.Pb(),11);Rhb(a.c,d,meb(f++))}} +function xVb(a){var b,c;for(c=new olb(a.a.b);c.ac&&(c=a[b])}return c} +function SHc(a,b,c){var d;d=new Rkb;UHc(a,b,d,(Ucd(),zcd),true,false);UHc(a,c,d,Tcd,false,false);return d} +function crd(a,b,c){var d,e,f,g;f=null;g=b;e=Ypd(g,'labels');d=new Hrd(a,c);f=(Dqd(d.a,d.b,e),e);return f} +function j1d(a,b,c,d){var e;e=r1d(a,b,c,d);if(!e){e=i1d(a,c,d);if(!!e&&!e1d(a,b,e)){return null}}return e} +function m1d(a,b,c,d){var e;e=s1d(a,b,c,d);if(!e){e=l1d(a,c,d);if(!!e&&!e1d(a,b,e)){return null}}return e} +function Xb(a,b){var c;for(c=0;c1||b>=0&&a.b<3} +function w7c(a){var b,c,d;b=new s7c;for(d=Jsb(a,0);d.b!=d.d.c;){c=BD(Xsb(d),8);St(b,0,new g7c(c))}return b} +function qVb(a){var b,c;for(c=new olb(a.a.b);c.ad?1:0} +function NYb(a,b){if(OYb(a,b)){Rc(a.b,BD(vNb(b,(wtc(),Esc)),21),b);Dsb(a.a,b);return true}else{return false}} +function d3b(a){var b,c;b=BD(vNb(a,(wtc(),gtc)),10);if(b){c=b.c;Lkb(c.a,b);c.a.c.length==0&&Lkb(Q_b(b).b,c)}} +function syb(a){if(lyb){return KC(qL,tke,572,0,0,1)}return BD(Qkb(a.a,KC(qL,tke,572,a.a.c.length,0,1)),842)} +function mn(a,b,c,d){Vm();return new wx(OC(GC(CK,1),zie,42,0,[(Wj(a,b),new Wo(a,b)),(Wj(c,d),new Wo(c,d))]))} +function Dnd(a,b,c){var d,e;e=(d=new SSd,d);$nd(e,b,c);wtd((!a.q&&(a.q=new cUd(n5,a,11,10)),a.q),e);return e} +function Zmd(a){var b,c,d,e;e=icb(Rmd,a);c=e.length;d=KC(ZI,nie,2,c,6,1);for(b=0;b=a.b.c.length){return}aub(a,2*b+1);c=2*b+2;c=0&&a[d]===b[d];d--);return d<0?0:Gbb(xbb(a[d],Yje),xbb(b[d],Yje))?-1:1} +function UFc(a,b){var c,d;for(d=Jsb(a,0);d.b!=d.d.c;){c=BD(Xsb(d),214);if(c.e.length>0){b.td(c);c.i&&_Fc(c)}}} +function nzd(a,b){var c,d;d=BD(Ajd(a.a,4),126);c=KC($3,hve,415,b,0,1);d!=null&&$fb(d,0,c,0,d.length);return c} +function JEd(a,b){var c;c=new NEd((a.f&256)!=0,a.i,a.a,a.d,(a.f&16)!=0,a.j,a.g,b);a.e!=null||(c.c=a);return c} +function Dc(a,b){var c,d;for(d=a.Zb().Cc().Kc();d.Ob();){c=BD(d.Pb(),14);if(c.Hc(b)){return true}}return false} +function oNb(a,b,c,d,e){var f,g;for(g=c;g<=e;g++){for(f=b;f<=d;f++){if(YMb(a,f,g)){return true}}}return false} +function Tt(a,b,c){var d,e,f,g;uCb(c);g=false;f=a.Zc(b);for(e=c.Kc();e.Ob();){d=e.Pb();f.Rb(d);g=true}return g} +function Dv(a,b){var c;if(a===b){return true}else if(JD(b,83)){c=BD(b,83);return Ax(Wm(a),c.vc())}return false} +function Nhb(a,b,c){var d,e;for(e=c.Kc();e.Ob();){d=BD(e.Pb(),42);if(a.re(b,d.dd())){return true}}return false} +function Hic(a,b,c){if(!a.d[b.p][c.p]){Gic(a,b,c);a.d[b.p][c.p]=true;a.d[c.p][b.p]=true}return a.a[b.p][c.p]} +function Itd(a,b){if(!a.ai()&&b==null){throw vbb(new Wdb("The 'no null' constraint is violated"))}return b} +function $Jd(a,b){if(a.D==null&&a.B!=null){a.D=a.B;a.B=null}jKd(a,b==null?null:(uCb(b),b));!!a.C&&a.yk(null)} +function XHc(a,b){var c;if(!a||a==b||!wNb(b,(wtc(),Psc))){return false}c=BD(vNb(b,(wtc(),Psc)),10);return c!=a} +function b4d(a){switch(a.i){case 2:{return true}case 1:{return false}case -1:{++a.c}default:{return a.pl()}}} +function c4d(a){switch(a.i){case -2:{return true}case -1:{return false}case 1:{--a.c}default:{return a.ql()}}} +function Xdb(a){Zy.call(this,'The given string does not match the expected format for individual spacings.',a)} +function pgd(){pgd=ccb;mgd=new qgd('ELK',0);ngd=new qgd('JSON',1);lgd=new qgd('DOT',2);ogd=new qgd('SVG',3)} +function pWc(){pWc=ccb;mWc=new rWc(ane,0);nWc=new rWc('RADIAL_COMPACTION',1);oWc=new rWc('WEDGE_COMPACTION',2)} +function Fyb(){Fyb=ccb;Cyb=new Gyb('CONCURRENT',0);Dyb=new Gyb('IDENTITY_FINISH',1);Eyb=new Gyb('UNORDERED',2)} +function nPb(){nPb=ccb;kPb=(cPb(),bPb);jPb=new Nsd(Tle,kPb);iPb=new Lsd(Ule);lPb=new Lsd(Vle);mPb=new Lsd(Wle)} +function Occ(){Occ=ccb;Mcc=new Zcc;Ncc=new _cc;Lcc=new bdc;Kcc=new fdc;Jcc=new jdc;Icc=(uCb(Jcc),new bpb)} +function tBc(){tBc=ccb;qBc=new uBc('CONSERVATIVE',0);rBc=new uBc('CONSERVATIVE_SOFT',1);sBc=new uBc('SLOPPY',2)} +function Zad(){Zad=ccb;Xad=new q0b(15);Wad=new Osd((Y9c(),f9c),Xad);Yad=C9c;Sad=s8c;Tad=Y8c;Vad=_8c;Uad=$8c} +function o7c(a,b,c){var d,e,f;d=new Psb;for(f=Jsb(c,0);f.b!=f.d.c;){e=BD(Xsb(f),8);Dsb(d,new g7c(e))}Tt(a,b,d)} +function r7c(a){var b,c,d;b=0;d=KC(m1,nie,8,a.b,0,1);c=Jsb(a,0);while(c.b!=c.d.c){d[b++]=BD(Xsb(c),8)}return d} +function $Pd(a){var b;b=(!a.a&&(a.a=new cUd(g5,a,9,5)),a.a);if(b.i!=0){return nQd(BD(qud(b,0),678))}return null} +function Ly(a,b){var c;c=wbb(a,b);if(Gbb(Vbb(a,b),0)|Ebb(Vbb(a,c),0)){return c}return wbb(rie,Vbb(Pbb(c,63),1))} +function Yyc(a,b){var c;c=Ksd((dzc(),bzc))!=null&&b.wg()!=null?Edb(ED(b.wg()))/Edb(ED(Ksd(bzc))):1;Rhb(a.b,b,c)} +function le(a,b){var c,d;c=BD(a.d.Bc(b),14);if(!c){return null}d=a.e.hc();d.Gc(c);a.e.d-=c.gc();c.$b();return d} +function AHc(a,b){var c,d;d=a.c[b];if(d==0){return}a.c[b]=0;a.d-=d;c=b+1;while(c0){return _vb(b-1,a.a.c.length),Kkb(a.a,b-1)}else{throw vbb(new Jpb)}} +function C2c(a,b,c){if(b<0){throw vbb(new qcb(ese+b))}if(bb){throw vbb(new Wdb(xke+a+yke+b))}if(a<0||b>c){throw vbb(new scb(xke+a+zke+b+oke+c))}} +function j5c(a){if(!a.a||(a.a.i&8)==0){throw vbb(new Zdb('Enumeration class expected for layout option '+a.f))}} +function vud(a){var b;++a.j;if(a.i==0){a.g=null}else if(a.iRqe?a-c>Rqe:c-a>Rqe} +function pHb(a,b){if(!a){return 0}if(b&&!a.j){return 0}if(JD(a,124)){if(BD(a,124).a.b==0){return 0}}return a.Re()} +function qHb(a,b){if(!a){return 0}if(b&&!a.k){return 0}if(JD(a,124)){if(BD(a,124).a.a==0){return 0}}return a.Se()} +function fhb(a){Hgb();if(a<0){if(a!=-1){return new Tgb(-1,-a)}return Bgb}else return a<=10?Dgb[QD(a)]:new Tgb(1,a)} +function xC(a){rC();throw vbb(new MB("Unexpected typeof result '"+a+"'; please report this bug to the GWT team"))} +function lz(a){jz();Py(this);Ry(this);this.e=a;Sy(this,a);this.g=a==null?Xhe:fcb(a);this.a='';this.b=a;this.a=''} +function F$c(){this.a=new G$c;this.f=new I$c(this);this.b=new K$c(this);this.i=new M$c(this);this.e=new O$c(this)} +function ss(){rs.call(this,new _rb(Cv(16)));Xj(2,mie);this.b=2;this.a=new Ms(null,null,0,null);As(this.a,this.a)} +function xzc(){xzc=ccb;uzc=new zzc('DUMMY_NODE_OVER',0);vzc=new zzc('DUMMY_NODE_UNDER',1);wzc=new zzc('EQUAL',2)} +function LUb(){LUb=ccb;JUb=Fx(OC(GC(t1,1),Kie,103,0,[(ead(),aad),bad]));KUb=Fx(OC(GC(t1,1),Kie,103,0,[dad,_9c]))} +function VQc(a){return (Ucd(),Lcd).Hc(a.j)?Edb(ED(vNb(a,(wtc(),qtc)))):l7c(OC(GC(m1,1),nie,8,0,[a.i.n,a.n,a.a])).b} +function DOb(a){var b,c,d,e;d=a.b.a;for(c=d.a.ec().Kc();c.Ob();){b=BD(c.Pb(),561);e=new MPb(b,a.e,a.f);Ekb(a.g,e)}} +function yId(a,b){var c,d,e;d=a.nk(b,null);e=null;if(b){e=(LFd(),c=new UQd,c);NQd(e,a.r)}d=xId(a,e,d);!!d&&d.Fi()} +function VFc(a,b){var c,d;d=Cub(a.d,1)!=0;c=true;while(c){c=false;c=b.c.Tf(b.e,d);c=c|dGc(a,b,d,false);d=!d}$Fc(a)} +function wZc(a,b){var c,d,e;d=false;c=b.q.d;if(b.de){$Zc(b.q,e);d=c!=b.q.d}}return d} +function PVc(a,b){var c,d,e,f,g,h,i,j;i=b.i;j=b.j;d=a.f;e=d.i;f=d.j;g=i-e;h=j-f;c=$wnd.Math.sqrt(g*g+h*h);return c} +function Rnd(a,b){var c,d;d=jid(a);if(!d){!And&&(And=new lUd);c=(IEd(),PEd(b));d=new s0d(c);wtd(d.Vk(),a)}return d} +function Sc(a,b){var c,d;c=BD(a.c.Bc(b),14);if(!c){return a.jc()}d=a.hc();d.Gc(c);a.d-=c.gc();c.$b();return a.mc(d)} +function j7c(a,b){var c;for(c=0;c=a.c.b:a.a<=a.c.b)){throw vbb(new utb)}b=a.a;a.a+=a.c.c;++a.b;return meb(b)} +function BWb(a){var b;b=new VWb(a);rXb(a.a,zWb,new amb(OC(GC(bQ,1),Uhe,369,0,[b])));!!b.d&&Ekb(b.f,b.d);return b.f} +function Z1b(a){var b;b=new q_b(a.a);tNb(b,a);yNb(b,(wtc(),$sc),a);b.o.a=a.g;b.o.b=a.f;b.n.a=a.i;b.n.b=a.j;return b} +function A9b(a,b,c,d){var e,f;for(f=a.Kc();f.Ob();){e=BD(f.Pb(),70);e.n.a=b.a+(d.a-e.o.a)/2;e.n.b=b.b;b.b+=e.o.b+c}} +function UDb(a,b,c){var d,e;for(e=b.a.a.ec().Kc();e.Ob();){d=BD(e.Pb(),57);if(VDb(a,d,c)){return true}}return false} +function JDc(a){var b,c;for(c=new olb(a.r);c.a=0?b:-b;while(d>0){if(d%2==0){c*=c;d=d/2|0}else{e*=c;d-=1}}return b<0?1/e:e} +function y6c(a,b){var c,d,e;e=1;c=a;d=b>=0?b:-b;while(d>0){if(d%2==0){c*=c;d=d/2|0}else{e*=c;d-=1}}return b<0?1/e:e} +function sAd(a){var b,c,d,e;if(a!=null){for(c=0;c0){c=BD(Ikb(a.a,a.a.c.length-1),570);if(NYb(c,b)){return}}Ekb(a.a,new PYb(b))} +function $gc(a){Hgc();var b,c;b=a.d.c-a.e.c;c=BD(a.g,145);Hkb(c.b,new shc(b));Hkb(c.c,new uhc(b));reb(c.i,new whc(b))} +function gic(a){var b;b=new Ufb;b.a+='VerticalSegment ';Pfb(b,a.e);b.a+=' ';Qfb(b,Eb(new Gb,new olb(a.k)));return b.a} +function u4c(a){var b;b=BD(Wrb(a.c.c,''),229);if(!b){b=new W3c(d4c(c4c(new e4c,''),'Other'));Xrb(a.c.c,'',b)}return b} +function qnd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (name: ';Efb(b,a.zb);b.a+=')';return b.a} +function Jnd(a,b,c){var d,e;e=a.sb;a.sb=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,4,e,b);!c?(c=d):c.Ei(d)}return c} +function _ic(a,b){var c,d,e;c=0;for(e=V_b(a,b).Kc();e.Ob();){d=BD(e.Pb(),11);c+=vNb(d,(wtc(),gtc))!=null?1:0}return c} +function vPc(a,b,c){var d,e,f;d=0;for(f=Jsb(a,0);f.b!=f.d.c;){e=Edb(ED(Xsb(f)));if(e>c){break}else e>=b&&++d}return d} +function RTd(a,b,c){var d,e;d=new pSd(a.e,3,13,null,(e=b.c,e?e:(jGd(),YFd)),HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function STd(a,b,c){var d,e;d=new pSd(a.e,4,13,(e=b.c,e?e:(jGd(),YFd)),null,HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function zId(a,b,c){var d,e;e=a.r;a.r=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,8,e,a.r);!c?(c=d):c.Ei(d)}return c} +function o1d(a,b){var c,d;c=BD(b,676);d=c.vk();!d&&c.wk(d=JD(b,88)?new C1d(a,BD(b,26)):new O1d(a,BD(b,148)));return d} +function kud(a,b,c){var d;a.qi(a.i+1);d=a.oi(b,c);b!=a.i&&$fb(a.g,b,a.g,b+1,a.i-b);NC(a.g,b,d);++a.i;a.bi(b,c);a.ci()} +function vwb(a,b){var c;if(b.a){c=b.a.a.length;!a.a?(a.a=new Wfb(a.d)):Qfb(a.a,a.b);Ofb(a.a,b.a,b.d.length,c)}return a} +function __d(a,b){var c,d,e,f;b.vi(a.a);f=BD(Ajd(a.a,8),1936);if(f!=null){for(c=f,d=0,e=c.length;dc){throw vbb(new qcb(xke+a+zke+b+', size: '+c))}if(a>b){throw vbb(new Wdb(xke+a+yke+b))}} +function eid(a,b,c){if(b<0){vid(a,c)}else{if(!c.Ij()){throw vbb(new Wdb(ite+c.ne()+jte))}BD(c,66).Nj().Vj(a,a.yh(),b)}} +function Jlb(a,b,c,d,e,f,g,h){var i;i=c;while(f=d||b=65&&a<=70){return a-65+10}if(a>=97&&a<=102){return a-97+10}if(a>=48&&a<=57){return a-48}return 0} +function QHd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (source: ';Efb(b,a.d);b.a+=')';return b.a} +function OQd(a,b,c){var d,e;e=a.a;a.a=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,5,e,a.a);!c?(c=d):Qwd(c,d)}return c} +function BId(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,2,c,b))} +function eLd(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,8,c,b))} +function LPd(a,b){var c;c=(a.Bb&256)!=0;b?(a.Bb|=256):(a.Bb&=-257);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,8,c,b))} +function CId(a,b){var c;c=(a.Bb&512)!=0;b?(a.Bb|=512):(a.Bb&=-513);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,3,c,b))} +function fLd(a,b){var c;c=(a.Bb&512)!=0;b?(a.Bb|=512):(a.Bb&=-513);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,9,c,b))} +function N7d(a,b){var c;if(a.b==-1&&!!a.a){c=a.a.Gj();a.b=!c?bLd(a.c.Tg(),a.a):a.c.Xg(a.a.aj(),c)}return a.c.Og(a.b,b)} +function meb(a){var b,c;if(a>-129&&a<128){b=a+128;c=(oeb(),neb)[b];!c&&(c=neb[b]=new _db(a));return c}return new _db(a)} +function Web(a){var b,c;if(a>-129&&a<128){b=a+128;c=(Yeb(),Xeb)[b];!c&&(c=Xeb[b]=new Qeb(a));return c}return new Qeb(a)} +function L5b(a){var b,c;b=a.k;if(b==(j0b(),e0b)){c=BD(vNb(a,(wtc(),Hsc)),61);return c==(Ucd(),Acd)||c==Rcd}return false} +function i1d(a,b,c){var d,e,f;f=(e=nUd(a.b,b),e);if(f){d=BD(V1d(p1d(a,f),''),26);if(d){return r1d(a,d,b,c)}}return null} +function l1d(a,b,c){var d,e,f;f=(e=nUd(a.b,b),e);if(f){d=BD(V1d(p1d(a,f),''),26);if(d){return s1d(a,d,b,c)}}return null} +function cTd(a,b){var c,d;for(d=new Fyd(a);d.e!=d.i.gc();){c=BD(Dyd(d),138);if(PD(b)===PD(c)){return true}}return false} +function vtd(a,b,c){var d;d=a.gc();if(b>d)throw vbb(new Cyd(b,d));if(a.hi()&&a.Hc(c)){throw vbb(new Wdb(kue))}a.Xh(b,c)} +function iqd(a,b){var c;c=oo(a.i,b);if(c==null){throw vbb(new cqd('Node did not exist in input.'))}Yqd(b,c);return null} +function $hd(a,b){var c;c=YKd(a,b);if(JD(c,322)){return BD(c,34)}throw vbb(new Wdb(ite+b+"' is not a valid attribute"))} +function V2d(a,b,c){var d,e;e=JD(b,99)&&(BD(b,18).Bb&Tje)!=0?new s4d(b,a):new p4d(b,a);for(d=0;db){return 1}if(a==b){return a==0?Kdb(1/a,1/b):0}return isNaN(a)?isNaN(b)?0:1:-1} +function f4b(a,b){Odd(b,'Sort end labels',1);MAb(JAb(LAb(new YAb(null,new Kub(a.b,16)),new q4b),new s4b),new u4b);Qdd(b)} +function Wxd(a,b,c){var d,e;if(a.ej()){e=a.fj();d=sud(a,b,c);a.$i(a.Zi(7,meb(c),d,b,e));return d}else{return sud(a,b,c)}} +function vAd(a,b){var c,d,e;if(a.d==null){++a.e;--a.f}else{e=b.cd();c=b.Sh();d=(c&Ohe)%a.d.length;KAd(a,d,xAd(a,d,c,e))}} +function ZId(a,b){var c;c=(a.Bb&zte)!=0;b?(a.Bb|=zte):(a.Bb&=-1025);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,10,c,b))} +function dJd(a,b){var c;c=(a.Bb&Rje)!=0;b?(a.Bb|=Rje):(a.Bb&=-4097);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,12,c,b))} +function eJd(a,b){var c;c=(a.Bb&Cve)!=0;b?(a.Bb|=Cve):(a.Bb&=-8193);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,15,c,b))} +function fJd(a,b){var c;c=(a.Bb&Dve)!=0;b?(a.Bb|=Dve):(a.Bb&=-2049);(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new qSd(a,1,11,c,b))} +function jOb(a,b){var c;c=Kdb(a.b.c,b.b.c);if(c!=0){return c}c=Kdb(a.a.a,b.a.a);if(c!=0){return c}return Kdb(a.a.b,b.a.b)} +function jqd(a,b){var c;c=Ohb(a.k,b);if(c==null){throw vbb(new cqd('Port did not exist in input.'))}Yqd(b,c);return null} +function k6d(a){var b,c;for(c=l6d(bKd(a)).Kc();c.Ob();){b=GD(c.Pb());if(Dmd(a,b)){return uFd((tFd(),sFd),b)}}return null} +function n3d(a,b){var c,d,e,f,g;g=S6d(a.e.Tg(),b);f=0;c=BD(a.g,119);for(e=0;e>10)+Uje&aje;b[1]=(a&1023)+56320&aje;return zfb(b,0,b.length)} +function a_b(a){var b,c;c=BD(vNb(a,(Nyc(),Lwc)),103);if(c==(ead(),cad)){b=Edb(ED(vNb(a,owc)));return b>=1?bad:_9c}return c} +function rec(a){switch(BD(vNb(a,(Nyc(),Swc)),218).g){case 1:return new Fmc;case 3:return new wnc;default:return new zmc;}} +function Uzb(a){if(a.c){Uzb(a.c)}else if(a.d){throw vbb(new Zdb("Stream already terminated, can't be modified or used"))}} +function Mkd(a){var b;if((a.Db&64)!=0)return Eid(a);b=new Jfb(Eid(a));b.a+=' (identifier: ';Efb(b,a.k);b.a+=')';return b.a} +function ctd(a,b,c){var d,e;d=(Fhd(),e=new xkd,e);vkd(d,b);wkd(d,c);!!a&&wtd((!a.a&&(a.a=new xMd(y2,a,5)),a.a),d);return d} +function ttb(a,b,c,d){var e,f;uCb(d);uCb(c);e=a.xc(b);f=e==null?c:Myb(BD(e,15),BD(c,14));f==null?a.Bc(b):a.zc(b,f);return f} +function pqb(a){var b,c,d,e;c=(b=BD(gdb((d=a.gm,e=d.f,e==CI?d:e)),9),new xqb(b,BD(_Bb(b,b.length),9),0));rqb(c,a);return c} +function hDc(a,b,c){var d,e;for(e=a.a.ec().Kc();e.Ob();){d=BD(e.Pb(),10);if(Be(c,BD(Ikb(b,d.p),14))){return d}}return null} +function Db(b,c,d){var e;try{Cb(b,c,d)}catch(a){a=ubb(a);if(JD(a,597)){e=a;throw vbb(new ycb(e))}else throw vbb(a)}return c} +function Qbb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a-b;if(Kje>1;a.k=c-1>>1} +function Gub(){zub();var a,b,c;c=yub+++Date.now();a=QD($wnd.Math.floor(c*lke))&nke;b=QD(c-a*mke);this.a=a^1502;this.b=b^kke} +function O_b(a){var b,c,d;b=new Rkb;for(d=new olb(a.j);d.a3.4028234663852886E38){return Pje}else if(b<-3.4028234663852886E38){return Qje}return b} +function aeb(a){a-=a>>1&1431655765;a=(a>>2&858993459)+(a&858993459);a=(a>>4)+a&252645135;a+=a>>8;a+=a>>16;return a&63} +function Ev(a){var b,c,d,e;b=new cq(a.Hd().gc());e=0;for(d=vr(a.Hd().Kc());d.Ob();){c=d.Pb();bq(b,c,meb(e++))}return fn(b.a)} +function Uyb(a,b){var c,d,e;e=new Lqb;for(d=b.vc().Kc();d.Ob();){c=BD(d.Pb(),42);Rhb(e,c.cd(),Yyb(a,BD(c.dd(),15)))}return e} +function EZc(a,b){a.n.c.length==0&&Ekb(a.n,new VZc(a.s,a.t,a.i));Ekb(a.b,b);QZc(BD(Ikb(a.n,a.n.c.length-1),211),b);GZc(a,b)} +function LFb(a){if(a.c!=a.b.b||a.i!=a.g.b){a.a.c=KC(SI,Uhe,1,0,5,1);Gkb(a.a,a.b);Gkb(a.a,a.g);a.c=a.b.b;a.i=a.g.b}return a.a} +function Ycc(a,b){var c,d,e;e=0;for(d=BD(b.Kb(a),20).Kc();d.Ob();){c=BD(d.Pb(),17);Ccb(DD(vNb(c,(wtc(),ltc))))||++e}return e} +function efc(a,b){var c,d,e;d=tgc(b);e=Edb(ED(pBc(d,(Nyc(),lyc))));c=$wnd.Math.max(0,e/2-0.5);cfc(b,c,1);Ekb(a,new Dfc(b,c))} +function Ctc(){Ctc=ccb;Btc=new Dtc(ane,0);xtc=new Dtc('FIRST',1);ytc=new Dtc(Gne,2);ztc=new Dtc('LAST',3);Atc=new Dtc(Hne,4)} +function Aad(){Aad=ccb;zad=new Bad(ole,0);xad=new Bad('POLYLINE',1);wad=new Bad('ORTHOGONAL',2);yad=new Bad('SPLINES',3)} +function zYc(){zYc=ccb;xYc=new AYc('ASPECT_RATIO_DRIVEN',0);yYc=new AYc('MAX_SCALE_DRIVEN',1);wYc=new AYc('AREA_DRIVEN',2)} +function Y$c(){Y$c=ccb;V$c=new Z$c('P1_STRUCTURE',0);W$c=new Z$c('P2_PROCESSING_ORDER',1);X$c=new Z$c('P3_EXECUTION',2)} +function tVc(){tVc=ccb;sVc=new uVc('OVERLAP_REMOVAL',0);qVc=new uVc('COMPACTION',1);rVc=new uVc('GRAPH_SIZE_CALCULATION',2)} +function Jy(a,b){Iy();return My(Qie),$wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b))} +function yOc(a,b){var c,d;c=Jsb(a,0);while(c.b!=c.d.c){d=Gdb(ED(Xsb(c)));if(d==b){return}else if(d>b){Ysb(c);break}}Vsb(c,b)} +function t4c(a,b){var c,d,e,f,g;c=b.f;Xrb(a.c.d,c,b);if(b.g!=null){for(e=b.g,f=0,g=e.length;fb&&d.ue(a[f-1],a[f])>0;--f){g=a[f];NC(a,f,a[f-1]);NC(a,f-1,g)}}} +function did(a,b,c,d){if(b<0){uid(a,c,d)}else{if(!c.Ij()){throw vbb(new Wdb(ite+c.ne()+jte))}BD(c,66).Nj().Tj(a,a.yh(),b,d)}} +function xFb(a,b){if(b==a.d){return a.e}else if(b==a.e){return a.d}else{throw vbb(new Wdb('Node '+b+' not part of edge '+a))}} +function iEb(a,b){switch(b.g){case 2:return a.b;case 1:return a.c;case 4:return a.d;case 3:return a.a;default:return false;}} +function GVb(a,b){switch(b.g){case 2:return a.b;case 1:return a.c;case 4:return a.d;case 3:return a.a;default:return false;}} +function Xkd(a,b,c,d){switch(b){case 3:return a.f;case 4:return a.g;case 5:return a.i;case 6:return a.j;}return Ekd(a,b,c,d)} +function Ljc(a){if(a.k!=(j0b(),h0b)){return false}return FAb(new YAb(null,new Lub(new Sr(ur(U_b(a).a.Kc(),new Sq)))),new Mjc)} +function MEd(a){if(a.e==null){return a}else !a.c&&(a.c=new NEd((a.f&256)!=0,a.i,a.a,a.d,(a.f&16)!=0,a.j,a.g,null));return a.c} +function VC(a,b){if(a.h==Gje&&a.m==0&&a.l==0){b&&(QC=TC(0,0,0));return SC((wD(),uD))}b&&(QC=TC(a.l,a.m,a.h));return TC(0,0,0)} +function fcb(a){var b;if(Array.isArray(a)&&a.im===gcb){return hdb(rb(a))+'@'+(b=tb(a)>>>0,b.toString(16))}return a.toString()} +function Rpb(a){var b;this.a=(b=BD(a.e&&a.e(),9),new xqb(b,BD(_Bb(b,b.length),9),0));this.b=KC(SI,Uhe,1,this.a.a.length,5,1)} +function _Ob(a){var b,c,d;this.a=new zsb;for(d=new olb(a);d.a0&&(BCb(b-1,a.length),a.charCodeAt(b-1)==58)&&!OEd(a,CEd,DEd)} +function OEd(a,b,c){var d,e;for(d=0,e=a.length;d=e){return b.c+c}}return b.c+b.b.gc()} +function NCd(a,b){LCd();var c,d,e,f;d=KLd(a);e=b;Klb(d,0,d.length,e);for(c=0;c0){d+=e;++c}}c>1&&(d+=a.d*(c-1));return d} +function Htd(a){var b,c,d;d=new Hfb;d.a+='[';for(b=0,c=a.gc();b0&&this.b>0&&q$c(this.c,this.b,this.a)} +function ezc(a){dzc();this.c=Ou(OC(GC(h0,1),Uhe,831,0,[Uyc]));this.b=new Lqb;this.a=a;Rhb(this.b,bzc,1);Hkb(czc,new Xed(this))} +function I2c(a,b){var c;if(a.d){if(Mhb(a.b,b)){return BD(Ohb(a.b,b),51)}else{c=b.Kf();Rhb(a.b,b,c);return c}}else{return b.Kf()}} +function Kgb(a,b){var c;if(PD(a)===PD(b)){return true}if(JD(b,91)){c=BD(b,91);return a.e==c.e&&a.d==c.d&&Lgb(a,c.a)}return false} +function Zcd(a){Ucd();switch(a.g){case 4:return Acd;case 1:return zcd;case 3:return Rcd;case 2:return Tcd;default:return Scd;}} +function Ykd(a,b){switch(b){case 3:return a.f!=0;case 4:return a.g!=0;case 5:return a.i!=0;case 6:return a.j!=0;}return Hkd(a,b)} +function gWc(a){switch(a.g){case 0:return new FXc;case 1:return new IXc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function QUc(a){switch(a.g){case 0:return new CXc;case 1:return new MXc;default:throw vbb(new Wdb(Dne+(a.f!=null?a.f:''+a.g)));}} +function b1c(a){switch(a.g){case 0:return new s1c;case 1:return new w1c;default:throw vbb(new Wdb(Mre+(a.f!=null?a.f:''+a.g)));}} +function qWc(a){switch(a.g){case 1:return new SVc;case 2:return new KVc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function ryb(a){var b,c;if(a.b){return a.b}c=lyb?null:a.d;while(c){b=lyb?null:c.b;if(b){return b}c=lyb?null:c.d}return $xb(),Zxb} +function hhb(a){var b,c,d;if(a.e==0){return 0}b=a.d<<5;c=a.a[a.d-1];if(a.e<0){d=Mgb(a);if(d==a.d-1){--c;c=c|0}}b-=heb(c);return b} +function bhb(a){var b,c,d;if(a>5;b=a&31;d=KC(WD,oje,25,c+1,15,1);d[c]=1<3){e*=10;--f}a=(a+(e>>1))/e|0}d.i=a;return true} +function XUb(a){LUb();return Bcb(),GVb(BD(a.a,81).j,BD(a.b,103))||BD(a.a,81).d.e!=0&&GVb(BD(a.a,81).j,BD(a.b,103))?true:false} +function s3c(a){p3c();if(BD(a.We((Y9c(),b9c)),174).Hc((Idd(),Gdd))){BD(a.We(x9c),174).Fc((rcd(),qcd));BD(a.We(b9c),174).Mc(Gdd)}} +function Gxd(a,b){var c,d;if(!b){return false}else{for(c=0;c=0;--d){b=c[d];for(e=0;e>1;this.k=b-1>>1} +function r3b(a,b){Odd(b,'End label post-processing',1);MAb(JAb(LAb(new YAb(null,new Kub(a.b,16)),new w3b),new y3b),new A3b);Qdd(b)} +function NLc(a,b,c){var d,e;d=Edb(a.p[b.i.p])+Edb(a.d[b.i.p])+b.n.b+b.a.b;e=Edb(a.p[c.i.p])+Edb(a.d[c.i.p])+c.n.b+c.a.b;return e-d} +function xhb(a,b,c){var d,e;d=xbb(c,Yje);for(e=0;ybb(d,0)!=0&&e0&&(BCb(0,b.length),b.charCodeAt(0)==43)?b.substr(1):b))} +function T9d(a){var b;return a==null?null:new Ygb((b=Qge(a,true),b.length>0&&(BCb(0,b.length),b.charCodeAt(0)==43)?b.substr(1):b))} +function xud(a,b){var c;if(a.i>0){if(b.lengtha.i&&NC(b,a.i,null);return b} +function Sxd(a,b,c){var d,e,f;if(a.ej()){d=a.i;f=a.fj();kud(a,d,b);e=a.Zi(3,null,b,d,f);!c?(c=e):c.Ei(e)}else{kud(a,a.i,b)}return c} +function HMd(a,b,c){var d,e;d=new pSd(a.e,4,10,(e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)),null,HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function GMd(a,b,c){var d,e;d=new pSd(a.e,3,10,null,(e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)),HLd(a,b),false);!c?(c=d):c.Ei(d);return c} +function _Jb(a){$Jb();var b;b=new g7c(BD(a.e.We((Y9c(),_8c)),8));if(a.B.Hc((Idd(),Bdd))){b.a<=0&&(b.a=20);b.b<=0&&(b.b=20)}return b} +function Lzc(a){Izc();var b;(!a.q?(mmb(),mmb(),kmb):a.q)._b((Nyc(),Cxc))?(b=BD(vNb(a,Cxc),197)):(b=BD(vNb(Q_b(a),Dxc),197));return b} +function pBc(a,b){var c,d;d=null;if(wNb(a,(Nyc(),qyc))){c=BD(vNb(a,qyc),94);c.Xe(b)&&(d=c.We(b))}d==null&&(d=vNb(Q_b(a),b));return d} +function Ze(a,b){var c,d,e;if(JD(b,42)){c=BD(b,42);d=c.cd();e=Hv(a.Rc(),d);return Hb(e,c.dd())&&(e!=null||a.Rc()._b(d))}return false} +function qAd(a,b){var c,d,e;if(a.f>0){a.qj();d=b==null?0:tb(b);e=(d&Ohe)%a.d.length;c=xAd(a,e,d,b);return c!=-1}else{return false}} +function AAd(a,b){var c,d,e;if(a.f>0){a.qj();d=b==null?0:tb(b);e=(d&Ohe)%a.d.length;c=wAd(a,e,d,b);if(c){return c.dd()}}return null} +function R2d(a,b){var c,d,e,f;f=S6d(a.e.Tg(),b);c=BD(a.g,119);for(e=0;e1?Mbb(Nbb(b.a[1],32),xbb(b.a[0],Yje)):xbb(b.a[0],Yje),Sbb(Ibb(b.e,c))))} +function Hbb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a%b;if(Kje>5;b&=31;e=a.d+c+(b==0?0:1);d=KC(WD,oje,25,e,15,1);jhb(d,a.a,c,b);f=new Vgb(a.e,e,d);Jgb(f);return f} +function Ofe(a,b,c){var d,e;d=BD(Phb(Zee,b),117);e=BD(Phb($ee,b),117);if(c){Shb(Zee,a,d);Shb($ee,a,e)}else{Shb($ee,a,d);Shb(Zee,a,e)}} +function Cwb(a,b,c){var d,e,f;e=null;f=a.b;while(f){d=a.a.ue(b,f.d);if(c&&d==0){return f}if(d>=0){f=f.a[1]}else{e=f;f=f.a[0]}}return e} +function Dwb(a,b,c){var d,e,f;e=null;f=a.b;while(f){d=a.a.ue(b,f.d);if(c&&d==0){return f}if(d<=0){f=f.a[0]}else{e=f;f=f.a[1]}}return e} +function Nic(a,b,c,d){var e,f,g;e=false;if(fjc(a.f,c,d)){ijc(a.f,a.a[b][c],a.a[b][d]);f=a.a[b];g=f[d];f[d]=f[c];f[c]=g;e=true}return e} +function QHc(a,b,c,d,e){var f,g,h;g=e;while(b.b!=b.c){f=BD(fkb(b),10);h=BD(V_b(f,d).Xb(0),11);a.d[h.p]=g++;c.c[c.c.length]=h}return g} +function hBc(a,b,c){var d,e,f,g,h;g=a.k;h=b.k;d=c[g.g][h.g];e=ED(pBc(a,d));f=ED(pBc(b,d));return $wnd.Math.max((uCb(e),e),(uCb(f),f))} +function zZc(a,b,c){var d,e,f,g;d=c/a.c.length;e=0;for(g=new olb(a);g.a2000){yz=a;zz=$wnd.setTimeout(Iz,10)}}if(xz++==0){Lz((Kz(),Jz));return true}return false} +function wCc(a,b){var c,d,e;for(d=new Sr(ur(U_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);e=c.d.i;if(e.c==b){return false}}return true} +function Ek(b,c){var d,e;if(JD(c,245)){e=BD(c,245);try{d=b.vd(e);return d==0}catch(a){a=ubb(a);if(!JD(a,205))throw vbb(a)}}return false} +function Xz(){if(Error.stackTraceLimit>0){$wnd.Error.stackTraceLimit=Error.stackTraceLimit=64;return true}return 'stack' in new Error} +function BDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))>0} +function DDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))<0} +function CDb(a,b){return Iy(),Iy(),My(Qie),($wnd.Math.abs(a-b)<=Qie||a==b||isNaN(a)&&isNaN(b)?0:ab?1:Ny(isNaN(a),isNaN(b)))<=0} +function ydb(a,b){var c=0;while(!b[c]||b[c]==''){c++}var d=b[c++];for(;cWje){return c.fh()}d=c.Zg();if(!!d||c==a){break}}}return d} +function fvd(a){evd();if(JD(a,156)){return BD(Ohb(cvd,hK),288).vg(a)}if(Mhb(cvd,rb(a))){return BD(Ohb(cvd,rb(a)),288).vg(a)}return null} +function fZd(a){if(efb(kse,a)){return Bcb(),Acb}else if(efb(lse,a)){return Bcb(),zcb}else{throw vbb(new Wdb('Expecting true or false'))}} +function uDc(a,b){if(b.c==a){return b.d}else if(b.d==a){return b.c}throw vbb(new Wdb('Input edge is not connected to the input port.'))} +function Igb(a,b){if(a.e>b.e){return 1}if(a.eb.d){return a.e}if(a.d=48&&a<48+$wnd.Math.min(10,10)){return a-48}if(a>=97&&a<97){return a-97+10}if(a>=65&&a<65){return a-65+10}return -1} +function Ue(a,b){var c;if(PD(b)===PD(a)){return true}if(!JD(b,21)){return false}c=BD(b,21);if(c.gc()!=a.gc()){return false}return a.Ic(c)} +function ekb(a,b){var c,d,e,f;d=a.a.length-1;c=b-a.b&d;f=a.c-b&d;e=a.c-a.b&d;mkb(c=f){hkb(a,b);return -1}else{ikb(a,b);return 1}} +function lA(a,b){var c,d;c=(BCb(b,a.length),a.charCodeAt(b));d=b+1;while(db.e){return 1}else if(a.fb.f){return 1}return tb(a)-tb(b)} +function efb(a,b){uCb(a);if(b==null){return false}if(dfb(a,b)){return true}return a.length==b.length&&dfb(a.toLowerCase(),b.toLowerCase())} +function x6d(a,b){var c,d,e,f;for(d=0,e=b.gc();d0&&ybb(a,128)<0){b=Tbb(a)+128;c=(Ceb(),Beb)[b];!c&&(c=Beb[b]=new teb(a));return c}return new teb(a)} +function _0d(a,b){var c,d;c=b.Hh(a.a);if(c){d=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),fue));if(d!=null){return d}}return b.ne()} +function a1d(a,b){var c,d;c=b.Hh(a.a);if(c){d=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),fue));if(d!=null){return d}}return b.ne()} +function FMc(a,b){wMc();var c,d;for(d=new Sr(ur(O_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);if(c.d.i==b||c.c.i==b){return c}}return null} +function HUb(a,b,c){this.c=a;this.f=new Rkb;this.e=new d7c;this.j=new IVb;this.n=new IVb;this.b=b;this.g=new J6c(b.c,b.d,b.b,b.a);this.a=c} +function gVb(a){var b,c,d,e;this.a=new zsb;this.d=new Tqb;this.e=0;for(c=a,d=0,e=c.length;d0}else{return false}} +function q2c(a){var b;if(PD(hkd(a,(Y9c(),J8c)))===PD((hbd(),fbd))){if(!Xod(a)){jkd(a,J8c,gbd)}else{b=BD(hkd(Xod(a),J8c),334);jkd(a,J8c,b)}}} +function ijc(a,b,c){var d,e;bIc(a.e,b,c,(Ucd(),Tcd));bIc(a.i,b,c,zcd);if(a.a){e=BD(vNb(b,(wtc(),$sc)),11);d=BD(vNb(c,$sc),11);cIc(a.g,e,d)}} +function OEc(a,b,c){var d,e,f;d=b.c.p;f=b.p;a.b[d][f]=new $Ec(a,b);if(c){a.a[d][f]=new FEc(b);e=BD(vNb(b,(wtc(),Psc)),10);!!e&&Rc(a.d,e,b)}} +function TPb(a,b){var c,d,e;Ekb(PPb,a);b.Fc(a);c=BD(Ohb(OPb,a),21);if(c){for(e=c.Kc();e.Ob();){d=BD(e.Pb(),33);Jkb(PPb,d,0)!=-1||TPb(d,b)}}} +function tyb(a,b,c){var d;(jyb?(ryb(a),true):kyb?($xb(),true):nyb?($xb(),true):myb&&($xb(),false))&&(d=new iyb(b),d.b=c,pyb(a,d),undefined)} +function xKb(a,b){var c;c=!a.A.Hc((tdd(),sdd))||a.q==(dcd(),$bd);a.u.Hc((rcd(),ncd))?c?vKb(a,b):zKb(a,b):a.u.Hc(pcd)&&(c?wKb(a,b):AKb(a,b))} +function b0d(a,b){var c,d;++a.j;if(b!=null){c=(d=a.a.Cb,JD(d,97)?BD(d,97).Jg():null);if(xlb(b,c)){Cjd(a.a,4,c);return}}Cjd(a.a,4,BD(b,126))} +function dYb(a,b,c){return new J6c($wnd.Math.min(a.a,b.a)-c/2,$wnd.Math.min(a.b,b.b)-c/2,$wnd.Math.abs(a.a-b.a)+c,$wnd.Math.abs(a.b-b.b)+c)} +function k4b(a,b){var c,d;c=beb(a.a.c.p,b.a.c.p);if(c!=0){return c}d=beb(a.a.d.i.p,b.a.d.i.p);if(d!=0){return d}return beb(b.a.d.p,a.a.d.p)} +function _Dc(a,b,c){var d,e,f,g;f=b.j;g=c.j;if(f!=g){return f.g-g.g}else{d=a.f[b.p];e=a.f[c.p];return d==0&&e==0?0:d==0?-1:e==0?1:Kdb(d,e)}} +function HFb(a,b,c){var d,e,f;if(c[b.d]){return}c[b.d]=true;for(e=new olb(LFb(b));e.a=e)return e;for(b=b>0?b:0;bd&&NC(b,d,null);return b} +function _lb(a,b){var c,d;d=a.a.length;b.lengthd&&NC(b,d,null);return b} +function Xrb(a,b,c){var d,e,f;e=BD(Ohb(a.e,b),387);if(!e){d=new lsb(a,b,c);Rhb(a.e,b,d);isb(d);return null}else{f=ijb(e,c);Yrb(a,e);return f}} +function P9d(a){var b;if(a==null)return null;b=ide(Qge(a,true));if(b==null){throw vbb(new n8d("Invalid hexBinary value: '"+a+"'"))}return b} +function ghb(a){Hgb();if(ybb(a,0)<0){if(ybb(a,-1)!=0){return new Wgb(-1,Jbb(a))}return Bgb}else return ybb(a,10)<=0?Dgb[Tbb(a)]:new Wgb(1,a)} +function wJb(){qJb();return OC(GC(DN,1),Kie,159,0,[nJb,mJb,oJb,eJb,dJb,fJb,iJb,hJb,gJb,lJb,kJb,jJb,bJb,aJb,cJb,$Ib,ZIb,_Ib,XIb,WIb,YIb,pJb])} +function vjc(a){var b;this.d=new Rkb;this.j=new d7c;this.g=new d7c;b=a.g.b;this.f=BD(vNb(Q_b(b),(Nyc(),Lwc)),103);this.e=Edb(ED(c_b(b,ryc)))} +function Pjc(a){this.b=new Rkb;this.e=new Rkb;this.d=a;this.a=!WAb(JAb(new YAb(null,new Lub(new b1b(a.b))),new Xxb(new Qjc))).sd((EAb(),DAb))} +function N5c(){N5c=ccb;L5c=new O5c('PARENTS',0);K5c=new O5c('NODES',1);I5c=new O5c('EDGES',2);M5c=new O5c('PORTS',3);J5c=new O5c('LABELS',4)} +function Tbd(){Tbd=ccb;Qbd=new Ubd('DISTRIBUTED',0);Sbd=new Ubd('JUSTIFIED',1);Obd=new Ubd('BEGIN',2);Pbd=new Ubd(gle,3);Rbd=new Ubd('END',4)} +function UMd(a){var b;b=a.yi(null);switch(b){case 10:return 0;case 15:return 1;case 14:return 2;case 11:return 3;case 21:return 4;}return -1} +function cYb(a){switch(a.g){case 1:return ead(),dad;case 4:return ead(),aad;case 2:return ead(),bad;case 3:return ead(),_9c;}return ead(),cad} +function kA(a,b,c){var d;d=c.q.getFullYear()-nje+nje;d<0&&(d=-d);switch(b){case 1:a.a+=d;break;case 2:EA(a,d%100,2);break;default:EA(a,d,b);}} +function Jsb(a,b){var c,d;wCb(b,a.b);if(b>=a.b>>1){d=a.c;for(c=a.b;c>b;--c){d=d.b}}else{d=a.a.a;for(c=0;c=64&&b<128&&(e=Mbb(e,Nbb(1,b-64)))}return e} +function c_b(a,b){var c,d;d=null;if(wNb(a,(Y9c(),O9c))){c=BD(vNb(a,O9c),94);c.Xe(b)&&(d=c.We(b))}d==null&&!!Q_b(a)&&(d=vNb(Q_b(a),b));return d} +function oQc(a,b){var c,d,e;e=b.d.i;d=e.k;if(d==(j0b(),h0b)||d==d0b){return}c=new Sr(ur(U_b(e).a.Kc(),new Sq));Qr(c)&&Rhb(a.k,b,BD(Rr(c),17))} +function mid(a,b){var c,d,e;d=XKd(a.Tg(),b);c=b-a.Ah();return c<0?(e=a.Yg(d),e>=0?a.lh(e):tid(a,d)):c<0?tid(a,d):BD(d,66).Nj().Sj(a,a.yh(),c)} +function Ksd(a){var b;if(JD(a.a,4)){b=fvd(a.a);if(b==null){throw vbb(new Zdb(mse+a.b+"'. "+ise+(fdb(Y3),Y3.k)+jse))}return b}else{return a.a}} +function L9d(a){var b;if(a==null)return null;b=bde(Qge(a,true));if(b==null){throw vbb(new n8d("Invalid base64Binary value: '"+a+"'"))}return b} +function Dyd(b){var c;try{c=b.i.Xb(b.e);b.mj();b.g=b.e++;return c}catch(a){a=ubb(a);if(JD(a,73)){b.mj();throw vbb(new utb)}else throw vbb(a)}} +function Zyd(b){var c;try{c=b.c.ki(b.e);b.mj();b.g=b.e++;return c}catch(a){a=ubb(a);if(JD(a,73)){b.mj();throw vbb(new utb)}else throw vbb(a)}} +function CPb(){CPb=ccb;BPb=(Y9c(),K9c);vPb=G8c;qPb=r8c;wPb=f9c;zPb=(fFb(),bFb);yPb=_Eb;APb=dFb;xPb=$Eb;sPb=(nPb(),jPb);rPb=iPb;tPb=lPb;uPb=mPb} +function NWb(a){LWb();this.c=new Rkb;this.d=a;switch(a.g){case 0:case 2:this.a=tmb(KWb);this.b=Pje;break;case 3:case 1:this.a=KWb;this.b=Qje;}} +function ued(a,b,c){var d,e;if(a.c){dld(a.c,a.c.i+b);eld(a.c,a.c.j+c)}else{for(e=new olb(a.b);e.a0){Ekb(a.b,new WA(b.a,c));d=b.a.length;0d&&(b.a+=yfb(KC(TD,$ie,25,-d,15,1)))}} +function JKb(a,b){var c,d,e;c=a.o;for(e=BD(BD(Qc(a.r,b),21),84).Kc();e.Ob();){d=BD(e.Pb(),111);d.e.a=DKb(d,c.a);d.e.b=c.b*Edb(ED(d.b.We(BKb)))}} +function S5b(a,b){var c,d,e,f;e=a.k;c=Edb(ED(vNb(a,(wtc(),htc))));f=b.k;d=Edb(ED(vNb(b,htc)));return f!=(j0b(),e0b)?-1:e!=e0b?1:c==d?0:c=0){return a.hh(b,c,d)}else{!!a.eh()&&(d=(e=a.Vg(),e>=0?a.Qg(d):a.eh().ih(a,-1-e,null,d)));return a.Sg(b,c,d)}} +function zld(a,b){switch(b){case 7:!a.e&&(a.e=new y5d(B2,a,7,4));Uxd(a.e);return;case 8:!a.d&&(a.d=new y5d(B2,a,8,5));Uxd(a.d);return;}$kd(a,b)} +function Ut(b,c){var d;d=b.Zc(c);try{return d.Pb()}catch(a){a=ubb(a);if(JD(a,109)){throw vbb(new qcb("Can't get element "+c))}else throw vbb(a)}} +function Tgb(a,b){this.e=a;if(b=0&&(c.d=a.t);break;case 3:a.t>=0&&(c.a=a.t);}if(a.C){c.b=a.C.b;c.c=a.C.c}} +function RMb(){RMb=ccb;OMb=new SMb(xle,0);NMb=new SMb(yle,1);PMb=new SMb(zle,2);QMb=new SMb(Ale,3);OMb.a=false;NMb.a=true;PMb.a=false;QMb.a=true} +function ROb(){ROb=ccb;OOb=new SOb(xle,0);NOb=new SOb(yle,1);POb=new SOb(zle,2);QOb=new SOb(Ale,3);OOb.a=false;NOb.a=true;POb.a=false;QOb.a=true} +function dac(a){var b;b=a.a;do{b=BD(Rr(new Sr(ur(R_b(b).a.Kc(),new Sq))),17).c.i;b.k==(j0b(),g0b)&&a.b.Fc(b)}while(b.k==(j0b(),g0b));a.b=Su(a.b)} +function CDc(a){var b,c,d;d=a.c.a;a.p=(Qb(d),new Tkb(d));for(c=new olb(d);c.ac.b){return true}}}return false} +function AD(a,b){if(ND(a)){return !!zD[b]}else if(a.hm){return !!a.hm[b]}else if(LD(a)){return !!yD[b]}else if(KD(a)){return !!xD[b]}return false} +function jkd(a,b,c){c==null?(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),LAd(a.o,b)):(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),HAd(a.o,b,c));return a} +function jKb(a,b,c,d){var e,f;f=b.Xe((Y9c(),W8c))?BD(b.We(W8c),21):a.j;e=uJb(f);if(e==(qJb(),pJb)){return}if(c&&!sJb(e)){return}UHb(lKb(a,e,d),b)} +function fid(a,b,c,d){var e,f,g;f=XKd(a.Tg(),b);e=b-a.Ah();return e<0?(g=a.Yg(f),g>=0?a._g(g,c,true):sid(a,f,c)):BD(f,66).Nj().Pj(a,a.yh(),e,c,d)} +function u6d(a,b,c,d){var e,f,g;if(c.mh(b)){Q6d();if(YId(b)){e=BD(c.ah(b),153);x6d(a,e)}else{f=(g=b,!g?null:BD(d,49).xh(g));!!f&&v6d(c.ah(b),f)}}} +function H3b(a){switch(a.g){case 1:return vLb(),uLb;case 3:return vLb(),rLb;case 2:return vLb(),tLb;case 4:return vLb(),sLb;default:return null;}} +function kCb(a){switch(typeof(a)){case Mhe:return LCb(a);case Lhe:return QD(a);case Khe:return Bcb(),a?1231:1237;default:return a==null?0:FCb(a);}} +function Gic(a,b,c){if(a.e){switch(a.b){case 1:oic(a.c,b,c);break;case 0:pic(a.c,b,c);}}else{mic(a.c,b,c)}a.a[b.p][c.p]=a.c.i;a.a[c.p][b.p]=a.c.e} +function lHc(a){var b,c;if(a==null){return null}c=KC(OQ,nie,193,a.length,0,2);for(b=0;b=0)return e;if(a.Fk()){for(d=0;d=e)throw vbb(new Cyd(b,e));if(a.hi()){d=a.Xc(c);if(d>=0&&d!=b){throw vbb(new Wdb(kue))}}return a.mi(b,c)} +function gx(a,b){this.a=BD(Qb(a),245);this.b=BD(Qb(b),245);if(a.vd(b)>0||a==(Lk(),Kk)||b==(_k(),$k)){throw vbb(new Wdb('Invalid range: '+nx(a,b)))}} +function mYb(a){var b,c;this.b=new Rkb;this.c=a;this.a=false;for(c=new olb(a.a);c.a0);if((b&-b)==b){return QD(b*Cub(a,31)*4.6566128730773926E-10)}do{c=Cub(a,31);d=c%b}while(c-d+(b-1)<0);return QD(d)} +function LCb(a){JCb();var b,c,d;c=':'+a;d=ICb[c];if(d!=null){return QD((uCb(d),d))}d=GCb[c];b=d==null?KCb(a):QD((uCb(d),d));MCb();ICb[c]=b;return b} +function qZb(a,b,c){Odd(c,'Compound graph preprocessor',1);a.a=new Hp;vZb(a,b,null);pZb(a,b);uZb(a);yNb(b,(wtc(),zsc),a.a);a.a=null;Uhb(a.b);Qdd(c)} +function X$b(a,b,c){switch(c.g){case 1:a.a=b.a/2;a.b=0;break;case 2:a.a=b.a;a.b=b.b/2;break;case 3:a.a=b.a/2;a.b=b.b;break;case 4:a.a=0;a.b=b.b/2;}} +function tkc(a){var b,c,d;for(d=BD(Qc(a.a,(Xjc(),Vjc)),15).Kc();d.Ob();){c=BD(d.Pb(),101);b=Bkc(c);kkc(a,c,b[0],(Fkc(),Ckc),0);kkc(a,c,b[1],Ekc,1)}} +function ukc(a){var b,c,d;for(d=BD(Qc(a.a,(Xjc(),Wjc)),15).Kc();d.Ob();){c=BD(d.Pb(),101);b=Bkc(c);kkc(a,c,b[0],(Fkc(),Ckc),0);kkc(a,c,b[1],Ekc,1)}} +function tXc(a){switch(a.g){case 0:return null;case 1:return new $Xc;case 2:return new QXc;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function OZc(a,b,c){var d,e;FZc(a,b-a.s,c-a.t);for(e=new olb(a.n);e.a1&&(f=GFb(a,b));return f} +function dmd(a){var b;if(!!a.f&&a.f.kh()){b=BD(a.f,49);a.f=BD(xid(a,b),82);a.f!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,8,b,a.f))}return a.f} +function emd(a){var b;if(!!a.i&&a.i.kh()){b=BD(a.i,49);a.i=BD(xid(a,b),82);a.i!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,7,b,a.i))}return a.i} +function zUd(a){var b;if(!!a.b&&(a.b.Db&64)!=0){b=a.b;a.b=BD(xid(a,b),18);a.b!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,21,b,a.b))}return a.b} +function uAd(a,b){var c,d,e;if(a.d==null){++a.e;++a.f}else{d=b.Sh();BAd(a,a.f+1);e=(d&Ohe)%a.d.length;c=a.d[e];!c&&(c=a.d[e]=a.uj());c.Fc(b);++a.f}} +function m3d(a,b,c){var d;if(b.Kj()){return false}else if(b.Zj()!=-2){d=b.zj();return d==null?c==null:pb(d,c)}else return b.Hj()==a.e.Tg()&&c==null} +function wo(){var a;Xj(16,Hie);a=Kp(16);this.b=KC(GF,Gie,317,a,0,1);this.c=KC(GF,Gie,317,a,0,1);this.a=null;this.e=null;this.i=0;this.f=a-1;this.g=0} +function b0b(a){n_b.call(this);this.k=(j0b(),h0b);this.j=(Xj(6,Jie),new Skb(6));this.b=(Xj(2,Jie),new Skb(2));this.d=new L_b;this.f=new s0b;this.a=a} +function Scc(a){var b,c;if(a.c.length<=1){return}b=Pcc(a,(Ucd(),Rcd));Rcc(a,BD(b.a,19).a,BD(b.b,19).a);c=Pcc(a,Tcd);Rcc(a,BD(c.a,19).a,BD(c.b,19).a)} +function Vzc(){Vzc=ccb;Uzc=new Xzc('SIMPLE',0);Rzc=new Xzc(Tne,1);Szc=new Xzc('LINEAR_SEGMENTS',2);Qzc=new Xzc('BRANDES_KOEPF',3);Tzc=new Xzc(Aqe,4)} +function XDc(a,b,c){if(!ecd(BD(vNb(b,(Nyc(),Vxc)),98))){WDc(a,b,Y_b(b,c));WDc(a,b,Y_b(b,(Ucd(),Rcd)));WDc(a,b,Y_b(b,Acd));mmb();Okb(b.j,new jEc(a))}} +function HVc(a,b,c,d){var e,f,g;e=d?BD(Qc(a.a,b),21):BD(Qc(a.b,b),21);for(g=e.Kc();g.Ob();){f=BD(g.Pb(),33);if(BVc(a,c,f)){return true}}return false} +function FMd(a){var b,c;for(c=new Fyd(a);c.e!=c.i.gc();){b=BD(Dyd(c),87);if(!!b.e||(!b.d&&(b.d=new xMd(j5,b,1)),b.d).i!=0){return true}}return false} +function QTd(a){var b,c;for(c=new Fyd(a);c.e!=c.i.gc();){b=BD(Dyd(c),87);if(!!b.e||(!b.d&&(b.d=new xMd(j5,b,1)),b.d).i!=0){return true}}return false} +function FDc(a){var b,c,d;b=0;for(d=new olb(a.c.a);d.a102)return -1;if(a<=57)return a-48;if(a<65)return -1;if(a<=70)return a-65+10;if(a<97)return -1;return a-97+10} +function Wj(a,b){if(a==null){throw vbb(new Heb('null key in entry: null='+b))}else if(b==null){throw vbb(new Heb('null value in entry: '+a+'=null'))}} +function kr(a,b){var c,d;while(a.Ob()){if(!b.Ob()){return false}c=a.Pb();d=b.Pb();if(!(PD(c)===PD(d)||c!=null&&pb(c,d))){return false}}return !b.Ob()} +function jIb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[pHb(a.a[0],b),pHb(a.a[1],b),pHb(a.a[2],b)]);if(a.d){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function kIb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[qHb(a.a[0],b),qHb(a.a[1],b),qHb(a.a[2],b)]);if(a.d){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function mqc(){mqc=ccb;iqc=new oqc('GREEDY',0);hqc=new oqc(Une,1);kqc=new oqc(Tne,2);lqc=new oqc('MODEL_ORDER',3);jqc=new oqc('GREEDY_MODEL_ORDER',4)} +function iUc(a,b){var c,d,e;a.b[b.g]=1;for(d=Jsb(b.d,0);d.b!=d.d.c;){c=BD(Xsb(d),188);e=c.c;a.b[e.g]==1?Dsb(a.a,c):a.b[e.g]==2?(a.b[e.g]=1):iUc(a,e)}} +function V9b(a,b){var c,d,e;e=new Skb(b.gc());for(d=b.Kc();d.Ob();){c=BD(d.Pb(),286);c.c==c.f?K9b(a,c,c.c):L9b(a,c)||(e.c[e.c.length]=c,true)}return e} +function IZc(a,b,c){var d,e,f,g,h;h=a.r+b;a.r+=b;a.d+=c;d=c/a.n.c.length;e=0;for(g=new olb(a.n);g.af&&NC(b,f,null);return b} +function Lu(a,b){var c,d;d=a.gc();if(b==null){for(c=0;c0&&(i+=e);j[k]=g;g+=h*(i+d)}} +function Uoc(a){var b,c,d;d=a.f;a.n=KC(UD,Vje,25,d,15,1);a.d=KC(UD,Vje,25,d,15,1);for(b=0;b0?a.c:0);++e}a.b=d;a.d=f} +function BZc(a,b){var c,d,e,f,g;d=0;e=0;c=0;for(g=new olb(b);g.a0?a.g:0);++c}a.c=e;a.d=d} +function AHb(a,b){var c;c=OC(GC(UD,1),Vje,25,15,[zHb(a,(gHb(),dHb),b),zHb(a,eHb,b),zHb(a,fHb,b)]);if(a.f){c[0]=$wnd.Math.max(c[0],c[2]);c[2]=c[0]}return c} +function lNb(b,c,d){var e;try{aNb(b,c+b.j,d+b.k,false,true)}catch(a){a=ubb(a);if(JD(a,73)){e=a;throw vbb(new qcb(e.g+Gle+c+She+d+').'))}else throw vbb(a)}} +function mNb(b,c,d){var e;try{aNb(b,c+b.j,d+b.k,true,false)}catch(a){a=ubb(a);if(JD(a,73)){e=a;throw vbb(new qcb(e.g+Gle+c+She+d+').'))}else throw vbb(a)}} +function d5b(a){var b;if(!wNb(a,(Nyc(),xxc))){return}b=BD(vNb(a,xxc),21);if(b.Hc((Hbd(),zbd))){b.Mc(zbd);b.Fc(Bbd)}else if(b.Hc(Bbd)){b.Mc(Bbd);b.Fc(zbd)}} +function e5b(a){var b;if(!wNb(a,(Nyc(),xxc))){return}b=BD(vNb(a,xxc),21);if(b.Hc((Hbd(),Gbd))){b.Mc(Gbd);b.Fc(Ebd)}else if(b.Hc(Ebd)){b.Mc(Ebd);b.Fc(Gbd)}} +function udc(a,b,c){Odd(c,'Self-Loop ordering',1);MAb(NAb(JAb(JAb(LAb(new YAb(null,new Kub(b.b,16)),new ydc),new Adc),new Cdc),new Edc),new Gdc(a));Qdd(c)} +function ikc(a,b,c,d){var e,f;for(e=b;e0&&(e.b+=b);return e} +function GXb(a,b){var c,d,e;e=new d7c;for(d=a.Kc();d.Ob();){c=BD(d.Pb(),37);uXb(c,0,e.b);e.b+=c.f.b+b;e.a=$wnd.Math.max(e.a,c.f.a)}e.a>0&&(e.a+=b);return e} +function d_b(a){var b,c,d;d=Ohe;for(c=new olb(a.a);c.a>16==6){return a.Cb.ih(a,5,o5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?a.zh():c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Wz(a){Rz();var b=a.e;if(b&&b.stack){var c=b.stack;var d=b+'\n';c.substring(0,d.length)==d&&(c=c.substring(d.length));return c.split('\n')}return []} +function jeb(a){var b;b=(qeb(),peb);return b[a>>>28]|b[a>>24&15]<<4|b[a>>20&15]<<8|b[a>>16&15]<<12|b[a>>12&15]<<16|b[a>>8&15]<<20|b[a>>4&15]<<24|b[a&15]<<28} +function _jb(a){var b,c,d;if(a.b!=a.c){return}d=a.a.length;c=geb($wnd.Math.max(8,d))<<1;if(a.b!=0){b=_Bb(a.a,c);$jb(a,b,d);a.a=b;a.b=0}else{dCb(a.a,c)}a.c=d} +function DKb(a,b){var c;c=a.b;return c.Xe((Y9c(),s9c))?c.Hf()==(Ucd(),Tcd)?-c.rf().a-Edb(ED(c.We(s9c))):b+Edb(ED(c.We(s9c))):c.Hf()==(Ucd(),Tcd)?-c.rf().a:b} +function P_b(a){var b;if(a.b.c.length!=0&&!!BD(Ikb(a.b,0),70).a){return BD(Ikb(a.b,0),70).a}b=JZb(a);if(b!=null){return b}return ''+(!a.c?-1:Jkb(a.c.a,a,0))} +function C0b(a){var b;if(a.f.c.length!=0&&!!BD(Ikb(a.f,0),70).a){return BD(Ikb(a.f,0),70).a}b=JZb(a);if(b!=null){return b}return ''+(!a.i?-1:Jkb(a.i.j,a,0))} +function Ogc(a,b){var c,d;if(b<0||b>=a.gc()){return null}for(c=b;c0?a.c:0);e=$wnd.Math.max(e,b.d);++d}a.e=f;a.b=e} +function shd(a){var b,c;if(!a.b){a.b=Qu(BD(a.f,118).Ag().i);for(c=new Fyd(BD(a.f,118).Ag());c.e!=c.i.gc();){b=BD(Dyd(c),137);Ekb(a.b,new dhd(b))}}return a.b} +function Ctd(a,b){var c,d,e;if(b.dc()){return LCd(),LCd(),KCd}else{c=new zyd(a,b.gc());for(e=new Fyd(a);e.e!=e.i.gc();){d=Dyd(e);b.Hc(d)&&wtd(c,d)}return c}} +function bkd(a,b,c,d){if(b==0){return d?(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),a.o):(!a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),FAd(a.o))}return fid(a,b,c,d)} +function Tnd(a){var b,c;if(a.rb){for(b=0,c=a.rb.i;b>22);e+=d>>22;if(e<0){return false}a.l=c&Eje;a.m=d&Eje;a.h=e&Fje;return true} +function Fwb(a,b,c,d,e,f,g){var h,i;if(b.Ae()&&(i=a.a.ue(c,d),i<0||!e&&i==0)){return false}if(b.Be()&&(h=a.a.ue(c,f),h>0||!g&&h==0)){return false}return true} +function Vcc(a,b){Occ();var c;c=a.j.g-b.j.g;if(c!=0){return 0}switch(a.j.g){case 2:return Ycc(b,Ncc)-Ycc(a,Ncc);case 4:return Ycc(a,Mcc)-Ycc(b,Mcc);}return 0} +function Tqc(a){switch(a.g){case 0:return Mqc;case 1:return Nqc;case 2:return Oqc;case 3:return Pqc;case 4:return Qqc;case 5:return Rqc;default:return null;}} +function End(a,b,c){var d,e;d=(e=new rUd,yId(e,b),pnd(e,c),wtd((!a.c&&(a.c=new cUd(p5,a,12,10)),a.c),e),e);AId(d,0);DId(d,1);CId(d,true);BId(d,true);return d} +function tud(a,b){var c,d;if(b>=a.i)throw vbb(new $zd(b,a.i));++a.j;c=a.g[b];d=a.i-b-1;d>0&&$fb(a.g,b+1,a.g,b,d);NC(a.g,--a.i,null);a.fi(b,c);a.ci();return c} +function UId(a,b){var c,d;if(a.Db>>16==17){return a.Cb.ih(a,21,c5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?a.zh():c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function iDb(a){var b,c,d,e;mmb();Okb(a.c,a.a);for(e=new olb(a.c);e.ac.a.c.length)){throw vbb(new Wdb('index must be >= 0 and <= layer node count'))}!!a.c&&Lkb(a.c.a,a);a.c=c;!!c&&Dkb(c.a,b,a)} +function p7b(a,b){var c,d,e;for(d=new Sr(ur(O_b(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);e=BD(b.Kb(c),10);return new cc(Qb(e.n.b+e.o.b/2))}return wb(),wb(),vb} +function rMc(a,b){this.c=new Lqb;this.a=a;this.b=b;this.d=BD(vNb(a,(wtc(),otc)),304);PD(vNb(a,(Nyc(),yxc)))===PD((_qc(),Zqc))?(this.e=new bNc):(this.e=new WMc)} +function $dd(a,b){var c,d,e,f;f=0;for(d=new olb(a);d.a>16==6){return a.Cb.ih(a,6,B2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Lhd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Eod(a,b){var c,d;if(a.Db>>16==7){return a.Cb.ih(a,1,C2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Nhd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function lpd(a,b){var c,d;if(a.Db>>16==9){return a.Cb.ih(a,9,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Phd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function mQd(a,b){var c,d;if(a.Db>>16==5){return a.Cb.ih(a,9,h5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),VFd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function KHd(a,b){var c,d;if(a.Db>>16==3){return a.Cb.ih(a,0,k5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),OFd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Snd(a,b){var c,d;if(a.Db>>16==7){return a.Cb.ih(a,6,o5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),cGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function ird(){this.a=new bqd;this.g=new wo;this.j=new wo;this.b=new Lqb;this.d=new wo;this.i=new wo;this.k=new Lqb;this.c=new Lqb;this.e=new Lqb;this.f=new Lqb} +function MCd(a,b,c){var d,e,f;c<0&&(c=0);f=a.i;for(e=c;eWje){return p6d(a,d)}if(d==a){return true}}}return false} +function HKb(a){CKb();switch(a.q.g){case 5:EKb(a,(Ucd(),Acd));EKb(a,Rcd);break;case 4:FKb(a,(Ucd(),Acd));FKb(a,Rcd);break;default:GKb(a,(Ucd(),Acd));GKb(a,Rcd);}} +function LKb(a){CKb();switch(a.q.g){case 5:IKb(a,(Ucd(),zcd));IKb(a,Tcd);break;case 4:JKb(a,(Ucd(),zcd));JKb(a,Tcd);break;default:KKb(a,(Ucd(),zcd));KKb(a,Tcd);}} +function XQb(a){var b,c;b=BD(vNb(a,(wSb(),pSb)),19);if(b){c=b.a;c==0?yNb(a,(HSb(),GSb),new Gub):yNb(a,(HSb(),GSb),new Hub(c))}else{yNb(a,(HSb(),GSb),new Hub(1))}} +function V$b(a,b){var c;c=a.i;switch(b.g){case 1:return -(a.n.b+a.o.b);case 2:return a.n.a-c.o.a;case 3:return a.n.b-c.o.b;case 4:return -(a.n.a+a.o.a);}return 0} +function hbc(a,b){switch(a.g){case 0:return b==(Ctc(),ytc)?dbc:ebc;case 1:return b==(Ctc(),ytc)?dbc:cbc;case 2:return b==(Ctc(),ytc)?cbc:ebc;default:return cbc;}} +function v$c(a,b){var c,d,e;Lkb(a.a,b);a.e-=b.r+(a.a.c.length==0?0:a.c);e=ere;for(d=new olb(a.a);d.a>16==3){return a.Cb.ih(a,12,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Khd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function Uod(a,b){var c,d;if(a.Db>>16==11){return a.Cb.ih(a,10,E2,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(Thd(),Ohd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function PSd(a,b){var c,d;if(a.Db>>16==10){return a.Cb.ih(a,11,c5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),aGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function qUd(a,b){var c,d;if(a.Db>>16==10){return a.Cb.ih(a,12,n5,b)}return d=zUd(BD(XKd((c=BD(Ajd(a,16),26),!c?(jGd(),dGd):c),a.Db>>16),18)),a.Cb.ih(a,d.n,d.f,b)} +function wId(a){var b;if((a.Bb&1)==0&&!!a.r&&a.r.kh()){b=BD(a.r,49);a.r=BD(xid(a,b),138);a.r!=b&&(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,9,8,b,a.r))}return a.r} +function yHb(a,b,c){var d;d=OC(GC(UD,1),Vje,25,15,[BHb(a,(gHb(),dHb),b,c),BHb(a,eHb,b,c),BHb(a,fHb,b,c)]);if(a.f){d[0]=$wnd.Math.max(d[0],d[2]);d[2]=d[0]}return d} +function O9b(a,b){var c,d,e;e=V9b(a,b);if(e.c.length==0){return}Okb(e,new pac);c=e.c.length;for(d=0;d>19;j=b.h>>19;if(i!=j){return j-i}e=a.h;h=b.h;if(e!=h){return e-h}d=a.m;g=b.m;if(d!=g){return d-g}c=a.l;f=b.l;return c-f} +function fFb(){fFb=ccb;eFb=(rFb(),oFb);dFb=new Nsd(Yke,eFb);cFb=(UEb(),TEb);bFb=new Nsd(Zke,cFb);aFb=(MEb(),LEb);_Eb=new Nsd($ke,aFb);$Eb=new Nsd(_ke,(Bcb(),true))} +function cfc(a,b,c){var d,e;d=b*c;if(JD(a.g,145)){e=ugc(a);if(e.f.d){e.f.a||(a.d.a+=d+ple)}else{a.d.d-=d+ple;a.d.a+=d+ple}}else if(JD(a.g,10)){a.d.d-=d;a.d.a+=2*d}} +function vmc(a,b,c){var d,e,f,g,h;e=a[c.g];for(h=new olb(b.d);h.a0?a.g:0);++c}b.b=d;b.e=e} +function to(a){var b,c,d;d=a.b;if(Lp(a.i,d.length)){c=d.length*2;a.b=KC(GF,Gie,317,c,0,1);a.c=KC(GF,Gie,317,c,0,1);a.f=c-1;a.i=0;for(b=a.a;b;b=b.c){po(a,b,b)}++a.g}} +function cNb(a,b,c,d){var e,f,g,h;for(e=0;eg&&(h=g/d);e>f&&(i=f/e);Y6c(a,$wnd.Math.min(h,i));return a} +function ond(){Smd();var b,c;try{c=BD(mUd((yFd(),xFd),yte),2014);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new knd} +function Y9d(){A9d();var b,c;try{c=BD(mUd((yFd(),xFd),Ewe),2024);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new U9d} +function qZd(){Smd();var b,c;try{c=BD(mUd((yFd(),xFd),_ve),1941);if(c){return c}}catch(a){a=ubb(a);if(JD(a,102)){b=a;uvd((h0d(),b))}else throw vbb(a)}return new mZd} +function HQd(a,b,c){var d,e;e=a.e;a.e=b;if((a.Db&4)!=0&&(a.Db&1)==0){d=new nSd(a,1,4,e,b);!c?(c=d):c.Ei(d)}e!=b&&(b?(c=QQd(a,MQd(a,b),c)):(c=QQd(a,a.a,c)));return c} +function nB(){eB.call(this);this.e=-1;this.a=false;this.p=Rie;this.k=-1;this.c=-1;this.b=-1;this.g=false;this.f=-1;this.j=-1;this.n=-1;this.i=-1;this.d=-1;this.o=Rie} +function qEb(a,b){var c,d,e;d=a.b.d.d;a.a||(d+=a.b.d.a);e=b.b.d.d;b.a||(e+=b.b.d.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function eOb(a,b){var c,d,e;d=a.b.b.d;a.a||(d+=a.b.b.a);e=b.b.b.d;b.a||(e+=b.b.b.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function PVb(a,b){var c,d,e;d=a.b.g.d;a.a||(d+=a.b.g.a);e=b.b.g.d;b.a||(e+=b.b.g.a);c=Kdb(d,e);if(c==0){if(!a.a&&b.a){return -1}else if(!b.a&&a.a){return 1}}return c} +function ZTb(){ZTb=ccb;WTb=c3c(e3c(e3c(e3c(new j3c,(qUb(),oUb),(S8b(),m8b)),oUb,q8b),pUb,x8b),pUb,a8b);YTb=e3c(e3c(new j3c,oUb,S7b),oUb,b8b);XTb=c3c(new j3c,pUb,d8b)} +function s3b(a){var b,c,d,e,f;b=BD(vNb(a,(wtc(),Csc)),83);f=a.n;for(d=b.Cc().Kc();d.Ob();){c=BD(d.Pb(),306);e=c.i;e.c+=f.a;e.d+=f.b;c.c?VHb(c):XHb(c)}yNb(a,Csc,null)} +function qmc(a,b,c){var d,e;e=a.b;d=e.d;switch(b.g){case 1:return -d.d-c;case 2:return e.o.a+d.c+c;case 3:return e.o.b+d.a+c;case 4:return -d.b-c;default:return -1;}} +function BXc(a){var b,c,d,e,f;d=0;e=dme;if(a.b){for(b=0;b<360;b++){c=b*0.017453292519943295;zXc(a,a.d,0,0,dre,c);f=a.b.ig(a.d);if(f0){g=(f&Ohe)%a.d.length;e=wAd(a,g,f,b);if(e){h=e.ed(c);return h}}d=a.tj(f,b,c);a.c.Fc(d);return null} +function t1d(a,b){var c,d,e,f;switch(o1d(a,b)._k()){case 3:case 2:{c=OKd(b);for(e=0,f=c.i;e=0;d--){if(dfb(a[d].d,b)||dfb(a[d].d,c)){a.length>=d+1&&a.splice(0,d+1);break}}return a} +function Abb(a,b){var c;if(Fbb(a)&&Fbb(b)){c=a/b;if(Kje0){a.b+=2;a.a+=d}}else{a.b+=1;a.a+=$wnd.Math.min(d,e)}} +function Rpd(a,b){var c,d;d=false;if(ND(b)){d=true;Qpd(a,new yC(GD(b)))}if(!d){if(JD(b,236)){d=true;Qpd(a,(c=Kcb(BD(b,236)),new TB(c)))}}if(!d){throw vbb(new vcb(Ute))}} +function IMd(a,b,c,d){var e,f,g;e=new pSd(a.e,1,10,(g=b.c,JD(g,88)?BD(g,26):(jGd(),_Fd)),(f=c.c,JD(f,88)?BD(f,26):(jGd(),_Fd)),HLd(a,b),false);!d?(d=e):d.Ei(e);return d} +function T_b(a){var b,c;switch(BD(vNb(Q_b(a),(Nyc(),ixc)),420).g){case 0:b=a.n;c=a.o;return new f7c(b.a+c.a/2,b.b+c.b/2);case 1:return new g7c(a.n);default:return null;}} +function lrc(){lrc=ccb;irc=new mrc(ane,0);hrc=new mrc('LEFTUP',1);krc=new mrc('RIGHTUP',2);grc=new mrc('LEFTDOWN',3);jrc=new mrc('RIGHTDOWN',4);frc=new mrc('BALANCED',5)} +function FFc(a,b,c){var d,e,f;d=Kdb(a.a[b.p],a.a[c.p]);if(d==0){e=BD(vNb(b,(wtc(),Qsc)),15);f=BD(vNb(c,Qsc),15);if(e.Hc(c)){return -1}else if(f.Hc(b)){return 1}}return d} +function jXc(a){switch(a.g){case 1:return new XVc;case 2:return new ZVc;case 3:return new VVc;case 0:return null;default:throw vbb(new Wdb(jre+(a.f!=null?a.f:''+a.g)));}} +function Ikd(a,b,c){switch(b){case 1:!a.n&&(a.n=new cUd(D2,a,1,7));Uxd(a.n);!a.n&&(a.n=new cUd(D2,a,1,7));ytd(a.n,BD(c,14));return;case 2:Lkd(a,GD(c));return;}ekd(a,b,c)} +function Zkd(a,b,c){switch(b){case 3:ald(a,Edb(ED(c)));return;case 4:cld(a,Edb(ED(c)));return;case 5:dld(a,Edb(ED(c)));return;case 6:eld(a,Edb(ED(c)));return;}Ikd(a,b,c)} +function Fnd(a,b,c){var d,e,f;f=(d=new rUd,d);e=xId(f,b,null);!!e&&e.Fi();pnd(f,c);wtd((!a.c&&(a.c=new cUd(p5,a,12,10)),a.c),f);AId(f,0);DId(f,1);CId(f,true);BId(f,true)} +function mUd(a,b){var c,d,e;c=Crb(a.g,b);if(JD(c,235)){e=BD(c,235);e.Qh()==null&&undefined;return e.Nh()}else if(JD(c,498)){d=BD(c,1938);e=d.b;return e}else{return null}} +function Ui(a,b,c,d){var e,f;Qb(b);Qb(c);f=BD(tn(a.d,b),19);Ob(!!f,'Row %s not in %s',b,a.e);e=BD(tn(a.b,c),19);Ob(!!e,'Column %s not in %s',c,a.c);return Wi(a,f.a,e.a,d)} +function JC(a,b,c,d,e,f,g){var h,i,j,k,l;k=e[f];j=f==g-1;h=j?d:0;l=LC(h,k);d!=10&&OC(GC(a,g-f),b[f],c[f],h,l);if(!j){++f;for(i=0;i1||h==-1){f=BD(i,15);e.Wb(t6d(a,f))}else{e.Wb(s6d(a,BD(i,56)))}}}} +function Zbb(b,c,d,e){Ybb();var f=Wbb;$moduleName=c;$moduleBase=d;tbb=e;function g(){for(var a=0;aOqe){return c}else e>-1.0E-6&&++c}return c} +function PQd(a,b){var c;if(b!=a.b){c=null;!!a.b&&(c=lid(a.b,a,-4,c));!!b&&(c=kid(b,a,-4,c));c=GQd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function SQd(a,b){var c;if(b!=a.f){c=null;!!a.f&&(c=lid(a.f,a,-1,c));!!b&&(c=kid(b,a,-1,c));c=IQd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,0,b,b))} +function E9d(a){var b,c,d;if(a==null)return null;c=BD(a,15);if(c.dc())return '';d=new Hfb;for(b=c.Kc();b.Ob();){Efb(d,(Q8d(),GD(b.Pb())));d.a+=' '}return lcb(d,d.a.length-1)} +function I9d(a){var b,c,d;if(a==null)return null;c=BD(a,15);if(c.dc())return '';d=new Hfb;for(b=c.Kc();b.Ob();){Efb(d,(Q8d(),GD(b.Pb())));d.a+=' '}return lcb(d,d.a.length-1)} +function qEc(a,b,c){var d,e;d=a.c[b.c.p][b.p];e=a.c[c.c.p][c.p];if(d.a!=null&&e.a!=null){return Ddb(d.a,e.a)}else if(d.a!=null){return -1}else if(e.a!=null){return 1}return 0} +function zqd(a,b){var c,d,e,f,g,h;if(b){f=b.a.length;c=new Yge(f);for(h=(c.b-c.a)*c.c<0?(Xge(),Wge):new she(c);h.Ob();){g=BD(h.Pb(),19);e=Zpd(b,g.a);d=new Crd(a);Aqd(d.a,e)}}} +function Qqd(a,b){var c,d,e,f,g,h;if(b){f=b.a.length;c=new Yge(f);for(h=(c.b-c.a)*c.c<0?(Xge(),Wge):new she(c);h.Ob();){g=BD(h.Pb(),19);e=Zpd(b,g.a);d=new lrd(a);nqd(d.a,e)}}} +function eFd(b){var c;if(b!=null&&b.length>0&&bfb(b,b.length-1)==33){try{c=PEd(qfb(b,0,b.length-1));return c.e==null}catch(a){a=ubb(a);if(!JD(a,32))throw vbb(a)}}return false} +function h3d(a,b,c){var d,e,f;d=b.ak();f=b.dd();e=d.$j()?H2d(a,3,d,null,f,M2d(a,d,f,JD(d,99)&&(BD(d,18).Bb&Tje)!=0),true):H2d(a,1,d,d.zj(),f,-1,true);c?c.Ei(e):(c=e);return c} +function Vee(){var a,b,c;b=0;for(a=0;a<'X'.length;a++){c=Uee((BCb(a,'X'.length),'X'.charCodeAt(a)));if(c==0)throw vbb(new mde('Unknown Option: '+'X'.substr(a)));b|=c}return b} +function mZb(a,b,c){var d,e,f;d=Q_b(b);e=a_b(d);f=new H0b;F0b(f,b);switch(c.g){case 1:G0b(f,Wcd(Zcd(e)));break;case 2:G0b(f,Zcd(e));}yNb(f,(Nyc(),Uxc),ED(vNb(a,Uxc)));return f} +function U9b(a){var b,c;b=BD(Rr(new Sr(ur(R_b(a.a).a.Kc(),new Sq))),17);c=BD(Rr(new Sr(ur(U_b(a.a).a.Kc(),new Sq))),17);return Ccb(DD(vNb(b,(wtc(),ltc))))||Ccb(DD(vNb(c,ltc)))} +function Xjc(){Xjc=ccb;Tjc=new Yjc('ONE_SIDE',0);Vjc=new Yjc('TWO_SIDES_CORNER',1);Wjc=new Yjc('TWO_SIDES_OPPOSING',2);Ujc=new Yjc('THREE_SIDES',3);Sjc=new Yjc('FOUR_SIDES',4)} +function jkc(a,b,c,d,e){var f,g;f=BD(GAb(JAb(b.Oc(),new _kc),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);g=BD(Si(a.b,c,d),15);e==0?g.Wc(0,f):g.Gc(f)} +function KDc(a,b){var c,d,e,f,g;for(f=new olb(b.a);f.a0&&ric(this,this.c-1,(Ucd(),zcd));this.c0&&a[0].length>0&&(this.c=Ccb(DD(vNb(Q_b(a[0][0]),(wtc(),Rsc)))));this.a=KC(CX,nie,2018,a.length,0,2);this.b=KC(FX,nie,2019,a.length,0,2);this.d=new ss} +function tKc(a){if(a.c.length==0){return false}if((tCb(0,a.c.length),BD(a.c[0],17)).c.i.k==(j0b(),g0b)){return true}return FAb(NAb(new YAb(null,new Kub(a,16)),new wKc),new yKc)} +function rRc(a,b,c){Odd(c,'Tree layout',1);H2c(a.b);K2c(a.b,(yRc(),uRc),uRc);K2c(a.b,vRc,vRc);K2c(a.b,wRc,wRc);K2c(a.b,xRc,xRc);a.a=F2c(a.b,b);sRc(a,b,Udd(c,1));Qdd(c);return b} +function HXc(a,b){var c,d,e,f,g,h,i;h=gVc(b);f=b.f;i=b.g;g=$wnd.Math.sqrt(f*f+i*i);e=0;for(d=new olb(h);d.a=0){c=Abb(a,Jje);d=Hbb(a,Jje)}else{b=Pbb(a,1);c=Abb(b,500000000);d=Hbb(b,500000000);d=wbb(Nbb(d,1),xbb(a,1))}return Mbb(Nbb(d,32),xbb(c,Yje))} +function oQb(a,b,c){var d,e;d=(sCb(b.b!=0),BD(Nsb(b,b.a.a),8));switch(c.g){case 0:d.b=0;break;case 2:d.b=a.f;break;case 3:d.a=0;break;default:d.a=a.g;}e=Jsb(b,0);Vsb(e,d);return b} +function pmc(a,b,c,d){var e,f,g,h,i;i=a.b;f=b.d;g=f.j;h=umc(g,i.d[g.g],c);e=P6c(R6c(f.n),f.a);switch(f.j.g){case 1:case 3:h.a+=e.a;break;case 2:case 4:h.b+=e.b;}Gsb(d,h,d.c.b,d.c)} +function yJc(a,b,c){var d,e,f,g;g=Jkb(a.e,b,0);f=new zJc;f.b=c;d=new Bib(a.e,g);while(d.b1;b>>=1){(b&1)!=0&&(d=Ogb(d,c));c.d==1?(c=Ogb(c,c)):(c=new Xgb(Lhb(c.a,c.d,KC(WD,oje,25,c.d<<1,15,1))))}d=Ogb(d,c);return d} +function zub(){zub=ccb;var a,b,c,d;wub=KC(UD,Vje,25,25,15,1);xub=KC(UD,Vje,25,33,15,1);d=1.52587890625E-5;for(b=32;b>=0;b--){xub[b]=d;d*=0.5}c=1;for(a=24;a>=0;a--){wub[a]=c;c*=0.5}} +function S1b(a){var b,c;if(Ccb(DD(hkd(a,(Nyc(),fxc))))){for(c=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),79);if(Qld(b)){if(Ccb(DD(hkd(b,gxc)))){return true}}}}return false} +function kjc(a,b){var c,d,e;if(Qqb(a.f,b)){b.b=a;d=b.c;Jkb(a.j,d,0)!=-1||Ekb(a.j,d);e=b.d;Jkb(a.j,e,0)!=-1||Ekb(a.j,e);c=b.a.b;if(c.c.length!=0){!a.i&&(a.i=new vjc(a));qjc(a.i,c)}}} +function rmc(a){var b,c,d,e,f;c=a.c.d;d=c.j;e=a.d.d;f=e.j;if(d==f){return c.p=0&&dfb(a.substr(b,'GMT'.length),'GMT')){c[0]=b+3;return tA(a,c,d)}if(b>=0&&dfb(a.substr(b,'UTC'.length),'UTC')){c[0]=b+3;return tA(a,c,d)}return tA(a,c,d)} +function tjc(a,b){var c,d,e,f,g;f=a.g.a;g=a.g.b;for(d=new olb(a.d);d.ac;f--){a[f]|=b[f-c-1]>>>g;a[f-1]=b[f-c-1]<=a.f){break}f.c[f.c.length]=c}return f} +function sfd(a){var b,c,d,e;b=null;for(e=new olb(a.wf());e.a0&&$fb(a.g,b,a.g,b+d,h);g=c.Kc();a.i+=d;for(e=0;ef&&nfb(j,sfb(c[h],ltb))){e=h;f=i}}e>=0&&(d[0]=b+f);return e} +function MIb(a,b){var c;c=NIb(a.b.Hf(),b.b.Hf());if(c!=0){return c}switch(a.b.Hf().g){case 1:case 2:return beb(a.b.sf(),b.b.sf());case 3:case 4:return beb(b.b.sf(),a.b.sf());}return 0} +function iRb(a){var b,c,d;d=a.e.c.length;a.a=IC(WD,[nie,oje],[48,25],15,[d,d],2);for(c=new olb(a.c);c.a>4&15;f=a[d]&15;g[e++]=Qmd[c];g[e++]=Qmd[f]}return zfb(g,0,g.length)}} +function j3d(a,b,c){var d,e,f;d=b.ak();f=b.dd();e=d.$j()?H2d(a,4,d,f,null,M2d(a,d,f,JD(d,99)&&(BD(d,18).Bb&Tje)!=0),true):H2d(a,d.Kj()?2:1,d,f,d.zj(),-1,true);c?c.Ei(e):(c=e);return c} +function wfb(a){var b,c;if(a>=Tje){b=Uje+(a-Tje>>10&1023)&aje;c=56320+(a-Tje&1023)&aje;return String.fromCharCode(b)+(''+String.fromCharCode(c))}else{return String.fromCharCode(a&aje)}} +function bKb(a,b){$Jb();var c,d,e,f;e=BD(BD(Qc(a.r,b),21),84);if(e.gc()>=2){d=BD(e.Kc().Pb(),111);c=a.u.Hc((rcd(),mcd));f=a.u.Hc(qcd);return !d.a&&!c&&(e.gc()==2||f)}else{return false}} +function IVc(a,b,c,d,e){var f,g,h;f=JVc(a,b,c,d,e);h=false;while(!f){AVc(a,e,true);h=true;f=JVc(a,b,c,d,e)}h&&AVc(a,e,false);g=dVc(e);if(g.c.length!=0){!!a.d&&a.d.lg(g);IVc(a,e,c,d,g)}} +function Mad(){Mad=ccb;Kad=new Nad(ane,0);Iad=new Nad('DIRECTED',1);Lad=new Nad('UNDIRECTED',2);Gad=new Nad('ASSOCIATION',3);Jad=new Nad('GENERALIZATION',4);Had=new Nad('DEPENDENCY',5)} +function kfd(a,b){var c;if(!mpd(a)){throw vbb(new Zdb(Sse))}c=mpd(a);switch(b.g){case 1:return -(a.j+a.f);case 2:return a.i-c.g;case 3:return a.j-c.f;case 4:return -(a.i+a.g);}return 0} +function cub(a,b){var c,d;uCb(b);d=a.b.c.length;Ekb(a.b,b);while(d>0){c=d;d=(d-1)/2|0;if(a.a.ue(Ikb(a.b,d),b)<=0){Nkb(a.b,c,b);return true}Nkb(a.b,c,Ikb(a.b,d))}Nkb(a.b,d,b);return true} +function BHb(a,b,c,d){var e,f;e=0;if(!c){for(f=0;f=h} +function Tpd(a,b,c,d){var e;e=false;if(ND(d)){e=true;Upd(b,c,GD(d))}if(!e){if(KD(d)){e=true;Tpd(a,b,c,d)}}if(!e){if(JD(d,236)){e=true;Spd(b,c,BD(d,236))}}if(!e){throw vbb(new vcb(Ute))}} +function W0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),Sve);if(e!=null){for(d=1;d<(O6d(),K6d).length;++d){if(dfb(K6d[d],e)){return d}}}}return 0} +function X0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),Sve);if(e!=null){for(d=1;d<(O6d(),L6d).length;++d){if(dfb(L6d[d],e)){return d}}}}return 0} +function Ve(a,b){var c,d,e,f;uCb(b);f=a.a.gc();if(f0?1:0;while(f.a[e]!=c){f=f.a[e];e=a.a.ue(c.d,f.d)>0?1:0}f.a[e]=d;d.b=c.b;d.a[0]=c.a[0];d.a[1]=c.a[1];c.a[0]=null;c.a[1]=null} +function ucd(a){rcd();var b,c;b=qqb(ncd,OC(GC(E1,1),Kie,273,0,[pcd]));if(Ox(Cx(b,a))>1){return false}c=qqb(mcd,OC(GC(E1,1),Kie,273,0,[lcd,qcd]));if(Ox(Cx(c,a))>1){return false}return true} +function fod(a,b){var c;c=Phb((yFd(),xFd),a);JD(c,498)?Shb(xFd,a,new bUd(this,b)):Shb(xFd,a,this);bod(this,b);if(b==(LFd(),KFd)){this.wb=BD(this,1939);BD(b,1941)}else{this.wb=(NFd(),MFd)}} +function lZd(b){var c,d,e;if(b==null){return null}c=null;for(d=0;d=_ie?'error':d>=900?'warn':d>=800?'info':'log');gCb(c,a.a);!!a.b&&hCb(b,c,a.b,'Exception: ',true)} +function vNb(a,b){var c,d;d=(!a.q&&(a.q=new Lqb),Ohb(a.q,b));if(d!=null){return d}c=b.wg();JD(c,4)&&(c==null?(!a.q&&(a.q=new Lqb),Thb(a.q,b)):(!a.q&&(a.q=new Lqb),Rhb(a.q,b,c)),a);return c} +function qUb(){qUb=ccb;lUb=new rUb('P1_CYCLE_BREAKING',0);mUb=new rUb('P2_LAYERING',1);nUb=new rUb('P3_NODE_ORDERING',2);oUb=new rUb('P4_NODE_PLACEMENT',3);pUb=new rUb('P5_EDGE_ROUTING',4)} +function SUb(a,b){var c,d,e,f,g;e=b==1?KUb:JUb;for(d=e.a.ec().Kc();d.Ob();){c=BD(d.Pb(),103);for(g=BD(Qc(a.f.c,c),21).Kc();g.Ob();){f=BD(g.Pb(),46);Lkb(a.b.b,f.b);Lkb(a.b.a,BD(f.b,81).d)}}} +function IWb(a,b){AWb();var c;if(a.c==b.c){if(a.b==b.b||pWb(a.b,b.b)){c=mWb(a.b)?1:-1;if(a.a&&!b.a){return c}else if(!a.a&&b.a){return -c}}return beb(a.b.g,b.b.g)}else{return Kdb(a.c,b.c)}} +function y6b(a,b){var c;Odd(b,'Hierarchical port position processing',1);c=a.b;c.c.length>0&&x6b((tCb(0,c.c.length),BD(c.c[0],29)),a);c.c.length>1&&x6b(BD(Ikb(c,c.c.length-1),29),a);Qdd(b)} +function RVc(a,b){var c,d,e;if(CVc(a,b)){return true}for(d=new olb(b);d.a=e||b<0)throw vbb(new qcb(lue+b+mue+e));if(c>=e||c<0)throw vbb(new qcb(nue+c+mue+e));b!=c?(d=(f=a.Ti(c),a.Hi(b,f),f)):(d=a.Oi(c));return d} +function m6d(a){var b,c,d;d=a;if(a){b=0;for(c=a.Ug();c;c=c.Ug()){if(++b>Wje){return m6d(c)}d=c;if(c==a){throw vbb(new Zdb('There is a cycle in the containment hierarchy of '+a))}}}return d} +function Fe(a){var b,c,d;d=new xwb(She,'[',']');for(c=a.Kc();c.Ob();){b=c.Pb();uwb(d,PD(b)===PD(a)?'(this Collection)':b==null?Xhe:fcb(b))}return !d.a?d.c:d.e.length==0?d.a.a:d.a.a+(''+d.e)} +function CVc(a,b){var c,d;d=false;if(b.gc()<2){return false}for(c=0;cd&&(BCb(b-1,a.length),a.charCodeAt(b-1)<=32)){--b}return d>0||b1&&(a.j.b+=a.e)}else{a.j.a+=c.a;a.j.b=$wnd.Math.max(a.j.b,c.b);a.d.c.length>1&&(a.j.a+=a.e)}} +function gkc(){gkc=ccb;dkc=OC(GC(F1,1),bne,61,0,[(Ucd(),Acd),zcd,Rcd]);ckc=OC(GC(F1,1),bne,61,0,[zcd,Rcd,Tcd]);ekc=OC(GC(F1,1),bne,61,0,[Rcd,Tcd,Acd]);fkc=OC(GC(F1,1),bne,61,0,[Tcd,Acd,zcd])} +function omc(a,b,c,d){var e,f,g,h,i,j,k;g=a.c.d;h=a.d.d;if(g.j==h.j){return}k=a.b;e=g.j;i=null;while(e!=h.j){i=b==0?Xcd(e):Vcd(e);f=umc(e,k.d[e.g],c);j=umc(i,k.d[i.g],c);Dsb(d,P6c(f,j));e=i}} +function oFc(a,b,c,d){var e,f,g,h,i;g=JHc(a.a,b,c);h=BD(g.a,19).a;f=BD(g.b,19).a;if(d){i=BD(vNb(b,(wtc(),gtc)),10);e=BD(vNb(c,gtc),10);if(!!i&&!!e){mic(a.b,i,e);h+=a.b.i;f+=a.b.e}}return h>f} +function oHc(a){var b,c,d,e,f,g,h,i,j;this.a=lHc(a);this.b=new Rkb;for(c=a,d=0,e=c.length;dwic(a.d).c){a.i+=a.g.c;yic(a.d)}else if(wic(a.d).c>wic(a.g).c){a.e+=a.d.c;yic(a.g)}else{a.i+=vic(a.g);a.e+=vic(a.d);yic(a.g);yic(a.d)}}} +function XOc(a,b,c){var d,e,f,g;f=b.q;g=b.r;new DOc((HOc(),FOc),b,f,1);new DOc(FOc,f,g,1);for(e=new olb(c);e.ah&&(i=h/d);e>f&&(j=f/e);g=$wnd.Math.min(i,j);a.a+=g*(b.a-a.a);a.b+=g*(b.b-a.b)} +function sZc(a,b,c,d,e){var f,g;g=false;f=BD(Ikb(c.b,0),33);while(yZc(a,b,f,d,e)){g=true;NZc(c,f);if(c.b.c.length==0){break}f=BD(Ikb(c.b,0),33)}c.b.c.length==0&&v$c(c.j,c);g&&a$c(b.q);return g} +function t6c(a,b){i6c();var c,d,e,f;if(b.b<2){return false}f=Jsb(b,0);c=BD(Xsb(f),8);d=c;while(f.b!=f.d.c){e=BD(Xsb(f),8);if(s6c(a,d,e)){return true}d=e}if(s6c(a,d,c)){return true}return false} +function ckd(a,b,c,d){var e,f;if(c==0){return !a.o&&(a.o=new dId((Thd(),Qhd),S2,a,0)),bId(a.o,b,d)}return f=BD(XKd((e=BD(Ajd(a,16),26),!e?a.zh():e),c),66),f.Nj().Rj(a,yjd(a),c-aLd(a.zh()),b,d)} +function bod(a,b){var c;if(b!=a.sb){c=null;!!a.sb&&(c=BD(a.sb,49).ih(a,1,i5,c));!!b&&(c=BD(b,49).gh(a,1,i5,c));c=Jnd(a,b,c);!!c&&c.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,4,b,b))} +function yqd(a,b){var c,d,e,f;if(b){e=Xpd(b,'x');c=new zrd(a);hmd(c.a,(uCb(e),e));f=Xpd(b,'y');d=new Ard(a);imd(d.a,(uCb(f),f))}else{throw vbb(new cqd('All edge sections need an end point.'))}} +function wqd(a,b){var c,d,e,f;if(b){e=Xpd(b,'x');c=new wrd(a);omd(c.a,(uCb(e),e));f=Xpd(b,'y');d=new xrd(a);pmd(d.a,(uCb(f),f))}else{throw vbb(new cqd('All edge sections need a start point.'))}} +function pyb(a,b){var c,d,e,f,g,h,i;for(d=syb(a),f=0,h=d.length;f>22-b;e=a.h<>22-b}else if(b<44){c=0;d=a.l<>44-b}else{c=0;d=0;e=a.l<a){throw vbb(new Wdb('k must be smaller than n'))}else return b==0||b==a?1:a==0?0:q6c(a)/(q6c(b)*q6c(a-b))} +function jfd(a,b){var c,d,e,f;c=new _ud(a);while(c.g==null&&!c.c?Uud(c):c.g==null||c.i!=0&&BD(c.g[c.i-1],47).Ob()){f=BD(Vud(c),56);if(JD(f,160)){d=BD(f,160);for(e=0;e>4];b[c*2+1]=gde[f&15]}return zfb(b,0,b.length)} +function fn(a){Vm();var b,c,d;d=a.c.length;switch(d){case 0:return Um;case 1:b=BD(qr(new olb(a)),42);return ln(b.cd(),b.dd());default:c=BD(Qkb(a,KC(CK,zie,42,a.c.length,0,1)),165);return new wx(c);}} +function ITb(a){var b,c,d,e,f,g;b=new jkb;c=new jkb;Wjb(b,a);Wjb(c,a);while(c.b!=c.c){e=BD(fkb(c),37);for(g=new olb(e.a);g.a0&&WGc(a,c,b);return e}return TGc(a,b,c)} +function MSc(a,b,c){var d,e,f,g;if(b.b!=0){d=new Psb;for(g=Jsb(b,0);g.b!=g.d.c;){f=BD(Xsb(g),86);ye(d,URc(f));e=f.e;e.a=BD(vNb(f,(mTc(),kTc)),19).a;e.b=BD(vNb(f,lTc),19).a}MSc(a,d,Udd(c,d.b/a.a|0))}} +function JZc(a,b){var c,d,e,f,g;if(a.e<=b){return a.g}if(LZc(a,a.g,b)){return a.g}f=a.r;d=a.g;g=a.r;e=(f-d)/2+d;while(d+11&&(a.e.b+=a.a)}else{a.e.a+=c.a;a.e.b=$wnd.Math.max(a.e.b,c.b);a.d.c.length>1&&(a.e.a+=a.a)}} +function cmc(a){var b,c,d,e;e=a.i;b=e.b;d=e.j;c=e.g;switch(e.a.g){case 0:c.a=(a.g.b.o.a-d.a)/2;break;case 1:c.a=b.d.n.a+b.d.a.a;break;case 2:c.a=b.d.n.a+b.d.a.a-d.a;break;case 3:c.b=b.d.n.b+b.d.a.b;}} +function Q6c(a,b,c,d,e){if(dd&&(a.a=d);a.be&&(a.b=e);return a} +function lsd(a){if(JD(a,149)){return esd(BD(a,149))}else if(JD(a,229)){return fsd(BD(a,229))}else if(JD(a,23)){return gsd(BD(a,23))}else{throw vbb(new Wdb(Xte+Fe(new amb(OC(GC(SI,1),Uhe,1,5,[a])))))}} +function mhb(a,b,c,d,e){var f,g,h;f=true;for(g=0;g>>e|c[g+d+1]<>>e;++g}return f} +function zMc(a,b,c,d){var e,f,g;if(b.k==(j0b(),g0b)){for(f=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);g=e.c.i.k;if(g==g0b&&a.c.a[e.c.i.c.p]==d&&a.c.a[b.c.p]==c){return true}}}return false} +function mD(a,b){var c,d,e,f;b&=63;c=a.h&Fje;if(b<22){f=c>>>b;e=a.m>>b|c<<22-b;d=a.l>>b|a.m<<22-b}else if(b<44){f=0;e=c>>>b-22;d=a.m>>b-22|a.h<<44-b}else{f=0;e=0;d=c>>>b-44}return TC(d&Eje,e&Eje,f&Fje)} +function Iic(a,b,c,d){var e;this.b=d;this.e=a==(rGc(),pGc);e=b[c];this.d=IC(sbb,[nie,dle],[177,25],16,[e.length,e.length],2);this.a=IC(WD,[nie,oje],[48,25],15,[e.length,e.length],2);this.c=new sic(b,c)} +function ljc(a){var b,c,d;a.k=new Ki((Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])).length,a.j.c.length);for(d=new olb(a.j);d.a=c){K9b(a,b,d.p);return true}}return false} +function Iod(a){var b;if((a.Db&64)!=0)return fld(a);b=new Wfb(dte);!a.a||Qfb(Qfb((b.a+=' "',b),a.a),'"');Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function Z2d(a,b,c){var d,e,f,g,h;h=S6d(a.e.Tg(),b);e=BD(a.g,119);d=0;for(g=0;gc){return Jb(a,c,'start index')}if(b<0||b>c){return Jb(b,c,'end index')}return hc('end index (%s) must not be less than start index (%s)',OC(GC(SI,1),Uhe,1,5,[meb(b),meb(a)]))} +function Pz(b,c){var d,e,f,g;for(e=0,f=b.length;e0&&iCc(a,f,c))}}b.p=0} +function p5c(a){var b;this.c=new Psb;this.f=a.e;this.e=a.d;this.i=a.g;this.d=a.c;this.b=a.b;this.k=a.j;this.a=a.a;!a.i?(this.j=(b=BD(gdb(e1),9),new xqb(b,BD(_Bb(b,b.length),9),0))):(this.j=a.i);this.g=a.f} +function Wb(a){var b,c,d,e;b=Kfb(Qfb(new Wfb('Predicates.'),'and'),40);c=true;for(e=new vib(a);e.b0?h[g-1]:KC(OQ,kne,10,0,0,1);e=h[g];j=g=0?a.Bh(e):vid(a,d)}else{throw vbb(new Wdb(ite+d.ne()+jte))}}else{eid(a,c,d)}} +function aqd(a){var b,c;c=null;b=false;if(JD(a,204)){b=true;c=BD(a,204).a}if(!b){if(JD(a,258)){b=true;c=''+BD(a,258).a}}if(!b){if(JD(a,483)){b=true;c=''+BD(a,483).a}}if(!b){throw vbb(new vcb(Ute))}return c} +function ORd(a,b){var c,d;if(a.f){while(b.Ob()){c=BD(b.Pb(),72);d=c.ak();if(JD(d,99)&&(BD(d,18).Bb&ote)!=0&&(!a.e||d.Gj()!=x2||d.aj()!=0)&&c.dd()!=null){b.Ub();return true}}return false}else{return b.Ob()}} +function QRd(a,b){var c,d;if(a.f){while(b.Sb()){c=BD(b.Ub(),72);d=c.ak();if(JD(d,99)&&(BD(d,18).Bb&ote)!=0&&(!a.e||d.Gj()!=x2||d.aj()!=0)&&c.dd()!=null){b.Pb();return true}}return false}else{return b.Sb()}} +function I2d(a,b,c){var d,e,f,g,h,i;i=S6d(a.e.Tg(),b);d=0;h=a.i;e=BD(a.g,119);for(g=0;g1&&(b.c[b.c.length]=f,true)}} +function TJc(a){var b,c,d,e;c=new Psb;ye(c,a.o);d=new twb;while(c.b!=0){b=BD(c.b==0?null:(sCb(c.b!=0),Nsb(c,c.a.a)),508);e=KJc(a,b,true);e&&Ekb(d.a,b)}while(d.a.c.length!=0){b=BD(rwb(d),508);KJc(a,b,false)}} +function _5c(){_5c=ccb;$5c=new a6c(ole,0);T5c=new a6c('BOOLEAN',1);X5c=new a6c('INT',2);Z5c=new a6c('STRING',3);U5c=new a6c('DOUBLE',4);V5c=new a6c('ENUM',5);W5c=new a6c('ENUMSET',6);Y5c=new a6c('OBJECT',7)} +function H6c(a,b){var c,d,e,f,g;d=$wnd.Math.min(a.c,b.c);f=$wnd.Math.min(a.d,b.d);e=$wnd.Math.max(a.c+a.b,b.c+b.b);g=$wnd.Math.max(a.d+a.a,b.d+b.a);if(e=(e/2|0)){this.e=!d?null:d.c;this.d=e;while(c++0){uu(this)}}this.b=b;this.a=null} +function rEb(a,b){var c,d;b.a?sEb(a,b):(c=BD(Exb(a.b,b.b),57),!!c&&c==a.a[b.b.f]&&!!c.a&&c.a!=b.b.a&&c.c.Fc(b.b),d=BD(Dxb(a.b,b.b),57),!!d&&a.a[d.f]==b.b&&!!d.a&&d.a!=b.b.a&&b.b.c.Fc(d),Fxb(a.b,b.b),undefined)} +function FJb(a,b){var c,d;c=BD(Mpb(a.b,b),124);if(BD(BD(Qc(a.r,b),21),84).dc()){c.n.b=0;c.n.c=0;return}c.n.b=a.C.b;c.n.c=a.C.c;a.A.Hc((tdd(),sdd))&&KJb(a,b);d=JJb(a,b);KIb(a,b)==(Tbd(),Qbd)&&(d+=2*a.w);c.a.a=d} +function OKb(a,b){var c,d;c=BD(Mpb(a.b,b),124);if(BD(BD(Qc(a.r,b),21),84).dc()){c.n.d=0;c.n.a=0;return}c.n.d=a.C.d;c.n.a=a.C.a;a.A.Hc((tdd(),sdd))&&SKb(a,b);d=RKb(a,b);KIb(a,b)==(Tbd(),Qbd)&&(d+=2*a.w);c.a.b=d} +function cOb(a,b){var c,d,e,f;f=new Rkb;for(d=new olb(b);d.ac.a&&(d.Hc((i8c(),c8c))?(e=(b.a-c.a)/2):d.Hc(e8c)&&(e=b.a-c.a));b.b>c.b&&(d.Hc((i8c(),g8c))?(f=(b.b-c.b)/2):d.Hc(f8c)&&(f=b.b-c.b));Efd(a,e,f)} +function aod(a,b,c,d,e,f,g,h,i,j,k,l,m){JD(a.Cb,88)&&XMd($Kd(BD(a.Cb,88)),4);pnd(a,c);a.f=g;dJd(a,h);fJd(a,i);ZId(a,j);eJd(a,k);CId(a,l);aJd(a,m);BId(a,true);AId(a,e);a.ok(f);yId(a,b);d!=null&&(a.i=null,_Id(a,d))} +function PRd(a){var b,c;if(a.f){while(a.n>0){b=BD(a.k.Xb(a.n-1),72);c=b.ak();if(JD(c,99)&&(BD(c,18).Bb&ote)!=0&&(!a.e||c.Gj()!=x2||c.aj()!=0)&&b.dd()!=null){return true}else{--a.n}}return false}else{return a.n>0}} +function Jb(a,b,c){if(a<0){return hc(The,OC(GC(SI,1),Uhe,1,5,[c,meb(a)]))}else if(b<0){throw vbb(new Wdb(Vhe+b))}else{return hc('%s (%s) must not be greater than size (%s)',OC(GC(SI,1),Uhe,1,5,[c,meb(a),meb(b)]))}} +function Llb(a,b,c,d,e,f){var g,h,i,j;g=d-c;if(g<7){Ilb(b,c,d,f);return}i=c+e;h=d+e;j=i+(h-i>>1);Llb(b,a,i,j,-e,f);Llb(b,a,j,h,-e,f);if(f.ue(a[j-1],a[j])<=0){while(c=0?a.sh(f,c):uid(a,e,c)}else{throw vbb(new Wdb(ite+e.ne()+jte))}}else{did(a,d,e,c)}} +function q6d(b){var c,d,e,f;d=BD(b,49).qh();if(d){try{e=null;c=nUd((yFd(),xFd),LEd(MEd(d)));if(c){f=c.rh();!!f&&(e=f.Wk(tfb(d.e)))}if(!!e&&e!=b){return q6d(e)}}catch(a){a=ubb(a);if(!JD(a,60))throw vbb(a)}}return b} +function jrb(a,b,c){var d,e,f,g;g=b==null?0:a.b.se(b);e=(d=a.a.get(g),d==null?new Array:d);if(e.length==0){a.a.set(g,e)}else{f=grb(a,b,e);if(f){return f.ed(c)}}NC(e,e.length,new pjb(b,c));++a.c;zpb(a.b);return null} +function YUc(a,b){var c,d;H2c(a.a);K2c(a.a,(PUc(),NUc),NUc);K2c(a.a,OUc,OUc);d=new j3c;e3c(d,OUc,(tVc(),sVc));PD(hkd(b,(ZWc(),LWc)))!==PD((pWc(),mWc))&&e3c(d,OUc,qVc);e3c(d,OUc,rVc);E2c(a.a,d);c=F2c(a.a,b);return c} +function uC(a){if(!a){return OB(),NB}var b=a.valueOf?a.valueOf():a;if(b!==a){var c=qC[typeof b];return c?c(b):xC(typeof b)}else if(a instanceof Array||a instanceof $wnd.Array){return new xB(a)}else{return new fC(a)}} +function RJb(a,b,c){var d,e,f;f=a.o;d=BD(Mpb(a.p,c),244);e=d.i;e.b=gIb(d);e.a=fIb(d);e.b=$wnd.Math.max(e.b,f.a);e.b>f.a&&!b&&(e.b=f.a);e.c=-(e.b-f.a)/2;switch(c.g){case 1:e.d=-e.a;break;case 3:e.d=f.b;}hIb(d);iIb(d)} +function SJb(a,b,c){var d,e,f;f=a.o;d=BD(Mpb(a.p,c),244);e=d.i;e.b=gIb(d);e.a=fIb(d);e.a=$wnd.Math.max(e.a,f.b);e.a>f.b&&!b&&(e.a=f.b);e.d=-(e.a-f.b)/2;switch(c.g){case 4:e.c=-e.b;break;case 2:e.c=f.a;}hIb(d);iIb(d)} +function Jgc(a,b){var c,d,e,f,g;if(b.dc()){return}e=BD(b.Xb(0),128);if(b.gc()==1){Igc(a,e,e,1,0,b);return}c=1;while(c0){try{f=Icb(c,Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){e=a;throw vbb(new rFd(e))}else throw vbb(a)}}d=(!b.a&&(b.a=new z0d(b)),b.a);return f=0?BD(qud(d,f),56):null} +function Ib(a,b){if(a<0){return hc(The,OC(GC(SI,1),Uhe,1,5,['index',meb(a)]))}else if(b<0){throw vbb(new Wdb(Vhe+b))}else{return hc('%s (%s) must be less than size (%s)',OC(GC(SI,1),Uhe,1,5,['index',meb(a),meb(b)]))}} +function Slb(a){var b,c,d,e,f;if(a==null){return Xhe}f=new xwb(She,'[',']');for(c=a,d=0,e=c.length;d0){g=a.c.d;h=a.d.d;e=Y6c(c7c(new f7c(h.a,h.b),g),1/(d+1));f=new f7c(g.a,g.b);for(c=new olb(a.a);c.a=0?a._g(c,true,true):sid(a,e,true),153));BD(d,215).ol(b)}else{throw vbb(new Wdb(ite+b.ne()+jte))}} +function ugb(a){var b,c;if(a>-140737488355328&&a<140737488355328){if(a==0){return 0}b=a<0;b&&(a=-a);c=QD($wnd.Math.floor($wnd.Math.log(a)/0.6931471805599453));(!b||a!=$wnd.Math.pow(2,c))&&++c;return c}return vgb(Cbb(a))} +function QOc(a){var b,c,d,e,f,g,h;f=new zsb;for(c=new olb(a);c.a2&&h.e.b+h.j.b<=2){e=h;d=g}f.a.zc(e,f);e.q=d}return f} +function K5b(a,b){var c,d,e;d=new b0b(a);tNb(d,b);yNb(d,(wtc(),Gsc),b);yNb(d,(Nyc(),Vxc),(dcd(),$bd));yNb(d,mwc,(F7c(),B7c));__b(d,(j0b(),e0b));c=new H0b;F0b(c,d);G0b(c,(Ucd(),Tcd));e=new H0b;F0b(e,d);G0b(e,zcd);return d} +function Spc(a){switch(a.g){case 0:return new fGc((rGc(),oGc));case 1:return new CFc;case 2:return new fHc;default:throw vbb(new Wdb('No implementation is available for the crossing minimizer '+(a.f!=null?a.f:''+a.g)));}} +function tDc(a,b){var c,d,e,f,g;a.c[b.p]=true;Ekb(a.a,b);for(g=new olb(b.j);g.a=f){g.$b()}else{e=g.Kc();for(d=0;d0?zh():g<0&&Bw(a,b,-g);return true}else{return false}} +function fIb(a){var b,c,d,e,f,g,h;h=0;if(a.b==0){g=jIb(a,true);b=0;for(d=g,e=0,f=d.length;e0){h+=c;++b}}b>1&&(h+=a.c*(b-1))}else{h=Mtb(Zzb(OAb(JAb(Plb(a.a),new xIb),new zIb)))}return h>0?h+a.n.d+a.n.a:0} +function gIb(a){var b,c,d,e,f,g,h;h=0;if(a.b==0){h=Mtb(Zzb(OAb(JAb(Plb(a.a),new tIb),new vIb)))}else{g=kIb(a,true);b=0;for(d=g,e=0,f=d.length;e0){h+=c;++b}}b>1&&(h+=a.c*(b-1))}return h>0?h+a.n.b+a.n.c:0} +function MJb(a,b){var c,d,e,f;f=BD(Mpb(a.b,b),124);c=f.a;for(e=BD(BD(Qc(a.r,b),21),84).Kc();e.Ob();){d=BD(e.Pb(),111);!!d.c&&(c.a=$wnd.Math.max(c.a,ZHb(d.c)))}if(c.a>0){switch(b.g){case 2:f.n.c=a.s;break;case 4:f.n.b=a.s;}}} +function NQb(a,b){var c,d,e;c=BD(vNb(b,(wSb(),oSb)),19).a-BD(vNb(a,oSb),19).a;if(c==0){d=c7c(R6c(BD(vNb(a,(HSb(),DSb)),8)),BD(vNb(a,ESb),8));e=c7c(R6c(BD(vNb(b,DSb),8)),BD(vNb(b,ESb),8));return Kdb(d.a*d.b,e.a*e.b)}return c} +function iRc(a,b){var c,d,e;c=BD(vNb(b,(JTc(),ETc)),19).a-BD(vNb(a,ETc),19).a;if(c==0){d=c7c(R6c(BD(vNb(a,(mTc(),VSc)),8)),BD(vNb(a,WSc),8));e=c7c(R6c(BD(vNb(b,VSc),8)),BD(vNb(b,WSc),8));return Kdb(d.a*d.b,e.a*e.b)}return c} +function TZb(a){var b,c;c=new Ufb;c.a+='e_';b=KZb(a);b!=null&&(c.a+=''+b,c);if(!!a.c&&!!a.d){Qfb((c.a+=' ',c),C0b(a.c));Qfb(Pfb((c.a+='[',c),a.c.i),']');Qfb((c.a+=gne,c),C0b(a.d));Qfb(Pfb((c.a+='[',c),a.d.i),']')}return c.a} +function zRc(a){switch(a.g){case 0:return new lUc;case 1:return new sUc;case 2:return new CUc;case 3:return new IUc;default:throw vbb(new Wdb('No implementation is available for the layout phase '+(a.f!=null?a.f:''+a.g)));}} +function mfd(a,b,c,d,e){var f;f=0;switch(e.g){case 1:f=$wnd.Math.max(0,b.b+a.b-(c.b+d));break;case 3:f=$wnd.Math.max(0,-a.b-d);break;case 2:f=$wnd.Math.max(0,-a.a-d);break;case 4:f=$wnd.Math.max(0,b.a+a.a-(c.a+d));}return f} +function mqd(a,b,c){var d,e,f,g,h;if(c){e=c.a.length;d=new Yge(e);for(h=(d.b-d.a)*d.c<0?(Xge(),Wge):new she(d);h.Ob();){g=BD(h.Pb(),19);f=Zpd(c,g.a);Lte in f.a||Mte in f.a?$qd(a,f,b):erd(a,f,b);otd(BD(Ohb(a.b,Wpd(f)),79))}}} +function LJd(a){var b,c;switch(a.b){case -1:{return true}case 0:{c=a.t;if(c>1||c==-1){a.b=-1;return true}else{b=wId(a);if(!!b&&(Q6d(),b.Cj()==Bve)){a.b=-1;return true}else{a.b=1;return false}}}default:case 1:{return false}}} +function k1d(a,b){var c,d,e,f,g;d=(!b.s&&(b.s=new cUd(t5,b,21,17)),b.s);f=null;for(e=0,g=d.i;e=0&&f=0?a._g(c,true,true):sid(a,e,true),153));return BD(d,215).ll(b)}else{throw vbb(new Wdb(ite+b.ne()+lte))}} +function BZd(){tZd();var a;if(sZd)return BD(nUd((yFd(),xFd),_ve),1939);rEd(CK,new J_d);CZd();a=BD(JD(Phb((yFd(),xFd),_ve),547)?Phb(xFd,_ve):new AZd,547);sZd=true;yZd(a);zZd(a);Rhb((JFd(),IFd),a,new EZd);Shb(xFd,_ve,a);return a} +function v2d(a,b){var c,d,e,f;a.j=-1;if(oid(a.e)){c=a.i;f=a.i!=0;lud(a,b);d=new pSd(a.e,3,a.c,null,b,c,f);e=b.Qk(a.e,a.c,null);e=h3d(a,b,e);if(!e){Uhd(a.e,d)}else{e.Ei(d);e.Fi()}}else{lud(a,b);e=b.Qk(a.e,a.c,null);!!e&&e.Fi()}} +function rA(a,b){var c,d,e;e=0;d=b[0];if(d>=a.length){return -1}c=(BCb(d,a.length),a.charCodeAt(d));while(c>=48&&c<=57){e=e*10+(c-48);++d;if(d>=a.length){break}c=(BCb(d,a.length),a.charCodeAt(d))}d>b[0]?(b[0]=d):(e=-1);return e} +function vMb(a){var b,c,d,e,f;e=BD(a.a,19).a;f=BD(a.b,19).a;c=e;d=f;b=$wnd.Math.max($wnd.Math.abs(e),$wnd.Math.abs(f));if(e<=0&&e==f){c=0;d=f-1}else{if(e==-b&&f!=b){c=f;d=e;f>=0&&++c}else{c=-f;d=e}}return new vgd(meb(c),meb(d))} +function fNb(a,b,c,d){var e,f,g,h,i,j;for(e=0;e=0&&j>=0&&i=a.i)throw vbb(new qcb(lue+b+mue+a.i));if(c>=a.i)throw vbb(new qcb(nue+c+mue+a.i));d=a.g[c];if(b!=c){b>16);b=d>>16&16;c=16-b;a=a>>b;d=a-256;b=d>>16&8;c+=b;a<<=b;d=a-Rje;b=d>>16&4;c+=b;a<<=b;d=a-oie;b=d>>16&2;c+=b;a<<=b;d=a>>14;b=d&~(d>>1);return c+2-b}} +function $Pb(a){QPb();var b,c,d,e;PPb=new Rkb;OPb=new Lqb;NPb=new Rkb;b=(!a.a&&(a.a=new cUd(E2,a,10,11)),a.a);SPb(b);for(e=new Fyd(b);e.e!=e.i.gc();){d=BD(Dyd(e),33);if(Jkb(PPb,d,0)==-1){c=new Rkb;Ekb(NPb,c);TPb(d,c)}}return NPb} +function BQb(a,b,c){var d,e,f,g;a.a=c.b.d;if(JD(b,352)){e=itd(BD(b,79),false,false);f=ofd(e);d=new FQb(a);reb(f,d);ifd(f,e);b.We((Y9c(),Q8c))!=null&&reb(BD(b.We(Q8c),74),d)}else{g=BD(b,470);g.Hg(g.Dg()+a.a.a);g.Ig(g.Eg()+a.a.b)}} +function _5b(a,b){var c,d,e,f,g,h,i,j;j=Edb(ED(vNb(b,(Nyc(),zyc))));i=a[0].n.a+a[0].o.a+a[0].d.c+j;for(h=1;h=0){return c}h=U6c(c7c(new f7c(g.c+g.b/2,g.d+g.a/2),new f7c(f.c+f.b/2,f.d+f.a/2)));return -(xOb(f,g)-1)*h} +function ufd(a,b,c){var d;MAb(new YAb(null,(!c.a&&(c.a=new cUd(A2,c,6,6)),new Kub(c.a,16))),new Mfd(a,b));MAb(new YAb(null,(!c.n&&(c.n=new cUd(D2,c,1,7)),new Kub(c.n,16))),new Ofd(a,b));d=BD(hkd(c,(Y9c(),Q8c)),74);!!d&&p7c(d,a,b)} +function sid(a,b,c){var d,e,f;f=e1d((O6d(),M6d),a.Tg(),b);if(f){Q6d();BD(f,66).Oj()||(f=_1d(q1d(M6d,f)));e=(d=a.Yg(f),BD(d>=0?a._g(d,true,true):sid(a,f,true),153));return BD(e,215).hl(b,c)}else{throw vbb(new Wdb(ite+b.ne()+lte))}} +function wAd(a,b,c,d){var e,f,g,h,i;e=a.d[b];if(e){f=e.g;i=e.i;if(d!=null){for(h=0;h=c){d=b;j=(i.c+i.a)/2;g=j-c;if(i.c<=j-c){e=new bPc(i.c,g);Dkb(a,d++,e)}h=j+c;if(h<=i.a){f=new bPc(h,i.a);wCb(d,a.c.length);aCb(a.c,d,f)}}} +function u0d(a){var b;if(!a.c&&a.g==null){a.d=a.si(a.f);wtd(a,a.d);b=a.d}else{if(a.g==null){return true}else if(a.i==0){return false}else{b=BD(a.g[a.i-1],47)}}if(b==a.b&&null.km>=null.jm()){Vud(a);return u0d(a)}else{return b.Ob()}} +function KTb(a,b,c){var d,e,f,g,h;h=c;!h&&(h=Ydd(new Zdd,0));Odd(h,Vme,1);aUb(a.c,b);g=EYb(a.a,b);if(g.gc()==1){MTb(BD(g.Xb(0),37),h)}else{f=1/g.gc();for(e=g.Kc();e.Ob();){d=BD(e.Pb(),37);MTb(d,Udd(h,f))}}CYb(a.a,g,b);NTb(b);Qdd(h)} +function qYb(a){this.a=a;if(a.c.i.k==(j0b(),e0b)){this.c=a.c;this.d=BD(vNb(a.c.i,(wtc(),Hsc)),61)}else if(a.d.i.k==e0b){this.c=a.d;this.d=BD(vNb(a.d.i,(wtc(),Hsc)),61)}else{throw vbb(new Wdb('Edge '+a+' is not an external edge.'))}} +function oQd(a,b){var c,d,e;e=a.b;a.b=b;(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,e,a.b));if(!b){pnd(a,null);qQd(a,0);pQd(a,null)}else if(b!=a){pnd(a,b.zb);qQd(a,b.d);c=(d=b.c,d==null?b.zb:d);pQd(a,c==null||dfb(c,b.zb)?null:c)}} +function NRd(a){var b,c;if(a.f){while(a.n=g)throw vbb(new Cyd(b,g));e=c[b];if(g==1){d=null}else{d=KC($3,hve,415,g-1,0,1);$fb(c,0,d,0,b);f=g-b-1;f>0&&$fb(c,b+1,d,b,f)}b0d(a,d);a0d(a,b,e);return e} +function m8d(){m8d=ccb;k8d=BD(qud(ZKd((r8d(),q8d).qb),6),34);h8d=BD(qud(ZKd(q8d.qb),3),34);i8d=BD(qud(ZKd(q8d.qb),4),34);j8d=BD(qud(ZKd(q8d.qb),5),18);XId(k8d);XId(h8d);XId(i8d);XId(j8d);l8d=new amb(OC(GC(t5,1),Mve,170,0,[k8d,h8d]))} +function AJb(a,b){var c;this.d=new H_b;this.b=b;this.e=new g7c(b.qf());c=a.u.Hc((rcd(),ocd));a.u.Hc(ncd)?a.D?(this.a=c&&!b.If()):(this.a=true):a.u.Hc(pcd)?c?(this.a=!(b.zf().Kc().Ob()||b.Bf().Kc().Ob())):(this.a=false):(this.a=false)} +function IKb(a,b){var c,d,e,f;c=a.o.a;for(f=BD(BD(Qc(a.r,b),21),84).Kc();f.Ob();){e=BD(f.Pb(),111);e.e.a=(d=e.b,d.Xe((Y9c(),s9c))?d.Hf()==(Ucd(),Tcd)?-d.rf().a-Edb(ED(d.We(s9c))):c+Edb(ED(d.We(s9c))):d.Hf()==(Ucd(),Tcd)?-d.rf().a:c)}} +function Q1b(a,b){var c,d,e,f;c=BD(vNb(a,(Nyc(),Lwc)),103);f=BD(hkd(b,$xc),61);e=BD(vNb(a,Vxc),98);if(e!=(dcd(),bcd)&&e!=ccd){if(f==(Ucd(),Scd)){f=lfd(b,c);f==Scd&&(f=Zcd(c))}}else{d=M1b(b);d>0?(f=Zcd(c)):(f=Wcd(Zcd(c)))}jkd(b,$xc,f)} +function olc(a,b){var c,d,e,f,g;g=a.j;b.a!=b.b&&Okb(g,new Ulc);e=g.c.length/2|0;for(d=0;d0&&WGc(a,c,b);return f}else if(d.a!=null){WGc(a,b,c);return -1}else if(e.a!=null){WGc(a,c,b);return 1}return 0} +function swd(a,b){var c,d,e,f;if(a.ej()){c=a.Vi();f=a.fj();++a.j;a.Hi(c,a.oi(c,b));d=a.Zi(3,null,b,c,f);if(a.bj()){e=a.cj(b,null);if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}else{a.$i(d)}}else{Bvd(a,b);if(a.bj()){e=a.cj(b,null);!!e&&e.Fi()}}} +function D2d(a,b){var c,d,e,f,g;g=S6d(a.e.Tg(),b);e=new yud;c=BD(a.g,119);for(f=a.i;--f>=0;){d=c[f];g.rl(d.ak())&&wtd(e,d)}!Yxd(a,e)&&oid(a.e)&&GLd(a,b.$j()?H2d(a,6,b,(mmb(),jmb),null,-1,false):H2d(a,b.Kj()?2:1,b,null,null,-1,false))} +function Dhb(){Dhb=ccb;var a,b;Bhb=KC(cJ,nie,91,32,0,1);Chb=KC(cJ,nie,91,32,0,1);a=1;for(b=0;b<=18;b++){Bhb[b]=ghb(a);Chb[b]=ghb(Nbb(a,b));a=Ibb(a,5)}for(;bg){return false}}if(b.q){d=b.C;g=d.c.c.a-d.o.a/2;e=d.n.a-c;if(e>g){return false}}return true} +function wcc(a,b){var c;Odd(b,'Partition preprocessing',1);c=BD(GAb(JAb(LAb(JAb(new YAb(null,new Kub(a.a,16)),new Acc),new Ccc),new Ecc),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);MAb(c.Oc(),new Gcc);Qdd(b)} +function DMc(a){wMc();var b,c,d,e,f,g,h;c=new $rb;for(e=new olb(a.e.b);e.a1?(a.e*=Edb(a.a)):(a.f/=Edb(a.a));DOb(a);EOb(a);AOb(a);yNb(a.b,(CPb(),uPb),a.g)} +function Y5b(a,b,c){var d,e,f,g,h,i;d=0;i=c;if(!b){d=c*(a.c.length-1);i*=-1}for(f=new olb(a);f.a=0){if(!b){b=new Ifb;d>0&&Efb(b,a.substr(0,d))}b.a+='\\';Afb(b,c&aje)}else !!b&&Afb(b,c&aje)}return b?b.a:a} +function l5c(a){var b;if(!a.a){throw vbb(new Zdb('IDataType class expected for layout option '+a.f))}b=gvd(a.a);if(b==null){throw vbb(new Zdb("Couldn't create new instance of property '"+a.f+"'. "+ise+(fdb(Y3),Y3.k)+jse))}return BD(b,414)} +function aid(a){var b,c,d,e,f;f=a.eh();if(f){if(f.kh()){e=xid(a,f);if(e!=f){c=a.Vg();d=(b=a.Vg(),b>=0?a.Qg(null):a.eh().ih(a,-1-b,null,null));a.Rg(BD(e,49),c);!!d&&d.Fi();a.Lg()&&a.Mg()&&c>-1&&Uhd(a,new nSd(a,9,c,f,e));return e}}}return f} +function nTb(a){var b,c,d,e,f,g,h,i;g=0;f=a.f.e;for(d=0;d>5;if(e>=a.d){return a.e<0}c=a.a[e];b=1<<(b&31);if(a.e<0){d=Mgb(a);if(e>16)),15).Xc(f);if(h0){!(fad(a.a.c)&&b.n.d)&&!(gad(a.a.c)&&b.n.b)&&(b.g.d+=$wnd.Math.max(0,d/2-0.5));!(fad(a.a.c)&&b.n.a)&&!(gad(a.a.c)&&b.n.c)&&(b.g.a-=d-1)}}} +function N3b(a){var b,c,d,e,f;e=new Rkb;f=O3b(a,e);b=BD(vNb(a,(wtc(),gtc)),10);if(b){for(d=new olb(b.j);d.a>b;f=a.m>>b|c<<22-b;e=a.l>>b|a.m<<22-b}else if(b<44){g=d?Fje:0;f=c>>b-22;e=a.m>>b-22|c<<44-b}else{g=d?Fje:0;f=d?Eje:0;e=c>>b-44}return TC(e&Eje,f&Eje,g&Fje)} +function XOb(a){var b,c,d,e,f,g;this.c=new Rkb;this.d=a;d=Pje;e=Pje;b=Qje;c=Qje;for(g=Jsb(a,0);g.b!=g.d.c;){f=BD(Xsb(g),8);d=$wnd.Math.min(d,f.a);e=$wnd.Math.min(e,f.b);b=$wnd.Math.max(b,f.a);c=$wnd.Math.max(c,f.b)}this.a=new J6c(d,e,b-d,c-e)} +function Dac(a,b){var c,d,e,f,g,h;for(f=new olb(a.b);f.a0&&JD(b,42)){a.a.qj();j=BD(b,42);i=j.cd();f=i==null?0:tb(i);g=DAd(a.a,f);c=a.a.d[g];if(c){d=BD(c.g,367);k=c.i;for(h=0;h=2){c=e.Kc();b=ED(c.Pb());while(c.Ob()){f=b;b=ED(c.Pb());d=$wnd.Math.min(d,(uCb(b),b)-(uCb(f),f))}}return d} +function gUc(a,b){var c,d,e,f,g;d=new Psb;Gsb(d,b,d.c.b,d.c);do{c=(sCb(d.b!=0),BD(Nsb(d,d.a.a),86));a.b[c.g]=1;for(f=Jsb(c.d,0);f.b!=f.d.c;){e=BD(Xsb(f),188);g=e.c;a.b[g.g]==1?Dsb(a.a,e):a.b[g.g]==2?(a.b[g.g]=1):Gsb(d,g,d.c.b,d.c)}}while(d.b!=0)} +function Ju(a,b){var c,d,e;if(PD(b)===PD(Qb(a))){return true}if(!JD(b,15)){return false}d=BD(b,15);e=a.gc();if(e!=d.gc()){return false}if(JD(d,54)){for(c=0;c0&&(e=c);for(g=new olb(a.f.e);g.a0){b-=1;c-=1}else{if(d>=0&&e<0){b+=1;c+=1}else{if(d>0&&e>=0){b-=1;c+=1}else{b+=1;c-=1}}}}}return new vgd(meb(b),meb(c))} +function PIc(a,b){if(a.cb.c){return 1}else if(a.bb.b){return 1}else if(a.a!=b.a){return tb(a.a)-tb(b.a)}else if(a.d==(UIc(),TIc)&&b.d==SIc){return -1}else if(a.d==SIc&&b.d==TIc){return 1}return 0} +function aNc(a,b){var c,d,e,f,g;f=b.a;f.c.i==b.b?(g=f.d):(g=f.c);f.c.i==b.b?(d=f.c):(d=f.d);e=NLc(a.a,g,d);if(e>0&&e0}else if(e<0&&-e0}return false} +function RZc(a,b,c,d){var e,f,g,h,i,j,k,l;e=(b-a.d)/a.c.c.length;f=0;a.a+=c;a.d=b;for(l=new olb(a.c);l.a>24}return g} +function vdb(a){if(a.pe()){var b=a.c;b.qe()?(a.o='['+b.n):!b.pe()?(a.o='[L'+b.ne()+';'):(a.o='['+b.ne());a.b=b.me()+'[]';a.k=b.oe()+'[]';return}var c=a.j;var d=a.d;d=d.split('/');a.o=ydb('.',[c,ydb('$',d)]);a.b=ydb('.',[c,ydb('.',d)]);a.k=d[d.length-1]} +function qGb(a,b){var c,d,e,f,g;g=null;for(f=new olb(a.e.a);f.a=0;b-=2){for(c=0;c<=b;c+=2){if(a.b[c]>a.b[c+2]||a.b[c]===a.b[c+2]&&a.b[c+1]>a.b[c+3]){d=a.b[c+2];a.b[c+2]=a.b[c];a.b[c]=d;d=a.b[c+3];a.b[c+3]=a.b[c+1];a.b[c+1]=d}}}a.c=true} +function UUb(a,b){var c,d,e,f,g,h,i,j;g=b==1?KUb:JUb;for(f=g.a.ec().Kc();f.Ob();){e=BD(f.Pb(),103);for(i=BD(Qc(a.f.c,e),21).Kc();i.Ob();){h=BD(i.Pb(),46);d=BD(h.b,81);j=BD(h.a,189);c=j.c;switch(e.g){case 2:case 1:d.g.d+=c;break;case 4:case 3:d.g.c+=c;}}}} +function PFc(a,b){var c,d,e,f,g,h,i,j,k;j=-1;k=0;for(g=a,h=0,i=g.length;h0&&++k}}++j}return k} +function Eid(a){var b,c;c=new Wfb(hdb(a.gm));c.a+='@';Qfb(c,(b=tb(a)>>>0,b.toString(16)));if(a.kh()){c.a+=' (eProxyURI: ';Pfb(c,a.qh());if(a.$g()){c.a+=' eClass: ';Pfb(c,a.$g())}c.a+=')'}else if(a.$g()){c.a+=' (eClass: ';Pfb(c,a.$g());c.a+=')'}return c.a} +function TDb(a){var b,c,d,e;if(a.e){throw vbb(new Zdb((fdb(TM),Jke+TM.k+Kke)))}a.d==(ead(),cad)&&SDb(a,aad);for(c=new olb(a.a.a);c.a>24}return c} +function lKb(a,b,c){var d,e,f;e=BD(Mpb(a.i,b),306);if(!e){e=new bIb(a.d,b,c);Npb(a.i,b,e);if(sJb(b)){CHb(a.a,b.c,b.b,e)}else{f=rJb(b);d=BD(Mpb(a.p,f),244);switch(f.g){case 1:case 3:e.j=true;lIb(d,b.b,e);break;case 4:case 2:e.k=true;lIb(d,b.c,e);}}}return e} +function r3d(a,b,c,d){var e,f,g,h,i,j;h=new yud;i=S6d(a.e.Tg(),b);e=BD(a.g,119);Q6d();if(BD(b,66).Oj()){for(g=0;g=0){return e}else{f=1;for(h=new olb(b.j);h.a0&&b.ue((tCb(e-1,a.c.length),BD(a.c[e-1],10)),f)>0){Nkb(a,e,(tCb(e-1,a.c.length),BD(a.c[e-1],10)));--e}tCb(e,a.c.length);a.c[e]=f}c.a=new Lqb;c.b=new Lqb} +function n5c(a,b,c){var d,e,f,g,h,i,j,k;k=(d=BD(b.e&&b.e(),9),new xqb(d,BD(_Bb(d,d.length),9),0));i=mfb(c,'[\\[\\]\\s,]+');for(f=i,g=0,h=f.length;g0){!(fad(a.a.c)&&b.n.d)&&!(gad(a.a.c)&&b.n.b)&&(b.g.d-=$wnd.Math.max(0,d/2-0.5));!(fad(a.a.c)&&b.n.a)&&!(gad(a.a.c)&&b.n.c)&&(b.g.a+=$wnd.Math.max(0,d-1))}}} +function Hac(a,b,c){var d,e;if((a.c-a.b&a.a.length-1)==2){if(b==(Ucd(),Acd)||b==zcd){xac(BD(bkb(a),15),(rbd(),nbd));xac(BD(bkb(a),15),obd)}else{xac(BD(bkb(a),15),(rbd(),obd));xac(BD(bkb(a),15),nbd)}}else{for(e=new xkb(a);e.a!=e.b;){d=BD(vkb(e),15);xac(d,c)}}} +function htd(a,b){var c,d,e,f,g,h,i;e=Nu(new qtd(a));h=new Bib(e,e.c.length);f=Nu(new qtd(b));i=new Bib(f,f.c.length);g=null;while(h.b>0&&i.b>0){c=(sCb(h.b>0),BD(h.a.Xb(h.c=--h.b),33));d=(sCb(i.b>0),BD(i.a.Xb(i.c=--i.b),33));if(c==d){g=c}else{break}}return g} +function Cub(a,b){var c,d,e,f,g,h;f=a.a*kke+a.b*1502;h=a.b*kke+11;c=$wnd.Math.floor(h*lke);f+=c;h-=c*mke;f%=mke;a.a=f;a.b=h;if(b<=24){return $wnd.Math.floor(a.a*wub[b])}else{e=a.a*(1<=2147483648&&(d-=Zje);return d}} +function Zic(a,b,c){var d,e,f,g;if(bjc(a,b)>bjc(a,c)){d=V_b(c,(Ucd(),zcd));a.d=d.dc()?0:B0b(BD(d.Xb(0),11));g=V_b(b,Tcd);a.b=g.dc()?0:B0b(BD(g.Xb(0),11))}else{e=V_b(c,(Ucd(),Tcd));a.d=e.dc()?0:B0b(BD(e.Xb(0),11));f=V_b(b,zcd);a.b=f.dc()?0:B0b(BD(f.Xb(0),11))}} +function l6d(a){var b,c,d,e,f,g,h;if(a){b=a.Hh(_ve);if(b){g=GD(AAd((!b.b&&(b.b=new sId((jGd(),fGd),x6,b)),b.b),'conversionDelegates'));if(g!=null){h=new Rkb;for(d=mfb(g,'\\w+'),e=0,f=d.length;ea.c){break}else if(e.a>=a.s){f<0&&(f=g);h=g}}i=(a.s+a.c)/2;if(f>=0){d=NOc(a,b,f,h);i=$Oc((tCb(d,b.c.length),BD(b.c[d],329)));YOc(b,d,c)}return i} +function lZc(){lZc=ccb;RYc=new Osd((Y9c(),r8c),1.3);VYc=I8c;gZc=new q0b(15);fZc=new Osd(f9c,gZc);jZc=new Osd(T9c,15);SYc=w8c;_Yc=Y8c;aZc=_8c;bZc=b9c;$Yc=W8c;cZc=e9c;hZc=x9c;eZc=(OYc(),KYc);ZYc=IYc;dZc=JYc;iZc=MYc;WYc=HYc;XYc=O8c;YYc=P8c;UYc=GYc;TYc=FYc;kZc=NYc} +function Bnd(a,b,c){var d,e,f,g,h,i,j;g=(f=new RHd,f);PHd(g,(uCb(b),b));j=(!g.b&&(g.b=new sId((jGd(),fGd),x6,g)),g.b);for(i=1;i0&&JPb(this,e)}} +function IQb(a,b,c,d,e,f){var g,h,i;if(!e[b.b]){e[b.b]=true;g=d;!g&&(g=new kRb);Ekb(g.e,b);for(i=f[b.b].Kc();i.Ob();){h=BD(i.Pb(),282);if(h.d==c||h.c==c){continue}h.c!=b&&IQb(a,h.c,b,g,e,f);h.d!=b&&IQb(a,h.d,b,g,e,f);Ekb(g.c,h);Gkb(g.d,h.b)}return g}return null} +function e4b(a){var b,c,d,e,f,g,h;b=0;for(e=new olb(a.e);e.a=2} +function gec(a,b){var c,d,e,f;Odd(b,'Self-Loop pre-processing',1);for(d=new olb(a.a);d.a1){return false}b=qqb(zbd,OC(GC(B1,1),Kie,93,0,[ybd,Bbd]));if(Ox(Cx(b,a))>1){return false}d=qqb(Gbd,OC(GC(B1,1),Kie,93,0,[Fbd,Ebd]));if(Ox(Cx(d,a))>1){return false}return true} +function U0d(a,b){var c,d,e;c=b.Hh(a.a);if(c){e=GD(AAd((!c.b&&(c.b=new sId((jGd(),fGd),x6,c)),c.b),'affiliation'));if(e!=null){d=kfb(e,wfb(35));return d==-1?l1d(a,u1d(a,bKd(b.Hj())),e):d==0?l1d(a,null,e.substr(1)):l1d(a,e.substr(0,d),e.substr(d+1))}}return null} +function ic(b){var c,d,e;try{return b==null?Xhe:fcb(b)}catch(a){a=ubb(a);if(JD(a,102)){c=a;e=hdb(rb(b))+'@'+(d=(Zfb(),kCb(b))>>>0,d.toString(16));tyb(xyb(),($xb(),'Exception during lenientFormat for '+e),c);return '<'+e+' threw '+hdb(c.gm)+'>'}else throw vbb(a)}} +function mzc(a){switch(a.g){case 0:return new xDc;case 1:return new ZCc;case 2:return new DCc;case 3:return new QCc;case 4:return new LDc;case 5:return new iDc;default:throw vbb(new Wdb('No implementation is available for the layerer '+(a.f!=null?a.f:''+a.g)));}} +function AQc(a,b,c){var d,e,f;for(f=new olb(a.t);f.a0){d.b.n-=d.c;d.b.n<=0&&d.b.u>0&&Dsb(b,d.b)}}for(e=new olb(a.i);e.a0){d.a.u-=d.c;d.a.u<=0&&d.a.n>0&&Dsb(c,d.a)}}} +function Vud(a){var b,c,d,e,f;if(a.g==null){a.d=a.si(a.f);wtd(a,a.d);if(a.c){f=a.f;return f}}b=BD(a.g[a.i-1],47);e=b.Pb();a.e=b;c=a.si(e);if(c.Ob()){a.d=c;wtd(a,c)}else{a.d=null;while(!b.Ob()){NC(a.g,--a.i,null);if(a.i==0){break}d=BD(a.g[a.i-1],47);b=d}}return e} +function r2d(a,b){var c,d,e,f,g,h;d=b;e=d.ak();if(T6d(a.e,e)){if(e.hi()&&E2d(a,e,d.dd())){return false}}else{h=S6d(a.e.Tg(),e);c=BD(a.g,119);for(f=0;f1||c>1){return 2}}if(b+c==1){return 2}return 0} +function WQb(a,b,c){var d,e,f,g,h;Odd(c,'ELK Force',1);Ccb(DD(hkd(b,(wSb(),jSb))))||$Cb((d=new _Cb((Pgd(),new bhd(b))),d));h=TQb(b);XQb(h);YQb(a,BD(vNb(h,fSb),424));g=LQb(a.a,h);for(f=g.Kc();f.Ob();){e=BD(f.Pb(),231);tRb(a.b,e,Udd(c,1/g.gc()))}h=KQb(g);SQb(h);Qdd(c)} +function yoc(a,b){var c,d,e,f,g;Odd(b,'Breaking Point Processor',1);xoc(a);if(Ccb(DD(vNb(a,(Nyc(),Jyc))))){for(e=new olb(a.b);e.a=0?a._g(d,true,true):sid(a,f,true),153));BD(e,215).ml(b,c)}else{throw vbb(new Wdb(ite+b.ne()+jte))}} +function ROc(a,b){var c,d,e,f,g;c=new Rkb;e=LAb(new YAb(null,new Kub(a,16)),new iPc);f=LAb(new YAb(null,new Kub(a,16)),new kPc);g=aAb(_zb(OAb(ty(OC(GC(xM,1),Uhe,833,0,[e,f])),new mPc)));for(d=1;d=2*b&&Ekb(c,new bPc(g[d-1]+b,g[d]-b))}return c} +function AXc(a,b,c){Odd(c,'Eades radial',1);c.n&&!!b&&Tdd(c,i6d(b),(pgd(),mgd));a.d=BD(hkd(b,(MUc(),LUc)),33);a.c=Edb(ED(hkd(b,(ZWc(),VWc))));a.e=tXc(BD(hkd(b,WWc),293));a.a=gWc(BD(hkd(b,YWc),426));a.b=jXc(BD(hkd(b,RWc),340));BXc(a);c.n&&!!b&&Tdd(c,i6d(b),(pgd(),mgd))} +function Fqd(a,b,c){var d,e,f,g,h,j,k,l;if(c){f=c.a.length;d=new Yge(f);for(h=(d.b-d.a)*d.c<0?(Xge(),Wge):new she(d);h.Ob();){g=BD(h.Pb(),19);e=Zpd(c,g.a);!!e&&(i=null,j=Uqd(a,(k=(Fhd(),l=new ppd,l),!!b&&npd(k,b),k),e),Lkd(j,_pd(e,Vte)),grd(e,j),hrd(e,j),crd(a,e,j))}}} +function UKd(a){var b,c,d,e,f,g;if(!a.j){g=new HPd;b=KKd;f=b.a.zc(a,b);if(f==null){for(d=new Fyd(_Kd(a));d.e!=d.i.gc();){c=BD(Dyd(d),26);e=UKd(c);ytd(g,e);wtd(g,c)}b.a.Bc(a)!=null}vud(g);a.j=new nNd((BD(qud(ZKd((NFd(),MFd).o),11),18),g.i),g.g);$Kd(a).b&=-33}return a.j} +function O9d(a){var b,c,d,e;if(a==null){return null}else{d=Qge(a,true);e=Nwe.length;if(dfb(d.substr(d.length-e,e),Nwe)){c=d.length;if(c==4){b=(BCb(0,d.length),d.charCodeAt(0));if(b==43){return z9d}else if(b==45){return y9d}}else if(c==3){return z9d}}return new Odb(d)}} +function _C(a){var b,c,d;c=a.l;if((c&c-1)!=0){return -1}d=a.m;if((d&d-1)!=0){return -1}b=a.h;if((b&b-1)!=0){return -1}if(b==0&&d==0&&c==0){return -1}if(b==0&&d==0&&c!=0){return ieb(c)}if(b==0&&d!=0&&c==0){return ieb(d)+22}if(b!=0&&d==0&&c==0){return ieb(b)+44}return -1} +function qbc(a,b){var c,d,e,f,g;Odd(b,'Edge joining',1);c=Ccb(DD(vNb(a,(Nyc(),Byc))));for(e=new olb(a.b);e.a1){for(e=new olb(a.a);e.a0);f.a.Xb(f.c=--f.b);Aib(f,e);sCb(f.b3&&EA(a,0,b-3)}} +function cUb(a){var b,c,d,e;if(PD(vNb(a,(Nyc(),axc)))===PD((hbd(),ebd))){return !a.e&&PD(vNb(a,Cwc))!==PD((Xrc(),Urc))}d=BD(vNb(a,Dwc),292);e=Ccb(DD(vNb(a,Hwc)))||PD(vNb(a,Iwc))===PD((Rpc(),Opc));b=BD(vNb(a,Bwc),19).a;c=a.a.c.length;return !e&&d!=(Xrc(),Urc)&&(b==0||b>c)} +function lkc(a){var b,c;c=0;for(;c0){break}}if(c>0&&c0){break}}if(b>0&&c>16!=6&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+qmd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?cmd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,6,d));d=bmd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,6,b,b))} +function npd(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=9&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+opd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?lpd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,9,d));d=kpd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,9,b,b))} +function Rld(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=3&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+Sld(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Lld(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,12,d));d=Kld(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function VId(b){var c,d,e,f,g;e=wId(b);g=b.j;if(g==null&&!!e){return b.$j()?null:e.zj()}else if(JD(e,148)){d=e.Aj();if(d){f=d.Nh();if(f!=b.i){c=BD(e,148);if(c.Ej()){try{b.g=f.Kh(c,g)}catch(a){a=ubb(a);if(JD(a,78)){b.g=null}else throw vbb(a)}}b.i=f}}return b.g}return null} +function wOb(a){var b;b=new Rkb;Ekb(b,new aDb(new f7c(a.c,a.d),new f7c(a.c+a.b,a.d)));Ekb(b,new aDb(new f7c(a.c,a.d),new f7c(a.c,a.d+a.a)));Ekb(b,new aDb(new f7c(a.c+a.b,a.d+a.a),new f7c(a.c+a.b,a.d)));Ekb(b,new aDb(new f7c(a.c+a.b,a.d+a.a),new f7c(a.c,a.d+a.a)));return b} +function IJc(a,b,c,d){var e,f,g;g=LZb(b,c);d.c[d.c.length]=b;if(a.j[g.p]==-1||a.j[g.p]==2||a.a[b.p]){return d}a.j[g.p]=-1;for(f=new Sr(ur(O_b(g).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(!(!OZb(e)&&!(!OZb(e)&&e.c.i.c==e.d.i.c))||e==b){continue}return IJc(a,e,g,d)}return d} +function vQb(a,b,c){var d,e,f;for(f=b.a.ec().Kc();f.Ob();){e=BD(f.Pb(),79);d=BD(Ohb(a.b,e),266);!d&&(Xod(jtd(e))==Xod(ltd(e))?uQb(a,e,c):jtd(e)==Xod(ltd(e))?Ohb(a.c,e)==null&&Ohb(a.b,ltd(e))!=null&&xQb(a,e,c,false):Ohb(a.d,e)==null&&Ohb(a.b,jtd(e))!=null&&xQb(a,e,c,true))}} +function jcc(a,b){var c,d,e,f,g,h,i;for(e=a.Kc();e.Ob();){d=BD(e.Pb(),10);h=new H0b;F0b(h,d);G0b(h,(Ucd(),zcd));yNb(h,(wtc(),ftc),(Bcb(),true));for(g=b.Kc();g.Ob();){f=BD(g.Pb(),10);i=new H0b;F0b(i,f);G0b(i,Tcd);yNb(i,ftc,true);c=new UZb;yNb(c,ftc,true);QZb(c,h);RZb(c,i)}}} +function jnc(a,b,c,d){var e,f,g,h;e=hnc(a,b,c);f=hnc(a,c,b);g=BD(Ohb(a.c,b),112);h=BD(Ohb(a.c,c),112);if(ed.b.g&&(f.c[f.c.length]=d,true)}}return f} +function k$c(){k$c=ccb;g$c=new l$c('CANDIDATE_POSITION_LAST_PLACED_RIGHT',0);f$c=new l$c('CANDIDATE_POSITION_LAST_PLACED_BELOW',1);i$c=new l$c('CANDIDATE_POSITION_WHOLE_DRAWING_RIGHT',2);h$c=new l$c('CANDIDATE_POSITION_WHOLE_DRAWING_BELOW',3);j$c=new l$c('WHOLE_DRAWING',4)} +function Xqd(a,b){if(JD(b,239)){return iqd(a,BD(b,33))}else if(JD(b,186)){return jqd(a,BD(b,118))}else if(JD(b,354)){return hqd(a,BD(b,137))}else if(JD(b,352)){return gqd(a,BD(b,79))}else if(b){return null}else{throw vbb(new Wdb(Xte+Fe(new amb(OC(GC(SI,1),Uhe,1,5,[b])))))}} +function aic(a){var b,c,d,e,f,g,h;f=new Psb;for(e=new olb(a.d.a);e.a1){b=nGb((c=new pGb,++a.b,c),a.d);for(h=Jsb(f,0);h.b!=h.d.c;){g=BD(Xsb(h),121);AFb(DFb(CFb(EFb(BFb(new FFb,1),0),b),g))}}} +function $od(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=11&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+_od(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Uod(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=kid(b,a,10,d));d=Tod(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,11,b,b))} +function uZb(a){var b,c,d,e;for(d=new nib((new eib(a.b)).a);d.b;){c=lib(d);e=BD(c.cd(),11);b=BD(c.dd(),10);yNb(b,(wtc(),$sc),e);yNb(e,gtc,b);yNb(e,Nsc,(Bcb(),true));G0b(e,BD(vNb(b,Hsc),61));vNb(b,Hsc);yNb(e.i,(Nyc(),Vxc),(dcd(),acd));BD(vNb(Q_b(e.i),Ksc),21).Fc((Orc(),Krc))}} +function G4b(a,b,c){var d,e,f,g,h,i;f=0;g=0;if(a.c){for(i=new olb(a.d.i.j);i.af.a){return -1}else if(e.ai){k=a.d;a.d=KC(y4,jve,63,2*i+4,0,1);for(f=0;f=9223372036854775807){return wD(),sD}e=false;if(a<0){e=true;a=-a}d=0;if(a>=Ije){d=QD(a/Ije);a-=d*Ije}c=0;if(a>=Hje){c=QD(a/Hje);a-=c*Hje}b=QD(a);f=TC(b,c,d);e&&ZC(f);return f} +function rKb(a,b){var c,d,e,f;c=!b||!a.u.Hc((rcd(),ncd));f=0;for(e=new olb(a.e.Cf());e.a=-b&&d==b){return new vgd(meb(c-1),meb(d))}return new vgd(meb(c),meb(d-1))} +function W8b(){S8b();return OC(GC(AS,1),Kie,77,0,[Y7b,V7b,Z7b,n8b,G8b,r8b,M8b,w8b,E8b,i8b,A8b,v8b,F8b,e8b,O8b,P7b,z8b,I8b,o8b,H8b,Q8b,C8b,Q7b,D8b,R8b,K8b,P8b,p8b,b8b,q8b,m8b,N8b,T7b,_7b,t8b,S7b,u8b,k8b,f8b,x8b,h8b,W7b,U7b,l8b,g8b,y8b,L8b,R7b,B8b,j8b,s8b,c8b,a8b,J8b,$7b,d8b,X7b])} +function Yic(a,b,c){a.d=0;a.b=0;b.k==(j0b(),i0b)&&c.k==i0b&&BD(vNb(b,(wtc(),$sc)),10)==BD(vNb(c,$sc),10)&&(ajc(b).j==(Ucd(),Acd)?Zic(a,b,c):Zic(a,c,b));b.k==i0b&&c.k==g0b?ajc(b).j==(Ucd(),Acd)?(a.d=1):(a.b=1):c.k==i0b&&b.k==g0b&&(ajc(c).j==(Ucd(),Acd)?(a.b=1):(a.d=1));cjc(a,b,c)} +function esd(a){var b,c,d,e,f,g,h,i,j,k,l;l=hsd(a);b=a.a;i=b!=null;i&&Upd(l,'category',a.a);e=Fhe(new Pib(a.d));g=!e;if(g){j=new wB;cC(l,'knownOptions',j);c=new msd(j);reb(new Pib(a.d),c)}f=Fhe(a.g);h=!f;if(h){k=new wB;cC(l,'supportedFeatures',k);d=new osd(k);reb(a.g,d)}return l} +function ty(a){var b,c,d,e,f,g,h,i,j;d=false;b=336;c=0;f=new Xp(a.length);for(h=a,i=0,j=h.length;i>16!=7&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+Iod(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?Eod(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=BD(b,49).gh(a,1,C2,d));d=Dod(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,7,b,b))} +function NHd(a,b){var c,d;if(b!=a.Cb||a.Db>>16!=3&&!!b){if(p6d(a,b))throw vbb(new Wdb(ste+QHd(a)));d=null;!!a.Cb&&(d=(c=a.Db>>16,c>=0?KHd(a,d):a.Cb.ih(a,-1-c,null,d)));!!b&&(d=BD(b,49).gh(a,0,k5,d));d=JHd(a,b,d);!!d&&d.Fi()}else (a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,3,b,b))} +function Ehb(a,b){Dhb();var c,d,e,f,g,h,i,j,k;if(b.d>a.d){h=a;a=b;b=h}if(b.d<63){return Ihb(a,b)}g=(a.d&-2)<<4;j=Rgb(a,g);k=Rgb(b,g);d=yhb(a,Qgb(j,g));e=yhb(b,Qgb(k,g));i=Ehb(j,k);c=Ehb(d,e);f=Ehb(yhb(j,d),yhb(e,k));f=thb(thb(f,i),c);f=Qgb(f,g);i=Qgb(i,g<<1);return thb(thb(i,f),c)} +function aGc(a,b,c){var d,e,f,g,h;g=CHc(a,c);h=KC(OQ,kne,10,b.length,0,1);d=0;for(f=g.Kc();f.Ob();){e=BD(f.Pb(),11);Ccb(DD(vNb(e,(wtc(),Nsc))))&&(h[d++]=BD(vNb(e,gtc),10))}if(d=0;f+=c?1:-1){g=g|b.c.Sf(i,f,c,d&&!Ccb(DD(vNb(b.j,(wtc(),Jsc))))&&!Ccb(DD(vNb(b.j,(wtc(),mtc)))));g=g|b.q._f(i,f,c);g=g|cGc(a,i[f],c,d)}Qqb(a.c,b);return g} +function o3b(a,b,c){var d,e,f,g,h,i,j,k,l,m;for(k=m_b(a.j),l=0,m=k.length;l1&&(a.a=true);ZNb(BD(c.b,65),P6c(R6c(BD(b.b,65).c),Y6c(c7c(R6c(BD(c.b,65).a),BD(b.b,65).a),e)));D1c(a,b);F1c(a,c)}} +function rVb(a){var b,c,d,e,f,g,h;for(f=new olb(a.a.a);f.a0&&f>0?(g.p=b++):d>0?(g.p=c++):f>0?(g.p=e++):(g.p=c++);}}mmb();Okb(a.j,new fcc)} +function Vec(a){var b,c;c=null;b=BD(Ikb(a.g,0),17);do{c=b.d.i;if(wNb(c,(wtc(),Wsc))){return BD(vNb(c,Wsc),11).i}if(c.k!=(j0b(),h0b)&&Qr(new Sr(ur(U_b(c).a.Kc(),new Sq)))){b=BD(Rr(new Sr(ur(U_b(c).a.Kc(),new Sq))),17)}else if(c.k!=h0b){return null}}while(!!c&&c.k!=(j0b(),h0b));return c} +function Omc(a,b){var c,d,e,f,g,h,i,j,k;h=b.j;g=b.g;i=BD(Ikb(h,h.c.length-1),113);k=(tCb(0,h.c.length),BD(h.c[0],113));j=Kmc(a,g,i,k);for(f=1;fj){i=c;k=e;j=d}}b.a=k;b.c=i} +function sEb(a,b){var c,d;d=Axb(a.b,b.b);if(!d){throw vbb(new Zdb('Invalid hitboxes for scanline constraint calculation.'))}(mEb(b.b,BD(Cxb(a.b,b.b),57))||mEb(b.b,BD(Bxb(a.b,b.b),57)))&&(Zfb(),b.b+' has overlap.');a.a[b.b.f]=BD(Exb(a.b,b.b),57);c=BD(Dxb(a.b,b.b),57);!!c&&(a.a[c.f]=b.b)} +function AFb(a){if(!a.a.d||!a.a.e){throw vbb(new Zdb((fdb(fN),fN.k+' must have a source and target '+(fdb(jN),jN.k)+' specified.')))}if(a.a.d==a.a.e){throw vbb(new Zdb('Network simplex does not support self-loops: '+a.a+' '+a.a.d+' '+a.a.e))}NFb(a.a.d.g,a.a);NFb(a.a.e.b,a.a);return a.a} +function HHc(a,b,c){var d,e,f,g,h,i,j;j=new Hxb(new tIc(a));for(g=OC(GC(aR,1),lne,11,0,[b,c]),h=0,i=g.length;hi-a.b&&hi-a.a&&h0&&++n}}}++m}return n} +function hUc(a,b){var c,d,e,f,g;g=BD(vNb(b,(JTc(),FTc)),425);for(f=Jsb(b.b,0);f.b!=f.d.c;){e=BD(Xsb(f),86);if(a.b[e.g]==0){switch(g.g){case 0:iUc(a,e);break;case 1:gUc(a,e);}a.b[e.g]=2}}for(d=Jsb(a.a,0);d.b!=d.d.c;){c=BD(Xsb(d),188);ze(c.b.d,c,true);ze(c.c.b,c,true)}yNb(b,(mTc(),gTc),a.a)} +function S6d(a,b){Q6d();var c,d,e,f;if(!b){return P6d}else if(b==(Q8d(),N8d)||(b==v8d||b==t8d||b==u8d)&&a!=s8d){return new Z6d(a,b)}else{d=BD(b,677);c=d.pk();if(!c){a2d(q1d((O6d(),M6d),b));c=d.pk()}f=(!c.i&&(c.i=new Lqb),c.i);e=BD(Wd(irb(f.f,a)),1942);!e&&Rhb(f,a,e=new Z6d(a,b));return e}} +function Tbc(a,b){var c,d,e,f,g,h,i,j,k;i=BD(vNb(a,(wtc(),$sc)),11);j=l7c(OC(GC(m1,1),nie,8,0,[i.i.n,i.n,i.a])).a;k=a.i.n.b;c=k_b(a.e);for(e=c,f=0,g=e.length;f0){if(f.a){h=f.b.rf().a;if(c>h){e=(c-h)/2;f.d.b=e;f.d.c=e}}else{f.d.c=a.s+c}}else if(tcd(a.u)){d=sfd(f.b);d.c<0&&(f.d.b=-d.c);d.c+d.b>f.b.rf().a&&(f.d.c=d.c+d.b-f.b.rf().a)}}} +function Eec(a,b){var c,d,e,f;Odd(b,'Semi-Interactive Crossing Minimization Processor',1);c=false;for(e=new olb(a.b);e.a=0){if(b==c){return new vgd(meb(-b-1),meb(-b-1))}if(b==-c){return new vgd(meb(-b),meb(c+1))}}if($wnd.Math.abs(b)>$wnd.Math.abs(c)){if(b<0){return new vgd(meb(-b),meb(c))}return new vgd(meb(-b),meb(c+1))}return new vgd(meb(b+1),meb(c))} +function q5b(a){var b,c;c=BD(vNb(a,(Nyc(),mxc)),163);b=BD(vNb(a,(wtc(),Osc)),303);if(c==(Ctc(),ytc)){yNb(a,mxc,Btc);yNb(a,Osc,(esc(),dsc))}else if(c==Atc){yNb(a,mxc,Btc);yNb(a,Osc,(esc(),bsc))}else if(b==(esc(),dsc)){yNb(a,mxc,ytc);yNb(a,Osc,csc)}else if(b==bsc){yNb(a,mxc,Atc);yNb(a,Osc,csc)}} +function FNc(){FNc=ccb;DNc=new RNc;zNc=e3c(new j3c,(qUb(),nUb),(S8b(),o8b));CNc=c3c(e3c(new j3c,nUb,C8b),pUb,B8b);ENc=b3c(b3c(g3c(c3c(e3c(new j3c,lUb,M8b),pUb,L8b),oUb),K8b),N8b);ANc=c3c(e3c(e3c(e3c(new j3c,mUb,r8b),oUb,t8b),oUb,u8b),pUb,s8b);BNc=c3c(e3c(e3c(new j3c,oUb,u8b),oUb,_7b),pUb,$7b)} +function hQc(){hQc=ccb;cQc=e3c(c3c(new j3c,(qUb(),pUb),(S8b(),c8b)),nUb,o8b);gQc=b3c(b3c(g3c(c3c(e3c(new j3c,lUb,M8b),pUb,L8b),oUb),K8b),N8b);dQc=c3c(e3c(e3c(e3c(new j3c,mUb,r8b),oUb,t8b),oUb,u8b),pUb,s8b);fQc=e3c(e3c(new j3c,nUb,C8b),pUb,B8b);eQc=c3c(e3c(e3c(new j3c,oUb,u8b),oUb,_7b),pUb,$7b)} +function GNc(a,b,c,d,e){var f,g;if((!OZb(b)&&b.c.i.c==b.d.i.c||!T6c(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])),c))&&!OZb(b)){b.c==e?St(b.a,0,new g7c(c)):Dsb(b.a,new g7c(c));if(d&&!Rqb(a.a,c)){g=BD(vNb(b,(Nyc(),jxc)),74);if(!g){g=new s7c;yNb(b,jxc,g)}f=new g7c(c);Gsb(g,f,g.c.b,g.c);Qqb(a.a,f)}}} +function Qac(a){var b,c;for(c=new Sr(ur(R_b(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),17);if(b.c.i.k!=(j0b(),f0b)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to FIRST, but has at least one incoming edge that "+' does not come from a FIRST_SEPARATE node. That must not happen.'))}}} +function vjd(a,b,c){var d,e,f,g,h,i,j;e=aeb(a.Db&254);if(e==0){a.Eb=c}else{if(e==1){h=KC(SI,Uhe,1,2,5,1);f=zjd(a,b);if(f==0){h[0]=c;h[1]=a.Eb}else{h[0]=a.Eb;h[1]=c}}else{h=KC(SI,Uhe,1,e+1,5,1);g=CD(a.Eb);for(d=2,i=0,j=0;d<=128;d<<=1){d==b?(h[j++]=c):(a.Db&d)!=0&&(h[j++]=g[i++])}}a.Eb=h}a.Db|=b} +function ENb(a,b,c){var d,e,f,g;this.b=new Rkb;e=0;d=0;for(g=new olb(a);g.a0){f=BD(Ikb(this.b,0),167);e+=f.o;d+=f.p}e*=2;d*=2;b>1?(e=QD($wnd.Math.ceil(e*b))):(d=QD($wnd.Math.ceil(d/b)));this.a=new pNb(e,d)} +function Igc(a,b,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q,r;k=d;if(b.j&&b.o){n=BD(Ohb(a.f,b.A),57);p=n.d.c+n.d.b;--k}else{p=b.a.c+b.a.b}l=e;if(c.q&&c.o){n=BD(Ohb(a.f,c.C),57);j=n.d.c;++l}else{j=c.a.c}q=j-p;i=$wnd.Math.max(2,l-k);h=q/i;o=p+h;for(m=k;m=0;g+=e?1:-1){h=b[g];i=d==(Ucd(),zcd)?e?V_b(h,d):Su(V_b(h,d)):e?Su(V_b(h,d)):V_b(h,d);f&&(a.c[h.p]=i.gc());for(l=i.Kc();l.Ob();){k=BD(l.Pb(),11);a.d[k.p]=j++}Gkb(c,i)}} +function aQc(a,b,c){var d,e,f,g,h,i,j,k;f=Edb(ED(a.b.Kc().Pb()));j=Edb(ED(Pq(b.b)));d=Y6c(R6c(a.a),j-c);e=Y6c(R6c(b.a),c-f);k=P6c(d,e);Y6c(k,1/(j-f));this.a=k;this.b=new Rkb;h=true;g=a.b.Kc();g.Pb();while(g.Ob()){i=Edb(ED(g.Pb()));if(h&&i-c>Oqe){this.b.Fc(c);h=false}this.b.Fc(i)}h&&this.b.Fc(c)} +function vGb(a){var b,c,d,e;yGb(a,a.n);if(a.d.c.length>0){Blb(a.c);while(GGb(a,BD(mlb(new olb(a.e.a)),121))>5;b&=31;if(d>=a.d){return a.e<0?(Hgb(),Bgb):(Hgb(),Ggb)}f=a.d-d;e=KC(WD,oje,25,f+1,15,1);mhb(e,f,a.a,d,b);if(a.e<0){for(c=0;c0&&a.a[c]<<32-b!=0){for(c=0;c=0){return false}else{c=e1d((O6d(),M6d),e,b);if(!c){return true}else{d=c.Zj();return (d>1||d==-1)&&$1d(q1d(M6d,c))!=3}}}}else{return false}} +function R1b(a,b,c,d){var e,f,g,h,i;h=atd(BD(qud((!b.b&&(b.b=new y5d(z2,b,4,7)),b.b),0),82));i=atd(BD(qud((!b.c&&(b.c=new y5d(z2,b,5,8)),b.c),0),82));if(Xod(h)==Xod(i)){return null}if(ntd(i,h)){return null}g=Mld(b);if(g==c){return d}else{f=BD(Ohb(a.a,g),10);if(f){e=f.e;if(e){return e}}}return null} +function Cac(a,b){var c;c=BD(vNb(a,(Nyc(),Rwc)),276);Odd(b,'Label side selection ('+c+')',1);switch(c.g){case 0:Dac(a,(rbd(),nbd));break;case 1:Dac(a,(rbd(),obd));break;case 2:Bac(a,(rbd(),nbd));break;case 3:Bac(a,(rbd(),obd));break;case 4:Eac(a,(rbd(),nbd));break;case 5:Eac(a,(rbd(),obd));}Qdd(b)} +function bGc(a,b,c){var d,e,f,g,h,i;d=RFc(c,a.length);g=a[d];if(g[0].k!=(j0b(),e0b)){return}f=SFc(c,g.length);i=b.j;for(e=0;e0){c[0]+=a.d;g-=c[0]}if(c[2]>0){c[2]+=a.d;g-=c[2]}f=$wnd.Math.max(0,g);c[1]=$wnd.Math.max(c[1],g);vHb(a,eHb,e.c+d.b+c[0]-(c[1]-g)/2,c);if(b==eHb){a.c.b=f;a.c.c=e.c+d.b+(f-g)/2}} +function AYb(){this.c=KC(UD,Vje,25,(Ucd(),OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd])).length,15,1);this.b=KC(UD,Vje,25,OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd]).length,15,1);this.a=KC(UD,Vje,25,OC(GC(F1,1),bne,61,0,[Scd,Acd,zcd,Rcd,Tcd]).length,15,1);zlb(this.c,Pje);zlb(this.b,Qje);zlb(this.a,Qje)} +function Ufe(a,b,c){var d,e,f,g;if(b<=c){e=b;f=c}else{e=c;f=b}d=0;if(a.b==null){a.b=KC(WD,oje,25,2,15,1);a.b[0]=e;a.b[1]=f;a.c=true}else{d=a.b.length;if(a.b[d-1]+1==e){a.b[d-1]=f;return}g=KC(WD,oje,25,d+2,15,1);$fb(a.b,0,g,0,d);a.b=g;a.b[d-1]>=e&&(a.c=false,a.a=false);a.b[d++]=e;a.b[d]=f;a.c||Yfe(a)}} +function inc(a,b,c){var d,e,f,g,h,i,j;j=b.d;a.a=new Skb(j.c.length);a.c=new Lqb;for(h=new olb(j);h.a=0?a._g(j,false,true):sid(a,c,false),58));n:for(f=l.Kc();f.Ob();){e=BD(f.Pb(),56);for(k=0;k1){Xxd(e,e.i-1)}}return d}} +function Z2b(a,b){var c,d,e,f,g,h,i;Odd(b,'Comment post-processing',1);for(f=new olb(a.b);f.aa.d[g.p]){c+=zHc(a.b,f);Wjb(a.a,meb(f))}}while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function o2c(a,b,c){var d,e,f,g;f=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i;for(e=new Fyd((!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));e.e!=e.i.gc();){d=BD(Dyd(e),33);(!d.a&&(d.a=new cUd(E2,d,10,11)),d.a).i==0||(f+=o2c(a,d,false))}if(c){g=Xod(b);while(g){f+=(!g.a&&(g.a=new cUd(E2,g,10,11)),g.a).i;g=Xod(g)}}return f} +function Xxd(a,b){var c,d,e,f;if(a.ej()){d=null;e=a.fj();a.ij()&&(d=a.kj(a.pi(b),null));c=a.Zi(4,f=tud(a,b),null,b,e);if(a.bj()&&f!=null){d=a.dj(f,d);if(!d){a.$i(c)}else{d.Ei(c);d.Fi()}}else{if(!d){a.$i(c)}else{d.Ei(c);d.Fi()}}return f}else{f=tud(a,b);if(a.bj()&&f!=null){d=a.dj(f,null);!!d&&d.Fi()}return f}} +function UKb(a){var b,c,d,e,f,g,h,i,j,k;j=a.a;b=new Tqb;i=0;for(d=new olb(a.d);d.ah.d&&(k=h.d+h.a+j)}}c.c.d=k;b.a.zc(c,b);i=$wnd.Math.max(i,c.c.d+c.c.a)}return i} +function Orc(){Orc=ccb;Frc=new Prc('COMMENTS',0);Hrc=new Prc('EXTERNAL_PORTS',1);Irc=new Prc('HYPEREDGES',2);Jrc=new Prc('HYPERNODES',3);Krc=new Prc('NON_FREE_PORTS',4);Lrc=new Prc('NORTH_SOUTH_PORTS',5);Nrc=new Prc(Wne,6);Erc=new Prc('CENTER_LABELS',7);Grc=new Prc('END_LABELS',8);Mrc=new Prc('PARTITIONS',9)} +function gVc(a){var b,c,d,e,f;e=new Rkb;b=new Vqb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));for(d=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);if(!JD(qud((!c.b&&(c.b=new y5d(z2,c,4,7)),c.b),0),186)){f=atd(BD(qud((!c.c&&(c.c=new y5d(z2,c,5,8)),c.c),0),82));b.a._b(f)||(e.c[e.c.length]=f,true)}}return e} +function fVc(a){var b,c,d,e,f,g;f=new Tqb;b=new Vqb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));for(e=new Sr(ur(_sd(a).a.Kc(),new Sq));Qr(e);){d=BD(Rr(e),79);if(!JD(qud((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),0),186)){g=atd(BD(qud((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c),0),82));b.a._b(g)||(c=f.a.zc(g,f),c==null)}}return f} +function zA(a,b,c,d,e){if(d<0){d=oA(a,e,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje]),b);d<0&&(d=oA(a,e,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec']),b));if(d<0){return false}c.k=d;return true}else if(d>0){c.k=d-1;return true}return false} +function BA(a,b,c,d,e){if(d<0){d=oA(a,e,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje]),b);d<0&&(d=oA(a,e,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec']),b));if(d<0){return false}c.k=d;return true}else if(d>0){c.k=d-1;return true}return false} +function DA(a,b,c,d,e,f){var g,h,i,j;h=32;if(d<0){if(b[0]>=a.length){return false}h=bfb(a,b[0]);if(h!=43&&h!=45){return false}++b[0];d=rA(a,b);if(d<0){return false}h==45&&(d=-d)}if(h==32&&b[0]-c==2&&e.b==2){i=new eB;j=i.q.getFullYear()-nje+nje-80;g=j%100;f.a=d==g;d+=(j/100|0)*100+(d=j&&(i=d)}!!i&&(k=$wnd.Math.max(k,i.a.o.a));if(k>m){l=j;m=k}}return l} +function ode(a,b,c){var d,e,f;a.e=c;a.d=0;a.b=0;a.f=1;a.i=b;(a.e&16)==16&&(a.i=Xee(a.i));a.j=a.i.length;nde(a);f=rde(a);if(a.d!=a.j)throw vbb(new mde(tvd((h0d(),sue))));if(a.g){for(d=0;dvre?Okb(i,a.b):d<=vre&&d>wre?Okb(i,a.d):d<=wre&&d>xre?Okb(i,a.c):d<=xre&&Okb(i,a.a);f=ZXc(a,i,f)}return e} +function Hgb(){Hgb=ccb;var a;Cgb=new Ugb(1,1);Egb=new Ugb(1,10);Ggb=new Ugb(0,0);Bgb=new Ugb(-1,1);Dgb=OC(GC(cJ,1),nie,91,0,[Ggb,Cgb,new Ugb(1,2),new Ugb(1,3),new Ugb(1,4),new Ugb(1,5),new Ugb(1,6),new Ugb(1,7),new Ugb(1,8),new Ugb(1,9),Egb]);Fgb=KC(cJ,nie,91,32,0,1);for(a=0;a1;if(h){d=new f7c(e,c.b);Dsb(b.a,d)}n7c(b.a,OC(GC(m1,1),nie,8,0,[m,l]))} +function jdd(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,Rse),'ELK Randomizer'),'Distributes the nodes randomly on the plane, leading to very obfuscating layouts. Can be useful to demonstrate the power of "real" layout algorithms.'),new mdd)));p4c(a,Rse,ame,fdd);p4c(a,Rse,wme,15);p4c(a,Rse,yme,meb(0));p4c(a,Rse,_le,tme)} +function hde(){hde=ccb;var a,b,c,d,e,f;fde=KC(SD,wte,25,255,15,1);gde=KC(TD,$ie,25,16,15,1);for(b=0;b<255;b++){fde[b]=-1}for(c=57;c>=48;c--){fde[c]=c-48<<24>>24}for(d=70;d>=65;d--){fde[d]=d-65+10<<24>>24}for(e=102;e>=97;e--){fde[e]=e-97+10<<24>>24}for(f=0;f<10;f++)gde[f]=48+f&aje;for(a=10;a<=15;a++)gde[a]=65+a-10&aje} +function BVc(a,b,c){var d,e,f,g,h,i,j,k;h=b.i-a.g/2;i=c.i-a.g/2;j=b.j-a.g/2;k=c.j-a.g/2;f=b.g+a.g/2;g=c.g+a.g/2;d=b.f+a.g/2;e=c.f+a.g/2;if(h>19!=0){return '-'+qD(hD(a))}c=a;d='';while(!(c.l==0&&c.m==0&&c.h==0)){e=RC(Jje);c=UC(c,e,true);b=''+pD(QC);if(!(c.l==0&&c.m==0&&c.h==0)){f=9-b.length;for(;f>0;f--){b='0'+b}}d=b+d}return d} +function xrb(){if(!Object.create||!Object.getOwnPropertyNames){return false}var a='__proto__';var b=Object.create(null);if(b[a]!==undefined){return false}var c=Object.getOwnPropertyNames(b);if(c.length!=0){return false}b[a]=42;if(b[a]!==42){return false}if(Object.getOwnPropertyNames(b).length==0){return false}return true} +function Pgc(a){var b,c,d,e,f,g,h;b=false;c=0;for(e=new olb(a.d.b);e.a=a.a){return -1}if(!F6b(b,c)){return -1}if(Qq(BD(d.Kb(b),20))){return 1}e=0;for(g=BD(d.Kb(b),20).Kc();g.Ob();){f=BD(g.Pb(),17);i=f.c.i==b?f.d.i:f.c.i;h=G6b(a,i,c,d);if(h==-1){return -1}e=$wnd.Math.max(e,h);if(e>a.c-1){return -1}}return e+1} +function Btd(a,b){var c,d,e,f,g,h;if(PD(b)===PD(a)){return true}if(!JD(b,15)){return false}d=BD(b,15);h=a.gc();if(d.gc()!=h){return false}g=d.Kc();if(a.ni()){for(c=0;c0){a.qj();if(b!=null){for(f=0;f>24}case 97:case 98:case 99:case 100:case 101:case 102:{return a-97+10<<24>>24}case 65:case 66:case 67:case 68:case 69:case 70:{return a-65+10<<24>>24}default:{throw vbb(new Oeb('Invalid hexadecimal'))}}} +function AUc(a,b,c){var d,e,f,g;Odd(c,'Processor order nodes',2);a.a=Edb(ED(vNb(b,(JTc(),HTc))));e=new Psb;for(g=Jsb(b.b,0);g.b!=g.d.c;){f=BD(Xsb(g),86);Ccb(DD(vNb(f,(mTc(),jTc))))&&(Gsb(e,f,e.c.b,e.c),true)}d=(sCb(e.b!=0),BD(e.a.a.c,86));yUc(a,d);!c.b&&Rdd(c,1);BUc(a,d,0-Edb(ED(vNb(d,(mTc(),bTc))))/2,0);!c.b&&Rdd(c,1);Qdd(c)} +function rFb(){rFb=ccb;qFb=new sFb('SPIRAL',0);lFb=new sFb('LINE_BY_LINE',1);mFb=new sFb('MANHATTAN',2);kFb=new sFb('JITTER',3);oFb=new sFb('QUADRANTS_LINE_BY_LINE',4);pFb=new sFb('QUADRANTS_MANHATTAN',5);nFb=new sFb('QUADRANTS_JITTER',6);jFb=new sFb('COMBINE_LINE_BY_LINE_MANHATTAN',7);iFb=new sFb('COMBINE_JITTER_MANHATTAN',8)} +function roc(a,b,c,d){var e,f,g,h,i,j;i=woc(a,c);j=woc(b,c);e=false;while(!!i&&!!j){if(d||uoc(i,j,c)){g=woc(i,c);h=woc(j,c);zoc(b);zoc(a);f=i.c;sbc(i,false);sbc(j,false);if(c){Z_b(b,j.p,f);b.p=j.p;Z_b(a,i.p+1,f);a.p=i.p}else{Z_b(a,i.p,f);a.p=i.p;Z_b(b,j.p+1,f);b.p=j.p}$_b(i,null);$_b(j,null);i=g;j=h;e=true}else{break}}return e} +function VDc(a,b,c,d){var e,f,g,h,i;e=false;f=false;for(h=new olb(d.j);h.a=b.length){throw vbb(new qcb('Greedy SwitchDecider: Free layer not in graph.'))}this.c=b[a];this.e=new dIc(d);THc(this.e,this.c,(Ucd(),Tcd));this.i=new dIc(d);THc(this.i,this.c,zcd);this.f=new ejc(this.c);this.a=!f&&e.i&&!e.s&&this.c[0].k==(j0b(),e0b);this.a&&hjc(this,a,b.length)} +function hKb(a,b){var c,d,e,f,g,h;f=!a.B.Hc((Idd(),zdd));g=a.B.Hc(Cdd);a.a=new FHb(g,f,a.c);!!a.n&&u_b(a.a.n,a.n);lIb(a.g,(gHb(),eHb),a.a);if(!b){d=new mIb(1,f,a.c);d.n.a=a.k;Npb(a.p,(Ucd(),Acd),d);e=new mIb(1,f,a.c);e.n.d=a.k;Npb(a.p,Rcd,e);h=new mIb(0,f,a.c);h.n.c=a.k;Npb(a.p,Tcd,h);c=new mIb(0,f,a.c);c.n.b=a.k;Npb(a.p,zcd,c)}} +function Vgc(a){var b,c,d;b=BD(vNb(a.d,(Nyc(),Swc)),218);switch(b.g){case 2:c=Ngc(a);break;case 3:c=(d=new Rkb,MAb(JAb(NAb(LAb(LAb(new YAb(null,new Kub(a.d.b,16)),new Shc),new Uhc),new Whc),new ehc),new Yhc(d)),d);break;default:throw vbb(new Zdb('Compaction not supported for '+b+' edges.'));}Ugc(a,c);reb(new Pib(a.g),new Ehc(a))} +function a2c(a,b){var c;c=new zNb;!!b&&tNb(c,BD(Ohb(a.a,C2),94));JD(b,470)&&tNb(c,BD(Ohb(a.a,G2),94));if(JD(b,354)){tNb(c,BD(Ohb(a.a,D2),94));return c}JD(b,82)&&tNb(c,BD(Ohb(a.a,z2),94));if(JD(b,239)){tNb(c,BD(Ohb(a.a,E2),94));return c}if(JD(b,186)){tNb(c,BD(Ohb(a.a,F2),94));return c}JD(b,352)&&tNb(c,BD(Ohb(a.a,B2),94));return c} +function wSb(){wSb=ccb;oSb=new Osd((Y9c(),D9c),meb(1));uSb=new Osd(T9c,80);tSb=new Osd(M9c,5);bSb=new Osd(r8c,tme);pSb=new Osd(E9c,meb(1));sSb=new Osd(H9c,(Bcb(),true));lSb=new q0b(50);kSb=new Osd(f9c,lSb);dSb=O8c;mSb=t9c;cSb=new Osd(B8c,false);jSb=e9c;iSb=b9c;hSb=Y8c;gSb=W8c;nSb=x9c;fSb=(SRb(),LRb);vSb=QRb;eSb=KRb;qSb=NRb;rSb=PRb} +function ZXb(a){var b,c,d,e,f,g,h,i;i=new jYb;for(h=new olb(a.a);h.a0&&b=0){return false}else{b.p=c.b;Ekb(c.e,b)}if(e==(j0b(),g0b)||e==i0b){for(g=new olb(b.j);g.a1||g==-1)&&(f|=16);(e.Bb&ote)!=0&&(f|=64)}(c.Bb&Tje)!=0&&(f|=Dve);f|=zte}else{if(JD(b,457)){f|=512}else{d=b.Bj();!!d&&(d.i&1)!=0&&(f|=256)}}(a.Bb&512)!=0&&(f|=128);return f} +function hc(a,b){var c,d,e,f,g;a=a==null?Xhe:(uCb(a),a);for(e=0;ea.d[h.p]){c+=zHc(a.b,f);Wjb(a.a,meb(f))}}else{++g}}c+=a.b.d*g;while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function Y6d(a,b){var c;if(a.f==W6d){c=$1d(q1d((O6d(),M6d),b));return a.e?c==4&&b!=(m8d(),k8d)&&b!=(m8d(),h8d)&&b!=(m8d(),i8d)&&b!=(m8d(),j8d):c==2}if(!!a.d&&(a.d.Hc(b)||a.d.Hc(_1d(q1d((O6d(),M6d),b)))||a.d.Hc(e1d((O6d(),M6d),a.b,b)))){return true}if(a.f){if(x1d((O6d(),a.f),b2d(q1d(M6d,b)))){c=$1d(q1d(M6d,b));return a.e?c==4:c==2}}return false} +function iVc(a,b,c,d){var e,f,g,h,i,j,k,l;g=BD(hkd(c,(Y9c(),C9c)),8);i=g.a;k=g.b+a;e=$wnd.Math.atan2(k,i);e<0&&(e+=dre);e+=b;e>dre&&(e-=dre);h=BD(hkd(d,C9c),8);j=h.a;l=h.b+a;f=$wnd.Math.atan2(l,j);f<0&&(f+=dre);f+=b;f>dre&&(f-=dre);return Iy(),My(1.0E-10),$wnd.Math.abs(e-f)<=1.0E-10||e==f||isNaN(e)&&isNaN(f)?0:ef?1:Ny(isNaN(e),isNaN(f))} +function YDb(a){var b,c,d,e,f,g,h;h=new Lqb;for(d=new olb(a.a.b);d.a=b.o){throw vbb(new rcb)}i=c>>5;h=c&31;g=Nbb(1,Tbb(Nbb(h,1)));f?(b.n[d][i]=Mbb(b.n[d][i],g)):(b.n[d][i]=xbb(b.n[d][i],Lbb(g)));g=Nbb(g,1);e?(b.n[d][i]=Mbb(b.n[d][i],g)):(b.n[d][i]=xbb(b.n[d][i],Lbb(g)))}catch(a){a=ubb(a);if(JD(a,320)){throw vbb(new qcb(Dle+b.o+'*'+b.p+Ele+c+She+d+Fle))}else throw vbb(a)}} +function BUc(a,b,c,d){var e,f,g;if(b){f=Edb(ED(vNb(b,(mTc(),fTc))))+d;g=c+Edb(ED(vNb(b,bTc)))/2;yNb(b,kTc,meb(Tbb(Cbb($wnd.Math.round(f)))));yNb(b,lTc,meb(Tbb(Cbb($wnd.Math.round(g)))));b.d.b==0||BUc(a,BD(pr((e=Jsb((new ZRc(b)).a.d,0),new aSc(e))),86),c+Edb(ED(vNb(b,bTc)))+a.a,d+Edb(ED(vNb(b,cTc))));vNb(b,iTc)!=null&&BUc(a,BD(vNb(b,iTc),86),c,d)}} +function N9b(a,b){var c,d,e,f,g,h,i,j,k,l,m;i=Q_b(b.a);e=Edb(ED(vNb(i,(Nyc(),pyc))))*2;k=Edb(ED(vNb(i,wyc)));j=$wnd.Math.max(e,k);f=KC(UD,Vje,25,b.f-b.c+1,15,1);d=-j;c=0;for(h=b.b.Kc();h.Ob();){g=BD(h.Pb(),10);d+=a.a[g.c.p]+j;f[c++]=d}d+=a.a[b.a.c.p]+j;f[c++]=d;for(m=new olb(b.e);m.a0){d=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!d||Qfb(Qfb((b.a+=' "',b),d),'"')}}else{Qfb(Qfb((b.a+=' "',b),c),'"')}Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function opd(a){var b,c,d;if((a.Db&64)!=0)return fld(a);b=new Wfb(fte);c=a.k;if(!c){!a.n&&(a.n=new cUd(D2,a,1,7));if(a.n.i>0){d=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!d||Qfb(Qfb((b.a+=' "',b),d),'"')}}else{Qfb(Qfb((b.a+=' "',b),c),'"')}Qfb(Lfb(Qfb(Lfb(Qfb(Lfb(Qfb(Lfb((b.a+=' (',b),a.i),','),a.j),' | '),a.g),','),a.f),')');return b.a} +function h4c(a,b){var c,d,e,f,g,h,i;if(b==null||b.length==0){return null}e=BD(Phb(a.a,b),149);if(!e){for(d=(h=(new $ib(a.b)).a.vc().Kc(),new djb(h));d.a.Ob();){c=(f=BD(d.a.Pb(),42),BD(f.dd(),149));g=c.c;i=b.length;if(dfb(g.substr(g.length-i,i),b)&&(b.length==g.length||bfb(g,g.length-b.length-1)==46)){if(e){return null}e=c}}!!e&&Shb(a.a,b,e)}return e} +function QLb(a,b){var c,d,e,f;c=new VLb;d=BD(GAb(NAb(new YAb(null,new Kub(a.f,16)),c),Ayb(new hzb,new jzb,new Gzb,new Izb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Eyb),Dyb]))),21);e=d.gc();d=BD(GAb(NAb(new YAb(null,new Kub(b.f,16)),c),Ayb(new hzb,new jzb,new Gzb,new Izb,OC(GC(xL,1),Kie,132,0,[Eyb,Dyb]))),21);f=d.gc();if(ee.p){G0b(f,Rcd);if(f.d){h=f.o.b;b=f.a.b;f.a.b=h-b}}else if(f.j==Rcd&&e.p>a.p){G0b(f,Acd);if(f.d){h=f.o.b;b=f.a.b;f.a.b=-(h-b)}}break}}return e} +function NOc(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o;f=c;if(c1;if(h){d=new f7c(e,c.b);Dsb(b.a,d)}n7c(b.a,OC(GC(m1,1),nie,8,0,[m,l]))} +function Nid(a,b,c){var d,e,f,g,h,i;if(!b){return null}else{if(c<=-1){d=XKd(b.Tg(),-1-c);if(JD(d,99)){return BD(d,18)}else{g=BD(b.ah(d),153);for(h=0,i=g.gc();h0){e=i.length;while(e>0&&i[e-1]==''){--e}e=40;g&&FGb(a);wGb(a);vGb(a);c=zGb(a);d=0;while(!!c&&d0&&Dsb(a.f,f)}else{a.c[g]-=j+1;a.c[g]<=0&&a.a[g]>0&&Dsb(a.e,f)}}}}} +function _Kb(a){var b,c,d,e,f,g,h,i,j;h=new Hxb(BD(Qb(new nLb),62));j=Qje;for(c=new olb(a.d);c.a=0&&ic?b:c;j<=l;++j){if(j==c){h=d++}else{f=e[j];k=o.rl(f.ak());j==b&&(i=j==l&&!k?d-1:d);k&&++d}}m=BD(Wxd(a,b,c),72);h!=i&&GLd(a,new ESd(a.e,7,g,meb(h),n.dd(),i));return m}}}else{return BD(sud(a,b,c),72)}return BD(Wxd(a,b,c),72)} +function Qcc(a,b){var c,d,e,f,g,h,i;Odd(b,'Port order processing',1);i=BD(vNb(a,(Nyc(),_xc)),421);for(d=new olb(a.b);d.a=0){h=bD(a,g);if(h){j<22?(i.l|=1<>>1;g.m=k>>>1|(l&1)<<21;g.l=m>>>1|(k&1)<<21;--j}c&&ZC(i);if(f){if(d){QC=hD(a);e&&(QC=nD(QC,(wD(),uD)))}else{QC=TC(a.l,a.m,a.h)}}return i} +function TDc(a,b){var c,d,e,f,g,h,i,j,k,l;j=a.e[b.c.p][b.p]+1;i=b.c.a.c.length+1;for(h=new olb(a.a);h.a0&&(BCb(0,a.length),a.charCodeAt(0)==45||(BCb(0,a.length),a.charCodeAt(0)==43))?1:0;for(d=g;dc){throw vbb(new Oeb(Oje+a+'"'))}return h} +function dnc(a){var b,c,d,e,f,g,h;g=new Psb;for(f=new olb(a.a);f.a1)&&b==1&&BD(a.a[a.b],10).k==(j0b(),f0b)){zac(BD(a.a[a.b],10),(rbd(),nbd))}else if(d&&(!c||(a.c-a.b&a.a.length-1)>1)&&b==1&&BD(a.a[a.c-1&a.a.length-1],10).k==(j0b(),f0b)){zac(BD(a.a[a.c-1&a.a.length-1],10),(rbd(),obd))}else if((a.c-a.b&a.a.length-1)==2){zac(BD(bkb(a),10),(rbd(),nbd));zac(BD(bkb(a),10),obd)}else{wac(a,e)}Yjb(a)} +function pRc(a,b,c){var d,e,f,g,h;f=0;for(e=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));e.e!=e.i.gc();){d=BD(Dyd(e),33);g='';(!d.n&&(d.n=new cUd(D2,d,1,7)),d.n).i==0||(g=BD(qud((!d.n&&(d.n=new cUd(D2,d,1,7)),d.n),0),137).a);h=new XRc(f++,b,g);tNb(h,d);yNb(h,(mTc(),dTc),d);h.e.b=d.j+d.f/2;h.f.a=$wnd.Math.max(d.g,1);h.e.a=d.i+d.g/2;h.f.b=$wnd.Math.max(d.f,1);Dsb(b.b,h);jrb(c.f,d,h)}} +function B2b(a){var b,c,d,e,f;d=BD(vNb(a,(wtc(),$sc)),33);f=BD(hkd(d,(Nyc(),Fxc)),174).Hc((tdd(),sdd));if(!a.e){e=BD(vNb(a,Ksc),21);b=new f7c(a.f.a+a.d.b+a.d.c,a.f.b+a.d.d+a.d.a);if(e.Hc((Orc(),Hrc))){jkd(d,Vxc,(dcd(),$bd));Afd(d,b.a,b.b,false,true)}else{Ccb(DD(hkd(d,Gxc)))||Afd(d,b.a,b.b,true,true)}}f?jkd(d,Fxc,pqb(sdd)):jkd(d,Fxc,(c=BD(gdb(I1),9),new xqb(c,BD(_Bb(c,c.length),9),0)))} +function tA(a,b,c){var d,e,f,g;if(b[0]>=a.length){c.o=0;return true}switch(bfb(a,b[0])){case 43:e=1;break;case 45:e=-1;break;default:c.o=0;return true;}++b[0];f=b[0];g=rA(a,b);if(g==0&&b[0]==f){return false}if(b[0]=0&&h!=c){f=new nSd(a,1,h,g,null);!d?(d=f):d.Ei(f)}if(c>=0){f=new nSd(a,1,c,h==c?g:null,b);!d?(d=f):d.Ei(f)}}return d} +function LEd(a){var b,c,d;if(a.b==null){d=new Hfb;if(a.i!=null){Efb(d,a.i);d.a+=':'}if((a.f&256)!=0){if((a.f&256)!=0&&a.a!=null){YEd(a.i)||(d.a+='//',d);Efb(d,a.a)}if(a.d!=null){d.a+='/';Efb(d,a.d)}(a.f&16)!=0&&(d.a+='/',d);for(b=0,c=a.j.length;bm){return false}l=(i=MZc(d,m,false),i.a);if(k+h+l<=b.b){KZc(c,f-c.s);c.c=true;KZc(d,f-c.s);OZc(d,c.s,c.t+c.d+h);d.k=true;WZc(c.q,d);n=true;if(e){s$c(b,d);d.j=b;if(a.c.length>g){v$c((tCb(g,a.c.length),BD(a.c[g],200)),d);(tCb(g,a.c.length),BD(a.c[g],200)).a.c.length==0&&Kkb(a,g)}}}return n} +function kcc(a,b){var c,d,e,f,g,h;Odd(b,'Partition midprocessing',1);e=new Hp;MAb(JAb(new YAb(null,new Kub(a.a,16)),new occ),new qcc(e));if(e.d==0){return}h=BD(GAb(UAb((f=e.i,new YAb(null,(!f?(e.i=new zf(e,e.c)):f).Nc()))),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);d=h.Kc();c=BD(d.Pb(),19);while(d.Ob()){g=BD(d.Pb(),19);jcc(BD(Qc(e,c),21),BD(Qc(e,g),21));c=g}Qdd(b)} +function DYb(a,b,c){var d,e,f,g,h,i,j,k;if(b.p==0){b.p=1;g=c;if(!g){e=new Rkb;f=(d=BD(gdb(F1),9),new xqb(d,BD(_Bb(d,d.length),9),0));g=new vgd(e,f)}BD(g.a,15).Fc(b);b.k==(j0b(),e0b)&&BD(g.b,21).Fc(BD(vNb(b,(wtc(),Hsc)),61));for(i=new olb(b.j);i.a0){e=BD(a.Ab.g,1934);if(b==null){for(f=0;f1){for(d=new olb(e);d.ac.s&&hh){h=e;k.c=KC(SI,Uhe,1,0,5,1)}e==h&&Ekb(k,new vgd(c.c.i,c))}mmb();Okb(k,a.c);Dkb(a.b,i.p,k)}}} +function MMc(a,b){var c,d,e,f,g,h,i,j,k;for(g=new olb(b.b);g.ah){h=e;k.c=KC(SI,Uhe,1,0,5,1)}e==h&&Ekb(k,new vgd(c.d.i,c))}mmb();Okb(k,a.c);Dkb(a.f,i.p,k)}}} +function Y7c(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,qse),'ELK Box'),'Algorithm for packing of unconnected boxes, i.e. graphs without edges.'),new _7c)));p4c(a,qse,ame,U7c);p4c(a,qse,wme,15);p4c(a,qse,vme,meb(0));p4c(a,qse,Jre,Ksd(O7c));p4c(a,qse,Fme,Ksd(Q7c));p4c(a,qse,Eme,Ksd(S7c));p4c(a,qse,_le,pse);p4c(a,qse,Ame,Ksd(P7c));p4c(a,qse,Tme,Ksd(R7c));p4c(a,qse,rse,Ksd(M7c));p4c(a,qse,lqe,Ksd(N7c))} +function W$b(a,b){var c,d,e,f,g,h,i,j,k;e=a.i;g=e.o.a;f=e.o.b;if(g<=0&&f<=0){return Ucd(),Scd}j=a.n.a;k=a.n.b;h=a.o.a;c=a.o.b;switch(b.g){case 2:case 1:if(j<0){return Ucd(),Tcd}else if(j+h>g){return Ucd(),zcd}break;case 4:case 3:if(k<0){return Ucd(),Acd}else if(k+c>f){return Ucd(),Rcd}}i=(j+h/2)/g;d=(k+c/2)/f;return i+d<=1&&i-d<=0?(Ucd(),Tcd):i+d>=1&&i-d>=0?(Ucd(),zcd):d<0.5?(Ucd(),Acd):(Ucd(),Rcd)} +function pJc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;c=false;k=Edb(ED(vNb(b,(Nyc(),vyc))));o=Qie*k;for(e=new olb(b.b);e.ai+o){p=l.g+m.g;m.a=(m.g*m.a+l.g*l.a)/p;m.g=p;l.f=m;c=true}}f=h;l=m}}return c} +function VGb(a,b,c,d,e,f,g){var h,i,j,k,l,m;m=new I6c;for(j=b.Kc();j.Ob();){h=BD(j.Pb(),839);for(l=new olb(h.wf());l.a0){if(h.a){j=h.b.rf().b;if(e>j){if(a.v||h.c.d.c.length==1){g=(e-j)/2;h.d.d=g;h.d.a=g}else{c=BD(Ikb(h.c.d,0),181).rf().b;d=(c-j)/2;h.d.d=$wnd.Math.max(0,d);h.d.a=e-d-j}}}else{h.d.a=a.t+e}}else if(tcd(a.u)){f=sfd(h.b);f.d<0&&(h.d.d=-f.d);f.d+f.a>h.b.rf().b&&(h.d.a=f.d+f.a-h.b.rf().b)}}} +function FC(a,b){var c;switch(HC(a)){case 6:return ND(b);case 7:return LD(b);case 8:return KD(b);case 3:return Array.isArray(b)&&(c=HC(b),!(c>=14&&c<=16));case 11:return b!=null&&typeof b===Nhe;case 12:return b!=null&&(typeof b===Jhe||typeof b==Nhe);case 0:return AD(b,a.__elementTypeId$);case 2:return OD(b)&&!(b.im===gcb);case 1:return OD(b)&&!(b.im===gcb)||AD(b,a.__elementTypeId$);default:return true;}} +function xOb(a,b){var c,d,e,f;d=$wnd.Math.min($wnd.Math.abs(a.c-(b.c+b.b)),$wnd.Math.abs(a.c+a.b-b.c));f=$wnd.Math.min($wnd.Math.abs(a.d-(b.d+b.a)),$wnd.Math.abs(a.d+a.a-b.d));c=$wnd.Math.abs(a.c+a.b/2-(b.c+b.b/2));if(c>a.b/2+b.b/2){return 1}e=$wnd.Math.abs(a.d+a.a/2-(b.d+b.a/2));if(e>a.a/2+b.a/2){return 1}if(c==0&&e==0){return 0}if(c==0){return f/e+1}if(e==0){return d/c+1}return $wnd.Math.min(d/c,f/e)+1} +function mgb(a,b){var c,d,e,f,g,h;e=pgb(a);h=pgb(b);if(e==h){if(a.e==b.e&&a.a<54&&b.a<54){return a.fb.f?1:0}d=a.e-b.e;c=(a.d>0?a.d:$wnd.Math.floor((a.a-1)*Xje)+1)-(b.d>0?b.d:$wnd.Math.floor((b.a-1)*Xje)+1);if(c>d+1){return e}else if(c0&&(g=Ogb(g,Khb(d)));return Igb(f,g)}}else return e0&&a.d!=(yTb(),xTb)&&(h+=g*(d.d.a+a.a[b.b][d.b]*(b.d.a-d.d.a)/c));c>0&&a.d!=(yTb(),vTb)&&(i+=g*(d.d.b+a.a[b.b][d.b]*(b.d.b-d.d.b)/c))}switch(a.d.g){case 1:return new f7c(h/f,b.d.b);case 2:return new f7c(b.d.a,i/f);default:return new f7c(h/f,i/f);}} +function Wcc(a,b){Occ();var c,d,e,f,g;g=BD(vNb(a.i,(Nyc(),Vxc)),98);f=a.j.g-b.j.g;if(f!=0||!(g==(dcd(),Zbd)||g==_bd||g==$bd)){return 0}if(g==(dcd(),Zbd)){c=BD(vNb(a,Wxc),19);d=BD(vNb(b,Wxc),19);if(!!c&&!!d){e=c.a-d.a;if(e!=0){return e}}}switch(a.j.g){case 1:return Kdb(a.n.a,b.n.a);case 2:return Kdb(a.n.b,b.n.b);case 3:return Kdb(b.n.a,a.n.a);case 4:return Kdb(b.n.b,a.n.b);default:throw vbb(new Zdb(ine));}} +function tfd(a){var b,c,d,e,f,g;c=(!a.a&&(a.a=new xMd(y2,a,5)),a.a).i+2;g=new Skb(c);Ekb(g,new f7c(a.j,a.k));MAb(new YAb(null,(!a.a&&(a.a=new xMd(y2,a,5)),new Kub(a.a,16))),new Qfd(g));Ekb(g,new f7c(a.b,a.c));b=1;while(b0){jEb(i,false,(ead(),aad));jEb(i,true,bad)}Hkb(b.g,new $hc(a,c));Rhb(a.g,b,c)} +function Neb(){Neb=ccb;var a;Jeb=OC(GC(WD,1),oje,25,15,[-1,-1,30,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5]);Keb=KC(WD,oje,25,37,15,1);Leb=OC(GC(WD,1),oje,25,15,[-1,-1,63,40,32,28,25,23,21,20,19,19,18,18,17,17,16,16,16,15,15,15,15,14,14,14,14,14,14,13,13,13,13,13,13,13,13]);Meb=KC(XD,Sje,25,37,14,1);for(a=2;a<=36;a++){Keb[a]=QD($wnd.Math.pow(a,Jeb[a]));Meb[a]=Abb(rie,Keb[a])}} +function pfd(a){var b;if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i!=1){throw vbb(new Wdb(Tse+(!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i))}b=new s7c;!!btd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82))&&ye(b,qfd(a,btd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82)),false));!!btd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82))&&ye(b,qfd(a,btd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82)),true));return b} +function _Mc(a,b){var c,d,e,f,g;b.d?(e=a.a.c==(YLc(),XLc)?R_b(b.b):U_b(b.b)):(e=a.a.c==(YLc(),WLc)?R_b(b.b):U_b(b.b));f=false;for(d=new Sr(ur(e.a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),17);g=Ccb(a.a.f[a.a.g[b.b.p].p]);if(!g&&!OZb(c)&&c.c.i.c==c.d.i.c){continue}if(Ccb(a.a.n[a.a.g[b.b.p].p])||Ccb(a.a.n[a.a.g[b.b.p].p])){continue}f=true;if(Rqb(a.b,a.a.g[TMc(c,b.b).p])){b.c=true;b.a=c;return b}}b.c=f;b.a=null;return b} +function bed(a,b,c,d,e){var f,g,h,i,j,k,l;mmb();Okb(a,new Red);h=new Bib(a,0);l=new Rkb;f=0;while(h.bf*2){k=new wed(l);j=red(g)/qed(g);i=fed(k,b,new p0b,c,d,e,j);P6c(X6c(k.e),i);l.c=KC(SI,Uhe,1,0,5,1);f=0;l.c[l.c.length]=k;l.c[l.c.length]=g;f=red(k)*qed(k)+red(g)*qed(g)}else{l.c[l.c.length]=g;f+=red(g)*qed(g)}}return l} +function qwd(a,b,c){var d,e,f,g,h,i,j;d=c.gc();if(d==0){return false}else{if(a.ej()){i=a.fj();zvd(a,b,c);g=d==1?a.Zi(3,null,c.Kc().Pb(),b,i):a.Zi(5,null,c,b,i);if(a.bj()){h=d<100?null:new Ixd(d);f=b+d;for(e=b;e0){for(g=0;g>16==-15&&a.Cb.nh()&&Rwd(new oSd(a.Cb,9,13,c,a.c,HLd(QSd(BD(a.Cb,59)),a)))}else if(JD(a.Cb,88)){if(a.Db>>16==-23&&a.Cb.nh()){b=a.c;JD(b,88)||(b=(jGd(),_Fd));JD(c,88)||(c=(jGd(),_Fd));Rwd(new oSd(a.Cb,9,10,c,b,HLd(VKd(BD(a.Cb,26)),a)))}}}}return a.c} +function f7b(a,b){var c,d,e,f,g,h,i,j,k,l;Odd(b,'Hypernodes processing',1);for(e=new olb(a.b);e.ac);return e} +function XFc(a,b){var c,d,e;d=Cub(a.d,1)!=0;!Ccb(DD(vNb(b.j,(wtc(),Jsc))))&&!Ccb(DD(vNb(b.j,mtc)))||PD(vNb(b.j,(Nyc(),ywc)))===PD((tAc(),rAc))?b.c.Tf(b.e,d):(d=Ccb(DD(vNb(b.j,Jsc))));dGc(a,b,d,true);Ccb(DD(vNb(b.j,mtc)))&&yNb(b.j,mtc,(Bcb(),false));if(Ccb(DD(vNb(b.j,Jsc)))){yNb(b.j,Jsc,(Bcb(),false));yNb(b.j,mtc,true)}c=NFc(a,b);do{$Fc(a);if(c==0){return 0}d=!d;e=c;dGc(a,b,d,false);c=NFc(a,b)}while(e>c);return e} +function uNd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;if(b==c){return true}else{b=vNd(a,b);c=vNd(a,c);d=JQd(b);if(d){k=JQd(c);if(k!=d){if(!k){return false}else{i=d.Dj();o=k.Dj();return i==o&&i!=null}}else{g=(!b.d&&(b.d=new xMd(j5,b,1)),b.d);f=g.i;m=(!c.d&&(c.d=new xMd(j5,c,1)),c.d);if(f==m.i){for(j=0;j0;h=xFb(b,f);c?OFb(h.b,b):OFb(h.g,b);LFb(h).c.length==1&&(Gsb(d,h,d.c.b,d.c),true);e=new vgd(f,b);Wjb(a.o,e);Lkb(a.e.a,f)}} +function _Nb(a,b){var c,d,e,f,g,h,i;d=$wnd.Math.abs(D6c(a.b).a-D6c(b.b).a);h=$wnd.Math.abs(D6c(a.b).b-D6c(b.b).b);e=0;i=0;c=1;g=1;if(d>a.b.b/2+b.b.b/2){e=$wnd.Math.min($wnd.Math.abs(a.b.c-(b.b.c+b.b.b)),$wnd.Math.abs(a.b.c+a.b.b-b.b.c));c=1-e/d}if(h>a.b.a/2+b.b.a/2){i=$wnd.Math.min($wnd.Math.abs(a.b.d-(b.b.d+b.b.a)),$wnd.Math.abs(a.b.d+a.b.a-b.b.d));g=1-i/h}f=$wnd.Math.min(c,g);return (1-f)*$wnd.Math.sqrt(d*d+h*h)} +function lQc(a){var b,c,d,e;nQc(a,a.e,a.f,(FQc(),DQc),true,a.c,a.i);nQc(a,a.e,a.f,DQc,false,a.c,a.i);nQc(a,a.e,a.f,EQc,true,a.c,a.i);nQc(a,a.e,a.f,EQc,false,a.c,a.i);mQc(a,a.c,a.e,a.f,a.i);d=new Bib(a.i,0);while(d.b=65;c--){$ce[c]=c-65<<24>>24}for(d=122;d>=97;d--){$ce[d]=d-97+26<<24>>24}for(e=57;e>=48;e--){$ce[e]=e-48+52<<24>>24}$ce[43]=62;$ce[47]=63;for(f=0;f<=25;f++)_ce[f]=65+f&aje;for(g=26,i=0;g<=51;++g,i++)_ce[g]=97+i&aje;for(a=52,h=0;a<=61;++a,h++)_ce[a]=48+h&aje;_ce[62]=43;_ce[63]=47} +function FXb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n;if(a.dc()){return new d7c}j=0;l=0;for(e=a.Kc();e.Ob();){d=BD(e.Pb(),37);f=d.f;j=$wnd.Math.max(j,f.a);l+=f.a*f.b}j=$wnd.Math.max(j,$wnd.Math.sqrt(l)*Edb(ED(vNb(BD(a.Kc().Pb(),37),(Nyc(),owc)))));m=0;n=0;i=0;c=b;for(h=a.Kc();h.Ob();){g=BD(h.Pb(),37);k=g.f;if(m+k.a>j){m=0;n+=i+b;i=0}uXb(g,m,n);c=$wnd.Math.max(c,m+k.a);i=$wnd.Math.max(i,k.b);m+=k.a+b}return new f7c(c+b,n+i+b)} +function mQc(a,b,c,d,e){var f,g,h,i,j,k,l;for(g=new olb(b);g.af){return Ucd(),zcd}break;case 4:case 3:if(i<0){return Ucd(),Acd}else if(i+a.f>e){return Ucd(),Rcd}}g=(h+a.g/2)/f;c=(i+a.f/2)/e;return g+c<=1&&g-c<=0?(Ucd(),Tcd):g+c>=1&&g-c>=0?(Ucd(),zcd):c<0.5?(Ucd(),Acd):(Ucd(),Rcd)} +function vhb(a,b,c,d,e){var f,g;f=wbb(xbb(b[0],Yje),xbb(d[0],Yje));a[0]=Tbb(f);f=Obb(f,32);if(c>=e){for(g=1;g0){e.b[g++]=0;e.b[g++]=f.b[0]-1}for(b=1;b0){pOc(i,i.d-e.d);e.c==(HOc(),FOc)&&nOc(i,i.a-e.d);i.d<=0&&i.i>0&&(Gsb(b,i,b.c.b,b.c),true)}}}for(f=new olb(a.f);f.a0){qOc(h,h.i-e.d);e.c==(HOc(),FOc)&&oOc(h,h.b-e.d);h.i<=0&&h.d>0&&(Gsb(c,h,c.c.b,c.c),true)}}}} +function gSc(a,b,c){var d,e,f,g,h,i,j,k;Odd(c,'Processor compute fanout',1);Uhb(a.b);Uhb(a.a);h=null;f=Jsb(b.b,0);while(!h&&f.b!=f.d.c){j=BD(Xsb(f),86);Ccb(DD(vNb(j,(mTc(),jTc))))&&(h=j)}i=new Psb;Gsb(i,h,i.c.b,i.c);fSc(a,i);for(k=Jsb(b.b,0);k.b!=k.d.c;){j=BD(Xsb(k),86);g=GD(vNb(j,(mTc(),$Sc)));e=Phb(a.b,g)!=null?BD(Phb(a.b,g),19).a:0;yNb(j,ZSc,meb(e));d=1+(Phb(a.a,g)!=null?BD(Phb(a.a,g),19).a:0);yNb(j,XSc,meb(d))}Qdd(c)} +function WPc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o;m=VPc(a,c);for(i=0;i0);d.a.Xb(d.c=--d.b);l>m+i&&uib(d)}for(g=new olb(n);g.a0);d.a.Xb(d.c=--d.b)}}}} +function Jfe(){wfe();var a,b,c,d,e,f;if(gfe)return gfe;a=(++vfe,new $fe(4));Xfe(a,Kfe(vxe,true));Zfe(a,Kfe('M',true));Zfe(a,Kfe('C',true));f=(++vfe,new $fe(4));for(d=0;d<11;d++){Ufe(f,d,d)}b=(++vfe,new $fe(4));Xfe(b,Kfe('M',true));Ufe(b,4448,4607);Ufe(b,65438,65439);e=(++vfe,new Lge(2));Kge(e,a);Kge(e,ffe);c=(++vfe,new Lge(2));c.$l(Bfe(f,Kfe('L',true)));c.$l(b);c=(++vfe,new lge(3,c));c=(++vfe,new rge(e,c));gfe=c;return gfe} +function S3c(a){var b,c;b=GD(hkd(a,(Y9c(),o8c)));if(T3c(b,a)){return}if(!ikd(a,F9c)&&((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i!=0||Ccb(DD(hkd(a,M8c))))){if(b==null||ufb(b).length==0){if(!T3c(sne,a)){c=Qfb(Qfb(new Wfb('Unable to load default layout algorithm '),sne),' for unconfigured node ');yfd(a,c);throw vbb(new y2c(c.a))}}else{c=Qfb(Qfb(new Wfb("Layout algorithm '"),b),"' not found for ");yfd(a,c);throw vbb(new y2c(c.a))}}} +function hIb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;c=a.i;b=a.n;if(a.b==0){n=c.c+b.b;m=c.b-b.b-b.c;for(g=a.a,i=0,k=g.length;i0){l-=d[0]+a.c;d[0]+=a.c}d[2]>0&&(l-=d[2]+a.c);d[1]=$wnd.Math.max(d[1],l);mHb(a.a[1],c.c+b.b+d[0]-(d[1]-l)/2,d[1])}for(f=a.a,h=0,j=f.length;h0?(a.n.c.length-1)*a.i:0;for(d=new olb(a.n);d.a1){for(d=Jsb(e,0);d.b!=d.d.c;){c=BD(Xsb(d),231);f=0;for(i=new olb(c.e);i.a0){b[0]+=a.c;l-=b[0]}b[2]>0&&(l-=b[2]+a.c);b[1]=$wnd.Math.max(b[1],l);nHb(a.a[1],d.d+c.d+b[0]-(b[1]-l)/2,b[1])}else{o=d.d+c.d;n=d.a-c.d-c.a;for(g=a.a,i=0,k=g.length;i=0&&f!=c){throw vbb(new Wdb(kue))}}e=0;for(i=0;i0||Jy(e.b.d,a.b.d+a.b.a)==0&&d.b<0||Jy(e.b.d+e.b.a,a.b.d)==0&&d.b>0){h=0;break}}else{h=$wnd.Math.min(h,YNb(a,e,d))}h=$wnd.Math.min(h,ONb(a,f,h,d))}return h} +function ifd(a,b){var c,d,e,f,g,h,i;if(a.b<2){throw vbb(new Wdb('The vector chain must contain at least a source and a target point.'))}e=(sCb(a.b!=0),BD(a.a.a.c,8));nmd(b,e.a,e.b);i=new Oyd((!b.a&&(b.a=new xMd(y2,b,5)),b.a));g=Jsb(a,1);while(g.aEdb(REc(g.g,g.d[0]).a)){sCb(i.b>0);i.a.Xb(i.c=--i.b);Aib(i,g);e=true}else if(!!h.e&&h.e.gc()>0){f=(!h.e&&(h.e=new Rkb),h.e).Mc(b);j=(!h.e&&(h.e=new Rkb),h.e).Mc(c);if(f||j){(!h.e&&(h.e=new Rkb),h.e).Fc(g);++g.c}}}e||(d.c[d.c.length]=g,true)} +function odc(a){var b,c,d;if(fcd(BD(vNb(a,(Nyc(),Vxc)),98))){for(c=new olb(a.j);c.a>>0,'0'+b.toString(16));d='\\x'+qfb(c,c.length-2,c.length)}else if(a>=Tje){c=(b=a>>>0,'0'+b.toString(16));d='\\v'+qfb(c,c.length-6,c.length)}else d=''+String.fromCharCode(a&aje);}return d} +function yhb(a,b){var c,d,e,f,g,h,i,j,k,l;g=a.e;i=b.e;if(i==0){return a}if(g==0){return b.e==0?b:new Vgb(-b.e,b.d,b.a)}f=a.d;h=b.d;if(f+h==2){c=xbb(a.a[0],Yje);d=xbb(b.a[0],Yje);g<0&&(c=Jbb(c));i<0&&(d=Jbb(d));return ghb(Qbb(c,d))}e=f!=h?f>h?1:-1:whb(a.a,b.a,f);if(e==-1){l=-i;k=g==i?zhb(b.a,h,a.a,f):uhb(b.a,h,a.a,f)}else{l=g;if(g==i){if(e==0){return Hgb(),Ggb}k=zhb(a.a,f,b.a,h)}else{k=uhb(a.a,f,b.a,h)}}j=new Vgb(l,k.length,k);Jgb(j);return j} +function YPc(a){var b,c,d,e,f,g;this.e=new Rkb;this.a=new Rkb;for(c=a.b-1;c<3;c++){St(a,0,BD(Ut(a,0),8))}if(a.b<4){throw vbb(new Wdb('At (least dimension + 1) control points are necessary!'))}else{this.b=3;this.d=true;this.c=false;TPc(this,a.b+this.b-1);g=new Rkb;f=new olb(this.e);for(b=0;b=b.o&&c.f<=b.f||b.a*0.5<=c.f&&b.a*1.5>=c.f){g=BD(Ikb(b.n,b.n.c.length-1),211);if(g.e+g.d+c.g+e<=d&&(f=BD(Ikb(b.n,b.n.c.length-1),211),f.f-a.f+c.f<=a.b||a.a.c.length==1)){EZc(b,c);return true}else if(b.s+c.g<=d&&(b.t+b.d+c.f+e<=a.b||a.a.c.length==1)){Ekb(b.b,c);h=BD(Ikb(b.n,b.n.c.length-1),211);Ekb(b.n,new VZc(b.s,h.f+h.a+b.i,b.i));QZc(BD(Ikb(b.n,b.n.c.length-1),211),c);GZc(b,c);return true}}return false} +function Zxd(a,b,c){var d,e,f,g;if(a.ej()){e=null;f=a.fj();d=a.Zi(1,g=uud(a,b,c),c,b,f);if(a.bj()&&!(a.ni()&&g!=null?pb(g,c):PD(g)===PD(c))){g!=null&&(e=a.dj(g,e));e=a.cj(c,e);a.ij()&&(e=a.lj(g,c,e));if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}else{a.ij()&&(e=a.lj(g,c,e));if(!e){a.$i(d)}else{e.Ei(d);e.Fi()}}return g}else{g=uud(a,b,c);if(a.bj()&&!(a.ni()&&g!=null?pb(g,c):PD(g)===PD(c))){e=null;g!=null&&(e=a.dj(g,null));e=a.cj(c,e);!!e&&e.Fi()}return g}} +function YA(a,b){var c,d,e,f,g,h,i,j;b%=24;if(a.q.getHours()!=b){d=new $wnd.Date(a.q.getTime());d.setDate(d.getDate()+1);h=a.q.getTimezoneOffset()-d.getTimezoneOffset();if(h>0){i=h/60|0;j=h%60;e=a.q.getDate();c=a.q.getHours();c+i>=24&&++e;f=new $wnd.Date(a.q.getFullYear(),a.q.getMonth(),e,b+i,a.q.getMinutes()+j,a.q.getSeconds(),a.q.getMilliseconds());a.q.setTime(f.getTime())}}g=a.q.getTime();a.q.setTime(g+3600000);a.q.getHours()!=b&&a.q.setTime(g)} +function opc(a,b){var c,d,e,f,g;Odd(b,'Path-Like Graph Wrapping',1);if(a.b.c.length==0){Qdd(b);return}e=new Xoc(a);g=(e.i==null&&(e.i=Soc(e,new Zoc)),Edb(e.i)*e.f);c=g/(e.i==null&&(e.i=Soc(e,new Zoc)),Edb(e.i));if(e.b>c){Qdd(b);return}switch(BD(vNb(a,(Nyc(),Gyc)),337).g){case 2:f=new hpc;break;case 0:f=new Ync;break;default:f=new kpc;}d=f.Vf(a,e);if(!f.Wf()){switch(BD(vNb(a,Myc),338).g){case 2:d=tpc(e,d);break;case 1:d=rpc(e,d);}}npc(a,e,d);Qdd(b)} +function MFc(a,b){var c,d,e,f;Fub(a.d,a.e);a.c.a.$b();if(Edb(ED(vNb(b.j,(Nyc(),uwc))))!=0||Edb(ED(vNb(b.j,uwc)))!=0){c=dme;PD(vNb(b.j,ywc))!==PD((tAc(),rAc))&&yNb(b.j,(wtc(),Jsc),(Bcb(),true));f=BD(vNb(b.j,Ayc),19).a;for(e=0;ee&&++j;Ekb(g,(tCb(h+j,b.c.length),BD(b.c[h+j],19)));i+=(tCb(h+j,b.c.length),BD(b.c[h+j],19)).a-d;++c;while(c1&&(i>red(h)*qed(h)/2||g.b==0)){l=new wed(m);k=red(h)/qed(h);j=fed(l,b,new p0b,c,d,e,k);P6c(X6c(l.e),j);h=l;n.c[n.c.length]=l;i=0;m.c=KC(SI,Uhe,1,0,5,1)}}}Gkb(n,m);return n} +function y6d(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p;if(c.mh(b)){k=(n=b,!n?null:BD(d,49).xh(n));if(k){p=c.bh(b,a.a);o=b.t;if(o>1||o==-1){l=BD(p,69);m=BD(k,69);if(l.dc()){m.$b()}else{g=!!zUd(b);f=0;for(h=a.a?l.Kc():l.Zh();h.Ob();){j=BD(h.Pb(),56);e=BD(Wrb(a,j),56);if(!e){if(a.b&&!g){m.Xh(f,j);++f}}else{if(g){i=m.Xc(e);i==-1?m.Xh(f,e):f!=i&&m.ji(f,e)}else{m.Xh(f,e)}++f}}}}else{if(p==null){k.Wb(null)}else{e=Wrb(a,p);e==null?a.b&&!zUd(b)&&k.Wb(p):k.Wb(e)}}}}} +function E6b(a,b){var c,d,e,f,g,h,i,j;c=new L6b;for(e=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(e);){d=BD(Rr(e),17);if(OZb(d)){continue}h=d.c.i;if(F6b(h,C6b)){j=G6b(a,h,C6b,B6b);if(j==-1){continue}c.b=$wnd.Math.max(c.b,j);!c.a&&(c.a=new Rkb);Ekb(c.a,h)}}for(g=new Sr(ur(U_b(b).a.Kc(),new Sq));Qr(g);){f=BD(Rr(g),17);if(OZb(f)){continue}i=f.d.i;if(F6b(i,B6b)){j=G6b(a,i,B6b,C6b);if(j==-1){continue}c.d=$wnd.Math.max(c.d,j);!c.c&&(c.c=new Rkb);Ekb(c.c,i)}}return c} +function Khb(a){Dhb();var b,c,d,e;b=QD(a);if(a1000000){throw vbb(new ocb('power of ten too big'))}if(a<=Ohe){return Qgb(Pgb(Bhb[1],b),b)}d=Pgb(Bhb[1],Ohe);e=d;c=Cbb(a-Ohe);b=QD(a%Ohe);while(ybb(c,Ohe)>0){e=Ogb(e,d);c=Qbb(c,Ohe)}e=Ogb(e,Pgb(Bhb[1],b));e=Qgb(e,Ohe);c=Cbb(a-Ohe);while(ybb(c,Ohe)>0){e=Qgb(e,Ohe);c=Qbb(c,Ohe)}e=Qgb(e,b);return e} +function X5b(a,b){var c,d,e,f,g,h,i,j,k;Odd(b,'Hierarchical port dummy size processing',1);i=new Rkb;k=new Rkb;d=Edb(ED(vNb(a,(Nyc(),myc))));c=d*2;for(f=new olb(a.b);f.aj&&d>j){k=h;j=Edb(b.p[h.p])+Edb(b.d[h.p])+h.o.b+h.d.a}else{e=false;c.n&&Sdd(c,'bk node placement breaks on '+h+' which should have been after '+k);break}}if(!e){break}}c.n&&Sdd(c,b+' is feasible: '+e);return e} +function XNc(a,b,c,d){var e,f,g,h,i,j,k;h=-1;for(k=new olb(a);k.a=q&&a.e[i.p]>o*a.b||t>=c*q){m.c[m.c.length]=h;h=new Rkb;ye(g,f);f.a.$b();j-=k;n=$wnd.Math.max(n,j*a.b+p);j+=t;s=t;t=0;k=0;p=0}}return new vgd(n,m)} +function q4c(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;for(c=(j=(new $ib(a.c.b)).a.vc().Kc(),new djb(j));c.a.Ob();){b=(h=BD(c.a.Pb(),42),BD(h.dd(),149));e=b.a;e==null&&(e='');d=i4c(a.c,e);!d&&e.length==0&&(d=u4c(a));!!d&&!ze(d.c,b,false)&&Dsb(d.c,b)}for(g=Jsb(a.a,0);g.b!=g.d.c;){f=BD(Xsb(g),478);k=j4c(a.c,f.a);n=j4c(a.c,f.b);!!k&&!!n&&Dsb(k.c,new vgd(n,f.c))}Osb(a.a);for(m=Jsb(a.b,0);m.b!=m.d.c;){l=BD(Xsb(m),478);b=g4c(a.c,l.a);i=j4c(a.c,l.b);!!b&&!!i&&B3c(b,i,l.c)}Osb(a.b)} +function qvd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;f=new fC(a);g=new ird;e=(ko(g.g),ko(g.j),Uhb(g.b),ko(g.d),ko(g.i),Uhb(g.k),Uhb(g.c),Uhb(g.e),n=drd(g,f,null),ard(g,f),n);if(b){j=new fC(b);h=rvd(j);jfd(e,OC(GC(g2,1),Uhe,527,0,[h]))}m=false;l=false;if(c){j=new fC(c);que in j.a&&(m=aC(j,que).ge().a);rue in j.a&&(l=aC(j,rue).ge().a)}k=Vdd(Xdd(new Zdd,m),l);t2c(new w2c,e,k);que in f.a&&cC(f,que,null);if(m||l){i=new eC;nvd(k,i,m,l);cC(f,que,i)}d=new Prd(g);Ghe(new _ud(e),d)} +function pA(a,b,c){var d,e,f,g,h,i,j,k,l;g=new nB;j=OC(GC(WD,1),oje,25,15,[0]);e=-1;f=0;d=0;for(i=0;i0){if(e<0&&k.a){e=i;f=j[0];d=0}if(e>=0){h=k.b;if(i==e){h-=d++;if(h==0){return 0}}if(!wA(b,j,k,h,g)){i=e-1;j[0]=f;continue}}else{e=-1;if(!wA(b,j,k,0,g)){return 0}}}else{e=-1;if(bfb(k.c,0)==32){l=j[0];uA(b,j);if(j[0]>l){continue}}else if(ofb(b,k.c,j[0])){j[0]+=k.c.length;continue}return 0}}if(!mB(g,c)){return 0}return j[0]} +function SKd(a){var b,c,d,e,f,g,h,i;if(!a.f){i=new CNd;h=new CNd;b=KKd;g=b.a.zc(a,b);if(g==null){for(f=new Fyd(_Kd(a));f.e!=f.i.gc();){e=BD(Dyd(f),26);ytd(i,SKd(e))}b.a.Bc(a)!=null;b.a.gc()==0&&undefined}for(d=(!a.s&&(a.s=new cUd(t5,a,21,17)),new Fyd(a.s));d.e!=d.i.gc();){c=BD(Dyd(d),170);JD(c,99)&&wtd(h,BD(c,18))}vud(h);a.r=new UNd(a,(BD(qud(ZKd((NFd(),MFd).o),6),18),h.i),h.g);ytd(i,a.r);vud(i);a.f=new nNd((BD(qud(ZKd(MFd.o),5),18),i.i),i.g);$Kd(a).b&=-3}return a.f} +function rMb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;g=a.o;d=KC(WD,oje,25,g,15,1);e=KC(WD,oje,25,g,15,1);c=a.p;b=KC(WD,oje,25,c,15,1);f=KC(WD,oje,25,c,15,1);for(j=0;j=0&&!YMb(a,k,l)){--l}e[k]=l}for(n=0;n=0&&!YMb(a,h,o)){--h}f[o]=h}for(i=0;ib[m]&&md[i]&&aNb(a,i,m,false,true)}}} +function lRb(a){var b,c,d,e,f,g,h,i;c=Ccb(DD(vNb(a,(wSb(),cSb))));f=a.a.c.d;h=a.a.d.d;if(c){g=Y6c(c7c(new f7c(h.a,h.b),f),0.5);i=Y6c(R6c(a.e),0.5);b=c7c(P6c(new f7c(f.a,f.b),g),i);a7c(a.d,b)}else{e=Edb(ED(vNb(a.a,tSb)));d=a.d;if(f.a>=h.a){if(f.b>=h.b){d.a=h.a+(f.a-h.a)/2+e;d.b=h.b+(f.b-h.b)/2-e-a.e.b}else{d.a=h.a+(f.a-h.a)/2+e;d.b=f.b+(h.b-f.b)/2+e}}else{if(f.b>=h.b){d.a=f.a+(h.a-f.a)/2+e;d.b=h.b+(f.b-h.b)/2+e}else{d.a=f.a+(h.a-f.a)/2+e;d.b=f.b+(h.b-f.b)/2-e-a.e.b}}}} +function Qge(a,b){var c,d,e,f,g,h,i;if(a==null){return null}f=a.length;if(f==0){return ''}i=KC(TD,$ie,25,f,15,1);ACb(0,f,a.length);ACb(0,f,i.length);ffb(a,0,f,i,0);c=null;h=b;for(e=0,g=0;e0?qfb(c.a,0,f-1):''}}else{return !c?a:c.a}} +function DPb(a){r4c(a,new E3c(P3c(M3c(O3c(N3c(new R3c,Yle),'ELK DisCo'),'Layouter for arranging unconnected subgraphs. The subgraphs themselves are, by default, not laid out.'),new GPb)));p4c(a,Yle,Zle,Ksd(BPb));p4c(a,Yle,$le,Ksd(vPb));p4c(a,Yle,_le,Ksd(qPb));p4c(a,Yle,ame,Ksd(wPb));p4c(a,Yle,Zke,Ksd(zPb));p4c(a,Yle,$ke,Ksd(yPb));p4c(a,Yle,Yke,Ksd(APb));p4c(a,Yle,_ke,Ksd(xPb));p4c(a,Yle,Tle,Ksd(sPb));p4c(a,Yle,Ule,Ksd(rPb));p4c(a,Yle,Vle,Ksd(tPb));p4c(a,Yle,Wle,Ksd(uPb))} +function Zbc(a,b,c,d){var e,f,g,h,i,j,k,l,m;f=new b0b(a);__b(f,(j0b(),i0b));yNb(f,(Nyc(),Vxc),(dcd(),$bd));e=0;if(b){g=new H0b;yNb(g,(wtc(),$sc),b);yNb(f,$sc,b.i);G0b(g,(Ucd(),Tcd));F0b(g,f);m=k_b(b.e);for(j=m,k=0,l=j.length;k0){c-=d.length-b;if(c>=0){e.a+='0.';for(;c>egb.length;c-=egb.length){Rfb(e,egb)}Sfb(e,egb,QD(c));Qfb(e,d.substr(b))}else{c=b-c;Qfb(e,qfb(d,b,QD(c)));e.a+='.';Qfb(e,pfb(d,QD(c)))}}else{Qfb(e,d.substr(b));for(;c<-egb.length;c+=egb.length){Rfb(e,egb)}Sfb(e,egb,QD(-c))}return e.a} +function v6c(a,b,c,d){var e,f,g,h,i,j,k,l,m;i=c7c(new f7c(c.a,c.b),a);j=i.a*b.b-i.b*b.a;k=b.a*d.b-b.b*d.a;l=(i.a*d.b-i.b*d.a)/k;m=j/k;if(k==0){if(j==0){e=P6c(new f7c(c.a,c.b),Y6c(new f7c(d.a,d.b),0.5));f=S6c(a,e);g=S6c(P6c(new f7c(a.a,a.b),b),e);h=$wnd.Math.sqrt(d.a*d.a+d.b*d.b)*0.5;if(f=0&&l<=1&&m>=0&&m<=1?P6c(new f7c(a.a,a.b),Y6c(new f7c(b.a,b.b),l)):null}} +function OTb(a,b,c){var d,e,f,g,h;d=BD(vNb(a,(Nyc(),zwc)),21);c.a>b.a&&(d.Hc((i8c(),c8c))?(a.c.a+=(c.a-b.a)/2):d.Hc(e8c)&&(a.c.a+=c.a-b.a));c.b>b.b&&(d.Hc((i8c(),g8c))?(a.c.b+=(c.b-b.b)/2):d.Hc(f8c)&&(a.c.b+=c.b-b.b));if(BD(vNb(a,(wtc(),Ksc)),21).Hc((Orc(),Hrc))&&(c.a>b.a||c.b>b.b)){for(h=new olb(a.a);h.ab.a&&(d.Hc((i8c(),c8c))?(a.c.a+=(c.a-b.a)/2):d.Hc(e8c)&&(a.c.a+=c.a-b.a));c.b>b.b&&(d.Hc((i8c(),g8c))?(a.c.b+=(c.b-b.b)/2):d.Hc(f8c)&&(a.c.b+=c.b-b.b));if(BD(vNb(a,(wtc(),Ksc)),21).Hc((Orc(),Hrc))&&(c.a>b.a||c.b>b.b)){for(g=new olb(a.a);g.ab){e=0;f+=k.b+c;l.c[l.c.length]=k;k=new x$c(f,c);d=new PZc(0,k.f,k,c);s$c(k,d);e=0}if(d.b.c.length==0||i.f>=d.o&&i.f<=d.f||d.a*0.5<=i.f&&d.a*1.5>=i.f){EZc(d,i)}else{g=new PZc(d.s+d.r+c,k.f,k,c);s$c(k,g);EZc(g,i)}e=i.i+i.g}l.c[l.c.length]=k;return l} +function OKd(a){var b,c,d,e,f,g,h,i;if(!a.a){a.o=null;i=new GNd(a);b=new KNd;c=KKd;h=c.a.zc(a,c);if(h==null){for(g=new Fyd(_Kd(a));g.e!=g.i.gc();){f=BD(Dyd(g),26);ytd(i,OKd(f))}c.a.Bc(a)!=null;c.a.gc()==0&&undefined}for(e=(!a.s&&(a.s=new cUd(t5,a,21,17)),new Fyd(a.s));e.e!=e.i.gc();){d=BD(Dyd(e),170);JD(d,322)&&wtd(b,BD(d,34))}vud(b);a.k=new PNd(a,(BD(qud(ZKd((NFd(),MFd).o),7),18),b.i),b.g);ytd(i,a.k);vud(i);a.a=new nNd((BD(qud(ZKd(MFd.o),4),18),i.i),i.g);$Kd(a).b&=-2}return a.a} +function vZc(a,b,c,d,e,f,g){var h,i,j,k,l,m;l=false;i=ZZc(c.q,b.f+b.b-c.q.f);m=e-(c.q.e+i-g);if(m=(tCb(f,a.c.length),BD(a.c[f],200)).e;k=(h=MZc(d,m,false),h.a);if(k>b.b&&!j){return false}if(j||k<=b.b){if(j&&k>b.b){c.d=k;KZc(c,JZc(c,k))}else{$Zc(c.q,i);c.c=true}KZc(d,e-(c.s+c.r));OZc(d,c.q.e+c.q.d,b.f);s$c(b,d);if(a.c.length>f){v$c((tCb(f,a.c.length),BD(a.c[f],200)),d);(tCb(f,a.c.length),BD(a.c[f],200)).a.c.length==0&&Kkb(a,f)}l=true}return l} +function C2d(a,b,c,d){var e,f,g,h,i,j,k;k=S6d(a.e.Tg(),b);e=0;f=BD(a.g,119);i=null;Q6d();if(BD(b,66).Oj()){for(h=0;ha.o.a){k=(i-a.o.a)/2;h.b=$wnd.Math.max(h.b,k);h.c=$wnd.Math.max(h.c,k)}} +function rvd(a){var b,c,d,e,f,g,h,i;f=new b2c;Z1c(f,(Y1c(),V1c));for(d=(e=$B(a,KC(ZI,nie,2,0,6,1)),new vib(new amb((new mC(a,e)).b)));d.b0?a.i:0)>b&&i>0){f=0;g+=i+a.i;e=$wnd.Math.max(e,m);d+=i+a.i;i=0;m=0;if(c){++l;Ekb(a.n,new VZc(a.s,g,a.i))}h=0}m+=j.g+(h>0?a.i:0);i=$wnd.Math.max(i,j.f);c&&QZc(BD(Ikb(a.n,l),211),j);f+=j.g+(h>0?a.i:0);++h}e=$wnd.Math.max(e,m);d+=i;if(c){a.r=e;a.d=d;u$c(a.j)}return new J6c(a.s,a.t,e,d)} +function $fb(a,b,c,d,e){Zfb();var f,g,h,i,j,k,l,m,n;vCb(a,'src');vCb(c,'dest');m=rb(a);i=rb(c);rCb((m.i&4)!=0,'srcType is not an array');rCb((i.i&4)!=0,'destType is not an array');l=m.c;g=i.c;rCb((l.i&1)!=0?l==g:(g.i&1)==0,"Array types don't match");n=a.length;j=c.length;if(b<0||d<0||e<0||b+e>n||d+e>j){throw vbb(new pcb)}if((l.i&1)==0&&m!=i){k=CD(a);f=CD(c);if(PD(a)===PD(c)&&bd;){NC(f,h,k[--b])}}else{for(h=d+e;d0&&$Bb(a,b,c,d,e,true)} +function phb(){phb=ccb;nhb=OC(GC(WD,1),oje,25,15,[Rie,1162261467,Iie,1220703125,362797056,1977326743,Iie,387420489,Jje,214358881,429981696,815730721,1475789056,170859375,268435456,410338673,612220032,893871739,1280000000,1801088541,113379904,148035889,191102976,244140625,308915776,387420489,481890304,594823321,729000000,887503681,Iie,1291467969,1544804416,1838265625,60466176]);ohb=OC(GC(WD,1),oje,25,15,[-1,-1,31,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5])} +function soc(a){var b,c,d,e,f,g,h,i;for(e=new olb(a.b);e.a=a.b.length){f[e++]=g.b[d++];f[e++]=g.b[d++]}else if(d>=g.b.length){f[e++]=a.b[c++];f[e++]=a.b[c++]}else if(g.b[d]0?a.i:0)}++b}Ce(a.n,i);a.d=c;a.r=d;a.g=0;a.f=0;a.e=0;a.o=Pje;a.p=Pje;for(f=new olb(a.b);f.a0){e=(!a.n&&(a.n=new cUd(D2,a,1,7)),BD(qud(a.n,0),137)).a;!e||Qfb(Qfb((b.a+=' "',b),e),'"')}}else{Qfb(Qfb((b.a+=' "',b),d),'"')}c=(!a.b&&(a.b=new y5d(z2,a,4,7)),!(a.b.i<=1&&(!a.c&&(a.c=new y5d(z2,a,5,8)),a.c.i<=1)));c?(b.a+=' [',b):(b.a+=' ',b);Qfb(b,Eb(new Gb,new Fyd(a.b)));c&&(b.a+=']',b);b.a+=gne;c&&(b.a+='[',b);Qfb(b,Eb(new Gb,new Fyd(a.c)));c&&(b.a+=']',b);return b.a} +function TQd(a,b){var c,d,e,f,g,h,i;if(a.a){h=a.a.ne();i=null;if(h!=null){b.a+=''+h}else{g=a.a.Dj();if(g!=null){f=hfb(g,wfb(91));if(f!=-1){i=g.substr(f);b.a+=''+qfb(g==null?Xhe:(uCb(g),g),0,f)}else{b.a+=''+g}}}if(!!a.d&&a.d.i!=0){e=true;b.a+='<';for(d=new Fyd(a.d);d.e!=d.i.gc();){c=BD(Dyd(d),87);e?(e=false):(b.a+=She,b);TQd(c,b)}b.a+='>'}i!=null&&(b.a+=''+i,b)}else if(a.e){h=a.e.zb;h!=null&&(b.a+=''+h,b)}else{b.a+='?';if(a.b){b.a+=' super ';TQd(a.b,b)}else{if(a.f){b.a+=' extends ';TQd(a.f,b)}}}} +function Z9b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;v=a.c;w=b.c;c=Jkb(v.a,a,0);d=Jkb(w.a,b,0);t=BD(W_b(a,(KAc(),HAc)).Kc().Pb(),11);C=BD(W_b(a,IAc).Kc().Pb(),11);u=BD(W_b(b,HAc).Kc().Pb(),11);D=BD(W_b(b,IAc).Kc().Pb(),11);r=k_b(t.e);A=k_b(C.g);s=k_b(u.e);B=k_b(D.g);Z_b(a,d,w);for(g=s,k=0,o=g.length;kk){new DOc((HOc(),GOc),c,b,j-k)}else if(j>0&&k>0){new DOc((HOc(),GOc),b,c,0);new DOc(GOc,c,b,0)}}return g} +function TUb(a,b){var c,d,e,f,g,h;for(g=new nib((new eib(a.f.b)).a);g.b;){f=lib(g);e=BD(f.cd(),594);if(b==1){if(e.gf()!=(ead(),dad)&&e.gf()!=_9c){continue}}else{if(e.gf()!=(ead(),aad)&&e.gf()!=bad){continue}}d=BD(BD(f.dd(),46).b,81);h=BD(BD(f.dd(),46).a,189);c=h.c;switch(e.gf().g){case 2:d.g.c=a.e.a;d.g.b=$wnd.Math.max(1,d.g.b+c);break;case 1:d.g.c=d.g.c+c;d.g.b=$wnd.Math.max(1,d.g.b-c);break;case 4:d.g.d=a.e.b;d.g.a=$wnd.Math.max(1,d.g.a+c);break;case 3:d.g.d=d.g.d+c;d.g.a=$wnd.Math.max(1,d.g.a-c);}}} +function nJc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;h=KC(WD,oje,25,b.b.c.length,15,1);j=KC(NQ,Kie,267,b.b.c.length,0,1);i=KC(OQ,kne,10,b.b.c.length,0,1);for(l=a.a,m=0,n=l.length;m0&&!!i[d]&&(o=jBc(a.b,i[d],e));p=$wnd.Math.max(p,e.c.c.b+o)}for(f=new olb(k.e);f.a1){throw vbb(new Wdb(Hwe))}if(!i){f=R6d(b,d.Kc().Pb());g.Fc(f)}}return xtd(a,I2d(a,b,c),g)} +function Pmc(a,b){var c,d,e,f;Jmc(b.b.j);MAb(NAb(new YAb(null,new Kub(b.d,16)),new $mc),new anc);for(f=new olb(b.d);f.aa.o.b){return false}c=V_b(a,zcd);h=b.d+b.a+(c.gc()-1)*g;if(h>a.o.b){return false}}return true} +function thb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;g=a.e;i=b.e;if(g==0){return b}if(i==0){return a}f=a.d;h=b.d;if(f+h==2){c=xbb(a.a[0],Yje);d=xbb(b.a[0],Yje);if(g==i){k=wbb(c,d);o=Tbb(k);n=Tbb(Pbb(k,32));return n==0?new Ugb(g,o):new Vgb(g,2,OC(GC(WD,1),oje,25,15,[o,n]))}return ghb(g<0?Qbb(d,c):Qbb(c,d))}else if(g==i){m=g;l=f>=h?uhb(a.a,f,b.a,h):uhb(b.a,h,a.a,f)}else{e=f!=h?f>h?1:-1:whb(a.a,b.a,f);if(e==0){return Hgb(),Ggb}if(e==1){m=g;l=zhb(a.a,f,b.a,h)}else{m=i;l=zhb(b.a,h,a.a,f)}}j=new Vgb(m,l.length,l);Jgb(j);return j} +function oZb(a,b,c,d,e,f,g){var h,i,j,k,l,m,n;l=Ccb(DD(vNb(b,(Nyc(),vxc))));m=null;f==(KAc(),HAc)&&d.c.i==c?(m=d.c):f==IAc&&d.d.i==c&&(m=d.d);j=g;if(!j||!l||!!m){k=(Ucd(),Scd);m?(k=m.j):fcd(BD(vNb(c,Vxc),98))&&(k=f==HAc?Tcd:zcd);i=lZb(a,b,c,f,k,d);h=kZb((Q_b(c),d));if(f==HAc){QZb(h,BD(Ikb(i.j,0),11));RZb(h,e)}else{QZb(h,e);RZb(h,BD(Ikb(i.j,0),11))}j=new yZb(d,h,i,BD(vNb(i,(wtc(),$sc)),11),f,!m)}else{Ekb(j.e,d);n=$wnd.Math.max(Edb(ED(vNb(j.d,Zwc))),Edb(ED(vNb(d,Zwc))));yNb(j.d,Zwc,n)}Rc(a.a,d,new BZb(j.d,b,f));return j} +function V1d(a,b){var c,d,e,f,g,h,i,j,k,l;k=null;!!a.d&&(k=BD(Phb(a.d,b),138));if(!k){f=a.a.Mh();l=f.i;if(!a.d||Vhb(a.d)!=l){i=new Lqb;!!a.d&&Ld(i,a.d);j=i.f.c+i.g.c;for(h=j;h0){n=(o-1)*c;!!h&&(n+=d);!!k&&(n+=d);n=a.b[e+1]){e+=2}else if(c0){d=new Tkb(BD(Qc(a.a,f),21));mmb();Okb(d,new EZb(b));e=new Bib(f.b,0);while(e.bv)){i=2;g=Ohe}else if(i==0){i=1;g=A}else{i=0;g=A}}else{n=A>=g||g-A0?1:Ny(isNaN(d),isNaN(0)))>=0^(null,My(Jqe),($wnd.Math.abs(h)<=Jqe||h==0||isNaN(h)&&isNaN(0)?0:h<0?-1:h>0?1:Ny(isNaN(h),isNaN(0)))>=0)){return $wnd.Math.max(h,d)}My(Jqe);if(($wnd.Math.abs(d)<=Jqe||d==0||isNaN(d)&&isNaN(0)?0:d<0?-1:d>0?1:Ny(isNaN(d),isNaN(0)))>0){return $wnd.Math.sqrt(h*h+d*d)}return -$wnd.Math.sqrt(h*h+d*d)} +function Kge(a,b){var c,d,e,f,g,h;if(!b)return;!a.a&&(a.a=new Wvb);if(a.e==2){Tvb(a.a,b);return}if(b.e==1){for(e=0;e=Tje?Efb(c,Tee(d)):Afb(c,d&aje);g=(++vfe,new Hge(10,null,0));Vvb(a.a,g,h-1)}else{c=(g.bm().length+f,new Ifb);Efb(c,g.bm())}if(b.e==0){d=b._l();d>=Tje?Efb(c,Tee(d)):Afb(c,d&aje)}else{Efb(c,b.bm())}BD(g,521).b=c.a} +function rgb(a){var b,c,d,e,f;if(a.g!=null){return a.g}if(a.a<32){a.g=rhb(Cbb(a.f),QD(a.e));return a.g}e=shb((!a.c&&(a.c=fhb(a.f)),a.c),0);if(a.e==0){return e}b=(!a.c&&(a.c=fhb(a.f)),a.c).e<0?2:1;c=e.length;d=-a.e+c-b;f=new Ufb;f.a+=''+e;if(a.e>0&&d>=-6){if(d>=0){Tfb(f,c-QD(a.e),String.fromCharCode(46))}else{f.a=qfb(f.a,0,b-1)+'0.'+pfb(f.a,b-1);Tfb(f,b+1,zfb(egb,0,-QD(d)-1))}}else{if(c-b>=1){Tfb(f,b,String.fromCharCode(46));++c}Tfb(f,c,String.fromCharCode(69));d>0&&Tfb(f,++c,String.fromCharCode(43));Tfb(f,++c,''+Ubb(Cbb(d)))}a.g=f.a;return a.g} +function npc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(c.dc()){return}h=0;m=0;d=c.Kc();o=BD(d.Pb(),19).a;while(h1&&(i=j.mg(i,a.a,h))}if(i.c.length==1){return BD(Ikb(i,i.c.length-1),220)}if(i.c.length==2){return lYc((tCb(0,i.c.length),BD(i.c[0],220)),(tCb(1,i.c.length),BD(i.c[1],220)),g,f)}return null} +function JNb(a){var b,c,d,e,f,g;Hkb(a.a,new PNb);for(c=new olb(a.a);c.a=$wnd.Math.abs(d.b)){d.b=0;f.d+f.a>g.d&&f.dg.c&&f.c0){b=new _zd(a.i,a.g);c=a.i;f=c<100?null:new Ixd(c);if(a.ij()){for(d=0;d0){h=a.g;j=a.i;oud(a);f=j<100?null:new Ixd(j);for(d=0;d>13|(a.m&15)<<9;e=a.m>>4&8191;f=a.m>>17|(a.h&255)<<5;g=(a.h&1048320)>>8;h=b.l&8191;i=b.l>>13|(b.m&15)<<9;j=b.m>>4&8191;k=b.m>>17|(b.h&255)<<5;l=(b.h&1048320)>>8;B=c*h;C=d*h;D=e*h;F=f*h;G=g*h;if(i!=0){C+=c*i;D+=d*i;F+=e*i;G+=f*i}if(j!=0){D+=c*j;F+=d*j;G+=e*j}if(k!=0){F+=c*k;G+=d*k}l!=0&&(G+=c*l);n=B&Eje;o=(C&511)<<13;m=n+o;q=B>>22;r=C>>9;s=(D&262143)<<4;t=(F&31)<<17;p=q+r+s+t;v=D>>18;w=F>>5;A=(G&4095)<<8;u=v+w+A;p+=m>>22;m&=Eje;u+=p>>22;p&=Eje;u&=Fje;return TC(m,p,u)} +function o7b(a){var b,c,d,e,f,g,h;h=BD(Ikb(a.j,0),11);if(h.g.c.length!=0&&h.e.c.length!=0){throw vbb(new Zdb('Interactive layout does not support NORTH/SOUTH ports with incoming _and_ outgoing edges.'))}if(h.g.c.length!=0){f=Pje;for(c=new olb(h.g);c.a4){if(a.wj(b)){if(a.rk()){e=BD(b,49);d=e.Ug();i=d==a.e&&(a.Dk()?e.Og(e.Vg(),a.zk())==a.Ak():-1-e.Vg()==a.aj());if(a.Ek()&&!i&&!d&&!!e.Zg()){for(f=0;f0&&(j=a.n.a/f);break;case 2:case 4:e=a.i.o.b;e>0&&(j=a.n.b/e);}yNb(a,(wtc(),htc),j)}i=a.o;g=a.a;if(d){g.a=d.a;g.b=d.b;a.d=true}else if(b!=bcd&&b!=ccd&&h!=Scd){switch(h.g){case 1:g.a=i.a/2;break;case 2:g.a=i.a;g.b=i.b/2;break;case 3:g.a=i.a/2;g.b=i.b;break;case 4:g.b=i.b/2;}}else{g.a=i.a/2;g.b=i.b/2}} +function vwd(a){var b,c,d,e,f,g,h,i,j,k;if(a.ej()){k=a.Vi();i=a.fj();if(k>0){b=new Aud(a.Gi());c=k;f=c<100?null:new Ixd(c);Cvd(a,c,b.g);e=c==1?a.Zi(4,qud(b,0),null,0,i):a.Zi(6,b,null,-1,i);if(a.bj()){for(d=new Fyd(b);d.e!=d.i.gc();){f=a.dj(Dyd(d),f)}if(!f){a.$i(e)}else{f.Ei(e);f.Fi()}}else{if(!f){a.$i(e)}else{f.Ei(e);f.Fi()}}}else{Cvd(a,a.Vi(),a.Wi());a.$i(a.Zi(6,(mmb(),jmb),null,-1,i))}}else if(a.bj()){k=a.Vi();if(k>0){h=a.Wi();j=k;Cvd(a,k,h);f=j<100?null:new Ixd(j);for(d=0;da.d[g.p]){c+=zHc(a.b,f)*BD(i.b,19).a;Wjb(a.a,meb(f))}}while(!akb(a.a)){xHc(a.b,BD(fkb(a.a),19).a)}}return c} +function eed(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q;l=new g7c(BD(hkd(a,(X7c(),R7c)),8));l.a=$wnd.Math.max(l.a-c.b-c.c,0);l.b=$wnd.Math.max(l.b-c.d-c.a,0);e=ED(hkd(a,L7c));(e==null||(uCb(e),e)<=0)&&(e=1.3);h=new Rkb;for(o=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));o.e!=o.i.gc();){n=BD(Dyd(o),33);g=new xed(n);h.c[h.c.length]=g}m=BD(hkd(a,M7c),311);switch(m.g){case 3:q=bed(h,b,l.a,l.b,(j=d,uCb(e),e,j));break;case 1:q=aed(h,b,l.a,l.b,(k=d,uCb(e),e,k));break;default:q=ced(h,b,l.a,l.b,(i=d,uCb(e),e,i));}f=new wed(q);p=fed(f,b,c,l.a,l.b,d,(uCb(e),e));Afd(a,p.a,p.b,false,true)} +function vkc(a,b){var c,d,e,f;c=b.b;f=new Tkb(c.j);e=0;d=c.j;d.c=KC(SI,Uhe,1,0,5,1);hkc(BD(Si(a.b,(Ucd(),Acd),(Fkc(),Ekc)),15),c);e=ikc(f,e,new blc,d);hkc(BD(Si(a.b,Acd,Dkc),15),c);e=ikc(f,e,new dlc,d);hkc(BD(Si(a.b,Acd,Ckc),15),c);hkc(BD(Si(a.b,zcd,Ekc),15),c);hkc(BD(Si(a.b,zcd,Dkc),15),c);e=ikc(f,e,new flc,d);hkc(BD(Si(a.b,zcd,Ckc),15),c);hkc(BD(Si(a.b,Rcd,Ekc),15),c);e=ikc(f,e,new hlc,d);hkc(BD(Si(a.b,Rcd,Dkc),15),c);e=ikc(f,e,new jlc,d);hkc(BD(Si(a.b,Rcd,Ckc),15),c);hkc(BD(Si(a.b,Tcd,Ekc),15),c);e=ikc(f,e,new Pkc,d);hkc(BD(Si(a.b,Tcd,Dkc),15),c);hkc(BD(Si(a.b,Tcd,Ckc),15),c)} +function nbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;Odd(b,'Layer size calculation',1);k=Pje;j=Qje;e=false;for(h=new olb(a.b);h.a0.5?(r-=g*2*(o-0.5)):o<0.5&&(r+=f*2*(0.5-o));e=h.d.b;rq.a-p-k&&(r=q.a-p-k);h.n.a=b+r}} +function ced(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q;h=KC(UD,Vje,25,a.c.length,15,1);m=new gub(new Ned);_tb(m,a);j=0;p=new Rkb;while(m.b.c.length!=0){g=BD(m.b.c.length==0?null:Ikb(m.b,0),157);if(j>1&&red(g)*qed(g)/2>h[0]){f=0;while(fh[f]){++f}o=new Jib(p,0,f+1);l=new wed(o);k=red(g)/qed(g);i=fed(l,b,new p0b,c,d,e,k);P6c(X6c(l.e),i);zCb(cub(m,l));n=new Jib(p,f+1,p.c.length);_tb(m,n);p.c=KC(SI,Uhe,1,0,5,1);j=0;Dlb(h,h.length,0)}else{q=m.b.c.length==0?null:Ikb(m.b,0);q!=null&&fub(m,0);j>0&&(h[j]=h[j-1]);h[j]+=red(g)*qed(g);++j;p.c[p.c.length]=g}}return p} +function Wac(a){var b,c,d,e,f;d=BD(vNb(a,(Nyc(),mxc)),163);if(d==(Ctc(),ytc)){for(c=new Sr(ur(R_b(a).a.Kc(),new Sq));Qr(c);){b=BD(Rr(c),17);if(!Yac(b)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to FIRST_SEPARATE, but has at least one incoming edge. "+'FIRST_SEPARATE nodes must not have incoming edges.'))}}}else if(d==Atc){for(f=new Sr(ur(U_b(a).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(!Yac(e)){throw vbb(new y2c(Fne+P_b(a)+"' has its layer constraint set to LAST_SEPARATE, but has at least one outgoing edge. "+'LAST_SEPARATE nodes must not have outgoing edges.'))}}}} +function C9b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;Odd(b,'Label dummy removal',1);d=Edb(ED(vNb(a,(Nyc(),nyc))));e=Edb(ED(vNb(a,ryc)));j=BD(vNb(a,Lwc),103);for(i=new olb(a.b);i.a0&&iCc(a,h,l)}for(e=new olb(l);e.a>19!=0){b=hD(b);i=!i}g=_C(b);f=false;e=false;d=false;if(a.h==Gje&&a.m==0&&a.l==0){e=true;f=true;if(g==-1){a=SC((wD(),sD));d=true;i=!i}else{h=lD(a,g);i&&ZC(h);c&&(QC=TC(0,0,0));return h}}else if(a.h>>19!=0){f=true;a=hD(a);d=true;i=!i}if(g!=-1){return WC(a,g,i,f,c)}if(eD(a,b)<0){c&&(f?(QC=hD(a)):(QC=TC(a.l,a.m,a.h)));return TC(0,0,0)}return XC(d?a:TC(a.l,a.m,a.h),b,i,f,e,c)} +function F2c(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;if(a.e&&a.c.cb.f||b.g>a.f){return}c=0;d=0;for(g=a.w.a.ec().Kc();g.Ob();){e=BD(g.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,b.g,b.f)&&++c}for(h=a.r.a.ec().Kc();h.Ob();){e=BD(h.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,b.g,b.f)&&--c}for(i=b.w.a.ec().Kc();i.Ob();){e=BD(i.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,a.g,a.f)&&++d}for(f=b.r.a.ec().Kc();f.Ob();){e=BD(f.Pb(),11);aRc(l7c(OC(GC(m1,1),nie,8,0,[e.i.n,e.n,e.a])).b,a.g,a.f)&&--d}if(c=0){f=wid(b,c.substr(1,h-1));l=c.substr(h+1,j-(h+1));return pid(b,l,f)}}else{d=-1;Vcb==null&&(Vcb=new RegExp('\\d'));if(Vcb.test(String.fromCharCode(i))){d=lfb(c,wfb(46),j-1);if(d>=0){e=BD(hid(b,Bid(b,c.substr(1,d-1)),false),58);k=0;try{k=Icb(c.substr(d+1),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){g=a;throw vbb(new rFd(g))}else throw vbb(a)}if(k=0){return c}switch($1d(q1d(a,c))){case 2:{if(dfb('',o1d(a,c.Hj()).ne())){i=b2d(q1d(a,c));h=a2d(q1d(a,c));k=r1d(a,b,i,h);if(k){return k}e=f1d(a,b);for(g=0,l=e.gc();g1){throw vbb(new Wdb(Hwe))}k=S6d(a.e.Tg(),b);d=BD(a.g,119);for(g=0;g1;for(j=new b1b(m.b);llb(j.a)||llb(j.b);){i=BD(llb(j.a)?mlb(j.a):mlb(j.b),17);l=i.c==m?i.d:i.c;$wnd.Math.abs(l7c(OC(GC(m1,1),nie,8,0,[l.i.n,l.n,l.a])).b-g.b)>1&&GNc(a,i,g,f,m)}}} +function XPc(a){var b,c,d,e,f,g;e=new Bib(a.e,0);d=new Bib(a.a,0);if(a.d){for(c=0;cOqe){f=b;g=0;while($wnd.Math.abs(b-f)0);e.a.Xb(e.c=--e.b);WPc(a,a.b-g,f,d,e);sCb(e.b0);d.a.Xb(d.c=--d.b)}if(!a.d){for(c=0;c0){a.f[k.p]=n/(k.e.c.length+k.g.c.length);a.c=$wnd.Math.min(a.c,a.f[k.p]);a.b=$wnd.Math.max(a.b,a.f[k.p])}else h&&(a.f[k.p]=n)}} +function $9d(a){a.b=null;a.bb=null;a.fb=null;a.qb=null;a.a=null;a.c=null;a.d=null;a.e=null;a.f=null;a.n=null;a.M=null;a.L=null;a.Q=null;a.R=null;a.K=null;a.db=null;a.eb=null;a.g=null;a.i=null;a.j=null;a.k=null;a.gb=null;a.o=null;a.p=null;a.q=null;a.r=null;a.$=null;a.ib=null;a.S=null;a.T=null;a.t=null;a.s=null;a.u=null;a.v=null;a.w=null;a.B=null;a.A=null;a.C=null;a.D=null;a.F=null;a.G=null;a.H=null;a.I=null;a.J=null;a.P=null;a.Z=null;a.U=null;a.V=null;a.W=null;a.X=null;a.Y=null;a._=null;a.ab=null;a.cb=null;a.hb=null;a.nb=null;a.lb=null;a.mb=null;a.ob=null;a.pb=null;a.jb=null;a.kb=null;a.N=false;a.O=false} +function l5b(a,b,c){var d,e,f,g;Odd(c,'Graph transformation ('+a.a+')',1);g=Mu(b.a);for(f=new olb(b.b);f.a0){a.a=i+(n-1)*f;b.c.b+=a.a;b.f.b+=a.a}}if(o.a.gc()!=0){m=new tPc(1,f);n=sPc(m,b,o,p,b.f.b+i-b.c.b);n>0&&(b.f.b+=i+(n-1)*f)}} +function kKd(a,b){var c,d,e,f;f=a.F;if(b==null){a.F=null;$Jd(a,null)}else{a.F=(uCb(b),b);d=hfb(b,wfb(60));if(d!=-1){e=b.substr(0,d);hfb(b,wfb(46))==-1&&!dfb(e,Khe)&&!dfb(e,Eve)&&!dfb(e,Fve)&&!dfb(e,Gve)&&!dfb(e,Hve)&&!dfb(e,Ive)&&!dfb(e,Jve)&&!dfb(e,Kve)&&(e=Lve);c=kfb(b,wfb(62));c!=-1&&(e+=''+b.substr(c+1));$Jd(a,e)}else{e=b;if(hfb(b,wfb(46))==-1){d=hfb(b,wfb(91));d!=-1&&(e=b.substr(0,d));if(!dfb(e,Khe)&&!dfb(e,Eve)&&!dfb(e,Fve)&&!dfb(e,Gve)&&!dfb(e,Hve)&&!dfb(e,Ive)&&!dfb(e,Jve)&&!dfb(e,Kve)){e=Lve;d!=-1&&(e+=''+b.substr(d))}else{e=b}}$Jd(a,e);e==b&&(a.F=a.D)}}(a.Db&4)!=0&&(a.Db&1)==0&&Uhd(a,new nSd(a,1,5,f,b))} +function AMc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;p=b.b.c.length;if(p<3){return}n=KC(WD,oje,25,p,15,1);l=0;for(k=new olb(b.b);k.ag)&&Qqb(a.b,BD(q.b,17))}}++h}f=g}}}} +function o5c(b,c){var d;if(c==null||dfb(c,Xhe)){return null}if(c.length==0&&b.k!=(_5c(),W5c)){return null}switch(b.k.g){case 1:return efb(c,kse)?(Bcb(),Acb):efb(c,lse)?(Bcb(),zcb):null;case 2:try{return meb(Icb(c,Rie,Ohe))}catch(a){a=ubb(a);if(JD(a,127)){return null}else throw vbb(a)}case 4:try{return Hcb(c)}catch(a){a=ubb(a);if(JD(a,127)){return null}else throw vbb(a)}case 3:return c;case 5:j5c(b);return m5c(b,c);case 6:j5c(b);return n5c(b,b.a,c);case 7:try{d=l5c(b);d.Jf(c);return d}catch(a){a=ubb(a);if(JD(a,32)){return null}else throw vbb(a)}default:throw vbb(new Zdb('Invalid type set for this layout option.'));}} +function JWb(a){AWb();var b,c,d,e,f,g,h;h=new CWb;for(c=new olb(a);c.a=h.b.c)&&(h.b=b);if(!h.c||b.c<=h.c.c){h.d=h.c;h.c=b}(!h.e||b.d>=h.e.d)&&(h.e=b);(!h.f||b.d<=h.f.d)&&(h.f=b)}d=new NWb((lWb(),hWb));rXb(a,yWb,new amb(OC(GC(bQ,1),Uhe,369,0,[d])));g=new NWb(kWb);rXb(a,xWb,new amb(OC(GC(bQ,1),Uhe,369,0,[g])));e=new NWb(iWb);rXb(a,wWb,new amb(OC(GC(bQ,1),Uhe,369,0,[e])));f=new NWb(jWb);rXb(a,vWb,new amb(OC(GC(bQ,1),Uhe,369,0,[f])));DWb(d.c,hWb);DWb(e.c,iWb);DWb(f.c,jWb);DWb(g.c,kWb);h.a.c=KC(SI,Uhe,1,0,5,1);Gkb(h.a,d.c);Gkb(h.a,Su(e.c));Gkb(h.a,f.c);Gkb(h.a,Su(g.c));return h} +function jxd(a){var b;switch(a.d){case 1:{if(a.hj()){return a.o!=-2}break}case 2:{if(a.hj()){return a.o==-2}break}case 3:case 5:case 4:case 6:case 7:{return a.o>-2}default:{return false}}b=a.gj();switch(a.p){case 0:return b!=null&&Ccb(DD(b))!=Kbb(a.k,0);case 1:return b!=null&&BD(b,217).a!=Tbb(a.k)<<24>>24;case 2:return b!=null&&BD(b,172).a!=(Tbb(a.k)&aje);case 6:return b!=null&&Kbb(BD(b,162).a,a.k);case 5:return b!=null&&BD(b,19).a!=Tbb(a.k);case 7:return b!=null&&BD(b,184).a!=Tbb(a.k)<<16>>16;case 3:return b!=null&&Edb(ED(b))!=a.j;case 4:return b!=null&&BD(b,155).a!=a.j;default:return b==null?a.n!=null:!pb(b,a.n);}} +function nOd(a,b,c){var d,e,f,g;if(a.Fk()&&a.Ek()){g=oOd(a,BD(c,56));if(PD(g)!==PD(c)){a.Oi(b);a.Ui(b,pOd(a,b,g));if(a.rk()){f=(e=BD(c,49),a.Dk()?a.Bk()?e.ih(a.b,zUd(BD(XKd(wjd(a.b),a.aj()),18)).n,BD(XKd(wjd(a.b),a.aj()).Yj(),26).Bj(),null):e.ih(a.b,bLd(e.Tg(),zUd(BD(XKd(wjd(a.b),a.aj()),18))),null,null):e.ih(a.b,-1-a.aj(),null,null));!BD(g,49).eh()&&(f=(d=BD(g,49),a.Dk()?a.Bk()?d.gh(a.b,zUd(BD(XKd(wjd(a.b),a.aj()),18)).n,BD(XKd(wjd(a.b),a.aj()).Yj(),26).Bj(),f):d.gh(a.b,bLd(d.Tg(),zUd(BD(XKd(wjd(a.b),a.aj()),18))),null,f):d.gh(a.b,-1-a.aj(),null,f)));!!f&&f.Fi()}oid(a.b)&&a.$i(a.Zi(9,c,g,b,false));return g}}return c} +function Noc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;k=Edb(ED(vNb(a,(Nyc(),oyc))));d=Edb(ED(vNb(a,Cyc)));m=new _fd;yNb(m,oyc,k+d);j=b;r=j.d;p=j.c.i;s=j.d.i;q=G1b(p.c);t=G1b(s.c);e=new Rkb;for(l=q;l<=t;l++){h=new b0b(a);__b(h,(j0b(),g0b));yNb(h,(wtc(),$sc),j);yNb(h,Vxc,(dcd(),$bd));yNb(h,qyc,m);n=BD(Ikb(a.b,l),29);l==q?Z_b(h,n.a.c.length-c,n):$_b(h,n);u=Edb(ED(vNb(j,Zwc)));if(u<0){u=0;yNb(j,Zwc,u)}h.o.b=u;o=$wnd.Math.floor(u/2);g=new H0b;G0b(g,(Ucd(),Tcd));F0b(g,h);g.n.b=o;i=new H0b;G0b(i,zcd);F0b(i,h);i.n.b=o;RZb(j,g);f=new UZb;tNb(f,j);yNb(f,jxc,null);QZb(f,i);RZb(f,r);Ooc(h,j,f);e.c[e.c.length]=f;j=f}return e} +function sbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;i=BD(Y_b(a,(Ucd(),Tcd)).Kc().Pb(),11).e;n=BD(Y_b(a,zcd).Kc().Pb(),11).g;h=i.c.length;t=A0b(BD(Ikb(a.j,0),11));while(h-->0){p=(tCb(0,i.c.length),BD(i.c[0],17));e=(tCb(0,n.c.length),BD(n.c[0],17));s=e.d.e;f=Jkb(s,e,0);SZb(p,e.d,f);QZb(e,null);RZb(e,null);o=p.a;b&&Dsb(o,new g7c(t));for(d=Jsb(e.a,0);d.b!=d.d.c;){c=BD(Xsb(d),8);Dsb(o,new g7c(c))}r=p.b;for(m=new olb(e.b);m.a0&&(g=$wnd.Math.max(g,IJb(a.C.b+d.d.b,e)))}else{n=m+k.d.c+a.w+d.d.b;g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(l-e)<=ple||l==e||isNaN(l)&&isNaN(e)?0:n/(e-l)))}k=d;l=e;m=f}if(!!a.C&&a.C.c>0){n=m+a.C.c;j&&(n+=k.d.c);g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(l-1)<=ple||l==1||isNaN(l)&&isNaN(1)?0:n/(1-l)))}c.n.b=0;c.a.a=g} +function NKb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n;c=BD(Mpb(a.b,b),124);i=BD(BD(Qc(a.r,b),21),84);if(i.dc()){c.n.d=0;c.n.a=0;return}j=a.u.Hc((rcd(),ncd));g=0;a.A.Hc((tdd(),sdd))&&SKb(a,b);h=i.Kc();k=null;m=0;l=0;while(h.Ob()){d=BD(h.Pb(),111);f=Edb(ED(d.b.We((CKb(),BKb))));e=d.b.rf().b;if(!k){!!a.C&&a.C.d>0&&(g=$wnd.Math.max(g,IJb(a.C.d+d.d.d,f)))}else{n=l+k.d.a+a.w+d.d.d;g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(m-f)<=ple||m==f||isNaN(m)&&isNaN(f)?0:n/(f-m)))}k=d;m=f;l=e}if(!!a.C&&a.C.a>0){n=l+a.C.a;j&&(n+=k.d.a);g=$wnd.Math.max(g,(Iy(),My(ple),$wnd.Math.abs(m-1)<=ple||m==1||isNaN(m)&&isNaN(1)?0:n/(1-m)))}c.n.d=0;c.a.b=g} +function _Ec(a,b,c){var d,e,f,g,h,i;this.g=a;h=b.d.length;i=c.d.length;this.d=KC(OQ,kne,10,h+i,0,1);for(g=0;g0?ZEc(this,this.f/this.a):REc(b.g,b.d[0]).a!=null&&REc(c.g,c.d[0]).a!=null?ZEc(this,(Edb(REc(b.g,b.d[0]).a)+Edb(REc(c.g,c.d[0]).a))/2):REc(b.g,b.d[0]).a!=null?ZEc(this,REc(b.g,b.d[0]).a):REc(c.g,c.d[0]).a!=null&&ZEc(this,REc(c.g,c.d[0]).a)} +function BUb(a,b){var c,d,e,f,g,h,i,j,k,l;a.a=new dVb(oqb(t1));for(d=new olb(b.a);d.a=1){if(q-g>0&&l>=0){i.n.a+=p;i.n.b+=f*g}else if(q-g<0&&k>=0){i.n.a+=p*q;i.n.b+=f}}}a.o.a=b.a;a.o.b=b.b;yNb(a,(Nyc(),Fxc),(tdd(),d=BD(gdb(I1),9),new xqb(d,BD(_Bb(d,d.length),9),0)))} +function iFd(a,b,c,d,e,f){var g;if(!(b==null||!OEd(b,zEd,AEd))){throw vbb(new Wdb('invalid scheme: '+b))}if(!a&&!(c!=null&&hfb(c,wfb(35))==-1&&c.length>0&&(BCb(0,c.length),c.charCodeAt(0)!=47))){throw vbb(new Wdb('invalid opaquePart: '+c))}if(a&&!(b!=null&&hnb(GEd,b.toLowerCase()))&&!(c==null||!OEd(c,CEd,DEd))){throw vbb(new Wdb(mve+c))}if(a&&b!=null&&hnb(GEd,b.toLowerCase())&&!eFd(c)){throw vbb(new Wdb(mve+c))}if(!fFd(d)){throw vbb(new Wdb('invalid device: '+d))}if(!hFd(e)){g=e==null?'invalid segments: null':'invalid segment: '+VEd(e);throw vbb(new Wdb(g))}if(!(f==null||hfb(f,wfb(35))==-1)){throw vbb(new Wdb('invalid query: '+f))}} +function nVc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;Odd(b,'Calculate Graph Size',1);b.n&&!!a&&Tdd(b,i6d(a),(pgd(),mgd));h=dme;i=dme;f=ere;g=ere;for(l=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));l.e!=l.i.gc();){j=BD(Dyd(l),33);o=j.i;p=j.j;r=j.g;d=j.f;e=BD(hkd(j,(Y9c(),S8c)),142);h=$wnd.Math.min(h,o-e.b);i=$wnd.Math.min(i,p-e.d);f=$wnd.Math.max(f,o+r+e.c);g=$wnd.Math.max(g,p+d+e.a)}n=BD(hkd(a,(Y9c(),f9c)),116);m=new f7c(h-n.b,i-n.d);for(k=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));k.e!=k.i.gc();){j=BD(Dyd(k),33);dld(j,j.i-m.a);eld(j,j.j-m.b)}q=f-h+(n.b+n.c);c=g-i+(n.d+n.a);cld(a,q);ald(a,c);b.n&&!!a&&Tdd(b,i6d(a),(pgd(),mgd))} +function rGb(a){var b,c,d,e,f,g,h,i,j,k;d=new Rkb;for(g=new olb(a.e.a);g.a0){gA(a,c,0);c.a+=String.fromCharCode(d);e=lA(b,f);gA(a,c,e);f+=e-1;continue}if(d==39){if(f+11){p=KC(WD,oje,25,a.b.b.c.length,15,1);l=0;for(j=new olb(a.b.b);j.a=h&&e<=i){if(h<=e&&f<=i){c[k++]=e;c[k++]=f;d+=2}else if(h<=e){c[k++]=e;c[k++]=i;a.b[d]=i+1;g+=2}else if(f<=i){c[k++]=h;c[k++]=f;d+=2}else{c[k++]=h;c[k++]=i;a.b[d]=i+1}}else if(iQie)&&h<10);zVb(a.c,new _Ub);OUb(a);vVb(a.c);yUb(a.f)} +function sZb(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(!Ccb(DD(vNb(c,(Nyc(),fxc))))){return}for(h=new olb(c.j);h.a=2){i=Jsb(c,0);g=BD(Xsb(i),8);h=BD(Xsb(i),8);while(h.a0&&jEb(j,true,(ead(),bad));h.k==(j0b(),e0b)&&kEb(j);Rhb(a.f,h,b)}}} +function Bbc(a,b,c){var d,e,f,g,h,i,j,k,l,m;Odd(c,'Node promotion heuristic',1);a.g=b;Abc(a);a.q=BD(vNb(b,(Nyc(),rxc)),260);k=BD(vNb(a.g,qxc),19).a;f=new Jbc;switch(a.q.g){case 2:case 1:Dbc(a,f);break;case 3:a.q=(kAc(),jAc);Dbc(a,f);i=0;for(h=new olb(a.a);h.aa.j){a.q=dAc;Dbc(a,f)}break;case 4:a.q=(kAc(),jAc);Dbc(a,f);j=0;for(e=new olb(a.b);e.aa.k){a.q=gAc;Dbc(a,f)}break;case 6:m=QD($wnd.Math.ceil(a.f.length*k/100));Dbc(a,new Mbc(m));break;case 5:l=QD($wnd.Math.ceil(a.d*k/100));Dbc(a,new Pbc(l));break;default:Dbc(a,f);}Ebc(a,b);Qdd(c)} +function fFc(a,b,c){var d,e,f,g;this.j=a;this.e=WZb(a);this.o=this.j.e;this.i=!!this.o;this.p=this.i?BD(Ikb(c,Q_b(this.o).p),214):null;e=BD(vNb(a,(wtc(),Ksc)),21);this.g=e.Hc((Orc(),Hrc));this.b=new Rkb;this.d=new rHc(this.e);g=BD(vNb(this.j,jtc),230);this.q=wFc(b,g,this.e);this.k=new BGc(this);f=Ou(OC(GC(qY,1),Uhe,225,0,[this,this.d,this.k,this.q]));if(b==(rGc(),oGc)&&!Ccb(DD(vNb(a,(Nyc(),Awc))))){d=new SEc(this.e);f.c[f.c.length]=d;this.c=new uEc(d,g,BD(this.q,402))}else if(b==oGc&&Ccb(DD(vNb(a,(Nyc(),Awc))))){d=new SEc(this.e);f.c[f.c.length]=d;this.c=new XGc(d,g,BD(this.q,402))}else{this.c=new Oic(b,this)}Ekb(f,this.c);$Ic(f,this.e);this.s=AGc(this.k)} +function xUc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;l=BD(pr((g=Jsb((new ZRc(b)).a.d,0),new aSc(g))),86);o=l?BD(vNb(l,(mTc(),_Sc)),86):null;e=1;while(!!l&&!!o){i=0;u=0;c=l;d=o;for(h=0;h=a.i){++a.i;Ekb(a.a,meb(1));Ekb(a.b,k)}else{d=a.c[b.p][1];Nkb(a.a,j,meb(BD(Ikb(a.a,j),19).a+1-d));Nkb(a.b,j,Edb(ED(Ikb(a.b,j)))+k-d*a.e)}(a.q==(kAc(),dAc)&&(BD(Ikb(a.a,j),19).a>a.j||BD(Ikb(a.a,j-1),19).a>a.j)||a.q==gAc&&(Edb(ED(Ikb(a.b,j)))>a.k||Edb(ED(Ikb(a.b,j-1)))>a.k))&&(i=false);for(g=new Sr(ur(R_b(b).a.Kc(),new Sq));Qr(g);){f=BD(Rr(g),17);h=f.c.i;if(a.f[h.p]==j){l=Cbc(a,h);e=e+BD(l.a,19).a;i=i&&Ccb(DD(l.b))}}a.f[b.p]=j;e=e+a.c[b.p][0];return new vgd(meb(e),(Bcb(),i?true:false))} +function sPc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r;l=new Lqb;g=new Rkb;qPc(a,c,a.d.fg(),g,l);qPc(a,d,a.d.gg(),g,l);a.b=0.2*(p=rPc(LAb(new YAb(null,new Kub(g,16)),new xPc)),q=rPc(LAb(new YAb(null,new Kub(g,16)),new zPc)),$wnd.Math.min(p,q));f=0;for(h=0;h=2&&(r=WNc(g,true,m),!a.e&&(a.e=new ZOc(a)),VOc(a.e,r,g,a.b),undefined);uPc(g,m);wPc(g);n=-1;for(k=new olb(g);k.ah} +function k6b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;c=BD(vNb(a,(Nyc(),Vxc)),98);g=a.f;f=a.d;h=g.a+f.b+f.c;i=0-f.d-a.c.b;k=g.b+f.d+f.a-a.c.b;j=new Rkb;l=new Rkb;for(e=new olb(b);e.a0),BD(k.a.Xb(k.c=--k.b),17));while(f!=d&&k.b>0){a.a[f.p]=true;a.a[d.p]=true;f=(sCb(k.b>0),BD(k.a.Xb(k.c=--k.b),17))}k.b>0&&uib(k)}}}} +function Vmd(b,c,d){var e,f,g,h,i,j,k,l,m;if(b.a!=c.Aj()){throw vbb(new Wdb(tte+c.ne()+ute))}e=o1d((O6d(),M6d),c).$k();if(e){return e.Aj().Nh().Ih(e,d)}h=o1d(M6d,c).al();if(h){if(d==null){return null}i=BD(d,15);if(i.dc()){return ''}m=new Hfb;for(g=i.Kc();g.Ob();){f=g.Pb();Efb(m,h.Aj().Nh().Ih(h,f));m.a+=' '}return lcb(m,m.a.length-1)}l=o1d(M6d,c).bl();if(!l.dc()){for(k=l.Kc();k.Ob();){j=BD(k.Pb(),148);if(j.wj(d)){try{m=j.Aj().Nh().Ih(j,d);if(m!=null){return m}}catch(a){a=ubb(a);if(!JD(a,102))throw vbb(a)}}}throw vbb(new Wdb("Invalid value: '"+d+"' for datatype :"+c.ne()))}BD(c,834).Fj();return d==null?null:JD(d,172)?''+BD(d,172).a:rb(d)==$J?CQd(Pmd[0],BD(d,199)):fcb(d)} +function zQc(a){var b,c,d,e,f,g,h,i,j,k;j=new Psb;h=new Psb;for(f=new olb(a);f.a-1){for(e=Jsb(h,0);e.b!=e.d.c;){d=BD(Xsb(e),128);d.v=g}while(h.b!=0){d=BD(Vt(h,0),128);for(c=new olb(d.i);c.a0){c+=i.n.a+i.o.a/2;++l}for(o=new olb(i.j);o.a0&&(c/=l);r=KC(UD,Vje,25,d.a.c.length,15,1);h=0;for(j=new olb(d.a);j.a=h&&e<=i){if(h<=e&&f<=i){d+=2}else if(h<=e){a.b[d]=i+1;g+=2}else if(f<=i){c[k++]=e;c[k++]=h-1;d+=2}else{c[k++]=e;c[k++]=h-1;a.b[d]=i+1;g+=2}}else if(i0?(e-=86400000):(e+=86400000);i=new gB(wbb(Cbb(b.q.getTime()),e))}k=new Vfb;j=a.a.length;for(f=0;f=97&&d<=122||d>=65&&d<=90){for(g=f+1;g=j){throw vbb(new Wdb("Missing trailing '"))}g+10&&c.c==0){!b&&(b=new Rkb);b.c[b.c.length]=c}}if(b){while(b.c.length!=0){c=BD(Kkb(b,0),233);if(!!c.b&&c.b.c.length>0){for(f=(!c.b&&(c.b=new Rkb),new olb(c.b));f.aJkb(a,c,0)){return new vgd(e,c)}}else if(Edb(REc(e.g,e.d[0]).a)>Edb(REc(c.g,c.d[0]).a)){return new vgd(e,c)}}}for(h=(!c.e&&(c.e=new Rkb),c.e).Kc();h.Ob();){g=BD(h.Pb(),233);i=(!g.b&&(g.b=new Rkb),g.b);wCb(0,i.c.length);aCb(i.c,0,c);g.c==i.c.length&&(b.c[b.c.length]=g,true)}}}return null} +function wlb(a,b){var c,d,e,f,g,h,i,j,k;if(a==null){return Xhe}i=b.a.zc(a,b);if(i!=null){return '[...]'}c=new xwb(She,'[',']');for(e=a,f=0,g=e.length;f=14&&k<=16))){if(b.a._b(d)){!c.a?(c.a=new Wfb(c.d)):Qfb(c.a,c.b);Nfb(c.a,'[...]')}else{h=CD(d);j=new Vqb(b);uwb(c,wlb(h,j))}}else JD(d,177)?uwb(c,Xlb(BD(d,177))):JD(d,190)?uwb(c,Qlb(BD(d,190))):JD(d,195)?uwb(c,Rlb(BD(d,195))):JD(d,2012)?uwb(c,Wlb(BD(d,2012))):JD(d,48)?uwb(c,Ulb(BD(d,48))):JD(d,364)?uwb(c,Vlb(BD(d,364))):JD(d,832)?uwb(c,Tlb(BD(d,832))):JD(d,104)&&uwb(c,Slb(BD(d,104)))}else{uwb(c,d==null?Xhe:fcb(d))}}return !c.a?c.c:c.e.length==0?c.a.a:c.a.a+(''+c.e)} +function xQb(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;h=itd(b,false,false);r=ofd(h);d&&(r=w7c(r));t=Edb(ED(hkd(b,(CPb(),vPb))));q=(sCb(r.b!=0),BD(r.a.a.c,8));l=BD(Ut(r,1),8);if(r.b>2){k=new Rkb;Gkb(k,new Jib(r,1,r.b));f=sQb(k,t+a.a);s=new XOb(f);tNb(s,b);c.c[c.c.length]=s}else{d?(s=BD(Ohb(a.b,jtd(b)),266)):(s=BD(Ohb(a.b,ltd(b)),266))}i=jtd(b);d&&(i=ltd(b));g=zQb(q,i);j=t+a.a;if(g.a){j+=$wnd.Math.abs(q.b-l.b);p=new f7c(l.a,(l.b+q.b)/2)}else{j+=$wnd.Math.abs(q.a-l.a);p=new f7c((l.a+q.a)/2,l.b)}d?Rhb(a.d,b,new ZOb(s,g,p,j)):Rhb(a.c,b,new ZOb(s,g,p,j));Rhb(a.b,b,s);o=(!b.n&&(b.n=new cUd(D2,b,1,7)),b.n);for(n=new Fyd(o);n.e!=n.i.gc();){m=BD(Dyd(n),137);e=wQb(a,m,true,0,0);c.c[c.c.length]=e}} +function wPc(a){var b,c,d,e,f,g,h,i,j,k;j=new Rkb;h=new Rkb;for(g=new olb(a);g.a-1){for(f=new olb(h);f.a0){continue}rOc(i,$wnd.Math.min(i.o,e.o-1));qOc(i,i.i-1);i.i==0&&(h.c[h.c.length]=i,true)}}}} +function QQd(a,b,c){var d,e,f,g,h,i,j;j=a.c;!b&&(b=FQd);a.c=b;if((a.Db&4)!=0&&(a.Db&1)==0){i=new nSd(a,1,2,j,a.c);!c?(c=i):c.Ei(i)}if(j!=b){if(JD(a.Cb,284)){if(a.Db>>16==-10){c=BD(a.Cb,284).nk(b,c)}else if(a.Db>>16==-15){!b&&(b=(jGd(),YFd));!j&&(j=(jGd(),YFd));if(a.Cb.nh()){i=new pSd(a.Cb,1,13,j,b,HLd(QSd(BD(a.Cb,59)),a),false);!c?(c=i):c.Ei(i)}}}else if(JD(a.Cb,88)){if(a.Db>>16==-23){JD(b,88)||(b=(jGd(),_Fd));JD(j,88)||(j=(jGd(),_Fd));if(a.Cb.nh()){i=new pSd(a.Cb,1,10,j,b,HLd(VKd(BD(a.Cb,26)),a),false);!c?(c=i):c.Ei(i)}}}else if(JD(a.Cb,444)){h=BD(a.Cb,836);g=(!h.b&&(h.b=new RYd(new NYd)),h.b);for(f=(d=new nib((new eib(g.a)).a),new ZYd(d));f.a.b;){e=BD(lib(f.a).cd(),87);c=QQd(e,MQd(e,h),c)}}}return c} +function O1b(a,b){var c,d,e,f,g,h,i,j,k,l,m;g=Ccb(DD(hkd(a,(Nyc(),fxc))));m=BD(hkd(a,Yxc),21);i=false;j=false;l=new Fyd((!a.c&&(a.c=new cUd(F2,a,9,9)),a.c));while(l.e!=l.i.gc()&&(!i||!j)){f=BD(Dyd(l),118);h=0;for(e=ul(pl(OC(GC(KI,1),Uhe,20,0,[(!f.d&&(f.d=new y5d(B2,f,8,5)),f.d),(!f.e&&(f.e=new y5d(B2,f,7,4)),f.e)])));Qr(e);){d=BD(Rr(e),79);k=g&&Qld(d)&&Ccb(DD(hkd(d,gxc)));c=ELd((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),f)?a==Xod(atd(BD(qud((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c),0),82))):a==Xod(atd(BD(qud((!d.b&&(d.b=new y5d(z2,d,4,7)),d.b),0),82)));if(k||c){++h;if(h>1){break}}}h>0?(i=true):m.Hc((rcd(),ncd))&&(!f.n&&(f.n=new cUd(D2,f,1,7)),f.n).i>0&&(i=true);h>1&&(j=true)}i&&b.Fc((Orc(),Hrc));j&&b.Fc((Orc(),Irc))} +function zfd(a){var b,c,d,e,f,g,h,i,j,k,l,m;m=BD(hkd(a,(Y9c(),Y8c)),21);if(m.dc()){return null}h=0;g=0;if(m.Hc((tdd(),rdd))){k=BD(hkd(a,t9c),98);d=2;c=2;e=2;f=2;b=!Xod(a)?BD(hkd(a,z8c),103):BD(hkd(Xod(a),z8c),103);for(j=new Fyd((!a.c&&(a.c=new cUd(F2,a,9,9)),a.c));j.e!=j.i.gc();){i=BD(Dyd(j),118);l=BD(hkd(i,A9c),61);if(l==(Ucd(),Scd)){l=lfd(i,b);jkd(i,A9c,l)}if(k==(dcd(),$bd)){switch(l.g){case 1:d=$wnd.Math.max(d,i.i+i.g);break;case 2:c=$wnd.Math.max(c,i.j+i.f);break;case 3:e=$wnd.Math.max(e,i.i+i.g);break;case 4:f=$wnd.Math.max(f,i.j+i.f);}}else{switch(l.g){case 1:d+=i.g+2;break;case 2:c+=i.f+2;break;case 3:e+=i.g+2;break;case 4:f+=i.f+2;}}}h=$wnd.Math.max(d,e);g=$wnd.Math.max(c,f)}return Afd(a,h,g,true,true)} +function lnc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;s=BD(GAb(VAb(JAb(new YAb(null,new Kub(b.d,16)),new pnc(c)),new rnc(c)),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)]))),15);l=Ohe;k=Rie;for(i=new olb(b.b.j);i.a0;if(j){if(j){m=r.p;g?++m:--m;l=BD(Ikb(r.c.a,m),10);d=I4b(l);n=!(s6c(d,w,c[0])||n6c(d,w,c[0]))}}else{n=true}}o=false;v=b.D.i;if(!!v&&!!v.c&&h.e){k=g&&v.p>0||!g&&v.p0&&(b.a+=She,b);yfd(BD(Dyd(h),160),b)}b.a+=gne;i=new Oyd((!d.c&&(d.c=new y5d(z2,d,5,8)),d.c));while(i.e!=i.i.gc()){i.e>0&&(b.a+=She,b);yfd(BD(Dyd(i),160),b)}b.a+=')'}}} +function y2b(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;f=BD(vNb(a,(wtc(),$sc)),79);if(!f){return}d=a.a;e=new g7c(c);P6c(e,C2b(a));if(f_b(a.d.i,a.c.i)){m=a.c;l=l7c(OC(GC(m1,1),nie,8,0,[m.n,m.a]));c7c(l,c)}else{l=A0b(a.c)}Gsb(d,l,d.a,d.a.a);n=A0b(a.d);vNb(a,utc)!=null&&P6c(n,BD(vNb(a,utc),8));Gsb(d,n,d.c.b,d.c);q7c(d,e);g=itd(f,true,true);kmd(g,BD(qud((!f.b&&(f.b=new y5d(z2,f,4,7)),f.b),0),82));lmd(g,BD(qud((!f.c&&(f.c=new y5d(z2,f,5,8)),f.c),0),82));ifd(d,g);for(k=new olb(a.b);k.a=0){i=null;h=new Bib(k.a,j+1);while(h.bg?1:Ny(isNaN(0),isNaN(g)))<0&&(null,My(Jqe),($wnd.Math.abs(g-1)<=Jqe||g==1||isNaN(g)&&isNaN(1)?0:g<1?-1:g>1?1:Ny(isNaN(g),isNaN(1)))<0)&&(null,My(Jqe),($wnd.Math.abs(0-h)<=Jqe||0==h||isNaN(0)&&isNaN(h)?0:0h?1:Ny(isNaN(0),isNaN(h)))<0)&&(null,My(Jqe),($wnd.Math.abs(h-1)<=Jqe||h==1||isNaN(h)&&isNaN(1)?0:h<1?-1:h>1?1:Ny(isNaN(h),isNaN(1)))<0));return f} +function z6d(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;for(l=new usb(new nsb(a));l.b!=l.c.a.d;){k=tsb(l);h=BD(k.d,56);b=BD(k.e,56);g=h.Tg();for(p=0,u=(g.i==null&&TKd(g),g.i).length;p=0&&p=j.c.c.length?(k=JJc((j0b(),h0b),g0b)):(k=JJc((j0b(),g0b),g0b));k*=2;f=c.a.g;c.a.g=$wnd.Math.max(f,f+(k-f));g=c.b.g;c.b.g=$wnd.Math.max(g,g+(k-g));e=b}}} +function VNc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;v=Hx(a);k=new Rkb;h=a.c.length;l=h-1;m=h+1;while(v.a.c!=0){while(c.b!=0){t=(sCb(c.b!=0),BD(Nsb(c,c.a.a),112));Jwb(v.a,t)!=null;t.g=l--;YNc(t,b,c,d)}while(b.b!=0){u=(sCb(b.b!=0),BD(Nsb(b,b.a.a),112));Jwb(v.a,u)!=null;u.g=m++;YNc(u,b,c,d)}j=Rie;for(r=(g=new Ywb((new cxb((new Gjb(v.a)).a)).b),new Njb(g));sib(r.a.a);){q=(f=Wwb(r.a),BD(f.cd(),112));if(!d&&q.b>0&&q.a<=0){k.c=KC(SI,Uhe,1,0,5,1);k.c[k.c.length]=q;break}p=q.i-q.d;if(p>=j){if(p>j){k.c=KC(SI,Uhe,1,0,5,1);j=p}k.c[k.c.length]=q}}if(k.c.length!=0){i=BD(Ikb(k,Bub(e,k.c.length)),112);Jwb(v.a,i)!=null;i.g=m++;YNc(i,b,c,d);k.c=KC(SI,Uhe,1,0,5,1)}}s=a.c.length+1;for(o=new olb(a);o.a0){m.d+=k.n.d;m.d+=k.d}if(m.a>0){m.a+=k.n.a;m.a+=k.d}if(m.b>0){m.b+=k.n.b;m.b+=k.d}if(m.c>0){m.c+=k.n.c;m.c+=k.d}return m} +function d6b(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o;m=c.d;l=c.c;f=new f7c(c.f.a+c.d.b+c.d.c,c.f.b+c.d.d+c.d.a);g=f.b;for(j=new olb(a.a);j.a0){a.c[b.c.p][b.p].d+=Cub(a.i,24)*lke*0.07000000029802322-0.03500000014901161;a.c[b.c.p][b.p].a=a.c[b.c.p][b.p].d/a.c[b.c.p][b.p].b}} +function m5b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;for(o=new olb(a);o.ad.d;d.d=$wnd.Math.max(d.d,b);if(h&&c){d.d=$wnd.Math.max(d.d,d.a);d.a=d.d+e}break;case 3:c=b>d.a;d.a=$wnd.Math.max(d.a,b);if(h&&c){d.a=$wnd.Math.max(d.a,d.d);d.d=d.a+e}break;case 2:c=b>d.c;d.c=$wnd.Math.max(d.c,b);if(h&&c){d.c=$wnd.Math.max(d.b,d.c);d.b=d.c+e}break;case 4:c=b>d.b;d.b=$wnd.Math.max(d.b,b);if(h&&c){d.b=$wnd.Math.max(d.b,d.c);d.c=d.b+e}}}}} +function l3b(a){var b,c,d,e,f,g,h,i,j,k,l;for(j=new olb(a);j.a0||k.j==Tcd&&k.e.c.length-k.g.c.length<0)){b=false;break}for(e=new olb(k.g);e.a=j&&v>=q){m+=o.n.b+p.n.b+p.a.b-u;++h}}}}if(c){for(g=new olb(s.e);g.a=j&&v>=q){m+=o.n.b+p.n.b+p.a.b-u;++h}}}}}if(h>0){w+=m/h;++n}}if(n>0){b.a=e*w/n;b.g=n}else{b.a=0;b.g=0}} +function oMc(a,b){var c,d,e,f,g,h,i,j,k,l,m;for(e=new olb(a.a.b);e.aQje||b.o==cMc&&k0&&dld(r,u*w);v>0&&eld(r,v*A)}stb(a.b,new CQb);b=new Rkb;for(h=new nib((new eib(a.c)).a);h.b;){g=lib(h);d=BD(g.cd(),79);c=BD(g.dd(),395).a;e=itd(d,false,false);l=oQb(jtd(d),ofd(e),c);ifd(l,e);t=ktd(d);if(!!t&&Jkb(b,t,0)==-1){b.c[b.c.length]=t;pQb(t,(sCb(l.b!=0),BD(l.a.a.c,8)),c)}}for(q=new nib((new eib(a.d)).a);q.b;){p=lib(q);d=BD(p.cd(),79);c=BD(p.dd(),395).a;e=itd(d,false,false);l=oQb(ltd(d),w7c(ofd(e)),c);l=w7c(l);ifd(l,e);t=mtd(d);if(!!t&&Jkb(b,t,0)==-1){b.c[b.c.length]=t;pQb(t,(sCb(l.b!=0),BD(l.c.b.c,8)),c)}}} +function _Vc(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;if(c.c.length!=0){o=new Rkb;for(n=new olb(c);n.a1){n=new ZQc(o,t,d);reb(t,new PQc(a,n));g.c[g.c.length]=n;for(l=t.a.ec().Kc();l.Ob();){k=BD(l.Pb(),46);Lkb(f,k.b)}}if(h.a.gc()>1){n=new ZQc(o,h,d);reb(h,new RQc(a,n));g.c[g.c.length]=n;for(l=h.a.ec().Kc();l.Ob();){k=BD(l.Pb(),46);Lkb(f,k.b)}}}} +function $Wc(a){r4c(a,new E3c(L3c(P3c(M3c(O3c(N3c(new R3c,sre),'ELK Radial'),'A radial layout provider which is based on the algorithm of Peter Eades published in "Drawing free trees.", published by International Institute for Advanced Study of Social Information Science, Fujitsu Limited in 1991. The radial layouter takes a tree and places the nodes in radial order around the root. The nodes of the same tree level are placed on the same radius.'),new bXc),sre)));p4c(a,sre,uqe,Ksd(UWc));p4c(a,sre,wme,Ksd(XWc));p4c(a,sre,Fme,Ksd(NWc));p4c(a,sre,Tme,Ksd(OWc));p4c(a,sre,Eme,Ksd(PWc));p4c(a,sre,Gme,Ksd(MWc));p4c(a,sre,Dme,Ksd(QWc));p4c(a,sre,Hme,Ksd(TWc));p4c(a,sre,ore,Ksd(KWc));p4c(a,sre,nre,Ksd(LWc));p4c(a,sre,rre,Ksd(RWc));p4c(a,sre,lre,Ksd(SWc));p4c(a,sre,mre,Ksd(VWc));p4c(a,sre,pre,Ksd(WWc));p4c(a,sre,qre,Ksd(YWc))} +function LIb(a){var b;this.r=Cy(new OIb,new SIb);this.b=new Rpb(BD(Qb(F1),290));this.p=new Rpb(BD(Qb(F1),290));this.i=new Rpb(BD(Qb(DN),290));this.e=a;this.o=new g7c(a.rf());this.D=a.Df()||Ccb(DD(a.We((Y9c(),M8c))));this.A=BD(a.We((Y9c(),Y8c)),21);this.B=BD(a.We(b9c),21);this.q=BD(a.We(t9c),98);this.u=BD(a.We(x9c),21);if(!ucd(this.u)){throw vbb(new y2c('Invalid port label placement: '+this.u))}this.v=Ccb(DD(a.We(z9c)));this.j=BD(a.We(W8c),21);if(!Jbd(this.j)){throw vbb(new y2c('Invalid node label placement: '+this.j))}this.n=BD(bgd(a,U8c),116);this.k=Edb(ED(bgd(a,Q9c)));this.d=Edb(ED(bgd(a,P9c)));this.w=Edb(ED(bgd(a,X9c)));this.s=Edb(ED(bgd(a,R9c)));this.t=Edb(ED(bgd(a,S9c)));this.C=BD(bgd(a,V9c),142);this.c=2*this.d;b=!this.B.Hc((Idd(),zdd));this.f=new mIb(0,b,0);this.g=new mIb(1,b,0);lIb(this.f,(gHb(),eHb),this.g)} +function Lgd(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;t=0;o=0;n=0;m=1;for(s=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));s.e!=s.i.gc();){q=BD(Dyd(s),33);m+=sr(new Sr(ur(_sd(q).a.Kc(),new Sq)));B=q.g;o=$wnd.Math.max(o,B);l=q.f;n=$wnd.Math.max(n,l);t+=B*l}p=(!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i;g=t+2*d*d*m*p;f=$wnd.Math.sqrt(g);i=$wnd.Math.max(f*c,o);h=$wnd.Math.max(f/c,n);for(r=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));r.e!=r.i.gc();){q=BD(Dyd(r),33);C=e.b+(Cub(b,26)*ike+Cub(b,27)*jke)*(i-q.g);D=e.b+(Cub(b,26)*ike+Cub(b,27)*jke)*(h-q.f);dld(q,C);eld(q,D)}A=i+(e.b+e.c);w=h+(e.d+e.a);for(v=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));v.e!=v.i.gc();){u=BD(Dyd(v),33);for(k=new Sr(ur(_sd(u).a.Kc(),new Sq));Qr(k);){j=BD(Rr(k),79);Pld(j)||Kgd(j,b,A,w)}}A+=e.b+e.c;w+=e.d+e.a;Afd(a,A,w,false,true)} +function Jcb(a){var b,c,d,e,f,g,h,i,j,k,l;if(a==null){throw vbb(new Oeb(Xhe))}j=a;f=a.length;i=false;if(f>0){b=(BCb(0,a.length),a.charCodeAt(0));if(b==45||b==43){a=a.substr(1);--f;i=b==45}}if(f==0){throw vbb(new Oeb(Oje+j+'"'))}while(a.length>0&&(BCb(0,a.length),a.charCodeAt(0)==48)){a=a.substr(1);--f}if(f>(Neb(),Leb)[10]){throw vbb(new Oeb(Oje+j+'"'))}for(e=0;e0){l=-parseInt(a.substr(0,d),10);a=a.substr(d);f-=d;c=false}while(f>=g){d=parseInt(a.substr(0,g),10);a=a.substr(g);f-=g;if(c){c=false}else{if(ybb(l,h)<0){throw vbb(new Oeb(Oje+j+'"'))}l=Ibb(l,k)}l=Qbb(l,d)}if(ybb(l,0)>0){throw vbb(new Oeb(Oje+j+'"'))}if(!i){l=Jbb(l);if(ybb(l,0)<0){throw vbb(new Oeb(Oje+j+'"'))}}return l} +function Z6d(a,b){X6d();var c,d,e,f,g,h,i;this.a=new a7d(this);this.b=a;this.c=b;this.f=c2d(q1d((O6d(),M6d),b));if(this.f.dc()){if((h=t1d(M6d,a))==b){this.e=true;this.d=new Rkb;this.f=new oFd;this.f.Fc(Ewe);BD(V1d(p1d(M6d,bKd(a)),''),26)==a&&this.f.Fc(u1d(M6d,bKd(a)));for(e=g1d(M6d,a).Kc();e.Ob();){d=BD(e.Pb(),170);switch($1d(q1d(M6d,d))){case 4:{this.d.Fc(d);break}case 5:{this.f.Gc(c2d(q1d(M6d,d)));break}}}}else{Q6d();if(BD(b,66).Oj()){this.e=true;this.f=null;this.d=new Rkb;for(g=0,i=(a.i==null&&TKd(a),a.i).length;g=0&&g0&&(BD(Mpb(a.b,b),124).a.b=c)} +function b3b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;Odd(b,'Comment pre-processing',1);c=0;i=new olb(a.a);while(i.a0){j=(BCb(0,c.length),c.charCodeAt(0));if(j!=64){if(j==37){m=c.lastIndexOf('%');k=false;if(m!=0&&(m==n-1||(k=(BCb(m+1,c.length),c.charCodeAt(m+1)==46)))){h=c.substr(1,m-1);u=dfb('%',h)?null:QEd(h);e=0;if(k){try{e=Icb(c.substr(m+2),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){i=a;throw vbb(new rFd(i))}else throw vbb(a)}}for(r=pRd(b.Wg());r.Ob();){p=MRd(r);if(JD(p,510)){f=BD(p,590);t=f.d;if((u==null?t==null:dfb(u,t))&&e--==0){return f}}}return null}}l=c.lastIndexOf('.');o=l==-1?c:c.substr(0,l);d=0;if(l!=-1){try{d=Icb(c.substr(l+1),Rie,Ohe)}catch(a){a=ubb(a);if(JD(a,127)){o=c}else throw vbb(a)}}o=dfb('%',o)?null:QEd(o);for(q=pRd(b.Wg());q.Ob();){p=MRd(q);if(JD(p,191)){g=BD(p,191);s=g.ne();if((o==null?s==null:dfb(o,s))&&d--==0){return g}}}return null}}return rid(b,c)} +function f6b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F;w=new Rkb;for(o=new olb(a.b);o.a=b.length)return {done:true};var a=b[d++];return {value:[a,c.get(a)],done:false}}}};if(!xrb()){e.prototype.createObject=function(){return {}};e.prototype.get=function(a){return this.obj[':'+a]};e.prototype.set=function(a,b){this.obj[':'+a]=b};e.prototype[hke]=function(a){delete this.obj[':'+a]};e.prototype.keys=function(){var a=[];for(var b in this.obj){b.charCodeAt(0)==58&&a.push(b.substring(1))}return a}}return e} +function cde(a){ade();var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(a==null)return null;l=a.length*8;if(l==0){return ''}h=l%24;n=l/24|0;m=h!=0?n+1:n;f=null;f=KC(TD,$ie,25,m*4,15,1);j=0;k=0;b=0;c=0;d=0;g=0;e=0;for(i=0;i>24;j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;p=(c&-128)==0?c>>4<<24>>24:(c>>4^240)<<24>>24;q=(d&-128)==0?d>>6<<24>>24:(d>>6^252)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[p|j<<4];f[g++]=_ce[k<<2|q];f[g++]=_ce[d&63]}if(h==8){b=a[e];j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[j<<4];f[g++]=61;f[g++]=61}else if(h==16){b=a[e];c=a[e+1];k=(c&15)<<24>>24;j=(b&3)<<24>>24;o=(b&-128)==0?b>>2<<24>>24:(b>>2^192)<<24>>24;p=(c&-128)==0?c>>4<<24>>24:(c>>4^240)<<24>>24;f[g++]=_ce[o];f[g++]=_ce[p|j<<4];f[g++]=_ce[k<<2];f[g++]=61}return zfb(f,0,f.length)} +function mB(a,b){var c,d,e,f,g,h,i;a.e==0&&a.p>0&&(a.p=-(a.p-1));a.p>Rie&&dB(b,a.p-nje);g=b.q.getDate();ZA(b,1);a.k>=0&&aB(b,a.k);if(a.c>=0){ZA(b,a.c)}else if(a.k>=0){i=new fB(b.q.getFullYear()-nje,b.q.getMonth(),35);d=35-i.q.getDate();ZA(b,$wnd.Math.min(d,g))}else{ZA(b,g)}a.f<0&&(a.f=b.q.getHours());a.b>0&&a.f<12&&(a.f+=12);$A(b,a.f==24&&a.g?0:a.f);a.j>=0&&_A(b,a.j);a.n>=0&&bB(b,a.n);a.i>=0&&cB(b,wbb(Ibb(Abb(Cbb(b.q.getTime()),_ie),_ie),a.i));if(a.a){e=new eB;dB(e,e.q.getFullYear()-nje-80);Gbb(Cbb(b.q.getTime()),Cbb(e.q.getTime()))&&dB(b,e.q.getFullYear()-nje+100)}if(a.d>=0){if(a.c==-1){c=(7+a.d-b.q.getDay())%7;c>3&&(c-=7);h=b.q.getMonth();ZA(b,b.q.getDate()+c);b.q.getMonth()!=h&&ZA(b,b.q.getDate()+(c>0?-7:7))}else{if(b.q.getDay()!=a.d){return false}}}if(a.o>Rie){f=b.q.getTimezoneOffset();cB(b,wbb(Cbb(b.q.getTime()),(a.o-f)*60*_ie))}return true} +function z2b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;e=vNb(b,(wtc(),$sc));if(!JD(e,239)){return}o=BD(e,33);p=b.e;m=new g7c(b.c);f=b.d;m.a+=f.b;m.b+=f.d;u=BD(hkd(o,(Nyc(),Ixc)),174);if(uqb(u,(Idd(),Add))){n=BD(hkd(o,Kxc),116);w_b(n,f.a);z_b(n,f.d);x_b(n,f.b);y_b(n,f.c)}c=new Rkb;for(k=new olb(b.a);k.a0&&Ekb(a.p,k);Ekb(a.o,k)}b-=d;n=i+b;j+=b*a.e;Nkb(a.a,h,meb(n));Nkb(a.b,h,j);a.j=$wnd.Math.max(a.j,n);a.k=$wnd.Math.max(a.k,j);a.d+=b;b+=p}} +function Ucd(){Ucd=ccb;var a;Scd=new Ycd(ole,0);Acd=new Ycd(xle,1);zcd=new Ycd(yle,2);Rcd=new Ycd(zle,3);Tcd=new Ycd(Ale,4);Fcd=(mmb(),new zob((a=BD(gdb(F1),9),new xqb(a,BD(_Bb(a,a.length),9),0))));Gcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[])));Bcd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[])));Ocd=Up(qqb(Rcd,OC(GC(F1,1),bne,61,0,[])));Qcd=Up(qqb(Tcd,OC(GC(F1,1),bne,61,0,[])));Lcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Rcd])));Ecd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Tcd])));Ncd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Tcd])));Hcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd])));Pcd=Up(qqb(Rcd,OC(GC(F1,1),bne,61,0,[Tcd])));Ccd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Rcd])));Kcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Tcd])));Dcd=Up(qqb(zcd,OC(GC(F1,1),bne,61,0,[Rcd,Tcd])));Mcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[Rcd,Tcd])));Icd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Rcd])));Jcd=Up(qqb(Acd,OC(GC(F1,1),bne,61,0,[zcd,Rcd,Tcd])))} +function fSc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;if(b.b!=0){n=new Psb;h=null;o=null;d=QD($wnd.Math.floor($wnd.Math.log(b.b)*$wnd.Math.LOG10E)+1);i=0;for(t=Jsb(b,0);t.b!=t.d.c;){r=BD(Xsb(t),86);if(PD(o)!==PD(vNb(r,(mTc(),$Sc)))){o=GD(vNb(r,$Sc));i=0}o!=null?(h=o+iSc(i++,d)):(h=iSc(i++,d));yNb(r,$Sc,h);for(q=(e=Jsb((new ZRc(r)).a.d,0),new aSc(e));Wsb(q.a);){p=BD(Xsb(q.a),188).c;Gsb(n,p,n.c.b,n.c);yNb(p,$Sc,h)}}m=new Lqb;for(g=0;g=i){sCb(r.b>0);r.a.Xb(r.c=--r.b);break}else if(p.a>j){if(!e){Ekb(p.b,l);p.c=$wnd.Math.min(p.c,j);p.a=$wnd.Math.max(p.a,i);e=p}else{Gkb(e.b,p.b);e.a=$wnd.Math.max(e.a,p.a);uib(r)}}}if(!e){e=new TCc;e.c=j;e.a=i;Aib(r,e);Ekb(e.b,l)}}h=b.b;k=0;for(q=new olb(d);q.ah?1:0}if(a.b){a.b._b(f)&&(e=BD(a.b.xc(f),19).a);a.b._b(i)&&(h=BD(a.b.xc(i),19).a)}return eh?1:0}return b.e.c.length!=0&&c.g.c.length!=0?1:-1} +function acc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A;Odd(b,Ine,1);p=new Rkb;w=new Rkb;for(j=new olb(a.b);j.a0&&(t-=n);h_b(g,t);k=0;for(m=new olb(g.a);m.a0);h.a.Xb(h.c=--h.b)}i=0.4*d*k;!f&&h.bb.d.c){n=a.c[b.a.d];q=a.c[l.a.d];if(n==q){continue}AFb(DFb(CFb(EFb(BFb(new FFb,1),100),n),q))}}}}}}} +function QEd(a){IEd();var b,c,d,e,f,g,h,i;if(a==null)return null;e=hfb(a,wfb(37));if(e<0){return a}else{i=new Wfb(a.substr(0,e));b=KC(SD,wte,25,4,15,1);h=0;d=0;for(g=a.length;ee+2&&_Ed((BCb(e+1,a.length),a.charCodeAt(e+1)),xEd,yEd)&&_Ed((BCb(e+2,a.length),a.charCodeAt(e+2)),xEd,yEd)){c=dFd((BCb(e+1,a.length),a.charCodeAt(e+1)),(BCb(e+2,a.length),a.charCodeAt(e+2)));e+=2;if(d>0){(c&192)==128?(b[h++]=c<<24>>24):(d=0)}else if(c>=128){if((c&224)==192){b[h++]=c<<24>>24;d=2}else if((c&240)==224){b[h++]=c<<24>>24;d=3}else if((c&248)==240){b[h++]=c<<24>>24;d=4}}if(d>0){if(h==d){switch(h){case 2:{Kfb(i,((b[0]&31)<<6|b[1]&63)&aje);break}case 3:{Kfb(i,((b[0]&15)<<12|(b[1]&63)<<6|b[2]&63)&aje);break}}h=0;d=0}}else{for(f=0;f0){if(g+d>a.length){return false}h=rA(a.substr(0,g+d),b)}else{h=rA(a,b)}}switch(f){case 71:h=oA(a,g,OC(GC(ZI,1),nie,2,6,[pje,qje]),b);e.e=h;return true;case 77:return zA(a,b,e,h,g);case 76:return BA(a,b,e,h,g);case 69:return xA(a,b,g,e);case 99:return AA(a,b,g,e);case 97:h=oA(a,g,OC(GC(ZI,1),nie,2,6,['AM','PM']),b);e.b=h;return true;case 121:return DA(a,b,g,h,c,e);case 100:if(h<=0){return false}e.c=h;return true;case 83:if(h<0){return false}return yA(h,g,b[0],e);case 104:h==12&&(h=0);case 75:case 72:if(h<0){return false}e.f=h;e.g=false;return true;case 107:if(h<0){return false}e.f=h;e.g=true;return true;case 109:if(h<0){return false}e.j=h;return true;case 115:if(h<0){return false}e.n=h;return true;case 90:if(gw&&(o.c=w-o.b);Ekb(g.d,new BLb(o,bLb(g,o)));s=b==Acd?$wnd.Math.max(s,p.b+j.b.rf().b):$wnd.Math.min(s,p.b)}s+=b==Acd?a.t:-a.t;t=cLb((g.e=s,g));t>0&&(BD(Mpb(a.b,b),124).a.b=t);for(k=m.Kc();k.Ob();){j=BD(k.Pb(),111);if(!j.c||j.c.d.c.length<=0){continue}o=j.c.i;o.c-=j.e.a;o.d-=j.e.b}} +function SPb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;b=new Lqb;for(i=new Fyd(a);i.e!=i.i.gc();){h=BD(Dyd(i),33);c=new Tqb;Rhb(OPb,h,c);n=new aQb;e=BD(GAb(new YAb(null,new Lub(new Sr(ur($sd(h).a.Kc(),new Sq)))),Wyb(n,Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[(Fyb(),Dyb)])))),83);RPb(c,BD(e.xc((Bcb(),true)),14),new cQb);d=BD(GAb(JAb(BD(e.xc(false),15).Lc(),new eQb),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb]))),15);for(g=d.Kc();g.Ob();){f=BD(g.Pb(),79);m=ktd(f);if(m){j=BD(Wd(irb(b.f,m)),21);if(!j){j=UPb(m);jrb(b.f,m,j)}ye(c,j)}}e=BD(GAb(new YAb(null,new Lub(new Sr(ur(_sd(h).a.Kc(),new Sq)))),Wyb(n,Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb])))),83);RPb(c,BD(e.xc(true),14),new gQb);d=BD(GAb(JAb(BD(e.xc(false),15).Lc(),new iQb),Byb(new fzb,new dzb,new Ezb,OC(GC(xL,1),Kie,132,0,[Dyb]))),15);for(l=d.Kc();l.Ob();){k=BD(l.Pb(),79);m=mtd(k);if(m){j=BD(Wd(irb(b.f,m)),21);if(!j){j=UPb(m);jrb(b.f,m,j)}ye(c,j)}}}} +function rhb(a,b){phb();var c,d,e,f,g,h,i,j,k,l,m,n,o,p;i=ybb(a,0)<0;i&&(a=Jbb(a));if(ybb(a,0)==0){switch(b){case 0:return '0';case 1:return $je;case 2:return '0.00';case 3:return '0.000';case 4:return '0.0000';case 5:return '0.00000';case 6:return '0.000000';default:n=new Ufb;b<0?(n.a+='0E+',n):(n.a+='0E',n);n.a+=b==Rie?'2147483648':''+-b;return n.a;}}k=18;l=KC(TD,$ie,25,k+1,15,1);c=k;p=a;do{j=p;p=Abb(p,10);l[--c]=Tbb(wbb(48,Qbb(j,Ibb(p,10))))&aje}while(ybb(p,0)!=0);e=Qbb(Qbb(Qbb(k,c),b),1);if(b==0){i&&(l[--c]=45);return zfb(l,c,k-c)}if(b>0&&ybb(e,-6)>=0){if(ybb(e,0)>=0){f=c+Tbb(e);for(h=k-1;h>=f;h--){l[h+1]=l[h]}l[++f]=46;i&&(l[--c]=45);return zfb(l,c,k-c+1)}for(g=2;Gbb(g,wbb(Jbb(e),1));g++){l[--c]=48}l[--c]=46;l[--c]=48;i&&(l[--c]=45);return zfb(l,c,k-c)}o=c+1;d=k;m=new Vfb;i&&(m.a+='-',m);if(d-o>=1){Kfb(m,l[c]);m.a+='.';m.a+=zfb(l,c+1,k-c-1)}else{m.a+=zfb(l,c,k-c)}m.a+='E';ybb(e,0)>0&&(m.a+='+',m);m.a+=''+Ubb(e);return m.a} +function iQc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;a.e.a.$b();a.f.a.$b();a.c.c=KC(SI,Uhe,1,0,5,1);a.i.c=KC(SI,Uhe,1,0,5,1);a.g.a.$b();if(b){for(g=new olb(b.a);g.a=1){if(v-j>0&&o>=0){dld(l,l.i+u);eld(l,l.j+i*j)}else if(v-j<0&&n>=0){dld(l,l.i+u*v);eld(l,l.j+i)}}}}jkd(a,(Y9c(),Y8c),(tdd(),f=BD(gdb(I1),9),new xqb(f,BD(_Bb(f,f.length),9),0)));return new f7c(w,k)} +function Yfd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o;n=Xod(atd(BD(qud((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b),0),82)));o=Xod(atd(BD(qud((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c),0),82)));l=n==o;h=new d7c;b=BD(hkd(a,(Zad(),Sad)),74);if(!!b&&b.b>=2){if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i==0){c=(Fhd(),e=new rmd,e);wtd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),c)}else if((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a).i>1){m=new Oyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));while(m.e!=m.i.gc()){Eyd(m)}}ifd(b,BD(qud((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),0),202))}if(l){for(d=new Fyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));d.e!=d.i.gc();){c=BD(Dyd(d),202);for(j=new Fyd((!c.a&&(c.a=new xMd(y2,c,5)),c.a));j.e!=j.i.gc();){i=BD(Dyd(j),469);h.a=$wnd.Math.max(h.a,i.a);h.b=$wnd.Math.max(h.b,i.b)}}}for(g=new Fyd((!a.n&&(a.n=new cUd(D2,a,1,7)),a.n));g.e!=g.i.gc();){f=BD(Dyd(g),137);k=BD(hkd(f,Yad),8);!!k&&bld(f,k.a,k.b);if(l){h.a=$wnd.Math.max(h.a,f.i+f.g);h.b=$wnd.Math.max(h.b,f.j+f.f)}}return h} +function yMc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;t=b.c.length;e=new ULc(a.a,c,null,null);B=KC(UD,Vje,25,t,15,1);p=KC(UD,Vje,25,t,15,1);o=KC(UD,Vje,25,t,15,1);q=0;for(h=0;hB[i]&&(q=i);for(l=new olb(a.a.b);l.an){if(f){Fsb(w,m);Fsb(B,meb(j.b-1))}H=c.b;I+=m+b;m=0;k=$wnd.Math.max(k,c.b+c.c+G)}dld(h,H);eld(h,I);k=$wnd.Math.max(k,H+G+c.c);m=$wnd.Math.max(m,l);H+=G+b}k=$wnd.Math.max(k,d);F=I+m+c.a;if(Fqme;C=$wnd.Math.abs(m.b-o.b)>qme;(!c&&B&&C||c&&(B||C))&&Dsb(q.a,u)}ye(q.a,d);d.b==0?(m=u):(m=(sCb(d.b!=0),BD(d.c.b.c,8)));bZb(n,l,p);if(AZb(e)==A){if(Q_b(A.i)!=e.a){p=new d7c;Y$b(p,Q_b(A.i),s)}yNb(q,utc,p)}cZb(n,q,s);k.a.zc(n,k)}QZb(q,v);RZb(q,A)}for(j=k.a.ec().Kc();j.Ob();){i=BD(j.Pb(),17);QZb(i,null);RZb(i,null)}Qdd(b)} +function KQb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;if(a.gc()==1){return BD(a.Xb(0),231)}else if(a.gc()<=0){return new kRb}for(e=a.Kc();e.Ob();){c=BD(e.Pb(),231);o=0;k=Ohe;l=Ohe;i=Rie;j=Rie;for(n=new olb(c.e);n.ah){t=0;u+=g+r;g=0}JQb(p,c,t,u);b=$wnd.Math.max(b,t+q.a);g=$wnd.Math.max(g,q.b);t+=q.a+r}return p} +function Ioc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;k=new s7c;switch(a.a.g){case 3:m=BD(vNb(b.e,(wtc(),rtc)),15);n=BD(vNb(b.j,rtc),15);o=BD(vNb(b.f,rtc),15);c=BD(vNb(b.e,ptc),15);d=BD(vNb(b.j,ptc),15);e=BD(vNb(b.f,ptc),15);g=new Rkb;Gkb(g,m);n.Jc(new Loc);Gkb(g,JD(n,152)?km(BD(n,152)):JD(n,131)?BD(n,131).a:JD(n,54)?new ov(n):new dv(n));Gkb(g,o);f=new Rkb;Gkb(f,c);Gkb(f,JD(d,152)?km(BD(d,152)):JD(d,131)?BD(d,131).a:JD(d,54)?new ov(d):new dv(d));Gkb(f,e);yNb(b.f,rtc,g);yNb(b.f,ptc,f);yNb(b.f,stc,b.f);yNb(b.e,rtc,null);yNb(b.e,ptc,null);yNb(b.j,rtc,null);yNb(b.j,ptc,null);break;case 1:ye(k,b.e.a);Dsb(k,b.i.n);ye(k,Su(b.j.a));Dsb(k,b.a.n);ye(k,b.f.a);break;default:ye(k,b.e.a);ye(k,Su(b.j.a));ye(k,b.f.a);}Osb(b.f.a);ye(b.f.a,k);QZb(b.f,b.e.c);h=BD(vNb(b.e,(Nyc(),jxc)),74);j=BD(vNb(b.j,jxc),74);i=BD(vNb(b.f,jxc),74);if(!!h||!!j||!!i){l=new s7c;Goc(l,i);Goc(l,j);Goc(l,h);yNb(b.f,jxc,l)}QZb(b.j,null);RZb(b.j,null);QZb(b.e,null);RZb(b.e,null);$_b(b.a,null);$_b(b.i,null);!!b.g&&Ioc(a,b.g)} +function bde(a){ade();var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;if(a==null)return null;f=rfb(a);o=ede(f);if(o%4!=0){return null}p=o/4|0;if(p==0)return KC(SD,wte,25,0,15,1);l=null;b=0;c=0;d=0;e=0;g=0;h=0;i=0;j=0;n=0;m=0;k=0;l=KC(SD,wte,25,p*3,15,1);for(;n>4)<<24>>24;l[m++]=((c&15)<<4|d>>2&15)<<24>>24;l[m++]=(d<<6|e)<<24>>24}if(!dde(g=f[k++])||!dde(h=f[k++])){return null}b=$ce[g];c=$ce[h];i=f[k++];j=f[k++];if($ce[i]==-1||$ce[j]==-1){if(i==61&&j==61){if((c&15)!=0)return null;q=KC(SD,wte,25,n*3+1,15,1);$fb(l,0,q,0,n*3);q[m]=(b<<2|c>>4)<<24>>24;return q}else if(i!=61&&j==61){d=$ce[i];if((d&3)!=0)return null;q=KC(SD,wte,25,n*3+2,15,1);$fb(l,0,q,0,n*3);q[m++]=(b<<2|c>>4)<<24>>24;q[m]=((c&15)<<4|d>>2&15)<<24>>24;return q}else{return null}}else{d=$ce[i];e=$ce[j];l[m++]=(b<<2|c>>4)<<24>>24;l[m++]=((c&15)<<4|d>>2&15)<<24>>24;l[m++]=(d<<6|e)<<24>>24}return l} +function Sbc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;Odd(b,Ine,1);o=BD(vNb(a,(Nyc(),Swc)),218);for(e=new olb(a.b);e.a=2){p=true;m=new olb(f.j);c=BD(mlb(m),11);n=null;while(m.a0){e=BD(Ikb(q.c.a,w-1),10);g=a.i[e.p];B=$wnd.Math.ceil(jBc(a.n,e,q));f=v.a.e-q.d.d-(g.a.e+e.o.b+e.d.a)-B}j=Pje;if(w0&&A.a.e.e-A.a.a-(A.b.e.e-A.b.a)<0;o=t.a.e.e-t.a.a-(t.b.e.e-t.b.a)<0&&A.a.e.e-A.a.a-(A.b.e.e-A.b.a)>0;n=t.a.e.e+t.b.aA.b.e.e+A.a.a;u=0;!p&&!o&&(m?f+l>0?(u=l):j-d>0&&(u=d):n&&(f+h>0?(u=h):j-s>0&&(u=s)));v.a.e+=u;v.b&&(v.d.e+=u);return false} +function XGb(a,b,c){var d,e,f,g,h,i,j,k,l,m;d=new J6c(b.qf().a,b.qf().b,b.rf().a,b.rf().b);e=new I6c;if(a.c){for(g=new olb(b.wf());g.aj&&(d.a+=yfb(KC(TD,$ie,25,-j,15,1)));d.a+='Is';if(hfb(i,wfb(32))>=0){for(e=0;e=d.o.b/2}else{s=!l}if(s){r=BD(vNb(d,(wtc(),vtc)),15);if(!r){f=new Rkb;yNb(d,vtc,f)}else if(m){f=r}else{e=BD(vNb(d,tsc),15);if(!e){f=new Rkb;yNb(d,tsc,f)}else{r.gc()<=e.gc()?(f=r):(f=e)}}}else{e=BD(vNb(d,(wtc(),tsc)),15);if(!e){f=new Rkb;yNb(d,tsc,f)}else if(l){f=e}else{r=BD(vNb(d,vtc),15);if(!r){f=new Rkb;yNb(d,vtc,f)}else{e.gc()<=r.gc()?(f=e):(f=r)}}}f.Fc(a);yNb(a,(wtc(),vsc),c);if(b.d==c){RZb(b,null);c.e.c.length+c.g.c.length==0&&F0b(c,null);d3b(c)}else{QZb(b,null);c.e.c.length+c.g.c.length==0&&F0b(c,null)}Osb(b.a)} +function aoc(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;s=new Bib(a.b,0);k=b.Kc();o=0;j=BD(k.Pb(),19).a;v=0;c=new Tqb;A=new zsb;while(s.b=a.a){d=E6b(a,s);k=$wnd.Math.max(k,d.b);u=$wnd.Math.max(u,d.d);Ekb(h,new vgd(s,d))}}B=new Rkb;for(j=0;j0),q.a.Xb(q.c=--q.b),C=new H1b(a.b),Aib(q,C),sCb(q.b0){j=0;!!q&&(j+=h);j+=(C-1)*g;!!t&&(j+=h);B&&!!t&&(j=$wnd.Math.max(j,jQc(t,g,s,A)));if(j0){m=k<100?null:new Ixd(k);j=new Aud(b);o=j.g;r=KC(WD,oje,25,k,15,1);d=0;u=new zud(k);for(e=0;e=0;){if(n!=null?pb(n,o[i]):PD(n)===PD(o[i])){if(r.length<=d){q=r;r=KC(WD,oje,25,2*r.length,15,1);$fb(q,0,r,0,d)}r[d++]=e;wtd(u,o[i]);break v}}n=n;if(PD(n)===PD(h)){break}}}j=u;o=u.g;k=d;if(d>r.length){q=r;r=KC(WD,oje,25,d,15,1);$fb(q,0,r,0,d)}if(d>0){t=true;for(f=0;f=0;){tud(a,r[g])}if(d!=k){for(e=k;--e>=d;){tud(j,e)}q=r;r=KC(WD,oje,25,d,15,1);$fb(q,0,r,0,d)}b=j}}}else{b=Ctd(a,b);for(e=a.i;--e>=0;){if(b.Hc(a.g[e])){tud(a,e);t=true}}}if(t){if(r!=null){c=b.gc();l=c==1?FLd(a,4,b.Kc().Pb(),null,r[0],p):FLd(a,6,b,r,r[0],p);m=c<100?null:new Ixd(c);for(e=b.Kc();e.Ob();){n=e.Pb();m=Q2d(a,BD(n,72),m)}if(!m){Uhd(a.e,l)}else{m.Ei(l);m.Fi()}}else{m=Vxd(b.gc());for(e=b.Kc();e.Ob();){n=e.Pb();m=Q2d(a,BD(n,72),m)}!!m&&m.Fi()}return true}else{return false}} +function fYb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;c=new mYb(b);c.a||$Xb(b);j=ZXb(b);i=new Hp;q=new AYb;for(p=new olb(b.a);p.a0||c.o==dMc&&e0){l=BD(Ikb(m.c.a,g-1),10);B=jBc(a.b,m,l);q=m.n.b-m.d.d-(l.n.b+l.o.b+l.d.a+B)}else{q=m.n.b-m.d.d}j=$wnd.Math.min(q,j);if(gg?Anc(a,b,c):Anc(a,c,b);return eg?1:0}}d=BD(vNb(b,(wtc(),Zsc)),19).a;f=BD(vNb(c,Zsc),19).a;d>f?Anc(a,b,c):Anc(a,c,b);return df?1:0} +function u2c(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;if(Ccb(DD(hkd(b,(Y9c(),d9c))))){return mmb(),mmb(),jmb}j=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i!=0;l=s2c(b);k=!l.dc();if(j||k){e=BD(hkd(b,F9c),149);if(!e){throw vbb(new y2c('Resolved algorithm is not set; apply a LayoutAlgorithmResolver before computing layout.'))}s=D3c(e,(Csd(),ysd));q2c(b);if(!j&&k&&!s){return mmb(),mmb(),jmb}i=new Rkb;if(PD(hkd(b,J8c))===PD((hbd(),ebd))&&(D3c(e,vsd)||D3c(e,usd))){n=p2c(a,b);o=new Psb;ye(o,(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));while(o.b!=0){m=BD(o.b==0?null:(sCb(o.b!=0),Nsb(o,o.a.a)),33);q2c(m);r=PD(hkd(m,J8c))===PD(gbd);if(r||ikd(m,o8c)&&!C3c(e,hkd(m,F9c))){h=u2c(a,m,c,d);Gkb(i,h);jkd(m,J8c,gbd);hfd(m)}else{ye(o,(!m.a&&(m.a=new cUd(E2,m,10,11)),m.a))}}}else{n=(!b.a&&(b.a=new cUd(E2,b,10,11)),b.a).i;for(g=new Fyd((!b.a&&(b.a=new cUd(E2,b,10,11)),b.a));g.e!=g.i.gc();){f=BD(Dyd(g),33);h=u2c(a,f,c,d);Gkb(i,h);hfd(f)}}for(q=new olb(i);q.a=0?(n=Zcd(h)):(n=Wcd(Zcd(h)));a.Ye($xc,n)}j=new d7c;m=false;if(a.Xe(Txc)){a7c(j,BD(a.We(Txc),8));m=true}else{_6c(j,g.a/2,g.b/2)}switch(n.g){case 4:yNb(k,mxc,(Ctc(),ytc));yNb(k,Bsc,(Gqc(),Fqc));k.o.b=g.b;p<0&&(k.o.a=-p);G0b(l,(Ucd(),zcd));m||(j.a=g.a);j.a-=g.a;break;case 2:yNb(k,mxc,(Ctc(),Atc));yNb(k,Bsc,(Gqc(),Dqc));k.o.b=g.b;p<0&&(k.o.a=-p);G0b(l,(Ucd(),Tcd));m||(j.a=0);break;case 1:yNb(k,Osc,(esc(),dsc));k.o.a=g.a;p<0&&(k.o.b=-p);G0b(l,(Ucd(),Rcd));m||(j.b=g.b);j.b-=g.b;break;case 3:yNb(k,Osc,(esc(),bsc));k.o.a=g.a;p<0&&(k.o.b=-p);G0b(l,(Ucd(),Acd));m||(j.b=0);}a7c(l.n,j);yNb(k,Txc,j);if(b==Zbd||b==_bd||b==$bd){o=0;if(b==Zbd&&a.Xe(Wxc)){switch(n.g){case 1:case 2:o=BD(a.We(Wxc),19).a;break;case 3:case 4:o=-BD(a.We(Wxc),19).a;}}else{switch(n.g){case 4:case 2:o=f.b;b==_bd&&(o/=e.b);break;case 1:case 3:o=f.a;b==_bd&&(o/=e.a);}}yNb(k,htc,o)}yNb(k,Hsc,n);return k} +function AGc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C;c=Edb(ED(vNb(a.a.j,(Nyc(),Ewc))));if(c<-1||!a.a.i||ecd(BD(vNb(a.a.o,Vxc),98))||V_b(a.a.o,(Ucd(),zcd)).gc()<2&&V_b(a.a.o,Tcd).gc()<2){return true}if(a.a.c.Rf()){return false}v=0;u=0;t=new Rkb;for(i=a.a.e,j=0,k=i.length;j=c} +function ovd(){mvd();function h(f){var g=this;this.dispatch=function(a){var b=a.data;switch(b.cmd){case 'algorithms':var c=pvd((mmb(),new lnb(new $ib(lvd.b))));f.postMessage({id:b.id,data:c});break;case 'categories':var d=pvd((mmb(),new lnb(new $ib(lvd.c))));f.postMessage({id:b.id,data:d});break;case 'options':var e=pvd((mmb(),new lnb(new $ib(lvd.d))));f.postMessage({id:b.id,data:e});break;case 'register':svd(b.algorithms);f.postMessage({id:b.id});break;case 'layout':qvd(b.graph,b.layoutOptions||{},b.options||{});f.postMessage({id:b.id,data:b.graph});break;}};this.saveDispatch=function(b){try{g.dispatch(b)}catch(a){f.postMessage({id:b.data.id,error:a})}}} +function j(b){var c=this;this.dispatcher=new h({postMessage:function(a){c.onmessage({data:a})}});this.postMessage=function(a){setTimeout(function(){c.dispatcher.saveDispatch({data:a})},0)}} +if(typeof document===uke&&typeof self!==uke){var i=new h(self);self.onmessage=i.saveDispatch}else if(typeof module!==uke&&module.exports){Object.defineProperty(exports,'__esModule',{value:true});module.exports={'default':j,Worker:j}}} +function aae(a){if(a.N)return;a.N=true;a.b=Lnd(a,0);Knd(a.b,0);Knd(a.b,1);Knd(a.b,2);a.bb=Lnd(a,1);Knd(a.bb,0);Knd(a.bb,1);a.fb=Lnd(a,2);Knd(a.fb,3);Knd(a.fb,4);Qnd(a.fb,5);a.qb=Lnd(a,3);Knd(a.qb,0);Qnd(a.qb,1);Qnd(a.qb,2);Knd(a.qb,3);Knd(a.qb,4);Qnd(a.qb,5);Knd(a.qb,6);a.a=Mnd(a,4);a.c=Mnd(a,5);a.d=Mnd(a,6);a.e=Mnd(a,7);a.f=Mnd(a,8);a.g=Mnd(a,9);a.i=Mnd(a,10);a.j=Mnd(a,11);a.k=Mnd(a,12);a.n=Mnd(a,13);a.o=Mnd(a,14);a.p=Mnd(a,15);a.q=Mnd(a,16);a.s=Mnd(a,17);a.r=Mnd(a,18);a.t=Mnd(a,19);a.u=Mnd(a,20);a.v=Mnd(a,21);a.w=Mnd(a,22);a.B=Mnd(a,23);a.A=Mnd(a,24);a.C=Mnd(a,25);a.D=Mnd(a,26);a.F=Mnd(a,27);a.G=Mnd(a,28);a.H=Mnd(a,29);a.J=Mnd(a,30);a.I=Mnd(a,31);a.K=Mnd(a,32);a.M=Mnd(a,33);a.L=Mnd(a,34);a.P=Mnd(a,35);a.Q=Mnd(a,36);a.R=Mnd(a,37);a.S=Mnd(a,38);a.T=Mnd(a,39);a.U=Mnd(a,40);a.V=Mnd(a,41);a.X=Mnd(a,42);a.W=Mnd(a,43);a.Y=Mnd(a,44);a.Z=Mnd(a,45);a.$=Mnd(a,46);a._=Mnd(a,47);a.ab=Mnd(a,48);a.cb=Mnd(a,49);a.db=Mnd(a,50);a.eb=Mnd(a,51);a.gb=Mnd(a,52);a.hb=Mnd(a,53);a.ib=Mnd(a,54);a.jb=Mnd(a,55);a.kb=Mnd(a,56);a.lb=Mnd(a,57);a.mb=Mnd(a,58);a.nb=Mnd(a,59);a.ob=Mnd(a,60);a.pb=Mnd(a,61)} +function f5b(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;s=0;if(b.f.a==0){for(q=new olb(a);q.aj&&(tCb(j,b.c.length),BD(b.c[j],200)).a.c.length==0){Lkb(b,(tCb(j,b.c.length),b.c[j]))}}if(!i){--f;continue}if(uZc(b,k,e,i,m,c,j,d)){l=true;continue}if(m){if(vZc(b,k,e,i,c,j,d)){l=true;continue}else if(wZc(k,e)){e.c=true;l=true;continue}}else if(wZc(k,e)){e.c=true;l=true;continue}if(l){continue}}if(wZc(k,e)){e.c=true;l=true;!!i&&(i.k=false);continue}else{a$c(e.q)}}return l} +function fed(a,b,c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I;p=0;D=0;for(j=new olb(a.b);j.ap){if(f){Fsb(w,n);Fsb(B,meb(k.b-1));Ekb(a.d,o);h.c=KC(SI,Uhe,1,0,5,1)}H=c.b;I+=n+b;n=0;l=$wnd.Math.max(l,c.b+c.c+G)}h.c[h.c.length]=i;ued(i,H,I);l=$wnd.Math.max(l,H+G+c.c);n=$wnd.Math.max(n,m);H+=G+b;o=i}Gkb(a.a,h);Ekb(a.d,BD(Ikb(h,h.c.length-1),157));l=$wnd.Math.max(l,d);F=I+n+c.a;if(F1&&(g=$wnd.Math.min(g,$wnd.Math.abs(BD(Ut(h.a,1),8).b-k.b)))}}}}}else{for(p=new olb(b.j);p.ae){f=m.a-e;g=Ohe;d.c=KC(SI,Uhe,1,0,5,1);e=m.a}if(m.a>=e){d.c[d.c.length]=h;h.a.b>1&&(g=$wnd.Math.min(g,$wnd.Math.abs(BD(Ut(h.a,h.a.b-2),8).b-m.b)))}}}}}if(d.c.length!=0&&f>b.o.a/2&&g>b.o.b/2){n=new H0b;F0b(n,b);G0b(n,(Ucd(),Acd));n.n.a=b.o.a/2;r=new H0b;F0b(r,b);G0b(r,Rcd);r.n.a=b.o.a/2;r.n.b=b.o.b;for(i=new olb(d);i.a=j.b?QZb(h,r):QZb(h,n)}else{j=BD(Msb(h.a),8);q=h.a.b==0?A0b(h.c):BD(Isb(h.a),8);q.b>=j.b?RZb(h,r):RZb(h,n)}l=BD(vNb(h,(Nyc(),jxc)),74);!!l&&ze(l,j,true)}b.n.a=e-b.o.a/2}} +function erd(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K;D=null;G=b;F=Rqd(a,dtd(c),G);Lkd(F,_pd(G,Vte));H=BD(oo(a.g,Vpd(aC(G,Cte))),33);m=aC(G,'sourcePort');d=null;!!m&&(d=Vpd(m));I=BD(oo(a.j,d),118);if(!H){h=Wpd(G);o="An edge must have a source node (edge id: '"+h;p=o+$te;throw vbb(new cqd(p))}if(!!I&&!Hb(mpd(I),H)){i=_pd(G,Vte);q="The source port of an edge must be a port of the edge's source node (edge id: '"+i;r=q+$te;throw vbb(new cqd(r))}B=(!F.b&&(F.b=new y5d(z2,F,4,7)),F.b);f=null;I?(f=I):(f=H);wtd(B,f);J=BD(oo(a.g,Vpd(aC(G,bue))),33);n=aC(G,'targetPort');e=null;!!n&&(e=Vpd(n));K=BD(oo(a.j,e),118);if(!J){l=Wpd(G);s="An edge must have a target node (edge id: '"+l;t=s+$te;throw vbb(new cqd(t))}if(!!K&&!Hb(mpd(K),J)){j=_pd(G,Vte);u="The target port of an edge must be a port of the edge's target node (edge id: '"+j;v=u+$te;throw vbb(new cqd(v))}C=(!F.c&&(F.c=new y5d(z2,F,5,8)),F.c);g=null;K?(g=K):(g=J);wtd(C,g);if((!F.b&&(F.b=new y5d(z2,F,4,7)),F.b).i==0||(!F.c&&(F.c=new y5d(z2,F,5,8)),F.c).i==0){k=_pd(G,Vte);w=Zte+k;A=w+$te;throw vbb(new cqd(A))}grd(G,F);frd(G,F);D=crd(a,G,F);return D} +function DXb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D;l=FXb(zXb(a,(Ucd(),Fcd)),b);o=EXb(zXb(a,Gcd),b);u=EXb(zXb(a,Ocd),b);B=GXb(zXb(a,Qcd),b);m=GXb(zXb(a,Bcd),b);s=EXb(zXb(a,Ncd),b);p=EXb(zXb(a,Hcd),b);w=EXb(zXb(a,Pcd),b);v=EXb(zXb(a,Ccd),b);C=GXb(zXb(a,Ecd),b);r=EXb(zXb(a,Lcd),b);t=EXb(zXb(a,Kcd),b);A=EXb(zXb(a,Dcd),b);D=GXb(zXb(a,Mcd),b);n=GXb(zXb(a,Icd),b);q=EXb(zXb(a,Jcd),b);c=w6c(OC(GC(UD,1),Vje,25,15,[s.a,B.a,w.a,D.a]));d=w6c(OC(GC(UD,1),Vje,25,15,[o.a,l.a,u.a,q.a]));e=r.a;f=w6c(OC(GC(UD,1),Vje,25,15,[p.a,m.a,v.a,n.a]));j=w6c(OC(GC(UD,1),Vje,25,15,[s.b,o.b,p.b,t.b]));i=w6c(OC(GC(UD,1),Vje,25,15,[B.b,l.b,m.b,q.b]));k=C.b;h=w6c(OC(GC(UD,1),Vje,25,15,[w.b,u.b,v.b,A.b]));vXb(zXb(a,Fcd),c+e,j+k);vXb(zXb(a,Jcd),c+e,j+k);vXb(zXb(a,Gcd),c+e,0);vXb(zXb(a,Ocd),c+e,j+k+i);vXb(zXb(a,Qcd),0,j+k);vXb(zXb(a,Bcd),c+e+d,j+k);vXb(zXb(a,Hcd),c+e+d,0);vXb(zXb(a,Pcd),0,j+k+i);vXb(zXb(a,Ccd),c+e+d,j+k+i);vXb(zXb(a,Ecd),0,j);vXb(zXb(a,Lcd),c,0);vXb(zXb(a,Dcd),0,j+k+i);vXb(zXb(a,Icd),c+e+d,0);g=new d7c;g.a=w6c(OC(GC(UD,1),Vje,25,15,[c+d+e+f,C.a,t.a,A.a]));g.b=w6c(OC(GC(UD,1),Vje,25,15,[j+i+k+h,r.b,D.b,n.b]));return g} +function Ngc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;p=new Rkb;for(m=new olb(a.d.b);m.ae.d.d+e.d.a){k.f.d=true}else{k.f.d=true;k.f.a=true}}}d.b!=d.d.c&&(b=c)}if(k){f=BD(Ohb(a.f,g.d.i),57);if(b.bf.d.d+f.d.a){k.f.d=true}else{k.f.d=true;k.f.a=true}}}}for(h=new Sr(ur(R_b(n).a.Kc(),new Sq));Qr(h);){g=BD(Rr(h),17);if(g.a.b!=0){b=BD(Isb(g.a),8);if(g.d.j==(Ucd(),Acd)){q=new hic(b,new f7c(b.a,e.d.d),e,g);q.f.a=true;q.a=g.d;p.c[p.c.length]=q}if(g.d.j==Rcd){q=new hic(b,new f7c(b.a,e.d.d+e.d.a),e,g);q.f.d=true;q.a=g.d;p.c[p.c.length]=q}}}}}return p} +function WJc(a,b,c){var d,e,f,g,h,i,j,k,l;Odd(c,'Network simplex node placement',1);a.e=b;a.n=BD(vNb(b,(wtc(),otc)),304);VJc(a);HJc(a);MAb(LAb(new YAb(null,new Kub(a.e.b,16)),new KKc),new MKc(a));MAb(JAb(LAb(JAb(LAb(new YAb(null,new Kub(a.e.b,16)),new zLc),new BLc),new DLc),new FLc),new IKc(a));if(Ccb(DD(vNb(a.e,(Nyc(),Axc))))){g=Udd(c,1);Odd(g,'Straight Edges Pre-Processing',1);UJc(a);Qdd(g)}JFb(a.f);f=BD(vNb(b,Ayc),19).a*a.f.a.c.length;uGb(HGb(IGb(LGb(a.f),f),false),Udd(c,1));if(a.d.a.gc()!=0){g=Udd(c,1);Odd(g,'Flexible Where Space Processing',1);h=BD(Btb(RAb(NAb(new YAb(null,new Kub(a.f.a,16)),new OKc),new iKc)),19).a;i=BD(Btb(QAb(NAb(new YAb(null,new Kub(a.f.a,16)),new QKc),new mKc)),19).a;j=i-h;k=nGb(new pGb,a.f);l=nGb(new pGb,a.f);AFb(DFb(CFb(BFb(EFb(new FFb,20000),j),k),l));MAb(JAb(JAb(Plb(a.i),new SKc),new UKc),new WKc(h,k,j,l));for(e=a.d.a.ec().Kc();e.Ob();){d=BD(e.Pb(),213);d.g=1}uGb(HGb(IGb(LGb(a.f),f),false),Udd(g,1));Qdd(g)}if(Ccb(DD(vNb(b,Axc)))){g=Udd(c,1);Odd(g,'Straight Edges Post-Processing',1);TJc(a);Qdd(g)}GJc(a);a.e=null;a.f=null;a.i=null;a.c=null;Uhb(a.k);a.j=null;a.a=null;a.o=null;a.d.a.$b();Qdd(c)} +function lMc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;for(h=new olb(a.a.b);h.a0){d=l.gc();j=QD($wnd.Math.floor((d+1)/2))-1;e=QD($wnd.Math.ceil((d+1)/2))-1;if(b.o==dMc){for(k=e;k>=j;k--){if(b.a[u.p]==u){p=BD(l.Xb(k),46);o=BD(p.a,10);if(!Rqb(c,p.b)&&n>a.b.e[o.p]){b.a[o.p]=u;b.g[u.p]=b.g[o.p];b.a[u.p]=b.g[u.p];b.f[b.g[u.p].p]=(Bcb(),Ccb(b.f[b.g[u.p].p])&u.k==(j0b(),g0b)?true:false);n=a.b.e[o.p]}}}}else{for(k=j;k<=e;k++){if(b.a[u.p]==u){r=BD(l.Xb(k),46);q=BD(r.a,10);if(!Rqb(c,r.b)&&n=o){if(s>o){n.c=KC(SI,Uhe,1,0,5,1);o=s}n.c[n.c.length]=g}}if(n.c.length!=0){m=BD(Ikb(n,Bub(b,n.c.length)),128);F.a.Bc(m)!=null;m.s=p++;AQc(m,C,w);n.c=KC(SI,Uhe,1,0,5,1)}}u=a.c.length+1;for(h=new olb(a);h.aD.s){uib(c);Lkb(D.i,d);if(d.c>0){d.a=D;Ekb(D.t,d);d.b=A;Ekb(A.i,d)}}}}} +function qde(a){var b,c,d,e,f;b=a.c;switch(b){case 11:return a.Ml();case 12:return a.Ol();case 14:return a.Ql();case 15:return a.Tl();case 16:return a.Rl();case 17:return a.Ul();case 21:nde(a);return wfe(),wfe(),ffe;case 10:switch(a.a){case 65:return a.yl();case 90:return a.Dl();case 122:return a.Kl();case 98:return a.El();case 66:return a.zl();case 60:return a.Jl();case 62:return a.Hl();}}f=pde(a);b=a.c;switch(b){case 3:return a.Zl(f);case 4:return a.Xl(f);case 5:return a.Yl(f);case 0:if(a.a==123&&a.d=48&&b<=57){d=b-48;while(e=48&&b<=57){d=d*10+b-48;if(d<0)throw vbb(new mde(tvd((h0d(),bve))))}}else{throw vbb(new mde(tvd((h0d(),Zue))))}c=d;if(b==44){if(e>=a.j){throw vbb(new mde(tvd((h0d(),_ue))))}else if((b=bfb(a.i,e++))>=48&&b<=57){c=b-48;while(e=48&&b<=57){c=c*10+b-48;if(c<0)throw vbb(new mde(tvd((h0d(),bve))))}if(d>c)throw vbb(new mde(tvd((h0d(),ave))))}else{c=-1}}if(b!=125)throw vbb(new mde(tvd((h0d(),$ue))));if(a.sl(e)){f=(wfe(),wfe(),++vfe,new lge(9,f));a.d=e+1}else{f=(wfe(),wfe(),++vfe,new lge(3,f));a.d=e}f.dm(d);f.cm(c);nde(a)}}return f} +function $bc(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F;p=new Skb(b.b);u=new Skb(b.b);m=new Skb(b.b);B=new Skb(b.b);q=new Skb(b.b);for(A=Jsb(b,0);A.b!=A.d.c;){v=BD(Xsb(A),11);for(h=new olb(v.g);h.a0;r=v.g.c.length>0;j&&r?(m.c[m.c.length]=v,true):j?(p.c[p.c.length]=v,true):r&&(u.c[u.c.length]=v,true)}for(o=new olb(p);o.a1){o=new Oyd((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a));while(o.e!=o.i.gc()){Eyd(o)}}g=BD(qud((!a.a&&(a.a=new cUd(A2,a,6,6)),a.a),0),202);q=H;H>v+u?(q=v+u):Hw+p?(r=w+p):Iv-u&&qw-p&&rH+G?(B=H+G):vI+A?(C=I+A):wH-G&&BI-A&&Cc&&(m=c-1);n=N+Cub(b,24)*lke*l-l/2;n<0?(n=1):n>d&&(n=d-1);e=(Fhd(),i=new xkd,i);vkd(e,m);wkd(e,n);wtd((!g.a&&(g.a=new xMd(y2,g,5)),g.a),e)}} +function Nyc(){Nyc=ccb;iyc=(Y9c(),I9c);jyc=J9c;kyc=K9c;lyc=L9c;nyc=M9c;oyc=N9c;ryc=P9c;tyc=R9c;uyc=S9c;syc=Q9c;vyc=T9c;xyc=U9c;zyc=X9c;qyc=O9c;hyc=(jwc(),Bvc);myc=Cvc;pyc=Dvc;wyc=Evc;byc=new Osd(D9c,meb(0));cyc=yvc;dyc=zvc;eyc=Avc;Kyc=awc;Cyc=Hvc;Dyc=Kvc;Gyc=Svc;Eyc=Nvc;Fyc=Pvc;Myc=fwc;Lyc=cwc;Iyc=Yvc;Hyc=Wvc;Jyc=$vc;Cxc=pvc;Dxc=qvc;Xwc=Auc;Ywc=Duc;Lxc=new q0b(12);Kxc=new Osd(f9c,Lxc);Twc=(Aad(),wad);Swc=new Osd(E8c,Twc);Uxc=new Osd(s9c,0);fyc=new Osd(E9c,meb(1));owc=new Osd(r8c,tme);Jxc=d9c;Vxc=t9c;$xc=A9c;Kwc=y8c;mwc=p8c;axc=J8c;gyc=new Osd(H9c,(Bcb(),true));fxc=M8c;gxc=N8c;Fxc=Y8c;Ixc=b9c;Gxc=$8c;Nwc=(ead(),cad);Lwc=new Osd(z8c,Nwc);xxc=W8c;wxc=U8c;Yxc=x9c;Xxc=w9c;Zxc=z9c;Oxc=(Tbd(),Sbd);new Osd(l9c,Oxc);Qxc=o9c;Rxc=p9c;Sxc=q9c;Pxc=n9c;Byc=Gvc;sxc=avc;rxc=$uc;Ayc=Fvc;mxc=Suc;Jwc=muc;Iwc=kuc;Awc=Xtc;Bwc=Ytc;Dwc=buc;Cwc=Ztc;Hwc=iuc;uxc=cvc;vxc=dvc;ixc=Luc;Exc=uvc;zxc=hvc;$wc=Guc;Bxc=nvc;Vwc=wuc;Wwc=yuc;zwc=w8c;yxc=evc;swc=Mtc;rwc=Ktc;qwc=Jtc;cxc=Juc;bxc=Iuc;dxc=Kuc;Hxc=_8c;jxc=Q8c;Zwc=G8c;Qwc=C8c;Pwc=B8c;Ewc=euc;Wxc=v9c;pwc=v8c;exc=L8c;Txc=r9c;Mxc=h9c;Nxc=j9c;oxc=Vuc;pxc=Xuc;ayc=C9c;nwc=Itc;qxc=Zuc;Rwc=suc;Owc=quc;txc=S8c;kxc=Puc;Axc=kvc;yyc=V9c;Mwc=ouc;_xc=wvc;Uwc=uuc;lxc=Ruc;Fwc=guc;hxc=P8c;nxc=Uuc;Gwc=huc;ywc=Vtc;wwc=Stc;uwc=Qtc;vwc=Rtc;xwc=Utc;twc=Otc;_wc=Huc} +function shb(a,b){phb();var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;B=a.e;o=a.d;e=a.a;if(B==0){switch(b){case 0:return '0';case 1:return $je;case 2:return '0.00';case 3:return '0.000';case 4:return '0.0000';case 5:return '0.00000';case 6:return '0.000000';default:w=new Ufb;b<0?(w.a+='0E+',w):(w.a+='0E',w);w.a+=-b;return w.a;}}t=o*10+1+7;u=KC(TD,$ie,25,t+1,15,1);c=t;if(o==1){h=e[0];if(h<0){H=xbb(h,Yje);do{p=H;H=Abb(H,10);u[--c]=48+Tbb(Qbb(p,Ibb(H,10)))&aje}while(ybb(H,0)!=0)}else{H=h;do{p=H;H=H/10|0;u[--c]=48+(p-H*10)&aje}while(H!=0)}}else{D=KC(WD,oje,25,o,15,1);G=o;$fb(e,0,D,0,G);I:while(true){A=0;for(j=G-1;j>=0;j--){F=wbb(Nbb(A,32),xbb(D[j],Yje));r=qhb(F);D[j]=Tbb(r);A=Tbb(Obb(r,32))}s=Tbb(A);q=c;do{u[--c]=48+s%10&aje}while((s=s/10|0)!=0&&c!=0);d=9-q+c;for(i=0;i0;i++){u[--c]=48}l=G-1;for(;D[l]==0;l--){if(l==0){break I}}G=l+1}while(u[c]==48){++c}}n=B<0;g=t-c-b-1;if(b==0){n&&(u[--c]=45);return zfb(u,c,t-c)}if(b>0&&g>=-6){if(g>=0){k=c+g;for(m=t-1;m>=k;m--){u[m+1]=u[m]}u[++k]=46;n&&(u[--c]=45);return zfb(u,c,t-c+1)}for(l=2;l<-g+1;l++){u[--c]=48}u[--c]=46;u[--c]=48;n&&(u[--c]=45);return zfb(u,c,t-c)}C=c+1;f=t;v=new Vfb;n&&(v.a+='-',v);if(f-C>=1){Kfb(v,u[c]);v.a+='.';v.a+=zfb(u,c+1,t-c-1)}else{v.a+=zfb(u,c,t-c)}v.a+='E';g>0&&(v.a+='+',v);v.a+=''+g;return v.a} +function z$c(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;a.c=b;a.g=new Lqb;c=(Pgd(),new bhd(a.c));d=new YGb(c);UGb(d);t=GD(hkd(a.c,(d0c(),Y_c)));i=BD(hkd(a.c,$_c),316);v=BD(hkd(a.c,__c),429);g=BD(hkd(a.c,T_c),482);u=BD(hkd(a.c,Z_c),430);a.j=Edb(ED(hkd(a.c,a0c)));h=a.a;switch(i.g){case 0:h=a.a;break;case 1:h=a.b;break;case 2:h=a.i;break;case 3:h=a.e;break;case 4:h=a.f;break;default:throw vbb(new Wdb(Mre+(i.f!=null?i.f:''+i.g)));}a.d=new g_c(h,v,g);yNb(a.d,(XNb(),VNb),DD(hkd(a.c,V_c)));a.d.c=Ccb(DD(hkd(a.c,U_c)));if(Vod(a.c).i==0){return a.d}for(l=new Fyd(Vod(a.c));l.e!=l.i.gc();){k=BD(Dyd(l),33);n=k.g/2;m=k.f/2;w=new f7c(k.i+n,k.j+m);while(Mhb(a.g,w)){O6c(w,($wnd.Math.random()-0.5)*qme,($wnd.Math.random()-0.5)*qme)}p=BD(hkd(k,(Y9c(),S8c)),142);q=new aOb(w,new J6c(w.a-n-a.j/2-p.b,w.b-m-a.j/2-p.d,k.g+a.j+(p.b+p.c),k.f+a.j+(p.d+p.a)));Ekb(a.d.i,q);Rhb(a.g,w,new vgd(q,k))}switch(u.g){case 0:if(t==null){a.d.d=BD(Ikb(a.d.i,0),65)}else{for(s=new olb(a.d.i);s.a1&&(Gsb(k,r,k.c.b,k.c),true);Zsb(e)}}}r=s}}return k} +function $Bc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L;Odd(c,'Greedy cycle removal',1);t=b.a;L=t.c.length;a.a=KC(WD,oje,25,L,15,1);a.c=KC(WD,oje,25,L,15,1);a.b=KC(WD,oje,25,L,15,1);j=0;for(r=new olb(t);r.a0?G+1:1}for(g=new olb(w.g);g.a0?G+1:1}}a.c[j]==0?Dsb(a.e,p):a.a[j]==0&&Dsb(a.f,p);++j}o=-1;n=1;l=new Rkb;a.d=BD(vNb(b,(wtc(),jtc)),230);while(L>0){while(a.e.b!=0){I=BD(Lsb(a.e),10);a.b[I.p]=o--;_Bc(a,I);--L}while(a.f.b!=0){J=BD(Lsb(a.f),10);a.b[J.p]=n++;_Bc(a,J);--L}if(L>0){m=Rie;for(s=new olb(t);s.a=m){if(u>m){l.c=KC(SI,Uhe,1,0,5,1);m=u}l.c[l.c.length]=p}}}k=a.Zf(l);a.b[k.p]=n++;_Bc(a,k);--L}}H=t.c.length+1;for(j=0;ja.b[K]){PZb(d,true);yNb(b,Asc,(Bcb(),true))}}}}a.a=null;a.c=null;a.b=null;Osb(a.f);Osb(a.e);Qdd(c)} +function sQb(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;d=new Rkb;h=new Rkb;q=b/2;n=a.gc();e=BD(a.Xb(0),8);r=BD(a.Xb(1),8);o=tQb(e.a,e.b,r.a,r.b,q);Ekb(d,(tCb(0,o.c.length),BD(o.c[0],8)));Ekb(h,(tCb(1,o.c.length),BD(o.c[1],8)));for(j=2;j=0;i--){Dsb(c,(tCb(i,g.c.length),BD(g.c[i],8)))}return c} +function aFd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;g=true;l=null;d=null;e=null;b=false;n=BEd;j=null;f=null;h=0;i=UEd(a,h,zEd,AEd);if(i=0&&dfb(a.substr(h,'//'.length),'//')){h+=2;i=UEd(a,h,CEd,DEd);d=a.substr(h,i-h);h=i}else if(l!=null&&(h==a.length||(BCb(h,a.length),a.charCodeAt(h)!=47))){g=false;i=ifb(a,wfb(35),h);i==-1&&(i=a.length);d=a.substr(h,i-h);h=i}if(!c&&h0&&bfb(k,k.length-1)==58){e=k;h=i}}if(h=a.j){a.a=-1;a.c=1;return}b=bfb(a.i,a.d++);a.a=b;if(a.b==1){switch(b){case 92:d=10;if(a.d>=a.j)throw vbb(new mde(tvd((h0d(),uue))));a.a=bfb(a.i,a.d++);break;case 45:if((a.e&512)==512&&a.d=a.j)break;if(bfb(a.i,a.d)!=63)break;if(++a.d>=a.j)throw vbb(new mde(tvd((h0d(),vue))));b=bfb(a.i,a.d++);switch(b){case 58:d=13;break;case 61:d=14;break;case 33:d=15;break;case 91:d=19;break;case 62:d=18;break;case 60:if(a.d>=a.j)throw vbb(new mde(tvd((h0d(),vue))));b=bfb(a.i,a.d++);if(b==61){d=16}else if(b==33){d=17}else throw vbb(new mde(tvd((h0d(),wue))));break;case 35:while(a.d=a.j)throw vbb(new mde(tvd((h0d(),uue))));a.a=bfb(a.i,a.d++);break;default:d=0;}a.c=d} +function P5b(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G;A=BD(vNb(a,(Nyc(),Vxc)),98);if(!(A!=(dcd(),bcd)&&A!=ccd)){return}o=a.b;n=o.c.length;k=new Skb((Xj(n+2,Mie),Oy(wbb(wbb(5,n+2),(n+2)/10|0))));p=new Skb((Xj(n+2,Mie),Oy(wbb(wbb(5,n+2),(n+2)/10|0))));Ekb(k,new Lqb);Ekb(k,new Lqb);Ekb(p,new Rkb);Ekb(p,new Rkb);w=new Rkb;for(b=0;b=v||!wCc(r,d))&&(d=yCc(b,k));$_b(r,d);for(f=new Sr(ur(R_b(r).a.Kc(),new Sq));Qr(f);){e=BD(Rr(f),17);if(a.a[e.p]){continue}p=e.c.i;--a.e[p.p];a.e[p.p]==0&&(zCb(cub(n,p)),true)}}for(j=k.c.length-1;j>=0;--j){Ekb(b.b,(tCb(j,k.c.length),BD(k.c[j],29)))}b.a.c=KC(SI,Uhe,1,0,5,1);Qdd(c)} +function gee(a){var b,c,d,e,f,g,h,i,j;a.b=1;nde(a);b=null;if(a.c==0&&a.a==94){nde(a);b=(wfe(),wfe(),++vfe,new $fe(4));Ufe(b,0,lxe);h=(null,++vfe,new $fe(4))}else{h=(wfe(),wfe(),++vfe,new $fe(4))}e=true;while((j=a.c)!=1){if(j==0&&a.a==93&&!e){if(b){Zfe(b,h);h=b}break}c=a.a;d=false;if(j==10){switch(c){case 100:case 68:case 119:case 87:case 115:case 83:Xfe(h,fee(c));d=true;break;case 105:case 73:case 99:case 67:c=(Xfe(h,fee(c)),-1);c<0&&(d=true);break;case 112:case 80:i=tde(a,c);if(!i)throw vbb(new mde(tvd((h0d(),Iue))));Xfe(h,i);d=true;break;default:c=eee(a);}}else if(j==24&&!e){if(b){Zfe(b,h);h=b}f=gee(a);Zfe(h,f);if(a.c!=0||a.a!=93)throw vbb(new mde(tvd((h0d(),Mue))));break}nde(a);if(!d){if(j==0){if(c==91)throw vbb(new mde(tvd((h0d(),Nue))));if(c==93)throw vbb(new mde(tvd((h0d(),Oue))));if(c==45&&!e&&a.a!=93)throw vbb(new mde(tvd((h0d(),Pue))))}if(a.c!=0||a.a!=45||c==45&&e){Ufe(h,c,c)}else{nde(a);if((j=a.c)==1)throw vbb(new mde(tvd((h0d(),Kue))));if(j==0&&a.a==93){Ufe(h,c,c);Ufe(h,45,45)}else if(j==0&&a.a==93||j==24){throw vbb(new mde(tvd((h0d(),Pue))))}else{g=a.a;if(j==0){if(g==91)throw vbb(new mde(tvd((h0d(),Nue))));if(g==93)throw vbb(new mde(tvd((h0d(),Oue))));if(g==45)throw vbb(new mde(tvd((h0d(),Pue))))}else j==10&&(g=eee(a));nde(a);if(c>g)throw vbb(new mde(tvd((h0d(),Sue))));Ufe(h,c,g)}}}e=false}if(a.c==1)throw vbb(new mde(tvd((h0d(),Kue))));Yfe(h);Vfe(h);a.b=0;nde(a);return h} +function xZd(a){Bnd(a.c,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#decimal']));Bnd(a.d,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#integer']));Bnd(a.e,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#boolean']));Bnd(a.f,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EBoolean',fue,'EBoolean:Object']));Bnd(a.i,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#byte']));Bnd(a.g,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#hexBinary']));Bnd(a.j,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EByte',fue,'EByte:Object']));Bnd(a.n,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EChar',fue,'EChar:Object']));Bnd(a.t,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#double']));Bnd(a.u,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EDouble',fue,'EDouble:Object']));Bnd(a.F,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#float']));Bnd(a.G,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EFloat',fue,'EFloat:Object']));Bnd(a.I,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#int']));Bnd(a.J,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EInt',fue,'EInt:Object']));Bnd(a.N,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#long']));Bnd(a.O,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'ELong',fue,'ELong:Object']));Bnd(a.Z,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#short']));Bnd(a.$,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'EShort',fue,'EShort:Object']));Bnd(a._,Rve,OC(GC(ZI,1),nie,2,6,[cwe,'http://www.w3.org/2001/XMLSchema#string']))} +function fRc(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G;if(a.c.length==1){return tCb(0,a.c.length),BD(a.c[0],135)}else if(a.c.length<=0){return new SRc}for(i=new olb(a);i.al){F=0;G+=k+A;k=0}eRc(v,g,F,G);b=$wnd.Math.max(b,F+w.a);k=$wnd.Math.max(k,w.b);F+=w.a+A}u=new Lqb;c=new Lqb;for(C=new olb(a);C.aSLc(f))&&(l=f)}}!l&&(l=(tCb(0,q.c.length),BD(q.c[0],180)));for(p=new olb(b.b);p.a=-1900?1:0;c>=4?Qfb(a,OC(GC(ZI,1),nie,2,6,[pje,qje])[h]):Qfb(a,OC(GC(ZI,1),nie,2,6,['BC','AD'])[h]);break;case 121:kA(a,c,d);break;case 77:jA(a,c,d);break;case 107:i=e.q.getHours();i==0?EA(a,24,c):EA(a,i,c);break;case 83:iA(a,c,e);break;case 69:k=d.q.getDay();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['S','M','T','W','T','F','S'])[k]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[rje,sje,tje,uje,vje,wje,xje])[k]):Qfb(a,OC(GC(ZI,1),nie,2,6,['Sun','Mon','Tue','Wed','Thu','Fri','Sat'])[k]);break;case 97:e.q.getHours()>=12&&e.q.getHours()<24?Qfb(a,OC(GC(ZI,1),nie,2,6,['AM','PM'])[1]):Qfb(a,OC(GC(ZI,1),nie,2,6,['AM','PM'])[0]);break;case 104:l=e.q.getHours()%12;l==0?EA(a,12,c):EA(a,l,c);break;case 75:m=e.q.getHours()%12;EA(a,m,c);break;case 72:n=e.q.getHours();EA(a,n,c);break;case 99:o=d.q.getDay();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['S','M','T','W','T','F','S'])[o]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[rje,sje,tje,uje,vje,wje,xje])[o]):c==3?Qfb(a,OC(GC(ZI,1),nie,2,6,['Sun','Mon','Tue','Wed','Thu','Fri','Sat'])[o]):EA(a,o,1);break;case 76:p=d.q.getMonth();c==5?Qfb(a,OC(GC(ZI,1),nie,2,6,['J','F','M','A','M','J','J','A','S','O','N','D'])[p]):c==4?Qfb(a,OC(GC(ZI,1),nie,2,6,[bje,cje,dje,eje,fje,gje,hje,ije,jje,kje,lje,mje])[p]):c==3?Qfb(a,OC(GC(ZI,1),nie,2,6,['Jan','Feb','Mar','Apr',fje,'Jun','Jul','Aug','Sep','Oct','Nov','Dec'])[p]):EA(a,p+1,c);break;case 81:q=d.q.getMonth()/3|0;c<4?Qfb(a,OC(GC(ZI,1),nie,2,6,['Q1','Q2','Q3','Q4'])[q]):Qfb(a,OC(GC(ZI,1),nie,2,6,['1st quarter','2nd quarter','3rd quarter','4th quarter'])[q]);break;case 100:r=d.q.getDate();EA(a,r,c);break;case 109:j=e.q.getMinutes();EA(a,j,c);break;case 115:g=e.q.getSeconds();EA(a,g,c);break;case 122:c<4?Qfb(a,f.c[0]):Qfb(a,f.c[1]);break;case 118:Qfb(a,f.b);break;case 90:c<3?Qfb(a,OA(f)):c==3?Qfb(a,NA(f)):Qfb(a,QA(f.a));break;default:return false;}return true} +function X1b(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H;N1b(b);i=BD(qud((!b.b&&(b.b=new y5d(z2,b,4,7)),b.b),0),82);k=BD(qud((!b.c&&(b.c=new y5d(z2,b,5,8)),b.c),0),82);h=atd(i);j=atd(k);g=(!b.a&&(b.a=new cUd(A2,b,6,6)),b.a).i==0?null:BD(qud((!b.a&&(b.a=new cUd(A2,b,6,6)),b.a),0),202);A=BD(Ohb(a.a,h),10);F=BD(Ohb(a.a,j),10);B=null;G=null;if(JD(i,186)){w=BD(Ohb(a.a,i),299);if(JD(w,11)){B=BD(w,11)}else if(JD(w,10)){A=BD(w,10);B=BD(Ikb(A.j,0),11)}}if(JD(k,186)){D=BD(Ohb(a.a,k),299);if(JD(D,11)){G=BD(D,11)}else if(JD(D,10)){F=BD(D,10);G=BD(Ikb(F.j,0),11)}}if(!A||!F){throw vbb(new z2c('The source or the target of edge '+b+' could not be found. '+'This usually happens when an edge connects a node laid out by ELK Layered to a node in '+'another level of hierarchy laid out by either another instance of ELK Layered or another '+'layout algorithm alltogether. The former can be solved by setting the hierarchyHandling '+'option to INCLUDE_CHILDREN.'))}p=new UZb;tNb(p,b);yNb(p,(wtc(),$sc),b);yNb(p,(Nyc(),jxc),null);n=BD(vNb(d,Ksc),21);A==F&&n.Fc((Orc(),Nrc));if(!B){v=(KAc(),IAc);C=null;if(!!g&&fcd(BD(vNb(A,Vxc),98))){C=new f7c(g.j,g.k);Bfd(C,Mld(b));Cfd(C,c);if(ntd(j,h)){v=HAc;P6c(C,A.n)}}B=$$b(A,C,v,d)}if(!G){v=(KAc(),HAc);H=null;if(!!g&&fcd(BD(vNb(F,Vxc),98))){H=new f7c(g.b,g.c);Bfd(H,Mld(b));Cfd(H,c)}G=$$b(F,H,v,Q_b(F))}QZb(p,B);RZb(p,G);(B.e.c.length>1||B.g.c.length>1||G.e.c.length>1||G.g.c.length>1)&&n.Fc((Orc(),Irc));for(m=new Fyd((!b.n&&(b.n=new cUd(D2,b,1,7)),b.n));m.e!=m.i.gc();){l=BD(Dyd(m),137);if(!Ccb(DD(hkd(l,Jxc)))&&!!l.a){q=Z1b(l);Ekb(p.b,q);switch(BD(vNb(q,Qwc),272).g){case 1:case 2:n.Fc((Orc(),Grc));break;case 0:n.Fc((Orc(),Erc));yNb(q,Qwc,(qad(),nad));}}}f=BD(vNb(d,Iwc),314);r=BD(vNb(d,Exc),315);e=f==(Rpc(),Opc)||r==(Vzc(),Rzc);if(!!g&&(!g.a&&(g.a=new xMd(y2,g,5)),g.a).i!=0&&e){s=ofd(g);o=new s7c;for(u=Jsb(s,0);u.b!=u.d.c;){t=BD(Xsb(u),8);Dsb(o,new g7c(t))}yNb(p,_sc,o)}return p} +function yZd(a){if(a.gb)return;a.gb=true;a.b=Lnd(a,0);Knd(a.b,18);Qnd(a.b,19);a.a=Lnd(a,1);Knd(a.a,1);Qnd(a.a,2);Qnd(a.a,3);Qnd(a.a,4);Qnd(a.a,5);a.o=Lnd(a,2);Knd(a.o,8);Knd(a.o,9);Qnd(a.o,10);Qnd(a.o,11);Qnd(a.o,12);Qnd(a.o,13);Qnd(a.o,14);Qnd(a.o,15);Qnd(a.o,16);Qnd(a.o,17);Qnd(a.o,18);Qnd(a.o,19);Qnd(a.o,20);Qnd(a.o,21);Qnd(a.o,22);Qnd(a.o,23);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);Pnd(a.o);a.p=Lnd(a,3);Knd(a.p,2);Knd(a.p,3);Knd(a.p,4);Knd(a.p,5);Qnd(a.p,6);Qnd(a.p,7);Pnd(a.p);Pnd(a.p);a.q=Lnd(a,4);Knd(a.q,8);a.v=Lnd(a,5);Qnd(a.v,9);Pnd(a.v);Pnd(a.v);Pnd(a.v);a.w=Lnd(a,6);Knd(a.w,2);Knd(a.w,3);Knd(a.w,4);Qnd(a.w,5);a.B=Lnd(a,7);Qnd(a.B,1);Pnd(a.B);Pnd(a.B);Pnd(a.B);a.Q=Lnd(a,8);Qnd(a.Q,0);Pnd(a.Q);a.R=Lnd(a,9);Knd(a.R,1);a.S=Lnd(a,10);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);Pnd(a.S);a.T=Lnd(a,11);Qnd(a.T,10);Qnd(a.T,11);Qnd(a.T,12);Qnd(a.T,13);Qnd(a.T,14);Pnd(a.T);Pnd(a.T);a.U=Lnd(a,12);Knd(a.U,2);Knd(a.U,3);Qnd(a.U,4);Qnd(a.U,5);Qnd(a.U,6);Qnd(a.U,7);Pnd(a.U);a.V=Lnd(a,13);Qnd(a.V,10);a.W=Lnd(a,14);Knd(a.W,18);Knd(a.W,19);Knd(a.W,20);Qnd(a.W,21);Qnd(a.W,22);Qnd(a.W,23);a.bb=Lnd(a,15);Knd(a.bb,10);Knd(a.bb,11);Knd(a.bb,12);Knd(a.bb,13);Knd(a.bb,14);Knd(a.bb,15);Knd(a.bb,16);Qnd(a.bb,17);Pnd(a.bb);Pnd(a.bb);a.eb=Lnd(a,16);Knd(a.eb,2);Knd(a.eb,3);Knd(a.eb,4);Knd(a.eb,5);Knd(a.eb,6);Knd(a.eb,7);Qnd(a.eb,8);Qnd(a.eb,9);a.ab=Lnd(a,17);Knd(a.ab,0);Knd(a.ab,1);a.H=Lnd(a,18);Qnd(a.H,0);Qnd(a.H,1);Qnd(a.H,2);Qnd(a.H,3);Qnd(a.H,4);Qnd(a.H,5);Pnd(a.H);a.db=Lnd(a,19);Qnd(a.db,2);a.c=Mnd(a,20);a.d=Mnd(a,21);a.e=Mnd(a,22);a.f=Mnd(a,23);a.i=Mnd(a,24);a.g=Mnd(a,25);a.j=Mnd(a,26);a.k=Mnd(a,27);a.n=Mnd(a,28);a.r=Mnd(a,29);a.s=Mnd(a,30);a.t=Mnd(a,31);a.u=Mnd(a,32);a.fb=Mnd(a,33);a.A=Mnd(a,34);a.C=Mnd(a,35);a.D=Mnd(a,36);a.F=Mnd(a,37);a.G=Mnd(a,38);a.I=Mnd(a,39);a.J=Mnd(a,40);a.L=Mnd(a,41);a.M=Mnd(a,42);a.N=Mnd(a,43);a.O=Mnd(a,44);a.P=Mnd(a,45);a.X=Mnd(a,46);a.Y=Mnd(a,47);a.Z=Mnd(a,48);a.$=Mnd(a,49);a._=Mnd(a,50);a.cb=Mnd(a,51);a.K=Mnd(a,52)} +function Y9c(){Y9c=ccb;var a,b;o8c=new Lsd(sse);F9c=new Lsd(tse);q8c=(F7c(),z7c);p8c=new Nsd($pe,q8c);new Tfd;r8c=new Nsd(_le,null);s8c=new Lsd(use);x8c=(i8c(),qqb(h8c,OC(GC(r1,1),Kie,291,0,[d8c])));w8c=new Nsd(lqe,x8c);y8c=new Nsd(Zpe,(Bcb(),false));A8c=(ead(),cad);z8c=new Nsd(cqe,A8c);F8c=(Aad(),zad);E8c=new Nsd(ype,F8c);I8c=new Nsd(Jre,false);K8c=(hbd(),fbd);J8c=new Nsd(tpe,K8c);g9c=new q0b(12);f9c=new Nsd(ame,g9c);O8c=new Nsd(Ame,false);P8c=new Nsd(xqe,false);e9c=new Nsd(Dme,false);u9c=(dcd(),ccd);t9c=new Nsd(Bme,u9c);C9c=new Lsd(uqe);D9c=new Lsd(vme);E9c=new Lsd(yme);H9c=new Lsd(zme);R8c=new s7c;Q8c=new Nsd(mqe,R8c);v8c=new Nsd(pqe,false);L8c=new Nsd(qqe,false);new Lsd(vse);T8c=new H_b;S8c=new Nsd(vqe,T8c);d9c=new Nsd(Xpe,false);new Tfd;G9c=new Nsd(wse,1);new Nsd(xse,true);meb(0);new Nsd(yse,meb(100));new Nsd(zse,false);meb(0);new Nsd(Ase,meb(4000));meb(0);new Nsd(Bse,meb(400));new Nsd(Cse,false);new Nsd(Dse,false);new Nsd(Ese,true);new Nsd(Fse,false);u8c=(Ded(),Ced);t8c=new Nsd(rse,u8c);I9c=new Nsd(Lpe,10);J9c=new Nsd(Mpe,10);K9c=new Nsd(Zle,20);L9c=new Nsd(Npe,10);M9c=new Nsd(xme,2);N9c=new Nsd(Ope,10);P9c=new Nsd(Ppe,0);Q9c=new Nsd(Spe,5);R9c=new Nsd(Qpe,1);S9c=new Nsd(Rpe,1);T9c=new Nsd(wme,20);U9c=new Nsd(Tpe,10);X9c=new Nsd(Upe,10);O9c=new Lsd(Vpe);W9c=new I_b;V9c=new Nsd(wqe,W9c);j9c=new Lsd(tqe);i9c=false;h9c=new Nsd(sqe,i9c);V8c=new q0b(5);U8c=new Nsd(dqe,V8c);X8c=(Hbd(),b=BD(gdb(B1),9),new xqb(b,BD(_Bb(b,b.length),9),0));W8c=new Nsd(Gme,X8c);m9c=(Tbd(),Qbd);l9c=new Nsd(gqe,m9c);o9c=new Lsd(hqe);p9c=new Lsd(iqe);q9c=new Lsd(jqe);n9c=new Lsd(kqe);Z8c=(a=BD(gdb(I1),9),new xqb(a,BD(_Bb(a,a.length),9),0));Y8c=new Nsd(Fme,Z8c);c9c=pqb((Idd(),Bdd));b9c=new Nsd(Eme,c9c);a9c=new f7c(0,0);_8c=new Nsd(Tme,a9c);$8c=new Nsd(bqe,false);D8c=(qad(),nad);C8c=new Nsd(nqe,D8c);B8c=new Nsd(Cme,false);new Lsd(Gse);meb(1);new Nsd(Hse,null);r9c=new Lsd(rqe);v9c=new Lsd(oqe);B9c=(Ucd(),Scd);A9c=new Nsd(Ype,B9c);s9c=new Lsd(Wpe);y9c=(rcd(),pqb(pcd));x9c=new Nsd(Hme,y9c);w9c=new Nsd(eqe,false);z9c=new Nsd(fqe,true);M8c=new Nsd(_pe,false);N8c=new Nsd(aqe,false);G8c=new Nsd($le,1);H8c=(Mad(),Kad);new Nsd(Ise,H8c);k9c=true} +function wtc(){wtc=ccb;var a,b;$sc=new Lsd(Ime);xsc=new Lsd('coordinateOrigin');itc=new Lsd('processors');wsc=new Msd('compoundNode',(Bcb(),false));Nsc=new Msd('insideConnections',false);_sc=new Lsd('originalBendpoints');atc=new Lsd('originalDummyNodePosition');btc=new Lsd('originalLabelEdge');ktc=new Lsd('representedLabels');Csc=new Lsd('endLabels');Dsc=new Lsd('endLabel.origin');Ssc=new Msd('labelSide',(rbd(),qbd));Ysc=new Msd('maxEdgeThickness',0);ltc=new Msd('reversed',false);jtc=new Lsd(Jme);Vsc=new Msd('longEdgeSource',null);Wsc=new Msd('longEdgeTarget',null);Usc=new Msd('longEdgeHasLabelDummies',false);Tsc=new Msd('longEdgeBeforeLabelDummy',false);Bsc=new Msd('edgeConstraint',(Gqc(),Eqc));Psc=new Lsd('inLayerLayoutUnit');Osc=new Msd('inLayerConstraint',(esc(),csc));Qsc=new Msd('inLayerSuccessorConstraint',new Rkb);Rsc=new Msd('inLayerSuccessorConstraintBetweenNonDummies',false);gtc=new Lsd('portDummy');ysc=new Msd('crossingHint',meb(0));Ksc=new Msd('graphProperties',(b=BD(gdb(PW),9),new xqb(b,BD(_Bb(b,b.length),9),0)));Hsc=new Msd('externalPortSide',(Ucd(),Scd));Isc=new Msd('externalPortSize',new d7c);Fsc=new Lsd('externalPortReplacedDummies');Gsc=new Lsd('externalPortReplacedDummy');Esc=new Msd('externalPortConnections',(a=BD(gdb(F1),9),new xqb(a,BD(_Bb(a,a.length),9),0)));htc=new Msd(tle,0);ssc=new Lsd('barycenterAssociates');vtc=new Lsd('TopSideComments');tsc=new Lsd('BottomSideComments');vsc=new Lsd('CommentConnectionPort');Msc=new Msd('inputCollect',false);etc=new Msd('outputCollect',false);Asc=new Msd('cyclic',false);zsc=new Lsd('crossHierarchyMap');utc=new Lsd('targetOffset');new Msd('splineLabelSize',new d7c);otc=new Lsd('spacings');ftc=new Msd('partitionConstraint',false);usc=new Lsd('breakingPoint.info');stc=new Lsd('splines.survivingEdge');rtc=new Lsd('splines.route.start');ptc=new Lsd('splines.edgeChain');dtc=new Lsd('originalPortConstraints');ntc=new Lsd('selfLoopHolder');qtc=new Lsd('splines.nsPortY');Zsc=new Lsd('modelOrder');Xsc=new Lsd('longEdgeTargetNode');Jsc=new Msd(Xne,false);mtc=new Msd(Xne,false);Lsc=new Lsd('layerConstraints.hiddenNodes');ctc=new Lsd('layerConstraints.opposidePort');ttc=new Lsd('targetNode.modelOrder')} +function jwc(){jwc=ccb;puc=(xqc(),vqc);ouc=new Nsd(Yne,puc);Guc=new Nsd(Zne,(Bcb(),false));Muc=(msc(),ksc);Luc=new Nsd($ne,Muc);cvc=new Nsd(_ne,false);dvc=new Nsd(aoe,true);Itc=new Nsd(boe,false);xvc=(BAc(),zAc);wvc=new Nsd(coe,xvc);meb(1);Fvc=new Nsd(doe,meb(7));Gvc=new Nsd(eoe,false);Huc=new Nsd(foe,false);nuc=(mqc(),iqc);muc=new Nsd(goe,nuc);bvc=(lzc(),jzc);avc=new Nsd(hoe,bvc);Tuc=(Ctc(),Btc);Suc=new Nsd(ioe,Tuc);meb(-1);Ruc=new Nsd(joe,meb(-1));meb(-1);Uuc=new Nsd(koe,meb(-1));meb(-1);Vuc=new Nsd(loe,meb(4));meb(-1);Xuc=new Nsd(moe,meb(2));_uc=(kAc(),iAc);$uc=new Nsd(noe,_uc);meb(0);Zuc=new Nsd(ooe,meb(0));Puc=new Nsd(poe,meb(Ohe));luc=(Rpc(),Ppc);kuc=new Nsd(qoe,luc);Xtc=new Nsd(roe,false);euc=new Nsd(soe,0.1);iuc=new Nsd(toe,false);meb(-1);guc=new Nsd(uoe,meb(-1));meb(-1);huc=new Nsd(voe,meb(-1));meb(0);Ytc=new Nsd(woe,meb(40));cuc=(Xrc(),Wrc);buc=new Nsd(xoe,cuc);$tc=Urc;Ztc=new Nsd(yoe,$tc);vvc=(Vzc(),Qzc);uvc=new Nsd(zoe,vvc);kvc=new Lsd(Aoe);fvc=(_qc(),Zqc);evc=new Nsd(Boe,fvc);ivc=(lrc(),irc);hvc=new Nsd(Coe,ivc);new Tfd;nvc=new Nsd(Doe,0.3);pvc=new Lsd(Eoe);rvc=(Izc(),Gzc);qvc=new Nsd(Foe,rvc);xuc=(TAc(),RAc);wuc=new Nsd(Goe,xuc);zuc=(_Ac(),$Ac);yuc=new Nsd(Hoe,zuc);Buc=(tBc(),sBc);Auc=new Nsd(Ioe,Buc);Duc=new Nsd(Joe,0.2);uuc=new Nsd(Koe,2);Bvc=new Nsd(Loe,null);Dvc=new Nsd(Moe,10);Cvc=new Nsd(Noe,10);Evc=new Nsd(Ooe,20);meb(0);yvc=new Nsd(Poe,meb(0));meb(0);zvc=new Nsd(Qoe,meb(0));meb(0);Avc=new Nsd(Roe,meb(0));Jtc=new Nsd(Soe,false);Ntc=(yrc(),wrc);Mtc=new Nsd(Toe,Ntc);Ltc=(Ipc(),Hpc);Ktc=new Nsd(Uoe,Ltc);Juc=new Nsd(Voe,false);meb(0);Iuc=new Nsd(Woe,meb(16));meb(0);Kuc=new Nsd(Xoe,meb(5));bwc=(LBc(),JBc);awc=new Nsd(Yoe,bwc);Hvc=new Nsd(Zoe,10);Kvc=new Nsd($oe,1);Tvc=(bqc(),aqc);Svc=new Nsd(_oe,Tvc);Nvc=new Lsd(ape);Qvc=meb(1);meb(0);Pvc=new Nsd(bpe,Qvc);gwc=(CBc(),zBc);fwc=new Nsd(cpe,gwc);cwc=new Lsd(dpe);Yvc=new Nsd(epe,true);Wvc=new Nsd(fpe,2);$vc=new Nsd(gpe,true);tuc=(Sqc(),Qqc);suc=new Nsd(hpe,tuc);ruc=(Apc(),wpc);quc=new Nsd(ipe,ruc);Wtc=(tAc(),rAc);Vtc=new Nsd(jpe,Wtc);Utc=new Nsd(kpe,false);Ptc=(RXb(),QXb);Otc=new Nsd(lpe,Ptc);Ttc=(xzc(),uzc);Stc=new Nsd(mpe,Ttc);Qtc=new Nsd(npe,0);Rtc=new Nsd(ope,0);Ouc=kqc;Nuc=Opc;Wuc=izc;Yuc=izc;Quc=fzc;fuc=(hbd(),ebd);juc=Ppc;duc=Ppc;_tc=Ppc;auc=ebd;lvc=Tzc;mvc=Qzc;gvc=Qzc;jvc=Qzc;ovc=Szc;tvc=Tzc;svc=Tzc;Cuc=(Aad(),yad);Euc=yad;Fuc=sBc;vuc=xad;Ivc=KBc;Jvc=IBc;Lvc=KBc;Mvc=IBc;Uvc=KBc;Vvc=IBc;Ovc=_pc;Rvc=aqc;hwc=KBc;iwc=IBc;dwc=KBc;ewc=IBc;Zvc=IBc;Xvc=IBc;_vc=IBc} +function S8b(){S8b=ccb;Y7b=new T8b('DIRECTION_PREPROCESSOR',0);V7b=new T8b('COMMENT_PREPROCESSOR',1);Z7b=new T8b('EDGE_AND_LAYER_CONSTRAINT_EDGE_REVERSER',2);n8b=new T8b('INTERACTIVE_EXTERNAL_PORT_POSITIONER',3);G8b=new T8b('PARTITION_PREPROCESSOR',4);r8b=new T8b('LABEL_DUMMY_INSERTER',5);M8b=new T8b('SELF_LOOP_PREPROCESSOR',6);w8b=new T8b('LAYER_CONSTRAINT_PREPROCESSOR',7);E8b=new T8b('PARTITION_MIDPROCESSOR',8);i8b=new T8b('HIGH_DEGREE_NODE_LAYER_PROCESSOR',9);A8b=new T8b('NODE_PROMOTION',10);v8b=new T8b('LAYER_CONSTRAINT_POSTPROCESSOR',11);F8b=new T8b('PARTITION_POSTPROCESSOR',12);e8b=new T8b('HIERARCHICAL_PORT_CONSTRAINT_PROCESSOR',13);O8b=new T8b('SEMI_INTERACTIVE_CROSSMIN_PROCESSOR',14);P7b=new T8b('BREAKING_POINT_INSERTER',15);z8b=new T8b('LONG_EDGE_SPLITTER',16);I8b=new T8b('PORT_SIDE_PROCESSOR',17);o8b=new T8b('INVERTED_PORT_PROCESSOR',18);H8b=new T8b('PORT_LIST_SORTER',19);Q8b=new T8b('SORT_BY_INPUT_ORDER_OF_MODEL',20);C8b=new T8b('NORTH_SOUTH_PORT_PREPROCESSOR',21);Q7b=new T8b('BREAKING_POINT_PROCESSOR',22);D8b=new T8b(Bne,23);R8b=new T8b(Cne,24);K8b=new T8b('SELF_LOOP_PORT_RESTORER',25);P8b=new T8b('SINGLE_EDGE_GRAPH_WRAPPER',26);p8b=new T8b('IN_LAYER_CONSTRAINT_PROCESSOR',27);b8b=new T8b('END_NODE_PORT_LABEL_MANAGEMENT_PROCESSOR',28);q8b=new T8b('LABEL_AND_NODE_SIZE_PROCESSOR',29);m8b=new T8b('INNERMOST_NODE_MARGIN_CALCULATOR',30);N8b=new T8b('SELF_LOOP_ROUTER',31);T7b=new T8b('COMMENT_NODE_MARGIN_CALCULATOR',32);_7b=new T8b('END_LABEL_PREPROCESSOR',33);t8b=new T8b('LABEL_DUMMY_SWITCHER',34);S7b=new T8b('CENTER_LABEL_MANAGEMENT_PROCESSOR',35);u8b=new T8b('LABEL_SIDE_SELECTOR',36);k8b=new T8b('HYPEREDGE_DUMMY_MERGER',37);f8b=new T8b('HIERARCHICAL_PORT_DUMMY_SIZE_PROCESSOR',38);x8b=new T8b('LAYER_SIZE_AND_GRAPH_HEIGHT_CALCULATOR',39);h8b=new T8b('HIERARCHICAL_PORT_POSITION_PROCESSOR',40);W7b=new T8b('CONSTRAINTS_POSTPROCESSOR',41);U7b=new T8b('COMMENT_POSTPROCESSOR',42);l8b=new T8b('HYPERNODE_PROCESSOR',43);g8b=new T8b('HIERARCHICAL_PORT_ORTHOGONAL_EDGE_ROUTER',44);y8b=new T8b('LONG_EDGE_JOINER',45);L8b=new T8b('SELF_LOOP_POSTPROCESSOR',46);R7b=new T8b('BREAKING_POINT_REMOVER',47);B8b=new T8b('NORTH_SOUTH_PORT_POSTPROCESSOR',48);j8b=new T8b('HORIZONTAL_COMPACTOR',49);s8b=new T8b('LABEL_DUMMY_REMOVER',50);c8b=new T8b('FINAL_SPLINE_BENDPOINTS_CALCULATOR',51);a8b=new T8b('END_LABEL_SORTER',52);J8b=new T8b('REVERSED_EDGE_RESTORER',53);$7b=new T8b('END_LABEL_POSTPROCESSOR',54);d8b=new T8b('HIERARCHICAL_NODE_RESIZER',55);X7b=new T8b('DIRECTION_POSTPROCESSOR',56)} +function KIc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B,C,D,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,ab,bb,cb,db,eb,fb,gb,hb,ib,jb,kb,lb;cb=0;for(H=b,K=0,N=H.length;K0&&(a.a[U.p]=cb++)}}hb=0;for(I=c,L=0,O=I.length;L0){U=(sCb(Y.b>0),BD(Y.a.Xb(Y.c=--Y.b),11));X=0;for(h=new olb(U.e);h.a0){if(U.j==(Ucd(),Acd)){a.a[U.p]=hb;++hb}else{a.a[U.p]=hb+P+R;++R}}}hb+=R}W=new Lqb;o=new zsb;for(G=b,J=0,M=G.length;Jj.b&&(j.b=Z)}else if(U.i.c==bb){Zj.c&&(j.c=Z)}}}Klb(p,0,p.length,null);gb=KC(WD,oje,25,p.length,15,1);d=KC(WD,oje,25,hb+1,15,1);for(r=0;r0){A%2>0&&(e+=kb[A+1]);A=(A-1)/2|0;++kb[A]}}C=KC(nY,Uhe,362,p.length*2,0,1);for(u=0;u'?":dfb(wue,a)?"'(?<' or '(? toIndex: ',zke=', toIndex: ',Ake='Index: ',Bke=', Size: ',Cke='org.eclipse.elk.alg.common',Dke={62:1},Eke='org.eclipse.elk.alg.common.compaction',Fke='Scanline/EventHandler',Gke='org.eclipse.elk.alg.common.compaction.oned',Hke='CNode belongs to another CGroup.',Ike='ISpacingsHandler/1',Jke='The ',Kke=' instance has been finished already.',Lke='The direction ',Mke=' is not supported by the CGraph instance.',Nke='OneDimensionalCompactor',Oke='OneDimensionalCompactor/lambda$0$Type',Pke='Quadruplet',Qke='ScanlineConstraintCalculator',Rke='ScanlineConstraintCalculator/ConstraintsScanlineHandler',Ske='ScanlineConstraintCalculator/ConstraintsScanlineHandler/lambda$0$Type',Tke='ScanlineConstraintCalculator/Timestamp',Uke='ScanlineConstraintCalculator/lambda$0$Type',Vke={169:1,45:1},Wke='org.eclipse.elk.alg.common.compaction.options',Xke='org.eclipse.elk.core.data',Yke='org.eclipse.elk.polyomino.traversalStrategy',Zke='org.eclipse.elk.polyomino.lowLevelSort',$ke='org.eclipse.elk.polyomino.highLevelSort',_ke='org.eclipse.elk.polyomino.fill',ale={130:1},ble='polyomino',cle='org.eclipse.elk.alg.common.networksimplex',dle={177:1,3:1,4:1},ele='org.eclipse.elk.alg.common.nodespacing',fle='org.eclipse.elk.alg.common.nodespacing.cellsystem',gle='CENTER',hle={212:1,326:1},ile={3:1,4:1,5:1,595:1},jle='LEFT',kle='RIGHT',lle='Vertical alignment cannot be null',mle='BOTTOM',nle='org.eclipse.elk.alg.common.nodespacing.internal',ole='UNDEFINED',ple=0.01,qle='org.eclipse.elk.alg.common.nodespacing.internal.algorithm',rle='LabelPlacer/lambda$0$Type',sle='LabelPlacer/lambda$1$Type',tle='portRatioOrPosition',ule='org.eclipse.elk.alg.common.overlaps',vle='DOWN',wle='org.eclipse.elk.alg.common.polyomino',xle='NORTH',yle='EAST',zle='SOUTH',Ale='WEST',Ble='org.eclipse.elk.alg.common.polyomino.structures',Cle='Direction',Dle='Grid is only of size ',Ele='. Requested point (',Fle=') is out of bounds.',Gle=' Given center based coordinates were (',Hle='org.eclipse.elk.graph.properties',Ile='IPropertyHolder',Jle={3:1,94:1,134:1},Kle='org.eclipse.elk.alg.common.spore',Lle='org.eclipse.elk.alg.common.utils',Mle={209:1},Nle='org.eclipse.elk.core',Ole='Connected Components Compaction',Ple='org.eclipse.elk.alg.disco',Qle='org.eclipse.elk.alg.disco.graph',Rle='org.eclipse.elk.alg.disco.options',Sle='CompactionStrategy',Tle='org.eclipse.elk.disco.componentCompaction.strategy',Ule='org.eclipse.elk.disco.componentCompaction.componentLayoutAlgorithm',Vle='org.eclipse.elk.disco.debug.discoGraph',Wle='org.eclipse.elk.disco.debug.discoPolys',Xle='componentCompaction',Yle='org.eclipse.elk.disco',Zle='org.eclipse.elk.spacing.componentComponent',$le='org.eclipse.elk.edge.thickness',_le='org.eclipse.elk.aspectRatio',ame='org.eclipse.elk.padding',bme='org.eclipse.elk.alg.disco.transform',cme=1.5707963267948966,dme=1.7976931348623157E308,eme={3:1,4:1,5:1,192:1},fme={3:1,6:1,4:1,5:1,106:1,120:1},gme='org.eclipse.elk.alg.force',hme='ComponentsProcessor',ime='ComponentsProcessor/1',jme='org.eclipse.elk.alg.force.graph',kme='Component Layout',lme='org.eclipse.elk.alg.force.model',mme='org.eclipse.elk.force.model',nme='org.eclipse.elk.force.iterations',ome='org.eclipse.elk.force.repulsivePower',pme='org.eclipse.elk.force.temperature',qme=0.001,rme='org.eclipse.elk.force.repulsion',sme='org.eclipse.elk.alg.force.options',tme=1.600000023841858,ume='org.eclipse.elk.force',vme='org.eclipse.elk.priority',wme='org.eclipse.elk.spacing.nodeNode',xme='org.eclipse.elk.spacing.edgeLabel',yme='org.eclipse.elk.randomSeed',zme='org.eclipse.elk.separateConnectedComponents',Ame='org.eclipse.elk.interactive',Bme='org.eclipse.elk.portConstraints',Cme='org.eclipse.elk.edgeLabels.inline',Dme='org.eclipse.elk.omitNodeMicroLayout',Eme='org.eclipse.elk.nodeSize.options',Fme='org.eclipse.elk.nodeSize.constraints',Gme='org.eclipse.elk.nodeLabels.placement',Hme='org.eclipse.elk.portLabels.placement',Ime='origin',Jme='random',Kme='boundingBox.upLeft',Lme='boundingBox.lowRight',Mme='org.eclipse.elk.stress.fixed',Nme='org.eclipse.elk.stress.desiredEdgeLength',Ome='org.eclipse.elk.stress.dimension',Pme='org.eclipse.elk.stress.epsilon',Qme='org.eclipse.elk.stress.iterationLimit',Rme='org.eclipse.elk.stress',Sme='ELK Stress',Tme='org.eclipse.elk.nodeSize.minimum',Ume='org.eclipse.elk.alg.force.stress',Vme='Layered layout',Wme='org.eclipse.elk.alg.layered',Xme='org.eclipse.elk.alg.layered.compaction.components',Yme='org.eclipse.elk.alg.layered.compaction.oned',Zme='org.eclipse.elk.alg.layered.compaction.oned.algs',$me='org.eclipse.elk.alg.layered.compaction.recthull',_me='org.eclipse.elk.alg.layered.components',ane='NONE',bne={3:1,6:1,4:1,9:1,5:1,122:1},cne={3:1,6:1,4:1,5:1,141:1,106:1,120:1},dne='org.eclipse.elk.alg.layered.compound',ene={51:1},fne='org.eclipse.elk.alg.layered.graph',gne=' -> ',hne='Not supported by LGraph',ine='Port side is undefined',jne={3:1,6:1,4:1,5:1,474:1,141:1,106:1,120:1},kne={3:1,6:1,4:1,5:1,141:1,193:1,203:1,106:1,120:1},lne={3:1,6:1,4:1,5:1,141:1,1943:1,203:1,106:1,120:1},mne='([{"\' \t\r\n',nne=')]}"\' \t\r\n',one='The given string contains parts that cannot be parsed as numbers.',pne='org.eclipse.elk.core.math',qne={3:1,4:1,142:1,207:1,414:1},rne={3:1,4:1,116:1,207:1,414:1},sne='org.eclipse.elk.layered',tne='org.eclipse.elk.alg.layered.graph.transform',une='ElkGraphImporter',vne='ElkGraphImporter/lambda$0$Type',wne='ElkGraphImporter/lambda$1$Type',xne='ElkGraphImporter/lambda$2$Type',yne='ElkGraphImporter/lambda$4$Type',zne='Node margin calculation',Ane='org.eclipse.elk.alg.layered.intermediate',Bne='ONE_SIDED_GREEDY_SWITCH',Cne='TWO_SIDED_GREEDY_SWITCH',Dne='No implementation is available for the layout processor ',Ene='IntermediateProcessorStrategy',Fne="Node '",Gne='FIRST_SEPARATE',Hne='LAST_SEPARATE',Ine='Odd port side processing',Jne='org.eclipse.elk.alg.layered.intermediate.compaction',Kne='org.eclipse.elk.alg.layered.intermediate.greedyswitch',Lne='org.eclipse.elk.alg.layered.p3order.counting',Mne={225:1},Nne='org.eclipse.elk.alg.layered.intermediate.loops',One='org.eclipse.elk.alg.layered.intermediate.loops.ordering',Pne='org.eclipse.elk.alg.layered.intermediate.loops.routing',Qne='org.eclipse.elk.alg.layered.intermediate.preserveorder',Rne='org.eclipse.elk.alg.layered.intermediate.wrapping',Sne='org.eclipse.elk.alg.layered.options',Tne='INTERACTIVE',Une='DEPTH_FIRST',Vne='EDGE_LENGTH',Wne='SELF_LOOPS',Xne='firstTryWithInitialOrder',Yne='org.eclipse.elk.layered.directionCongruency',Zne='org.eclipse.elk.layered.feedbackEdges',$ne='org.eclipse.elk.layered.interactiveReferencePoint',_ne='org.eclipse.elk.layered.mergeEdges',aoe='org.eclipse.elk.layered.mergeHierarchyEdges',boe='org.eclipse.elk.layered.allowNonFlowPortsToSwitchSides',coe='org.eclipse.elk.layered.portSortingStrategy',doe='org.eclipse.elk.layered.thoroughness',eoe='org.eclipse.elk.layered.unnecessaryBendpoints',foe='org.eclipse.elk.layered.generatePositionAndLayerIds',goe='org.eclipse.elk.layered.cycleBreaking.strategy',hoe='org.eclipse.elk.layered.layering.strategy',ioe='org.eclipse.elk.layered.layering.layerConstraint',joe='org.eclipse.elk.layered.layering.layerChoiceConstraint',koe='org.eclipse.elk.layered.layering.layerId',loe='org.eclipse.elk.layered.layering.minWidth.upperBoundOnWidth',moe='org.eclipse.elk.layered.layering.minWidth.upperLayerEstimationScalingFactor',noe='org.eclipse.elk.layered.layering.nodePromotion.strategy',ooe='org.eclipse.elk.layered.layering.nodePromotion.maxIterations',poe='org.eclipse.elk.layered.layering.coffmanGraham.layerBound',qoe='org.eclipse.elk.layered.crossingMinimization.strategy',roe='org.eclipse.elk.layered.crossingMinimization.forceNodeModelOrder',soe='org.eclipse.elk.layered.crossingMinimization.hierarchicalSweepiness',toe='org.eclipse.elk.layered.crossingMinimization.semiInteractive',uoe='org.eclipse.elk.layered.crossingMinimization.positionChoiceConstraint',voe='org.eclipse.elk.layered.crossingMinimization.positionId',woe='org.eclipse.elk.layered.crossingMinimization.greedySwitch.activationThreshold',xoe='org.eclipse.elk.layered.crossingMinimization.greedySwitch.type',yoe='org.eclipse.elk.layered.crossingMinimization.greedySwitchHierarchical.type',zoe='org.eclipse.elk.layered.nodePlacement.strategy',Aoe='org.eclipse.elk.layered.nodePlacement.favorStraightEdges',Boe='org.eclipse.elk.layered.nodePlacement.bk.edgeStraightening',Coe='org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment',Doe='org.eclipse.elk.layered.nodePlacement.linearSegments.deflectionDampening',Eoe='org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility',Foe='org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.default',Goe='org.eclipse.elk.layered.edgeRouting.selfLoopDistribution',Hoe='org.eclipse.elk.layered.edgeRouting.selfLoopOrdering',Ioe='org.eclipse.elk.layered.edgeRouting.splines.mode',Joe='org.eclipse.elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor',Koe='org.eclipse.elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth',Loe='org.eclipse.elk.layered.spacing.baseValue',Moe='org.eclipse.elk.layered.spacing.edgeNodeBetweenLayers',Noe='org.eclipse.elk.layered.spacing.edgeEdgeBetweenLayers',Ooe='org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers',Poe='org.eclipse.elk.layered.priority.direction',Qoe='org.eclipse.elk.layered.priority.shortness',Roe='org.eclipse.elk.layered.priority.straightness',Soe='org.eclipse.elk.layered.compaction.connectedComponents',Toe='org.eclipse.elk.layered.compaction.postCompaction.strategy',Uoe='org.eclipse.elk.layered.compaction.postCompaction.constraints',Voe='org.eclipse.elk.layered.highDegreeNodes.treatment',Woe='org.eclipse.elk.layered.highDegreeNodes.threshold',Xoe='org.eclipse.elk.layered.highDegreeNodes.treeHeight',Yoe='org.eclipse.elk.layered.wrapping.strategy',Zoe='org.eclipse.elk.layered.wrapping.additionalEdgeSpacing',$oe='org.eclipse.elk.layered.wrapping.correctionFactor',_oe='org.eclipse.elk.layered.wrapping.cutting.strategy',ape='org.eclipse.elk.layered.wrapping.cutting.cuts',bpe='org.eclipse.elk.layered.wrapping.cutting.msd.freedom',cpe='org.eclipse.elk.layered.wrapping.validify.strategy',dpe='org.eclipse.elk.layered.wrapping.validify.forbiddenIndices',epe='org.eclipse.elk.layered.wrapping.multiEdge.improveCuts',fpe='org.eclipse.elk.layered.wrapping.multiEdge.distancePenalty',gpe='org.eclipse.elk.layered.wrapping.multiEdge.improveWrappedEdges',hpe='org.eclipse.elk.layered.edgeLabels.sideSelection',ipe='org.eclipse.elk.layered.edgeLabels.centerLabelPlacementStrategy',jpe='org.eclipse.elk.layered.considerModelOrder.strategy',kpe='org.eclipse.elk.layered.considerModelOrder.noModelOrder',lpe='org.eclipse.elk.layered.considerModelOrder.components',mpe='org.eclipse.elk.layered.considerModelOrder.longEdgeStrategy',npe='org.eclipse.elk.layered.considerModelOrder.crossingCounterNodeInfluence',ope='org.eclipse.elk.layered.considerModelOrder.crossingCounterPortInfluence',ppe='layering',qpe='layering.minWidth',rpe='layering.nodePromotion',spe='crossingMinimization',tpe='org.eclipse.elk.hierarchyHandling',upe='crossingMinimization.greedySwitch',vpe='nodePlacement',wpe='nodePlacement.bk',xpe='edgeRouting',ype='org.eclipse.elk.edgeRouting',zpe='spacing',Ape='priority',Bpe='compaction',Cpe='compaction.postCompaction',Dpe='Specifies whether and how post-process compaction is applied.',Epe='highDegreeNodes',Fpe='wrapping',Gpe='wrapping.cutting',Hpe='wrapping.validify',Ipe='wrapping.multiEdge',Jpe='edgeLabels',Kpe='considerModelOrder',Lpe='org.eclipse.elk.spacing.commentComment',Mpe='org.eclipse.elk.spacing.commentNode',Npe='org.eclipse.elk.spacing.edgeEdge',Ope='org.eclipse.elk.spacing.edgeNode',Ppe='org.eclipse.elk.spacing.labelLabel',Qpe='org.eclipse.elk.spacing.labelPortHorizontal',Rpe='org.eclipse.elk.spacing.labelPortVertical',Spe='org.eclipse.elk.spacing.labelNode',Tpe='org.eclipse.elk.spacing.nodeSelfLoop',Upe='org.eclipse.elk.spacing.portPort',Vpe='org.eclipse.elk.spacing.individual',Wpe='org.eclipse.elk.port.borderOffset',Xpe='org.eclipse.elk.noLayout',Ype='org.eclipse.elk.port.side',Zpe='org.eclipse.elk.debugMode',$pe='org.eclipse.elk.alignment',_pe='org.eclipse.elk.insideSelfLoops.activate',aqe='org.eclipse.elk.insideSelfLoops.yo',bqe='org.eclipse.elk.nodeSize.fixedGraphSize',cqe='org.eclipse.elk.direction',dqe='org.eclipse.elk.nodeLabels.padding',eqe='org.eclipse.elk.portLabels.nextToPortIfPossible',fqe='org.eclipse.elk.portLabels.treatAsGroup',gqe='org.eclipse.elk.portAlignment.default',hqe='org.eclipse.elk.portAlignment.north',iqe='org.eclipse.elk.portAlignment.south',jqe='org.eclipse.elk.portAlignment.west',kqe='org.eclipse.elk.portAlignment.east',lqe='org.eclipse.elk.contentAlignment',mqe='org.eclipse.elk.junctionPoints',nqe='org.eclipse.elk.edgeLabels.placement',oqe='org.eclipse.elk.port.index',pqe='org.eclipse.elk.commentBox',qqe='org.eclipse.elk.hypernode',rqe='org.eclipse.elk.port.anchor',sqe='org.eclipse.elk.partitioning.activate',tqe='org.eclipse.elk.partitioning.partition',uqe='org.eclipse.elk.position',vqe='org.eclipse.elk.margins',wqe='org.eclipse.elk.spacing.portsSurrounding',xqe='org.eclipse.elk.interactiveLayout',yqe='org.eclipse.elk.core.util',zqe={3:1,4:1,5:1,593:1},Aqe='NETWORK_SIMPLEX',Bqe={123:1,51:1},Cqe='org.eclipse.elk.alg.layered.p1cycles',Dqe='org.eclipse.elk.alg.layered.p2layers',Eqe={402:1,225:1},Fqe={832:1,3:1,4:1},Gqe='org.eclipse.elk.alg.layered.p3order',Hqe='org.eclipse.elk.alg.layered.p4nodes',Iqe={3:1,4:1,5:1,840:1},Jqe=1.0E-5,Kqe='org.eclipse.elk.alg.layered.p4nodes.bk',Lqe='org.eclipse.elk.alg.layered.p5edges',Mqe='org.eclipse.elk.alg.layered.p5edges.orthogonal',Nqe='org.eclipse.elk.alg.layered.p5edges.orthogonal.direction',Oqe=1.0E-6,Pqe='org.eclipse.elk.alg.layered.p5edges.splines',Qqe=0.09999999999999998,Rqe=1.0E-8,Sqe=4.71238898038469,Tqe=3.141592653589793,Uqe='org.eclipse.elk.alg.mrtree',Vqe='org.eclipse.elk.alg.mrtree.graph',Wqe='org.eclipse.elk.alg.mrtree.intermediate',Xqe='Set neighbors in level',Yqe='DESCENDANTS',Zqe='org.eclipse.elk.mrtree.weighting',$qe='org.eclipse.elk.mrtree.searchOrder',_qe='org.eclipse.elk.alg.mrtree.options',are='org.eclipse.elk.mrtree',bre='org.eclipse.elk.tree',cre='org.eclipse.elk.alg.radial',dre=6.283185307179586,ere=4.9E-324,fre='org.eclipse.elk.alg.radial.intermediate',gre='org.eclipse.elk.alg.radial.intermediate.compaction',hre={3:1,4:1,5:1,106:1},ire='org.eclipse.elk.alg.radial.intermediate.optimization',jre='No implementation is available for the layout option ',kre='org.eclipse.elk.alg.radial.options',lre='org.eclipse.elk.radial.orderId',mre='org.eclipse.elk.radial.radius',nre='org.eclipse.elk.radial.compactor',ore='org.eclipse.elk.radial.compactionStepSize',pre='org.eclipse.elk.radial.sorter',qre='org.eclipse.elk.radial.wedgeCriteria',rre='org.eclipse.elk.radial.optimizationCriteria',sre='org.eclipse.elk.radial',tre='org.eclipse.elk.alg.radial.p1position.wedge',ure='org.eclipse.elk.alg.radial.sorting',vre=5.497787143782138,wre=3.9269908169872414,xre=2.356194490192345,yre='org.eclipse.elk.alg.rectpacking',zre='org.eclipse.elk.alg.rectpacking.firstiteration',Are='org.eclipse.elk.alg.rectpacking.options',Bre='org.eclipse.elk.rectpacking.optimizationGoal',Cre='org.eclipse.elk.rectpacking.lastPlaceShift',Dre='org.eclipse.elk.rectpacking.currentPosition',Ere='org.eclipse.elk.rectpacking.desiredPosition',Fre='org.eclipse.elk.rectpacking.onlyFirstIteration',Gre='org.eclipse.elk.rectpacking.rowCompaction',Hre='org.eclipse.elk.rectpacking.expandToAspectRatio',Ire='org.eclipse.elk.rectpacking.targetWidth',Jre='org.eclipse.elk.expandNodes',Kre='org.eclipse.elk.rectpacking',Lre='org.eclipse.elk.alg.rectpacking.util',Mre='No implementation available for ',Nre='org.eclipse.elk.alg.spore',Ore='org.eclipse.elk.alg.spore.options',Pre='org.eclipse.elk.sporeCompaction',Qre='org.eclipse.elk.underlyingLayoutAlgorithm',Rre='org.eclipse.elk.processingOrder.treeConstruction',Sre='org.eclipse.elk.processingOrder.spanningTreeCostFunction',Tre='org.eclipse.elk.processingOrder.preferredRoot',Ure='org.eclipse.elk.processingOrder.rootSelection',Vre='org.eclipse.elk.structure.structureExtractionStrategy',Wre='org.eclipse.elk.compaction.compactionStrategy',Xre='org.eclipse.elk.compaction.orthogonal',Yre='org.eclipse.elk.overlapRemoval.maxIterations',Zre='org.eclipse.elk.overlapRemoval.runScanline',$re='processingOrder',_re='overlapRemoval',ase='org.eclipse.elk.sporeOverlap',bse='org.eclipse.elk.alg.spore.p1structure',cse='org.eclipse.elk.alg.spore.p2processingorder',dse='org.eclipse.elk.alg.spore.p3execution',ese='Invalid index: ',fse='org.eclipse.elk.core.alg',gse={331:1},hse={288:1},ise='Make sure its type is registered with the ',jse=' utility class.',kse='true',lse='false',mse="Couldn't clone property '",nse=0.05,ose='org.eclipse.elk.core.options',pse=1.2999999523162842,qse='org.eclipse.elk.box',rse='org.eclipse.elk.box.packingMode',sse='org.eclipse.elk.algorithm',tse='org.eclipse.elk.resolvedAlgorithm',use='org.eclipse.elk.bendPoints',vse='org.eclipse.elk.labelManager',wse='org.eclipse.elk.scaleFactor',xse='org.eclipse.elk.animate',yse='org.eclipse.elk.animTimeFactor',zse='org.eclipse.elk.layoutAncestors',Ase='org.eclipse.elk.maxAnimTime',Bse='org.eclipse.elk.minAnimTime',Cse='org.eclipse.elk.progressBar',Dse='org.eclipse.elk.validateGraph',Ese='org.eclipse.elk.validateOptions',Fse='org.eclipse.elk.zoomToFit',Gse='org.eclipse.elk.font.name',Hse='org.eclipse.elk.font.size',Ise='org.eclipse.elk.edge.type',Jse='partitioning',Kse='nodeLabels',Lse='portAlignment',Mse='nodeSize',Nse='port',Ose='portLabels',Pse='insideSelfLoops',Qse='org.eclipse.elk.fixed',Rse='org.eclipse.elk.random',Sse='port must have a parent node to calculate the port side',Tse='The edge needs to have exactly one edge section. Found: ',Use='org.eclipse.elk.core.util.adapters',Vse='org.eclipse.emf.ecore',Wse='org.eclipse.elk.graph',Xse='EMapPropertyHolder',Yse='ElkBendPoint',Zse='ElkGraphElement',$se='ElkConnectableShape',_se='ElkEdge',ate='ElkEdgeSection',bte='EModelElement',cte='ENamedElement',dte='ElkLabel',ete='ElkNode',fte='ElkPort',gte={92:1,90:1},hte='org.eclipse.emf.common.notify.impl',ite="The feature '",jte="' is not a valid changeable feature",kte='Expecting null',lte="' is not a valid feature",mte='The feature ID',nte=' is not a valid feature ID',ote=32768,pte={105:1,92:1,90:1,56:1,49:1,97:1},qte='org.eclipse.emf.ecore.impl',rte='org.eclipse.elk.graph.impl',ste='Recursive containment not allowed for ',tte="The datatype '",ute="' is not a valid classifier",vte="The value '",wte={190:1,3:1,4:1},xte="The class '",yte='http://www.eclipse.org/elk/ElkGraph',zte=1024,Ate='property',Bte='value',Cte='source',Dte='properties',Ete='identifier',Fte='height',Gte='width',Hte='parent',Ite='text',Jte='children',Kte='hierarchical',Lte='sources',Mte='targets',Nte='sections',Ote='bendPoints',Pte='outgoingShape',Qte='incomingShape',Rte='outgoingSections',Ste='incomingSections',Tte='org.eclipse.emf.common.util',Ute='Severe implementation error in the Json to ElkGraph importer.',Vte='id',Wte='org.eclipse.elk.graph.json',Xte='Unhandled parameter types: ',Yte='startPoint',Zte="An edge must have at least one source and one target (edge id: '",$te="').",_te='Referenced edge section does not exist: ',aue=" (edge id: '",bue='target',cue='sourcePoint',due='targetPoint',eue='group',fue='name',gue='connectableShape cannot be null',hue='edge cannot be null',iue="Passed edge is not 'simple'.",jue='org.eclipse.elk.graph.util',kue="The 'no duplicates' constraint is violated",lue='targetIndex=',mue=', size=',nue='sourceIndex=',oue={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1},pue={3:1,4:1,20:1,28:1,52:1,14:1,47:1,15:1,54:1,67:1,63:1,58:1,588:1},que='logging',rue='measureExecutionTime',sue='parser.parse.1',tue='parser.parse.2',uue='parser.next.1',vue='parser.next.2',wue='parser.next.3',xue='parser.next.4',yue='parser.factor.1',zue='parser.factor.2',Aue='parser.factor.3',Bue='parser.factor.4',Cue='parser.factor.5',Due='parser.factor.6',Eue='parser.atom.1',Fue='parser.atom.2',Gue='parser.atom.3',Hue='parser.atom.4',Iue='parser.atom.5',Jue='parser.cc.1',Kue='parser.cc.2',Lue='parser.cc.3',Mue='parser.cc.5',Nue='parser.cc.6',Oue='parser.cc.7',Pue='parser.cc.8',Que='parser.ope.1',Rue='parser.ope.2',Sue='parser.ope.3',Tue='parser.descape.1',Uue='parser.descape.2',Vue='parser.descape.3',Wue='parser.descape.4',Xue='parser.descape.5',Yue='parser.process.1',Zue='parser.quantifier.1',$ue='parser.quantifier.2',_ue='parser.quantifier.3',ave='parser.quantifier.4',bve='parser.quantifier.5',cve='org.eclipse.emf.common.notify',dve={415:1,672:1},eve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1},fve={366:1,143:1},gve='index=',hve={3:1,4:1,5:1,126:1},ive={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,58:1},jve={3:1,6:1,4:1,5:1,192:1},kve={3:1,4:1,5:1,165:1,367:1},lve=';/?:@&=+$,',mve='invalid authority: ',nve='EAnnotation',ove='ETypedElement',pve='EStructuralFeature',qve='EAttribute',rve='EClassifier',sve='EEnumLiteral',tve='EGenericType',uve='EOperation',vve='EParameter',wve='EReference',xve='ETypeParameter',yve='org.eclipse.emf.ecore.util',zve={76:1},Ave={3:1,20:1,14:1,15:1,58:1,589:1,76:1,69:1,95:1},Bve='org.eclipse.emf.ecore.util.FeatureMap$Entry',Cve=8192,Dve=2048,Eve='byte',Fve='char',Gve='double',Hve='float',Ive='int',Jve='long',Kve='short',Lve='java.lang.Object',Mve={3:1,4:1,5:1,247:1},Nve={3:1,4:1,5:1,673:1},Ove={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,69:1},Pve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,69:1,95:1},Qve='mixed',Rve='http:///org/eclipse/emf/ecore/util/ExtendedMetaData',Sve='kind',Tve={3:1,4:1,5:1,674:1},Uve={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1,76:1,69:1,95:1},Vve={20:1,28:1,52:1,14:1,15:1,58:1,69:1},Wve={47:1,125:1,279:1},Xve={72:1,332:1},Yve="The value of type '",Zve="' must be of type '",$ve=1316,_ve='http://www.eclipse.org/emf/2002/Ecore',awe=-32768,bwe='constraints',cwe='baseType',dwe='getEStructuralFeature',ewe='getFeatureID',fwe='feature',gwe='getOperationID',hwe='operation',iwe='defaultValue',jwe='eTypeParameters',kwe='isInstance',lwe='getEEnumLiteral',mwe='eContainingClass',nwe={55:1},owe={3:1,4:1,5:1,119:1},pwe='org.eclipse.emf.ecore.resource',qwe={92:1,90:1,591:1,1935:1},rwe='org.eclipse.emf.ecore.resource.impl',swe='unspecified',twe='simple',uwe='attribute',vwe='attributeWildcard',wwe='element',xwe='elementWildcard',ywe='collapse',zwe='itemType',Awe='namespace',Bwe='##targetNamespace',Cwe='whiteSpace',Dwe='wildcards',Ewe='http://www.eclipse.org/emf/2003/XMLType',Fwe='##any',Gwe='uninitialized',Hwe='The multiplicity constraint is violated',Iwe='org.eclipse.emf.ecore.xml.type',Jwe='ProcessingInstruction',Kwe='SimpleAnyType',Lwe='XMLTypeDocumentRoot',Mwe='org.eclipse.emf.ecore.xml.type.impl',Nwe='INF',Owe='processing',Pwe='ENTITIES_._base',Qwe='minLength',Rwe='ENTITY',Swe='NCName',Twe='IDREFS_._base',Uwe='integer',Vwe='token',Wwe='pattern',Xwe='[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*',Ywe='\\i\\c*',Zwe='[\\i-[:]][\\c-[:]]*',$we='nonPositiveInteger',_we='maxInclusive',axe='NMTOKEN',bxe='NMTOKENS_._base',cxe='nonNegativeInteger',dxe='minInclusive',exe='normalizedString',fxe='unsignedByte',gxe='unsignedInt',hxe='18446744073709551615',ixe='unsignedShort',jxe='processingInstruction',kxe='org.eclipse.emf.ecore.xml.type.internal',lxe=1114111,mxe='Internal Error: shorthands: \\u',nxe='xml:isDigit',oxe='xml:isWord',pxe='xml:isSpace',qxe='xml:isNameChar',rxe='xml:isInitialNameChar',sxe='09\u0660\u0669\u06F0\u06F9\u0966\u096F\u09E6\u09EF\u0A66\u0A6F\u0AE6\u0AEF\u0B66\u0B6F\u0BE7\u0BEF\u0C66\u0C6F\u0CE6\u0CEF\u0D66\u0D6F\u0E50\u0E59\u0ED0\u0ED9\u0F20\u0F29',txe='AZaz\xC0\xD6\xD8\xF6\xF8\u0131\u0134\u013E\u0141\u0148\u014A\u017E\u0180\u01C3\u01CD\u01F0\u01F4\u01F5\u01FA\u0217\u0250\u02A8\u02BB\u02C1\u0386\u0386\u0388\u038A\u038C\u038C\u038E\u03A1\u03A3\u03CE\u03D0\u03D6\u03DA\u03DA\u03DC\u03DC\u03DE\u03DE\u03E0\u03E0\u03E2\u03F3\u0401\u040C\u040E\u044F\u0451\u045C\u045E\u0481\u0490\u04C4\u04C7\u04C8\u04CB\u04CC\u04D0\u04EB\u04EE\u04F5\u04F8\u04F9\u0531\u0556\u0559\u0559\u0561\u0586\u05D0\u05EA\u05F0\u05F2\u0621\u063A\u0641\u064A\u0671\u06B7\u06BA\u06BE\u06C0\u06CE\u06D0\u06D3\u06D5\u06D5\u06E5\u06E6\u0905\u0939\u093D\u093D\u0958\u0961\u0985\u098C\u098F\u0990\u0993\u09A8\u09AA\u09B0\u09B2\u09B2\u09B6\u09B9\u09DC\u09DD\u09DF\u09E1\u09F0\u09F1\u0A05\u0A0A\u0A0F\u0A10\u0A13\u0A28\u0A2A\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59\u0A5C\u0A5E\u0A5E\u0A72\u0A74\u0A85\u0A8B\u0A8D\u0A8D\u0A8F\u0A91\u0A93\u0AA8\u0AAA\u0AB0\u0AB2\u0AB3\u0AB5\u0AB9\u0ABD\u0ABD\u0AE0\u0AE0\u0B05\u0B0C\u0B0F\u0B10\u0B13\u0B28\u0B2A\u0B30\u0B32\u0B33\u0B36\u0B39\u0B3D\u0B3D\u0B5C\u0B5D\u0B5F\u0B61\u0B85\u0B8A\u0B8E\u0B90\u0B92\u0B95\u0B99\u0B9A\u0B9C\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8\u0BAA\u0BAE\u0BB5\u0BB7\u0BB9\u0C05\u0C0C\u0C0E\u0C10\u0C12\u0C28\u0C2A\u0C33\u0C35\u0C39\u0C60\u0C61\u0C85\u0C8C\u0C8E\u0C90\u0C92\u0CA8\u0CAA\u0CB3\u0CB5\u0CB9\u0CDE\u0CDE\u0CE0\u0CE1\u0D05\u0D0C\u0D0E\u0D10\u0D12\u0D28\u0D2A\u0D39\u0D60\u0D61\u0E01\u0E2E\u0E30\u0E30\u0E32\u0E33\u0E40\u0E45\u0E81\u0E82\u0E84\u0E84\u0E87\u0E88\u0E8A\u0E8A\u0E8D\u0E8D\u0E94\u0E97\u0E99\u0E9F\u0EA1\u0EA3\u0EA5\u0EA5\u0EA7\u0EA7\u0EAA\u0EAB\u0EAD\u0EAE\u0EB0\u0EB0\u0EB2\u0EB3\u0EBD\u0EBD\u0EC0\u0EC4\u0F40\u0F47\u0F49\u0F69\u10A0\u10C5\u10D0\u10F6\u1100\u1100\u1102\u1103\u1105\u1107\u1109\u1109\u110B\u110C\u110E\u1112\u113C\u113C\u113E\u113E\u1140\u1140\u114C\u114C\u114E\u114E\u1150\u1150\u1154\u1155\u1159\u1159\u115F\u1161\u1163\u1163\u1165\u1165\u1167\u1167\u1169\u1169\u116D\u116E\u1172\u1173\u1175\u1175\u119E\u119E\u11A8\u11A8\u11AB\u11AB\u11AE\u11AF\u11B7\u11B8\u11BA\u11BA\u11BC\u11C2\u11EB\u11EB\u11F0\u11F0\u11F9\u11F9\u1E00\u1E9B\u1EA0\u1EF9\u1F00\u1F15\u1F18\u1F1D\u1F20\u1F45\u1F48\u1F4D\u1F50\u1F57\u1F59\u1F59\u1F5B\u1F5B\u1F5D\u1F5D\u1F5F\u1F7D\u1F80\u1FB4\u1FB6\u1FBC\u1FBE\u1FBE\u1FC2\u1FC4\u1FC6\u1FCC\u1FD0\u1FD3\u1FD6\u1FDB\u1FE0\u1FEC\u1FF2\u1FF4\u1FF6\u1FFC\u2126\u2126\u212A\u212B\u212E\u212E\u2180\u2182\u3007\u3007\u3021\u3029\u3041\u3094\u30A1\u30FA\u3105\u312C\u4E00\u9FA5\uAC00\uD7A3',uxe='Private Use',vxe='ASSIGNED',wxe='\x00\x7F\x80\xFF\u0100\u017F\u0180\u024F\u0250\u02AF\u02B0\u02FF\u0300\u036F\u0370\u03FF\u0400\u04FF\u0530\u058F\u0590\u05FF\u0600\u06FF\u0700\u074F\u0780\u07BF\u0900\u097F\u0980\u09FF\u0A00\u0A7F\u0A80\u0AFF\u0B00\u0B7F\u0B80\u0BFF\u0C00\u0C7F\u0C80\u0CFF\u0D00\u0D7F\u0D80\u0DFF\u0E00\u0E7F\u0E80\u0EFF\u0F00\u0FFF\u1000\u109F\u10A0\u10FF\u1100\u11FF\u1200\u137F\u13A0\u13FF\u1400\u167F\u1680\u169F\u16A0\u16FF\u1780\u17FF\u1800\u18AF\u1E00\u1EFF\u1F00\u1FFF\u2000\u206F\u2070\u209F\u20A0\u20CF\u20D0\u20FF\u2100\u214F\u2150\u218F\u2190\u21FF\u2200\u22FF\u2300\u23FF\u2400\u243F\u2440\u245F\u2460\u24FF\u2500\u257F\u2580\u259F\u25A0\u25FF\u2600\u26FF\u2700\u27BF\u2800\u28FF\u2E80\u2EFF\u2F00\u2FDF\u2FF0\u2FFF\u3000\u303F\u3040\u309F\u30A0\u30FF\u3100\u312F\u3130\u318F\u3190\u319F\u31A0\u31BF\u3200\u32FF\u3300\u33FF\u3400\u4DB5\u4E00\u9FFF\uA000\uA48F\uA490\uA4CF\uAC00\uD7A3\uE000\uF8FF\uF900\uFAFF\uFB00\uFB4F\uFB50\uFDFF\uFE20\uFE2F\uFE30\uFE4F\uFE50\uFE6F\uFE70\uFEFE\uFEFF\uFEFF\uFF00\uFFEF',xxe='UNASSIGNED',yxe={3:1,117:1},zxe='org.eclipse.emf.ecore.xml.type.util',Axe={3:1,4:1,5:1,368:1},Bxe='org.eclipse.xtext.xbase.lib',Cxe='Cannot add elements to a Range',Dxe='Cannot set elements in a Range',Exe='Cannot remove elements from a Range',Fxe='locale',Gxe='default',Hxe='user.agent';var _,_bb,Wbb,tbb=-1;$wnd.goog=$wnd.goog||{};$wnd.goog.global=$wnd.goog.global||$wnd;acb();bcb(1,null,{},nb);_.Fb=function ob(a){return mb(this,a)};_.Gb=function qb(){return this.gm};_.Hb=function sb(){return FCb(this)};_.Ib=function ub(){var a;return hdb(rb(this))+'@'+(a=tb(this)>>>0,a.toString(16))};_.equals=function(a){return this.Fb(a)};_.hashCode=function(){return this.Hb()};_.toString=function(){return this.Ib()};var xD,yD,zD;bcb(290,1,{290:1,2026:1},jdb);_.le=function kdb(a){var b;b=new jdb;b.i=4;a>1?(b.c=rdb(this,a-1)):(b.c=this);return b};_.me=function qdb(){fdb(this);return this.b};_.ne=function sdb(){return hdb(this)};_.oe=function udb(){return fdb(this),this.k};_.pe=function wdb(){return (this.i&4)!=0};_.qe=function xdb(){return (this.i&1)!=0};_.Ib=function Adb(){return idb(this)};_.i=0;var edb=1;var SI=mdb(Phe,'Object',1);var AI=mdb(Phe,'Class',290);bcb(1998,1,Qhe);var $D=mdb(Rhe,'Optional',1998);bcb(1170,1998,Qhe,xb);_.Fb=function yb(a){return a===this};_.Hb=function zb(){return 2040732332};_.Ib=function Ab(){return 'Optional.absent()'};_.Jb=function Bb(a){Qb(a);return wb(),vb};var vb;var YD=mdb(Rhe,'Absent',1170);bcb(628,1,{},Gb);var ZD=mdb(Rhe,'Joiner',628);var _D=odb(Rhe,'Predicate');bcb(582,1,{169:1,582:1,3:1,45:1},Yb);_.Mb=function ac(a){return Xb(this,a)};_.Lb=function Zb(a){return Xb(this,a)};_.Fb=function $b(a){var b;if(JD(a,582)){b=BD(a,582);return At(this.a,b.a)}return false};_.Hb=function _b(){return qmb(this.a)+306654252};_.Ib=function bc(){return Wb(this.a)};var aE=mdb(Rhe,'Predicates/AndPredicate',582);bcb(408,1998,{408:1,3:1},cc);_.Fb=function dc(a){var b;if(JD(a,408)){b=BD(a,408);return pb(this.a,b.a)}return false};_.Hb=function ec(){return 1502476572+tb(this.a)};_.Ib=function fc(){return Whe+this.a+')'};_.Jb=function gc(a){return new cc(Rb(a.Kb(this.a),'the Function passed to Optional.transform() must not return null.'))};var bE=mdb(Rhe,'Present',408);bcb(198,1,Yhe);_.Nb=function kc(a){Rrb(this,a)};_.Qb=function lc(){jc()};var MH=mdb(Zhe,'UnmodifiableIterator',198);bcb(1978,198,$he);_.Qb=function nc(){jc()};_.Rb=function mc(a){throw vbb(new bgb)};_.Wb=function oc(a){throw vbb(new bgb)};var NH=mdb(Zhe,'UnmodifiableListIterator',1978);bcb(386,1978,$he);_.Ob=function rc(){return this.c0};_.Pb=function tc(){if(this.c>=this.d){throw vbb(new utb)}return this.Xb(this.c++)};_.Tb=function uc(){return this.c};_.Ub=function vc(){if(this.c<=0){throw vbb(new utb)}return this.Xb(--this.c)};_.Vb=function wc(){return this.c-1};_.c=0;_.d=0;var cE=mdb(Zhe,'AbstractIndexedListIterator',386);bcb(699,198,Yhe);_.Ob=function Ac(){return xc(this)};_.Pb=function Bc(){return yc(this)};_.e=1;var dE=mdb(Zhe,'AbstractIterator',699);bcb(1986,1,{224:1});_.Zb=function Hc(){var a;return a=this.f,!a?(this.f=this.ac()):a};_.Fb=function Ic(a){return hw(this,a)};_.Hb=function Jc(){return tb(this.Zb())};_.dc=function Kc(){return this.gc()==0};_.ec=function Lc(){return Ec(this)};_.Ib=function Mc(){return fcb(this.Zb())};var IE=mdb(Zhe,'AbstractMultimap',1986);bcb(726,1986,_he);_.$b=function Xc(){Nc(this)};_._b=function Yc(a){return Oc(this,a)};_.ac=function Zc(){return new ne(this,this.c)};_.ic=function $c(a){return this.hc()};_.bc=function _c(){return new zf(this,this.c)};_.jc=function ad(){return this.mc(this.hc())};_.kc=function bd(){return new Hd(this)};_.lc=function cd(){return Yj(this.c.vc().Nc(),new $g,64,this.d)};_.cc=function dd(a){return Qc(this,a)};_.fc=function gd(a){return Sc(this,a)};_.gc=function hd(){return this.d};_.mc=function jd(a){return mmb(),new lnb(a)};_.nc=function kd(){return new Dd(this)};_.oc=function ld(){return Yj(this.c.Cc().Nc(),new Fd,64,this.d)};_.pc=function md(a,b){return new dg(this,a,b,null)};_.d=0;var DE=mdb(Zhe,'AbstractMapBasedMultimap',726);bcb(1631,726,_he);_.hc=function pd(){return new Skb(this.a)};_.jc=function qd(){return mmb(),mmb(),jmb};_.cc=function sd(a){return BD(Qc(this,a),15)};_.fc=function ud(a){return BD(Sc(this,a),15)};_.Zb=function od(){return nd(this)};_.Fb=function rd(a){return hw(this,a)};_.qc=function td(a){return BD(Qc(this,a),15)};_.rc=function vd(a){return BD(Sc(this,a),15)};_.mc=function wd(a){return vmb(BD(a,15))};_.pc=function xd(a,b){return Vc(this,a,BD(b,15),null)};var eE=mdb(Zhe,'AbstractListMultimap',1631);bcb(732,1,aie);_.Nb=function zd(a){Rrb(this,a)};_.Ob=function Ad(){return this.c.Ob()||this.e.Ob()};_.Pb=function Bd(){var a;if(!this.e.Ob()){a=BD(this.c.Pb(),42);this.b=a.cd();this.a=BD(a.dd(),14);this.e=this.a.Kc()}return this.sc(this.b,this.e.Pb())};_.Qb=function Cd(){this.e.Qb();this.a.dc()&&this.c.Qb();--this.d.d};var mE=mdb(Zhe,'AbstractMapBasedMultimap/Itr',732);bcb(1099,732,aie,Dd);_.sc=function Ed(a,b){return b};var fE=mdb(Zhe,'AbstractMapBasedMultimap/1',1099);bcb(1100,1,{},Fd);_.Kb=function Gd(a){return BD(a,14).Nc()};var gE=mdb(Zhe,'AbstractMapBasedMultimap/1methodref$spliterator$Type',1100);bcb(1101,732,aie,Hd);_.sc=function Id(a,b){return new Wo(a,b)};var hE=mdb(Zhe,'AbstractMapBasedMultimap/2',1101);var DK=odb(bie,'Map');bcb(1967,1,cie);_.wc=function Td(a){stb(this,a)};_.yc=function $d(a,b,c){return ttb(this,a,b,c)};_.$b=function Od(){this.vc().$b()};_.tc=function Pd(a){return Jd(this,a)};_._b=function Qd(a){return !!Kd(this,a,false)};_.uc=function Rd(a){var b,c,d;for(c=this.vc().Kc();c.Ob();){b=BD(c.Pb(),42);d=b.dd();if(PD(a)===PD(d)||a!=null&&pb(a,d)){return true}}return false};_.Fb=function Sd(a){var b,c,d;if(a===this){return true}if(!JD(a,83)){return false}d=BD(a,83);if(this.gc()!=d.gc()){return false}for(c=d.vc().Kc();c.Ob();){b=BD(c.Pb(),42);if(!this.tc(b)){return false}}return true};_.xc=function Ud(a){return Wd(Kd(this,a,false))};_.Hb=function Xd(){return pmb(this.vc())};_.dc=function Yd(){return this.gc()==0};_.ec=function Zd(){return new Pib(this)};_.zc=function _d(a,b){throw vbb(new cgb('Put not supported on this map'))};_.Ac=function ae(a){Ld(this,a)};_.Bc=function be(a){return Wd(Kd(this,a,true))};_.gc=function ce(){return this.vc().gc()};_.Ib=function de(){return Md(this)};_.Cc=function ee(){return new $ib(this)};var sJ=mdb(bie,'AbstractMap',1967);bcb(1987,1967,cie);_.bc=function ge(){return new rf(this)};_.vc=function he(){return fe(this)};_.ec=function ie(){var a;a=this.g;return !a?(this.g=this.bc()):a};_.Cc=function je(){var a;a=this.i;return !a?(this.i=new Zv(this)):a};var bH=mdb(Zhe,'Maps/ViewCachingAbstractMap',1987);bcb(389,1987,cie,ne);_.xc=function se(a){return ke(this,a)};_.Bc=function ve(a){return le(this,a)};_.$b=function oe(){this.d==this.e.c?this.e.$b():ir(new mf(this))};_._b=function pe(a){return Gv(this.d,a)};_.Ec=function qe(){return new df(this)};_.Dc=function(){return this.Ec()};_.Fb=function re(a){return this===a||pb(this.d,a)};_.Hb=function te(){return tb(this.d)};_.ec=function ue(){return this.e.ec()};_.gc=function we(){return this.d.gc()};_.Ib=function xe(){return fcb(this.d)};var lE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap',389);var KI=odb(Phe,'Iterable');bcb(28,1,die);_.Jc=function Le(a){reb(this,a)};_.Lc=function Ne(){return this.Oc()};_.Nc=function Pe(){return new Kub(this,0)};_.Oc=function Qe(){return new YAb(null,this.Nc())};_.Fc=function Ge(a){throw vbb(new cgb('Add not supported on this collection'))};_.Gc=function He(a){return ye(this,a)};_.$b=function Ie(){Ae(this)};_.Hc=function Je(a){return ze(this,a,false)};_.Ic=function Ke(a){return Be(this,a)};_.dc=function Me(){return this.gc()==0};_.Mc=function Oe(a){return ze(this,a,true)};_.Pc=function Re(){return De(this)};_.Qc=function Se(a){return Ee(this,a)};_.Ib=function Te(){return Fe(this)};var dJ=mdb(bie,'AbstractCollection',28);var LK=odb(bie,'Set');bcb(eie,28,fie);_.Nc=function Ye(){return new Kub(this,1)};_.Fb=function We(a){return Ue(this,a)};_.Hb=function Xe(){return pmb(this)};var zJ=mdb(bie,'AbstractSet',eie);bcb(1970,eie,fie);var BH=mdb(Zhe,'Sets/ImprovedAbstractSet',1970);bcb(1971,1970,fie);_.$b=function $e(){this.Rc().$b()};_.Hc=function _e(a){return Ze(this,a)};_.dc=function af(){return this.Rc().dc()};_.Mc=function bf(a){var b;if(this.Hc(a)){b=BD(a,42);return this.Rc().ec().Mc(b.cd())}return false};_.gc=function cf(){return this.Rc().gc()};var WG=mdb(Zhe,'Maps/EntrySet',1971);bcb(1097,1971,fie,df);_.Hc=function ef(a){return Ck(this.a.d.vc(),a)};_.Kc=function ff(){return new mf(this.a)};_.Rc=function gf(){return this.a};_.Mc=function hf(a){var b;if(!Ck(this.a.d.vc(),a)){return false}b=BD(a,42);Tc(this.a.e,b.cd());return true};_.Nc=function jf(){return $j(this.a.d.vc().Nc(),new kf(this.a))};var jE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapEntries',1097);bcb(1098,1,{},kf);_.Kb=function lf(a){return me(this.a,BD(a,42))};var iE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapEntries/0methodref$wrapEntry$Type',1098);bcb(730,1,aie,mf);_.Nb=function nf(a){Rrb(this,a)};_.Pb=function pf(){var a;return a=BD(this.b.Pb(),42),this.a=BD(a.dd(),14),me(this.c,a)};_.Ob=function of(){return this.b.Ob()};_.Qb=function qf(){Vb(!!this.a);this.b.Qb();this.c.e.d-=this.a.gc();this.a.$b();this.a=null};var kE=mdb(Zhe,'AbstractMapBasedMultimap/AsMap/AsMapIterator',730);bcb(532,1970,fie,rf);_.$b=function sf(){this.b.$b()};_.Hc=function tf(a){return this.b._b(a)};_.Jc=function uf(a){Qb(a);this.b.wc(new Xv(a))};_.dc=function vf(){return this.b.dc()};_.Kc=function wf(){return new Mv(this.b.vc().Kc())};_.Mc=function xf(a){if(this.b._b(a)){this.b.Bc(a);return true}return false};_.gc=function yf(){return this.b.gc()};var $G=mdb(Zhe,'Maps/KeySet',532);bcb(318,532,fie,zf);_.$b=function Af(){var a;ir((a=this.b.vc().Kc(),new Hf(this,a)))};_.Ic=function Bf(a){return this.b.ec().Ic(a)};_.Fb=function Cf(a){return this===a||pb(this.b.ec(),a)};_.Hb=function Df(){return tb(this.b.ec())};_.Kc=function Ef(){var a;return a=this.b.vc().Kc(),new Hf(this,a)};_.Mc=function Ff(a){var b,c;c=0;b=BD(this.b.Bc(a),14);if(b){c=b.gc();b.$b();this.a.d-=c}return c>0};_.Nc=function Gf(){return this.b.ec().Nc()};var oE=mdb(Zhe,'AbstractMapBasedMultimap/KeySet',318);bcb(731,1,aie,Hf);_.Nb=function If(a){Rrb(this,a)};_.Ob=function Jf(){return this.c.Ob()};_.Pb=function Kf(){this.a=BD(this.c.Pb(),42);return this.a.cd()};_.Qb=function Lf(){var a;Vb(!!this.a);a=BD(this.a.dd(),14);this.c.Qb();this.b.a.d-=a.gc();a.$b();this.a=null};var nE=mdb(Zhe,'AbstractMapBasedMultimap/KeySet/1',731);bcb(491,389,{83:1,161:1},Mf);_.bc=function Nf(){return this.Sc()};_.ec=function Pf(){return this.Tc()};_.Sc=function Of(){return new Yf(this.c,this.Uc())};_.Tc=function Qf(){var a;return a=this.b,!a?(this.b=this.Sc()):a};_.Uc=function Rf(){return BD(this.d,161)};var sE=mdb(Zhe,'AbstractMapBasedMultimap/SortedAsMap',491);bcb(542,491,gie,Sf);_.bc=function Tf(){return new $f(this.a,BD(BD(this.d,161),171))};_.Sc=function Uf(){return new $f(this.a,BD(BD(this.d,161),171))};_.ec=function Vf(){var a;return a=this.b,BD(!a?(this.b=new $f(this.a,BD(BD(this.d,161),171))):a,271)};_.Tc=function Wf(){var a;return a=this.b,BD(!a?(this.b=new $f(this.a,BD(BD(this.d,161),171))):a,271)};_.Uc=function Xf(){return BD(BD(this.d,161),171)};var pE=mdb(Zhe,'AbstractMapBasedMultimap/NavigableAsMap',542);bcb(490,318,hie,Yf);_.Nc=function Zf(){return this.b.ec().Nc()};var tE=mdb(Zhe,'AbstractMapBasedMultimap/SortedKeySet',490);bcb(388,490,iie,$f);var qE=mdb(Zhe,'AbstractMapBasedMultimap/NavigableKeySet',388);bcb(541,28,die,dg);_.Fc=function eg(a){var b,c;ag(this);c=this.d.dc();b=this.d.Fc(a);if(b){++this.f.d;c&&_f(this)}return b};_.Gc=function fg(a){var b,c,d;if(a.dc()){return false}d=(ag(this),this.d.gc());b=this.d.Gc(a);if(b){c=this.d.gc();this.f.d+=c-d;d==0&&_f(this)}return b};_.$b=function gg(){var a;a=(ag(this),this.d.gc());if(a==0){return}this.d.$b();this.f.d-=a;bg(this)};_.Hc=function hg(a){ag(this);return this.d.Hc(a)};_.Ic=function ig(a){ag(this);return this.d.Ic(a)};_.Fb=function jg(a){if(a===this){return true}ag(this);return pb(this.d,a)};_.Hb=function kg(){ag(this);return tb(this.d)};_.Kc=function lg(){ag(this);return new Gg(this)};_.Mc=function mg(a){var b;ag(this);b=this.d.Mc(a);if(b){--this.f.d;bg(this)}return b};_.gc=function ng(){return cg(this)};_.Nc=function og(){return ag(this),this.d.Nc()};_.Ib=function pg(){ag(this);return fcb(this.d)};var vE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedCollection',541);var yK=odb(bie,'List');bcb(728,541,{20:1,28:1,14:1,15:1},qg);_.ad=function zg(a){ktb(this,a)};_.Nc=function Ag(){return ag(this),this.d.Nc()};_.Vc=function rg(a,b){var c;ag(this);c=this.d.dc();BD(this.d,15).Vc(a,b);++this.a.d;c&&_f(this)};_.Wc=function sg(a,b){var c,d,e;if(b.dc()){return false}e=(ag(this),this.d.gc());c=BD(this.d,15).Wc(a,b);if(c){d=this.d.gc();this.a.d+=d-e;e==0&&_f(this)}return c};_.Xb=function tg(a){ag(this);return BD(this.d,15).Xb(a)};_.Xc=function ug(a){ag(this);return BD(this.d,15).Xc(a)};_.Yc=function vg(){ag(this);return new Mg(this)};_.Zc=function wg(a){ag(this);return new Ng(this,a)};_.$c=function xg(a){var b;ag(this);b=BD(this.d,15).$c(a);--this.a.d;bg(this);return b};_._c=function yg(a,b){ag(this);return BD(this.d,15)._c(a,b)};_.bd=function Bg(a,b){ag(this);return Vc(this.a,this.e,BD(this.d,15).bd(a,b),!this.b?this:this.b)};var xE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedList',728);bcb(1096,728,{20:1,28:1,14:1,15:1,54:1},Cg);var rE=mdb(Zhe,'AbstractMapBasedMultimap/RandomAccessWrappedList',1096);bcb(620,1,aie,Gg);_.Nb=function Ig(a){Rrb(this,a)};_.Ob=function Jg(){Fg(this);return this.b.Ob()};_.Pb=function Kg(){Fg(this);return this.b.Pb()};_.Qb=function Lg(){Eg(this)};var uE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedCollection/WrappedIterator',620);bcb(729,620,jie,Mg,Ng);_.Qb=function Tg(){Eg(this)};_.Rb=function Og(a){var b;b=cg(this.a)==0;(Fg(this),BD(this.b,125)).Rb(a);++this.a.a.d;b&&_f(this.a)};_.Sb=function Pg(){return (Fg(this),BD(this.b,125)).Sb()};_.Tb=function Qg(){return (Fg(this),BD(this.b,125)).Tb()};_.Ub=function Rg(){return (Fg(this),BD(this.b,125)).Ub()};_.Vb=function Sg(){return (Fg(this),BD(this.b,125)).Vb()};_.Wb=function Ug(a){(Fg(this),BD(this.b,125)).Wb(a)};var wE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedList/WrappedListIterator',729);bcb(727,541,hie,Vg);_.Nc=function Wg(){return ag(this),this.d.Nc()};var AE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedSortedSet',727);bcb(1095,727,iie,Xg);var yE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedNavigableSet',1095);bcb(1094,541,fie,Yg);_.Nc=function Zg(){return ag(this),this.d.Nc()};var zE=mdb(Zhe,'AbstractMapBasedMultimap/WrappedSet',1094);bcb(1103,1,{},$g);_.Kb=function _g(a){return fd(BD(a,42))};var BE=mdb(Zhe,'AbstractMapBasedMultimap/lambda$1$Type',1103);bcb(1102,1,{},ah);_.Kb=function bh(a){return new Wo(this.a,a)};var CE=mdb(Zhe,'AbstractMapBasedMultimap/lambda$2$Type',1102);var CK=odb(bie,'Map/Entry');bcb(345,1,kie);_.Fb=function dh(a){var b;if(JD(a,42)){b=BD(a,42);return Hb(this.cd(),b.cd())&&Hb(this.dd(),b.dd())}return false};_.Hb=function eh(){var a,b;a=this.cd();b=this.dd();return (a==null?0:tb(a))^(b==null?0:tb(b))};_.ed=function fh(a){throw vbb(new bgb)};_.Ib=function gh(){return this.cd()+'='+this.dd()};var EE=mdb(Zhe,lie,345);bcb(1988,28,die);_.$b=function hh(){this.fd().$b()};_.Hc=function ih(a){var b;if(JD(a,42)){b=BD(a,42);return Cc(this.fd(),b.cd(),b.dd())}return false};_.Mc=function jh(a){var b;if(JD(a,42)){b=BD(a,42);return Gc(this.fd(),b.cd(),b.dd())}return false};_.gc=function kh(){return this.fd().d};var fH=mdb(Zhe,'Multimaps/Entries',1988);bcb(733,1988,die,lh);_.Kc=function mh(){return this.a.kc()};_.fd=function nh(){return this.a};_.Nc=function oh(){return this.a.lc()};var FE=mdb(Zhe,'AbstractMultimap/Entries',733);bcb(734,733,fie,ph);_.Nc=function sh(){return this.a.lc()};_.Fb=function qh(a){return Ax(this,a)};_.Hb=function rh(){return Bx(this)};var GE=mdb(Zhe,'AbstractMultimap/EntrySet',734);bcb(735,28,die,th);_.$b=function uh(){this.a.$b()};_.Hc=function vh(a){return Dc(this.a,a)};_.Kc=function wh(){return this.a.nc()};_.gc=function xh(){return this.a.d};_.Nc=function yh(){return this.a.oc()};var HE=mdb(Zhe,'AbstractMultimap/Values',735);bcb(1989,28,{835:1,20:1,28:1,14:1});_.Jc=function Gh(a){Qb(a);Ah(this).Jc(new Xw(a))};_.Nc=function Kh(){var a;return a=Ah(this).Nc(),Yj(a,new cx,64|a.qd()&1296,this.a.d)};_.Fc=function Ch(a){zh();return true};_.Gc=function Dh(a){return Qb(this),Qb(a),JD(a,543)?Zw(BD(a,835)):!a.dc()&&fr(this,a.Kc())};_.Hc=function Eh(a){var b;return b=BD(Hv(nd(this.a),a),14),(!b?0:b.gc())>0};_.Fb=function Fh(a){return $w(this,a)};_.Hb=function Hh(){return tb(Ah(this))};_.dc=function Ih(){return Ah(this).dc()};_.Mc=function Jh(a){return Bw(this,a,1)>0};_.Ib=function Lh(){return fcb(Ah(this))};var KE=mdb(Zhe,'AbstractMultiset',1989);bcb(1991,1970,fie);_.$b=function Mh(){Nc(this.a.a)};_.Hc=function Nh(a){var b,c;if(JD(a,492)){c=BD(a,416);if(BD(c.a.dd(),14).gc()<=0){return false}b=Aw(this.a,c.a.cd());return b==BD(c.a.dd(),14).gc()}return false};_.Mc=function Oh(a){var b,c,d,e;if(JD(a,492)){c=BD(a,416);b=c.a.cd();d=BD(c.a.dd(),14).gc();if(d!=0){e=this.a;return ax(e,b,d)}}return false};var pH=mdb(Zhe,'Multisets/EntrySet',1991);bcb(1109,1991,fie,Ph);_.Kc=function Qh(){return new Lw(fe(nd(this.a.a)).Kc())};_.gc=function Rh(){return nd(this.a.a).gc()};var JE=mdb(Zhe,'AbstractMultiset/EntrySet',1109);bcb(619,726,_he);_.hc=function Uh(){return this.gd()};_.jc=function Vh(){return this.hd()};_.cc=function Yh(a){return this.jd(a)};_.fc=function $h(a){return this.kd(a)};_.Zb=function Th(){var a;return a=this.f,!a?(this.f=this.ac()):a};_.hd=function Wh(){return mmb(),mmb(),lmb};_.Fb=function Xh(a){return hw(this,a)};_.jd=function Zh(a){return BD(Qc(this,a),21)};_.kd=function _h(a){return BD(Sc(this,a),21)};_.mc=function ai(a){return mmb(),new zob(BD(a,21))};_.pc=function bi(a,b){return new Yg(this,a,BD(b,21))};var LE=mdb(Zhe,'AbstractSetMultimap',619);bcb(1657,619,_he);_.hc=function ei(){return new Hxb(this.b)};_.gd=function fi(){return new Hxb(this.b)};_.jc=function gi(){return Ix(new Hxb(this.b))};_.hd=function hi(){return Ix(new Hxb(this.b))};_.cc=function ii(a){return BD(BD(Qc(this,a),21),84)};_.jd=function ji(a){return BD(BD(Qc(this,a),21),84)};_.fc=function ki(a){return BD(BD(Sc(this,a),21),84)};_.kd=function li(a){return BD(BD(Sc(this,a),21),84)};_.mc=function mi(a){return JD(a,271)?Ix(BD(a,271)):(mmb(),new Zob(BD(a,84)))};_.Zb=function di(){var a;return a=this.f,!a?(this.f=JD(this.c,171)?new Sf(this,BD(this.c,171)):JD(this.c,161)?new Mf(this,BD(this.c,161)):new ne(this,this.c)):a};_.pc=function ni(a,b){return JD(b,271)?new Xg(this,a,BD(b,271)):new Vg(this,a,BD(b,84))};var NE=mdb(Zhe,'AbstractSortedSetMultimap',1657);bcb(1658,1657,_he);_.Zb=function pi(){var a;return a=this.f,BD(BD(!a?(this.f=JD(this.c,171)?new Sf(this,BD(this.c,171)):JD(this.c,161)?new Mf(this,BD(this.c,161)):new ne(this,this.c)):a,161),171)};_.ec=function ri(){var a;return a=this.i,BD(BD(!a?(this.i=JD(this.c,171)?new $f(this,BD(this.c,171)):JD(this.c,161)?new Yf(this,BD(this.c,161)):new zf(this,this.c)):a,84),271)};_.bc=function qi(){return JD(this.c,171)?new $f(this,BD(this.c,171)):JD(this.c,161)?new Yf(this,BD(this.c,161)):new zf(this,this.c)};var ME=mdb(Zhe,'AbstractSortedKeySortedSetMultimap',1658);bcb(2010,1,{1947:1});_.Fb=function si(a){return zy(this,a)};_.Hb=function ti(){var a;return pmb((a=this.g,!a?(this.g=new vi(this)):a))};_.Ib=function ui(){var a;return Md((a=this.f,!a?(this.f=new Rj(this)):a))};var QE=mdb(Zhe,'AbstractTable',2010);bcb(665,eie,fie,vi);_.$b=function wi(){Pi()};_.Hc=function xi(a){var b,c;if(JD(a,468)){b=BD(a,682);c=BD(Hv(Vi(this.a),Em(b.c.e,b.b)),83);return !!c&&Ck(c.vc(),new Wo(Em(b.c.c,b.a),Mi(b.c,b.b,b.a)))}return false};_.Kc=function yi(){return Ni(this.a)};_.Mc=function zi(a){var b,c;if(JD(a,468)){b=BD(a,682);c=BD(Hv(Vi(this.a),Em(b.c.e,b.b)),83);return !!c&&Dk(c.vc(),new Wo(Em(b.c.c,b.a),Mi(b.c,b.b,b.a)))}return false};_.gc=function Ai(){return Xi(this.a)};_.Nc=function Bi(){return Oi(this.a)};var OE=mdb(Zhe,'AbstractTable/CellSet',665);bcb(1928,28,die,Ci);_.$b=function Di(){Pi()};_.Hc=function Ei(a){return Qi(this.a,a)};_.Kc=function Fi(){return Zi(this.a)};_.gc=function Gi(){return Xi(this.a)};_.Nc=function Hi(){return $i(this.a)};var PE=mdb(Zhe,'AbstractTable/Values',1928);bcb(1632,1631,_he);var RE=mdb(Zhe,'ArrayListMultimapGwtSerializationDependencies',1632);bcb(513,1632,_he,Ji,Ki);_.hc=function Li(){return new Skb(this.a)};_.a=0;var SE=mdb(Zhe,'ArrayListMultimap',513);bcb(664,2010,{664:1,1947:1,3:1},_i);var cF=mdb(Zhe,'ArrayTable',664);bcb(1924,386,$he,aj);_.Xb=function bj(a){return new hj(this.a,a)};var TE=mdb(Zhe,'ArrayTable/1',1924);bcb(1925,1,{},cj);_.ld=function dj(a){return new hj(this.a,a)};var UE=mdb(Zhe,'ArrayTable/1methodref$getCell$Type',1925);bcb(2011,1,{682:1});_.Fb=function ej(a){var b;if(a===this){return true}if(JD(a,468)){b=BD(a,682);return Hb(Em(this.c.e,this.b),Em(b.c.e,b.b))&&Hb(Em(this.c.c,this.a),Em(b.c.c,b.a))&&Hb(Mi(this.c,this.b,this.a),Mi(b.c,b.b,b.a))}return false};_.Hb=function fj(){return Hlb(OC(GC(SI,1),Uhe,1,5,[Em(this.c.e,this.b),Em(this.c.c,this.a),Mi(this.c,this.b,this.a)]))};_.Ib=function gj(){return '('+Em(this.c.e,this.b)+','+Em(this.c.c,this.a)+')='+Mi(this.c,this.b,this.a)};var JH=mdb(Zhe,'Tables/AbstractCell',2011);bcb(468,2011,{468:1,682:1},hj);_.a=0;_.b=0;_.d=0;var VE=mdb(Zhe,'ArrayTable/2',468);bcb(1927,1,{},ij);_.ld=function jj(a){return Ti(this.a,a)};var WE=mdb(Zhe,'ArrayTable/2methodref$getValue$Type',1927);bcb(1926,386,$he,kj);_.Xb=function lj(a){return Ti(this.a,a)};var XE=mdb(Zhe,'ArrayTable/3',1926);bcb(1979,1967,cie);_.$b=function nj(){ir(this.kc())};_.vc=function oj(){return new Sv(this)};_.lc=function pj(){return new Mub(this.kc(),this.gc())};var YG=mdb(Zhe,'Maps/IteratorBasedAbstractMap',1979);bcb(828,1979,cie);_.$b=function tj(){throw vbb(new bgb)};_._b=function uj(a){return sn(this.c,a)};_.kc=function vj(){return new Jj(this,this.c.b.c.gc())};_.lc=function wj(){return Zj(this.c.b.c.gc(),16,new Dj(this))};_.xc=function xj(a){var b;b=BD(tn(this.c,a),19);return !b?null:this.nd(b.a)};_.dc=function yj(){return this.c.b.c.dc()};_.ec=function zj(){return Xm(this.c)};_.zc=function Aj(a,b){var c;c=BD(tn(this.c,a),19);if(!c){throw vbb(new Wdb(this.md()+' '+a+' not in '+Xm(this.c)))}return this.od(c.a,b)};_.Bc=function Bj(a){throw vbb(new bgb)};_.gc=function Cj(){return this.c.b.c.gc()};var _E=mdb(Zhe,'ArrayTable/ArrayMap',828);bcb(1923,1,{},Dj);_.ld=function Ej(a){return qj(this.a,a)};var YE=mdb(Zhe,'ArrayTable/ArrayMap/0methodref$getEntry$Type',1923);bcb(1921,345,kie,Fj);_.cd=function Gj(){return rj(this.a,this.b)};_.dd=function Hj(){return this.a.nd(this.b)};_.ed=function Ij(a){return this.a.od(this.b,a)};_.b=0;var ZE=mdb(Zhe,'ArrayTable/ArrayMap/1',1921);bcb(1922,386,$he,Jj);_.Xb=function Kj(a){return qj(this.a,a)};var $E=mdb(Zhe,'ArrayTable/ArrayMap/2',1922);bcb(1920,828,cie,Lj);_.md=function Mj(){return 'Column'};_.nd=function Nj(a){return Mi(this.b,this.a,a)};_.od=function Oj(a,b){return Wi(this.b,this.a,a,b)};_.a=0;var bF=mdb(Zhe,'ArrayTable/Row',1920);bcb(829,828,cie,Rj);_.nd=function Tj(a){return new Lj(this.a,a)};_.zc=function Uj(a,b){return BD(b,83),Pj()};_.od=function Vj(a,b){return BD(b,83),Qj()};_.md=function Sj(){return 'Row'};var aF=mdb(Zhe,'ArrayTable/RowMap',829);bcb(1120,1,pie,_j);_.qd=function ak(){return this.a.qd()&-262};_.rd=function bk(){return this.a.rd()};_.Nb=function ck(a){this.a.Nb(new gk(a,this.b))};_.sd=function dk(a){return this.a.sd(new ek(a,this.b))};var lF=mdb(Zhe,'CollectSpliterators/1',1120);bcb(1121,1,qie,ek);_.td=function fk(a){this.a.td(this.b.Kb(a))};var dF=mdb(Zhe,'CollectSpliterators/1/lambda$0$Type',1121);bcb(1122,1,qie,gk);_.td=function hk(a){this.a.td(this.b.Kb(a))};var eF=mdb(Zhe,'CollectSpliterators/1/lambda$1$Type',1122);bcb(1123,1,pie,jk);_.qd=function kk(){return this.a};_.rd=function lk(){!!this.d&&(this.b=Deb(this.b,this.d.rd()));return Deb(this.b,0)};_.Nb=function mk(a){if(this.d){this.d.Nb(a);this.d=null}this.c.Nb(new rk(this.e,a));this.b=0};_.sd=function ok(a){while(true){if(!!this.d&&this.d.sd(a)){Kbb(this.b,rie)&&(this.b=Qbb(this.b,1));return true}else{this.d=null}if(!this.c.sd(new pk(this,this.e))){return false}}};_.a=0;_.b=0;var hF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator',1123);bcb(1124,1,qie,pk);_.td=function qk(a){ik(this.a,this.b,a)};var fF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator/lambda$0$Type',1124);bcb(1125,1,qie,rk);_.td=function sk(a){nk(this.b,this.a,a)};var gF=mdb(Zhe,'CollectSpliterators/1FlatMapSpliterator/lambda$1$Type',1125);bcb(1117,1,pie,tk);_.qd=function uk(){return 16464|this.b};_.rd=function vk(){return this.a.rd()};_.Nb=function wk(a){this.a.xe(new Ak(a,this.c))};_.sd=function xk(a){return this.a.ye(new yk(a,this.c))};_.b=0;var kF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics',1117);bcb(1118,1,sie,yk);_.ud=function zk(a){this.a.td(this.b.ld(a))};var iF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics/lambda$0$Type',1118);bcb(1119,1,sie,Ak);_.ud=function Bk(a){this.a.td(this.b.ld(a))};var jF=mdb(Zhe,'CollectSpliterators/1WithCharacteristics/lambda$1$Type',1119);bcb(245,1,tie);_.wd=function Hk(a){return this.vd(BD(a,245))};_.vd=function Gk(a){var b;if(a==(_k(),$k)){return 1}if(a==(Lk(),Kk)){return -1}b=(ex(),Fcb(this.a,a.a));if(b!=0){return b}return JD(this,519)==JD(a,519)?0:JD(this,519)?1:-1};_.zd=function Ik(){return this.a};_.Fb=function Jk(a){return Ek(this,a)};var qF=mdb(Zhe,'Cut',245);bcb(1761,245,tie,Mk);_.vd=function Nk(a){return a==this?0:1};_.xd=function Ok(a){throw vbb(new xcb)};_.yd=function Pk(a){a.a+='+\u221E)'};_.zd=function Qk(){throw vbb(new Zdb(uie))};_.Hb=function Rk(){return Zfb(),kCb(this)};_.Ad=function Sk(a){return false};_.Ib=function Tk(){return '+\u221E'};var Kk;var mF=mdb(Zhe,'Cut/AboveAll',1761);bcb(519,245,{245:1,519:1,3:1,35:1},Uk);_.xd=function Vk(a){Pfb((a.a+='(',a),this.a)};_.yd=function Wk(a){Kfb(Pfb(a,this.a),93)};_.Hb=function Xk(){return ~tb(this.a)};_.Ad=function Yk(a){return ex(),Fcb(this.a,a)<0};_.Ib=function Zk(){return '/'+this.a+'\\'};var nF=mdb(Zhe,'Cut/AboveValue',519);bcb(1760,245,tie,al);_.vd=function bl(a){return a==this?0:-1};_.xd=function cl(a){a.a+='(-\u221E'};_.yd=function dl(a){throw vbb(new xcb)};_.zd=function el(){throw vbb(new Zdb(uie))};_.Hb=function fl(){return Zfb(),kCb(this)};_.Ad=function gl(a){return true};_.Ib=function hl(){return '-\u221E'};var $k;var oF=mdb(Zhe,'Cut/BelowAll',1760);bcb(1762,245,tie,il);_.xd=function jl(a){Pfb((a.a+='[',a),this.a)};_.yd=function kl(a){Kfb(Pfb(a,this.a),41)};_.Hb=function ll(){return tb(this.a)};_.Ad=function ml(a){return ex(),Fcb(this.a,a)<=0};_.Ib=function nl(){return '\\'+this.a+'/'};var pF=mdb(Zhe,'Cut/BelowValue',1762);bcb(537,1,vie);_.Jc=function ql(a){reb(this,a)};_.Ib=function rl(){return tr(BD(Rb(this,'use Optional.orNull() instead of Optional.or(null)'),20).Kc())};var uF=mdb(Zhe,'FluentIterable',537);bcb(433,537,vie,sl);_.Kc=function tl(){return new Sr(ur(this.a.Kc(),new Sq))};var rF=mdb(Zhe,'FluentIterable/2',433);bcb(1046,537,vie,vl);_.Kc=function wl(){return ul(this)};var tF=mdb(Zhe,'FluentIterable/3',1046);bcb(708,386,$he,xl);_.Xb=function yl(a){return this.a[a].Kc()};var sF=mdb(Zhe,'FluentIterable/3/1',708);bcb(1972,1,{});_.Ib=function zl(){return fcb(this.Bd().b)};var BF=mdb(Zhe,'ForwardingObject',1972);bcb(1973,1972,wie);_.Bd=function Fl(){return this.Cd()};_.Jc=function Gl(a){reb(this,a)};_.Lc=function Jl(){return this.Oc()};_.Nc=function Ml(){return new Kub(this,0)};_.Oc=function Nl(){return new YAb(null,this.Nc())};_.Fc=function Al(a){return this.Cd(),enb()};_.Gc=function Bl(a){return this.Cd(),fnb()};_.$b=function Cl(){this.Cd(),gnb()};_.Hc=function Dl(a){return this.Cd().Hc(a)};_.Ic=function El(a){return this.Cd().Ic(a)};_.dc=function Hl(){return this.Cd().b.dc()};_.Kc=function Il(){return this.Cd().Kc()};_.Mc=function Kl(a){return this.Cd(),jnb()};_.gc=function Ll(){return this.Cd().b.gc()};_.Pc=function Ol(){return this.Cd().Pc()};_.Qc=function Pl(a){return this.Cd().Qc(a)};var vF=mdb(Zhe,'ForwardingCollection',1973);bcb(1980,28,xie);_.Kc=function Xl(){return this.Ed()};_.Fc=function Sl(a){throw vbb(new bgb)};_.Gc=function Tl(a){throw vbb(new bgb)};_.$b=function Ul(){throw vbb(new bgb)};_.Hc=function Vl(a){return a!=null&&ze(this,a,false)};_.Dd=function Wl(){switch(this.gc()){case 0:return im(),im(),hm;case 1:return im(),new my(Qb(this.Ed().Pb()));default:return new px(this,this.Pc());}};_.Mc=function Yl(a){throw vbb(new bgb)};var WF=mdb(Zhe,'ImmutableCollection',1980);bcb(712,1980,xie,Zl);_.Kc=function cm(){return vr(this.a.Kc())};_.Hc=function $l(a){return a!=null&&this.a.Hc(a)};_.Ic=function _l(a){return this.a.Ic(a)};_.dc=function am(){return this.a.dc()};_.Ed=function bm(){return vr(this.a.Kc())};_.gc=function dm(){return this.a.gc()};_.Pc=function em(){return this.a.Pc()};_.Qc=function fm(a){return this.a.Qc(a)};_.Ib=function gm(){return fcb(this.a)};var wF=mdb(Zhe,'ForwardingImmutableCollection',712);bcb(152,1980,yie);_.Kc=function sm(){return this.Ed()};_.Yc=function tm(){return this.Fd(0)};_.Zc=function vm(a){return this.Fd(a)};_.ad=function zm(a){ktb(this,a)};_.Nc=function Am(){return new Kub(this,16)};_.bd=function Cm(a,b){return this.Gd(a,b)};_.Vc=function lm(a,b){throw vbb(new bgb)};_.Wc=function mm(a,b){throw vbb(new bgb)};_.Fb=function om(a){return Ju(this,a)};_.Hb=function pm(){return Ku(this)};_.Xc=function qm(a){return a==null?-1:Lu(this,a)};_.Ed=function rm(){return this.Fd(0)};_.Fd=function um(a){return jm(this,a)};_.$c=function xm(a){throw vbb(new bgb)};_._c=function ym(a,b){throw vbb(new bgb)};_.Gd=function Bm(a,b){var c;return Dm((c=new $u(this),new Jib(c,a,b)))};var hm;var _F=mdb(Zhe,'ImmutableList',152);bcb(2006,152,yie);_.Kc=function Nm(){return vr(this.Hd().Kc())};_.bd=function Qm(a,b){return Dm(this.Hd().bd(a,b))};_.Hc=function Fm(a){return a!=null&&this.Hd().Hc(a)};_.Ic=function Gm(a){return this.Hd().Ic(a)};_.Fb=function Hm(a){return pb(this.Hd(),a)};_.Xb=function Im(a){return Em(this,a)};_.Hb=function Jm(){return tb(this.Hd())};_.Xc=function Km(a){return this.Hd().Xc(a)};_.dc=function Lm(){return this.Hd().dc()};_.Ed=function Mm(){return vr(this.Hd().Kc())};_.gc=function Om(){return this.Hd().gc()};_.Gd=function Pm(a,b){return Dm(this.Hd().bd(a,b))};_.Pc=function Rm(){return this.Hd().Qc(KC(SI,Uhe,1,this.Hd().gc(),5,1))};_.Qc=function Sm(a){return this.Hd().Qc(a)};_.Ib=function Tm(){return fcb(this.Hd())};var xF=mdb(Zhe,'ForwardingImmutableList',2006);bcb(714,1,Aie);_.vc=function cn(){return Wm(this)};_.wc=function en(a){stb(this,a)};_.ec=function jn(){return Xm(this)};_.yc=function kn(a,b,c){return ttb(this,a,b,c)};_.Cc=function rn(){return this.Ld()};_.$b=function Zm(){throw vbb(new bgb)};_._b=function $m(a){return this.xc(a)!=null};_.uc=function _m(a){return this.Ld().Hc(a)};_.Jd=function an(){return new jq(this)};_.Kd=function bn(){return new sq(this)};_.Fb=function dn(a){return Dv(this,a)};_.Hb=function gn(){return Wm(this).Hb()};_.dc=function hn(){return this.gc()==0};_.zc=function nn(a,b){return Ym()};_.Bc=function on(a){throw vbb(new bgb)};_.Ib=function pn(){return Jv(this)};_.Ld=function qn(){if(this.e){return this.e}return this.e=this.Kd()};_.c=null;_.d=null;_.e=null;var Um;var iG=mdb(Zhe,'ImmutableMap',714);bcb(715,714,Aie);_._b=function vn(a){return sn(this,a)};_.uc=function wn(a){return dob(this.b,a)};_.Id=function xn(){return Vn(new Ln(this))};_.Jd=function yn(){return Vn(gob(this.b))};_.Kd=function zn(){return Ql(),new Zl(hob(this.b))};_.Fb=function An(a){return fob(this.b,a)};_.xc=function Bn(a){return tn(this,a)};_.Hb=function Cn(){return tb(this.b.c)};_.dc=function Dn(){return this.b.c.dc()};_.gc=function En(){return this.b.c.gc()};_.Ib=function Fn(){return fcb(this.b.c)};var zF=mdb(Zhe,'ForwardingImmutableMap',715);bcb(1974,1973,Bie);_.Bd=function Gn(){return this.Md()};_.Cd=function Hn(){return this.Md()};_.Nc=function Kn(){return new Kub(this,1)};_.Fb=function In(a){return a===this||this.Md().Fb(a)};_.Hb=function Jn(){return this.Md().Hb()};var CF=mdb(Zhe,'ForwardingSet',1974);bcb(1069,1974,Bie,Ln);_.Bd=function Nn(){return eob(this.a.b)};_.Cd=function On(){return eob(this.a.b)};_.Hc=function Mn(b){if(JD(b,42)&&BD(b,42).cd()==null){return false}try{return Dob(eob(this.a.b),b)}catch(a){a=ubb(a);if(JD(a,205)){return false}else throw vbb(a)}};_.Md=function Pn(){return eob(this.a.b)};_.Qc=function Qn(a){var b;b=Eob(eob(this.a.b),a);eob(this.a.b).b.gc()=0?'+':'')+(c/60|0);b=kB($wnd.Math.abs(c)%60);return (Dpb(),Bpb)[this.q.getDay()]+' '+Cpb[this.q.getMonth()]+' '+kB(this.q.getDate())+' '+kB(this.q.getHours())+':'+kB(this.q.getMinutes())+':'+kB(this.q.getSeconds())+' GMT'+a+b+' '+this.q.getFullYear()};var $J=mdb(bie,'Date',199);bcb(1915,199,Cje,nB);_.a=false;_.b=0;_.c=0;_.d=0;_.e=0;_.f=0;_.g=false;_.i=0;_.j=0;_.k=0;_.n=0;_.o=0;_.p=0;var eI=mdb('com.google.gwt.i18n.shared.impl','DateRecord',1915);bcb(1966,1,{});_.fe=function oB(){return null};_.ge=function pB(){return null};_.he=function qB(){return null};_.ie=function rB(){return null};_.je=function sB(){return null};var nI=mdb(Dje,'JSONValue',1966);bcb(216,1966,{216:1},wB,xB);_.Fb=function yB(a){if(!JD(a,216)){return false}return qz(this.a,BD(a,216).a)};_.ee=function zB(){return DB};_.Hb=function AB(){return rz(this.a)};_.fe=function BB(){return this};_.Ib=function CB(){var a,b,c;c=new Wfb('[');for(b=0,a=this.a.length;b0&&(c.a+=',',c);Pfb(c,tB(this,b))}c.a+=']';return c.a};var fI=mdb(Dje,'JSONArray',216);bcb(483,1966,{483:1},HB);_.ee=function IB(){return LB};_.ge=function JB(){return this};_.Ib=function KB(){return Bcb(),''+this.a};_.a=false;var EB,FB;var gI=mdb(Dje,'JSONBoolean',483);bcb(985,60,Tie,MB);var hI=mdb(Dje,'JSONException',985);bcb(1023,1966,{},PB);_.ee=function QB(){return SB};_.Ib=function RB(){return Xhe};var NB;var iI=mdb(Dje,'JSONNull',1023);bcb(258,1966,{258:1},TB);_.Fb=function UB(a){if(!JD(a,258)){return false}return this.a==BD(a,258).a};_.ee=function VB(){return ZB};_.Hb=function WB(){return Hdb(this.a)};_.he=function XB(){return this};_.Ib=function YB(){return this.a+''};_.a=0;var jI=mdb(Dje,'JSONNumber',258);bcb(183,1966,{183:1},eC,fC);_.Fb=function gC(a){if(!JD(a,183)){return false}return qz(this.a,BD(a,183).a)};_.ee=function hC(){return lC};_.Hb=function iC(){return rz(this.a)};_.ie=function jC(){return this};_.Ib=function kC(){var a,b,c,d,e,f,g;g=new Wfb('{');a=true;f=$B(this,KC(ZI,nie,2,0,6,1));for(c=f,d=0,e=c.length;d=0?':'+this.c:'')+')'};_.c=0;var VI=mdb(Phe,'StackTraceElement',310);zD={3:1,475:1,35:1,2:1};var ZI=mdb(Phe,Vie,2);bcb(107,418,{475:1},Hfb,Ifb,Jfb);var WI=mdb(Phe,'StringBuffer',107);bcb(100,418,{475:1},Ufb,Vfb,Wfb);var XI=mdb(Phe,'StringBuilder',100);bcb(687,73,Mje,Xfb);var YI=mdb(Phe,'StringIndexOutOfBoundsException',687);bcb(2043,1,{});var Yfb;bcb(844,1,{},_fb);_.Kb=function agb(a){return BD(a,78).e};var $I=mdb(Phe,'Throwable/lambda$0$Type',844);bcb(41,60,{3:1,102:1,60:1,78:1,41:1},bgb,cgb);var aJ=mdb(Phe,'UnsupportedOperationException',41);bcb(240,236,{3:1,35:1,236:1,240:1},sgb,tgb);_.wd=function wgb(a){return mgb(this,BD(a,240))};_.ke=function xgb(){return Hcb(rgb(this))};_.Fb=function ygb(a){var b;if(this===a){return true}if(JD(a,240)){b=BD(a,240);return this.e==b.e&&mgb(this,b)==0}return false};_.Hb=function zgb(){var a;if(this.b!=0){return this.b}if(this.a<54){a=Cbb(this.f);this.b=Tbb(xbb(a,-1));this.b=33*this.b+Tbb(xbb(Obb(a,32),-1));this.b=17*this.b+QD(this.e);return this.b}this.b=17*Ngb(this.c)+QD(this.e);return this.b};_.Ib=function Agb(){return rgb(this)};_.a=0;_.b=0;_.d=0;_.e=0;_.f=0;var dgb,egb,fgb,ggb,hgb,igb,jgb,kgb;var bJ=mdb('java.math','BigDecimal',240);bcb(91,236,{3:1,35:1,236:1,91:1},Tgb,Ugb,Vgb,Wgb,Xgb,Ygb);_.wd=function $gb(a){return Igb(this,BD(a,91))};_.ke=function _gb(){return Hcb(shb(this,0))};_.Fb=function ahb(a){return Kgb(this,a)};_.Hb=function chb(){return Ngb(this)};_.Ib=function ehb(){return shb(this,0)};_.b=-2;_.c=0;_.d=0;_.e=0;var Bgb,Cgb,Dgb,Egb,Fgb,Ggb;var cJ=mdb('java.math','BigInteger',91);var nhb,ohb;var Bhb,Chb;bcb(488,1967,cie);_.$b=function Xhb(){Uhb(this)};_._b=function Yhb(a){return Mhb(this,a)};_.uc=function Zhb(a){return Nhb(this,a,this.g)||Nhb(this,a,this.f)};_.vc=function $hb(){return new eib(this)};_.xc=function _hb(a){return Ohb(this,a)};_.zc=function aib(a,b){return Rhb(this,a,b)};_.Bc=function bib(a){return Thb(this,a)};_.gc=function cib(){return Vhb(this)};var gJ=mdb(bie,'AbstractHashMap',488);bcb(261,eie,fie,eib);_.$b=function fib(){this.a.$b()};_.Hc=function gib(a){return dib(this,a)};_.Kc=function hib(){return new nib(this.a)};_.Mc=function iib(a){var b;if(dib(this,a)){b=BD(a,42).cd();this.a.Bc(b);return true}return false};_.gc=function jib(){return this.a.gc()};var fJ=mdb(bie,'AbstractHashMap/EntrySet',261);bcb(262,1,aie,nib);_.Nb=function oib(a){Rrb(this,a)};_.Pb=function qib(){return lib(this)};_.Ob=function pib(){return this.b};_.Qb=function rib(){mib(this)};_.b=false;var eJ=mdb(bie,'AbstractHashMap/EntrySetIterator',262);bcb(417,1,aie,vib);_.Nb=function wib(a){Rrb(this,a)};_.Ob=function xib(){return sib(this)};_.Pb=function yib(){return tib(this)};_.Qb=function zib(){uib(this)};_.b=0;_.c=-1;var hJ=mdb(bie,'AbstractList/IteratorImpl',417);bcb(96,417,jie,Bib);_.Qb=function Hib(){uib(this)};_.Rb=function Cib(a){Aib(this,a)};_.Sb=function Dib(){return this.b>0};_.Tb=function Eib(){return this.b};_.Ub=function Fib(){return sCb(this.b>0),this.a.Xb(this.c=--this.b)};_.Vb=function Gib(){return this.b-1};_.Wb=function Iib(a){yCb(this.c!=-1);this.a._c(this.c,a)};var iJ=mdb(bie,'AbstractList/ListIteratorImpl',96);bcb(219,52,Lie,Jib);_.Vc=function Kib(a,b){wCb(a,this.b);this.c.Vc(this.a+a,b);++this.b};_.Xb=function Lib(a){tCb(a,this.b);return this.c.Xb(this.a+a)};_.$c=function Mib(a){var b;tCb(a,this.b);b=this.c.$c(this.a+a);--this.b;return b};_._c=function Nib(a,b){tCb(a,this.b);return this.c._c(this.a+a,b)};_.gc=function Oib(){return this.b};_.a=0;_.b=0;var jJ=mdb(bie,'AbstractList/SubList',219);bcb(384,eie,fie,Pib);_.$b=function Qib(){this.a.$b()};_.Hc=function Rib(a){return this.a._b(a)};_.Kc=function Sib(){var a;return a=this.a.vc().Kc(),new Vib(a)};_.Mc=function Tib(a){if(this.a._b(a)){this.a.Bc(a);return true}return false};_.gc=function Uib(){return this.a.gc()};var mJ=mdb(bie,'AbstractMap/1',384);bcb(691,1,aie,Vib);_.Nb=function Wib(a){Rrb(this,a)};_.Ob=function Xib(){return this.a.Ob()};_.Pb=function Yib(){var a;return a=BD(this.a.Pb(),42),a.cd()};_.Qb=function Zib(){this.a.Qb()};var lJ=mdb(bie,'AbstractMap/1/1',691);bcb(226,28,die,$ib);_.$b=function _ib(){this.a.$b()};_.Hc=function ajb(a){return this.a.uc(a)};_.Kc=function bjb(){var a;return a=this.a.vc().Kc(),new djb(a)};_.gc=function cjb(){return this.a.gc()};var oJ=mdb(bie,'AbstractMap/2',226);bcb(294,1,aie,djb);_.Nb=function ejb(a){Rrb(this,a)};_.Ob=function fjb(){return this.a.Ob()};_.Pb=function gjb(){var a;return a=BD(this.a.Pb(),42),a.dd()};_.Qb=function hjb(){this.a.Qb()};var nJ=mdb(bie,'AbstractMap/2/1',294);bcb(484,1,{484:1,42:1});_.Fb=function jjb(a){var b;if(!JD(a,42)){return false}b=BD(a,42);return wtb(this.d,b.cd())&&wtb(this.e,b.dd())};_.cd=function kjb(){return this.d};_.dd=function ljb(){return this.e};_.Hb=function mjb(){return xtb(this.d)^xtb(this.e)};_.ed=function njb(a){return ijb(this,a)};_.Ib=function ojb(){return this.d+'='+this.e};var pJ=mdb(bie,'AbstractMap/AbstractEntry',484);bcb(383,484,{484:1,383:1,42:1},pjb);var qJ=mdb(bie,'AbstractMap/SimpleEntry',383);bcb(1984,1,_je);_.Fb=function qjb(a){var b;if(!JD(a,42)){return false}b=BD(a,42);return wtb(this.cd(),b.cd())&&wtb(this.dd(),b.dd())};_.Hb=function rjb(){return xtb(this.cd())^xtb(this.dd())};_.Ib=function sjb(){return this.cd()+'='+this.dd()};var rJ=mdb(bie,lie,1984);bcb(1992,1967,gie);_.tc=function vjb(a){return tjb(this,a)};_._b=function wjb(a){return ujb(this,a)};_.vc=function xjb(){return new Bjb(this)};_.xc=function yjb(a){var b;b=a;return Wd(Awb(this,b))};_.ec=function Ajb(){return new Gjb(this)};var wJ=mdb(bie,'AbstractNavigableMap',1992);bcb(739,eie,fie,Bjb);_.Hc=function Cjb(a){return JD(a,42)&&tjb(this.b,BD(a,42))};_.Kc=function Djb(){return new Ywb(this.b)};_.Mc=function Ejb(a){var b;if(JD(a,42)){b=BD(a,42);return Kwb(this.b,b)}return false};_.gc=function Fjb(){return this.b.c};var tJ=mdb(bie,'AbstractNavigableMap/EntrySet',739);bcb(493,eie,iie,Gjb);_.Nc=function Mjb(){return new Rub(this)};_.$b=function Hjb(){zwb(this.a)};_.Hc=function Ijb(a){return ujb(this.a,a)};_.Kc=function Jjb(){var a;return a=new Ywb((new cxb(this.a)).b),new Njb(a)};_.Mc=function Kjb(a){if(ujb(this.a,a)){Jwb(this.a,a);return true}return false};_.gc=function Ljb(){return this.a.c};var vJ=mdb(bie,'AbstractNavigableMap/NavigableKeySet',493);bcb(494,1,aie,Njb);_.Nb=function Ojb(a){Rrb(this,a)};_.Ob=function Pjb(){return sib(this.a.a)};_.Pb=function Qjb(){var a;return a=Wwb(this.a),a.cd()};_.Qb=function Rjb(){Xwb(this.a)};var uJ=mdb(bie,'AbstractNavigableMap/NavigableKeySet/1',494);bcb(2004,28,die);_.Fc=function Sjb(a){return zCb(cub(this,a)),true};_.Gc=function Tjb(a){uCb(a);mCb(a!=this,"Can't add a queue to itself");return ye(this,a)};_.$b=function Ujb(){while(dub(this)!=null);};var xJ=mdb(bie,'AbstractQueue',2004);bcb(302,28,{4:1,20:1,28:1,14:1},jkb,kkb);_.Fc=function lkb(a){return Xjb(this,a),true};_.$b=function nkb(){Yjb(this)};_.Hc=function okb(a){return Zjb(new xkb(this),a)};_.dc=function pkb(){return akb(this)};_.Kc=function qkb(){return new xkb(this)};_.Mc=function rkb(a){return dkb(new xkb(this),a)};_.gc=function skb(){return this.c-this.b&this.a.length-1};_.Nc=function tkb(){return new Kub(this,272)};_.Qc=function ukb(a){var b;b=this.c-this.b&this.a.length-1;a.lengthb&&NC(a,b,null);return a};_.b=0;_.c=0;var BJ=mdb(bie,'ArrayDeque',302);bcb(446,1,aie,xkb);_.Nb=function ykb(a){Rrb(this,a)};_.Ob=function zkb(){return this.a!=this.b};_.Pb=function Akb(){return vkb(this)};_.Qb=function Bkb(){wkb(this)};_.a=0;_.b=0;_.c=-1;var AJ=mdb(bie,'ArrayDeque/IteratorImpl',446);bcb(12,52,ake,Rkb,Skb,Tkb);_.Vc=function Ukb(a,b){Dkb(this,a,b)};_.Fc=function Vkb(a){return Ekb(this,a)};_.Wc=function Wkb(a,b){return Fkb(this,a,b)};_.Gc=function Xkb(a){return Gkb(this,a)};_.$b=function Ykb(){this.c=KC(SI,Uhe,1,0,5,1)};_.Hc=function Zkb(a){return Jkb(this,a,0)!=-1};_.Jc=function $kb(a){Hkb(this,a)};_.Xb=function _kb(a){return Ikb(this,a)};_.Xc=function alb(a){return Jkb(this,a,0)};_.dc=function blb(){return this.c.length==0};_.Kc=function clb(){return new olb(this)};_.$c=function dlb(a){return Kkb(this,a)};_.Mc=function elb(a){return Lkb(this,a)};_.Ud=function flb(a,b){Mkb(this,a,b)};_._c=function glb(a,b){return Nkb(this,a,b)};_.gc=function hlb(){return this.c.length};_.ad=function ilb(a){Okb(this,a)};_.Pc=function jlb(){return Pkb(this)};_.Qc=function klb(a){return Qkb(this,a)};var DJ=mdb(bie,'ArrayList',12);bcb(7,1,aie,olb);_.Nb=function plb(a){Rrb(this,a)};_.Ob=function qlb(){return llb(this)};_.Pb=function rlb(){return mlb(this)};_.Qb=function slb(){nlb(this)};_.a=0;_.b=-1;var CJ=mdb(bie,'ArrayList/1',7);bcb(2013,$wnd.Function,{},Ylb);_.te=function Zlb(a,b){return Kdb(a,b)};bcb(154,52,bke,amb);_.Hc=function bmb(a){return Bt(this,a)!=-1};_.Jc=function cmb(a){var b,c,d,e;uCb(a);for(c=this.a,d=0,e=c.length;d>>0,a.toString(16))};_.f=0;_.i=Qje;var PM=mdb(Gke,'CNode',57);bcb(814,1,{},zDb);var OM=mdb(Gke,'CNode/CNodeBuilder',814);var EDb;bcb(1525,1,{},GDb);_.Oe=function HDb(a,b){return 0};_.Pe=function IDb(a,b){return 0};var QM=mdb(Gke,Ike,1525);bcb(1790,1,{},JDb);_.Le=function KDb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;j=Pje;for(d=new olb(a.a.b);d.ad.d.c||d.d.c==f.d.c&&d.d.b0?a+this.n.d+this.n.a:0};_.Se=function HHb(){var a,b,c,d,e;e=0;if(this.e){this.b?(e=this.b.a):!!this.a[1][1]&&(e=this.a[1][1].Se())}else if(this.g){e=EHb(this,yHb(this,null,true))}else{for(b=(gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])),c=0,d=b.length;c0?e+this.n.b+this.n.c:0};_.Te=function IHb(){var a,b,c,d,e;if(this.g){a=yHb(this,null,false);for(c=(gHb(),OC(GC(pN,1),Kie,232,0,[dHb,eHb,fHb])),d=0,e=c.length;d0){d[0]+=this.d;c-=d[0]}if(d[2]>0){d[2]+=this.d;c-=d[2]}this.c.a=$wnd.Math.max(0,c);this.c.d=b.d+a.d+(this.c.a-c)/2;d[1]=$wnd.Math.max(d[1],c);uHb(this,eHb,b.d+a.d+d[0]-(d[1]-c)/2,d)};_.b=null;_.d=0;_.e=false;_.f=false;_.g=false;var rHb=0,sHb=0;var rN=mdb(fle,'GridContainerCell',1473);bcb(461,22,{3:1,35:1,22:1,461:1},OHb);var KHb,LHb,MHb;var sN=ndb(fle,'HorizontalLabelAlignment',461,CI,QHb,PHb);var RHb;bcb(306,212,{212:1,306:1},aIb,bIb,cIb);_.Re=function dIb(){return YHb(this)};_.Se=function eIb(){return ZHb(this)};_.a=0;_.c=false;var tN=mdb(fle,'LabelCell',306);bcb(244,326,{212:1,326:1,244:1},mIb);_.Re=function nIb(){return fIb(this)};_.Se=function oIb(){return gIb(this)};_.Te=function rIb(){hIb(this)};_.Ue=function sIb(){iIb(this)};_.b=0;_.c=0;_.d=false;var yN=mdb(fle,'StripContainerCell',244);bcb(1626,1,Oie,tIb);_.Mb=function uIb(a){return pIb(BD(a,212))};var uN=mdb(fle,'StripContainerCell/lambda$0$Type',1626);bcb(1627,1,{},vIb);_.Fe=function wIb(a){return BD(a,212).Se()};var vN=mdb(fle,'StripContainerCell/lambda$1$Type',1627);bcb(1628,1,Oie,xIb);_.Mb=function yIb(a){return qIb(BD(a,212))};var wN=mdb(fle,'StripContainerCell/lambda$2$Type',1628);bcb(1629,1,{},zIb);_.Fe=function AIb(a){return BD(a,212).Re()};var xN=mdb(fle,'StripContainerCell/lambda$3$Type',1629);bcb(462,22,{3:1,35:1,22:1,462:1},FIb);var BIb,CIb,DIb;var zN=ndb(fle,'VerticalLabelAlignment',462,CI,HIb,GIb);var IIb;bcb(789,1,{},LIb);_.c=0;_.d=0;_.k=0;_.s=0;_.t=0;_.v=false;_.w=0;_.D=false;var CN=mdb(nle,'NodeContext',789);bcb(1471,1,Dke,OIb);_.ue=function PIb(a,b){return NIb(BD(a,61),BD(b,61))};_.Fb=function QIb(a){return this===a};_.ve=function RIb(){return new tpb(this)};var AN=mdb(nle,'NodeContext/0methodref$comparePortSides$Type',1471);bcb(1472,1,Dke,SIb);_.ue=function TIb(a,b){return MIb(BD(a,111),BD(b,111))};_.Fb=function UIb(a){return this===a};_.ve=function VIb(){return new tpb(this)};var BN=mdb(nle,'NodeContext/1methodref$comparePortContexts$Type',1472);bcb(159,22,{3:1,35:1,22:1,159:1},tJb);var WIb,XIb,YIb,ZIb,$Ib,_Ib,aJb,bJb,cJb,dJb,eJb,fJb,gJb,hJb,iJb,jJb,kJb,lJb,mJb,nJb,oJb,pJb;var DN=ndb(nle,'NodeLabelLocation',159,CI,wJb,vJb);var xJb;bcb(111,1,{111:1},AJb);_.a=false;var EN=mdb(nle,'PortContext',111);bcb(1476,1,qie,TJb);_.td=function UJb(a){WHb(BD(a,306))};var FN=mdb(qle,rle,1476);bcb(1477,1,Oie,VJb);_.Mb=function WJb(a){return !!BD(a,111).c};var GN=mdb(qle,sle,1477);bcb(1478,1,qie,XJb);_.td=function YJb(a){WHb(BD(a,111).c)};var HN=mdb(qle,'LabelPlacer/lambda$2$Type',1478);var ZJb;bcb(1475,1,qie,fKb);_.td=function gKb(a){$Jb();zJb(BD(a,111))};var IN=mdb(qle,'NodeLabelAndSizeUtilities/lambda$0$Type',1475);bcb(790,1,qie,mKb);_.td=function nKb(a){kKb(this.b,this.c,this.a,BD(a,181))};_.a=false;_.c=false;var JN=mdb(qle,'NodeLabelCellCreator/lambda$0$Type',790);bcb(1474,1,qie,tKb);_.td=function uKb(a){sKb(this.a,BD(a,181))};var KN=mdb(qle,'PortContextCreator/lambda$0$Type',1474);var BKb;bcb(1829,1,{},VKb);var MN=mdb(ule,'GreedyRectangleStripOverlapRemover',1829);bcb(1830,1,Dke,XKb);_.ue=function YKb(a,b){return WKb(BD(a,222),BD(b,222))};_.Fb=function ZKb(a){return this===a};_.ve=function $Kb(){return new tpb(this)};var LN=mdb(ule,'GreedyRectangleStripOverlapRemover/0methodref$compareByYCoordinate$Type',1830);bcb(1786,1,{},fLb);_.a=5;_.e=0;var SN=mdb(ule,'RectangleStripOverlapRemover',1786);bcb(1787,1,Dke,jLb);_.ue=function kLb(a,b){return gLb(BD(a,222),BD(b,222))};_.Fb=function lLb(a){return this===a};_.ve=function mLb(){return new tpb(this)};var NN=mdb(ule,'RectangleStripOverlapRemover/0methodref$compareLeftRectangleBorders$Type',1787);bcb(1789,1,Dke,nLb);_.ue=function oLb(a,b){return hLb(BD(a,222),BD(b,222))};_.Fb=function pLb(a){return this===a};_.ve=function qLb(){return new tpb(this)};var ON=mdb(ule,'RectangleStripOverlapRemover/1methodref$compareRightRectangleBorders$Type',1789);bcb(406,22,{3:1,35:1,22:1,406:1},wLb);var rLb,sLb,tLb,uLb;var PN=ndb(ule,'RectangleStripOverlapRemover/OverlapRemovalDirection',406,CI,yLb,xLb);var zLb;bcb(222,1,{222:1},BLb);var QN=mdb(ule,'RectangleStripOverlapRemover/RectangleNode',222);bcb(1788,1,qie,CLb);_.td=function DLb(a){aLb(this.a,BD(a,222))};var RN=mdb(ule,'RectangleStripOverlapRemover/lambda$1$Type',1788);bcb(1304,1,Dke,GLb);_.ue=function HLb(a,b){return FLb(BD(a,167),BD(b,167))};_.Fb=function ILb(a){return this===a};_.ve=function JLb(){return new tpb(this)};var WN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator',1304);bcb(1307,1,{},KLb);_.Kb=function LLb(a){return BD(a,324).a};var TN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$0$Type',1307);bcb(1308,1,Oie,MLb);_.Mb=function NLb(a){return BD(a,323).a};var UN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$1$Type',1308);bcb(1309,1,Oie,OLb);_.Mb=function PLb(a){return BD(a,323).a};var VN=mdb(wle,'PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$2$Type',1309);bcb(1302,1,Dke,RLb);_.ue=function SLb(a,b){return QLb(BD(a,167),BD(b,167))};_.Fb=function TLb(a){return this===a};_.ve=function ULb(){return new tpb(this)};var YN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionDirectionsComparator',1302);bcb(1305,1,{},VLb);_.Kb=function WLb(a){return BD(a,324).a};var XN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionDirectionsComparator/lambda$0$Type',1305);bcb(767,1,Dke,YLb);_.ue=function ZLb(a,b){return XLb(BD(a,167),BD(b,167))};_.Fb=function $Lb(a){return this===a};_.ve=function _Lb(){return new tpb(this)};var ZN=mdb(wle,'PolyominoCompactor/MinNumOfExtensionsComparator',767);bcb(1300,1,Dke,bMb);_.ue=function cMb(a,b){return aMb(BD(a,321),BD(b,321))};_.Fb=function dMb(a){return this===a};_.ve=function eMb(){return new tpb(this)};var _N=mdb(wle,'PolyominoCompactor/MinPerimeterComparator',1300);bcb(1301,1,Dke,gMb);_.ue=function hMb(a,b){return fMb(BD(a,321),BD(b,321))};_.Fb=function iMb(a){return this===a};_.ve=function jMb(){return new tpb(this)};var $N=mdb(wle,'PolyominoCompactor/MinPerimeterComparatorWithShape',1301);bcb(1303,1,Dke,lMb);_.ue=function mMb(a,b){return kMb(BD(a,167),BD(b,167))};_.Fb=function nMb(a){return this===a};_.ve=function oMb(){return new tpb(this)};var bO=mdb(wle,'PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator',1303);bcb(1306,1,{},pMb);_.Kb=function qMb(a){return BD(a,324).a};var aO=mdb(wle,'PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator/lambda$0$Type',1306);bcb(777,1,{},tMb);_.Ce=function uMb(a,b){return sMb(this,BD(a,46),BD(b,167))};var cO=mdb(wle,'SuccessorCombination',777);bcb(644,1,{},wMb);_.Ce=function xMb(a,b){var c;return vMb((c=BD(a,46),BD(b,167),c))};var dO=mdb(wle,'SuccessorJitter',644);bcb(643,1,{},zMb);_.Ce=function AMb(a,b){var c;return yMb((c=BD(a,46),BD(b,167),c))};var eO=mdb(wle,'SuccessorLineByLine',643);bcb(568,1,{},CMb);_.Ce=function DMb(a,b){var c;return BMb((c=BD(a,46),BD(b,167),c))};var fO=mdb(wle,'SuccessorManhattan',568);bcb(1356,1,{},FMb);_.Ce=function GMb(a,b){var c;return EMb((c=BD(a,46),BD(b,167),c))};var gO=mdb(wle,'SuccessorMaxNormWindingInMathPosSense',1356);bcb(400,1,{},JMb);_.Ce=function KMb(a,b){return HMb(this,a,b)};_.c=false;_.d=false;_.e=false;_.f=false;var iO=mdb(wle,'SuccessorQuadrantsGeneric',400);bcb(1357,1,{},LMb);_.Kb=function MMb(a){return BD(a,324).a};var hO=mdb(wle,'SuccessorQuadrantsGeneric/lambda$0$Type',1357);bcb(323,22,{3:1,35:1,22:1,323:1},SMb);_.a=false;var NMb,OMb,PMb,QMb;var jO=ndb(Ble,Cle,323,CI,UMb,TMb);var VMb;bcb(1298,1,{});_.Ib=function bNb(){var a,b,c,d,e,f;c=' ';a=meb(0);for(e=0;e=0?'b'+a+'['+fRb(this.a)+']':'b['+fRb(this.a)+']'}return 'b_'+FCb(this)};var YO=mdb(jme,'FBendpoint',559);bcb(282,134,{3:1,282:1,94:1,134:1},gRb);_.Ib=function hRb(){return fRb(this)};var ZO=mdb(jme,'FEdge',282);bcb(231,134,{3:1,231:1,94:1,134:1},kRb);var $O=mdb(jme,'FGraph',231);bcb(447,357,{3:1,447:1,357:1,94:1,134:1},mRb);_.Ib=function nRb(){return this.b==null||this.b.length==0?'l['+fRb(this.a)+']':'l_'+this.b};var _O=mdb(jme,'FLabel',447);bcb(144,357,{3:1,144:1,357:1,94:1,134:1},pRb);_.Ib=function qRb(){return oRb(this)};_.b=0;var aP=mdb(jme,'FNode',144);bcb(2003,1,{});_.bf=function vRb(a){rRb(this,a)};_.cf=function wRb(){sRb(this)};_.d=0;var cP=mdb(lme,'AbstractForceModel',2003);bcb(631,2003,{631:1},xRb);_.af=function zRb(a,b){var c,d,e,f,g;uRb(this.f,a,b);e=c7c(R6c(b.d),a.d);g=$wnd.Math.sqrt(e.a*e.a+e.b*e.b);d=$wnd.Math.max(0,g-U6c(a.e)/2-U6c(b.e)/2);c=jRb(this.e,a,b);c>0?(f=-yRb(d,this.c)*c):(f=CRb(d,this.b)*BD(vNb(a,(wSb(),oSb)),19).a);Y6c(e,f/g);return e};_.bf=function ARb(a){rRb(this,a);this.a=BD(vNb(a,(wSb(),eSb)),19).a;this.c=Edb(ED(vNb(a,uSb)));this.b=Edb(ED(vNb(a,qSb)))};_.df=function BRb(a){return a0&&(f-=ERb(d,this.a)*c);Y6c(e,f*this.b/g);return e};_.bf=function GRb(a){var b,c,d,e,f,g,h;rRb(this,a);this.b=Edb(ED(vNb(a,(wSb(),vSb))));this.c=this.b/BD(vNb(a,eSb),19).a;d=a.e.c.length;f=0;e=0;for(h=new olb(a.e);h.a0};_.a=0;_.b=0;_.c=0;var eP=mdb(lme,'FruchtermanReingoldModel',632);bcb(849,1,ale,TRb);_.Qe=function URb(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mme),''),'Force Model'),'Determines the model for force calculation.'),MRb),(_5c(),V5c)),gP),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,nme),''),'Iterations'),'The number of iterations on the force model.'),meb(300)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ome),''),'Repulsive Power'),'Determines how many bend points are added to the edge; such bend points are regarded as repelling particles in the force model'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,pme),''),'FR Temperature'),'The temperature is used as a scaling factor for particle displacements.'),qme),U5c),BI),pqb(L5c))));o4c(a,pme,mme,RRb);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,rme),''),'Eades Repulsion'),"Factor for repulsive forces in Eades' model."),5),U5c),BI),pqb(L5c))));o4c(a,rme,mme,ORb);xSb((new ySb,a))};var KRb,LRb,MRb,NRb,ORb,PRb,QRb,RRb;var fP=mdb(sme,'ForceMetaDataProvider',849);bcb(424,22,{3:1,35:1,22:1,424:1},YRb);var VRb,WRb;var gP=ndb(sme,'ForceModelStrategy',424,CI,$Rb,ZRb);var _Rb;bcb(988,1,ale,ySb);_.Qe=function zSb(a){xSb(a)};var bSb,cSb,dSb,eSb,fSb,gSb,hSb,iSb,jSb,kSb,lSb,mSb,nSb,oSb,pSb,qSb,rSb,sSb,tSb,uSb,vSb;var iP=mdb(sme,'ForceOptions',988);bcb(989,1,{},ASb);_.$e=function BSb(){var a;return a=new ZQb,a};_._e=function CSb(a){};var hP=mdb(sme,'ForceOptions/ForceFactory',989);var DSb,ESb,FSb,GSb;bcb(850,1,ale,PSb);_.Qe=function QSb(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Mme),''),'Fixed Position'),'Prevent that the node is moved by the layout algorithm.'),(Bcb(),false)),(_5c(),T5c)),wI),pqb((N5c(),K5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Nme),''),'Desired Edge Length'),'Either specified for parent nodes or for individual edges, where the latter takes higher precedence.'),100),U5c),BI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[I5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ome),''),'Layout Dimension'),'Dimensions that are permitted to be altered during layout.'),KSb),V5c),oP),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Pme),''),'Stress Epsilon'),'Termination criterion for the iterative process.'),qme),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qme),''),'Iteration Limit'),"Maximum number of performed iterations. Takes higher precedence than 'epsilon'."),meb(Ohe)),X5c),JI),pqb(L5c))));cTb((new dTb,a))};var ISb,JSb,KSb,LSb,MSb,NSb;var jP=mdb(sme,'StressMetaDataProvider',850);bcb(992,1,ale,dTb);_.Qe=function eTb(a){cTb(a)};var RSb,SSb,TSb,USb,VSb,WSb,XSb,YSb,ZSb,$Sb,_Sb,aTb;var lP=mdb(sme,'StressOptions',992);bcb(993,1,{},fTb);_.$e=function gTb(){var a;return a=new iTb,a};_._e=function hTb(a){};var kP=mdb(sme,'StressOptions/StressFactory',993);bcb(1128,209,Mle,iTb);_.Ze=function jTb(a,b){var c,d,e,f,g;Odd(b,Sme,1);Ccb(DD(hkd(a,(bTb(),VSb))))?Ccb(DD(hkd(a,_Sb)))||$Cb((c=new _Cb((Pgd(),new bhd(a))),c)):WQb(new ZQb,a,Udd(b,1));e=TQb(a);d=LQb(this.a,e);for(g=d.Kc();g.Ob();){f=BD(g.Pb(),231);if(f.e.c.length<=1){continue}sTb(this.b,f);qTb(this.b);Hkb(f.d,new kTb)}e=KQb(d);SQb(e);Qdd(b)};var nP=mdb(Ume,'StressLayoutProvider',1128);bcb(1129,1,qie,kTb);_.td=function lTb(a){lRb(BD(a,447))};var mP=mdb(Ume,'StressLayoutProvider/lambda$0$Type',1129);bcb(990,1,{},tTb);_.c=0;_.e=0;_.g=0;var qP=mdb(Ume,'StressMajorization',990);bcb(379,22,{3:1,35:1,22:1,379:1},zTb);var vTb,wTb,xTb;var oP=ndb(Ume,'StressMajorization/Dimension',379,CI,BTb,ATb);var CTb;bcb(991,1,Dke,ETb);_.ue=function FTb(a,b){return uTb(this.a,BD(a,144),BD(b,144))};_.Fb=function GTb(a){return this===a};_.ve=function HTb(){return new tpb(this)};var pP=mdb(Ume,'StressMajorization/lambda$0$Type',991);bcb(1229,1,{},PTb);var tP=mdb(Wme,'ElkLayered',1229);bcb(1230,1,qie,STb);_.td=function TTb(a){QTb(BD(a,37))};var rP=mdb(Wme,'ElkLayered/lambda$0$Type',1230);bcb(1231,1,qie,UTb);_.td=function VTb(a){RTb(this.a,BD(a,37))};var sP=mdb(Wme,'ElkLayered/lambda$1$Type',1231);bcb(1263,1,{},bUb);var WTb,XTb,YTb;var xP=mdb(Wme,'GraphConfigurator',1263);bcb(759,1,qie,dUb);_.td=function eUb(a){$Tb(this.a,BD(a,10))};var uP=mdb(Wme,'GraphConfigurator/lambda$0$Type',759);bcb(760,1,{},fUb);_.Kb=function gUb(a){return ZTb(),new YAb(null,new Kub(BD(a,29).a,16))};var vP=mdb(Wme,'GraphConfigurator/lambda$1$Type',760);bcb(761,1,qie,hUb);_.td=function iUb(a){$Tb(this.a,BD(a,10))};var wP=mdb(Wme,'GraphConfigurator/lambda$2$Type',761);bcb(1127,209,Mle,jUb);_.Ze=function kUb(a,b){var c;c=U1b(new a2b,a);PD(hkd(a,(Nyc(),axc)))===PD((hbd(),ebd))?JTb(this.a,c,b):KTb(this.a,c,b);z2b(new D2b,c)};var yP=mdb(Wme,'LayeredLayoutProvider',1127);bcb(356,22,{3:1,35:1,22:1,356:1},rUb);var lUb,mUb,nUb,oUb,pUb;var zP=ndb(Wme,'LayeredPhases',356,CI,tUb,sUb);var uUb;bcb(1651,1,{},CUb);_.i=0;var wUb;var CP=mdb(Xme,'ComponentsToCGraphTransformer',1651);var hVb;bcb(1652,1,{},DUb);_.ef=function EUb(a,b){return $wnd.Math.min(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};_.ff=function FUb(a,b){return $wnd.Math.min(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};var AP=mdb(Xme,'ComponentsToCGraphTransformer/1',1652);bcb(81,1,{81:1});_.i=0;_.k=true;_.o=Qje;var IP=mdb(Yme,'CNode',81);bcb(460,81,{460:1,81:1},GUb,HUb);_.Ib=function IUb(){return ''};var BP=mdb(Xme,'ComponentsToCGraphTransformer/CRectNode',460);bcb(1623,1,{},VUb);var JUb,KUb;var FP=mdb(Xme,'OneDimensionalComponentsCompaction',1623);bcb(1624,1,{},YUb);_.Kb=function ZUb(a){return WUb(BD(a,46))};_.Fb=function $Ub(a){return this===a};var DP=mdb(Xme,'OneDimensionalComponentsCompaction/lambda$0$Type',1624);bcb(1625,1,{},_Ub);_.Kb=function aVb(a){return XUb(BD(a,46))};_.Fb=function bVb(a){return this===a};var EP=mdb(Xme,'OneDimensionalComponentsCompaction/lambda$1$Type',1625);bcb(1654,1,{},dVb);var GP=mdb(Yme,'CGraph',1654);bcb(189,1,{189:1},gVb);_.b=0;_.c=0;_.e=0;_.g=true;_.i=Qje;var HP=mdb(Yme,'CGroup',189);bcb(1653,1,{},jVb);_.ef=function kVb(a,b){return $wnd.Math.max(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};_.ff=function lVb(a,b){return $wnd.Math.max(a.a!=null?Edb(a.a):a.c.i,b.a!=null?Edb(b.a):b.c.i)};var JP=mdb(Yme,Ike,1653);bcb(1655,1,{},CVb);_.d=false;var mVb;var LP=mdb(Yme,Nke,1655);bcb(1656,1,{},DVb);_.Kb=function EVb(a){return nVb(),Bcb(),BD(BD(a,46).a,81).d.e!=0?true:false};_.Fb=function FVb(a){return this===a};var KP=mdb(Yme,Oke,1656);bcb(823,1,{},IVb);_.a=false;_.b=false;_.c=false;_.d=false;var MP=mdb(Yme,Pke,823);bcb(1825,1,{},OVb);var RP=mdb(Zme,Qke,1825);var bQ=odb($me,Fke);bcb(1826,1,{369:1},SVb);_.Ke=function TVb(a){QVb(this,BD(a,466))};var OP=mdb(Zme,Rke,1826);bcb(1827,1,Dke,VVb);_.ue=function WVb(a,b){return UVb(BD(a,81),BD(b,81))};_.Fb=function XVb(a){return this===a};_.ve=function YVb(){return new tpb(this)};var NP=mdb(Zme,Ske,1827);bcb(466,1,{466:1},ZVb);_.a=false;var PP=mdb(Zme,Tke,466);bcb(1828,1,Dke,$Vb);_.ue=function _Vb(a,b){return PVb(BD(a,466),BD(b,466))};_.Fb=function aWb(a){return this===a};_.ve=function bWb(){return new tpb(this)};var QP=mdb(Zme,Uke,1828);bcb(140,1,{140:1},cWb,dWb);_.Fb=function eWb(a){var b;if(a==null){return false}if(TP!=rb(a)){return false}b=BD(a,140);return wtb(this.c,b.c)&&wtb(this.d,b.d)};_.Hb=function fWb(){return Hlb(OC(GC(SI,1),Uhe,1,5,[this.c,this.d]))};_.Ib=function gWb(){return '('+this.c+She+this.d+(this.a?'cx':'')+this.b+')'};_.a=true;_.c=0;_.d=0;var TP=mdb($me,'Point',140);bcb(405,22,{3:1,35:1,22:1,405:1},oWb);var hWb,iWb,jWb,kWb;var SP=ndb($me,'Point/Quadrant',405,CI,sWb,rWb);var tWb;bcb(1642,1,{},CWb);_.b=null;_.c=null;_.d=null;_.e=null;_.f=null;var vWb,wWb,xWb,yWb,zWb;var aQ=mdb($me,'RectilinearConvexHull',1642);bcb(574,1,{369:1},NWb);_.Ke=function OWb(a){MWb(this,BD(a,140))};_.b=0;var KWb;var VP=mdb($me,'RectilinearConvexHull/MaximalElementsEventHandler',574);bcb(1644,1,Dke,QWb);_.ue=function RWb(a,b){return PWb(ED(a),ED(b))};_.Fb=function SWb(a){return this===a};_.ve=function TWb(){return new tpb(this)};var UP=mdb($me,'RectilinearConvexHull/MaximalElementsEventHandler/lambda$0$Type',1644);bcb(1643,1,{369:1},VWb);_.Ke=function WWb(a){UWb(this,BD(a,140))};_.a=0;_.b=null;_.c=null;_.d=null;_.e=null;var WP=mdb($me,'RectilinearConvexHull/RectangleEventHandler',1643);bcb(1645,1,Dke,XWb);_.ue=function YWb(a,b){return EWb(BD(a,140),BD(b,140))};_.Fb=function ZWb(a){return this===a};_.ve=function $Wb(){return new tpb(this)};var XP=mdb($me,'RectilinearConvexHull/lambda$0$Type',1645);bcb(1646,1,Dke,_Wb);_.ue=function aXb(a,b){return FWb(BD(a,140),BD(b,140))};_.Fb=function bXb(a){return this===a};_.ve=function cXb(){return new tpb(this)};var YP=mdb($me,'RectilinearConvexHull/lambda$1$Type',1646);bcb(1647,1,Dke,dXb);_.ue=function eXb(a,b){return GWb(BD(a,140),BD(b,140))};_.Fb=function fXb(a){return this===a};_.ve=function gXb(){return new tpb(this)};var ZP=mdb($me,'RectilinearConvexHull/lambda$2$Type',1647);bcb(1648,1,Dke,hXb);_.ue=function iXb(a,b){return HWb(BD(a,140),BD(b,140))};_.Fb=function jXb(a){return this===a};_.ve=function kXb(){return new tpb(this)};var $P=mdb($me,'RectilinearConvexHull/lambda$3$Type',1648);bcb(1649,1,Dke,lXb);_.ue=function mXb(a,b){return IWb(BD(a,140),BD(b,140))};_.Fb=function nXb(a){return this===a};_.ve=function oXb(){return new tpb(this)};var _P=mdb($me,'RectilinearConvexHull/lambda$4$Type',1649);bcb(1650,1,{},qXb);var cQ=mdb($me,'Scanline',1650);bcb(2005,1,{});var dQ=mdb(_me,'AbstractGraphPlacer',2005);bcb(325,1,{325:1},AXb);_.mf=function BXb(a){if(this.nf(a)){Rc(this.b,BD(vNb(a,(wtc(),Esc)),21),a);return true}else{return false}};_.nf=function CXb(a){var b,c,d,e;b=BD(vNb(a,(wtc(),Esc)),21);e=BD(Qc(wXb,b),21);for(d=e.Kc();d.Ob();){c=BD(d.Pb(),21);if(!BD(Qc(this.b,c),15).dc()){return false}}return true};var wXb;var gQ=mdb(_me,'ComponentGroup',325);bcb(765,2005,{},HXb);_.of=function IXb(a){var b,c;for(c=new olb(this.a);c.an){v=0;w+=m+e;m=0}q=g.c;uXb(g,v+q.a,w+q.b);X6c(q);c=$wnd.Math.max(c,v+s.a);m=$wnd.Math.max(m,s.b);v+=s.a+e}b.f.a=c;b.f.b=w+m;if(Ccb(DD(vNb(f,qwc)))){d=new gYb;YXb(d,a,e);for(l=a.Kc();l.Ob();){k=BD(l.Pb(),37);P6c(X6c(k.c),d.e)}P6c(X6c(b.f),d.a)}tXb(b,a)};var uQ=mdb(_me,'SimpleRowGraphPlacer',1291);bcb(1292,1,Dke,VYb);_.ue=function WYb(a,b){return UYb(BD(a,37),BD(b,37))};_.Fb=function XYb(a){return this===a};_.ve=function YYb(){return new tpb(this)};var tQ=mdb(_me,'SimpleRowGraphPlacer/1',1292);var ZYb;bcb(1262,1,Vke,dZb);_.Lb=function eZb(a){var b;return b=BD(vNb(BD(a,243).b,(Nyc(),jxc)),74),!!b&&b.b!=0};_.Fb=function fZb(a){return this===a};_.Mb=function gZb(a){var b;return b=BD(vNb(BD(a,243).b,(Nyc(),jxc)),74),!!b&&b.b!=0};var vQ=mdb(dne,'CompoundGraphPostprocessor/1',1262);bcb(1261,1,ene,wZb);_.pf=function xZb(a,b){qZb(this,BD(a,37),b)};var xQ=mdb(dne,'CompoundGraphPreprocessor',1261);bcb(441,1,{441:1},yZb);_.c=false;var wQ=mdb(dne,'CompoundGraphPreprocessor/ExternalPort',441);bcb(243,1,{243:1},BZb);_.Ib=function CZb(){return Zr(this.c)+':'+TZb(this.b)};var zQ=mdb(dne,'CrossHierarchyEdge',243);bcb(763,1,Dke,EZb);_.ue=function FZb(a,b){return DZb(this,BD(a,243),BD(b,243))};_.Fb=function GZb(a){return this===a};_.ve=function IZb(){return new tpb(this)};var yQ=mdb(dne,'CrossHierarchyEdgeComparator',763);bcb(299,134,{3:1,299:1,94:1,134:1});_.p=0;var JQ=mdb(fne,'LGraphElement',299);bcb(17,299,{3:1,17:1,299:1,94:1,134:1},UZb);_.Ib=function VZb(){return TZb(this)};var AQ=mdb(fne,'LEdge',17);bcb(37,299,{3:1,20:1,37:1,299:1,94:1,134:1},XZb);_.Jc=function YZb(a){reb(this,a)};_.Kc=function ZZb(){return new olb(this.b)};_.Ib=function $Zb(){if(this.b.c.length==0){return 'G-unlayered'+Fe(this.a)}else if(this.a.c.length==0){return 'G-layered'+Fe(this.b)}return 'G[layerless'+Fe(this.a)+', layers'+Fe(this.b)+']'};var KQ=mdb(fne,'LGraph',37);var _Zb;bcb(657,1,{});_.qf=function b$b(){return this.e.n};_.We=function c$b(a){return vNb(this.e,a)};_.rf=function d$b(){return this.e.o};_.sf=function e$b(){return this.e.p};_.Xe=function f$b(a){return wNb(this.e,a)};_.tf=function g$b(a){this.e.n.a=a.a;this.e.n.b=a.b};_.uf=function h$b(a){this.e.o.a=a.a;this.e.o.b=a.b};_.vf=function i$b(a){this.e.p=a};var BQ=mdb(fne,'LGraphAdapters/AbstractLShapeAdapter',657);bcb(577,1,{839:1},j$b);_.wf=function k$b(){var a,b;if(!this.b){this.b=Pu(this.a.b.c.length);for(b=new olb(this.a.b);b.a0&&E_b((BCb(c-1,b.length),b.charCodeAt(c-1)),nne)){--c}if(g> ',a),C0b(c));Qfb(Pfb((a.a+='[',a),c.i),']')}return a.a};_.c=true;_.d=false;var t0b,u0b,v0b,w0b,x0b,y0b;var aR=mdb(fne,'LPort',11);bcb(397,1,vie,J0b);_.Jc=function K0b(a){reb(this,a)};_.Kc=function L0b(){var a;a=new olb(this.a.e);return new M0b(a)};var RQ=mdb(fne,'LPort/1',397);bcb(1290,1,aie,M0b);_.Nb=function N0b(a){Rrb(this,a)};_.Pb=function P0b(){return BD(mlb(this.a),17).c};_.Ob=function O0b(){return llb(this.a)};_.Qb=function Q0b(){nlb(this.a)};var QQ=mdb(fne,'LPort/1/1',1290);bcb(359,1,vie,R0b);_.Jc=function S0b(a){reb(this,a)};_.Kc=function T0b(){var a;return a=new olb(this.a.g),new U0b(a)};var TQ=mdb(fne,'LPort/2',359);bcb(762,1,aie,U0b);_.Nb=function V0b(a){Rrb(this,a)};_.Pb=function X0b(){return BD(mlb(this.a),17).d};_.Ob=function W0b(){return llb(this.a)};_.Qb=function Y0b(){nlb(this.a)};var SQ=mdb(fne,'LPort/2/1',762);bcb(1283,1,vie,Z0b);_.Jc=function $0b(a){reb(this,a)};_.Kc=function _0b(){return new b1b(this)};var VQ=mdb(fne,'LPort/CombineIter',1283);bcb(201,1,aie,b1b);_.Nb=function c1b(a){Rrb(this,a)};_.Qb=function f1b(){Srb()};_.Ob=function d1b(){return a1b(this)};_.Pb=function e1b(){return llb(this.a)?mlb(this.a):mlb(this.b)};var UQ=mdb(fne,'LPort/CombineIter/1',201);bcb(1285,1,Vke,h1b);_.Lb=function i1b(a){return g1b(a)};_.Fb=function j1b(a){return this===a};_.Mb=function k1b(a){return z0b(),BD(a,11).e.c.length!=0};var WQ=mdb(fne,'LPort/lambda$0$Type',1285);bcb(1284,1,Vke,m1b);_.Lb=function n1b(a){return l1b(a)};_.Fb=function o1b(a){return this===a};_.Mb=function p1b(a){return z0b(),BD(a,11).g.c.length!=0};var XQ=mdb(fne,'LPort/lambda$1$Type',1284);bcb(1286,1,Vke,q1b);_.Lb=function r1b(a){return z0b(),BD(a,11).j==(Ucd(),Acd)};_.Fb=function s1b(a){return this===a};_.Mb=function t1b(a){return z0b(),BD(a,11).j==(Ucd(),Acd)};var YQ=mdb(fne,'LPort/lambda$2$Type',1286);bcb(1287,1,Vke,u1b);_.Lb=function v1b(a){return z0b(),BD(a,11).j==(Ucd(),zcd)};_.Fb=function w1b(a){return this===a};_.Mb=function x1b(a){return z0b(),BD(a,11).j==(Ucd(),zcd)};var ZQ=mdb(fne,'LPort/lambda$3$Type',1287);bcb(1288,1,Vke,y1b);_.Lb=function z1b(a){return z0b(),BD(a,11).j==(Ucd(),Rcd)};_.Fb=function A1b(a){return this===a};_.Mb=function B1b(a){return z0b(),BD(a,11).j==(Ucd(),Rcd)};var $Q=mdb(fne,'LPort/lambda$4$Type',1288);bcb(1289,1,Vke,C1b);_.Lb=function D1b(a){return z0b(),BD(a,11).j==(Ucd(),Tcd)};_.Fb=function E1b(a){return this===a};_.Mb=function F1b(a){return z0b(),BD(a,11).j==(Ucd(),Tcd)};var _Q=mdb(fne,'LPort/lambda$5$Type',1289);bcb(29,299,{3:1,20:1,299:1,29:1,94:1,134:1},H1b);_.Jc=function I1b(a){reb(this,a)};_.Kc=function J1b(){return new olb(this.a)};_.Ib=function K1b(){return 'L_'+Jkb(this.b.b,this,0)+Fe(this.a)};var cR=mdb(fne,'Layer',29);bcb(1342,1,{},a2b);var mR=mdb(tne,une,1342);bcb(1346,1,{},e2b);_.Kb=function f2b(a){return atd(BD(a,82))};var dR=mdb(tne,'ElkGraphImporter/0methodref$connectableShapeToNode$Type',1346);bcb(1349,1,{},g2b);_.Kb=function h2b(a){return atd(BD(a,82))};var eR=mdb(tne,'ElkGraphImporter/1methodref$connectableShapeToNode$Type',1349);bcb(1343,1,qie,i2b);_.td=function j2b(a){Q1b(this.a,BD(a,118))};var fR=mdb(tne,vne,1343);bcb(1344,1,qie,k2b);_.td=function l2b(a){Q1b(this.a,BD(a,118))};var gR=mdb(tne,wne,1344);bcb(1345,1,{},m2b);_.Kb=function n2b(a){return new YAb(null,new Kub(Old(BD(a,79)),16))};var hR=mdb(tne,xne,1345);bcb(1347,1,Oie,o2b);_.Mb=function p2b(a){return b2b(this.a,BD(a,33))};var iR=mdb(tne,yne,1347);bcb(1348,1,{},q2b);_.Kb=function r2b(a){return new YAb(null,new Kub(Nld(BD(a,79)),16))};var jR=mdb(tne,'ElkGraphImporter/lambda$5$Type',1348);bcb(1350,1,Oie,s2b);_.Mb=function t2b(a){return c2b(this.a,BD(a,33))};var kR=mdb(tne,'ElkGraphImporter/lambda$7$Type',1350);bcb(1351,1,Oie,u2b);_.Mb=function v2b(a){return d2b(BD(a,79))};var lR=mdb(tne,'ElkGraphImporter/lambda$8$Type',1351);bcb(1278,1,{},D2b);var w2b;var rR=mdb(tne,'ElkGraphLayoutTransferrer',1278);bcb(1279,1,Oie,G2b);_.Mb=function H2b(a){return E2b(this.a,BD(a,17))};var nR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$0$Type',1279);bcb(1280,1,qie,I2b);_.td=function J2b(a){x2b();Ekb(this.a,BD(a,17))};var oR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$1$Type',1280);bcb(1281,1,Oie,K2b);_.Mb=function L2b(a){return F2b(this.a,BD(a,17))};var pR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$2$Type',1281);bcb(1282,1,qie,M2b);_.td=function N2b(a){x2b();Ekb(this.a,BD(a,17))};var qR=mdb(tne,'ElkGraphLayoutTransferrer/lambda$3$Type',1282);bcb(1485,1,ene,S2b);_.pf=function T2b(a,b){Q2b(BD(a,37),b)};var uR=mdb(Ane,'CommentNodeMarginCalculator',1485);bcb(1486,1,{},U2b);_.Kb=function V2b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var sR=mdb(Ane,'CommentNodeMarginCalculator/lambda$0$Type',1486);bcb(1487,1,qie,W2b);_.td=function X2b(a){R2b(BD(a,10))};var tR=mdb(Ane,'CommentNodeMarginCalculator/lambda$1$Type',1487);bcb(1488,1,ene,_2b);_.pf=function a3b(a,b){Z2b(BD(a,37),b)};var vR=mdb(Ane,'CommentPostprocessor',1488);bcb(1489,1,ene,e3b);_.pf=function f3b(a,b){b3b(BD(a,37),b)};var wR=mdb(Ane,'CommentPreprocessor',1489);bcb(1490,1,ene,h3b);_.pf=function i3b(a,b){g3b(BD(a,37),b)};var xR=mdb(Ane,'ConstraintsPostprocessor',1490);bcb(1491,1,ene,p3b);_.pf=function q3b(a,b){n3b(BD(a,37),b)};var yR=mdb(Ane,'EdgeAndLayerConstraintEdgeReverser',1491);bcb(1492,1,ene,t3b);_.pf=function v3b(a,b){r3b(BD(a,37),b)};var CR=mdb(Ane,'EndLabelPostprocessor',1492);bcb(1493,1,{},w3b);_.Kb=function x3b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var zR=mdb(Ane,'EndLabelPostprocessor/lambda$0$Type',1493);bcb(1494,1,Oie,y3b);_.Mb=function z3b(a){return u3b(BD(a,10))};var AR=mdb(Ane,'EndLabelPostprocessor/lambda$1$Type',1494);bcb(1495,1,qie,A3b);_.td=function B3b(a){s3b(BD(a,10))};var BR=mdb(Ane,'EndLabelPostprocessor/lambda$2$Type',1495);bcb(1496,1,ene,M3b);_.pf=function P3b(a,b){I3b(BD(a,37),b)};var JR=mdb(Ane,'EndLabelPreprocessor',1496);bcb(1497,1,{},Q3b);_.Kb=function R3b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var DR=mdb(Ane,'EndLabelPreprocessor/lambda$0$Type',1497);bcb(1498,1,qie,S3b);_.td=function T3b(a){E3b(this.a,this.b,this.c,BD(a,10))};_.a=0;_.b=0;_.c=false;var ER=mdb(Ane,'EndLabelPreprocessor/lambda$1$Type',1498);bcb(1499,1,Oie,U3b);_.Mb=function V3b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),pad))};var FR=mdb(Ane,'EndLabelPreprocessor/lambda$2$Type',1499);bcb(1500,1,qie,W3b);_.td=function X3b(a){Dsb(this.a,BD(a,70))};var GR=mdb(Ane,'EndLabelPreprocessor/lambda$3$Type',1500);bcb(1501,1,Oie,Y3b);_.Mb=function Z3b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),oad))};var HR=mdb(Ane,'EndLabelPreprocessor/lambda$4$Type',1501);bcb(1502,1,qie,$3b);_.td=function _3b(a){Dsb(this.a,BD(a,70))};var IR=mdb(Ane,'EndLabelPreprocessor/lambda$5$Type',1502);bcb(1551,1,ene,i4b);_.pf=function j4b(a,b){f4b(BD(a,37),b)};var a4b;var RR=mdb(Ane,'EndLabelSorter',1551);bcb(1552,1,Dke,l4b);_.ue=function m4b(a,b){return k4b(BD(a,456),BD(b,456))};_.Fb=function n4b(a){return this===a};_.ve=function o4b(){return new tpb(this)};var KR=mdb(Ane,'EndLabelSorter/1',1552);bcb(456,1,{456:1},p4b);var LR=mdb(Ane,'EndLabelSorter/LabelGroup',456);bcb(1553,1,{},q4b);_.Kb=function r4b(a){return b4b(),new YAb(null,new Kub(BD(a,29).a,16))};var MR=mdb(Ane,'EndLabelSorter/lambda$0$Type',1553);bcb(1554,1,Oie,s4b);_.Mb=function t4b(a){return b4b(),BD(a,10).k==(j0b(),h0b)};var NR=mdb(Ane,'EndLabelSorter/lambda$1$Type',1554);bcb(1555,1,qie,u4b);_.td=function v4b(a){g4b(BD(a,10))};var OR=mdb(Ane,'EndLabelSorter/lambda$2$Type',1555);bcb(1556,1,Oie,w4b);_.Mb=function x4b(a){return b4b(),PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),oad))};var PR=mdb(Ane,'EndLabelSorter/lambda$3$Type',1556);bcb(1557,1,Oie,y4b);_.Mb=function z4b(a){return b4b(),PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),pad))};var QR=mdb(Ane,'EndLabelSorter/lambda$4$Type',1557);bcb(1503,1,ene,L4b);_.pf=function M4b(a,b){J4b(this,BD(a,37))};_.b=0;_.c=0;var YR=mdb(Ane,'FinalSplineBendpointsCalculator',1503);bcb(1504,1,{},N4b);_.Kb=function O4b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var SR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$0$Type',1504);bcb(1505,1,{},P4b);_.Kb=function Q4b(a){return new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var TR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$1$Type',1505);bcb(1506,1,Oie,R4b);_.Mb=function S4b(a){return !OZb(BD(a,17))};var UR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$2$Type',1506);bcb(1507,1,Oie,T4b);_.Mb=function U4b(a){return wNb(BD(a,17),(wtc(),rtc))};var VR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$3$Type',1507);bcb(1508,1,qie,V4b);_.td=function W4b(a){C4b(this.a,BD(a,128))};var WR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$4$Type',1508);bcb(1509,1,qie,X4b);_.td=function Y4b(a){smb(BD(a,17).a)};var XR=mdb(Ane,'FinalSplineBendpointsCalculator/lambda$5$Type',1509);bcb(792,1,ene,u5b);_.pf=function v5b(a,b){l5b(this,BD(a,37),b)};var $R=mdb(Ane,'GraphTransformer',792);bcb(511,22,{3:1,35:1,22:1,511:1},z5b);var w5b,x5b;var ZR=ndb(Ane,'GraphTransformer/Mode',511,CI,B5b,A5b);var C5b;bcb(1510,1,ene,I5b);_.pf=function J5b(a,b){F5b(BD(a,37),b)};var _R=mdb(Ane,'HierarchicalNodeResizingProcessor',1510);bcb(1511,1,ene,Q5b);_.pf=function R5b(a,b){M5b(BD(a,37),b)};var bS=mdb(Ane,'HierarchicalPortConstraintProcessor',1511);bcb(1512,1,Dke,T5b);_.ue=function U5b(a,b){return S5b(BD(a,10),BD(b,10))};_.Fb=function V5b(a){return this===a};_.ve=function W5b(){return new tpb(this)};var aS=mdb(Ane,'HierarchicalPortConstraintProcessor/NodeComparator',1512);bcb(1513,1,ene,Z5b);_.pf=function $5b(a,b){X5b(BD(a,37),b)};var cS=mdb(Ane,'HierarchicalPortDummySizeProcessor',1513);bcb(1514,1,ene,l6b);_.pf=function m6b(a,b){e6b(this,BD(a,37),b)};_.a=0;var fS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter',1514);bcb(1515,1,Dke,o6b);_.ue=function p6b(a,b){return n6b(BD(a,10),BD(b,10))};_.Fb=function q6b(a){return this===a};_.ve=function r6b(){return new tpb(this)};var dS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter/1',1515);bcb(1516,1,Dke,t6b);_.ue=function u6b(a,b){return s6b(BD(a,10),BD(b,10))};_.Fb=function v6b(a){return this===a};_.ve=function w6b(){return new tpb(this)};var eS=mdb(Ane,'HierarchicalPortOrthogonalEdgeRouter/2',1516);bcb(1517,1,ene,z6b);_.pf=function A6b(a,b){y6b(BD(a,37),b)};var gS=mdb(Ane,'HierarchicalPortPositionProcessor',1517);bcb(1518,1,ene,J6b);_.pf=function K6b(a,b){I6b(this,BD(a,37))};_.a=0;_.c=0;var B6b,C6b;var kS=mdb(Ane,'HighDegreeNodeLayeringProcessor',1518);bcb(571,1,{571:1},L6b);_.b=-1;_.d=-1;var hS=mdb(Ane,'HighDegreeNodeLayeringProcessor/HighDegreeNodeInformation',571);bcb(1519,1,{},M6b);_.Kb=function N6b(a){return D6b(),R_b(BD(a,10))};_.Fb=function O6b(a){return this===a};var iS=mdb(Ane,'HighDegreeNodeLayeringProcessor/lambda$0$Type',1519);bcb(1520,1,{},P6b);_.Kb=function Q6b(a){return D6b(),U_b(BD(a,10))};_.Fb=function R6b(a){return this===a};var jS=mdb(Ane,'HighDegreeNodeLayeringProcessor/lambda$1$Type',1520);bcb(1526,1,ene,X6b);_.pf=function Y6b(a,b){W6b(this,BD(a,37),b)};var pS=mdb(Ane,'HyperedgeDummyMerger',1526);bcb(793,1,{},Z6b);_.a=false;_.b=false;_.c=false;var lS=mdb(Ane,'HyperedgeDummyMerger/MergeState',793);bcb(1527,1,{},$6b);_.Kb=function _6b(a){return new YAb(null,new Kub(BD(a,29).a,16))};var mS=mdb(Ane,'HyperedgeDummyMerger/lambda$0$Type',1527);bcb(1528,1,{},a7b);_.Kb=function b7b(a){return new YAb(null,new Kub(BD(a,10).j,16))};var nS=mdb(Ane,'HyperedgeDummyMerger/lambda$1$Type',1528);bcb(1529,1,qie,c7b);_.td=function d7b(a){BD(a,11).p=-1};var oS=mdb(Ane,'HyperedgeDummyMerger/lambda$2$Type',1529);bcb(1530,1,ene,g7b);_.pf=function h7b(a,b){f7b(BD(a,37),b)};var qS=mdb(Ane,'HypernodesProcessor',1530);bcb(1531,1,ene,j7b);_.pf=function k7b(a,b){i7b(BD(a,37),b)};var rS=mdb(Ane,'InLayerConstraintProcessor',1531);bcb(1532,1,ene,m7b);_.pf=function n7b(a,b){l7b(BD(a,37),b)};var sS=mdb(Ane,'InnermostNodeMarginCalculator',1532);bcb(1533,1,ene,r7b);_.pf=function w7b(a,b){q7b(this,BD(a,37))};_.a=Qje;_.b=Qje;_.c=Pje;_.d=Pje;var zS=mdb(Ane,'InteractiveExternalPortPositioner',1533);bcb(1534,1,{},x7b);_.Kb=function y7b(a){return BD(a,17).d.i};_.Fb=function z7b(a){return this===a};var tS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$0$Type',1534);bcb(1535,1,{},A7b);_.Kb=function B7b(a){return s7b(this.a,ED(a))};_.Fb=function C7b(a){return this===a};var uS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$1$Type',1535);bcb(1536,1,{},D7b);_.Kb=function E7b(a){return BD(a,17).c.i};_.Fb=function F7b(a){return this===a};var vS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$2$Type',1536);bcb(1537,1,{},G7b);_.Kb=function H7b(a){return t7b(this.a,ED(a))};_.Fb=function I7b(a){return this===a};var wS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$3$Type',1537);bcb(1538,1,{},J7b);_.Kb=function K7b(a){return u7b(this.a,ED(a))};_.Fb=function L7b(a){return this===a};var xS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$4$Type',1538);bcb(1539,1,{},M7b);_.Kb=function N7b(a){return v7b(this.a,ED(a))};_.Fb=function O7b(a){return this===a};var yS=mdb(Ane,'InteractiveExternalPortPositioner/lambda$5$Type',1539);bcb(77,22,{3:1,35:1,22:1,77:1,234:1},T8b);_.Kf=function U8b(){switch(this.g){case 15:return new eoc;case 22:return new Aoc;case 47:return new Joc;case 28:case 35:return new uac;case 32:return new S2b;case 42:return new _2b;case 1:return new e3b;case 41:return new h3b;case 56:return new u5b((y5b(),x5b));case 0:return new u5b((y5b(),w5b));case 2:return new p3b;case 54:return new t3b;case 33:return new M3b;case 51:return new L4b;case 55:return new I5b;case 13:return new Q5b;case 38:return new Z5b;case 44:return new l6b;case 40:return new z6b;case 9:return new J6b;case 49:return new sgc;case 37:return new X6b;case 43:return new g7b;case 27:return new j7b;case 30:return new m7b;case 3:return new r7b;case 18:return new b9b;case 29:return new h9b;case 5:return new u9b;case 50:return new D9b;case 34:return new $9b;case 36:return new Iac;case 52:return new i4b;case 11:return new Sac;case 7:return new abc;case 39:return new obc;case 45:return new rbc;case 16:return new vbc;case 10:return new Fbc;case 48:return new Xbc;case 21:return new ccc;case 23:return new fGc((rGc(),pGc));case 8:return new lcc;case 12:return new tcc;case 4:return new ycc;case 19:return new Tcc;case 17:return new pdc;case 53:return new sdc;case 6:return new hec;case 25:return new wdc;case 46:return new Ndc;case 31:return new sec;case 14:return new Fec;case 26:return new ppc;case 20:return new Uec;case 24:return new fGc((rGc(),qGc));default:throw vbb(new Wdb(Dne+(this.f!=null?this.f:''+this.g)));}};var P7b,Q7b,R7b,S7b,T7b,U7b,V7b,W7b,X7b,Y7b,Z7b,$7b,_7b,a8b,b8b,c8b,d8b,e8b,f8b,g8b,h8b,i8b,j8b,k8b,l8b,m8b,n8b,o8b,p8b,q8b,r8b,s8b,t8b,u8b,v8b,w8b,x8b,y8b,z8b,A8b,B8b,C8b,D8b,E8b,F8b,G8b,H8b,I8b,J8b,K8b,L8b,M8b,N8b,O8b,P8b,Q8b,R8b;var AS=ndb(Ane,Ene,77,CI,W8b,V8b);var X8b;bcb(1540,1,ene,b9b);_.pf=function c9b(a,b){_8b(BD(a,37),b)};var BS=mdb(Ane,'InvertedPortProcessor',1540);bcb(1541,1,ene,h9b);_.pf=function i9b(a,b){g9b(BD(a,37),b)};var FS=mdb(Ane,'LabelAndNodeSizeProcessor',1541);bcb(1542,1,Oie,j9b);_.Mb=function k9b(a){return BD(a,10).k==(j0b(),h0b)};var CS=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$0$Type',1542);bcb(1543,1,Oie,l9b);_.Mb=function m9b(a){return BD(a,10).k==(j0b(),e0b)};var DS=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$1$Type',1543);bcb(1544,1,qie,n9b);_.td=function o9b(a){e9b(this.b,this.a,this.c,BD(a,10))};_.a=false;_.c=false;var ES=mdb(Ane,'LabelAndNodeSizeProcessor/lambda$2$Type',1544);bcb(1545,1,ene,u9b);_.pf=function v9b(a,b){s9b(BD(a,37),b)};var p9b;var HS=mdb(Ane,'LabelDummyInserter',1545);bcb(1546,1,Vke,w9b);_.Lb=function x9b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),nad))};_.Fb=function y9b(a){return this===a};_.Mb=function z9b(a){return PD(vNb(BD(a,70),(Nyc(),Qwc)))===PD((qad(),nad))};var GS=mdb(Ane,'LabelDummyInserter/1',1546);bcb(1547,1,ene,D9b);_.pf=function E9b(a,b){C9b(BD(a,37),b)};var JS=mdb(Ane,'LabelDummyRemover',1547);bcb(1548,1,Oie,F9b);_.Mb=function G9b(a){return Ccb(DD(vNb(BD(a,70),(Nyc(),Pwc))))};var IS=mdb(Ane,'LabelDummyRemover/lambda$0$Type',1548);bcb(1359,1,ene,$9b);_.pf=function cac(a,b){W9b(this,BD(a,37),b)};_.a=null;var H9b;var QS=mdb(Ane,'LabelDummySwitcher',1359);bcb(286,1,{286:1},gac);_.c=0;_.d=null;_.f=0;var KS=mdb(Ane,'LabelDummySwitcher/LabelDummyInfo',286);bcb(1360,1,{},hac);_.Kb=function iac(a){return I9b(),new YAb(null,new Kub(BD(a,29).a,16))};var LS=mdb(Ane,'LabelDummySwitcher/lambda$0$Type',1360);bcb(1361,1,Oie,jac);_.Mb=function kac(a){return I9b(),BD(a,10).k==(j0b(),f0b)};var MS=mdb(Ane,'LabelDummySwitcher/lambda$1$Type',1361);bcb(1362,1,{},lac);_.Kb=function mac(a){return _9b(this.a,BD(a,10))};var NS=mdb(Ane,'LabelDummySwitcher/lambda$2$Type',1362);bcb(1363,1,qie,nac);_.td=function oac(a){aac(this.a,BD(a,286))};var OS=mdb(Ane,'LabelDummySwitcher/lambda$3$Type',1363);bcb(1364,1,Dke,pac);_.ue=function qac(a,b){return bac(BD(a,286),BD(b,286))};_.Fb=function rac(a){return this===a};_.ve=function sac(){return new tpb(this)};var PS=mdb(Ane,'LabelDummySwitcher/lambda$4$Type',1364);bcb(791,1,ene,uac);_.pf=function vac(a,b){tac(BD(a,37),b)};var RS=mdb(Ane,'LabelManagementProcessor',791);bcb(1549,1,ene,Iac);_.pf=function Jac(a,b){Cac(BD(a,37),b)};var TS=mdb(Ane,'LabelSideSelector',1549);bcb(1550,1,Oie,Kac);_.Mb=function Lac(a){return Ccb(DD(vNb(BD(a,70),(Nyc(),Pwc))))};var SS=mdb(Ane,'LabelSideSelector/lambda$0$Type',1550);bcb(1558,1,ene,Sac);_.pf=function Tac(a,b){Oac(BD(a,37),b)};var US=mdb(Ane,'LayerConstraintPostprocessor',1558);bcb(1559,1,ene,abc);_.pf=function bbc(a,b){$ac(BD(a,37),b)};var Uac;var WS=mdb(Ane,'LayerConstraintPreprocessor',1559);bcb(360,22,{3:1,35:1,22:1,360:1},ibc);var cbc,dbc,ebc,fbc;var VS=ndb(Ane,'LayerConstraintPreprocessor/HiddenNodeConnections',360,CI,kbc,jbc);var lbc;bcb(1560,1,ene,obc);_.pf=function pbc(a,b){nbc(BD(a,37),b)};var XS=mdb(Ane,'LayerSizeAndGraphHeightCalculator',1560);bcb(1561,1,ene,rbc);_.pf=function tbc(a,b){qbc(BD(a,37),b)};var YS=mdb(Ane,'LongEdgeJoiner',1561);bcb(1562,1,ene,vbc);_.pf=function xbc(a,b){ubc(BD(a,37),b)};var ZS=mdb(Ane,'LongEdgeSplitter',1562);bcb(1563,1,ene,Fbc);_.pf=function Ibc(a,b){Bbc(this,BD(a,37),b)};_.d=0;_.e=0;_.i=0;_.j=0;_.k=0;_.n=0;var bT=mdb(Ane,'NodePromotion',1563);bcb(1564,1,{},Jbc);_.Kb=function Kbc(a){return BD(a,46),Bcb(),true};_.Fb=function Lbc(a){return this===a};var $S=mdb(Ane,'NodePromotion/lambda$0$Type',1564);bcb(1565,1,{},Mbc);_.Kb=function Nbc(a){return Gbc(this.a,BD(a,46))};_.Fb=function Obc(a){return this===a};_.a=0;var _S=mdb(Ane,'NodePromotion/lambda$1$Type',1565);bcb(1566,1,{},Pbc);_.Kb=function Qbc(a){return Hbc(this.a,BD(a,46))};_.Fb=function Rbc(a){return this===a};_.a=0;var aT=mdb(Ane,'NodePromotion/lambda$2$Type',1566);bcb(1567,1,ene,Xbc);_.pf=function Ybc(a,b){Sbc(BD(a,37),b)};var cT=mdb(Ane,'NorthSouthPortPostprocessor',1567);bcb(1568,1,ene,ccc);_.pf=function ecc(a,b){acc(BD(a,37),b)};var eT=mdb(Ane,'NorthSouthPortPreprocessor',1568);bcb(1569,1,Dke,fcc);_.ue=function gcc(a,b){return dcc(BD(a,11),BD(b,11))};_.Fb=function hcc(a){return this===a};_.ve=function icc(){return new tpb(this)};var dT=mdb(Ane,'NorthSouthPortPreprocessor/lambda$0$Type',1569);bcb(1570,1,ene,lcc);_.pf=function ncc(a,b){kcc(BD(a,37),b)};var hT=mdb(Ane,'PartitionMidprocessor',1570);bcb(1571,1,Oie,occ);_.Mb=function pcc(a){return wNb(BD(a,10),(Nyc(),Nxc))};var fT=mdb(Ane,'PartitionMidprocessor/lambda$0$Type',1571);bcb(1572,1,qie,qcc);_.td=function rcc(a){mcc(this.a,BD(a,10))};var gT=mdb(Ane,'PartitionMidprocessor/lambda$1$Type',1572);bcb(1573,1,ene,tcc);_.pf=function ucc(a,b){scc(BD(a,37),b)};var iT=mdb(Ane,'PartitionPostprocessor',1573);bcb(1574,1,ene,ycc);_.pf=function zcc(a,b){wcc(BD(a,37),b)};var nT=mdb(Ane,'PartitionPreprocessor',1574);bcb(1575,1,Oie,Acc);_.Mb=function Bcc(a){return wNb(BD(a,10),(Nyc(),Nxc))};var jT=mdb(Ane,'PartitionPreprocessor/lambda$0$Type',1575);bcb(1576,1,{},Ccc);_.Kb=function Dcc(a){return new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var kT=mdb(Ane,'PartitionPreprocessor/lambda$1$Type',1576);bcb(1577,1,Oie,Ecc);_.Mb=function Fcc(a){return vcc(BD(a,17))};var lT=mdb(Ane,'PartitionPreprocessor/lambda$2$Type',1577);bcb(1578,1,qie,Gcc);_.td=function Hcc(a){xcc(BD(a,17))};var mT=mdb(Ane,'PartitionPreprocessor/lambda$3$Type',1578);bcb(1579,1,ene,Tcc);_.pf=function Xcc(a,b){Qcc(BD(a,37),b)};var Icc,Jcc,Kcc,Lcc,Mcc,Ncc;var tT=mdb(Ane,'PortListSorter',1579);bcb(1580,1,{},Zcc);_.Kb=function $cc(a){return Occ(),BD(a,11).e};var oT=mdb(Ane,'PortListSorter/lambda$0$Type',1580);bcb(1581,1,{},_cc);_.Kb=function adc(a){return Occ(),BD(a,11).g};var pT=mdb(Ane,'PortListSorter/lambda$1$Type',1581);bcb(1582,1,Dke,bdc);_.ue=function cdc(a,b){return Ucc(BD(a,11),BD(b,11))};_.Fb=function ddc(a){return this===a};_.ve=function edc(){return new tpb(this)};var qT=mdb(Ane,'PortListSorter/lambda$2$Type',1582);bcb(1583,1,Dke,fdc);_.ue=function gdc(a,b){return Vcc(BD(a,11),BD(b,11))};_.Fb=function hdc(a){return this===a};_.ve=function idc(){return new tpb(this)};var rT=mdb(Ane,'PortListSorter/lambda$3$Type',1583);bcb(1584,1,Dke,jdc);_.ue=function kdc(a,b){return Wcc(BD(a,11),BD(b,11))};_.Fb=function ldc(a){return this===a};_.ve=function mdc(){return new tpb(this)};var sT=mdb(Ane,'PortListSorter/lambda$4$Type',1584);bcb(1585,1,ene,pdc);_.pf=function qdc(a,b){ndc(BD(a,37),b)};var uT=mdb(Ane,'PortSideProcessor',1585);bcb(1586,1,ene,sdc);_.pf=function tdc(a,b){rdc(BD(a,37),b)};var vT=mdb(Ane,'ReversedEdgeRestorer',1586);bcb(1591,1,ene,wdc);_.pf=function xdc(a,b){udc(this,BD(a,37),b)};var CT=mdb(Ane,'SelfLoopPortRestorer',1591);bcb(1592,1,{},ydc);_.Kb=function zdc(a){return new YAb(null,new Kub(BD(a,29).a,16))};var wT=mdb(Ane,'SelfLoopPortRestorer/lambda$0$Type',1592);bcb(1593,1,Oie,Adc);_.Mb=function Bdc(a){return BD(a,10).k==(j0b(),h0b)};var xT=mdb(Ane,'SelfLoopPortRestorer/lambda$1$Type',1593);bcb(1594,1,Oie,Cdc);_.Mb=function Ddc(a){return wNb(BD(a,10),(wtc(),ntc))};var yT=mdb(Ane,'SelfLoopPortRestorer/lambda$2$Type',1594);bcb(1595,1,{},Edc);_.Kb=function Fdc(a){return BD(vNb(BD(a,10),(wtc(),ntc)),403)};var zT=mdb(Ane,'SelfLoopPortRestorer/lambda$3$Type',1595);bcb(1596,1,qie,Gdc);_.td=function Hdc(a){vdc(this.a,BD(a,403))};var AT=mdb(Ane,'SelfLoopPortRestorer/lambda$4$Type',1596);bcb(794,1,qie,Idc);_.td=function Jdc(a){ljc(BD(a,101))};var BT=mdb(Ane,'SelfLoopPortRestorer/lambda$5$Type',794);bcb(1597,1,ene,Ndc);_.pf=function Pdc(a,b){Kdc(BD(a,37),b)};var LT=mdb(Ane,'SelfLoopPostProcessor',1597);bcb(1598,1,{},Qdc);_.Kb=function Rdc(a){return new YAb(null,new Kub(BD(a,29).a,16))};var DT=mdb(Ane,'SelfLoopPostProcessor/lambda$0$Type',1598);bcb(1599,1,Oie,Sdc);_.Mb=function Tdc(a){return BD(a,10).k==(j0b(),h0b)};var ET=mdb(Ane,'SelfLoopPostProcessor/lambda$1$Type',1599);bcb(1600,1,Oie,Udc);_.Mb=function Vdc(a){return wNb(BD(a,10),(wtc(),ntc))};var FT=mdb(Ane,'SelfLoopPostProcessor/lambda$2$Type',1600);bcb(1601,1,qie,Wdc);_.td=function Xdc(a){Ldc(BD(a,10))};var GT=mdb(Ane,'SelfLoopPostProcessor/lambda$3$Type',1601);bcb(1602,1,{},Ydc);_.Kb=function Zdc(a){return new YAb(null,new Kub(BD(a,101).f,1))};var HT=mdb(Ane,'SelfLoopPostProcessor/lambda$4$Type',1602);bcb(1603,1,qie,$dc);_.td=function _dc(a){Mdc(this.a,BD(a,409))};var IT=mdb(Ane,'SelfLoopPostProcessor/lambda$5$Type',1603);bcb(1604,1,Oie,aec);_.Mb=function bec(a){return !!BD(a,101).i};var JT=mdb(Ane,'SelfLoopPostProcessor/lambda$6$Type',1604);bcb(1605,1,qie,cec);_.td=function dec(a){Odc(this.a,BD(a,101))};var KT=mdb(Ane,'SelfLoopPostProcessor/lambda$7$Type',1605);bcb(1587,1,ene,hec);_.pf=function iec(a,b){gec(BD(a,37),b)};var PT=mdb(Ane,'SelfLoopPreProcessor',1587);bcb(1588,1,{},jec);_.Kb=function kec(a){return new YAb(null,new Kub(BD(a,101).f,1))};var MT=mdb(Ane,'SelfLoopPreProcessor/lambda$0$Type',1588);bcb(1589,1,{},lec);_.Kb=function mec(a){return BD(a,409).a};var NT=mdb(Ane,'SelfLoopPreProcessor/lambda$1$Type',1589);bcb(1590,1,qie,nec);_.td=function oec(a){fec(BD(a,17))};var OT=mdb(Ane,'SelfLoopPreProcessor/lambda$2$Type',1590);bcb(1606,1,ene,sec);_.pf=function tec(a,b){qec(this,BD(a,37),b)};var VT=mdb(Ane,'SelfLoopRouter',1606);bcb(1607,1,{},uec);_.Kb=function vec(a){return new YAb(null,new Kub(BD(a,29).a,16))};var QT=mdb(Ane,'SelfLoopRouter/lambda$0$Type',1607);bcb(1608,1,Oie,wec);_.Mb=function xec(a){return BD(a,10).k==(j0b(),h0b)};var RT=mdb(Ane,'SelfLoopRouter/lambda$1$Type',1608);bcb(1609,1,Oie,yec);_.Mb=function zec(a){return wNb(BD(a,10),(wtc(),ntc))};var ST=mdb(Ane,'SelfLoopRouter/lambda$2$Type',1609);bcb(1610,1,{},Aec);_.Kb=function Bec(a){return BD(vNb(BD(a,10),(wtc(),ntc)),403)};var TT=mdb(Ane,'SelfLoopRouter/lambda$3$Type',1610);bcb(1611,1,qie,Cec);_.td=function Dec(a){pec(this.a,this.b,BD(a,403))};var UT=mdb(Ane,'SelfLoopRouter/lambda$4$Type',1611);bcb(1612,1,ene,Fec);_.pf=function Iec(a,b){Eec(BD(a,37),b)};var $T=mdb(Ane,'SemiInteractiveCrossMinProcessor',1612);bcb(1613,1,Oie,Jec);_.Mb=function Kec(a){return BD(a,10).k==(j0b(),h0b)};var WT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$0$Type',1613);bcb(1614,1,Oie,Lec);_.Mb=function Mec(a){return uNb(BD(a,10))._b((Nyc(),ayc))};var XT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$1$Type',1614);bcb(1615,1,Dke,Nec);_.ue=function Oec(a,b){return Gec(BD(a,10),BD(b,10))};_.Fb=function Pec(a){return this===a};_.ve=function Qec(){return new tpb(this)};var YT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$2$Type',1615);bcb(1616,1,{},Rec);_.Ce=function Sec(a,b){return Hec(BD(a,10),BD(b,10))};var ZT=mdb(Ane,'SemiInteractiveCrossMinProcessor/lambda$3$Type',1616);bcb(1618,1,ene,Uec);_.pf=function Yec(a,b){Tec(BD(a,37),b)};var bU=mdb(Ane,'SortByInputModelProcessor',1618);bcb(1619,1,Oie,Zec);_.Mb=function $ec(a){return BD(a,11).g.c.length!=0};var _T=mdb(Ane,'SortByInputModelProcessor/lambda$0$Type',1619);bcb(1620,1,qie,_ec);_.td=function afc(a){Wec(this.a,BD(a,11))};var aU=mdb(Ane,'SortByInputModelProcessor/lambda$1$Type',1620);bcb(1693,803,{},jfc);_.Me=function kfc(a){var b,c,d,e;this.c=a;switch(this.a.g){case 2:b=new Rkb;MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new lgc),new ngc(this,b));nEb(this,new tfc);Hkb(b,new xfc);b.c=KC(SI,Uhe,1,0,5,1);MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new zfc),new Bfc(b));nEb(this,new Ffc);Hkb(b,new Jfc);b.c=KC(SI,Uhe,1,0,5,1);c=Ntb($zb(OAb(new YAb(null,new Kub(this.c.a.b,16)),new Lfc(this))),new Nfc);MAb(new YAb(null,new Kub(this.c.a.a,16)),new Rfc(c,b));nEb(this,new Vfc);Hkb(b,new Zfc);b.c=KC(SI,Uhe,1,0,5,1);break;case 3:d=new Rkb;nEb(this,new lfc);e=Ntb($zb(OAb(new YAb(null,new Kub(this.c.a.b,16)),new pfc(this))),new Pfc);MAb(JAb(new YAb(null,new Kub(this.c.a.b,16)),new _fc),new bgc(e,d));nEb(this,new fgc);Hkb(d,new jgc);d.c=KC(SI,Uhe,1,0,5,1);break;default:throw vbb(new x2c);}};_.b=0;var AU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation',1693);bcb(1694,1,Vke,lfc);_.Lb=function mfc(a){return JD(BD(a,57).g,145)};_.Fb=function nfc(a){return this===a};_.Mb=function ofc(a){return JD(BD(a,57).g,145)};var cU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$0$Type',1694);bcb(1695,1,{},pfc);_.Fe=function qfc(a){return dfc(this.a,BD(a,57))};var dU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$1$Type',1695);bcb(1703,1,Pie,rfc);_.Vd=function sfc(){cfc(this.a,this.b,-1)};_.b=0;var eU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$10$Type',1703);bcb(1705,1,Vke,tfc);_.Lb=function ufc(a){return JD(BD(a,57).g,145)};_.Fb=function vfc(a){return this===a};_.Mb=function wfc(a){return JD(BD(a,57).g,145)};var fU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$11$Type',1705);bcb(1706,1,qie,xfc);_.td=function yfc(a){BD(a,365).Vd()};var gU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$12$Type',1706);bcb(1707,1,Oie,zfc);_.Mb=function Afc(a){return JD(BD(a,57).g,10)};var hU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$13$Type',1707);bcb(1709,1,qie,Bfc);_.td=function Cfc(a){efc(this.a,BD(a,57))};var iU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$14$Type',1709);bcb(1708,1,Pie,Dfc);_.Vd=function Efc(){cfc(this.b,this.a,-1)};_.a=0;var jU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$15$Type',1708);bcb(1710,1,Vke,Ffc);_.Lb=function Gfc(a){return JD(BD(a,57).g,10)};_.Fb=function Hfc(a){return this===a};_.Mb=function Ifc(a){return JD(BD(a,57).g,10)};var kU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$16$Type',1710);bcb(1711,1,qie,Jfc);_.td=function Kfc(a){BD(a,365).Vd()};var lU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$17$Type',1711);bcb(1712,1,{},Lfc);_.Fe=function Mfc(a){return ffc(this.a,BD(a,57))};var mU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$18$Type',1712);bcb(1713,1,{},Nfc);_.De=function Ofc(){return 0};var nU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$19$Type',1713);bcb(1696,1,{},Pfc);_.De=function Qfc(){return 0};var oU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$2$Type',1696);bcb(1715,1,qie,Rfc);_.td=function Sfc(a){gfc(this.a,this.b,BD(a,307))};_.a=0;var pU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$20$Type',1715);bcb(1714,1,Pie,Tfc);_.Vd=function Ufc(){bfc(this.a,this.b,-1)};_.b=0;var qU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$21$Type',1714);bcb(1716,1,Vke,Vfc);_.Lb=function Wfc(a){return BD(a,57),true};_.Fb=function Xfc(a){return this===a};_.Mb=function Yfc(a){return BD(a,57),true};var rU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$22$Type',1716);bcb(1717,1,qie,Zfc);_.td=function $fc(a){BD(a,365).Vd()};var sU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$23$Type',1717);bcb(1697,1,Oie,_fc);_.Mb=function agc(a){return JD(BD(a,57).g,10)};var tU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$3$Type',1697);bcb(1699,1,qie,bgc);_.td=function cgc(a){hfc(this.a,this.b,BD(a,57))};_.a=0;var uU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$4$Type',1699);bcb(1698,1,Pie,dgc);_.Vd=function egc(){cfc(this.b,this.a,-1)};_.a=0;var vU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$5$Type',1698);bcb(1700,1,Vke,fgc);_.Lb=function ggc(a){return BD(a,57),true};_.Fb=function hgc(a){return this===a};_.Mb=function igc(a){return BD(a,57),true};var wU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$6$Type',1700);bcb(1701,1,qie,jgc);_.td=function kgc(a){BD(a,365).Vd()};var xU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$7$Type',1701);bcb(1702,1,Oie,lgc);_.Mb=function mgc(a){return JD(BD(a,57).g,145)};var yU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$8$Type',1702);bcb(1704,1,qie,ngc);_.td=function ogc(a){ifc(this.a,this.b,BD(a,57))};var zU=mdb(Jne,'EdgeAwareScanlineConstraintCalculation/lambda$9$Type',1704);bcb(1521,1,ene,sgc);_.pf=function xgc(a,b){rgc(this,BD(a,37),b)};var pgc;var EU=mdb(Jne,'HorizontalGraphCompactor',1521);bcb(1522,1,{},ygc);_.Oe=function zgc(a,b){var c,d,e;if(vgc(a,b)){return 0}c=tgc(a);d=tgc(b);if(!!c&&c.k==(j0b(),e0b)||!!d&&d.k==(j0b(),e0b)){return 0}e=BD(vNb(this.a.a,(wtc(),otc)),304);return fBc(e,c?c.k:(j0b(),g0b),d?d.k:(j0b(),g0b))};_.Pe=function Agc(a,b){var c,d,e;if(vgc(a,b)){return 1}c=tgc(a);d=tgc(b);e=BD(vNb(this.a.a,(wtc(),otc)),304);return iBc(e,c?c.k:(j0b(),g0b),d?d.k:(j0b(),g0b))};var BU=mdb(Jne,'HorizontalGraphCompactor/1',1522);bcb(1523,1,{},Bgc);_.Ne=function Cgc(a,b){return qgc(),a.a.i==0};var CU=mdb(Jne,'HorizontalGraphCompactor/lambda$0$Type',1523);bcb(1524,1,{},Dgc);_.Ne=function Egc(a,b){return wgc(this.a,a,b)};var DU=mdb(Jne,'HorizontalGraphCompactor/lambda$1$Type',1524);bcb(1664,1,{},Ygc);var Fgc,Ggc;var cV=mdb(Jne,'LGraphToCGraphTransformer',1664);bcb(1672,1,Oie,ehc);_.Mb=function fhc(a){return a!=null};var FU=mdb(Jne,'LGraphToCGraphTransformer/0methodref$nonNull$Type',1672);bcb(1665,1,{},ghc);_.Kb=function hhc(a){return Hgc(),fcb(vNb(BD(BD(a,57).g,10),(wtc(),$sc)))};var GU=mdb(Jne,'LGraphToCGraphTransformer/lambda$0$Type',1665);bcb(1666,1,{},ihc);_.Kb=function jhc(a){return Hgc(),gic(BD(BD(a,57).g,145))};var HU=mdb(Jne,'LGraphToCGraphTransformer/lambda$1$Type',1666);bcb(1675,1,Oie,khc);_.Mb=function lhc(a){return Hgc(),JD(BD(a,57).g,10)};var IU=mdb(Jne,'LGraphToCGraphTransformer/lambda$10$Type',1675);bcb(1676,1,qie,mhc);_.td=function nhc(a){Zgc(BD(a,57))};var JU=mdb(Jne,'LGraphToCGraphTransformer/lambda$11$Type',1676);bcb(1677,1,Oie,ohc);_.Mb=function phc(a){return Hgc(),JD(BD(a,57).g,145)};var KU=mdb(Jne,'LGraphToCGraphTransformer/lambda$12$Type',1677);bcb(1681,1,qie,qhc);_.td=function rhc(a){$gc(BD(a,57))};var LU=mdb(Jne,'LGraphToCGraphTransformer/lambda$13$Type',1681);bcb(1678,1,qie,shc);_.td=function thc(a){_gc(this.a,BD(a,8))};_.a=0;var MU=mdb(Jne,'LGraphToCGraphTransformer/lambda$14$Type',1678);bcb(1679,1,qie,uhc);_.td=function vhc(a){ahc(this.a,BD(a,110))};_.a=0;var NU=mdb(Jne,'LGraphToCGraphTransformer/lambda$15$Type',1679);bcb(1680,1,qie,whc);_.td=function xhc(a){bhc(this.a,BD(a,8))};_.a=0;var OU=mdb(Jne,'LGraphToCGraphTransformer/lambda$16$Type',1680);bcb(1682,1,{},yhc);_.Kb=function zhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var PU=mdb(Jne,'LGraphToCGraphTransformer/lambda$17$Type',1682);bcb(1683,1,Oie,Ahc);_.Mb=function Bhc(a){return Hgc(),OZb(BD(a,17))};var QU=mdb(Jne,'LGraphToCGraphTransformer/lambda$18$Type',1683);bcb(1684,1,qie,Chc);_.td=function Dhc(a){Qgc(this.a,BD(a,17))};var RU=mdb(Jne,'LGraphToCGraphTransformer/lambda$19$Type',1684);bcb(1668,1,qie,Ehc);_.td=function Fhc(a){Rgc(this.a,BD(a,145))};var SU=mdb(Jne,'LGraphToCGraphTransformer/lambda$2$Type',1668);bcb(1685,1,{},Ghc);_.Kb=function Hhc(a){return Hgc(),new YAb(null,new Kub(BD(a,29).a,16))};var TU=mdb(Jne,'LGraphToCGraphTransformer/lambda$20$Type',1685);bcb(1686,1,{},Ihc);_.Kb=function Jhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var UU=mdb(Jne,'LGraphToCGraphTransformer/lambda$21$Type',1686);bcb(1687,1,{},Khc);_.Kb=function Lhc(a){return Hgc(),BD(vNb(BD(a,17),(wtc(),rtc)),15)};var VU=mdb(Jne,'LGraphToCGraphTransformer/lambda$22$Type',1687);bcb(1688,1,Oie,Mhc);_.Mb=function Nhc(a){return chc(BD(a,15))};var WU=mdb(Jne,'LGraphToCGraphTransformer/lambda$23$Type',1688);bcb(1689,1,qie,Ohc);_.td=function Phc(a){Jgc(this.a,BD(a,15))};var XU=mdb(Jne,'LGraphToCGraphTransformer/lambda$24$Type',1689);bcb(1667,1,qie,Qhc);_.td=function Rhc(a){Sgc(this.a,this.b,BD(a,145))};var YU=mdb(Jne,'LGraphToCGraphTransformer/lambda$3$Type',1667);bcb(1669,1,{},Shc);_.Kb=function Thc(a){return Hgc(),new YAb(null,new Kub(BD(a,29).a,16))};var ZU=mdb(Jne,'LGraphToCGraphTransformer/lambda$4$Type',1669);bcb(1670,1,{},Uhc);_.Kb=function Vhc(a){return Hgc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var $U=mdb(Jne,'LGraphToCGraphTransformer/lambda$5$Type',1670);bcb(1671,1,{},Whc);_.Kb=function Xhc(a){return Hgc(),BD(vNb(BD(a,17),(wtc(),rtc)),15)};var _U=mdb(Jne,'LGraphToCGraphTransformer/lambda$6$Type',1671);bcb(1673,1,qie,Yhc);_.td=function Zhc(a){dhc(this.a,BD(a,15))};var aV=mdb(Jne,'LGraphToCGraphTransformer/lambda$8$Type',1673);bcb(1674,1,qie,$hc);_.td=function _hc(a){Tgc(this.a,this.b,BD(a,145))};var bV=mdb(Jne,'LGraphToCGraphTransformer/lambda$9$Type',1674);bcb(1663,1,{},dic);_.Le=function eic(a){var b,c,d,e,f;this.a=a;this.d=new KFb;this.c=KC(jN,Uhe,121,this.a.a.a.c.length,0,1);this.b=0;for(c=new olb(this.a.a.a);c.a=p){Ekb(f,meb(k));s=$wnd.Math.max(s,t[k-1]-l);h+=o;q+=t[k-1]-q;l=t[k-1];o=i[k]}o=$wnd.Math.max(o,i[k]);++k}h+=o}n=$wnd.Math.min(1/s,1/b.b/h);if(n>d){d=n;c=f}}return c};_.Wf=function mpc(){return false};var CW=mdb(Rne,'MSDCutIndexHeuristic',802);bcb(1617,1,ene,ppc);_.pf=function qpc(a,b){opc(BD(a,37),b)};var DW=mdb(Rne,'SingleEdgeGraphWrapper',1617);bcb(227,22,{3:1,35:1,22:1,227:1},Bpc);var upc,vpc,wpc,xpc,ypc,zpc;var EW=ndb(Sne,'CenterEdgeLabelPlacementStrategy',227,CI,Dpc,Cpc);var Epc;bcb(422,22,{3:1,35:1,22:1,422:1},Jpc);var Gpc,Hpc;var FW=ndb(Sne,'ConstraintCalculationStrategy',422,CI,Lpc,Kpc);var Mpc;bcb(314,22,{3:1,35:1,22:1,314:1,246:1,234:1},Tpc);_.Kf=function Vpc(){return Spc(this)};_.Xf=function Upc(){return Spc(this)};var Opc,Ppc,Qpc;var GW=ndb(Sne,'CrossingMinimizationStrategy',314,CI,Xpc,Wpc);var Ypc;bcb(337,22,{3:1,35:1,22:1,337:1},cqc);var $pc,_pc,aqc;var HW=ndb(Sne,'CuttingStrategy',337,CI,eqc,dqc);var fqc;bcb(335,22,{3:1,35:1,22:1,335:1,246:1,234:1},oqc);_.Kf=function qqc(){return nqc(this)};_.Xf=function pqc(){return nqc(this)};var hqc,iqc,jqc,kqc,lqc;var IW=ndb(Sne,'CycleBreakingStrategy',335,CI,sqc,rqc);var tqc;bcb(419,22,{3:1,35:1,22:1,419:1},yqc);var vqc,wqc;var JW=ndb(Sne,'DirectionCongruency',419,CI,Aqc,zqc);var Bqc;bcb(450,22,{3:1,35:1,22:1,450:1},Hqc);var Dqc,Eqc,Fqc;var KW=ndb(Sne,'EdgeConstraint',450,CI,Jqc,Iqc);var Kqc;bcb(276,22,{3:1,35:1,22:1,276:1},Uqc);var Mqc,Nqc,Oqc,Pqc,Qqc,Rqc;var LW=ndb(Sne,'EdgeLabelSideSelection',276,CI,Wqc,Vqc);var Xqc;bcb(479,22,{3:1,35:1,22:1,479:1},arc);var Zqc,$qc;var MW=ndb(Sne,'EdgeStraighteningStrategy',479,CI,crc,brc);var drc;bcb(274,22,{3:1,35:1,22:1,274:1},mrc);var frc,grc,hrc,irc,jrc,krc;var NW=ndb(Sne,'FixedAlignment',274,CI,orc,nrc);var prc;bcb(275,22,{3:1,35:1,22:1,275:1},zrc);var rrc,trc,urc,vrc,wrc,xrc;var OW=ndb(Sne,'GraphCompactionStrategy',275,CI,Brc,Arc);var Crc;bcb(256,22,{3:1,35:1,22:1,256:1},Prc);var Erc,Frc,Grc,Hrc,Irc,Jrc,Krc,Lrc,Mrc,Nrc;var PW=ndb(Sne,'GraphProperties',256,CI,Rrc,Qrc);var Src;bcb(292,22,{3:1,35:1,22:1,292:1},Yrc);var Urc,Vrc,Wrc;var QW=ndb(Sne,'GreedySwitchType',292,CI,$rc,Zrc);var _rc;bcb(303,22,{3:1,35:1,22:1,303:1},fsc);var bsc,csc,dsc;var RW=ndb(Sne,'InLayerConstraint',303,CI,hsc,gsc);var isc;bcb(420,22,{3:1,35:1,22:1,420:1},nsc);var ksc,lsc;var SW=ndb(Sne,'InteractiveReferencePoint',420,CI,psc,osc);var qsc;var ssc,tsc,usc,vsc,wsc,xsc,ysc,zsc,Asc,Bsc,Csc,Dsc,Esc,Fsc,Gsc,Hsc,Isc,Jsc,Ksc,Lsc,Msc,Nsc,Osc,Psc,Qsc,Rsc,Ssc,Tsc,Usc,Vsc,Wsc,Xsc,Ysc,Zsc,$sc,_sc,atc,btc,ctc,dtc,etc,ftc,gtc,htc,itc,jtc,ktc,ltc,mtc,ntc,otc,ptc,qtc,rtc,stc,ttc,utc,vtc;bcb(163,22,{3:1,35:1,22:1,163:1},Dtc);var xtc,ytc,ztc,Atc,Btc;var TW=ndb(Sne,'LayerConstraint',163,CI,Ftc,Etc);var Gtc;bcb(848,1,ale,kwc);_.Qe=function lwc(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Yne),''),'Direction Congruency'),'Specifies how drawings of the same graph with different layout directions compare to each other: either a natural reading direction is preserved or the drawings are rotated versions of each other.'),puc),(_5c(),V5c)),JW),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zne),''),'Feedback Edges'),'Whether feedback edges should be highlighted by routing around the nodes.'),(Bcb(),false)),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$ne),''),'Interactive Reference Point'),'Determines which point of a node is considered by interactive layout phases.'),Muc),V5c),SW),pqb(L5c))));o4c(a,$ne,goe,Ouc);o4c(a,$ne,qoe,Nuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_ne),''),'Merge Edges'),'Edges that have no ports are merged so they touch the connected nodes at the same points. When this option is disabled, one port is created for each edge directly connected to a node. When it is enabled, all such incoming edges share an input port, and all outgoing edges share an output port.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,aoe),''),'Merge Hierarchy-Crossing Edges'),'If hierarchical layout is active, hierarchy-crossing edges use as few hierarchical ports as possible. They are broken by the algorithm, with hierarchical ports inserted as required. Usually, one such port is created for each edge at each hierarchy crossing point. With this option set to true, we try to create as few hierarchical ports as possible in the process. In particular, all edges that form a hyperedge can share a port.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(C5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,boe),''),'Allow Non-Flow Ports To Switch Sides'),"Specifies whether non-flow ports may switch sides if their node's port constraints are either FIXED_SIDE or FIXED_ORDER. A non-flow port is a port on a side that is not part of the currently configured layout flow. For instance, given a left-to-right layout direction, north and south ports would be considered non-flow ports. Further note that the underlying criterium whether to switch sides or not solely relies on the minimization of edge crossings. Hence, edge length and other aesthetics criteria are not addressed."),false),T5c),wI),pqb(M5c)),OC(GC(ZI,1),nie,2,6,['org.eclipse.elk.layered.northOrSouthPort']))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,coe),''),'Port Sorting Strategy'),"Only relevant for nodes with FIXED_SIDE port constraints. Determines the way a node's ports are distributed on the sides of a node if their order is not prescribed. The option is set on parent nodes."),xvc),V5c),cX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,doe),''),'Thoroughness'),'How much effort should be spent to produce a nice layout.'),meb(7)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,eoe),''),'Add Unnecessary Bendpoints'),'Adds bend points even if an edge does not change direction. If true, each long edge dummy will contribute a bend point to its edges and hierarchy-crossing edges will always get a bend point where they cross hierarchy boundaries. By default, bend points are only added where an edge changes direction.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,foe),''),'Generate Position and Layer IDs'),'If enabled position id and layer id are generated, which are usually only used internally when setting the interactiveLayout option. This option should be specified on the root node.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,goe),'cycleBreaking'),'Cycle Breaking Strategy'),'Strategy for cycle breaking. Cycle breaking looks for cycles in the graph and determines which edges to reverse to break the cycles. Reversed edges will end up pointing to the opposite direction of regular edges (that is, reversed edges will point left if edges usually point right).'),nuc),V5c),IW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,hoe),ppe),'Node Layering Strategy'),'Strategy for node layering.'),bvc),V5c),YW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ioe),ppe),'Layer Constraint'),'Determines a constraint on the placement of the node regarding the layering.'),Tuc),V5c),TW),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,joe),ppe),'Layer Choice Constraint'),"Allows to set a constraint regarding the layer placement of a node. Let i be the value of teh constraint. Assumed the drawing has n layers and i < n. If set to i, it expresses that the node should be placed in i-th layer. Should i>=n be true then the node is placed in the last layer of the drawing. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,koe),ppe),'Layer ID'),'Layer identifier that was calculated by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set.'),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,loe),qpe),'Upper Bound On Width [MinWidth Layerer]'),"Defines a loose upper bound on the width of the MinWidth layerer. If set to '-1' multiple values are tested and the best result is selected."),meb(4)),X5c),JI),pqb(L5c))));o4c(a,loe,hoe,Wuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,moe),qpe),'Upper Layer Estimation Scaling Factor [MinWidth Layerer]'),"Multiplied with Upper Bound On Width for defining an upper bound on the width of layers which haven't been determined yet, but whose maximum width had been (roughly) estimated by the MinWidth algorithm. Compensates for too high estimations. If set to '-1' multiple values are tested and the best result is selected."),meb(2)),X5c),JI),pqb(L5c))));o4c(a,moe,hoe,Yuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,noe),rpe),'Node Promotion Strategy'),'Reduces number of dummy nodes after layering phase (if possible).'),_uc),V5c),aX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ooe),rpe),'Max Node Promotion Iterations'),'Limits the number of iterations for node promotion.'),meb(0)),X5c),JI),pqb(L5c))));o4c(a,ooe,noe,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,poe),'layering.coffmanGraham'),'Layer Bound'),'The maximum number of nodes allowed per layer.'),meb(Ohe)),X5c),JI),pqb(L5c))));o4c(a,poe,hoe,Quc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,qoe),spe),'Crossing Minimization Strategy'),'Strategy for crossing minimization.'),luc),V5c),GW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,roe),spe),'Force Node Model Order'),'The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,soe),spe),'Hierarchical Sweepiness'),'How likely it is to use cross-hierarchy (1) vs bottom-up (-1).'),0.1),U5c),BI),pqb(L5c))));o4c(a,soe,tpe,fuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,toe),spe),'Semi-Interactive Crossing Minimization'),"Preserves the order of nodes within a layer but still minimizes crossings between edges connecting long edge dummies. Derives the desired order from positions specified by the 'org.eclipse.elk.position' layout option. Requires a crossing minimization strategy that is able to process 'in-layer' constraints."),false),T5c),wI),pqb(L5c))));o4c(a,toe,qoe,juc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,uoe),spe),'Position Choice Constraint'),"Allows to set a constraint regarding the position placement of a node in a layer. Assumed the layer in which the node placed includes n other nodes and i < n. If set to i, it expresses that the node should be placed at the i-th position. Should i>=n be true then the node is placed at the last position in the layer. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,voe),spe),'Position ID'),'Position within a layer that was determined by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set.'),meb(-1)),X5c),JI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,woe),upe),'Greedy Switch Activation Threshold'),"By default it is decided automatically if the greedy switch is activated or not. The decision is based on whether the size of the input graph (without dummy nodes) is smaller than the value of this option. A '0' enforces the activation."),meb(40)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xoe),upe),'Greedy Switch Crossing Minimization'),"Greedy Switch strategy for crossing minimization. The greedy switch heuristic is executed after the regular crossing minimization as a post-processor. Note that if 'hierarchyHandling' is set to 'INCLUDE_CHILDREN', the 'greedySwitchHierarchical.type' option must be used."),cuc),V5c),QW),pqb(L5c))));o4c(a,xoe,qoe,duc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,yoe),'crossingMinimization.greedySwitchHierarchical'),'Greedy Switch Crossing Minimization (hierarchical)'),"Activates the greedy switch heuristic in case hierarchical layout is used. The differences to the non-hierarchical case (see 'greedySwitch.type') are: 1) greedy switch is inactive by default, 3) only the option value set on the node at which hierarchical layout starts is relevant, and 2) if it's activated by the user, it properly addresses hierarchy-crossing edges."),$tc),V5c),QW),pqb(L5c))));o4c(a,yoe,qoe,_tc);o4c(a,yoe,tpe,auc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,zoe),vpe),'Node Placement Strategy'),'Strategy for node placement.'),vvc),V5c),_W),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Aoe),vpe),'Favor Straight Edges Over Balancing'),"Favor straight edges over a balanced node placement. The default behavior is determined automatically based on the used 'edgeRouting'. For an orthogonal style it is set to true, for all other styles to false."),T5c),wI),pqb(L5c))));o4c(a,Aoe,zoe,lvc);o4c(a,Aoe,zoe,mvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Boe),wpe),'BK Edge Straightening'),"Specifies whether the Brandes Koepf node placer tries to increase the number of straight edges at the expense of diagram size. There is a subtle difference to the 'favorStraightEdges' option, which decides whether a balanced placement of the nodes is desired, or not. In bk terms this means combining the four alignments into a single balanced one, or not. This option on the other hand tries to straighten additional edges during the creation of each of the four alignments."),fvc),V5c),MW),pqb(L5c))));o4c(a,Boe,zoe,gvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Coe),wpe),'BK Fixed Alignment'),'Tells the BK node placer to use a certain alignment (out of its four) instead of the one producing the smallest height, or the combination of all four.'),ivc),V5c),NW),pqb(L5c))));o4c(a,Coe,zoe,jvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Doe),'nodePlacement.linearSegments'),'Linear Segments Deflection Dampening'),'Dampens the movement of nodes to keep the diagram from getting too large.'),0.3),U5c),BI),pqb(L5c))));o4c(a,Doe,zoe,ovc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Eoe),'nodePlacement.networkSimplex'),'Node Flexibility'),"Aims at shorter and straighter edges. Two configurations are possible: (a) allow ports to move freely on the side they are assigned to (the order is always defined beforehand), (b) additionally allow to enlarge a node wherever it helps. If this option is not configured for a node, the 'nodeFlexibility.default' value is used, which is specified for the node's parent."),V5c),$W),pqb(K5c))));o4c(a,Eoe,zoe,tvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Foe),'nodePlacement.networkSimplex.nodeFlexibility'),'Node Flexibility Default'),"Default value of the 'nodeFlexibility' option for the children of a hierarchical node."),rvc),V5c),$W),pqb(L5c))));o4c(a,Foe,zoe,svc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Goe),xpe),'Self-Loop Distribution'),'Alter the distribution of the loops around the node. It only takes effect for PortConstraints.FREE.'),xuc),V5c),eX),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Hoe),xpe),'Self-Loop Ordering'),'Alter the ordering of the loops they can either be stacked or sequenced. It only takes effect for PortConstraints.FREE.'),zuc),V5c),fX),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ioe),'edgeRouting.splines'),'Spline Routing Mode'),'Specifies the way control points are assembled for each individual edge. CONSERVATIVE ensures that edges are properly routed around the nodes but feels rather orthogonal at times. SLOPPY uses fewer control points to obtain curvier edge routes but may result in edges overlapping nodes.'),Buc),V5c),hX),pqb(L5c))));o4c(a,Ioe,ype,Cuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Joe),'edgeRouting.splines.sloppy'),'Sloppy Spline Layer Spacing Factor'),'Spacing factor for routing area between layers when using sloppy spline routing.'),0.2),U5c),BI),pqb(L5c))));o4c(a,Joe,ype,Euc);o4c(a,Joe,Ioe,Fuc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Koe),'edgeRouting.polyline'),'Sloped Edge Zone Width'),'Width of the strip to the left and to the right of each layer where the polyline edge router is allowed to refrain from ensuring that edges are routed horizontally. This prevents awkward bend points for nodes that extent almost to the edge of their layer.'),2),U5c),BI),pqb(L5c))));o4c(a,Koe,ype,vuc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Loe),zpe),'Spacing Base Value'),"An optional base value for all other layout options of the 'spacing' group. It can be used to conveniently alter the overall 'spaciousness' of the drawing. Whenever an explicit value is set for the other layout options, this base value will have no effect. The base value is not inherited, i.e. it must be set for each hierarchical node."),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Moe),zpe),'Edge Node Between Layers Spacing'),"The spacing to be preserved between nodes and edges that are routed next to the node's layer. For the spacing between nodes and edges that cross the node's layer 'spacing.edgeNode' is used."),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Noe),zpe),'Edge Edge Between Layer Spacing'),"Spacing to be preserved between pairs of edges that are routed between the same pair of layers. Note that 'spacing.edgeEdge' is used for the spacing between pairs of edges crossing the same layer."),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ooe),zpe),'Node Node Between Layers Spacing'),"The spacing to be preserved between any pair of nodes of two adjacent layers. Note that 'spacing.nodeNode' is used for the spacing between nodes within the layer itself."),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Poe),Ape),'Direction Priority'),'Defines how important it is to have a certain edge point into the direction of the overall layout. This option is evaluated during the cycle breaking phase.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qoe),Ape),'Shortness Priority'),'Defines how important it is to keep an edge as short as possible. This option is evaluated during the layering phase.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Roe),Ape),'Straightness Priority'),'Defines how important it is to keep an edge straight, i.e. aligned with one of the two axes. This option is evaluated during node placement.'),meb(0)),X5c),JI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Soe),Bpe),Ole),'Tries to further compact components (disconnected sub-graphs).'),false),T5c),wI),pqb(L5c))));o4c(a,Soe,zme,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Toe),Cpe),'Post Compaction Strategy'),Dpe),Ntc),V5c),OW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Uoe),Cpe),'Post Compaction Constraint Calculation'),Dpe),Ltc),V5c),FW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Voe),Epe),'High Degree Node Treatment'),'Makes room around high degree nodes to place leafs and trees.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Woe),Epe),'High Degree Node Threshold'),'Whether a node is considered to have a high degree.'),meb(16)),X5c),JI),pqb(L5c))));o4c(a,Woe,Voe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Xoe),Epe),'High Degree Node Maximum Tree Height'),'Maximum height of a subtree connected to a high degree node to be moved to separate layers.'),meb(5)),X5c),JI),pqb(L5c))));o4c(a,Xoe,Voe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Yoe),Fpe),'Graph Wrapping Strategy'),"For certain graphs and certain prescribed drawing areas it may be desirable to split the laid out graph into chunks that are placed side by side. The edges that connect different chunks are 'wrapped' around from the end of one chunk to the start of the other chunk. The points between the chunks are referred to as 'cuts'."),bwc),V5c),jX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zoe),Fpe),'Additional Wrapped Edges Spacing'),'To visually separate edges that are wrapped from regularly routed edges an additional spacing value can be specified in form of this layout option. The spacing is added to the regular edgeNode spacing.'),10),U5c),BI),pqb(L5c))));o4c(a,Zoe,Yoe,Ivc);o4c(a,Zoe,Yoe,Jvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$oe),Fpe),'Correction Factor for Wrapping'),"At times and for certain types of graphs the executed wrapping may produce results that are consistently biased in the same fashion: either wrapping to often or to rarely. This factor can be used to correct the bias. Internally, it is simply multiplied with the 'aspect ratio' layout option."),1),U5c),BI),pqb(L5c))));o4c(a,$oe,Yoe,Lvc);o4c(a,$oe,Yoe,Mvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_oe),Gpe),'Cutting Strategy'),'The strategy by which the layer indexes are determined at which the layering crumbles into chunks.'),Tvc),V5c),HW),pqb(L5c))));o4c(a,_oe,Yoe,Uvc);o4c(a,_oe,Yoe,Vvc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,ape),Gpe),'Manually Specified Cuts'),'Allows the user to specify her own cuts for a certain graph.'),Y5c),yK),pqb(L5c))));o4c(a,ape,_oe,Ovc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,bpe),'wrapping.cutting.msd'),'MSD Freedom'),'The MSD cutting strategy starts with an initial guess on the number of chunks the graph should be split into. The freedom specifies how much the strategy may deviate from this guess. E.g. if an initial number of 3 is computed, a freedom of 1 allows 2, 3, and 4 cuts.'),Qvc),X5c),JI),pqb(L5c))));o4c(a,bpe,_oe,Rvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,cpe),Hpe),'Validification Strategy'),'When wrapping graphs, one can specify indices that are not allowed as split points. The validification strategy makes sure every computed split point is allowed.'),gwc),V5c),iX),pqb(L5c))));o4c(a,cpe,Yoe,hwc);o4c(a,cpe,Yoe,iwc);t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,dpe),Hpe),'Valid Indices for Wrapping'),null),Y5c),yK),pqb(L5c))));o4c(a,dpe,Yoe,dwc);o4c(a,dpe,Yoe,ewc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,epe),Ipe),'Improve Cuts'),'For general graphs it is important that not too many edges wrap backwards. Thus a compromise between evenly-distributed cuts and the total number of cut edges is sought.'),true),T5c),wI),pqb(L5c))));o4c(a,epe,Yoe,Zvc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,fpe),Ipe),'Distance Penalty When Improving Cuts'),null),2),U5c),BI),pqb(L5c))));o4c(a,fpe,Yoe,Xvc);o4c(a,fpe,epe,true);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,gpe),Ipe),'Improve Wrapped Edges'),'The initial wrapping is performed in a very simple way. As a consequence, edges that wrap from one chunk to another may be unnecessarily long. Activating this option tries to shorten such edges.'),true),T5c),wI),pqb(L5c))));o4c(a,gpe,Yoe,_vc);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,hpe),Jpe),'Edge Label Side Selection'),'Method to decide on edge label sides.'),tuc),V5c),LW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ipe),Jpe),'Edge Center Label Placement Strategy'),'Determines in which layer center labels of long edges should be placed.'),ruc),V5c),EW),qqb(L5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,jpe),Kpe),'Consider Model Order'),'Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting.'),Wtc),V5c),bX),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,kpe),Kpe),'No Model Order'),'Set on a node to not set a model order for this node even though it is a real node.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,lpe),Kpe),'Consider Model Order for Components'),'If set to NONE the usual ordering strategy (by cumulative node priority and size of nodes) is used. INSIDE_PORT_SIDES orders the components with external ports only inside the groups with the same port side. FORCE_MODEL_ORDER enforces the mode order on components. This option might produce bad alignments and sub optimal drawings in terms of used area since the ordering should be respected.'),Ptc),V5c),hQ),pqb(L5c))));o4c(a,lpe,zme,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mpe),Kpe),'Long Edge Ordering Strategy'),'Indicates whether long edges are sorted under, over, or equal to nodes that have no connection to a previous layer in a left-to-right or right-to-left layout. Under and over changes to right and left in a vertical layout.'),Ttc),V5c),ZW),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,npe),Kpe),'Crossing Counter Node Order Influence'),'Indicates with what percentage (1 for 100%) violations of the node model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal node order. Defaults to no influence (0).'),0),U5c),BI),pqb(L5c))));o4c(a,npe,jpe,null);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ope),Kpe),'Crossing Counter Port Order Influence'),'Indicates with what percentage (1 for 100%) violations of the port model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal port order. Defaults to no influence (0).'),0),U5c),BI),pqb(L5c))));o4c(a,ope,jpe,null);Oyc((new Pyc,a))};var Itc,Jtc,Ktc,Ltc,Mtc,Ntc,Otc,Ptc,Qtc,Rtc,Stc,Ttc,Utc,Vtc,Wtc,Xtc,Ytc,Ztc,$tc,_tc,auc,buc,cuc,duc,euc,fuc,guc,huc,iuc,juc,kuc,luc,muc,nuc,ouc,puc,quc,ruc,suc,tuc,uuc,vuc,wuc,xuc,yuc,zuc,Auc,Buc,Cuc,Duc,Euc,Fuc,Guc,Huc,Iuc,Juc,Kuc,Luc,Muc,Nuc,Ouc,Puc,Quc,Ruc,Suc,Tuc,Uuc,Vuc,Wuc,Xuc,Yuc,Zuc,$uc,_uc,avc,bvc,cvc,dvc,evc,fvc,gvc,hvc,ivc,jvc,kvc,lvc,mvc,nvc,ovc,pvc,qvc,rvc,svc,tvc,uvc,vvc,wvc,xvc,yvc,zvc,Avc,Bvc,Cvc,Dvc,Evc,Fvc,Gvc,Hvc,Ivc,Jvc,Kvc,Lvc,Mvc,Nvc,Ovc,Pvc,Qvc,Rvc,Svc,Tvc,Uvc,Vvc,Wvc,Xvc,Yvc,Zvc,$vc,_vc,awc,bwc,cwc,dwc,ewc,fwc,gwc,hwc,iwc;var UW=mdb(Sne,'LayeredMetaDataProvider',848);bcb(986,1,ale,Pyc);_.Qe=function Qyc(a){Oyc(a)};var mwc,nwc,owc,pwc,qwc,rwc,swc,twc,uwc,vwc,wwc,xwc,ywc,zwc,Awc,Bwc,Cwc,Dwc,Ewc,Fwc,Gwc,Hwc,Iwc,Jwc,Kwc,Lwc,Mwc,Nwc,Owc,Pwc,Qwc,Rwc,Swc,Twc,Uwc,Vwc,Wwc,Xwc,Ywc,Zwc,$wc,_wc,axc,bxc,cxc,dxc,exc,fxc,gxc,hxc,ixc,jxc,kxc,lxc,mxc,nxc,oxc,pxc,qxc,rxc,sxc,txc,uxc,vxc,wxc,xxc,yxc,zxc,Axc,Bxc,Cxc,Dxc,Exc,Fxc,Gxc,Hxc,Ixc,Jxc,Kxc,Lxc,Mxc,Nxc,Oxc,Pxc,Qxc,Rxc,Sxc,Txc,Uxc,Vxc,Wxc,Xxc,Yxc,Zxc,$xc,_xc,ayc,byc,cyc,dyc,eyc,fyc,gyc,hyc,iyc,jyc,kyc,lyc,myc,nyc,oyc,pyc,qyc,ryc,syc,tyc,uyc,vyc,wyc,xyc,yyc,zyc,Ayc,Byc,Cyc,Dyc,Eyc,Fyc,Gyc,Hyc,Iyc,Jyc,Kyc,Lyc,Myc;var WW=mdb(Sne,'LayeredOptions',986);bcb(987,1,{},Ryc);_.$e=function Syc(){var a;return a=new jUb,a};_._e=function Tyc(a){};var VW=mdb(Sne,'LayeredOptions/LayeredFactory',987);bcb(1372,1,{});_.a=0;var Uyc;var $1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder',1372);bcb(779,1372,{},ezc);var bzc,czc;var XW=mdb(Sne,'LayeredSpacings/LayeredSpacingsBuilder',779);bcb(313,22,{3:1,35:1,22:1,313:1,246:1,234:1},nzc);_.Kf=function pzc(){return mzc(this)};_.Xf=function ozc(){return mzc(this)};var fzc,gzc,hzc,izc,jzc,kzc;var YW=ndb(Sne,'LayeringStrategy',313,CI,rzc,qzc);var szc;bcb(378,22,{3:1,35:1,22:1,378:1},zzc);var uzc,vzc,wzc;var ZW=ndb(Sne,'LongEdgeOrderingStrategy',378,CI,Bzc,Azc);var Czc;bcb(197,22,{3:1,35:1,22:1,197:1},Kzc);var Ezc,Fzc,Gzc,Hzc;var $W=ndb(Sne,'NodeFlexibility',197,CI,Nzc,Mzc);var Ozc;bcb(315,22,{3:1,35:1,22:1,315:1,246:1,234:1},Xzc);_.Kf=function Zzc(){return Wzc(this)};_.Xf=function Yzc(){return Wzc(this)};var Qzc,Rzc,Szc,Tzc,Uzc;var _W=ndb(Sne,'NodePlacementStrategy',315,CI,_zc,$zc);var aAc;bcb(260,22,{3:1,35:1,22:1,260:1},lAc);var cAc,dAc,eAc,fAc,gAc,hAc,iAc,jAc;var aX=ndb(Sne,'NodePromotionStrategy',260,CI,nAc,mAc);var oAc;bcb(339,22,{3:1,35:1,22:1,339:1},uAc);var qAc,rAc,sAc;var bX=ndb(Sne,'OrderingStrategy',339,CI,wAc,vAc);var xAc;bcb(421,22,{3:1,35:1,22:1,421:1},CAc);var zAc,AAc;var cX=ndb(Sne,'PortSortingStrategy',421,CI,EAc,DAc);var FAc;bcb(452,22,{3:1,35:1,22:1,452:1},LAc);var HAc,IAc,JAc;var dX=ndb(Sne,'PortType',452,CI,NAc,MAc);var OAc;bcb(375,22,{3:1,35:1,22:1,375:1},UAc);var QAc,RAc,SAc;var eX=ndb(Sne,'SelfLoopDistributionStrategy',375,CI,WAc,VAc);var XAc;bcb(376,22,{3:1,35:1,22:1,376:1},aBc);var ZAc,$Ac;var fX=ndb(Sne,'SelfLoopOrderingStrategy',376,CI,cBc,bBc);var dBc;bcb(304,1,{304:1},oBc);var gX=mdb(Sne,'Spacings',304);bcb(336,22,{3:1,35:1,22:1,336:1},uBc);var qBc,rBc,sBc;var hX=ndb(Sne,'SplineRoutingMode',336,CI,wBc,vBc);var xBc;bcb(338,22,{3:1,35:1,22:1,338:1},DBc);var zBc,ABc,BBc;var iX=ndb(Sne,'ValidifyStrategy',338,CI,FBc,EBc);var GBc;bcb(377,22,{3:1,35:1,22:1,377:1},MBc);var IBc,JBc,KBc;var jX=ndb(Sne,'WrappingStrategy',377,CI,OBc,NBc);var PBc;bcb(1383,1,Bqe,VBc);_.Yf=function WBc(a){return BD(a,37),RBc};_.pf=function XBc(a,b){UBc(this,BD(a,37),b)};var RBc;var kX=mdb(Cqe,'DepthFirstCycleBreaker',1383);bcb(782,1,Bqe,aCc);_.Yf=function cCc(a){return BD(a,37),YBc};_.pf=function dCc(a,b){$Bc(this,BD(a,37),b)};_.Zf=function bCc(a){return BD(Ikb(a,Bub(this.d,a.c.length)),10)};var YBc;var lX=mdb(Cqe,'GreedyCycleBreaker',782);bcb(1386,782,Bqe,eCc);_.Zf=function fCc(a){var b,c,d,e;e=null;b=Ohe;for(d=new olb(a);d.a1){Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),(Nyc(),Awc))))?YGc(a,this.d,BD(this,660)):(mmb(),Okb(a,this.d));PEc(this.e,a)}};_.Sf=function DEc(a,b,c,d){var e,f,g,h,i,j,k;if(b!=sEc(c,a.length)){f=a[b-(c?1:-1)];UDc(this.f,f,c?(KAc(),IAc):(KAc(),HAc))}e=a[b][0];k=!d||e.k==(j0b(),e0b);j=Ou(a[b]);this.ag(j,k,false,c);g=0;for(i=new olb(j);i.a');a0?(RHc(this.a,a[b-1],a[b]),undefined):!c&&b1){Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),(Nyc(),Awc))))?YGc(a,this.d,this):(mmb(),Okb(a,this.d));Ccb(DD(vNb(Q_b((tCb(0,a.c.length),BD(a.c[0],10))),Awc)))||PEc(this.e,a)}};var YX=mdb(Gqe,'ModelOrderBarycenterHeuristic',660);bcb(1803,1,Dke,$Gc);_.ue=function _Gc(a,b){return VGc(this.a,BD(a,10),BD(b,10))};_.Fb=function aHc(a){return this===a};_.ve=function bHc(){return new tpb(this)};var XX=mdb(Gqe,'ModelOrderBarycenterHeuristic/lambda$0$Type',1803);bcb(1403,1,Bqe,fHc);_.Yf=function gHc(a){var b;return BD(a,37),b=k3c(cHc),e3c(b,(qUb(),nUb),(S8b(),H8b)),b};_.pf=function hHc(a,b){eHc((BD(a,37),b))};var cHc;var ZX=mdb(Gqe,'NoCrossingMinimizer',1403);bcb(796,402,Eqe,iHc);_.$f=function jHc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n;l=this.g;switch(c.g){case 1:{e=0;f=0;for(k=new olb(a.j);k.a1&&(e.j==(Ucd(),zcd)?(this.b[a]=true):e.j==Tcd&&a>0&&(this.b[a-1]=true))};_.f=0;var aY=mdb(Lne,'AllCrossingsCounter',1798);bcb(587,1,{},BHc);_.b=0;_.d=0;var bY=mdb(Lne,'BinaryIndexedTree',587);bcb(524,1,{},dIc);var DHc,EHc;var lY=mdb(Lne,'CrossingsCounter',524);bcb(1906,1,Dke,hIc);_.ue=function iIc(a,b){return YHc(this.a,BD(a,11),BD(b,11))};_.Fb=function jIc(a){return this===a};_.ve=function kIc(){return new tpb(this)};var cY=mdb(Lne,'CrossingsCounter/lambda$0$Type',1906);bcb(1907,1,Dke,lIc);_.ue=function mIc(a,b){return ZHc(this.a,BD(a,11),BD(b,11))};_.Fb=function nIc(a){return this===a};_.ve=function oIc(){return new tpb(this)};var dY=mdb(Lne,'CrossingsCounter/lambda$1$Type',1907);bcb(1908,1,Dke,pIc);_.ue=function qIc(a,b){return $Hc(this.a,BD(a,11),BD(b,11))};_.Fb=function rIc(a){return this===a};_.ve=function sIc(){return new tpb(this)};var eY=mdb(Lne,'CrossingsCounter/lambda$2$Type',1908);bcb(1909,1,Dke,tIc);_.ue=function uIc(a,b){return _Hc(this.a,BD(a,11),BD(b,11))};_.Fb=function vIc(a){return this===a};_.ve=function wIc(){return new tpb(this)};var fY=mdb(Lne,'CrossingsCounter/lambda$3$Type',1909);bcb(1910,1,qie,xIc);_.td=function yIc(a){eIc(this.a,BD(a,11))};var gY=mdb(Lne,'CrossingsCounter/lambda$4$Type',1910);bcb(1911,1,Oie,zIc);_.Mb=function AIc(a){return fIc(this.a,BD(a,11))};var hY=mdb(Lne,'CrossingsCounter/lambda$5$Type',1911);bcb(1912,1,qie,CIc);_.td=function DIc(a){BIc(this,a)};var iY=mdb(Lne,'CrossingsCounter/lambda$6$Type',1912);bcb(1913,1,qie,EIc);_.td=function FIc(a){var b;FHc();Wjb(this.b,(b=this.a,BD(a,11),b))};var jY=mdb(Lne,'CrossingsCounter/lambda$7$Type',1913);bcb(826,1,Vke,GIc);_.Lb=function HIc(a){return FHc(),wNb(BD(a,11),(wtc(),gtc))};_.Fb=function IIc(a){return this===a};_.Mb=function JIc(a){return FHc(),wNb(BD(a,11),(wtc(),gtc))};var kY=mdb(Lne,'CrossingsCounter/lambda$8$Type',826);bcb(1905,1,{},LIc);var pY=mdb(Lne,'HyperedgeCrossingsCounter',1905);bcb(467,1,{35:1,467:1},NIc);_.wd=function OIc(a){return MIc(this,BD(a,467))};_.b=0;_.c=0;_.e=0;_.f=0;var oY=mdb(Lne,'HyperedgeCrossingsCounter/Hyperedge',467);bcb(362,1,{35:1,362:1},QIc);_.wd=function RIc(a){return PIc(this,BD(a,362))};_.b=0;_.c=0;var nY=mdb(Lne,'HyperedgeCrossingsCounter/HyperedgeCorner',362);bcb(523,22,{3:1,35:1,22:1,523:1},VIc);var SIc,TIc;var mY=ndb(Lne,'HyperedgeCrossingsCounter/HyperedgeCorner/Type',523,CI,XIc,WIc);var YIc;bcb(1405,1,Bqe,dJc);_.Yf=function eJc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?_Ic:null};_.pf=function fJc(a,b){cJc(this,BD(a,37),b)};var _Ic;var rY=mdb(Hqe,'InteractiveNodePlacer',1405);bcb(1406,1,Bqe,tJc);_.Yf=function uJc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?gJc:null};_.pf=function vJc(a,b){rJc(this,BD(a,37),b)};var gJc,hJc,iJc;var tY=mdb(Hqe,'LinearSegmentsNodePlacer',1406);bcb(257,1,{35:1,257:1},zJc);_.wd=function AJc(a){return wJc(this,BD(a,257))};_.Fb=function BJc(a){var b;if(JD(a,257)){b=BD(a,257);return this.b==b.b}return false};_.Hb=function CJc(){return this.b};_.Ib=function DJc(){return 'ls'+Fe(this.e)};_.a=0;_.b=0;_.c=-1;_.d=-1;_.g=0;var sY=mdb(Hqe,'LinearSegmentsNodePlacer/LinearSegment',257);bcb(1408,1,Bqe,$Jc);_.Yf=function _Jc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?EJc:null};_.pf=function hKc(a,b){WJc(this,BD(a,37),b)};_.b=0;_.g=0;var EJc;var dZ=mdb(Hqe,'NetworkSimplexPlacer',1408);bcb(1427,1,Dke,iKc);_.ue=function jKc(a,b){return beb(BD(a,19).a,BD(b,19).a)};_.Fb=function kKc(a){return this===a};_.ve=function lKc(){return new tpb(this)};var uY=mdb(Hqe,'NetworkSimplexPlacer/0methodref$compare$Type',1427);bcb(1429,1,Dke,mKc);_.ue=function nKc(a,b){return beb(BD(a,19).a,BD(b,19).a)};_.Fb=function oKc(a){return this===a};_.ve=function pKc(){return new tpb(this)};var vY=mdb(Hqe,'NetworkSimplexPlacer/1methodref$compare$Type',1429);bcb(649,1,{649:1},qKc);var wY=mdb(Hqe,'NetworkSimplexPlacer/EdgeRep',649);bcb(401,1,{401:1},rKc);_.b=false;var xY=mdb(Hqe,'NetworkSimplexPlacer/NodeRep',401);bcb(508,12,{3:1,4:1,20:1,28:1,52:1,12:1,14:1,15:1,54:1,508:1},vKc);var CY=mdb(Hqe,'NetworkSimplexPlacer/Path',508);bcb(1409,1,{},wKc);_.Kb=function xKc(a){return BD(a,17).d.i.k};var yY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$0$Type',1409);bcb(1410,1,Oie,yKc);_.Mb=function zKc(a){return BD(a,267)==(j0b(),g0b)};var zY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$1$Type',1410);bcb(1411,1,{},AKc);_.Kb=function BKc(a){return BD(a,17).d.i};var AY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$2$Type',1411);bcb(1412,1,Oie,CKc);_.Mb=function DKc(a){return eLc(Lzc(BD(a,10)))};var BY=mdb(Hqe,'NetworkSimplexPlacer/Path/lambda$3$Type',1412);bcb(1413,1,Oie,EKc);_.Mb=function FKc(a){return dKc(BD(a,11))};var DY=mdb(Hqe,'NetworkSimplexPlacer/lambda$0$Type',1413);bcb(1414,1,qie,GKc);_.td=function HKc(a){LJc(this.a,this.b,BD(a,11))};var EY=mdb(Hqe,'NetworkSimplexPlacer/lambda$1$Type',1414);bcb(1423,1,qie,IKc);_.td=function JKc(a){MJc(this.a,BD(a,17))};var FY=mdb(Hqe,'NetworkSimplexPlacer/lambda$10$Type',1423);bcb(1424,1,{},KKc);_.Kb=function LKc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var GY=mdb(Hqe,'NetworkSimplexPlacer/lambda$11$Type',1424);bcb(1425,1,qie,MKc);_.td=function NKc(a){NJc(this.a,BD(a,10))};var HY=mdb(Hqe,'NetworkSimplexPlacer/lambda$12$Type',1425);bcb(1426,1,{},OKc);_.Kb=function PKc(a){return FJc(),meb(BD(a,121).e)};var IY=mdb(Hqe,'NetworkSimplexPlacer/lambda$13$Type',1426);bcb(1428,1,{},QKc);_.Kb=function RKc(a){return FJc(),meb(BD(a,121).e)};var JY=mdb(Hqe,'NetworkSimplexPlacer/lambda$15$Type',1428);bcb(1430,1,Oie,SKc);_.Mb=function TKc(a){return FJc(),BD(a,401).c.k==(j0b(),h0b)};var KY=mdb(Hqe,'NetworkSimplexPlacer/lambda$17$Type',1430);bcb(1431,1,Oie,UKc);_.Mb=function VKc(a){return FJc(),BD(a,401).c.j.c.length>1};var LY=mdb(Hqe,'NetworkSimplexPlacer/lambda$18$Type',1431);bcb(1432,1,qie,WKc);_.td=function XKc(a){eKc(this.c,this.b,this.d,this.a,BD(a,401))};_.c=0;_.d=0;var MY=mdb(Hqe,'NetworkSimplexPlacer/lambda$19$Type',1432);bcb(1415,1,{},YKc);_.Kb=function ZKc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var NY=mdb(Hqe,'NetworkSimplexPlacer/lambda$2$Type',1415);bcb(1433,1,qie,$Kc);_.td=function _Kc(a){fKc(this.a,BD(a,11))};_.a=0;var OY=mdb(Hqe,'NetworkSimplexPlacer/lambda$20$Type',1433);bcb(1434,1,{},aLc);_.Kb=function bLc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var PY=mdb(Hqe,'NetworkSimplexPlacer/lambda$21$Type',1434);bcb(1435,1,qie,cLc);_.td=function dLc(a){OJc(this.a,BD(a,10))};var QY=mdb(Hqe,'NetworkSimplexPlacer/lambda$22$Type',1435);bcb(1436,1,Oie,fLc);_.Mb=function gLc(a){return eLc(a)};var RY=mdb(Hqe,'NetworkSimplexPlacer/lambda$23$Type',1436);bcb(1437,1,{},hLc);_.Kb=function iLc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var SY=mdb(Hqe,'NetworkSimplexPlacer/lambda$24$Type',1437);bcb(1438,1,Oie,jLc);_.Mb=function kLc(a){return PJc(this.a,BD(a,10))};var TY=mdb(Hqe,'NetworkSimplexPlacer/lambda$25$Type',1438);bcb(1439,1,qie,lLc);_.td=function mLc(a){QJc(this.a,this.b,BD(a,10))};var UY=mdb(Hqe,'NetworkSimplexPlacer/lambda$26$Type',1439);bcb(1440,1,Oie,nLc);_.Mb=function oLc(a){return FJc(),!OZb(BD(a,17))};var VY=mdb(Hqe,'NetworkSimplexPlacer/lambda$27$Type',1440);bcb(1441,1,Oie,pLc);_.Mb=function qLc(a){return FJc(),!OZb(BD(a,17))};var WY=mdb(Hqe,'NetworkSimplexPlacer/lambda$28$Type',1441);bcb(1442,1,{},rLc);_.Ce=function sLc(a,b){return RJc(this.a,BD(a,29),BD(b,29))};var XY=mdb(Hqe,'NetworkSimplexPlacer/lambda$29$Type',1442);bcb(1416,1,{},tLc);_.Kb=function uLc(a){return FJc(),new YAb(null,new Lub(new Sr(ur(U_b(BD(a,10)).a.Kc(),new Sq))))};var YY=mdb(Hqe,'NetworkSimplexPlacer/lambda$3$Type',1416);bcb(1417,1,Oie,vLc);_.Mb=function wLc(a){return FJc(),cKc(BD(a,17))};var ZY=mdb(Hqe,'NetworkSimplexPlacer/lambda$4$Type',1417);bcb(1418,1,qie,xLc);_.td=function yLc(a){XJc(this.a,BD(a,17))};var $Y=mdb(Hqe,'NetworkSimplexPlacer/lambda$5$Type',1418);bcb(1419,1,{},zLc);_.Kb=function ALc(a){return FJc(),new YAb(null,new Kub(BD(a,29).a,16))};var _Y=mdb(Hqe,'NetworkSimplexPlacer/lambda$6$Type',1419);bcb(1420,1,Oie,BLc);_.Mb=function CLc(a){return FJc(),BD(a,10).k==(j0b(),h0b)};var aZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$7$Type',1420);bcb(1421,1,{},DLc);_.Kb=function ELc(a){return FJc(),new YAb(null,new Lub(new Sr(ur(O_b(BD(a,10)).a.Kc(),new Sq))))};var bZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$8$Type',1421);bcb(1422,1,Oie,FLc);_.Mb=function GLc(a){return FJc(),NZb(BD(a,17))};var cZ=mdb(Hqe,'NetworkSimplexPlacer/lambda$9$Type',1422);bcb(1404,1,Bqe,KLc);_.Yf=function LLc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?HLc:null};_.pf=function MLc(a,b){JLc(BD(a,37),b)};var HLc;var eZ=mdb(Hqe,'SimpleNodePlacer',1404);bcb(180,1,{180:1},ULc);_.Ib=function VLc(){var a;a='';this.c==(YLc(),XLc)?(a+=kle):this.c==WLc&&(a+=jle);this.o==(eMc(),cMc)?(a+=vle):this.o==dMc?(a+='UP'):(a+='BALANCED');return a};var hZ=mdb(Kqe,'BKAlignedLayout',180);bcb(516,22,{3:1,35:1,22:1,516:1},ZLc);var WLc,XLc;var fZ=ndb(Kqe,'BKAlignedLayout/HDirection',516,CI,_Lc,$Lc);var aMc;bcb(515,22,{3:1,35:1,22:1,515:1},fMc);var cMc,dMc;var gZ=ndb(Kqe,'BKAlignedLayout/VDirection',515,CI,hMc,gMc);var iMc;bcb(1634,1,{},mMc);var iZ=mdb(Kqe,'BKAligner',1634);bcb(1637,1,{},rMc);var lZ=mdb(Kqe,'BKCompactor',1637);bcb(654,1,{654:1},sMc);_.a=0;var jZ=mdb(Kqe,'BKCompactor/ClassEdge',654);bcb(458,1,{458:1},uMc);_.a=null;_.b=0;var kZ=mdb(Kqe,'BKCompactor/ClassNode',458);bcb(1407,1,Bqe,CMc);_.Yf=function GMc(a){return BD(vNb(BD(a,37),(wtc(),Ksc)),21).Hc((Orc(),Hrc))?vMc:null};_.pf=function HMc(a,b){BMc(this,BD(a,37),b)};_.d=false;var vMc;var mZ=mdb(Kqe,'BKNodePlacer',1407);bcb(1635,1,{},JMc);_.d=0;var oZ=mdb(Kqe,'NeighborhoodInformation',1635);bcb(1636,1,Dke,OMc);_.ue=function PMc(a,b){return NMc(this,BD(a,46),BD(b,46))};_.Fb=function QMc(a){return this===a};_.ve=function RMc(){return new tpb(this)};var nZ=mdb(Kqe,'NeighborhoodInformation/NeighborComparator',1636);bcb(808,1,{});var sZ=mdb(Kqe,'ThresholdStrategy',808);bcb(1763,808,{},WMc);_.bg=function XMc(a,b,c){return this.a.o==(eMc(),dMc)?Pje:Qje};_.cg=function YMc(){};var pZ=mdb(Kqe,'ThresholdStrategy/NullThresholdStrategy',1763);bcb(579,1,{579:1},ZMc);_.c=false;_.d=false;var qZ=mdb(Kqe,'ThresholdStrategy/Postprocessable',579);bcb(1764,808,{},bNc);_.bg=function cNc(a,b,c){var d,e,f;e=b==c;d=this.a.a[c.p]==b;if(!(e||d)){return a}f=a;if(this.a.c==(YLc(),XLc)){e&&(f=$Mc(this,b,true));!isNaN(f)&&!isFinite(f)&&d&&(f=$Mc(this,c,false))}else{e&&(f=$Mc(this,b,true));!isNaN(f)&&!isFinite(f)&&d&&(f=$Mc(this,c,false))}return f};_.cg=function dNc(){var a,b,c,d,e;while(this.d.b!=0){e=BD(Ksb(this.d),579);d=_Mc(this,e);if(!d.a){continue}a=d.a;c=Ccb(this.a.f[this.a.g[e.b.p].p]);if(!c&&!OZb(a)&&a.c.i.c==a.d.i.c){continue}b=aNc(this,e);b||swb(this.e,e)}while(this.e.a.c.length!=0){aNc(this,BD(rwb(this.e),579))}};var rZ=mdb(Kqe,'ThresholdStrategy/SimpleThresholdStrategy',1764);bcb(635,1,{635:1,246:1,234:1},hNc);_.Kf=function jNc(){return gNc(this)};_.Xf=function iNc(){return gNc(this)};var eNc;var tZ=mdb(Lqe,'EdgeRouterFactory',635);bcb(1458,1,Bqe,wNc);_.Yf=function xNc(a){return uNc(BD(a,37))};_.pf=function yNc(a,b){vNc(BD(a,37),b)};var lNc,mNc,nNc,oNc,pNc,qNc,rNc,sNc;var uZ=mdb(Lqe,'OrthogonalEdgeRouter',1458);bcb(1451,1,Bqe,NNc);_.Yf=function ONc(a){return INc(BD(a,37))};_.pf=function PNc(a,b){KNc(this,BD(a,37),b)};var zNc,ANc,BNc,CNc,DNc,ENc;var wZ=mdb(Lqe,'PolylineEdgeRouter',1451);bcb(1452,1,Vke,RNc);_.Lb=function SNc(a){return QNc(BD(a,10))};_.Fb=function TNc(a){return this===a};_.Mb=function UNc(a){return QNc(BD(a,10))};var vZ=mdb(Lqe,'PolylineEdgeRouter/1',1452);bcb(1809,1,Oie,ZNc);_.Mb=function $Nc(a){return BD(a,129).c==(HOc(),FOc)};var xZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$0$Type',1809);bcb(1810,1,{},_Nc);_.Ge=function aOc(a){return BD(a,129).d};var yZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$1$Type',1810);bcb(1811,1,Oie,bOc);_.Mb=function cOc(a){return BD(a,129).c==(HOc(),FOc)};var zZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$2$Type',1811);bcb(1812,1,{},dOc);_.Ge=function eOc(a){return BD(a,129).d};var AZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$3$Type',1812);bcb(1813,1,{},fOc);_.Ge=function gOc(a){return BD(a,129).d};var BZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$4$Type',1813);bcb(1814,1,{},hOc);_.Ge=function iOc(a){return BD(a,129).d};var CZ=mdb(Mqe,'HyperEdgeCycleDetector/lambda$5$Type',1814);bcb(112,1,{35:1,112:1},uOc);_.wd=function vOc(a){return kOc(this,BD(a,112))};_.Fb=function wOc(a){var b;if(JD(a,112)){b=BD(a,112);return this.g==b.g}return false};_.Hb=function xOc(){return this.g};_.Ib=function zOc(){var a,b,c,d;a=new Wfb('{');d=new olb(this.n);while(d.a'+this.b+' ('+Yr(this.c)+')'};_.d=0;var EZ=mdb(Mqe,'HyperEdgeSegmentDependency',129);bcb(520,22,{3:1,35:1,22:1,520:1},IOc);var FOc,GOc;var DZ=ndb(Mqe,'HyperEdgeSegmentDependency/DependencyType',520,CI,KOc,JOc);var LOc;bcb(1815,1,{},ZOc);var MZ=mdb(Mqe,'HyperEdgeSegmentSplitter',1815);bcb(1816,1,{},aPc);_.a=0;_.b=0;var FZ=mdb(Mqe,'HyperEdgeSegmentSplitter/AreaRating',1816);bcb(329,1,{329:1},bPc);_.a=0;_.b=0;_.c=0;var GZ=mdb(Mqe,'HyperEdgeSegmentSplitter/FreeArea',329);bcb(1817,1,Dke,cPc);_.ue=function dPc(a,b){return _Oc(BD(a,112),BD(b,112))};_.Fb=function ePc(a){return this===a};_.ve=function fPc(){return new tpb(this)};var HZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$0$Type',1817);bcb(1818,1,qie,gPc);_.td=function hPc(a){TOc(this.a,this.d,this.c,this.b,BD(a,112))};_.b=0;var IZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$1$Type',1818);bcb(1819,1,{},iPc);_.Kb=function jPc(a){return new YAb(null,new Kub(BD(a,112).e,16))};var JZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$2$Type',1819);bcb(1820,1,{},kPc);_.Kb=function lPc(a){return new YAb(null,new Kub(BD(a,112).j,16))};var KZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$3$Type',1820);bcb(1821,1,{},mPc);_.Fe=function nPc(a){return Edb(ED(a))};var LZ=mdb(Mqe,'HyperEdgeSegmentSplitter/lambda$4$Type',1821);bcb(655,1,{},tPc);_.a=0;_.b=0;_.c=0;var QZ=mdb(Mqe,'OrthogonalRoutingGenerator',655);bcb(1638,1,{},xPc);_.Kb=function yPc(a){return new YAb(null,new Kub(BD(a,112).e,16))};var OZ=mdb(Mqe,'OrthogonalRoutingGenerator/lambda$0$Type',1638);bcb(1639,1,{},zPc);_.Kb=function APc(a){return new YAb(null,new Kub(BD(a,112).j,16))};var PZ=mdb(Mqe,'OrthogonalRoutingGenerator/lambda$1$Type',1639);bcb(661,1,{});var RZ=mdb(Nqe,'BaseRoutingDirectionStrategy',661);bcb(1807,661,{},EPc);_.dg=function FPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b+a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(l,f);Dsb(g.a,d);BPc(this,g,e,d,false);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false);f=b+m.o*c;e=m;d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false)}d=new f7c(p,f);Dsb(g.a,d);BPc(this,g,e,d,false)}}}}};_.eg=function GPc(a){return a.i.n.a+a.n.a+a.a.a};_.fg=function HPc(){return Ucd(),Rcd};_.gg=function IPc(){return Ucd(),Acd};var SZ=mdb(Nqe,'NorthToSouthRoutingStrategy',1807);bcb(1808,661,{},JPc);_.dg=function KPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b-a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(l,f);Dsb(g.a,d);BPc(this,g,e,d,false);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false);f=b-m.o*c;e=m;d=new f7c(n,f);Dsb(g.a,d);BPc(this,g,e,d,false)}d=new f7c(p,f);Dsb(g.a,d);BPc(this,g,e,d,false)}}}}};_.eg=function LPc(a){return a.i.n.a+a.n.a+a.a.a};_.fg=function MPc(){return Ucd(),Acd};_.gg=function NPc(){return Ucd(),Rcd};var TZ=mdb(Nqe,'SouthToNorthRoutingStrategy',1808);bcb(1806,661,{},OPc);_.dg=function PPc(a,b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p;if(!!a.r&&!a.q){return}k=b+a.o*c;for(j=new olb(a.n);j.aqme){f=k;e=a;d=new f7c(f,l);Dsb(g.a,d);BPc(this,g,e,d,true);m=a.r;if(m){n=Edb(ED(Ut(m.e,0)));d=new f7c(f,n);Dsb(g.a,d);BPc(this,g,e,d,true);f=b+m.o*c;e=m;d=new f7c(f,n);Dsb(g.a,d);BPc(this,g,e,d,true)}d=new f7c(f,p);Dsb(g.a,d);BPc(this,g,e,d,true)}}}}};_.eg=function QPc(a){return a.i.n.b+a.n.b+a.a.b};_.fg=function RPc(){return Ucd(),zcd};_.gg=function SPc(){return Ucd(),Tcd};var UZ=mdb(Nqe,'WestToEastRoutingStrategy',1806);bcb(813,1,{},YPc);_.Ib=function ZPc(){return Fe(this.a)};_.b=0;_.c=false;_.d=false;_.f=0;var WZ=mdb(Pqe,'NubSpline',813);bcb(407,1,{407:1},aQc,bQc);var VZ=mdb(Pqe,'NubSpline/PolarCP',407);bcb(1453,1,Bqe,vQc);_.Yf=function xQc(a){return qQc(BD(a,37))};_.pf=function yQc(a,b){uQc(this,BD(a,37),b)};var cQc,dQc,eQc,fQc,gQc;var b$=mdb(Pqe,'SplineEdgeRouter',1453);bcb(268,1,{268:1},BQc);_.Ib=function CQc(){return this.a+' ->('+this.c+') '+this.b};_.c=0;var XZ=mdb(Pqe,'SplineEdgeRouter/Dependency',268);bcb(455,22,{3:1,35:1,22:1,455:1},GQc);var DQc,EQc;var YZ=ndb(Pqe,'SplineEdgeRouter/SideToProcess',455,CI,IQc,HQc);var JQc;bcb(1454,1,Oie,LQc);_.Mb=function MQc(a){return hQc(),!BD(a,128).o};var ZZ=mdb(Pqe,'SplineEdgeRouter/lambda$0$Type',1454);bcb(1455,1,{},NQc);_.Ge=function OQc(a){return hQc(),BD(a,128).v+1};var $Z=mdb(Pqe,'SplineEdgeRouter/lambda$1$Type',1455);bcb(1456,1,qie,PQc);_.td=function QQc(a){sQc(this.a,this.b,BD(a,46))};var _Z=mdb(Pqe,'SplineEdgeRouter/lambda$2$Type',1456);bcb(1457,1,qie,RQc);_.td=function SQc(a){tQc(this.a,this.b,BD(a,46))};var a$=mdb(Pqe,'SplineEdgeRouter/lambda$3$Type',1457);bcb(128,1,{35:1,128:1},YQc,ZQc);_.wd=function $Qc(a){return WQc(this,BD(a,128))};_.b=0;_.e=false;_.f=0;_.g=0;_.j=false;_.k=false;_.n=0;_.o=false;_.p=false;_.q=false;_.s=0;_.u=0;_.v=0;_.F=0;var d$=mdb(Pqe,'SplineSegment',128);bcb(459,1,{459:1},_Qc);_.a=0;_.b=false;_.c=false;_.d=false;_.e=false;_.f=0;var c$=mdb(Pqe,'SplineSegment/EdgeInformation',459);bcb(1234,1,{},hRc);var f$=mdb(Uqe,hme,1234);bcb(1235,1,Dke,jRc);_.ue=function kRc(a,b){return iRc(BD(a,135),BD(b,135))};_.Fb=function lRc(a){return this===a};_.ve=function mRc(){return new tpb(this)};var e$=mdb(Uqe,ime,1235);bcb(1233,1,{},tRc);var g$=mdb(Uqe,'MrTree',1233);bcb(393,22,{3:1,35:1,22:1,393:1,246:1,234:1},ARc);_.Kf=function CRc(){return zRc(this)};_.Xf=function BRc(){return zRc(this)};var uRc,vRc,wRc,xRc;var h$=ndb(Uqe,'TreeLayoutPhases',393,CI,ERc,DRc);var FRc;bcb(1130,209,Mle,HRc);_.Ze=function IRc(a,b){var c,d,e,f,g,h,i;Ccb(DD(hkd(a,(JTc(),ATc))))||$Cb((c=new _Cb((Pgd(),new bhd(a))),c));g=(h=new SRc,tNb(h,a),yNb(h,(mTc(),dTc),a),i=new Lqb,pRc(a,h,i),oRc(a,h,i),h);f=gRc(this.a,g);for(e=new olb(f);e.a'+WRc(this.c):'e_'+tb(this)};var l$=mdb(Vqe,'TEdge',188);bcb(135,134,{3:1,135:1,94:1,134:1},SRc);_.Ib=function TRc(){var a,b,c,d,e;e=null;for(d=Jsb(this.b,0);d.b!=d.d.c;){c=BD(Xsb(d),86);e+=(c.c==null||c.c.length==0?'n_'+c.g:'n_'+c.c)+'\n'}for(b=Jsb(this.a,0);b.b!=b.d.c;){a=BD(Xsb(b),188);e+=(!!a.b&&!!a.c?WRc(a.b)+'->'+WRc(a.c):'e_'+tb(a))+'\n'}return e};var n$=mdb(Vqe,'TGraph',135);bcb(633,502,{3:1,502:1,633:1,94:1,134:1});var r$=mdb(Vqe,'TShape',633);bcb(86,633,{3:1,502:1,86:1,633:1,94:1,134:1},XRc);_.Ib=function YRc(){return WRc(this)};var q$=mdb(Vqe,'TNode',86);bcb(255,1,vie,ZRc);_.Jc=function $Rc(a){reb(this,a)};_.Kc=function _Rc(){var a;return a=Jsb(this.a.d,0),new aSc(a)};var p$=mdb(Vqe,'TNode/2',255);bcb(358,1,aie,aSc);_.Nb=function bSc(a){Rrb(this,a)};_.Pb=function dSc(){return BD(Xsb(this.a),188).c};_.Ob=function cSc(){return Wsb(this.a)};_.Qb=function eSc(){Zsb(this.a)};var o$=mdb(Vqe,'TNode/2/1',358);bcb(1840,1,ene,hSc);_.pf=function jSc(a,b){gSc(this,BD(a,135),b)};var s$=mdb(Wqe,'FanProcessor',1840);bcb(327,22,{3:1,35:1,22:1,327:1,234:1},rSc);_.Kf=function sSc(){switch(this.g){case 0:return new QSc;case 1:return new hSc;case 2:return new GSc;case 3:return new zSc;case 4:return new NSc;case 5:return new TSc;default:throw vbb(new Wdb(Dne+(this.f!=null?this.f:''+this.g)));}};var kSc,lSc,mSc,nSc,oSc,pSc;var t$=ndb(Wqe,Ene,327,CI,uSc,tSc);var vSc;bcb(1843,1,ene,zSc);_.pf=function ASc(a,b){xSc(this,BD(a,135),b)};_.a=0;var v$=mdb(Wqe,'LevelHeightProcessor',1843);bcb(1844,1,vie,BSc);_.Jc=function CSc(a){reb(this,a)};_.Kc=function DSc(){return mmb(),Emb(),Dmb};var u$=mdb(Wqe,'LevelHeightProcessor/1',1844);bcb(1841,1,ene,GSc);_.pf=function HSc(a,b){ESc(this,BD(a,135),b)};_.a=0;var x$=mdb(Wqe,'NeighborsProcessor',1841);bcb(1842,1,vie,ISc);_.Jc=function JSc(a){reb(this,a)};_.Kc=function KSc(){return mmb(),Emb(),Dmb};var w$=mdb(Wqe,'NeighborsProcessor/1',1842);bcb(1845,1,ene,NSc);_.pf=function OSc(a,b){LSc(this,BD(a,135),b)};_.a=0;var y$=mdb(Wqe,'NodePositionProcessor',1845);bcb(1839,1,ene,QSc);_.pf=function RSc(a,b){PSc(this,BD(a,135))};var z$=mdb(Wqe,'RootProcessor',1839);bcb(1846,1,ene,TSc);_.pf=function USc(a,b){SSc(BD(a,135))};var A$=mdb(Wqe,'Untreeifyer',1846);var VSc,WSc,XSc,YSc,ZSc,$Sc,_Sc,aTc,bTc,cTc,dTc,eTc,fTc,gTc,hTc,iTc,jTc,kTc,lTc;bcb(851,1,ale,sTc);_.Qe=function tTc(a){t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zqe),''),'Weighting of Nodes'),'Which weighting to use when computing a node order.'),qTc),(_5c(),V5c)),E$),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$qe),''),'Search Order'),'Which search order to use when computing a spanning tree.'),oTc),V5c),F$),pqb(L5c))));KTc((new LTc,a))};var nTc,oTc,pTc,qTc;var B$=mdb(_qe,'MrTreeMetaDataProvider',851);bcb(994,1,ale,LTc);_.Qe=function MTc(a){KTc(a)};var uTc,vTc,wTc,xTc,yTc,zTc,ATc,BTc,CTc,DTc,ETc,FTc,GTc,HTc,ITc;var D$=mdb(_qe,'MrTreeOptions',994);bcb(995,1,{},NTc);_.$e=function OTc(){var a;return a=new HRc,a};_._e=function PTc(a){};var C$=mdb(_qe,'MrTreeOptions/MrtreeFactory',995);bcb(480,22,{3:1,35:1,22:1,480:1},TTc);var QTc,RTc;var E$=ndb(_qe,'OrderWeighting',480,CI,VTc,UTc);var WTc;bcb(425,22,{3:1,35:1,22:1,425:1},_Tc);var YTc,ZTc;var F$=ndb(_qe,'TreeifyingOrder',425,CI,bUc,aUc);var cUc;bcb(1459,1,Bqe,lUc);_.Yf=function mUc(a){return BD(a,135),eUc};_.pf=function nUc(a,b){kUc(this,BD(a,135),b)};var eUc;var G$=mdb('org.eclipse.elk.alg.mrtree.p1treeify','DFSTreeifyer',1459);bcb(1460,1,Bqe,sUc);_.Yf=function tUc(a){return BD(a,135),oUc};_.pf=function uUc(a,b){rUc(this,BD(a,135),b)};var oUc;var H$=mdb('org.eclipse.elk.alg.mrtree.p2order','NodeOrderer',1460);bcb(1461,1,Bqe,CUc);_.Yf=function DUc(a){return BD(a,135),vUc};_.pf=function EUc(a,b){AUc(this,BD(a,135),b)};_.a=0;var vUc;var I$=mdb('org.eclipse.elk.alg.mrtree.p3place','NodePlacer',1461);bcb(1462,1,Bqe,IUc);_.Yf=function JUc(a){return BD(a,135),FUc};_.pf=function KUc(a,b){HUc(BD(a,135),b)};var FUc;var J$=mdb('org.eclipse.elk.alg.mrtree.p4route','EdgeRouter',1462);var LUc;bcb(495,22,{3:1,35:1,22:1,495:1,246:1,234:1},RUc);_.Kf=function TUc(){return QUc(this)};_.Xf=function SUc(){return QUc(this)};var NUc,OUc;var K$=ndb(cre,'RadialLayoutPhases',495,CI,VUc,UUc);var WUc;bcb(1131,209,Mle,ZUc);_.Ze=function $Uc(a,b){var c,d,e,f,g,h;c=YUc(this,a);Odd(b,'Radial layout',c.c.length);Ccb(DD(hkd(a,(ZWc(),QWc))))||$Cb((d=new _Cb((Pgd(),new bhd(a))),d));h=aVc(a);jkd(a,(MUc(),LUc),h);if(!h){throw vbb(new Wdb('The given graph is not a tree!'))}e=Edb(ED(hkd(a,VWc)));e==0&&(e=_Uc(a));jkd(a,VWc,e);for(g=new olb(YUc(this,a));g.a0&&j7c((BCb(c-1,b.length),b.charCodeAt(c-1)),nne)){--c}if(e>=c){throw vbb(new Wdb('The given string does not contain any numbers.'))}f=mfb(b.substr(e,c-e),',|;|\r|\n');if(f.length!=2){throw vbb(new Wdb('Exactly two numbers are expected, '+f.length+' were found.'))}try{this.a=Hcb(ufb(f[0]));this.b=Hcb(ufb(f[1]))}catch(a){a=ubb(a);if(JD(a,127)){d=a;throw vbb(new Wdb(one+d))}else throw vbb(a)}};_.Ib=function m7c(){return '('+this.a+','+this.b+')'};_.a=0;_.b=0;var m1=mdb(pne,'KVector',8);bcb(74,68,{3:1,4:1,20:1,28:1,52:1,14:1,68:1,15:1,74:1,414:1},s7c,t7c,u7c);_.Pc=function x7c(){return r7c(this)};_.Jf=function v7c(b){var c,d,e,f,g,h;e=mfb(b,',|;|\\(|\\)|\\[|\\]|\\{|\\}| |\t|\n');Osb(this);try{d=0;g=0;f=0;h=0;while(d0){g%2==0?(f=Hcb(e[d])):(h=Hcb(e[d]));g>0&&g%2!=0&&Dsb(this,new f7c(f,h));++g}++d}}catch(a){a=ubb(a);if(JD(a,127)){c=a;throw vbb(new Wdb('The given string does not match the expected format for vectors.'+c))}else throw vbb(a)}};_.Ib=function y7c(){var a,b,c;a=new Wfb('(');b=Jsb(this,0);while(b.b!=b.d.c){c=BD(Xsb(b),8);Qfb(a,c.a+','+c.b);b.b!=b.d.c&&(a.a+='; ',a)}return (a.a+=')',a).a};var l1=mdb(pne,'KVectorChain',74);bcb(248,22,{3:1,35:1,22:1,248:1},G7c);var z7c,A7c,B7c,C7c,D7c,E7c;var o1=ndb(ose,'Alignment',248,CI,I7c,H7c);var J7c;bcb(979,1,ale,Z7c);_.Qe=function $7c(a){Y7c(a)};var L7c,M7c,N7c,O7c,P7c,Q7c,R7c,S7c,T7c,U7c,V7c,W7c;var q1=mdb(ose,'BoxLayouterOptions',979);bcb(980,1,{},_7c);_.$e=function a8c(){var a;return a=new ged,a};_._e=function b8c(a){};var p1=mdb(ose,'BoxLayouterOptions/BoxFactory',980);bcb(291,22,{3:1,35:1,22:1,291:1},j8c);var c8c,d8c,e8c,f8c,g8c,h8c;var r1=ndb(ose,'ContentAlignment',291,CI,l8c,k8c);var m8c;bcb(684,1,ale,Z9c);_.Qe=function $9c(a){t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,sse),''),'Layout Algorithm'),'Select a specific layout algorithm.'),(_5c(),Z5c)),ZI),pqb((N5c(),L5c)))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,tse),''),'Resolved Layout Algorithm'),'Meta data associated with the selected algorithm.'),Y5c),E0),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$pe),''),'Alignment'),'Alignment of the selected node relative to other nodes; the exact meaning depends on the used algorithm.'),q8c),V5c),o1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,_le),''),'Aspect Ratio'),'The desired aspect ratio of the drawing, that is the quotient of width by height.'),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,use),''),'Bend Points'),"A fixed list of bend points for the edge. This is used by the 'Fixed Layout' algorithm to specify a pre-defined routing for an edge. The vector chain must include the source point, any bend points, and the target point, so it must have at least two points."),Y5c),l1),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,lqe),''),'Content Alignment'),'Specifies how the content of a node are aligned. Each node can individually control the alignment of its contents. I.e. if a node should be aligned top left in its parent node, the parent node should specify that option.'),x8c),W5c),r1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zpe),''),'Debug Mode'),'Whether additional debug information shall be generated.'),(Bcb(),false)),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,cqe),''),Cle),'Overall direction of edges: horizontal (right / left) or vertical (down / up).'),A8c),V5c),t1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ype),''),'Edge Routing'),'What kind of edge routing style should be applied for the content of a parent node. Algorithms may also set this option to single edges in order to mark them as splines. The bend point list of edges with this option set to SPLINES must be interpreted as control points for a piecewise cubic spline.'),F8c),V5c),v1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Jre),''),'Expand Nodes'),'If active, nodes are expanded to fill the area of their parent.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,tpe),''),'Hierarchy Handling'),"Determines whether separate layout runs are triggered for different compound nodes in a hierarchical graph. Setting a node's hierarchy handling to `INCLUDE_CHILDREN` will lay out that node and all of its descendants in a single layout run, until a descendant is encountered which has its hierarchy handling set to `SEPARATE_CHILDREN`. In general, `SEPARATE_CHILDREN` will ensure that a new layout run is triggered for a node with that setting. Including multiple levels of hierarchy in a single layout run may allow cross-hierarchical edges to be laid out properly. If the root node is set to `INHERIT` (or not set at all), the default behavior is `SEPARATE_CHILDREN`."),K8c),V5c),z1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,ame),''),'Padding'),"The padding to be left to a parent element's border when placing child elements. This can also serve as an output option of a layout algorithm if node size calculation is setup appropriately."),g9c),Y5c),j1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ame),''),'Interactive'),'Whether the algorithm should be run in interactive mode for the content of a parent node. What this means exactly depends on how the specific algorithm interprets this option. Usually in the interactive mode algorithms try to modify the current layout as little as possible.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xqe),''),'interactive Layout'),'Whether the graph should be changeable interactively and by setting constraints'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Dme),''),'Omit Node Micro Layout'),"Node micro layout comprises the computation of node dimensions (if requested), the placement of ports and their labels, and the placement of node labels. The functionality is implemented independent of any specific layout algorithm and shouldn't have any negative impact on the layout algorithm's performance itself. Yet, if any unforeseen behavior occurs, this option allows to deactivate the micro layout."),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Bme),''),'Port Constraints'),'Defines constraints of the position of the ports of a node.'),u9c),V5c),D1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,uqe),''),'Position'),"The position of a node, port, or label. This is used by the 'Fixed Layout' algorithm to specify a pre-defined position."),Y5c),m1),qqb(K5c,OC(GC(e1,1),Kie,175,0,[M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,vme),''),'Priority'),'Defines the priority of an object; its meaning depends on the specific layout algorithm and the context where it is used.'),X5c),JI),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,yme),''),'Randomization Seed'),'Seed used for pseudo-random number generators to control the layout algorithm. If the value is 0, the seed shall be determined pseudo-randomly (e.g. from the system time).'),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,zme),''),'Separate Connected Components'),'Whether each connected component should be processed separately.'),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,mqe),''),'Junction Points'),'This option is not used as option, but as output of the layout algorithms. It is attached to edges and determines the points where junction symbols should be drawn in order to represent hyperedges with orthogonal routing. Whether such points are computed depends on the chosen layout algorithm and edge routing style. The points are put into the vector chain with no specific order.'),R8c),Y5c),l1),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,pqe),''),'Comment Box'),'Whether the node should be regarded as a comment box instead of a regular node. In that case its placement should be similar to how labels are handled. Any edges incident to a comment box specify to which graph elements the comment is related.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,qqe),''),'Hypernode'),'Whether the node should be handled as a hypernode.'),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,vse),''),'Label Manager'),"Label managers can shorten labels upon a layout algorithm's request."),Y5c),h1),qqb(L5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,vqe),''),'Margins'),"Margins define additional space around the actual bounds of a graph element. For instance, ports or labels being placed on the outside of a node's border might introduce such a margin. The margin is used to guarantee non-overlap of other graph elements with those ports or labels."),T8c),Y5c),i1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Xpe),''),'No Layout'),"No layout is done for the associated element. This is used to mark parts of a diagram to avoid their inclusion in the layout graph, or to mark parts of the layout graph to prevent layout engines from processing them. If you wish to exclude the contents of a compound node from automatic layout, while the node itself is still considered on its own layer, use the 'Fixed Layout' algorithm for that node."),false),T5c),wI),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c,M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wse),''),'Scale Factor'),"The scaling factor to be applied to the corresponding node in recursive layout. It causes the corresponding node's size to be adjusted, and its ports and labels to be sized and placed accordingly after the layout of that node has been determined (and before the node itself and its siblings are arranged). The scaling is not reverted afterwards, so the resulting layout graph contains the adjusted size and position data. This option is currently not supported if 'Layout Hierarchy' is set."),1),U5c),BI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xse),''),'Animate'),'Whether the shift from the old layout to the new computed layout shall be animated.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,yse),''),'Animation Time Factor'),"Factor for computation of animation time. The higher the value, the longer the animation time. If the value is 0, the resulting time is always equal to the minimum defined by 'Minimal Animation Time'."),meb(100)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,zse),''),'Layout Ancestors'),'Whether the hierarchy levels on the path from the selected element to the root of the diagram shall be included in the layout process.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ase),''),'Maximal Animation Time'),'The maximal time for animations, in milliseconds.'),meb(4000)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Bse),''),'Minimal Animation Time'),'The minimal time for animations, in milliseconds.'),meb(400)),X5c),JI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Cse),''),'Progress Bar'),'Whether a progress bar shall be displayed during layout computations.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Dse),''),'Validate Graph'),'Whether the graph shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ese),''),'Validate Options'),'Whether layout options shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user.'),true),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Fse),''),'Zoom to Fit'),'Whether the zoom level shall be set to view the whole diagram after layout.'),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,rse),'box'),'Box Layout Mode'),'Configures the packing mode used by the {@link BoxLayoutProvider}. If SIMPLE is not required (neither priorities are used nor the interactive mode), GROUP_DEC can improve the packing and decrease the area. GROUP_MIXED and GROUP_INC may, in very specific scenarios, work better.'),u8c),V5c),O1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Lpe),zpe),'Comment Comment Spacing'),'Spacing to be preserved between a comment box and other comment boxes connected to the same node. The space left between comment boxes of different nodes is controlled by the node-node spacing.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Mpe),zpe),'Comment Node Spacing'),'Spacing to be preserved between a node and its connected comment boxes. The space left between a node and the comments of another node is controlled by the node-node spacing.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Zle),zpe),'Components Spacing'),"Spacing to be preserved between pairs of connected components. This option is only relevant if 'separateConnectedComponents' is activated."),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Npe),zpe),'Edge Spacing'),'Spacing to be preserved between any two edges. Note that while this can somewhat easily be satisfied for the segments of orthogonally drawn edges, it is harder for general polylines or splines.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,xme),zpe),'Edge Label Spacing'),"The minimal distance to be preserved between a label and the edge it is associated with. Note that the placement of a label is influenced by the 'edgelabels.placement' option."),2),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ope),zpe),'Edge Node Spacing'),'Spacing to be preserved between nodes and edges.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ppe),zpe),'Label Spacing'),'Determines the amount of space to be left between two labels of the same graph element.'),0),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Spe),zpe),'Label Node Spacing'),"Spacing to be preserved between labels and the border of node they are associated with. Note that the placement of a label is influenced by the 'nodelabels.placement' option."),5),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Qpe),zpe),'Horizontal spacing between Label and Port'),"Horizontal spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Rpe),zpe),'Vertical spacing between Label and Port'),"Vertical spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wme),zpe),'Node Spacing'),'The minimal distance to be preserved between each two nodes.'),20),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Tpe),zpe),'Node Self Loop Spacing'),'Spacing to be preserved between a node and its self loops.'),10),U5c),BI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Upe),zpe),'Port Spacing'),'Spacing between pairs of ports of the same node.'),10),U5c),BI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Vpe),zpe),'Individual Spacing'),"Allows to specify individual spacing values for graph elements that shall be different from the value specified for the element's parent."),Y5c),i2),qqb(K5c,OC(GC(e1,1),Kie,175,0,[I5c,M5c,J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,wqe),zpe),'Additional Port Space'),'Additional space around the sets of ports on each node side. For each side of a node, this option can reserve additional space before and after the ports on each side. For example, a top spacing of 20 makes sure that the first port on the western and eastern side is 20 units away from the northern border.'),W9c),Y5c),i1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,tqe),Jse),'Layout Partition'),'Partition to which the node belongs. This requires Layout Partitioning to be active. Nodes with lower partition IDs will appear to the left of nodes with higher partition IDs (assuming a left-to-right layout direction).'),X5c),JI),qqb(L5c,OC(GC(e1,1),Kie,175,0,[K5c])))));o4c(a,tqe,sqe,k9c);t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,sqe),Jse),'Layout Partitioning'),'Whether to activate partitioned layout. This will allow to group nodes through the Layout Partition option. a pair of nodes with different partition indices is then placed such that the node with lower index is placed to the left of the other node (with left-to-right layout direction). Depending on the layout algorithm, this may only be guaranteed to work if all nodes have a layout partition configured, or at least if edges that cross partitions are not part of a partition-crossing cycle.'),i9c),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,dqe),Kse),'Node Label Padding'),'Define padding for node labels that are placed inside of a node.'),V8c),Y5c),j1),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Gme),Kse),'Node Label Placement'),"Hints for where node labels are to be placed; if empty, the node label's position is not modified."),X8c),W5c),B1),qqb(K5c,OC(GC(e1,1),Kie,175,0,[J5c])))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,gqe),Lse),'Port Alignment'),'Defines the default port distribution for a node. May be overridden for each side individually.'),m9c),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,hqe),Lse),'Port Alignment (North)'),"Defines how ports on the northern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,iqe),Lse),'Port Alignment (South)'),"Defines how ports on the southern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,jqe),Lse),'Port Alignment (West)'),"Defines how ports on the western side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,kqe),Lse),'Port Alignment (East)'),"Defines how ports on the eastern side are placed, overriding the node's general port alignment."),V5c),C1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Fme),Mse),'Node Size Constraints'),"What should be taken into account when calculating a node's size. Empty size constraints specify that a node's size is already fixed and should not be changed."),Z8c),W5c),I1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Eme),Mse),'Node Size Options'),'Options modifying the behavior of the size constraints set on a node. Each member of the set specifies something that should be taken into account when calculating node sizes. The empty set corresponds to no further modifications.'),c9c),W5c),J1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Tme),Mse),'Node Size Minimum'),'The minimal size to which a node can be reduced.'),a9c),Y5c),m1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,bqe),Mse),'Fixed Graph Size'),"By default, the fixed layout provider will enlarge a graph until it is large enough to contain its children. If this option is set, it won't do so."),false),T5c),wI),pqb(L5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,nqe),Jpe),'Edge Label Placement'),'Gives a hint on where to put edge labels.'),D8c),V5c),u1),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Cme),Jpe),'Inline Edge Labels'),"If true, an edge label is placed directly on its edge. May only apply to center edge labels. This kind of label placement is only advisable if the label's rendering is such that it is not crossed by its edge and thus stays legible."),false),T5c),wI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Gse),'font'),'Font Name'),'Font name used for a label.'),Z5c),ZI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Hse),'font'),'Font Size'),'Font size used for a label.'),X5c),JI),pqb(J5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,rqe),Nse),'Port Anchor Offset'),'The offset to the port position where connections shall be attached.'),Y5c),m1),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,oqe),Nse),'Port Index'),"The index of a port in the fixed order around a node. The order is assumed as clockwise, starting with the leftmost port on the top side. This option must be set if 'Port Constraints' is set to FIXED_ORDER and no specific positions are given for the ports. Additionally, the option 'Port Side' must be defined in this case."),X5c),JI),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ype),Nse),'Port Side'),"The side of a node on which a port is situated. This option must be set if 'Port Constraints' is set to FIXED_SIDE or FIXED_ORDER and no specific positions are given for the ports."),B9c),V5c),F1),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(z5c(D5c(A5c(B5c(new H5c,Wpe),Nse),'Port Border Offset'),"The offset of ports on the node border. With a positive offset the port is moved outside of the node, while with a negative offset the port is moved towards the inside. An offset of 0 means that the port is placed directly on the node border, i.e. if the port side is north, the port's south border touches the nodes's north border; if the port side is east, the port's west border touches the nodes's east border; if the port side is south, the port's north border touches the node's south border; if the port side is west, the port's east border touches the node's west border."),U5c),BI),pqb(M5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Hme),Ose),'Port Label Placement'),"Decides on a placement method for port labels; if empty, the node label's position is not modified."),y9c),W5c),E1),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,eqe),Ose),'Port Labels Next to Port'),"Use 'portLabels.placement': NEXT_TO_PORT_OF_POSSIBLE."),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,fqe),Ose),'Treat Port Labels as Group'),'If this option is true (default), the labels of a port will be treated as a group when it comes to centering them next to their port. If this option is false, only the first label will be centered next to the port, with the others being placed below. This only applies to labels of eastern and western ports and will have no effect if labels are not placed next to their port.'),true),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,_pe),Pse),'Activate Inside Self Loops'),"Whether this node allows to route self loops inside of it instead of around it. If set to true, this will make the node a compound node if it isn't already, and will require the layout algorithm to support compound nodes with hierarchical ports."),false),T5c),wI),pqb(K5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,aqe),Pse),'Inside Self Loop'),'Whether a self loop should be routed inside a node instead of around that node.'),false),T5c),wI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,$le),'edge'),'Edge Thickness'),'The thickness of an edge. This is a hint on the line width used to draw an edge, possibly requiring more space to be reserved for it.'),1),U5c),BI),pqb(I5c))));t4c(a,new p5c(F5c(E5c(G5c(y5c(z5c(D5c(A5c(B5c(new H5c,Ise),'edge'),'Edge Type'),'The type of an edge. This is usually used for UML class diagrams, where associations must be handled differently from generalizations.'),H8c),V5c),w1),pqb(I5c))));s4c(a,new W3c(b4c(d4c(c4c(new e4c,sne),'Layered'),'The layer-based method was introduced by Sugiyama, Tagawa and Toda in 1981. It emphasizes the direction of edges by pointing as many edges as possible into the same direction. The nodes are arranged in layers, which are sometimes called "hierarchies", and then reordered such that the number of edge crossings is minimized. Afterwards, concrete coordinates are computed for the nodes and edge bend points.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.orthogonal'),'Orthogonal'),'Orthogonal methods that follow the "topology-shape-metrics" approach by Batini, Nardelli and Tamassia \'86. The first phase determines the topology of the drawing by applying a planarization technique, which results in a planar representation of the graph. The orthogonal shape is computed in the second phase, which aims at minimizing the number of edge bends, and is called orthogonalization. The third phase leads to concrete coordinates for nodes and edge bend points by applying a compaction method, thus defining the metrics.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,ume),'Force'),'Layout algorithms that follow physical analogies by simulating a system of attractive and repulsive forces. The first successful method of this kind was proposed by Eades in 1984.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.circle'),'Circle'),'Circular layout algorithms emphasize cycles or biconnected components of a graph by arranging them in circles. This is useful if a drawing is desired where such components are clearly grouped, or where cycles are shown as prominent OPTIONS of the graph.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,bre),'Tree'),'Specialized layout methods for trees, i.e. acyclic graphs. The regular structure of graphs that have no undirected cycles can be emphasized using an algorithm of this type.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,'org.eclipse.elk.planar'),'Planar'),'Algorithms that require a planar or upward planar graph. Most of these algorithms are theoretically interesting, but not practically usable.')));s4c(a,new W3c(b4c(d4c(c4c(new e4c,sre),'Radial'),'Radial layout algorithms usually position the nodes of the graph on concentric circles.')));$ad((new _ad,a));Y7c((new Z7c,a));jdd((new kdd,a))};var o8c,p8c,q8c,r8c,s8c,t8c,u8c,v8c,w8c,x8c,y8c,z8c,A8c,B8c,C8c,D8c,E8c,F8c,G8c,H8c,I8c,J8c,K8c,L8c,M8c,N8c,O8c,P8c,Q8c,R8c,S8c,T8c,U8c,V8c,W8c,X8c,Y8c,Z8c,$8c,_8c,a9c,b9c,c9c,d9c,e9c,f9c,g9c,h9c,i9c,j9c,k9c,l9c,m9c,n9c,o9c,p9c,q9c,r9c,s9c,t9c,u9c,v9c,w9c,x9c,y9c,z9c,A9c,B9c,C9c,D9c,E9c,F9c,G9c,H9c,I9c,J9c,K9c,L9c,M9c,N9c,O9c,P9c,Q9c,R9c,S9c,T9c,U9c,V9c,W9c,X9c;var s1=mdb(ose,'CoreOptions',684);bcb(103,22,{3:1,35:1,22:1,103:1},iad);var _9c,aad,bad,cad,dad;var t1=ndb(ose,Cle,103,CI,kad,jad);var lad;bcb(272,22,{3:1,35:1,22:1,272:1},rad);var nad,oad,pad;var u1=ndb(ose,'EdgeLabelPlacement',272,CI,tad,sad);var uad;bcb(218,22,{3:1,35:1,22:1,218:1},Bad);var wad,xad,yad,zad;var v1=ndb(ose,'EdgeRouting',218,CI,Dad,Cad);var Ead;bcb(312,22,{3:1,35:1,22:1,312:1},Nad);var Gad,Had,Iad,Jad,Kad,Lad;var w1=ndb(ose,'EdgeType',312,CI,Pad,Oad);var Qad;bcb(977,1,ale,_ad);_.Qe=function abd(a){$ad(a)};var Sad,Tad,Uad,Vad,Wad,Xad,Yad;var y1=mdb(ose,'FixedLayouterOptions',977);bcb(978,1,{},bbd);_.$e=function cbd(){var a;return a=new Zfd,a};_._e=function dbd(a){};var x1=mdb(ose,'FixedLayouterOptions/FixedFactory',978);bcb(334,22,{3:1,35:1,22:1,334:1},ibd);var ebd,fbd,gbd;var z1=ndb(ose,'HierarchyHandling',334,CI,kbd,jbd);var lbd;bcb(285,22,{3:1,35:1,22:1,285:1},tbd);var nbd,obd,pbd,qbd;var A1=ndb(ose,'LabelSide',285,CI,vbd,ubd);var wbd;bcb(93,22,{3:1,35:1,22:1,93:1},Ibd);var ybd,zbd,Abd,Bbd,Cbd,Dbd,Ebd,Fbd,Gbd;var B1=ndb(ose,'NodeLabelPlacement',93,CI,Lbd,Kbd);var Mbd;bcb(249,22,{3:1,35:1,22:1,249:1},Ubd);var Obd,Pbd,Qbd,Rbd,Sbd;var C1=ndb(ose,'PortAlignment',249,CI,Wbd,Vbd);var Xbd;bcb(98,22,{3:1,35:1,22:1,98:1},gcd);var Zbd,$bd,_bd,acd,bcd,ccd;var D1=ndb(ose,'PortConstraints',98,CI,icd,hcd);var jcd;bcb(273,22,{3:1,35:1,22:1,273:1},scd);var lcd,mcd,ncd,ocd,pcd,qcd;var E1=ndb(ose,'PortLabelPlacement',273,CI,wcd,vcd);var xcd;bcb(61,22,{3:1,35:1,22:1,61:1},Ycd);var zcd,Acd,Bcd,Ccd,Dcd,Ecd,Fcd,Gcd,Hcd,Icd,Jcd,Kcd,Lcd,Mcd,Ncd,Ocd,Pcd,Qcd,Rcd,Scd,Tcd;var F1=ndb(ose,'PortSide',61,CI,_cd,$cd);var bdd;bcb(981,1,ale,kdd);_.Qe=function ldd(a){jdd(a)};var ddd,edd,fdd,gdd,hdd;var H1=mdb(ose,'RandomLayouterOptions',981);bcb(982,1,{},mdd);_.$e=function ndd(){var a;return a=new Mgd,a};_._e=function odd(a){};var G1=mdb(ose,'RandomLayouterOptions/RandomFactory',982);bcb(374,22,{3:1,35:1,22:1,374:1},udd);var pdd,qdd,rdd,sdd;var I1=ndb(ose,'SizeConstraint',374,CI,wdd,vdd);var xdd;bcb(259,22,{3:1,35:1,22:1,259:1},Jdd);var zdd,Add,Bdd,Cdd,Ddd,Edd,Fdd,Gdd,Hdd;var J1=ndb(ose,'SizeOptions',259,CI,Ldd,Kdd);var Mdd;bcb(370,1,{1949:1},Zdd);_.b=false;_.c=0;_.d=-1;_.e=null;_.f=null;_.g=-1;_.j=false;_.k=false;_.n=false;_.o=0;_.q=0;_.r=0;var L1=mdb(yqe,'BasicProgressMonitor',370);bcb(972,209,Mle,ged);_.Ze=function ked(a,b){var c,d,e,f,g,h,i,j,k;Odd(b,'Box layout',2);e=Gdb(ED(hkd(a,(X7c(),W7c))));f=BD(hkd(a,T7c),116);c=Ccb(DD(hkd(a,O7c)));d=Ccb(DD(hkd(a,P7c)));switch(BD(hkd(a,M7c),311).g){case 0:g=(h=new Tkb((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a)),mmb(),Okb(h,new med(d)),h);i=rfd(a);j=ED(hkd(a,L7c));(j==null||(uCb(j),j)<=0)&&(j=1.3);k=ded(g,e,f,i.a,i.b,c,(uCb(j),j));Afd(a,k.a,k.b,false,true);break;default:eed(a,e,f,c);}Qdd(b)};var S1=mdb(yqe,'BoxLayoutProvider',972);bcb(973,1,Dke,med);_.ue=function ned(a,b){return led(this,BD(a,33),BD(b,33))};_.Fb=function oed(a){return this===a};_.ve=function ped(){return new tpb(this)};_.a=false;var M1=mdb(yqe,'BoxLayoutProvider/1',973);bcb(157,1,{157:1},wed,xed);_.Ib=function yed(){return this.c?_od(this.c):Fe(this.b)};var N1=mdb(yqe,'BoxLayoutProvider/Group',157);bcb(311,22,{3:1,35:1,22:1,311:1},Eed);var zed,Aed,Bed,Ced;var O1=ndb(yqe,'BoxLayoutProvider/PackingMode',311,CI,Ged,Fed);var Hed;bcb(974,1,Dke,Jed);_.ue=function Ked(a,b){return hed(BD(a,157),BD(b,157))};_.Fb=function Led(a){return this===a};_.ve=function Med(){return new tpb(this)};var P1=mdb(yqe,'BoxLayoutProvider/lambda$0$Type',974);bcb(975,1,Dke,Ned);_.ue=function Oed(a,b){return ied(BD(a,157),BD(b,157))};_.Fb=function Ped(a){return this===a};_.ve=function Qed(){return new tpb(this)};var Q1=mdb(yqe,'BoxLayoutProvider/lambda$1$Type',975);bcb(976,1,Dke,Red);_.ue=function Sed(a,b){return jed(BD(a,157),BD(b,157))};_.Fb=function Ted(a){return this===a};_.ve=function Ued(){return new tpb(this)};var R1=mdb(yqe,'BoxLayoutProvider/lambda$2$Type',976);bcb(1365,1,{831:1},Ved);_.qg=function Wed(a,b){return Vyc(),!JD(b,160)||h2c((Y1c(),X1c,BD(a,160)),b)};var T1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$0$Type',1365);bcb(1366,1,qie,Xed);_.td=function Yed(a){Yyc(this.a,BD(a,146))};var U1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$1$Type',1366);bcb(1367,1,qie,Zed);_.td=function $ed(a){BD(a,94);Vyc()};var V1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$2$Type',1367);bcb(1371,1,qie,_ed);_.td=function afd(a){Zyc(this.a,BD(a,94))};var W1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$3$Type',1371);bcb(1369,1,Oie,bfd);_.Mb=function cfd(a){return $yc(this.a,this.b,BD(a,146))};var X1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$4$Type',1369);bcb(1368,1,Oie,dfd);_.Mb=function efd(a){return azc(this.a,this.b,BD(a,831))};var Y1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$5$Type',1368);bcb(1370,1,qie,ffd);_.td=function gfd(a){_yc(this.a,this.b,BD(a,146))};var Z1=mdb(yqe,'ElkSpacings/AbstractSpacingsBuilder/lambda$6$Type',1370);bcb(935,1,{},Hfd);_.Kb=function Ifd(a){return Gfd(a)};_.Fb=function Jfd(a){return this===a};var _1=mdb(yqe,'ElkUtil/lambda$0$Type',935);bcb(936,1,qie,Kfd);_.td=function Lfd(a){ufd(this.a,this.b,BD(a,79))};_.a=0;_.b=0;var a2=mdb(yqe,'ElkUtil/lambda$1$Type',936);bcb(937,1,qie,Mfd);_.td=function Nfd(a){vfd(this.a,this.b,BD(a,202))};_.a=0;_.b=0;var b2=mdb(yqe,'ElkUtil/lambda$2$Type',937);bcb(938,1,qie,Ofd);_.td=function Pfd(a){wfd(this.a,this.b,BD(a,137))};_.a=0;_.b=0;var c2=mdb(yqe,'ElkUtil/lambda$3$Type',938);bcb(939,1,qie,Qfd);_.td=function Rfd(a){xfd(this.a,BD(a,469))};var d2=mdb(yqe,'ElkUtil/lambda$4$Type',939);bcb(342,1,{35:1,342:1},Tfd);_.wd=function Ufd(a){return Sfd(this,BD(a,236))};_.Fb=function Vfd(a){var b;if(JD(a,342)){b=BD(a,342);return this.a==b.a}return false};_.Hb=function Wfd(){return QD(this.a)};_.Ib=function Xfd(){return this.a+' (exclusive)'};_.a=0;var e2=mdb(yqe,'ExclusiveBounds/ExclusiveLowerBound',342);bcb(1138,209,Mle,Zfd);_.Ze=function $fd(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,A,B;Odd(b,'Fixed Layout',1);f=BD(hkd(a,(Y9c(),E8c)),218);l=0;m=0;for(s=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));s.e!=s.i.gc();){q=BD(Dyd(s),33);B=BD(hkd(q,(Zad(),Yad)),8);if(B){bld(q,B.a,B.b);if(BD(hkd(q,Tad),174).Hc((tdd(),pdd))){n=BD(hkd(q,Vad),8);n.a>0&&n.b>0&&Afd(q,n.a,n.b,true,true)}}l=$wnd.Math.max(l,q.i+q.g);m=$wnd.Math.max(m,q.j+q.f);for(j=new Fyd((!q.n&&(q.n=new cUd(D2,q,1,7)),q.n));j.e!=j.i.gc();){h=BD(Dyd(j),137);B=BD(hkd(h,Yad),8);!!B&&bld(h,B.a,B.b);l=$wnd.Math.max(l,q.i+h.i+h.g);m=$wnd.Math.max(m,q.j+h.j+h.f)}for(v=new Fyd((!q.c&&(q.c=new cUd(F2,q,9,9)),q.c));v.e!=v.i.gc();){u=BD(Dyd(v),118);B=BD(hkd(u,Yad),8);!!B&&bld(u,B.a,B.b);w=q.i+u.i;A=q.j+u.j;l=$wnd.Math.max(l,w+u.g);m=$wnd.Math.max(m,A+u.f);for(i=new Fyd((!u.n&&(u.n=new cUd(D2,u,1,7)),u.n));i.e!=i.i.gc();){h=BD(Dyd(i),137);B=BD(hkd(h,Yad),8);!!B&&bld(h,B.a,B.b);l=$wnd.Math.max(l,w+h.i+h.g);m=$wnd.Math.max(m,A+h.j+h.f)}}for(e=new Sr(ur(_sd(q).a.Kc(),new Sq));Qr(e);){c=BD(Rr(e),79);k=Yfd(c);l=$wnd.Math.max(l,k.a);m=$wnd.Math.max(m,k.b)}for(d=new Sr(ur($sd(q).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);if(Xod(jtd(c))!=a){k=Yfd(c);l=$wnd.Math.max(l,k.a);m=$wnd.Math.max(m,k.b)}}}if(f==(Aad(),wad)){for(r=new Fyd((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a));r.e!=r.i.gc();){q=BD(Dyd(r),33);for(d=new Sr(ur(_sd(q).a.Kc(),new Sq));Qr(d);){c=BD(Rr(d),79);g=pfd(c);g.b==0?jkd(c,Q8c,null):jkd(c,Q8c,g)}}}if(!Ccb(DD(hkd(a,(Zad(),Uad))))){t=BD(hkd(a,Wad),116);p=l+t.b+t.c;o=m+t.d+t.a;Afd(a,p,o,true,true)}Qdd(b)};var f2=mdb(yqe,'FixedLayoutProvider',1138);bcb(373,134,{3:1,414:1,373:1,94:1,134:1},_fd,agd);_.Jf=function dgd(b){var c,d,e,f,g,h,i,j,k;if(!b){return}try{j=mfb(b,';,;');for(g=j,h=0,i=g.length;h>16&aje|b^d<<16};_.Kc=function zgd(){return new Bgd(this)};_.Ib=function Agd(){return this.a==null&&this.b==null?'pair(null,null)':this.a==null?'pair(null,'+fcb(this.b)+')':this.b==null?'pair('+fcb(this.a)+',null)':'pair('+fcb(this.a)+','+fcb(this.b)+')'};var n2=mdb(yqe,'Pair',46);bcb(983,1,aie,Bgd);_.Nb=function Cgd(a){Rrb(this,a)};_.Ob=function Dgd(){return !this.c&&(!this.b&&this.a.a!=null||this.a.b!=null)};_.Pb=function Egd(){if(!this.c&&!this.b&&this.a.a!=null){this.b=true;return this.a.a}else if(!this.c&&this.a.b!=null){this.c=true;return this.a.b}throw vbb(new utb)};_.Qb=function Fgd(){this.c&&this.a.b!=null?(this.a.b=null):this.b&&this.a.a!=null&&(this.a.a=null);throw vbb(new Ydb)};_.b=false;_.c=false;var m2=mdb(yqe,'Pair/1',983);bcb(448,1,{448:1},Ggd);_.Fb=function Hgd(a){return wtb(this.a,BD(a,448).a)&&wtb(this.c,BD(a,448).c)&&wtb(this.d,BD(a,448).d)&&wtb(this.b,BD(a,448).b)};_.Hb=function Igd(){return Hlb(OC(GC(SI,1),Uhe,1,5,[this.a,this.c,this.d,this.b]))};_.Ib=function Jgd(){return '('+this.a+She+this.c+She+this.d+She+this.b+')'};var o2=mdb(yqe,'Quadruple',448);bcb(1126,209,Mle,Mgd);_.Ze=function Ngd(a,b){var c,d,e,f,g;Odd(b,'Random Layout',1);if((!a.a&&(a.a=new cUd(E2,a,10,11)),a.a).i==0){Qdd(b);return}f=BD(hkd(a,(idd(),gdd)),19);!!f&&f.a!=0?(e=new Hub(f.a)):(e=new Gub);c=Gdb(ED(hkd(a,ddd)));g=Gdb(ED(hkd(a,hdd)));d=BD(hkd(a,edd),116);Lgd(a,e,c,g,d);Qdd(b)};var p2=mdb(yqe,'RandomLayoutProvider',1126);var Ogd;bcb(553,1,{});_.qf=function Sgd(){return new f7c(this.f.i,this.f.j)};_.We=function Tgd(a){if(Jsd(a,(Y9c(),s9c))){return hkd(this.f,Qgd)}return hkd(this.f,a)};_.rf=function Ugd(){return new f7c(this.f.g,this.f.f)};_.sf=function Vgd(){return this.g};_.Xe=function Wgd(a){return ikd(this.f,a)};_.tf=function Xgd(a){dld(this.f,a.a);eld(this.f,a.b)};_.uf=function Ygd(a){cld(this.f,a.a);ald(this.f,a.b)};_.vf=function Zgd(a){this.g=a};_.g=0;var Qgd;var q2=mdb(Use,'ElkGraphAdapters/AbstractElkGraphElementAdapter',553);bcb(554,1,{839:1},$gd);_.wf=function _gd(){var a,b;if(!this.b){this.b=Qu(Kkd(this.a).i);for(b=new Fyd(Kkd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),137);Ekb(this.b,new dhd(a))}}return this.b};_.b=null;var r2=mdb(Use,'ElkGraphAdapters/ElkEdgeAdapter',554);bcb(301,553,{},bhd);_.xf=function chd(){return ahd(this)};_.a=null;var s2=mdb(Use,'ElkGraphAdapters/ElkGraphAdapter',301);bcb(630,553,{181:1},dhd);var t2=mdb(Use,'ElkGraphAdapters/ElkLabelAdapter',630);bcb(629,553,{680:1},hhd);_.wf=function khd(){return ehd(this)};_.Af=function lhd(){var a;return a=BD(hkd(this.f,(Y9c(),S8c)),142),!a&&(a=new H_b),a};_.Cf=function nhd(){return fhd(this)};_.Ef=function phd(a){var b;b=new K_b(a);jkd(this.f,(Y9c(),S8c),b)};_.Ff=function qhd(a){jkd(this.f,(Y9c(),f9c),new r0b(a))};_.yf=function ihd(){return this.d};_.zf=function jhd(){var a,b;if(!this.a){this.a=new Rkb;for(b=new Sr(ur($sd(BD(this.f,33)).a.Kc(),new Sq));Qr(b);){a=BD(Rr(b),79);Ekb(this.a,new $gd(a))}}return this.a};_.Bf=function mhd(){var a,b;if(!this.c){this.c=new Rkb;for(b=new Sr(ur(_sd(BD(this.f,33)).a.Kc(),new Sq));Qr(b);){a=BD(Rr(b),79);Ekb(this.c,new $gd(a))}}return this.c};_.Df=function ohd(){return Vod(BD(this.f,33)).i!=0||Ccb(DD(BD(this.f,33).We((Y9c(),M8c))))};_.Gf=function rhd(){ghd(this,(Pgd(),Ogd))};_.a=null;_.b=null;_.c=null;_.d=null;_.e=null;var u2=mdb(Use,'ElkGraphAdapters/ElkNodeAdapter',629);bcb(1266,553,{838:1},thd);_.wf=function vhd(){return shd(this)};_.zf=function uhd(){var a,b;if(!this.a){this.a=Pu(BD(this.f,118).xg().i);for(b=new Fyd(BD(this.f,118).xg());b.e!=b.i.gc();){a=BD(Dyd(b),79);Ekb(this.a,new $gd(a))}}return this.a};_.Bf=function whd(){var a,b;if(!this.c){this.c=Pu(BD(this.f,118).yg().i);for(b=new Fyd(BD(this.f,118).yg());b.e!=b.i.gc();){a=BD(Dyd(b),79);Ekb(this.c,new $gd(a))}}return this.c};_.Hf=function xhd(){return BD(BD(this.f,118).We((Y9c(),A9c)),61)};_.If=function yhd(){var a,b,c,d,e,f,g,h;d=mpd(BD(this.f,118));for(c=new Fyd(BD(this.f,118).yg());c.e!=c.i.gc();){a=BD(Dyd(c),79);for(h=new Fyd((!a.c&&(a.c=new y5d(z2,a,5,8)),a.c));h.e!=h.i.gc();){g=BD(Dyd(h),82);if(ntd(atd(g),d)){return true}else if(atd(g)==d&&Ccb(DD(hkd(a,(Y9c(),N8c))))){return true}}}for(b=new Fyd(BD(this.f,118).xg());b.e!=b.i.gc();){a=BD(Dyd(b),79);for(f=new Fyd((!a.b&&(a.b=new y5d(z2,a,4,7)),a.b));f.e!=f.i.gc();){e=BD(Dyd(f),82);if(ntd(atd(e),d)){return true}}}return false};_.a=null;_.b=null;_.c=null;var v2=mdb(Use,'ElkGraphAdapters/ElkPortAdapter',1266);bcb(1267,1,Dke,Ahd);_.ue=function Bhd(a,b){return zhd(BD(a,118),BD(b,118))};_.Fb=function Chd(a){return this===a};_.ve=function Dhd(){return new tpb(this)};var w2=mdb(Use,'ElkGraphAdapters/PortComparator',1267);var m5=odb(Vse,'EObject');var x2=odb(Wse,Xse);var y2=odb(Wse,Yse);var C2=odb(Wse,Zse);var G2=odb(Wse,'ElkShape');var z2=odb(Wse,$se);var B2=odb(Wse,_se);var A2=odb(Wse,ate);var k5=odb(Vse,bte);var i5=odb(Vse,'EFactory');var Ehd;var l5=odb(Vse,cte);var o5=odb(Vse,'EPackage');var Ghd;var Ihd,Jhd,Khd,Lhd,Mhd,Nhd,Ohd,Phd,Qhd,Rhd,Shd;var D2=odb(Wse,dte);var E2=odb(Wse,ete);var F2=odb(Wse,fte);bcb(90,1,gte);_.Jg=function Vhd(){this.Kg();return null};_.Kg=function Whd(){return null};_.Lg=function Xhd(){return this.Kg(),false};_.Mg=function Yhd(){return false};_.Ng=function Zhd(a){Uhd(this,a)};var b4=mdb(hte,'BasicNotifierImpl',90);bcb(97,90,pte);_.nh=function fjd(){return oid(this)};_.Og=function Fid(a,b){return a};_.Pg=function Gid(){throw vbb(new bgb)};_.Qg=function Hid(a){var b;return b=zUd(BD(XKd(this.Tg(),this.Vg()),18)),this.eh().ih(this,b.n,b.f,a)};_.Rg=function Iid(a,b){throw vbb(new bgb)};_.Sg=function Jid(a,b,c){return _hd(this,a,b,c)};_.Tg=function Kid(){var a;if(this.Pg()){a=this.Pg().ck();if(a){return a}}return this.zh()};_.Ug=function Lid(){return aid(this)};_.Vg=function Mid(){throw vbb(new bgb)};_.Wg=function Oid(){var a,b;b=this.ph().dk();!b&&this.Pg().ik(b=(nRd(),a=pNd(TKd(this.Tg())),a==null?mRd:new qRd(this,a)));return b};_.Xg=function Qid(a,b){return a};_.Yg=function Rid(a){var b;b=a.Gj();return !b?bLd(this.Tg(),a):a.aj()};_.Zg=function Sid(){var a;a=this.Pg();return !a?null:a.fk()};_.$g=function Tid(){return !this.Pg()?null:this.Pg().ck()};_._g=function Uid(a,b,c){return fid(this,a,b,c)};_.ah=function Vid(a){return gid(this,a)};_.bh=function Wid(a,b){return hid(this,a,b)};_.dh=function Xid(){var a;a=this.Pg();return !!a&&a.gk()};_.eh=function Yid(){throw vbb(new bgb)};_.fh=function Zid(){return jid(this)};_.gh=function $id(a,b,c,d){return kid(this,a,b,d)};_.hh=function _id(a,b,c){var d;return d=BD(XKd(this.Tg(),b),66),d.Nj().Qj(this,this.yh(),b-this.Ah(),a,c)};_.ih=function ajd(a,b,c,d){return lid(this,a,b,d)};_.jh=function bjd(a,b,c){var d;return d=BD(XKd(this.Tg(),b),66),d.Nj().Rj(this,this.yh(),b-this.Ah(),a,c)};_.kh=function cjd(){return !!this.Pg()&&!!this.Pg().ek()};_.lh=function djd(a){return mid(this,a)};_.mh=function ejd(a){return nid(this,a)};_.oh=function gjd(a){return rid(this,a)};_.ph=function hjd(){throw vbb(new bgb)};_.qh=function ijd(){return !this.Pg()?null:this.Pg().ek()};_.rh=function jjd(){return jid(this)};_.sh=function kjd(a,b){yid(this,a,b)};_.th=function ljd(a){this.ph().hk(a)};_.uh=function mjd(a){this.ph().kk(a)};_.vh=function njd(a){this.ph().jk(a)};_.wh=function ojd(a,b){var c,d,e,f;f=this.Zg();if(!!f&&!!a){b=Txd(f.Vk(),this,b);f.Zk(this)}d=this.eh();if(d){if((Nid(this,this.eh(),this.Vg()).Bb&Tje)!=0){e=d.fh();!!e&&(!a?e.Yk(this):!f&&e.Zk(this))}else{b=(c=this.Vg(),c>=0?this.Qg(b):this.eh().ih(this,-1-c,null,b));b=this.Sg(null,-1,b)}}this.uh(a);return b};_.xh=function pjd(a){var b,c,d,e,f,g,h,i;c=this.Tg();f=bLd(c,a);b=this.Ah();if(f>=b){return BD(a,66).Nj().Uj(this,this.yh(),f-b)}else if(f<=-1){g=e1d((O6d(),M6d),c,a);if(g){Q6d();BD(g,66).Oj()||(g=_1d(q1d(M6d,g)));e=(d=this.Yg(g),BD(d>=0?this._g(d,true,true):sid(this,g,true),153));i=g.Zj();if(i>1||i==-1){return BD(BD(e,215).hl(a,false),76)}}else{throw vbb(new Wdb(ite+a.ne()+lte))}}else if(a.$j()){return d=this.Yg(a),BD(d>=0?this._g(d,false,true):sid(this,a,false),76)}h=new nGd(this,a);return h};_.yh=function qjd(){return Aid(this)};_.zh=function rjd(){return (NFd(),MFd).S};_.Ah=function sjd(){return aLd(this.zh())};_.Bh=function tjd(a){Cid(this,a)};_.Ib=function ujd(){return Eid(this)};var B5=mdb(qte,'BasicEObjectImpl',97);var zFd;bcb(114,97,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1});_.Ch=function Djd(a){var b;b=xjd(this);return b[a]};_.Dh=function Ejd(a,b){var c;c=xjd(this);NC(c,a,b)};_.Eh=function Fjd(a){var b;b=xjd(this);NC(b,a,null)};_.Jg=function Gjd(){return BD(Ajd(this,4),126)};_.Kg=function Hjd(){throw vbb(new bgb)};_.Lg=function Ijd(){return (this.Db&4)!=0};_.Pg=function Jjd(){throw vbb(new bgb)};_.Fh=function Kjd(a){Cjd(this,2,a)};_.Rg=function Ljd(a,b){this.Db=b<<16|this.Db&255;this.Fh(a)};_.Tg=function Mjd(){return wjd(this)};_.Vg=function Njd(){return this.Db>>16};_.Wg=function Ojd(){var a,b;return nRd(),b=pNd(TKd((a=BD(Ajd(this,16),26),!a?this.zh():a))),b==null?(null,mRd):new qRd(this,b)};_.Mg=function Pjd(){return (this.Db&1)==0};_.Zg=function Qjd(){return BD(Ajd(this,128),1935)};_.$g=function Rjd(){return BD(Ajd(this,16),26)};_.dh=function Sjd(){return (this.Db&32)!=0};_.eh=function Tjd(){return BD(Ajd(this,2),49)};_.kh=function Ujd(){return (this.Db&64)!=0};_.ph=function Vjd(){throw vbb(new bgb)};_.qh=function Wjd(){return BD(Ajd(this,64),281)};_.th=function Xjd(a){Cjd(this,16,a)};_.uh=function Yjd(a){Cjd(this,128,a)};_.vh=function Zjd(a){Cjd(this,64,a)};_.yh=function $jd(){return yjd(this)};_.Db=0;var s8=mdb(qte,'MinimalEObjectImpl',114);bcb(115,114,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_.Fh=function _jd(a){this.Cb=a};_.eh=function akd(){return this.Cb};var r8=mdb(qte,'MinimalEObjectImpl/Container',115);bcb(1985,115,{105:1,413:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function kkd(a,b,c){return bkd(this,a,b,c)};_.jh=function lkd(a,b,c){return ckd(this,a,b,c)};_.lh=function mkd(a){return dkd(this,a)};_.sh=function nkd(a,b){ekd(this,a,b)};_.zh=function okd(){return Thd(),Shd};_.Bh=function pkd(a){fkd(this,a)};_.Ve=function qkd(){return gkd(this)};_.We=function rkd(a){return hkd(this,a)};_.Xe=function skd(a){return ikd(this,a)};_.Ye=function tkd(a,b){return jkd(this,a,b)};var H2=mdb(rte,'EMapPropertyHolderImpl',1985);bcb(567,115,{105:1,469:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},xkd);_._g=function ykd(a,b,c){switch(a){case 0:return this.a;case 1:return this.b;}return fid(this,a,b,c)};_.lh=function zkd(a){switch(a){case 0:return this.a!=0;case 1:return this.b!=0;}return mid(this,a)};_.sh=function Akd(a,b){switch(a){case 0:vkd(this,Edb(ED(b)));return;case 1:wkd(this,Edb(ED(b)));return;}yid(this,a,b)};_.zh=function Bkd(){return Thd(),Ihd};_.Bh=function Ckd(a){switch(a){case 0:vkd(this,0);return;case 1:wkd(this,0);return;}Cid(this,a)};_.Ib=function Dkd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (x: ';Bfb(a,this.a);a.a+=', y: ';Bfb(a,this.b);a.a+=')';return a.a};_.a=0;_.b=0;var I2=mdb(rte,'ElkBendPointImpl',567);bcb(723,1985,{105:1,413:1,160:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function Nkd(a,b,c){return Ekd(this,a,b,c)};_.hh=function Okd(a,b,c){return Fkd(this,a,b,c)};_.jh=function Pkd(a,b,c){return Gkd(this,a,b,c)};_.lh=function Qkd(a){return Hkd(this,a)};_.sh=function Rkd(a,b){Ikd(this,a,b)};_.zh=function Skd(){return Thd(),Mhd};_.Bh=function Tkd(a){Jkd(this,a)};_.zg=function Ukd(){return this.k};_.Ag=function Vkd(){return Kkd(this)};_.Ib=function Wkd(){return Mkd(this)};_.k=null;var M2=mdb(rte,'ElkGraphElementImpl',723);bcb(724,723,{105:1,413:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function gld(a,b,c){return Xkd(this,a,b,c)};_.lh=function hld(a){return Ykd(this,a)};_.sh=function ild(a,b){Zkd(this,a,b)};_.zh=function jld(){return Thd(),Rhd};_.Bh=function kld(a){$kd(this,a)};_.Bg=function lld(){return this.f};_.Cg=function mld(){return this.g};_.Dg=function nld(){return this.i};_.Eg=function old(){return this.j};_.Fg=function pld(a,b){_kd(this,a,b)};_.Gg=function qld(a,b){bld(this,a,b)};_.Hg=function rld(a){dld(this,a)};_.Ig=function sld(a){eld(this,a)};_.Ib=function tld(){return fld(this)};_.f=0;_.g=0;_.i=0;_.j=0;var T2=mdb(rte,'ElkShapeImpl',724);bcb(725,724,{105:1,413:1,82:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1});_._g=function Bld(a,b,c){return uld(this,a,b,c)};_.hh=function Cld(a,b,c){return vld(this,a,b,c)};_.jh=function Dld(a,b,c){return wld(this,a,b,c)};_.lh=function Eld(a){return xld(this,a)};_.sh=function Fld(a,b){yld(this,a,b)};_.zh=function Gld(){return Thd(),Jhd};_.Bh=function Hld(a){zld(this,a)};_.xg=function Ild(){return !this.d&&(this.d=new y5d(B2,this,8,5)),this.d};_.yg=function Jld(){return !this.e&&(this.e=new y5d(B2,this,7,4)),this.e};var J2=mdb(rte,'ElkConnectableShapeImpl',725);bcb(352,723,{105:1,413:1,79:1,160:1,352:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Tld);_.Qg=function Uld(a){return Lld(this,a)};_._g=function Vld(a,b,c){switch(a){case 3:return Mld(this);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),this.b;case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),this.c;case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),this.a;case 7:return Bcb(),!this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i<=1&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i<=1)?false:true;case 8:return Bcb(),Pld(this)?true:false;case 9:return Bcb(),Qld(this)?true:false;case 10:return Bcb(),!this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i!=0&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i!=0)?true:false;}return Ekd(this,a,b,c)};_.hh=function Wld(a,b,c){var d;switch(b){case 3:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Lld(this,c):this.Cb.ih(this,-1-d,null,c)));return Kld(this,BD(a,33),c);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),Sxd(this.b,a,c);case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),Sxd(this.c,a,c);case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),Sxd(this.a,a,c);}return Fkd(this,a,b,c)};_.jh=function Xld(a,b,c){switch(b){case 3:return Kld(this,null,c);case 4:return !this.b&&(this.b=new y5d(z2,this,4,7)),Txd(this.b,a,c);case 5:return !this.c&&(this.c=new y5d(z2,this,5,8)),Txd(this.c,a,c);case 6:return !this.a&&(this.a=new cUd(A2,this,6,6)),Txd(this.a,a,c);}return Gkd(this,a,b,c)};_.lh=function Yld(a){switch(a){case 3:return !!Mld(this);case 4:return !!this.b&&this.b.i!=0;case 5:return !!this.c&&this.c.i!=0;case 6:return !!this.a&&this.a.i!=0;case 7:return !this.b&&(this.b=new y5d(z2,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i<=1));case 8:return Pld(this);case 9:return Qld(this);case 10:return !this.b&&(this.b=new y5d(z2,this,4,7)),this.b.i!=0&&(!this.c&&(this.c=new y5d(z2,this,5,8)),this.c.i!=0);}return Hkd(this,a)};_.sh=function Zld(a,b){switch(a){case 3:Rld(this,BD(b,33));return;case 4:!this.b&&(this.b=new y5d(z2,this,4,7));Uxd(this.b);!this.b&&(this.b=new y5d(z2,this,4,7));ytd(this.b,BD(b,14));return;case 5:!this.c&&(this.c=new y5d(z2,this,5,8));Uxd(this.c);!this.c&&(this.c=new y5d(z2,this,5,8));ytd(this.c,BD(b,14));return;case 6:!this.a&&(this.a=new cUd(A2,this,6,6));Uxd(this.a);!this.a&&(this.a=new cUd(A2,this,6,6));ytd(this.a,BD(b,14));return;}Ikd(this,a,b)};_.zh=function $ld(){return Thd(),Khd};_.Bh=function _ld(a){switch(a){case 3:Rld(this,null);return;case 4:!this.b&&(this.b=new y5d(z2,this,4,7));Uxd(this.b);return;case 5:!this.c&&(this.c=new y5d(z2,this,5,8));Uxd(this.c);return;case 6:!this.a&&(this.a=new cUd(A2,this,6,6));Uxd(this.a);return;}Jkd(this,a)};_.Ib=function amd(){return Sld(this)};var K2=mdb(rte,'ElkEdgeImpl',352);bcb(439,1985,{105:1,413:1,202:1,439:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},rmd);_.Qg=function smd(a){return cmd(this,a)};_._g=function tmd(a,b,c){switch(a){case 1:return this.j;case 2:return this.k;case 3:return this.b;case 4:return this.c;case 5:return !this.a&&(this.a=new xMd(y2,this,5)),this.a;case 6:return fmd(this);case 7:if(b)return emd(this);return this.i;case 8:if(b)return dmd(this);return this.f;case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),this.g;case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),this.e;case 11:return this.d;}return bkd(this,a,b,c)};_.hh=function umd(a,b,c){var d,e,f;switch(b){case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?cmd(this,c):this.Cb.ih(this,-1-e,null,c)));return bmd(this,BD(a,79),c);case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),Sxd(this.g,a,c);case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),Sxd(this.e,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(Thd(),Lhd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((Thd(),Lhd)),a,c)};_.jh=function vmd(a,b,c){switch(b){case 5:return !this.a&&(this.a=new xMd(y2,this,5)),Txd(this.a,a,c);case 6:return bmd(this,null,c);case 9:return !this.g&&(this.g=new y5d(A2,this,9,10)),Txd(this.g,a,c);case 10:return !this.e&&(this.e=new y5d(A2,this,10,9)),Txd(this.e,a,c);}return ckd(this,a,b,c)};_.lh=function wmd(a){switch(a){case 1:return this.j!=0;case 2:return this.k!=0;case 3:return this.b!=0;case 4:return this.c!=0;case 5:return !!this.a&&this.a.i!=0;case 6:return !!fmd(this);case 7:return !!this.i;case 8:return !!this.f;case 9:return !!this.g&&this.g.i!=0;case 10:return !!this.e&&this.e.i!=0;case 11:return this.d!=null;}return dkd(this,a)};_.sh=function xmd(a,b){switch(a){case 1:omd(this,Edb(ED(b)));return;case 2:pmd(this,Edb(ED(b)));return;case 3:hmd(this,Edb(ED(b)));return;case 4:imd(this,Edb(ED(b)));return;case 5:!this.a&&(this.a=new xMd(y2,this,5));Uxd(this.a);!this.a&&(this.a=new xMd(y2,this,5));ytd(this.a,BD(b,14));return;case 6:mmd(this,BD(b,79));return;case 7:lmd(this,BD(b,82));return;case 8:kmd(this,BD(b,82));return;case 9:!this.g&&(this.g=new y5d(A2,this,9,10));Uxd(this.g);!this.g&&(this.g=new y5d(A2,this,9,10));ytd(this.g,BD(b,14));return;case 10:!this.e&&(this.e=new y5d(A2,this,10,9));Uxd(this.e);!this.e&&(this.e=new y5d(A2,this,10,9));ytd(this.e,BD(b,14));return;case 11:jmd(this,GD(b));return;}ekd(this,a,b)};_.zh=function ymd(){return Thd(),Lhd};_.Bh=function zmd(a){switch(a){case 1:omd(this,0);return;case 2:pmd(this,0);return;case 3:hmd(this,0);return;case 4:imd(this,0);return;case 5:!this.a&&(this.a=new xMd(y2,this,5));Uxd(this.a);return;case 6:mmd(this,null);return;case 7:lmd(this,null);return;case 8:kmd(this,null);return;case 9:!this.g&&(this.g=new y5d(A2,this,9,10));Uxd(this.g);return;case 10:!this.e&&(this.e=new y5d(A2,this,10,9));Uxd(this.e);return;case 11:jmd(this,null);return;}fkd(this,a)};_.Ib=function Amd(){return qmd(this)};_.b=0;_.c=0;_.d=null;_.j=0;_.k=0;var L2=mdb(rte,'ElkEdgeSectionImpl',439);bcb(150,115,{105:1,92:1,90:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1});_._g=function Emd(a,b,c){var d;if(a==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function Fmd(a,b,c){var d,e;if(b==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c)}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function Gmd(a,b,c){var d,e;if(b==0){return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c)}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function Hmd(a){var b;if(a==0){return !!this.Ab&&this.Ab.i!=0}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.oh=function Imd(a){return Bmd(this,a)};_.sh=function Jmd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.uh=function Kmd(a){Cjd(this,128,a)};_.zh=function Lmd(){return jGd(),ZFd};_.Bh=function Mmd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function Nmd(){this.Bb|=1};_.Hh=function Omd(a){return Dmd(this,a)};_.Bb=0;var f6=mdb(qte,'EModelElementImpl',150);bcb(704,150,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},$md);_.Ih=function _md(a,b){return Vmd(this,a,b)};_.Jh=function and(a){var b,c,d,e,f;if(this.a!=bKd(a)||(a.Bb&256)!=0){throw vbb(new Wdb(xte+a.zb+ute))}for(d=_Kd(a);VKd(d.a).i!=0;){c=BD(nOd(d,0,(b=BD(qud(VKd(d.a),0),87),f=b.c,JD(f,88)?BD(f,26):(jGd(),_Fd))),26);if(dKd(c)){e=bKd(c).Nh().Jh(c);BD(e,49).th(a);return e}d=_Kd(c)}return (a.D!=null?a.D:a.B)=='java.util.Map$Entry'?new lHd(a):new _Gd(a)};_.Kh=function bnd(a,b){return Wmd(this,a,b)};_._g=function cnd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.a;}return bid(this,a-aLd((jGd(),WFd)),XKd((d=BD(Ajd(this,16),26),!d?WFd:d),a),b,c)};_.hh=function dnd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 1:!!this.a&&(c=BD(this.a,49).ih(this,4,o5,c));return Tmd(this,BD(a,235),c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),WFd):d),b),66),e.Nj().Qj(this,yjd(this),b-aLd((jGd(),WFd)),a,c)};_.jh=function end(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 1:return Tmd(this,null,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),WFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),WFd)),a,c)};_.lh=function fnd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return !!this.a;}return cid(this,a-aLd((jGd(),WFd)),XKd((b=BD(Ajd(this,16),26),!b?WFd:b),a))};_.sh=function gnd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:Ymd(this,BD(b,235));return;}did(this,a-aLd((jGd(),WFd)),XKd((c=BD(Ajd(this,16),26),!c?WFd:c),a),b)};_.zh=function hnd(){return jGd(),WFd};_.Bh=function ind(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:Ymd(this,null);return;}eid(this,a-aLd((jGd(),WFd)),XKd((b=BD(Ajd(this,16),26),!b?WFd:b),a))};var Pmd,Qmd,Rmd;var d6=mdb(qte,'EFactoryImpl',704);bcb(zte,704,{105:1,2014:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},knd);_.Ih=function lnd(a,b){switch(a.yj()){case 12:return BD(b,146).tg();case 13:return fcb(b);default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function mnd(a){var b,c,d,e,f,g,h,i;switch(a.G==-1&&(a.G=(b=bKd(a),b?HLd(b.Mh(),a):-1)),a.G){case 4:return f=new Jod,f;case 6:return g=new apd,g;case 7:return h=new ppd,h;case 8:return d=new Tld,d;case 9:return c=new xkd,c;case 10:return e=new rmd,e;case 11:return i=new Bpd,i;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function nnd(a,b){switch(a.yj()){case 13:case 12:return null;default:throw vbb(new Wdb(tte+a.ne()+ute));}};var N2=mdb(rte,'ElkGraphFactoryImpl',zte);bcb(438,150,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1});_.Wg=function rnd(){var a,b;b=(a=BD(Ajd(this,16),26),pNd(TKd(!a?this.zh():a)));return b==null?(nRd(),nRd(),mRd):new GRd(this,b)};_._g=function snd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.ne();}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.lh=function tnd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function und(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:this.Lh(GD(b));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function vnd(){return jGd(),$Fd};_.Bh=function wnd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:this.Lh(null);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.ne=function xnd(){return this.zb};_.Lh=function ynd(a){pnd(this,a)};_.Ib=function znd(){return qnd(this)};_.zb=null;var j6=mdb(qte,'ENamedElementImpl',438);bcb(179,438,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},eod);_.Qg=function god(a){return Snd(this,a)};_._g=function hod(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.yb;case 3:return this.xb;case 4:return this.sb;case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),this.rb;case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),this.vb;case 7:if(b)return this.Db>>16==7?BD(this.Cb,235):null;return Ind(this);}return bid(this,a-aLd((jGd(),cGd)),XKd((d=BD(Ajd(this,16),26),!d?cGd:d),a),b,c)};_.hh=function iod(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 4:!!this.sb&&(c=BD(this.sb,49).ih(this,1,i5,c));return Jnd(this,BD(a,471),c);case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),Sxd(this.rb,a,c);case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),Sxd(this.vb,a,c);case 7:!!this.Cb&&(c=(e=this.Db>>16,e>=0?Snd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,7,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),cGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),cGd)),a,c)};_.jh=function jod(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 4:return Jnd(this,null,c);case 5:return !this.rb&&(this.rb=new jUd(this,d5,this)),Txd(this.rb,a,c);case 6:return !this.vb&&(this.vb=new gUd(o5,this,6,7)),Txd(this.vb,a,c);case 7:return _hd(this,null,7,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),cGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),cGd)),a,c)};_.lh=function kod(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.yb!=null;case 3:return this.xb!=null;case 4:return !!this.sb;case 5:return !!this.rb&&this.rb.i!=0;case 6:return !!this.vb&&this.vb.i!=0;case 7:return !!Ind(this);}return cid(this,a-aLd((jGd(),cGd)),XKd((b=BD(Ajd(this,16),26),!b?cGd:b),a))};_.oh=function lod(a){var b;b=Und(this,a);return b?b:Bmd(this,a)};_.sh=function mod(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:dod(this,GD(b));return;case 3:cod(this,GD(b));return;case 4:bod(this,BD(b,471));return;case 5:!this.rb&&(this.rb=new jUd(this,d5,this));Uxd(this.rb);!this.rb&&(this.rb=new jUd(this,d5,this));ytd(this.rb,BD(b,14));return;case 6:!this.vb&&(this.vb=new gUd(o5,this,6,7));Uxd(this.vb);!this.vb&&(this.vb=new gUd(o5,this,6,7));ytd(this.vb,BD(b,14));return;}did(this,a-aLd((jGd(),cGd)),XKd((c=BD(Ajd(this,16),26),!c?cGd:c),a),b)};_.vh=function nod(a){var b,c;if(!!a&&!!this.rb){for(c=new Fyd(this.rb);c.e!=c.i.gc();){b=Dyd(c);JD(b,351)&&(BD(b,351).w=null)}}Cjd(this,64,a)};_.zh=function ood(){return jGd(),cGd};_.Bh=function pod(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:dod(this,null);return;case 3:cod(this,null);return;case 4:bod(this,null);return;case 5:!this.rb&&(this.rb=new jUd(this,d5,this));Uxd(this.rb);return;case 6:!this.vb&&(this.vb=new gUd(o5,this,6,7));Uxd(this.vb);return;}eid(this,a-aLd((jGd(),cGd)),XKd((b=BD(Ajd(this,16),26),!b?cGd:b),a))};_.Gh=function qod(){Tnd(this)};_.Mh=function rod(){return !this.rb&&(this.rb=new jUd(this,d5,this)),this.rb};_.Nh=function sod(){return this.sb};_.Oh=function tod(){return this.ub};_.Ph=function uod(){return this.xb};_.Qh=function vod(){return this.yb};_.Rh=function wod(a){this.ub=a};_.Ib=function xod(){var a;if((this.Db&64)!=0)return qnd(this);a=new Jfb(qnd(this));a.a+=' (nsURI: ';Efb(a,this.yb);a.a+=', nsPrefix: ';Efb(a,this.xb);a.a+=')';return a.a};_.xb=null;_.yb=null;var And;var t6=mdb(qte,'EPackageImpl',179);bcb(555,179,{105:1,2016:1,555:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},Bod);_.q=false;_.r=false;var yod=false;var O2=mdb(rte,'ElkGraphPackageImpl',555);bcb(354,724,{105:1,413:1,160:1,137:1,470:1,354:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Jod);_.Qg=function Kod(a){return Eod(this,a)};_._g=function Lod(a,b,c){switch(a){case 7:return Fod(this);case 8:return this.a;}return Xkd(this,a,b,c)};_.hh=function Mod(a,b,c){var d;switch(b){case 7:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Eod(this,c):this.Cb.ih(this,-1-d,null,c)));return Dod(this,BD(a,160),c);}return Fkd(this,a,b,c)};_.jh=function Nod(a,b,c){if(b==7){return Dod(this,null,c)}return Gkd(this,a,b,c)};_.lh=function Ood(a){switch(a){case 7:return !!Fod(this);case 8:return !dfb('',this.a);}return Ykd(this,a)};_.sh=function Pod(a,b){switch(a){case 7:God(this,BD(b,160));return;case 8:Hod(this,GD(b));return;}Zkd(this,a,b)};_.zh=function Qod(){return Thd(),Nhd};_.Bh=function Rod(a){switch(a){case 7:God(this,null);return;case 8:Hod(this,'');return;}$kd(this,a)};_.Ib=function Sod(){return Iod(this)};_.a='';var P2=mdb(rte,'ElkLabelImpl',354);bcb(239,725,{105:1,413:1,82:1,160:1,33:1,470:1,239:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},apd);_.Qg=function bpd(a){return Uod(this,a)};_._g=function cpd(a,b,c){switch(a){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),this.c;case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),this.a;case 11:return Xod(this);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),this.b;case 13:return Bcb(),!this.a&&(this.a=new cUd(E2,this,10,11)),this.a.i>0?true:false;}return uld(this,a,b,c)};_.hh=function dpd(a,b,c){var d;switch(b){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),Sxd(this.c,a,c);case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),Sxd(this.a,a,c);case 11:!!this.Cb&&(c=(d=this.Db>>16,d>=0?Uod(this,c):this.Cb.ih(this,-1-d,null,c)));return Tod(this,BD(a,33),c);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),Sxd(this.b,a,c);}return vld(this,a,b,c)};_.jh=function epd(a,b,c){switch(b){case 9:return !this.c&&(this.c=new cUd(F2,this,9,9)),Txd(this.c,a,c);case 10:return !this.a&&(this.a=new cUd(E2,this,10,11)),Txd(this.a,a,c);case 11:return Tod(this,null,c);case 12:return !this.b&&(this.b=new cUd(B2,this,12,3)),Txd(this.b,a,c);}return wld(this,a,b,c)};_.lh=function fpd(a){switch(a){case 9:return !!this.c&&this.c.i!=0;case 10:return !!this.a&&this.a.i!=0;case 11:return !!Xod(this);case 12:return !!this.b&&this.b.i!=0;case 13:return !this.a&&(this.a=new cUd(E2,this,10,11)),this.a.i>0;}return xld(this,a)};_.sh=function gpd(a,b){switch(a){case 9:!this.c&&(this.c=new cUd(F2,this,9,9));Uxd(this.c);!this.c&&(this.c=new cUd(F2,this,9,9));ytd(this.c,BD(b,14));return;case 10:!this.a&&(this.a=new cUd(E2,this,10,11));Uxd(this.a);!this.a&&(this.a=new cUd(E2,this,10,11));ytd(this.a,BD(b,14));return;case 11:$od(this,BD(b,33));return;case 12:!this.b&&(this.b=new cUd(B2,this,12,3));Uxd(this.b);!this.b&&(this.b=new cUd(B2,this,12,3));ytd(this.b,BD(b,14));return;}yld(this,a,b)};_.zh=function hpd(){return Thd(),Ohd};_.Bh=function ipd(a){switch(a){case 9:!this.c&&(this.c=new cUd(F2,this,9,9));Uxd(this.c);return;case 10:!this.a&&(this.a=new cUd(E2,this,10,11));Uxd(this.a);return;case 11:$od(this,null);return;case 12:!this.b&&(this.b=new cUd(B2,this,12,3));Uxd(this.b);return;}zld(this,a)};_.Ib=function jpd(){return _od(this)};var Q2=mdb(rte,'ElkNodeImpl',239);bcb(186,725,{105:1,413:1,82:1,160:1,118:1,470:1,186:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},ppd);_.Qg=function qpd(a){return lpd(this,a)};_._g=function rpd(a,b,c){if(a==9){return mpd(this)}return uld(this,a,b,c)};_.hh=function spd(a,b,c){var d;switch(b){case 9:!!this.Cb&&(c=(d=this.Db>>16,d>=0?lpd(this,c):this.Cb.ih(this,-1-d,null,c)));return kpd(this,BD(a,33),c);}return vld(this,a,b,c)};_.jh=function tpd(a,b,c){if(b==9){return kpd(this,null,c)}return wld(this,a,b,c)};_.lh=function upd(a){if(a==9){return !!mpd(this)}return xld(this,a)};_.sh=function vpd(a,b){switch(a){case 9:npd(this,BD(b,33));return;}yld(this,a,b)};_.zh=function wpd(){return Thd(),Phd};_.Bh=function xpd(a){switch(a){case 9:npd(this,null);return;}zld(this,a)};_.Ib=function ypd(){return opd(this)};var R2=mdb(rte,'ElkPortImpl',186);var J4=odb(Tte,'BasicEMap/Entry');bcb(1092,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,114:1,115:1},Bpd);_.Fb=function Hpd(a){return this===a};_.cd=function Jpd(){return this.b};_.Hb=function Lpd(){return FCb(this)};_.Uh=function Npd(a){zpd(this,BD(a,146))};_._g=function Cpd(a,b,c){switch(a){case 0:return this.b;case 1:return this.c;}return fid(this,a,b,c)};_.lh=function Dpd(a){switch(a){case 0:return !!this.b;case 1:return this.c!=null;}return mid(this,a)};_.sh=function Epd(a,b){switch(a){case 0:zpd(this,BD(b,146));return;case 1:Apd(this,b);return;}yid(this,a,b)};_.zh=function Fpd(){return Thd(),Qhd};_.Bh=function Gpd(a){switch(a){case 0:zpd(this,null);return;case 1:Apd(this,null);return;}Cid(this,a)};_.Sh=function Ipd(){var a;if(this.a==-1){a=this.b;this.a=!a?0:tb(a)}return this.a};_.dd=function Kpd(){return this.c};_.Th=function Mpd(a){this.a=a};_.ed=function Opd(a){var b;b=this.c;Apd(this,a);return b};_.Ib=function Ppd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Ufb;Qfb(Qfb(Qfb(a,this.b?this.b.tg():Xhe),gne),xfb(this.c));return a.a};_.a=-1;_.c=null;var S2=mdb(rte,'ElkPropertyToValueMapEntryImpl',1092);bcb(984,1,{},bqd);var U2=mdb(Wte,'JsonAdapter',984);bcb(210,60,Tie,cqd);var V2=mdb(Wte,'JsonImportException',210);bcb(857,1,{},ird);var J3=mdb(Wte,'JsonImporter',857);bcb(891,1,{},jrd);var W2=mdb(Wte,'JsonImporter/lambda$0$Type',891);bcb(892,1,{},krd);var X2=mdb(Wte,'JsonImporter/lambda$1$Type',892);bcb(900,1,{},lrd);var Y2=mdb(Wte,'JsonImporter/lambda$10$Type',900);bcb(902,1,{},mrd);var Z2=mdb(Wte,'JsonImporter/lambda$11$Type',902);bcb(903,1,{},nrd);var $2=mdb(Wte,'JsonImporter/lambda$12$Type',903);bcb(909,1,{},ord);var _2=mdb(Wte,'JsonImporter/lambda$13$Type',909);bcb(908,1,{},prd);var a3=mdb(Wte,'JsonImporter/lambda$14$Type',908);bcb(904,1,{},qrd);var b3=mdb(Wte,'JsonImporter/lambda$15$Type',904);bcb(905,1,{},rrd);var c3=mdb(Wte,'JsonImporter/lambda$16$Type',905);bcb(906,1,{},srd);var d3=mdb(Wte,'JsonImporter/lambda$17$Type',906);bcb(907,1,{},trd);var e3=mdb(Wte,'JsonImporter/lambda$18$Type',907);bcb(912,1,{},urd);var f3=mdb(Wte,'JsonImporter/lambda$19$Type',912);bcb(893,1,{},vrd);var g3=mdb(Wte,'JsonImporter/lambda$2$Type',893);bcb(910,1,{},wrd);var h3=mdb(Wte,'JsonImporter/lambda$20$Type',910);bcb(911,1,{},xrd);var i3=mdb(Wte,'JsonImporter/lambda$21$Type',911);bcb(915,1,{},yrd);var j3=mdb(Wte,'JsonImporter/lambda$22$Type',915);bcb(913,1,{},zrd);var k3=mdb(Wte,'JsonImporter/lambda$23$Type',913);bcb(914,1,{},Ard);var l3=mdb(Wte,'JsonImporter/lambda$24$Type',914);bcb(917,1,{},Brd);var m3=mdb(Wte,'JsonImporter/lambda$25$Type',917);bcb(916,1,{},Crd);var n3=mdb(Wte,'JsonImporter/lambda$26$Type',916);bcb(918,1,qie,Drd);_.td=function Erd(a){Bqd(this.b,this.a,GD(a))};var o3=mdb(Wte,'JsonImporter/lambda$27$Type',918);bcb(919,1,qie,Frd);_.td=function Grd(a){Cqd(this.b,this.a,GD(a))};var p3=mdb(Wte,'JsonImporter/lambda$28$Type',919);bcb(920,1,{},Hrd);var q3=mdb(Wte,'JsonImporter/lambda$29$Type',920);bcb(896,1,{},Ird);var r3=mdb(Wte,'JsonImporter/lambda$3$Type',896);bcb(921,1,{},Jrd);var s3=mdb(Wte,'JsonImporter/lambda$30$Type',921);bcb(922,1,{},Krd);var t3=mdb(Wte,'JsonImporter/lambda$31$Type',922);bcb(923,1,{},Lrd);var u3=mdb(Wte,'JsonImporter/lambda$32$Type',923);bcb(924,1,{},Mrd);var v3=mdb(Wte,'JsonImporter/lambda$33$Type',924);bcb(925,1,{},Nrd);var w3=mdb(Wte,'JsonImporter/lambda$34$Type',925);bcb(859,1,{},Prd);var x3=mdb(Wte,'JsonImporter/lambda$35$Type',859);bcb(929,1,{},Rrd);var y3=mdb(Wte,'JsonImporter/lambda$36$Type',929);bcb(926,1,qie,Srd);_.td=function Trd(a){Lqd(this.a,BD(a,469))};var z3=mdb(Wte,'JsonImporter/lambda$37$Type',926);bcb(927,1,qie,Urd);_.td=function Vrd(a){Mqd(this.a,this.b,BD(a,202))};var A3=mdb(Wte,'JsonImporter/lambda$38$Type',927);bcb(928,1,qie,Wrd);_.td=function Xrd(a){Nqd(this.a,this.b,BD(a,202))};var B3=mdb(Wte,'JsonImporter/lambda$39$Type',928);bcb(894,1,{},Yrd);var C3=mdb(Wte,'JsonImporter/lambda$4$Type',894);bcb(930,1,qie,Zrd);_.td=function $rd(a){Oqd(this.a,BD(a,8))};var D3=mdb(Wte,'JsonImporter/lambda$40$Type',930);bcb(895,1,{},_rd);var E3=mdb(Wte,'JsonImporter/lambda$5$Type',895);bcb(899,1,{},asd);var F3=mdb(Wte,'JsonImporter/lambda$6$Type',899);bcb(897,1,{},bsd);var G3=mdb(Wte,'JsonImporter/lambda$7$Type',897);bcb(898,1,{},csd);var H3=mdb(Wte,'JsonImporter/lambda$8$Type',898);bcb(901,1,{},dsd);var I3=mdb(Wte,'JsonImporter/lambda$9$Type',901);bcb(948,1,qie,msd);_.td=function nsd(a){Qpd(this.a,new yC(GD(a)))};var K3=mdb(Wte,'JsonMetaDataConverter/lambda$0$Type',948);bcb(949,1,qie,osd);_.td=function psd(a){isd(this.a,BD(a,237))};var L3=mdb(Wte,'JsonMetaDataConverter/lambda$1$Type',949);bcb(950,1,qie,qsd);_.td=function rsd(a){jsd(this.a,BD(a,149))};var M3=mdb(Wte,'JsonMetaDataConverter/lambda$2$Type',950);bcb(951,1,qie,ssd);_.td=function tsd(a){ksd(this.a,BD(a,175))};var N3=mdb(Wte,'JsonMetaDataConverter/lambda$3$Type',951);bcb(237,22,{3:1,35:1,22:1,237:1},Dsd);var usd,vsd,wsd,xsd,ysd,zsd,Asd,Bsd;var O3=ndb(Hle,'GraphFeature',237,CI,Fsd,Esd);var Gsd;bcb(13,1,{35:1,146:1},Lsd,Msd,Nsd,Osd);_.wd=function Psd(a){return Isd(this,BD(a,146))};_.Fb=function Qsd(a){return Jsd(this,a)};_.wg=function Rsd(){return Ksd(this)};_.tg=function Ssd(){return this.b};_.Hb=function Tsd(){return LCb(this.b)};_.Ib=function Usd(){return this.b};var T3=mdb(Hle,'Property',13);bcb(818,1,Dke,Wsd);_.ue=function Xsd(a,b){return Vsd(this,BD(a,94),BD(b,94))};_.Fb=function Ysd(a){return this===a};_.ve=function Zsd(){return new tpb(this)};var S3=mdb(Hle,'PropertyHolderComparator',818);bcb(695,1,aie,qtd);_.Nb=function rtd(a){Rrb(this,a)};_.Pb=function ttd(){return ptd(this)};_.Qb=function utd(){Srb()};_.Ob=function std(){return !!this.a};var U3=mdb(jue,'ElkGraphUtil/AncestorIterator',695);var T4=odb(Tte,'EList');bcb(67,52,{20:1,28:1,52:1,14:1,15:1,67:1,58:1});_.Vc=function Jtd(a,b){vtd(this,a,b)};_.Fc=function Ktd(a){return wtd(this,a)};_.Wc=function Ltd(a,b){return xtd(this,a,b)};_.Gc=function Mtd(a){return ytd(this,a)};_.Zh=function Ntd(){return new $yd(this)};_.$h=function Otd(){return new bzd(this)};_._h=function Ptd(a){return ztd(this,a)};_.ai=function Qtd(){return true};_.bi=function Rtd(a,b){};_.ci=function Std(){};_.di=function Ttd(a,b){Atd(this,a,b)};_.ei=function Utd(a,b,c){};_.fi=function Vtd(a,b){};_.gi=function Wtd(a,b,c){};_.Fb=function Xtd(a){return Btd(this,a)};_.Hb=function Ytd(){return Etd(this)};_.hi=function Ztd(){return false};_.Kc=function $td(){return new Fyd(this)};_.Yc=function _td(){return new Oyd(this)};_.Zc=function aud(a){var b;b=this.gc();if(a<0||a>b)throw vbb(new Cyd(a,b));return new Pyd(this,a)};_.ji=function bud(a,b){this.ii(a,this.Xc(b))};_.Mc=function cud(a){return Ftd(this,a)};_.li=function dud(a,b){return b};_._c=function eud(a,b){return Gtd(this,a,b)};_.Ib=function fud(){return Htd(this)};_.ni=function gud(){return true};_.oi=function hud(a,b){return Itd(this,b)};var p4=mdb(Tte,'AbstractEList',67);bcb(63,67,oue,yud,zud,Aud);_.Vh=function Bud(a,b){return iud(this,a,b)};_.Wh=function Cud(a){return jud(this,a)};_.Xh=function Dud(a,b){kud(this,a,b)};_.Yh=function Eud(a){lud(this,a)};_.pi=function Fud(a){return nud(this,a)};_.$b=function Gud(){oud(this)};_.Hc=function Hud(a){return pud(this,a)};_.Xb=function Iud(a){return qud(this,a)};_.qi=function Jud(a){var b,c,d;++this.j;c=this.g==null?0:this.g.length;if(a>c){d=this.g;b=c+(c/2|0)+4;b=0){this.$c(b);return true}else{return false}};_.mi=function lwd(a,b){return this.Ui(a,this.oi(a,b))};_.gc=function mwd(){return this.Vi()};_.Pc=function nwd(){return this.Wi()};_.Qc=function owd(a){return this.Xi(a)};_.Ib=function pwd(){return this.Yi()};var M4=mdb(Tte,'DelegatingEList',1995);bcb(1996,1995,eve);_.Vh=function xwd(a,b){return qwd(this,a,b)};_.Wh=function ywd(a){return this.Vh(this.Vi(),a)};_.Xh=function zwd(a,b){rwd(this,a,b)};_.Yh=function Awd(a){swd(this,a)};_.ai=function Bwd(){return !this.bj()};_.$b=function Cwd(){vwd(this)};_.Zi=function Dwd(a,b,c,d,e){return new Cxd(this,a,b,c,d,e)};_.$i=function Ewd(a){Uhd(this.Ai(),a)};_._i=function Fwd(){return null};_.aj=function Gwd(){return -1};_.Ai=function Hwd(){return null};_.bj=function Iwd(){return false};_.cj=function Jwd(a,b){return b};_.dj=function Kwd(a,b){return b};_.ej=function Lwd(){return false};_.fj=function Mwd(){return !this.Ri()};_.ii=function Nwd(a,b){var c,d;if(this.ej()){d=this.fj();c=Dvd(this,a,b);this.$i(this.Zi(7,meb(b),c,a,d));return c}else{return Dvd(this,a,b)}};_.$c=function Owd(a){var b,c,d,e;if(this.ej()){c=null;d=this.fj();b=this.Zi(4,e=Evd(this,a),null,a,d);if(this.bj()&&!!e){c=this.dj(e,c);if(!c){this.$i(b)}else{c.Ei(b);c.Fi()}}else{if(!c){this.$i(b)}else{c.Ei(b);c.Fi()}}return e}else{e=Evd(this,a);if(this.bj()&&!!e){c=this.dj(e,null);!!c&&c.Fi()}return e}};_.mi=function Pwd(a,b){return wwd(this,a,b)};var d4=mdb(hte,'DelegatingNotifyingListImpl',1996);bcb(143,1,fve);_.Ei=function pxd(a){return Qwd(this,a)};_.Fi=function qxd(){Rwd(this)};_.xi=function rxd(){return this.d};_._i=function sxd(){return null};_.gj=function txd(){return null};_.yi=function uxd(a){return -1};_.zi=function vxd(){return $wd(this)};_.Ai=function wxd(){return null};_.Bi=function xxd(){return hxd(this)};_.Ci=function yxd(){return this.o<0?this.o<-2?-2-this.o-1:-1:this.o};_.hj=function zxd(){return false};_.Di=function Axd(a){var b,c,d,e,f,g,h,i,j,k,l;switch(this.d){case 1:case 2:{e=a.xi();switch(e){case 1:case 2:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){this.g=a.zi();a.xi()==1&&(this.d=1);return true}}}}case 4:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){j=jxd(this);i=this.o<0?this.o<-2?-2-this.o-1:-1:this.o;g=a.Ci();this.d=6;l=new zud(2);if(i<=g){wtd(l,this.n);wtd(l,a.Bi());this.g=OC(GC(WD,1),oje,25,15,[this.o=i,g+1])}else{wtd(l,a.Bi());wtd(l,this.n);this.g=OC(GC(WD,1),oje,25,15,[this.o=g,i])}this.n=l;j||(this.o=-2-this.o-1);return true}break}}break}case 6:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.Ai())&&this.yi(null)==a.yi(null)){j=jxd(this);g=a.Ci();k=BD(this.g,48);d=KC(WD,oje,25,k.length+1,15,1);b=0;while(b>>0,b.toString(16)));d.a+=' (eventType: ';switch(this.d){case 1:{d.a+='SET';break}case 2:{d.a+='UNSET';break}case 3:{d.a+='ADD';break}case 5:{d.a+='ADD_MANY';break}case 4:{d.a+='REMOVE';break}case 6:{d.a+='REMOVE_MANY';break}case 7:{d.a+='MOVE';break}case 8:{d.a+='REMOVING_ADAPTER';break}case 9:{d.a+='RESOLVE';break}default:{Cfb(d,this.d);break}}ixd(this)&&(d.a+=', touch: true',d);d.a+=', position: ';Cfb(d,this.o<0?this.o<-2?-2-this.o-1:-1:this.o);d.a+=', notifier: ';Dfb(d,this.Ai());d.a+=', feature: ';Dfb(d,this._i());d.a+=', oldValue: ';Dfb(d,hxd(this));d.a+=', newValue: ';if(this.d==6&&JD(this.g,48)){c=BD(this.g,48);d.a+='[';for(a=0;a10){if(!this.b||this.c.j!=this.a){this.b=new Vqb(this);this.a=this.j}return Rqb(this.b,a)}else{return pud(this,a)}};_.ni=function Byd(){return true};_.a=0;var j4=mdb(Tte,'AbstractEList/1',953);bcb(295,73,Mje,Cyd);var k4=mdb(Tte,'AbstractEList/BasicIndexOutOfBoundsException',295);bcb(40,1,aie,Fyd);_.Nb=function Iyd(a){Rrb(this,a)};_.mj=function Gyd(){if(this.i.j!=this.f){throw vbb(new Apb)}};_.nj=function Hyd(){return Dyd(this)};_.Ob=function Jyd(){return this.e!=this.i.gc()};_.Pb=function Kyd(){return this.nj()};_.Qb=function Lyd(){Eyd(this)};_.e=0;_.f=0;_.g=-1;var l4=mdb(Tte,'AbstractEList/EIterator',40);bcb(278,40,jie,Oyd,Pyd);_.Qb=function Xyd(){Eyd(this)};_.Rb=function Qyd(a){Myd(this,a)};_.oj=function Ryd(){var b;try{b=this.d.Xb(--this.e);this.mj();this.g=this.e;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.pj=function Syd(a){Nyd(this,a)};_.Sb=function Tyd(){return this.e!=0};_.Tb=function Uyd(){return this.e};_.Ub=function Vyd(){return this.oj()};_.Vb=function Wyd(){return this.e-1};_.Wb=function Yyd(a){this.pj(a)};var m4=mdb(Tte,'AbstractEList/EListIterator',278);bcb(341,40,aie,$yd);_.nj=function _yd(){return Zyd(this)};_.Qb=function azd(){throw vbb(new bgb)};var n4=mdb(Tte,'AbstractEList/NonResolvingEIterator',341);bcb(385,278,jie,bzd,czd);_.Rb=function dzd(a){throw vbb(new bgb)};_.nj=function ezd(){var b;try{b=this.c.ki(this.e);this.mj();this.g=this.e++;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.oj=function fzd(){var b;try{b=this.c.ki(--this.e);this.mj();this.g=this.e;return b}catch(a){a=ubb(a);if(JD(a,73)){this.mj();throw vbb(new utb)}else throw vbb(a)}};_.Qb=function gzd(){throw vbb(new bgb)};_.Wb=function hzd(a){throw vbb(new bgb)};var o4=mdb(Tte,'AbstractEList/NonResolvingEListIterator',385);bcb(1982,67,ive);_.Vh=function pzd(a,b){var c,d,e,f,g,h,i,j,k,l,m;e=b.gc();if(e!=0){j=BD(Ajd(this.a,4),126);k=j==null?0:j.length;m=k+e;d=nzd(this,m);l=k-a;l>0&&$fb(j,a,d,a+e,l);i=b.Kc();for(g=0;gc)throw vbb(new Cyd(a,c));return new Yzd(this,a)};_.$b=function wzd(){var a,b;++this.j;a=BD(Ajd(this.a,4),126);b=a==null?0:a.length;b0d(this,null);Atd(this,b,a)};_.Hc=function xzd(a){var b,c,d,e,f;b=BD(Ajd(this.a,4),126);if(b!=null){if(a!=null){for(d=b,e=0,f=d.length;e=c)throw vbb(new Cyd(a,c));return b[a]};_.Xc=function zzd(a){var b,c,d;b=BD(Ajd(this.a,4),126);if(b!=null){if(a!=null){for(c=0,d=b.length;cc)throw vbb(new Cyd(a,c));return new Qzd(this,a)};_.ii=function Ezd(a,b){var c,d,e;c=mzd(this);e=c==null?0:c.length;if(a>=e)throw vbb(new qcb(lue+a+mue+e));if(b>=e)throw vbb(new qcb(nue+b+mue+e));d=c[b];if(a!=b){a0&&$fb(a,0,b,0,c);return b};_.Qc=function Kzd(a){var b,c,d;b=BD(Ajd(this.a,4),126);d=b==null?0:b.length;if(d>0){if(a.lengthd&&NC(a,d,null);return a};var jzd;var v4=mdb(Tte,'ArrayDelegatingEList',1982);bcb(1038,40,aie,Lzd);_.mj=function Mzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};_.Qb=function Nzd(){Eyd(this);this.a=BD(Ajd(this.b.a,4),126)};var r4=mdb(Tte,'ArrayDelegatingEList/EIterator',1038);bcb(706,278,jie,Pzd,Qzd);_.mj=function Rzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};_.pj=function Szd(a){Nyd(this,a);this.a=BD(Ajd(this.b.a,4),126)};_.Qb=function Tzd(){Eyd(this);this.a=BD(Ajd(this.b.a,4),126)};var s4=mdb(Tte,'ArrayDelegatingEList/EListIterator',706);bcb(1039,341,aie,Uzd);_.mj=function Vzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};var t4=mdb(Tte,'ArrayDelegatingEList/NonResolvingEIterator',1039);bcb(707,385,jie,Xzd,Yzd);_.mj=function Zzd(){if(this.b.j!=this.f||PD(BD(Ajd(this.b.a,4),126))!==PD(this.a)){throw vbb(new Apb)}};var u4=mdb(Tte,'ArrayDelegatingEList/NonResolvingEListIterator',707);bcb(606,295,Mje,$zd);var w4=mdb(Tte,'BasicEList/BasicIndexOutOfBoundsException',606);bcb(696,63,oue,_zd);_.Vc=function aAd(a,b){throw vbb(new bgb)};_.Fc=function bAd(a){throw vbb(new bgb)};_.Wc=function cAd(a,b){throw vbb(new bgb)};_.Gc=function dAd(a){throw vbb(new bgb)};_.$b=function eAd(){throw vbb(new bgb)};_.qi=function fAd(a){throw vbb(new bgb)};_.Kc=function gAd(){return this.Zh()};_.Yc=function hAd(){return this.$h()};_.Zc=function iAd(a){return this._h(a)};_.ii=function jAd(a,b){throw vbb(new bgb)};_.ji=function kAd(a,b){throw vbb(new bgb)};_.$c=function lAd(a){throw vbb(new bgb)};_.Mc=function mAd(a){throw vbb(new bgb)};_._c=function nAd(a,b){throw vbb(new bgb)};var x4=mdb(Tte,'BasicEList/UnmodifiableEList',696);bcb(705,1,{3:1,20:1,14:1,15:1,58:1,589:1});_.Vc=function OAd(a,b){oAd(this,a,BD(b,42))};_.Fc=function PAd(a){return pAd(this,BD(a,42))};_.Jc=function XAd(a){reb(this,a)};_.Xb=function YAd(a){return BD(qud(this.c,a),133)};_.ii=function fBd(a,b){return BD(this.c.ii(a,b),42)};_.ji=function gBd(a,b){GAd(this,a,BD(b,42))};_.Lc=function jBd(){return new YAb(null,new Kub(this,16))};_.$c=function kBd(a){return BD(this.c.$c(a),42)};_._c=function mBd(a,b){return MAd(this,a,BD(b,42))};_.ad=function oBd(a){ktb(this,a)};_.Nc=function pBd(){return new Kub(this,16)};_.Oc=function qBd(){return new YAb(null,new Kub(this,16))};_.Wc=function QAd(a,b){return this.c.Wc(a,b)};_.Gc=function RAd(a){return this.c.Gc(a)};_.$b=function SAd(){this.c.$b()};_.Hc=function TAd(a){return this.c.Hc(a)};_.Ic=function UAd(a){return Be(this.c,a)};_.qj=function VAd(){var a,b,c;if(this.d==null){this.d=KC(y4,jve,63,2*this.f+1,0,1);c=this.e;this.f=0;for(b=this.c.Kc();b.e!=b.i.gc();){a=BD(b.nj(),133);uAd(this,a)}this.e=c}};_.Fb=function WAd(a){return zAd(this,a)};_.Hb=function ZAd(){return Etd(this.c)};_.Xc=function $Ad(a){return this.c.Xc(a)};_.rj=function _Ad(){this.c=new yBd(this)};_.dc=function aBd(){return this.f==0};_.Kc=function bBd(){return this.c.Kc()};_.Yc=function cBd(){return this.c.Yc()};_.Zc=function dBd(a){return this.c.Zc(a)};_.sj=function eBd(){return FAd(this)};_.tj=function hBd(a,b,c){return new zCd(a,b,c)};_.uj=function iBd(){return new EBd};_.Mc=function lBd(a){return JAd(this,a)};_.gc=function nBd(){return this.f};_.bd=function rBd(a,b){return new Jib(this.c,a,b)};_.Pc=function sBd(){return this.c.Pc()};_.Qc=function tBd(a){return this.c.Qc(a)};_.Ib=function uBd(){return Htd(this.c)};_.e=0;_.f=0;var L4=mdb(Tte,'BasicEMap',705);bcb(1033,63,oue,yBd);_.bi=function zBd(a,b){vBd(this,BD(b,133))};_.ei=function BBd(a,b,c){var d;++(d=this,BD(b,133),d).a.e};_.fi=function CBd(a,b){wBd(this,BD(b,133))};_.gi=function DBd(a,b,c){xBd(this,BD(b,133),BD(c,133))};_.di=function ABd(a,b){tAd(this.a)};var z4=mdb(Tte,'BasicEMap/1',1033);bcb(1034,63,oue,EBd);_.ri=function FBd(a){return KC(I4,kve,612,a,0,1)};var A4=mdb(Tte,'BasicEMap/2',1034);bcb(1035,eie,fie,GBd);_.$b=function HBd(){this.a.c.$b()};_.Hc=function IBd(a){return qAd(this.a,a)};_.Kc=function JBd(){return this.a.f==0?(LCd(),KCd.a):new dCd(this.a)};_.Mc=function KBd(a){var b;b=this.a.f;LAd(this.a,a);return this.a.f!=b};_.gc=function LBd(){return this.a.f};var B4=mdb(Tte,'BasicEMap/3',1035);bcb(1036,28,die,MBd);_.$b=function NBd(){this.a.c.$b()};_.Hc=function OBd(a){return rAd(this.a,a)};_.Kc=function PBd(){return this.a.f==0?(LCd(),KCd.a):new fCd(this.a)};_.gc=function QBd(){return this.a.f};var C4=mdb(Tte,'BasicEMap/4',1036);bcb(1037,eie,fie,SBd);_.$b=function TBd(){this.a.c.$b()};_.Hc=function UBd(a){var b,c,d,e,f,g,h,i,j;if(this.a.f>0&&JD(a,42)){this.a.qj();i=BD(a,42);h=i.cd();e=h==null?0:tb(h);f=DAd(this.a,e);b=this.a.d[f];if(b){c=BD(b.g,367);j=b.i;for(g=0;g'+this.c};_.a=0;var I4=mdb(Tte,'BasicEMap/EntryImpl',612);bcb(536,1,{},JCd);var K4=mdb(Tte,'BasicEMap/View',536);var KCd;bcb(768,1,{});_.Fb=function ZCd(a){return At((mmb(),jmb),a)};_.Hb=function $Cd(){return qmb((mmb(),jmb))};_.Ib=function _Cd(){return Fe((mmb(),jmb))};var Q4=mdb(Tte,'ECollections/BasicEmptyUnmodifiableEList',768);bcb(1312,1,jie,aDd);_.Nb=function cDd(a){Rrb(this,a)};_.Rb=function bDd(a){throw vbb(new bgb)};_.Ob=function dDd(){return false};_.Sb=function eDd(){return false};_.Pb=function fDd(){throw vbb(new utb)};_.Tb=function gDd(){return 0};_.Ub=function hDd(){throw vbb(new utb)};_.Vb=function iDd(){return -1};_.Qb=function jDd(){throw vbb(new bgb)};_.Wb=function kDd(a){throw vbb(new bgb)};var P4=mdb(Tte,'ECollections/BasicEmptyUnmodifiableEList/1',1312);bcb(1310,768,{20:1,14:1,15:1,58:1},lDd);_.Vc=function mDd(a,b){OCd()};_.Fc=function nDd(a){return PCd()};_.Wc=function oDd(a,b){return QCd()};_.Gc=function pDd(a){return RCd()};_.$b=function qDd(){SCd()};_.Hc=function rDd(a){return false};_.Ic=function sDd(a){return false};_.Jc=function tDd(a){reb(this,a)};_.Xb=function uDd(a){return wmb((mmb(),jmb,a)),null};_.Xc=function vDd(a){return -1};_.dc=function wDd(){return true};_.Kc=function xDd(){return this.a};_.Yc=function yDd(){return this.a};_.Zc=function zDd(a){return this.a};_.ii=function ADd(a,b){return TCd()};_.ji=function BDd(a,b){UCd()};_.Lc=function CDd(){return new YAb(null,new Kub(this,16))};_.$c=function DDd(a){return VCd()};_.Mc=function EDd(a){return WCd()};_._c=function FDd(a,b){return XCd()};_.gc=function GDd(){return 0};_.ad=function HDd(a){ktb(this,a)};_.Nc=function IDd(){return new Kub(this,16)};_.Oc=function JDd(){return new YAb(null,new Kub(this,16))};_.bd=function KDd(a,b){return mmb(),new Jib(jmb,a,b)};_.Pc=function LDd(){return De((mmb(),jmb))};_.Qc=function MDd(a){return mmb(),Ee(jmb,a)};var R4=mdb(Tte,'ECollections/EmptyUnmodifiableEList',1310);bcb(1311,768,{20:1,14:1,15:1,58:1,589:1},NDd);_.Vc=function ODd(a,b){OCd()};_.Fc=function PDd(a){return PCd()};_.Wc=function QDd(a,b){return QCd()};_.Gc=function RDd(a){return RCd()};_.$b=function SDd(){SCd()};_.Hc=function TDd(a){return false};_.Ic=function UDd(a){return false};_.Jc=function VDd(a){reb(this,a)};_.Xb=function WDd(a){return wmb((mmb(),jmb,a)),null};_.Xc=function XDd(a){return -1};_.dc=function YDd(){return true};_.Kc=function ZDd(){return this.a};_.Yc=function $Dd(){return this.a};_.Zc=function _Dd(a){return this.a};_.ii=function bEd(a,b){return TCd()};_.ji=function cEd(a,b){UCd()};_.Lc=function dEd(){return new YAb(null,new Kub(this,16))};_.$c=function eEd(a){return VCd()};_.Mc=function fEd(a){return WCd()};_._c=function gEd(a,b){return XCd()};_.gc=function hEd(){return 0};_.ad=function iEd(a){ktb(this,a)};_.Nc=function jEd(){return new Kub(this,16)};_.Oc=function kEd(){return new YAb(null,new Kub(this,16))};_.bd=function lEd(a,b){return mmb(),new Jib(jmb,a,b)};_.Pc=function mEd(){return De((mmb(),jmb))};_.Qc=function nEd(a){return mmb(),Ee(jmb,a)};_.sj=function aEd(){return mmb(),mmb(),kmb};var S4=mdb(Tte,'ECollections/EmptyUnmodifiableEMap',1311);var U4=odb(Tte,'Enumerator');var oEd;bcb(281,1,{281:1},NEd);_.Fb=function REd(a){var b;if(this===a)return true;if(!JD(a,281))return false;b=BD(a,281);return this.f==b.f&&TEd(this.i,b.i)&&SEd(this.a,(this.f&256)!=0?(b.f&256)!=0?b.a:null:(b.f&256)!=0?null:b.a)&&SEd(this.d,b.d)&&SEd(this.g,b.g)&&SEd(this.e,b.e)&&KEd(this,b)};_.Hb=function WEd(){return this.f};_.Ib=function cFd(){return LEd(this)};_.f=0;var sEd=0,tEd=0,uEd=0,vEd=0,wEd=0,xEd=0,yEd=0,zEd=0,AEd=0,BEd,CEd=0,DEd=0,EEd=0,FEd=0,GEd,HEd;var Z4=mdb(Tte,'URI',281);bcb(1091,43,fke,mFd);_.zc=function nFd(a,b){return BD(Shb(this,GD(a),BD(b,281)),281)};var Y4=mdb(Tte,'URI/URICache',1091);bcb(497,63,oue,oFd,pFd);_.hi=function qFd(){return true};var $4=mdb(Tte,'UniqueEList',497);bcb(581,60,Tie,rFd);var _4=mdb(Tte,'WrappedException',581);var a5=odb(Vse,nve);var v5=odb(Vse,ove);var t5=odb(Vse,pve);var b5=odb(Vse,qve);var d5=odb(Vse,rve);var c5=odb(Vse,'EClass');var f5=odb(Vse,'EDataType');var sFd;bcb(1183,43,fke,vFd);_.xc=function wFd(a){return ND(a)?Phb(this,a):Wd(irb(this.f,a))};var e5=mdb(Vse,'EDataType/Internal/ConversionDelegate/Factory/Registry/Impl',1183);var h5=odb(Vse,'EEnum');var g5=odb(Vse,sve);var j5=odb(Vse,tve);var n5=odb(Vse,uve);var xFd;var p5=odb(Vse,vve);var q5=odb(Vse,wve);bcb(1029,1,{},BFd);_.Ib=function CFd(){return 'NIL'};var r5=mdb(Vse,'EStructuralFeature/Internal/DynamicValueHolder/1',1029);var DFd;bcb(1028,43,fke,GFd);_.xc=function HFd(a){return ND(a)?Phb(this,a):Wd(irb(this.f,a))};var s5=mdb(Vse,'EStructuralFeature/Internal/SettingDelegate/Factory/Registry/Impl',1028);var u5=odb(Vse,xve);var w5=odb(Vse,'EValidator/PatternMatcher');var IFd;var KFd;var MFd;var OFd,PFd,QFd,RFd,SFd,TFd,UFd,VFd,WFd,XFd,YFd,ZFd,$Fd,_Fd,aGd,bGd,cGd,dGd,eGd,fGd,gGd,hGd,iGd;var E9=odb(yve,'FeatureMap/Entry');bcb(535,1,{72:1},kGd);_.ak=function lGd(){return this.a};_.dd=function mGd(){return this.b};var x5=mdb(qte,'BasicEObjectImpl/1',535);bcb(1027,1,zve,nGd);_.Wj=function oGd(a){return hid(this.a,this.b,a)};_.fj=function pGd(){return nid(this.a,this.b)};_.Wb=function qGd(a){zid(this.a,this.b,a)};_.Xj=function rGd(){Did(this.a,this.b)};var y5=mdb(qte,'BasicEObjectImpl/4',1027);bcb(1983,1,{108:1});_.bk=function uGd(a){this.e=a==0?sGd:KC(SI,Uhe,1,a,5,1)};_.Ch=function vGd(a){return this.e[a]};_.Dh=function wGd(a,b){this.e[a]=b};_.Eh=function xGd(a){this.e[a]=null};_.ck=function yGd(){return this.c};_.dk=function zGd(){throw vbb(new bgb)};_.ek=function AGd(){throw vbb(new bgb)};_.fk=function BGd(){return this.d};_.gk=function CGd(){return this.e!=null};_.hk=function DGd(a){this.c=a};_.ik=function EGd(a){throw vbb(new bgb)};_.jk=function FGd(a){throw vbb(new bgb)};_.kk=function GGd(a){this.d=a};var sGd;var z5=mdb(qte,'BasicEObjectImpl/EPropertiesHolderBaseImpl',1983);bcb(185,1983,{108:1},HGd);_.dk=function IGd(){return this.a};_.ek=function JGd(){return this.b};_.ik=function KGd(a){this.a=a};_.jk=function LGd(a){this.b=a};var A5=mdb(qte,'BasicEObjectImpl/EPropertiesHolderImpl',185);bcb(506,97,pte,MGd);_.Kg=function NGd(){return this.f};_.Pg=function OGd(){return this.k};_.Rg=function PGd(a,b){this.g=a;this.i=b};_.Tg=function QGd(){return (this.j&2)==0?this.zh():this.ph().ck()};_.Vg=function RGd(){return this.i};_.Mg=function SGd(){return (this.j&1)!=0};_.eh=function TGd(){return this.g};_.kh=function UGd(){return (this.j&4)!=0};_.ph=function VGd(){return !this.k&&(this.k=new HGd),this.k};_.th=function WGd(a){this.ph().hk(a);a?(this.j|=2):(this.j&=-3)};_.vh=function XGd(a){this.ph().jk(a);a?(this.j|=4):(this.j&=-5)};_.zh=function YGd(){return (NFd(),MFd).S};_.i=0;_.j=1;var l6=mdb(qte,'EObjectImpl',506);bcb(780,506,{105:1,92:1,90:1,56:1,108:1,49:1,97:1},_Gd);_.Ch=function aHd(a){return this.e[a]};_.Dh=function bHd(a,b){this.e[a]=b};_.Eh=function cHd(a){this.e[a]=null};_.Tg=function dHd(){return this.d};_.Yg=function eHd(a){return bLd(this.d,a)};_.$g=function fHd(){return this.d};_.dh=function gHd(){return this.e!=null};_.ph=function hHd(){!this.k&&(this.k=new vHd);return this.k};_.th=function iHd(a){this.d=a};_.yh=function jHd(){var a;if(this.e==null){a=aLd(this.d);this.e=a==0?ZGd:KC(SI,Uhe,1,a,5,1)}return this};_.Ah=function kHd(){return 0};var ZGd;var E5=mdb(qte,'DynamicEObjectImpl',780);bcb(1376,780,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1},lHd);_.Fb=function nHd(a){return this===a};_.Hb=function rHd(){return FCb(this)};_.th=function mHd(a){this.d=a;this.b=YKd(a,'key');this.c=YKd(a,Bte)};_.Sh=function oHd(){var a;if(this.a==-1){a=iid(this,this.b);this.a=a==null?0:tb(a)}return this.a};_.cd=function pHd(){return iid(this,this.b)};_.dd=function qHd(){return iid(this,this.c)};_.Th=function sHd(a){this.a=a};_.Uh=function tHd(a){zid(this,this.b,a)};_.ed=function uHd(a){var b;b=iid(this,this.c);zid(this,this.c,a);return b};_.a=0;var C5=mdb(qte,'DynamicEObjectImpl/BasicEMapEntry',1376);bcb(1377,1,{108:1},vHd);_.bk=function wHd(a){throw vbb(new bgb)};_.Ch=function xHd(a){throw vbb(new bgb)};_.Dh=function yHd(a,b){throw vbb(new bgb)};_.Eh=function zHd(a){throw vbb(new bgb)};_.ck=function AHd(){throw vbb(new bgb)};_.dk=function BHd(){return this.a};_.ek=function CHd(){return this.b};_.fk=function DHd(){return this.c};_.gk=function EHd(){throw vbb(new bgb)};_.hk=function FHd(a){throw vbb(new bgb)};_.ik=function GHd(a){this.a=a};_.jk=function HHd(a){this.b=a};_.kk=function IHd(a){this.c=a};var D5=mdb(qte,'DynamicEObjectImpl/DynamicEPropertiesHolderImpl',1377);bcb(510,150,{105:1,92:1,90:1,590:1,147:1,56:1,108:1,49:1,97:1,510:1,150:1,114:1,115:1},RHd);_.Qg=function SHd(a){return KHd(this,a)};_._g=function THd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.d;case 2:return c?(!this.b&&(this.b=new sId((jGd(),fGd),x6,this)),this.b):(!this.b&&(this.b=new sId((jGd(),fGd),x6,this)),FAd(this.b));case 3:return MHd(this);case 4:return !this.a&&(this.a=new xMd(m5,this,4)),this.a;case 5:return !this.c&&(this.c=new _4d(m5,this,5)),this.c;}return bid(this,a-aLd((jGd(),OFd)),XKd((d=BD(Ajd(this,16),26),!d?OFd:d),a),b,c)};_.hh=function UHd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 3:!!this.Cb&&(c=(e=this.Db>>16,e>=0?KHd(this,c):this.Cb.ih(this,-1-e,null,c)));return JHd(this,BD(a,147),c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),OFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),OFd)),a,c)};_.jh=function VHd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 2:return !this.b&&(this.b=new sId((jGd(),fGd),x6,this)),bId(this.b,a,c);case 3:return JHd(this,null,c);case 4:return !this.a&&(this.a=new xMd(m5,this,4)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),OFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),OFd)),a,c)};_.lh=function WHd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.d!=null;case 2:return !!this.b&&this.b.f!=0;case 3:return !!MHd(this);case 4:return !!this.a&&this.a.i!=0;case 5:return !!this.c&&this.c.i!=0;}return cid(this,a-aLd((jGd(),OFd)),XKd((b=BD(Ajd(this,16),26),!b?OFd:b),a))};_.sh=function XHd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:OHd(this,GD(b));return;case 2:!this.b&&(this.b=new sId((jGd(),fGd),x6,this));cId(this.b,b);return;case 3:NHd(this,BD(b,147));return;case 4:!this.a&&(this.a=new xMd(m5,this,4));Uxd(this.a);!this.a&&(this.a=new xMd(m5,this,4));ytd(this.a,BD(b,14));return;case 5:!this.c&&(this.c=new _4d(m5,this,5));Uxd(this.c);!this.c&&(this.c=new _4d(m5,this,5));ytd(this.c,BD(b,14));return;}did(this,a-aLd((jGd(),OFd)),XKd((c=BD(Ajd(this,16),26),!c?OFd:c),a),b)};_.zh=function YHd(){return jGd(),OFd};_.Bh=function ZHd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:PHd(this,null);return;case 2:!this.b&&(this.b=new sId((jGd(),fGd),x6,this));this.b.c.$b();return;case 3:NHd(this,null);return;case 4:!this.a&&(this.a=new xMd(m5,this,4));Uxd(this.a);return;case 5:!this.c&&(this.c=new _4d(m5,this,5));Uxd(this.c);return;}eid(this,a-aLd((jGd(),OFd)),XKd((b=BD(Ajd(this,16),26),!b?OFd:b),a))};_.Ib=function $Hd(){return QHd(this)};_.d=null;var G5=mdb(qte,'EAnnotationImpl',510);bcb(151,705,Ave,dId);_.Xh=function eId(a,b){_Hd(this,a,BD(b,42))};_.lk=function fId(a,b){return aId(this,BD(a,42),b)};_.pi=function gId(a){return BD(BD(this.c,69).pi(a),133)};_.Zh=function hId(){return BD(this.c,69).Zh()};_.$h=function iId(){return BD(this.c,69).$h()};_._h=function jId(a){return BD(this.c,69)._h(a)};_.mk=function kId(a,b){return bId(this,a,b)};_.Wj=function lId(a){return BD(this.c,76).Wj(a)};_.rj=function mId(){};_.fj=function nId(){return BD(this.c,76).fj()};_.tj=function oId(a,b,c){var d;d=BD(bKd(this.b).Nh().Jh(this.b),133);d.Th(a);d.Uh(b);d.ed(c);return d};_.uj=function pId(){return new W5d(this)};_.Wb=function qId(a){cId(this,a)};_.Xj=function rId(){BD(this.c,76).Xj()};var y9=mdb(yve,'EcoreEMap',151);bcb(158,151,Ave,sId);_.qj=function tId(){var a,b,c,d,e,f;if(this.d==null){f=KC(y4,jve,63,2*this.f+1,0,1);for(c=this.c.Kc();c.e!=c.i.gc();){b=BD(c.nj(),133);d=b.Sh();e=(d&Ohe)%f.length;a=f[e];!a&&(a=f[e]=new W5d(this));a.Fc(b)}this.d=f}};var F5=mdb(qte,'EAnnotationImpl/1',158);bcb(284,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,472:1,49:1,97:1,150:1,284:1,114:1,115:1});_._g=function GId(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),this.$j()?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.jh=function HId(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function IId(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return this.$j();case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function JId(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:this.Lh(GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:this.ok(BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function KId(){return jGd(),hGd};_.Bh=function LId(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:this.Lh(null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.ok(1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function MId(){wId(this);this.Bb|=1};_.Yj=function NId(){return wId(this)};_.Zj=function OId(){return this.t};_.$j=function PId(){var a;return a=this.t,a>1||a==-1};_.hi=function QId(){return (this.Bb&512)!=0};_.nk=function RId(a,b){return zId(this,a,b)};_.ok=function SId(a){DId(this,a)};_.Ib=function TId(){return EId(this)};_.s=0;_.t=1;var v7=mdb(qte,'ETypedElementImpl',284);bcb(449,284,{105:1,92:1,90:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,449:1,284:1,114:1,115:1,677:1});_.Qg=function iJd(a){return UId(this,a)};_._g=function jJd(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),this.$j()?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function kJd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 17:!!this.Cb&&(c=(e=this.Db>>16,e>=0?UId(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,17,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),f.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function lJd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 17:return _hd(this,null,17,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function mJd(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return this.$j();case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function nJd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:this.ok(BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function oJd(){return jGd(),gGd};_.Bh=function pJd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.ok(1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.Gh=function qJd(){a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.Gj=function rJd(){return this.f};_.zj=function sJd(){return VId(this)};_.Hj=function tJd(){return WId(this)};_.Lj=function uJd(){return null};_.pk=function vJd(){return this.k};_.aj=function wJd(){return this.n};_.Mj=function xJd(){return XId(this)};_.Nj=function yJd(){var a,b,c,d,e,f,g,h,i;if(!this.p){c=WId(this);(c.i==null&&TKd(c),c.i).length;d=this.Lj();!!d&&aLd(WId(d));e=wId(this);g=e.Bj();a=!g?null:(g.i&1)!=0?g==sbb?wI:g==WD?JI:g==VD?FI:g==UD?BI:g==XD?MI:g==rbb?UI:g==SD?xI:yI:g;b=VId(this);h=e.zj();n6d(this);(this.Bb&oie)!=0&&(!!(f=t1d((O6d(),M6d),c))&&f!=this||!!(f=_1d(q1d(M6d,this))))?(this.p=new zVd(this,f)):this.$j()?this.rk()?!d?(this.Bb&Cve)!=0?!a?this.sk()?(this.p=new KVd(42,this)):(this.p=new KVd(0,this)):a==CK?(this.p=new IVd(50,J4,this)):this.sk()?(this.p=new IVd(43,a,this)):(this.p=new IVd(1,a,this)):!a?this.sk()?(this.p=new KVd(44,this)):(this.p=new KVd(2,this)):a==CK?(this.p=new IVd(41,J4,this)):this.sk()?(this.p=new IVd(45,a,this)):(this.p=new IVd(3,a,this)):(this.Bb&Cve)!=0?!a?this.sk()?(this.p=new LVd(46,this,d)):(this.p=new LVd(4,this,d)):this.sk()?(this.p=new JVd(47,a,this,d)):(this.p=new JVd(5,a,this,d)):!a?this.sk()?(this.p=new LVd(48,this,d)):(this.p=new LVd(6,this,d)):this.sk()?(this.p=new JVd(49,a,this,d)):(this.p=new JVd(7,a,this,d)):JD(e,148)?a==E9?(this.p=new KVd(40,this)):(this.Bb&512)!=0?(this.Bb&Cve)!=0?!a?(this.p=new KVd(8,this)):(this.p=new IVd(9,a,this)):!a?(this.p=new KVd(10,this)):(this.p=new IVd(11,a,this)):(this.Bb&Cve)!=0?!a?(this.p=new KVd(12,this)):(this.p=new IVd(13,a,this)):!a?(this.p=new KVd(14,this)):(this.p=new IVd(15,a,this)):!d?this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new KVd(16,this)):(this.p=new IVd(17,a,this)):!a?(this.p=new KVd(18,this)):(this.p=new IVd(19,a,this)):(this.Bb&Cve)!=0?!a?(this.p=new KVd(20,this)):(this.p=new IVd(21,a,this)):!a?(this.p=new KVd(22,this)):(this.p=new IVd(23,a,this)):(i=d.t,i>1||i==-1?this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new LVd(24,this,d)):(this.p=new JVd(25,a,this,d)):!a?(this.p=new LVd(26,this,d)):(this.p=new JVd(27,a,this,d)):(this.Bb&Cve)!=0?!a?(this.p=new LVd(28,this,d)):(this.p=new JVd(29,a,this,d)):!a?(this.p=new LVd(30,this,d)):(this.p=new JVd(31,a,this,d)):this.sk()?(this.Bb&Cve)!=0?!a?(this.p=new LVd(32,this,d)):(this.p=new JVd(33,a,this,d)):!a?(this.p=new LVd(34,this,d)):(this.p=new JVd(35,a,this,d)):(this.Bb&Cve)!=0?!a?(this.p=new LVd(36,this,d)):(this.p=new JVd(37,a,this,d)):!a?(this.p=new LVd(38,this,d)):(this.p=new JVd(39,a,this,d))):this.qk()?this.sk()?(this.p=new kWd(BD(e,26),this,d)):(this.p=new cWd(BD(e,26),this,d)):JD(e,148)?a==E9?(this.p=new KVd(40,this)):(this.Bb&Cve)!=0?!a?(this.p=new jXd(BD(e,148),b,h,this)):(this.p=new lXd(b,h,this,(CWd(),g==WD?yWd:g==sbb?tWd:g==XD?zWd:g==VD?xWd:g==UD?wWd:g==rbb?BWd:g==SD?uWd:g==TD?vWd:AWd))):!a?(this.p=new cXd(BD(e,148),b,h,this)):(this.p=new eXd(b,h,this,(CWd(),g==WD?yWd:g==sbb?tWd:g==XD?zWd:g==VD?xWd:g==UD?wWd:g==rbb?BWd:g==SD?uWd:g==TD?vWd:AWd))):this.rk()?!d?(this.Bb&Cve)!=0?this.sk()?(this.p=new FXd(BD(e,26),this)):(this.p=new DXd(BD(e,26),this)):this.sk()?(this.p=new BXd(BD(e,26),this)):(this.p=new zXd(BD(e,26),this)):(this.Bb&Cve)!=0?this.sk()?(this.p=new NXd(BD(e,26),this,d)):(this.p=new LXd(BD(e,26),this,d)):this.sk()?(this.p=new JXd(BD(e,26),this,d)):(this.p=new HXd(BD(e,26),this,d)):this.sk()?!d?(this.Bb&Cve)!=0?(this.p=new RXd(BD(e,26),this)):(this.p=new PXd(BD(e,26),this)):(this.Bb&Cve)!=0?(this.p=new VXd(BD(e,26),this,d)):(this.p=new TXd(BD(e,26),this,d)):!d?(this.Bb&Cve)!=0?(this.p=new XXd(BD(e,26),this)):(this.p=new nXd(BD(e,26),this)):(this.Bb&Cve)!=0?(this.p=new _Xd(BD(e,26),this,d)):(this.p=new ZXd(BD(e,26),this,d))}return this.p};_.Ij=function zJd(){return (this.Bb&zte)!=0};_.qk=function AJd(){return false};_.rk=function BJd(){return false};_.Jj=function CJd(){return (this.Bb&oie)!=0};_.Oj=function DJd(){return YId(this)};_.sk=function EJd(){return false};_.Kj=function FJd(){return (this.Bb&Cve)!=0};_.tk=function GJd(a){this.k=a};_.Lh=function HJd(a){cJd(this,a)};_.Ib=function IJd(){return gJd(this)};_.e=false;_.n=0;var n7=mdb(qte,'EStructuralFeatureImpl',449);bcb(322,449,{105:1,92:1,90:1,34:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,322:1,150:1,449:1,284:1,114:1,115:1,677:1},OJd);_._g=function PJd(a,b,c){var d,e;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),LJd(this)?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);case 18:return Bcb(),(this.Bb&ote)!=0?true:false;case 19:if(b)return KJd(this);return JJd(this);}return bid(this,a-aLd((jGd(),PFd)),XKd((d=BD(Ajd(this,16),26),!d?PFd:d),a),b,c)};_.lh=function QJd(a){var b,c;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return LJd(this);case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);case 18:return (this.Bb&ote)!=0;case 19:return !!JJd(this);}return cid(this,a-aLd((jGd(),PFd)),XKd((b=BD(Ajd(this,16),26),!b?PFd:b),a))};_.sh=function RJd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:NJd(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;case 18:MJd(this,Ccb(DD(b)));return;}did(this,a-aLd((jGd(),PFd)),XKd((c=BD(Ajd(this,16),26),!c?PFd:c),a),b)};_.zh=function SJd(){return jGd(),PFd};_.Bh=function TJd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:this.b=0;DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;case 18:MJd(this,false);return;}eid(this,a-aLd((jGd(),PFd)),XKd((b=BD(Ajd(this,16),26),!b?PFd:b),a))};_.Gh=function UJd(){KJd(this);a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.$j=function VJd(){return LJd(this)};_.nk=function WJd(a,b){this.b=0;this.a=null;return zId(this,a,b)};_.ok=function XJd(a){NJd(this,a)};_.Ib=function YJd(){var a;if((this.Db&64)!=0)return gJd(this);a=new Jfb(gJd(this));a.a+=' (iD: ';Ffb(a,(this.Bb&ote)!=0);a.a+=')';return a.a};_.b=0;var H5=mdb(qte,'EAttributeImpl',322);bcb(351,438,{105:1,92:1,90:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,150:1,114:1,115:1,676:1});_.uk=function nKd(a){return a.Tg()==this};_.Qg=function oKd(a){return aKd(this,a)};_.Rg=function pKd(a,b){this.w=null;this.Db=b<<16|this.Db&255;this.Cb=a};_._g=function qKd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.D!=null?this.D:this.B;case 3:return dKd(this);case 4:return this.zj();case 5:return this.F;case 6:if(b)return bKd(this);return ZJd(this);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),this.A;}return bid(this,a-aLd(this.zh()),XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),a),b,c)};_.hh=function rKd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),f.Nj().Qj(this,yjd(this),b-aLd(this.zh()),a,c)};_.jh=function sKd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?this.zh():d),b),66),e.Nj().Rj(this,yjd(this),b-aLd(this.zh()),a,c)};_.lh=function tKd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return this.zj()!=null;case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;}return cid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.sh=function uKd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;}did(this,a-aLd(this.zh()),XKd((c=BD(Ajd(this,16),26),!c?this.zh():c),a),b)};_.zh=function vKd(){return jGd(),RFd};_.Bh=function wKd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;}eid(this,a-aLd(this.zh()),XKd((b=BD(Ajd(this,16),26),!b?this.zh():b),a))};_.yj=function xKd(){var a;return this.G==-1&&(this.G=(a=bKd(this),a?HLd(a.Mh(),this):-1)),this.G};_.zj=function yKd(){return null};_.Aj=function zKd(){return bKd(this)};_.vk=function AKd(){return this.v};_.Bj=function BKd(){return dKd(this)};_.Cj=function CKd(){return this.D!=null?this.D:this.B};_.Dj=function DKd(){return this.F};_.wj=function EKd(a){return fKd(this,a)};_.wk=function FKd(a){this.v=a};_.xk=function GKd(a){gKd(this,a)};_.yk=function HKd(a){this.C=a};_.Lh=function IKd(a){lKd(this,a)};_.Ib=function JKd(){return mKd(this)};_.C=null;_.D=null;_.G=-1;var Z5=mdb(qte,'EClassifierImpl',351);bcb(88,351,{105:1,92:1,90:1,26:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,88:1,351:1,150:1,473:1,114:1,115:1,676:1},hLd);_.uk=function iLd(a){return dLd(this,a.Tg())};_._g=function jLd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.D!=null?this.D:this.B;case 3:return dKd(this);case 4:return null;case 5:return this.F;case 6:if(b)return bKd(this);return ZJd(this);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),this.A;case 8:return Bcb(),(this.Bb&256)!=0?true:false;case 9:return Bcb(),(this.Bb&512)!=0?true:false;case 10:return _Kd(this);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),this.q;case 12:return OKd(this);case 13:return SKd(this);case 14:return SKd(this),this.r;case 15:return OKd(this),this.k;case 16:return PKd(this);case 17:return RKd(this);case 18:return TKd(this);case 19:return UKd(this);case 20:return OKd(this),this.o;case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),this.s;case 22:return VKd(this);case 23:return QKd(this);}return bid(this,a-aLd((jGd(),QFd)),XKd((d=BD(Ajd(this,16),26),!d?QFd:d),a),b,c)};_.hh=function kLd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 6:!!this.Cb&&(c=(e=this.Db>>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),Sxd(this.q,a,c);case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),Sxd(this.s,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),QFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),QFd)),a,c)};_.jh=function lLd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);case 11:return !this.q&&(this.q=new cUd(n5,this,11,10)),Txd(this.q,a,c);case 21:return !this.s&&(this.s=new cUd(t5,this,21,17)),Txd(this.s,a,c);case 22:return Txd(VKd(this),a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),QFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),QFd)),a,c)};_.lh=function mLd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return false;case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;case 8:return (this.Bb&256)!=0;case 9:return (this.Bb&512)!=0;case 10:return !!this.u&&VKd(this.u.a).i!=0&&!(!!this.n&&FMd(this.n));case 11:return !!this.q&&this.q.i!=0;case 12:return OKd(this).i!=0;case 13:return SKd(this).i!=0;case 14:return SKd(this),this.r.i!=0;case 15:return OKd(this),this.k.i!=0;case 16:return PKd(this).i!=0;case 17:return RKd(this).i!=0;case 18:return TKd(this).i!=0;case 19:return UKd(this).i!=0;case 20:return OKd(this),!!this.o;case 21:return !!this.s&&this.s.i!=0;case 22:return !!this.n&&FMd(this.n);case 23:return QKd(this).i!=0;}return cid(this,a-aLd((jGd(),QFd)),XKd((b=BD(Ajd(this,16),26),!b?QFd:b),a))};_.oh=function nLd(a){var b;b=this.i==null||!!this.q&&this.q.i!=0?null:YKd(this,a);return b?b:Bmd(this,a)};_.sh=function oLd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;case 8:eLd(this,Ccb(DD(b)));return;case 9:fLd(this,Ccb(DD(b)));return;case 10:vwd(_Kd(this));ytd(_Kd(this),BD(b,14));return;case 11:!this.q&&(this.q=new cUd(n5,this,11,10));Uxd(this.q);!this.q&&(this.q=new cUd(n5,this,11,10));ytd(this.q,BD(b,14));return;case 21:!this.s&&(this.s=new cUd(t5,this,21,17));Uxd(this.s);!this.s&&(this.s=new cUd(t5,this,21,17));ytd(this.s,BD(b,14));return;case 22:Uxd(VKd(this));ytd(VKd(this),BD(b,14));return;}did(this,a-aLd((jGd(),QFd)),XKd((c=BD(Ajd(this,16),26),!c?QFd:c),a),b)};_.zh=function pLd(){return jGd(),QFd};_.Bh=function qLd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;case 8:eLd(this,false);return;case 9:fLd(this,false);return;case 10:!!this.u&&vwd(this.u);return;case 11:!this.q&&(this.q=new cUd(n5,this,11,10));Uxd(this.q);return;case 21:!this.s&&(this.s=new cUd(t5,this,21,17));Uxd(this.s);return;case 22:!!this.n&&Uxd(this.n);return;}eid(this,a-aLd((jGd(),QFd)),XKd((b=BD(Ajd(this,16),26),!b?QFd:b),a))};_.Gh=function rLd(){var a,b;OKd(this);SKd(this);PKd(this);RKd(this);TKd(this);UKd(this);QKd(this);oud(SMd($Kd(this)));if(this.s){for(a=0,b=this.s.i;a=0;--b){qud(this,b)}}return xud(this,a)};_.Xj=function nMd(){Uxd(this)};_.oi=function oMd(a,b){return LLd(this,a,b)};var t9=mdb(yve,'EcoreEList',622);bcb(496,622,Pve,pMd);_.ai=function qMd(){return false};_.aj=function rMd(){return this.c};_.bj=function sMd(){return false};_.Fk=function tMd(){return true};_.hi=function uMd(){return true};_.li=function vMd(a,b){return b};_.ni=function wMd(){return false};_.c=0;var d9=mdb(yve,'EObjectEList',496);bcb(85,496,Pve,xMd);_.bj=function yMd(){return true};_.Dk=function zMd(){return false};_.rk=function AMd(){return true};var Z8=mdb(yve,'EObjectContainmentEList',85);bcb(545,85,Pve,BMd);_.ci=function CMd(){this.b=true};_.fj=function DMd(){return this.b};_.Xj=function EMd(){var a;Uxd(this);if(oid(this.e)){a=this.b;this.b=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.b=false}};_.b=false;var Y8=mdb(yve,'EObjectContainmentEList/Unsettable',545);bcb(1140,545,Pve,JMd);_.ii=function NMd(a,b){var c,d;return c=BD(Wxd(this,a,b),87),oid(this.e)&&GLd(this,new ESd(this.a,7,(jGd(),SFd),meb(b),(d=c.c,JD(d,88)?BD(d,26):_Fd),a)),c};_.jj=function OMd(a,b){return GMd(this,BD(a,87),b)};_.kj=function PMd(a,b){return HMd(this,BD(a,87),b)};_.lj=function QMd(a,b,c){return IMd(this,BD(a,87),BD(b,87),c)};_.Zi=function KMd(a,b,c,d,e){switch(a){case 3:{return FLd(this,a,b,c,d,this.i>1)}case 5:{return FLd(this,a,b,c,d,this.i-BD(c,15).gc()>0)}default:{return new pSd(this.e,a,this.c,b,c,d,true)}}};_.ij=function LMd(){return true};_.fj=function MMd(){return FMd(this)};_.Xj=function RMd(){Uxd(this)};var N5=mdb(qte,'EClassImpl/1',1140);bcb(1154,1153,dve);_.ui=function VMd(a){var b,c,d,e,f,g,h;c=a.xi();if(c!=8){d=UMd(a);if(d==0){switch(c){case 1:case 9:{h=a.Bi();if(h!=null){b=$Kd(BD(h,473));!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}g=a.zi();if(g!=null){e=BD(g,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}break}case 3:{g=a.zi();if(g!=null){e=BD(g,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}break}case 5:{g=a.zi();if(g!=null){for(f=BD(g,14).Kc();f.Ob();){e=BD(f.Pb(),473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);wtd(b.c,BD(a.Ai(),26))}}}break}case 4:{h=a.Bi();if(h!=null){e=BD(h,473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}}break}case 6:{h=a.Bi();if(h!=null){for(f=BD(h,14).Kc();f.Ob();){e=BD(f.Pb(),473);if((e.Bb&1)==0){b=$Kd(e);!b.c&&(b.c=new xYd);Ftd(b.c,a.Ai())}}}break}}}this.Hk(d)}};_.Hk=function WMd(a){TMd(this,a)};_.b=63;var p7=mdb(qte,'ESuperAdapter',1154);bcb(1155,1154,dve,YMd);_.Hk=function ZMd(a){XMd(this,a)};var I5=mdb(qte,'EClassImpl/10',1155);bcb(1144,696,Pve);_.Vh=function $Md(a,b){return iud(this,a,b)};_.Wh=function _Md(a){return jud(this,a)};_.Xh=function aNd(a,b){kud(this,a,b)};_.Yh=function bNd(a){lud(this,a)};_.pi=function dNd(a){return nud(this,a)};_.mi=function lNd(a,b){return uud(this,a,b)};_.lk=function cNd(a,b){throw vbb(new bgb)};_.Zh=function eNd(){return new $yd(this)};_.$h=function fNd(){return new bzd(this)};_._h=function gNd(a){return ztd(this,a)};_.mk=function hNd(a,b){throw vbb(new bgb)};_.Wj=function iNd(a){return this};_.fj=function jNd(){return this.i!=0};_.Wb=function kNd(a){throw vbb(new bgb)};_.Xj=function mNd(){throw vbb(new bgb)};var s9=mdb(yve,'EcoreEList/UnmodifiableEList',1144);bcb(319,1144,Pve,nNd);_.ni=function oNd(){return false};var r9=mdb(yve,'EcoreEList/UnmodifiableEList/FastCompare',319);bcb(1147,319,Pve,rNd);_.Xc=function sNd(a){var b,c,d;if(JD(a,170)){b=BD(a,170);c=b.aj();if(c!=-1){for(d=this.i;c4){if(this.wj(a)){if(this.rk()){d=BD(a,49);c=d.Ug();h=c==this.b&&(this.Dk()?d.Og(d.Vg(),BD(XKd(wjd(this.b),this.aj()).Yj(),26).Bj())==zUd(BD(XKd(wjd(this.b),this.aj()),18)).n:-1-d.Vg()==this.aj());if(this.Ek()&&!h&&!c&&!!d.Zg()){for(e=0;e1||d==-1)}else{return false}};_.Dk=function COd(){var a,b,c;b=XKd(wjd(this.b),this.aj());if(JD(b,99)){a=BD(b,18);c=zUd(a);return !!c}else{return false}};_.Ek=function DOd(){var a,b;b=XKd(wjd(this.b),this.aj());if(JD(b,99)){a=BD(b,18);return (a.Bb&Tje)!=0}else{return false}};_.Xc=function EOd(a){var b,c,d,e;d=this.Qi(a);if(d>=0)return d;if(this.Fk()){for(c=0,e=this.Vi();c=0;--a){nOd(this,a,this.Oi(a))}}return this.Wi()};_.Qc=function QOd(a){var b;if(this.Ek()){for(b=this.Vi()-1;b>=0;--b){nOd(this,b,this.Oi(b))}}return this.Xi(a)};_.Xj=function ROd(){vwd(this)};_.oi=function SOd(a,b){return pOd(this,a,b)};var K8=mdb(yve,'DelegatingEcoreEList',742);bcb(1150,742,Uve,YOd);_.Hi=function _Od(a,b){TOd(this,a,BD(b,26))};_.Ii=function aPd(a){UOd(this,BD(a,26))};_.Oi=function gPd(a){var b,c;return b=BD(qud(VKd(this.a),a),87),c=b.c,JD(c,88)?BD(c,26):(jGd(),_Fd)};_.Ti=function lPd(a){var b,c;return b=BD(Xxd(VKd(this.a),a),87),c=b.c,JD(c,88)?BD(c,26):(jGd(),_Fd)};_.Ui=function mPd(a,b){return WOd(this,a,BD(b,26))};_.ai=function ZOd(){return false};_.Zi=function $Od(a,b,c,d,e){return null};_.Ji=function bPd(){return new EPd(this)};_.Ki=function cPd(){Uxd(VKd(this.a))};_.Li=function dPd(a){return VOd(this,a)};_.Mi=function ePd(a){var b,c;for(c=a.Kc();c.Ob();){b=c.Pb();if(!VOd(this,b)){return false}}return true};_.Ni=function fPd(a){var b,c,d;if(JD(a,15)){d=BD(a,15);if(d.gc()==VKd(this.a).i){for(b=d.Kc(),c=new Fyd(this);b.Ob();){if(PD(b.Pb())!==PD(Dyd(c))){return false}}return true}}return false};_.Pi=function hPd(){var a,b,c,d,e;c=1;for(b=new Fyd(VKd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),87);d=(e=a.c,JD(e,88)?BD(e,26):(jGd(),_Fd));c=31*c+(!d?0:FCb(d))}return c};_.Qi=function iPd(a){var b,c,d,e;d=0;for(c=new Fyd(VKd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);if(PD(a)===PD((e=b.c,JD(e,88)?BD(e,26):(jGd(),_Fd)))){return d}++d}return -1};_.Ri=function jPd(){return VKd(this.a).i==0};_.Si=function kPd(){return null};_.Vi=function nPd(){return VKd(this.a).i};_.Wi=function oPd(){var a,b,c,d,e,f;f=VKd(this.a).i;e=KC(SI,Uhe,1,f,5,1);c=0;for(b=new Fyd(VKd(this.a));b.e!=b.i.gc();){a=BD(Dyd(b),87);e[c++]=(d=a.c,JD(d,88)?BD(d,26):(jGd(),_Fd))}return e};_.Xi=function pPd(a){var b,c,d,e,f,g,h;h=VKd(this.a).i;if(a.lengthh&&NC(a,h,null);d=0;for(c=new Fyd(VKd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);f=(g=b.c,JD(g,88)?BD(g,26):(jGd(),_Fd));NC(a,d++,f)}return a};_.Yi=function qPd(){var a,b,c,d,e;e=new Hfb;e.a+='[';a=VKd(this.a);for(b=0,d=VKd(this.a).i;b>16,e>=0?aKd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,6,c);case 9:return !this.a&&(this.a=new cUd(g5,this,9,5)),Sxd(this.a,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),UFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),UFd)),a,c)};_.jh=function dQd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 6:return _hd(this,null,6,c);case 7:return !this.A&&(this.A=new K4d(u5,this,7)),Txd(this.A,a,c);case 9:return !this.a&&(this.a=new cUd(g5,this,9,5)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),UFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),UFd)),a,c)};_.lh=function eQd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return !!dKd(this);case 4:return !!$Pd(this);case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return !!ZJd(this);case 7:return !!this.A&&this.A.i!=0;case 8:return (this.Bb&256)==0;case 9:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),UFd)),XKd((b=BD(Ajd(this,16),26),!b?UFd:b),a))};_.sh=function fQd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:lKd(this,GD(b));return;case 2:iKd(this,GD(b));return;case 5:kKd(this,GD(b));return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);!this.A&&(this.A=new K4d(u5,this,7));ytd(this.A,BD(b,14));return;case 8:LPd(this,Ccb(DD(b)));return;case 9:!this.a&&(this.a=new cUd(g5,this,9,5));Uxd(this.a);!this.a&&(this.a=new cUd(g5,this,9,5));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),UFd)),XKd((c=BD(Ajd(this,16),26),!c?UFd:c),a),b)};_.zh=function gQd(){return jGd(),UFd};_.Bh=function hQd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,179)&&(BD(this.Cb,179).tb=null);pnd(this,null);return;case 2:$Jd(this,null);_Jd(this,this.D);return;case 5:kKd(this,null);return;case 7:!this.A&&(this.A=new K4d(u5,this,7));Uxd(this.A);return;case 8:LPd(this,true);return;case 9:!this.a&&(this.a=new cUd(g5,this,9,5));Uxd(this.a);return;}eid(this,a-aLd((jGd(),UFd)),XKd((b=BD(Ajd(this,16),26),!b?UFd:b),a))};_.Gh=function iQd(){var a,b;if(this.a){for(a=0,b=this.a.i;a>16==5?BD(this.Cb,671):null;}return bid(this,a-aLd((jGd(),VFd)),XKd((d=BD(Ajd(this,16),26),!d?VFd:d),a),b,c)};_.hh=function uQd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 5:!!this.Cb&&(c=(e=this.Db>>16,e>=0?mQd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,5,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),VFd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),VFd)),a,c)};_.jh=function vQd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 5:return _hd(this,null,5,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),VFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),VFd)),a,c)};_.lh=function wQd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.d!=0;case 3:return !!this.b;case 4:return this.c!=null;case 5:return !!(this.Db>>16==5?BD(this.Cb,671):null);}return cid(this,a-aLd((jGd(),VFd)),XKd((b=BD(Ajd(this,16),26),!b?VFd:b),a))};_.sh=function xQd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:qQd(this,BD(b,19).a);return;case 3:oQd(this,BD(b,1940));return;case 4:pQd(this,GD(b));return;}did(this,a-aLd((jGd(),VFd)),XKd((c=BD(Ajd(this,16),26),!c?VFd:c),a),b)};_.zh=function yQd(){return jGd(),VFd};_.Bh=function zQd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:qQd(this,0);return;case 3:oQd(this,null);return;case 4:pQd(this,null);return;}eid(this,a-aLd((jGd(),VFd)),XKd((b=BD(Ajd(this,16),26),!b?VFd:b),a))};_.Ib=function BQd(){var a;return a=this.c,a==null?this.zb:a};_.b=null;_.c=null;_.d=0;var a6=mdb(qte,'EEnumLiteralImpl',573);var c6=odb(qte,'EFactoryImpl/InternalEDateTimeFormat');bcb(489,1,{2015:1},EQd);var b6=mdb(qte,'EFactoryImpl/1ClientInternalEDateTimeFormat',489);bcb(241,115,{105:1,92:1,90:1,87:1,56:1,108:1,49:1,97:1,241:1,114:1,115:1},UQd);_.Sg=function VQd(a,b,c){var d;c=_hd(this,a,b,c);if(!!this.e&&JD(a,170)){d=MQd(this,this.e);d!=this.c&&(c=QQd(this,d,c))}return c};_._g=function WQd(a,b,c){var d;switch(a){case 0:return this.f;case 1:return !this.d&&(this.d=new xMd(j5,this,1)),this.d;case 2:if(b)return KQd(this);return this.c;case 3:return this.b;case 4:return this.e;case 5:if(b)return JQd(this);return this.a;}return bid(this,a-aLd((jGd(),XFd)),XKd((d=BD(Ajd(this,16),26),!d?XFd:d),a),b,c)};_.jh=function XQd(a,b,c){var d,e;switch(b){case 0:return IQd(this,null,c);case 1:return !this.d&&(this.d=new xMd(j5,this,1)),Txd(this.d,a,c);case 3:return GQd(this,null,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),XFd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),XFd)),a,c)};_.lh=function YQd(a){var b;switch(a){case 0:return !!this.f;case 1:return !!this.d&&this.d.i!=0;case 2:return !!this.c;case 3:return !!this.b;case 4:return !!this.e;case 5:return !!this.a;}return cid(this,a-aLd((jGd(),XFd)),XKd((b=BD(Ajd(this,16),26),!b?XFd:b),a))};_.sh=function ZQd(a,b){var c;switch(a){case 0:SQd(this,BD(b,87));return;case 1:!this.d&&(this.d=new xMd(j5,this,1));Uxd(this.d);!this.d&&(this.d=new xMd(j5,this,1));ytd(this.d,BD(b,14));return;case 3:PQd(this,BD(b,87));return;case 4:RQd(this,BD(b,836));return;case 5:NQd(this,BD(b,138));return;}did(this,a-aLd((jGd(),XFd)),XKd((c=BD(Ajd(this,16),26),!c?XFd:c),a),b)};_.zh=function $Qd(){return jGd(),XFd};_.Bh=function _Qd(a){var b;switch(a){case 0:SQd(this,null);return;case 1:!this.d&&(this.d=new xMd(j5,this,1));Uxd(this.d);return;case 3:PQd(this,null);return;case 4:RQd(this,null);return;case 5:NQd(this,null);return;}eid(this,a-aLd((jGd(),XFd)),XKd((b=BD(Ajd(this,16),26),!b?XFd:b),a))};_.Ib=function aRd(){var a;a=new Wfb(Eid(this));a.a+=' (expression: ';TQd(this,a);a.a+=')';return a.a};var FQd;var e6=mdb(qte,'EGenericTypeImpl',241);bcb(1969,1964,Vve);_.Xh=function cRd(a,b){bRd(this,a,b)};_.lk=function dRd(a,b){bRd(this,this.gc(),a);return b};_.pi=function eRd(a){return Ut(this.Gi(),a)};_.Zh=function fRd(){return this.$h()};_.Gi=function gRd(){return new O0d(this)};_.$h=function hRd(){return this._h(0)};_._h=function iRd(a){return this.Gi().Zc(a)};_.mk=function jRd(a,b){ze(this,a,true);return b};_.ii=function kRd(a,b){var c,d;d=Vt(this,b);c=this.Zc(a);c.Rb(d);return d};_.ji=function lRd(a,b){var c;ze(this,b,true);c=this.Zc(a);c.Rb(b)};var B8=mdb(yve,'AbstractSequentialInternalEList',1969);bcb(486,1969,Vve,qRd);_.pi=function rRd(a){return Ut(this.Gi(),a)};_.Zh=function sRd(){if(this.b==null){return LRd(),LRd(),KRd}return this.Jk()};_.Gi=function tRd(){return new w4d(this.a,this.b)};_.$h=function uRd(){if(this.b==null){return LRd(),LRd(),KRd}return this.Jk()};_._h=function vRd(a){var b,c;if(this.b==null){if(a<0||a>1){throw vbb(new qcb(gve+a+', size=0'))}return LRd(),LRd(),KRd}c=this.Jk();for(b=0;b0){b=this.c[--this.d];if((!this.e||b.Gj()!=x2||b.aj()!=0)&&(!this.Mk()||this.b.mh(b))){f=this.b.bh(b,this.Lk());this.f=(Q6d(),BD(b,66).Oj());if(this.f||b.$j()){if(this.Lk()){d=BD(f,15);this.k=d}else{d=BD(f,69);this.k=this.j=d}if(JD(this.k,54)){this.o=this.k.gc();this.n=this.o}else{this.p=!this.j?this.k.Zc(this.k.gc()):this.j._h(this.k.gc())}if(!this.p?PRd(this):QRd(this,this.p)){e=!this.p?!this.j?this.k.Xb(--this.n):this.j.pi(--this.n):this.p.Ub();if(this.f){a=BD(e,72);a.ak();c=a.dd();this.i=c}else{c=e;this.i=c}this.g=-3;return true}}else if(f!=null){this.k=null;this.p=null;c=f;this.i=c;this.g=-2;return true}}}this.k=null;this.p=null;this.g=-1;return false}else{e=!this.p?!this.j?this.k.Xb(--this.n):this.j.pi(--this.n):this.p.Ub();if(this.f){a=BD(e,72);a.ak();c=a.dd();this.i=c}else{c=e;this.i=c}this.g=-3;return true}}}};_.Pb=function XRd(){return MRd(this)};_.Tb=function YRd(){return this.a};_.Ub=function ZRd(){var a;if(this.g<-1||this.Sb()){--this.a;this.g=0;a=this.i;this.Sb();return a}else{throw vbb(new utb)}};_.Vb=function $Rd(){return this.a-1};_.Qb=function _Rd(){throw vbb(new bgb)};_.Lk=function aSd(){return false};_.Wb=function bSd(a){throw vbb(new bgb)};_.Mk=function cSd(){return true};_.a=0;_.d=0;_.f=false;_.g=0;_.n=0;_.o=0;var KRd;var P8=mdb(yve,'EContentsEList/FeatureIteratorImpl',279);bcb(697,279,Wve,dSd);_.Lk=function eSd(){return true};var Q8=mdb(yve,'EContentsEList/ResolvingFeatureIteratorImpl',697);bcb(1157,697,Wve,fSd);_.Mk=function gSd(){return false};var g6=mdb(qte,'ENamedElementImpl/1/1',1157);bcb(1158,279,Wve,hSd);_.Mk=function iSd(){return false};var h6=mdb(qte,'ENamedElementImpl/1/2',1158);bcb(36,143,fve,lSd,mSd,nSd,oSd,pSd,qSd,rSd,sSd,tSd,uSd,vSd,wSd,xSd,ySd,zSd,ASd,BSd,CSd,DSd,ESd,FSd,GSd,HSd,ISd,JSd);_._i=function KSd(){return kSd(this)};_.gj=function LSd(){var a;a=kSd(this);if(a){return a.zj()}return null};_.yi=function MSd(a){this.b==-1&&!!this.a&&(this.b=this.c.Xg(this.a.aj(),this.a.Gj()));return this.c.Og(this.b,a)};_.Ai=function NSd(){return this.c};_.hj=function OSd(){var a;a=kSd(this);if(a){return a.Kj()}return false};_.b=-1;var k6=mdb(qte,'ENotificationImpl',36);bcb(399,284,{105:1,92:1,90:1,147:1,191:1,56:1,59:1,108:1,472:1,49:1,97:1,150:1,399:1,284:1,114:1,115:1},SSd);_.Qg=function TSd(a){return PSd(this,a)};_._g=function USd(a,b,c){var d,e,f;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),f=this.t,f>1||f==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return this.Db>>16==10?BD(this.Cb,26):null;case 11:return !this.d&&(this.d=new K4d(u5,this,11)),this.d;case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),this.c;case 13:return !this.a&&(this.a=new fTd(this,this)),this.a;case 14:return QSd(this);}return bid(this,a-aLd((jGd(),aGd)),XKd((d=BD(Ajd(this,16),26),!d?aGd:d),a),b,c)};_.hh=function VSd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 10:!!this.Cb&&(c=(e=this.Db>>16,e>=0?PSd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,10,c);case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),Sxd(this.c,a,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),aGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),aGd)),a,c)};_.jh=function WSd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 10:return _hd(this,null,10,c);case 11:return !this.d&&(this.d=new K4d(u5,this,11)),Txd(this.d,a,c);case 12:return !this.c&&(this.c=new cUd(p5,this,12,10)),Txd(this.c,a,c);case 14:return Txd(QSd(this),a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),aGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),aGd)),a,c)};_.lh=function XSd(a){var b,c,d;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return d=this.t,d>1||d==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return !!(this.Db>>16==10?BD(this.Cb,26):null);case 11:return !!this.d&&this.d.i!=0;case 12:return !!this.c&&this.c.i!=0;case 13:return !!this.a&&QSd(this.a.a).i!=0&&!(!!this.b&&QTd(this.b));case 14:return !!this.b&&QTd(this.b);}return cid(this,a-aLd((jGd(),aGd)),XKd((b=BD(Ajd(this,16),26),!b?aGd:b),a))};_.sh=function YSd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:DId(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 11:!this.d&&(this.d=new K4d(u5,this,11));Uxd(this.d);!this.d&&(this.d=new K4d(u5,this,11));ytd(this.d,BD(b,14));return;case 12:!this.c&&(this.c=new cUd(p5,this,12,10));Uxd(this.c);!this.c&&(this.c=new cUd(p5,this,12,10));ytd(this.c,BD(b,14));return;case 13:!this.a&&(this.a=new fTd(this,this));vwd(this.a);!this.a&&(this.a=new fTd(this,this));ytd(this.a,BD(b,14));return;case 14:Uxd(QSd(this));ytd(QSd(this),BD(b,14));return;}did(this,a-aLd((jGd(),aGd)),XKd((c=BD(Ajd(this,16),26),!c?aGd:c),a),b)};_.zh=function ZSd(){return jGd(),aGd};_.Bh=function $Sd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 11:!this.d&&(this.d=new K4d(u5,this,11));Uxd(this.d);return;case 12:!this.c&&(this.c=new cUd(p5,this,12,10));Uxd(this.c);return;case 13:!!this.a&&vwd(this.a);return;case 14:!!this.b&&Uxd(this.b);return;}eid(this,a-aLd((jGd(),aGd)),XKd((b=BD(Ajd(this,16),26),!b?aGd:b),a))};_.Gh=function _Sd(){var a,b;if(this.c){for(a=0,b=this.c.i;ah&&NC(a,h,null);d=0;for(c=new Fyd(QSd(this.a));c.e!=c.i.gc();){b=BD(Dyd(c),87);f=(g=b.c,g?g:(jGd(),YFd));NC(a,d++,f)}return a};_.Yi=function zTd(){var a,b,c,d,e;e=new Hfb;e.a+='[';a=QSd(this.a);for(b=0,d=QSd(this.a).i;b1)}case 5:{return FLd(this,a,b,c,d,this.i-BD(c,15).gc()>0)}default:{return new pSd(this.e,a,this.c,b,c,d,true)}}};_.ij=function WTd(){return true};_.fj=function XTd(){return QTd(this)};_.Xj=function aUd(){Uxd(this)};var o6=mdb(qte,'EOperationImpl/2',1341);bcb(498,1,{1938:1,498:1},bUd);var q6=mdb(qte,'EPackageImpl/1',498);bcb(16,85,Pve,cUd);_.zk=function dUd(){return this.d};_.Ak=function eUd(){return this.b};_.Dk=function fUd(){return true};_.b=0;var b9=mdb(yve,'EObjectContainmentWithInverseEList',16);bcb(353,16,Pve,gUd);_.Ek=function hUd(){return true};_.li=function iUd(a,b){return ILd(this,a,BD(b,56))};var $8=mdb(yve,'EObjectContainmentWithInverseEList/Resolving',353);bcb(298,353,Pve,jUd);_.ci=function kUd(){this.a.tb=null};var r6=mdb(qte,'EPackageImpl/2',298);bcb(1228,1,{},lUd);var s6=mdb(qte,'EPackageImpl/3',1228);bcb(718,43,fke,oUd);_._b=function pUd(a){return ND(a)?Qhb(this,a):!!irb(this.f,a)};var u6=mdb(qte,'EPackageRegistryImpl',718);bcb(509,284,{105:1,92:1,90:1,147:1,191:1,56:1,2017:1,108:1,472:1,49:1,97:1,150:1,509:1,284:1,114:1,115:1},rUd);_.Qg=function sUd(a){return qUd(this,a)};_._g=function tUd(a,b,c){var d,e,f;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),f=this.t,f>1||f==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return this.Db>>16==10?BD(this.Cb,59):null;}return bid(this,a-aLd((jGd(),dGd)),XKd((d=BD(Ajd(this,16),26),!d?dGd:d),a),b,c)};_.hh=function uUd(a,b,c){var d,e,f;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Sxd(this.Ab,a,c);case 10:!!this.Cb&&(c=(e=this.Db>>16,e>=0?qUd(this,c):this.Cb.ih(this,-1-e,null,c)));return _hd(this,a,10,c);}return f=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),dGd):d),b),66),f.Nj().Qj(this,yjd(this),b-aLd((jGd(),dGd)),a,c)};_.jh=function vUd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 9:return vId(this,c);case 10:return _hd(this,null,10,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),dGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),dGd)),a,c)};_.lh=function wUd(a){var b,c,d;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return d=this.t,d>1||d==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return !!(this.Db>>16==10?BD(this.Cb,59):null);}return cid(this,a-aLd((jGd(),dGd)),XKd((b=BD(Ajd(this,16),26),!b?dGd:b),a))};_.zh=function xUd(){return jGd(),dGd};var v6=mdb(qte,'EParameterImpl',509);bcb(99,449,{105:1,92:1,90:1,147:1,191:1,56:1,18:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,99:1,449:1,284:1,114:1,115:1,677:1},FUd);_._g=function GUd(a,b,c){var d,e,f,g;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Bcb(),(this.Bb&256)!=0?true:false;case 3:return Bcb(),(this.Bb&512)!=0?true:false;case 4:return meb(this.s);case 5:return meb(this.t);case 6:return Bcb(),g=this.t,g>1||g==-1?true:false;case 7:return Bcb(),e=this.s,e>=1?true:false;case 8:if(b)return wId(this);return this.r;case 9:return this.q;case 10:return Bcb(),(this.Bb&zte)!=0?true:false;case 11:return Bcb(),(this.Bb&Dve)!=0?true:false;case 12:return Bcb(),(this.Bb&Rje)!=0?true:false;case 13:return this.j;case 14:return VId(this);case 15:return Bcb(),(this.Bb&Cve)!=0?true:false;case 16:return Bcb(),(this.Bb&oie)!=0?true:false;case 17:return WId(this);case 18:return Bcb(),(this.Bb&ote)!=0?true:false;case 19:return Bcb(),f=zUd(this),!!f&&(f.Bb&ote)!=0?true:false;case 20:return Bcb(),(this.Bb&Tje)!=0?true:false;case 21:if(b)return zUd(this);return this.b;case 22:if(b)return AUd(this);return yUd(this);case 23:return !this.a&&(this.a=new _4d(b5,this,23)),this.a;}return bid(this,a-aLd((jGd(),eGd)),XKd((d=BD(Ajd(this,16),26),!d?eGd:d),a),b,c)};_.lh=function HUd(a){var b,c,d,e;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return (this.Bb&256)==0;case 3:return (this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return e=this.t,e>1||e==-1;case 7:return c=this.s,c>=1;case 8:return !!this.r&&!this.q.e&&LQd(this.q).i==0;case 9:return !!this.q&&!(!!this.r&&!this.q.e&&LQd(this.q).i==0);case 10:return (this.Bb&zte)==0;case 11:return (this.Bb&Dve)!=0;case 12:return (this.Bb&Rje)!=0;case 13:return this.j!=null;case 14:return VId(this)!=null;case 15:return (this.Bb&Cve)!=0;case 16:return (this.Bb&oie)!=0;case 17:return !!WId(this);case 18:return (this.Bb&ote)!=0;case 19:return d=zUd(this),!!d&&(d.Bb&ote)!=0;case 20:return (this.Bb&Tje)==0;case 21:return !!this.b;case 22:return !!yUd(this);case 23:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),eGd)),XKd((b=BD(Ajd(this,16),26),!b?eGd:b),a))};_.sh=function IUd(a,b){var c,d;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:cJd(this,GD(b));return;case 2:BId(this,Ccb(DD(b)));return;case 3:CId(this,Ccb(DD(b)));return;case 4:AId(this,BD(b,19).a);return;case 5:DId(this,BD(b,19).a);return;case 8:yId(this,BD(b,138));return;case 9:d=xId(this,BD(b,87),null);!!d&&d.Fi();return;case 10:ZId(this,Ccb(DD(b)));return;case 11:fJd(this,Ccb(DD(b)));return;case 12:dJd(this,Ccb(DD(b)));return;case 13:$Id(this,GD(b));return;case 15:eJd(this,Ccb(DD(b)));return;case 16:aJd(this,Ccb(DD(b)));return;case 18:BUd(this,Ccb(DD(b)));return;case 20:EUd(this,Ccb(DD(b)));return;case 21:DUd(this,BD(b,18));return;case 23:!this.a&&(this.a=new _4d(b5,this,23));Uxd(this.a);!this.a&&(this.a=new _4d(b5,this,23));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),eGd)),XKd((c=BD(Ajd(this,16),26),!c?eGd:c),a),b)};_.zh=function JUd(){return jGd(),eGd};_.Bh=function KUd(a){var b,c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),4);pnd(this,null);return;case 2:BId(this,true);return;case 3:CId(this,true);return;case 4:AId(this,0);return;case 5:DId(this,1);return;case 8:yId(this,null);return;case 9:c=xId(this,null,null);!!c&&c.Fi();return;case 10:ZId(this,true);return;case 11:fJd(this,false);return;case 12:dJd(this,false);return;case 13:this.i=null;_Id(this,null);return;case 15:eJd(this,false);return;case 16:aJd(this,false);return;case 18:CUd(this,false);JD(this.Cb,88)&&XMd($Kd(BD(this.Cb,88)),2);return;case 20:EUd(this,true);return;case 21:DUd(this,null);return;case 23:!this.a&&(this.a=new _4d(b5,this,23));Uxd(this.a);return;}eid(this,a-aLd((jGd(),eGd)),XKd((b=BD(Ajd(this,16),26),!b?eGd:b),a))};_.Gh=function LUd(){AUd(this);a2d(q1d((O6d(),M6d),this));wId(this);this.Bb|=1};_.Lj=function MUd(){return zUd(this)};_.qk=function NUd(){var a;return a=zUd(this),!!a&&(a.Bb&ote)!=0};_.rk=function OUd(){return (this.Bb&ote)!=0};_.sk=function PUd(){return (this.Bb&Tje)!=0};_.nk=function QUd(a,b){this.c=null;return zId(this,a,b)};_.Ib=function RUd(){var a;if((this.Db&64)!=0)return gJd(this);a=new Jfb(gJd(this));a.a+=' (containment: ';Ffb(a,(this.Bb&ote)!=0);a.a+=', resolveProxies: ';Ffb(a,(this.Bb&Tje)!=0);a.a+=')';return a.a};var w6=mdb(qte,'EReferenceImpl',99);bcb(548,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,548:1,114:1,115:1},XUd);_.Fb=function bVd(a){return this===a};_.cd=function dVd(){return this.b};_.dd=function eVd(){return this.c};_.Hb=function fVd(){return FCb(this)};_.Uh=function hVd(a){SUd(this,GD(a))};_.ed=function iVd(a){return WUd(this,GD(a))};_._g=function YUd(a,b,c){var d;switch(a){case 0:return this.b;case 1:return this.c;}return bid(this,a-aLd((jGd(),fGd)),XKd((d=BD(Ajd(this,16),26),!d?fGd:d),a),b,c)};_.lh=function ZUd(a){var b;switch(a){case 0:return this.b!=null;case 1:return this.c!=null;}return cid(this,a-aLd((jGd(),fGd)),XKd((b=BD(Ajd(this,16),26),!b?fGd:b),a))};_.sh=function $Ud(a,b){var c;switch(a){case 0:TUd(this,GD(b));return;case 1:VUd(this,GD(b));return;}did(this,a-aLd((jGd(),fGd)),XKd((c=BD(Ajd(this,16),26),!c?fGd:c),a),b)};_.zh=function _Ud(){return jGd(),fGd};_.Bh=function aVd(a){var b;switch(a){case 0:UUd(this,null);return;case 1:VUd(this,null);return;}eid(this,a-aLd((jGd(),fGd)),XKd((b=BD(Ajd(this,16),26),!b?fGd:b),a))};_.Sh=function cVd(){var a;if(this.a==-1){a=this.b;this.a=a==null?0:LCb(a)}return this.a};_.Th=function gVd(a){this.a=a};_.Ib=function jVd(){var a;if((this.Db&64)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (key: ';Efb(a,this.b);a.a+=', value: ';Efb(a,this.c);a.a+=')';return a.a};_.a=-1;_.b=null;_.c=null;var x6=mdb(qte,'EStringToStringMapEntryImpl',548);var D9=odb(yve,'FeatureMap/Entry/Internal');bcb(565,1,Xve);_.Ok=function mVd(a){return this.Pk(BD(a,49))};_.Pk=function nVd(a){return this.Ok(a)};_.Fb=function oVd(a){var b,c;if(this===a){return true}else if(JD(a,72)){b=BD(a,72);if(b.ak()==this.c){c=this.dd();return c==null?b.dd()==null:pb(c,b.dd())}else{return false}}else{return false}};_.ak=function pVd(){return this.c};_.Hb=function qVd(){var a;a=this.dd();return tb(this.c)^(a==null?0:tb(a))};_.Ib=function rVd(){var a,b;a=this.c;b=bKd(a.Hj()).Ph();a.ne();return (b!=null&&b.length!=0?b+':'+a.ne():a.ne())+'='+this.dd()};var y6=mdb(qte,'EStructuralFeatureImpl/BasicFeatureMapEntry',565);bcb(776,565,Xve,uVd);_.Pk=function vVd(a){return new uVd(this.c,a)};_.dd=function wVd(){return this.a};_.Qk=function xVd(a,b,c){return sVd(this,a,this.a,b,c)};_.Rk=function yVd(a,b,c){return tVd(this,a,this.a,b,c)};var z6=mdb(qte,'EStructuralFeatureImpl/ContainmentUpdatingFeatureMapEntry',776);bcb(1314,1,{},zVd);_.Pj=function AVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.nl(this.a).Wj(d)};_.Qj=function BVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.el(this.a,d,e)};_.Rj=function CVd(a,b,c,d,e){var f;f=BD(gid(a,this.b),215);return f.fl(this.a,d,e)};_.Sj=function DVd(a,b,c){var d;d=BD(gid(a,this.b),215);return d.nl(this.a).fj()};_.Tj=function EVd(a,b,c,d){var e;e=BD(gid(a,this.b),215);e.nl(this.a).Wb(d)};_.Uj=function FVd(a,b,c){return BD(gid(a,this.b),215).nl(this.a)};_.Vj=function GVd(a,b,c){var d;d=BD(gid(a,this.b),215);d.nl(this.a).Xj()};var A6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateFeatureMapDelegator',1314);bcb(89,1,{},IVd,JVd,KVd,LVd);_.Pj=function MVd(a,b,c,d,e){var f;f=b.Ch(c);f==null&&b.Dh(c,f=HVd(this,a));if(!e){switch(this.e){case 50:case 41:return BD(f,589).sj();case 40:return BD(f,215).kl();}}return f};_.Qj=function NVd(a,b,c,d,e){var f,g;g=b.Ch(c);g==null&&b.Dh(c,g=HVd(this,a));f=BD(g,69).lk(d,e);return f};_.Rj=function OVd(a,b,c,d,e){var f;f=b.Ch(c);f!=null&&(e=BD(f,69).mk(d,e));return e};_.Sj=function PVd(a,b,c){var d;d=b.Ch(c);return d!=null&&BD(d,76).fj()};_.Tj=function QVd(a,b,c,d){var e;e=BD(b.Ch(c),76);!e&&b.Dh(c,e=HVd(this,a));e.Wb(d)};_.Uj=function RVd(a,b,c){var d,e;e=b.Ch(c);e==null&&b.Dh(c,e=HVd(this,a));if(JD(e,76)){return BD(e,76)}else{d=BD(b.Ch(c),15);return new iYd(d)}};_.Vj=function SVd(a,b,c){var d;d=BD(b.Ch(c),76);!d&&b.Dh(c,d=HVd(this,a));d.Xj()};_.b=0;_.e=0;var B6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateMany',89);bcb(504,1,{});_.Qj=function WVd(a,b,c,d,e){throw vbb(new bgb)};_.Rj=function XVd(a,b,c,d,e){throw vbb(new bgb)};_.Uj=function YVd(a,b,c){return new ZVd(this,a,b,c)};var TVd;var i7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingle',504);bcb(1331,1,zve,ZVd);_.Wj=function $Vd(a){return this.a.Pj(this.c,this.d,this.b,a,true)};_.fj=function _Vd(){return this.a.Sj(this.c,this.d,this.b)};_.Wb=function aWd(a){this.a.Tj(this.c,this.d,this.b,a)};_.Xj=function bWd(){this.a.Vj(this.c,this.d,this.b)};_.b=0;var C6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingle/1',1331);bcb(769,504,{},cWd);_.Pj=function dWd(a,b,c,d,e){return Nid(a,a.eh(),a.Vg())==this.b?this.sk()&&d?aid(a):a.eh():null};_.Qj=function eWd(a,b,c,d,e){var f,g;!!a.eh()&&(e=(f=a.Vg(),f>=0?a.Qg(e):a.eh().ih(a,-1-f,null,e)));g=bLd(a.Tg(),this.e);return a.Sg(d,g,e)};_.Rj=function fWd(a,b,c,d,e){var f;f=bLd(a.Tg(),this.e);return a.Sg(null,f,e)};_.Sj=function gWd(a,b,c){var d;d=bLd(a.Tg(),this.e);return !!a.eh()&&a.Vg()==d};_.Tj=function hWd(a,b,c,d){var e,f,g,h,i;if(d!=null&&!fKd(this.a,d)){throw vbb(new Cdb(Yve+(JD(d,56)?gLd(BD(d,56).Tg()):idb(rb(d)))+Zve+this.a+"'"))}e=a.eh();g=bLd(a.Tg(),this.e);if(PD(d)!==PD(e)||a.Vg()!=g&&d!=null){if(p6d(a,BD(d,56)))throw vbb(new Wdb(ste+a.Ib()));i=null;!!e&&(i=(f=a.Vg(),f>=0?a.Qg(i):a.eh().ih(a,-1-f,null,i)));h=BD(d,49);!!h&&(i=h.gh(a,bLd(h.Tg(),this.b),null,i));i=a.Sg(h,g,i);!!i&&i.Fi()}else{a.Lg()&&a.Mg()&&Uhd(a,new nSd(a,1,g,d,d))}};_.Vj=function iWd(a,b,c){var d,e,f,g;d=a.eh();if(d){g=(e=a.Vg(),e>=0?a.Qg(null):a.eh().ih(a,-1-e,null,null));f=bLd(a.Tg(),this.e);g=a.Sg(null,f,g);!!g&&g.Fi()}else{a.Lg()&&a.Mg()&&Uhd(a,new DSd(a,1,this.e,null,null))}};_.sk=function jWd(){return false};var E6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleContainer',769);bcb(1315,769,{},kWd);_.sk=function lWd(){return true};var D6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleContainerResolving',1315);bcb(563,504,{});_.Pj=function oWd(a,b,c,d,e){var f;return f=b.Ch(c),f==null?this.b:PD(f)===PD(TVd)?null:f};_.Sj=function pWd(a,b,c){var d;d=b.Ch(c);return d!=null&&(PD(d)===PD(TVd)||!pb(d,this.b))};_.Tj=function qWd(a,b,c,d){var e,f;if(a.Lg()&&a.Mg()){e=(f=b.Ch(c),f==null?this.b:PD(f)===PD(TVd)?null:f);if(d==null){if(this.c!=null){b.Dh(c,null);d=this.b}else this.b!=null?b.Dh(c,TVd):b.Dh(c,null)}else{this.Sk(d);b.Dh(c,d)}Uhd(a,this.d.Tk(a,1,this.e,e,d))}else{if(d==null){this.c!=null?b.Dh(c,null):this.b!=null?b.Dh(c,TVd):b.Dh(c,null)}else{this.Sk(d);b.Dh(c,d)}}};_.Vj=function rWd(a,b,c){var d,e;if(a.Lg()&&a.Mg()){d=(e=b.Ch(c),e==null?this.b:PD(e)===PD(TVd)?null:e);b.Eh(c);Uhd(a,this.d.Tk(a,1,this.e,d,this.b))}else{b.Eh(c)}};_.Sk=function sWd(a){throw vbb(new Bdb)};var T6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData',563);bcb($ve,1,{},DWd);_.Tk=function EWd(a,b,c,d,e){return new DSd(a,b,c,d,e)};_.Uk=function FWd(a,b,c,d,e,f){return new FSd(a,b,c,d,e,f)};var tWd,uWd,vWd,wWd,xWd,yWd,zWd,AWd,BWd;var N6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator',$ve);bcb(1332,$ve,{},GWd);_.Tk=function HWd(a,b,c,d,e){return new ISd(a,b,c,Ccb(DD(d)),Ccb(DD(e)))};_.Uk=function IWd(a,b,c,d,e,f){return new JSd(a,b,c,Ccb(DD(d)),Ccb(DD(e)),f)};var F6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/1',1332);bcb(1333,$ve,{},JWd);_.Tk=function KWd(a,b,c,d,e){return new rSd(a,b,c,BD(d,217).a,BD(e,217).a)};_.Uk=function LWd(a,b,c,d,e,f){return new sSd(a,b,c,BD(d,217).a,BD(e,217).a,f)};var G6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/2',1333);bcb(1334,$ve,{},MWd);_.Tk=function NWd(a,b,c,d,e){return new tSd(a,b,c,BD(d,172).a,BD(e,172).a)};_.Uk=function OWd(a,b,c,d,e,f){return new uSd(a,b,c,BD(d,172).a,BD(e,172).a,f)};var H6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/3',1334);bcb(1335,$ve,{},PWd);_.Tk=function QWd(a,b,c,d,e){return new vSd(a,b,c,Edb(ED(d)),Edb(ED(e)))};_.Uk=function RWd(a,b,c,d,e,f){return new wSd(a,b,c,Edb(ED(d)),Edb(ED(e)),f)};var I6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/4',1335);bcb(1336,$ve,{},SWd);_.Tk=function TWd(a,b,c,d,e){return new xSd(a,b,c,BD(d,155).a,BD(e,155).a)};_.Uk=function UWd(a,b,c,d,e,f){return new ySd(a,b,c,BD(d,155).a,BD(e,155).a,f)};var J6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/5',1336);bcb(1337,$ve,{},VWd);_.Tk=function WWd(a,b,c,d,e){return new zSd(a,b,c,BD(d,19).a,BD(e,19).a)};_.Uk=function XWd(a,b,c,d,e,f){return new ASd(a,b,c,BD(d,19).a,BD(e,19).a,f)};var K6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/6',1337);bcb(1338,$ve,{},YWd);_.Tk=function ZWd(a,b,c,d,e){return new BSd(a,b,c,BD(d,162).a,BD(e,162).a)};_.Uk=function $Wd(a,b,c,d,e,f){return new CSd(a,b,c,BD(d,162).a,BD(e,162).a,f)};var L6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/7',1338);bcb(1339,$ve,{},_Wd);_.Tk=function aXd(a,b,c,d,e){return new GSd(a,b,c,BD(d,184).a,BD(e,184).a)};_.Uk=function bXd(a,b,c,d,e,f){return new HSd(a,b,c,BD(d,184).a,BD(e,184).a,f)};var M6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/8',1339);bcb(1317,563,{},cXd);_.Sk=function dXd(a){if(!this.a.wj(a)){throw vbb(new Cdb(Yve+rb(a)+Zve+this.a+"'"))}};var O6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataDynamic',1317);bcb(1318,563,{},eXd);_.Sk=function fXd(a){};var P6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataStatic',1318);bcb(770,563,{});_.Sj=function gXd(a,b,c){var d;d=b.Ch(c);return d!=null};_.Tj=function hXd(a,b,c,d){var e,f;if(a.Lg()&&a.Mg()){e=true;f=b.Ch(c);if(f==null){e=false;f=this.b}else PD(f)===PD(TVd)&&(f=null);if(d==null){if(this.c!=null){b.Dh(c,null);d=this.b}else{b.Dh(c,TVd)}}else{this.Sk(d);b.Dh(c,d)}Uhd(a,this.d.Uk(a,1,this.e,f,d,!e))}else{if(d==null){this.c!=null?b.Dh(c,null):b.Dh(c,TVd)}else{this.Sk(d);b.Dh(c,d)}}};_.Vj=function iXd(a,b,c){var d,e;if(a.Lg()&&a.Mg()){d=true;e=b.Ch(c);if(e==null){d=false;e=this.b}else PD(e)===PD(TVd)&&(e=null);b.Eh(c);Uhd(a,this.d.Uk(a,2,this.e,e,this.b,d))}else{b.Eh(c)}};var S6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettable',770);bcb(1319,770,{},jXd);_.Sk=function kXd(a){if(!this.a.wj(a)){throw vbb(new Cdb(Yve+rb(a)+Zve+this.a+"'"))}};var Q6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableDynamic',1319);bcb(1320,770,{},lXd);_.Sk=function mXd(a){};var R6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableStatic',1320);bcb(398,504,{},nXd);_.Pj=function pXd(a,b,c,d,e){var f,g,h,i,j;j=b.Ch(c);if(this.Kj()&&PD(j)===PD(TVd)){return null}else if(this.sk()&&d&&j!=null){h=BD(j,49);if(h.kh()){i=xid(a,h);if(h!=i){if(!fKd(this.a,i)){throw vbb(new Cdb(Yve+rb(i)+Zve+this.a+"'"))}b.Dh(c,j=i);if(this.rk()){f=BD(i,49);g=h.ih(a,!this.b?-1-bLd(a.Tg(),this.e):bLd(h.Tg(),this.b),null,null);!f.eh()&&(g=f.gh(a,!this.b?-1-bLd(a.Tg(),this.e):bLd(f.Tg(),this.b),null,g));!!g&&g.Fi()}a.Lg()&&a.Mg()&&Uhd(a,new DSd(a,9,this.e,h,i))}}return j}else{return j}};_.Qj=function qXd(a,b,c,d,e){var f,g;g=b.Ch(c);PD(g)===PD(TVd)&&(g=null);b.Dh(c,d);if(this.bj()){if(PD(g)!==PD(d)&&g!=null){f=BD(g,49);e=f.ih(a,bLd(f.Tg(),this.b),null,e)}}else this.rk()&&g!=null&&(e=BD(g,49).ih(a,-1-bLd(a.Tg(),this.e),null,e));if(a.Lg()&&a.Mg()){!e&&(e=new Ixd(4));e.Ei(new DSd(a,1,this.e,g,d))}return e};_.Rj=function rXd(a,b,c,d,e){var f;f=b.Ch(c);PD(f)===PD(TVd)&&(f=null);b.Eh(c);if(a.Lg()&&a.Mg()){!e&&(e=new Ixd(4));this.Kj()?e.Ei(new DSd(a,2,this.e,f,null)):e.Ei(new DSd(a,1,this.e,f,null))}return e};_.Sj=function sXd(a,b,c){var d;d=b.Ch(c);return d!=null};_.Tj=function tXd(a,b,c,d){var e,f,g,h,i;if(d!=null&&!fKd(this.a,d)){throw vbb(new Cdb(Yve+(JD(d,56)?gLd(BD(d,56).Tg()):idb(rb(d)))+Zve+this.a+"'"))}i=b.Ch(c);h=i!=null;this.Kj()&&PD(i)===PD(TVd)&&(i=null);g=null;if(this.bj()){if(PD(i)!==PD(d)){if(i!=null){e=BD(i,49);g=e.ih(a,bLd(e.Tg(),this.b),null,g)}if(d!=null){e=BD(d,49);g=e.gh(a,bLd(e.Tg(),this.b),null,g)}}}else if(this.rk()){if(PD(i)!==PD(d)){i!=null&&(g=BD(i,49).ih(a,-1-bLd(a.Tg(),this.e),null,g));d!=null&&(g=BD(d,49).gh(a,-1-bLd(a.Tg(),this.e),null,g))}}d==null&&this.Kj()?b.Dh(c,TVd):b.Dh(c,d);if(a.Lg()&&a.Mg()){f=new FSd(a,1,this.e,i,d,this.Kj()&&!h);if(!g){Uhd(a,f)}else{g.Ei(f);g.Fi()}}else !!g&&g.Fi()};_.Vj=function uXd(a,b,c){var d,e,f,g,h;h=b.Ch(c);g=h!=null;this.Kj()&&PD(h)===PD(TVd)&&(h=null);f=null;if(h!=null){if(this.bj()){d=BD(h,49);f=d.ih(a,bLd(d.Tg(),this.b),null,f)}else this.rk()&&(f=BD(h,49).ih(a,-1-bLd(a.Tg(),this.e),null,f))}b.Eh(c);if(a.Lg()&&a.Mg()){e=new FSd(a,this.Kj()?2:1,this.e,h,null,g);if(!f){Uhd(a,e)}else{f.Ei(e);f.Fi()}}else !!f&&f.Fi()};_.bj=function vXd(){return false};_.rk=function wXd(){return false};_.sk=function xXd(){return false};_.Kj=function yXd(){return false};var h7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObject',398);bcb(564,398,{},zXd);_.rk=function AXd(){return true};var _6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainment',564);bcb(1323,564,{},BXd);_.sk=function CXd(){return true};var U6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentResolving',1323);bcb(772,564,{},DXd);_.Kj=function EXd(){return true};var W6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettable',772);bcb(1325,772,{},FXd);_.sk=function GXd(){return true};var V6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettableResolving',1325);bcb(640,564,{},HXd);_.bj=function IXd(){return true};var $6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverse',640);bcb(1324,640,{},JXd);_.sk=function KXd(){return true};var X6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseResolving',1324);bcb(773,640,{},LXd);_.Kj=function MXd(){return true};var Z6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettable',773);bcb(1326,773,{},NXd);_.sk=function OXd(){return true};var Y6=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettableResolving',1326);bcb(641,398,{},PXd);_.sk=function QXd(){return true};var d7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolving',641);bcb(1327,641,{},RXd);_.Kj=function SXd(){return true};var a7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingUnsettable',1327);bcb(774,641,{},TXd);_.bj=function UXd(){return true};var c7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverse',774);bcb(1328,774,{},VXd);_.Kj=function WXd(){return true};var b7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverseUnsettable',1328);bcb(1321,398,{},XXd);_.Kj=function YXd(){return true};var e7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectUnsettable',1321);bcb(771,398,{},ZXd);_.bj=function $Xd(){return true};var g7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverse',771);bcb(1322,771,{},_Xd);_.Kj=function aYd(){return true};var f7=mdb(qte,'EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverseUnsettable',1322);bcb(775,565,Xve,dYd);_.Pk=function eYd(a){return new dYd(this.a,this.c,a)};_.dd=function fYd(){return this.b};_.Qk=function gYd(a,b,c){return bYd(this,a,this.b,c)};_.Rk=function hYd(a,b,c){return cYd(this,a,this.b,c)};var j7=mdb(qte,'EStructuralFeatureImpl/InverseUpdatingFeatureMapEntry',775);bcb(1329,1,zve,iYd);_.Wj=function jYd(a){return this.a};_.fj=function kYd(){return JD(this.a,95)?BD(this.a,95).fj():!this.a.dc()};_.Wb=function lYd(a){this.a.$b();this.a.Gc(BD(a,15))};_.Xj=function mYd(){JD(this.a,95)?BD(this.a,95).Xj():this.a.$b()};var k7=mdb(qte,'EStructuralFeatureImpl/SettingMany',1329);bcb(1330,565,Xve,nYd);_.Ok=function oYd(a){return new sYd((Q8d(),P8d),this.b.Ih(this.a,a))};_.dd=function pYd(){return null};_.Qk=function qYd(a,b,c){return c};_.Rk=function rYd(a,b,c){return c};var l7=mdb(qte,'EStructuralFeatureImpl/SimpleContentFeatureMapEntry',1330);bcb(642,565,Xve,sYd);_.Ok=function tYd(a){return new sYd(this.c,a)};_.dd=function uYd(){return this.a};_.Qk=function vYd(a,b,c){return c};_.Rk=function wYd(a,b,c){return c};var m7=mdb(qte,'EStructuralFeatureImpl/SimpleFeatureMapEntry',642);bcb(391,497,oue,xYd);_.ri=function yYd(a){return KC(c5,Uhe,26,a,0,1)};_.ni=function zYd(){return false};var o7=mdb(qte,'ESuperAdapter/1',391);bcb(444,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,836:1,49:1,97:1,150:1,444:1,114:1,115:1},BYd);_._g=function CYd(a,b,c){var d;switch(a){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),this.Ab;case 1:return this.zb;case 2:return !this.a&&(this.a=new KYd(this,j5,this)),this.a;}return bid(this,a-aLd((jGd(),iGd)),XKd((d=BD(Ajd(this,16),26),!d?iGd:d),a),b,c)};_.jh=function DYd(a,b,c){var d,e;switch(b){case 0:return !this.Ab&&(this.Ab=new cUd(a5,this,0,3)),Txd(this.Ab,a,c);case 2:return !this.a&&(this.a=new KYd(this,j5,this)),Txd(this.a,a,c);}return e=BD(XKd((d=BD(Ajd(this,16),26),!d?(jGd(),iGd):d),b),66),e.Nj().Rj(this,yjd(this),b-aLd((jGd(),iGd)),a,c)};_.lh=function EYd(a){var b;switch(a){case 0:return !!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return !!this.a&&this.a.i!=0;}return cid(this,a-aLd((jGd(),iGd)),XKd((b=BD(Ajd(this,16),26),!b?iGd:b),a))};_.sh=function FYd(a,b){var c;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);!this.Ab&&(this.Ab=new cUd(a5,this,0,3));ytd(this.Ab,BD(b,14));return;case 1:pnd(this,GD(b));return;case 2:!this.a&&(this.a=new KYd(this,j5,this));Uxd(this.a);!this.a&&(this.a=new KYd(this,j5,this));ytd(this.a,BD(b,14));return;}did(this,a-aLd((jGd(),iGd)),XKd((c=BD(Ajd(this,16),26),!c?iGd:c),a),b)};_.zh=function GYd(){return jGd(),iGd};_.Bh=function HYd(a){var b;switch(a){case 0:!this.Ab&&(this.Ab=new cUd(a5,this,0,3));Uxd(this.Ab);return;case 1:pnd(this,null);return;case 2:!this.a&&(this.a=new KYd(this,j5,this));Uxd(this.a);return;}eid(this,a-aLd((jGd(),iGd)),XKd((b=BD(Ajd(this,16),26),!b?iGd:b),a))};var u7=mdb(qte,'ETypeParameterImpl',444);bcb(445,85,Pve,KYd);_.cj=function LYd(a,b){return IYd(this,BD(a,87),b)};_.dj=function MYd(a,b){return JYd(this,BD(a,87),b)};var q7=mdb(qte,'ETypeParameterImpl/1',445);bcb(634,43,fke,NYd);_.ec=function OYd(){return new RYd(this)};var t7=mdb(qte,'ETypeParameterImpl/2',634);bcb(556,eie,fie,RYd);_.Fc=function SYd(a){return PYd(this,BD(a,87))};_.Gc=function TYd(a){var b,c,d;d=false;for(c=a.Kc();c.Ob();){b=BD(c.Pb(),87);Rhb(this.a,b,'')==null&&(d=true)}return d};_.$b=function UYd(){Uhb(this.a)};_.Hc=function VYd(a){return Mhb(this.a,a)};_.Kc=function WYd(){var a;return a=new nib((new eib(this.a)).a),new ZYd(a)};_.Mc=function XYd(a){return QYd(this,a)};_.gc=function YYd(){return Vhb(this.a)};var s7=mdb(qte,'ETypeParameterImpl/2/1',556);bcb(557,1,aie,ZYd);_.Nb=function $Yd(a){Rrb(this,a)};_.Pb=function aZd(){return BD(lib(this.a).cd(),87)};_.Ob=function _Yd(){return this.a.b};_.Qb=function bZd(){mib(this.a)};var r7=mdb(qte,'ETypeParameterImpl/2/1/1',557);bcb(1276,43,fke,cZd);_._b=function dZd(a){return ND(a)?Qhb(this,a):!!irb(this.f,a)};_.xc=function eZd(a){var b,c;b=ND(a)?Phb(this,a):Wd(irb(this.f,a));if(JD(b,837)){c=BD(b,837);b=c._j();Rhb(this,BD(a,235),b);return b}else return b!=null?b:a==null?(g5d(),f5d):null};var w7=mdb(qte,'EValidatorRegistryImpl',1276);bcb(1313,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,1941:1,49:1,97:1,150:1,114:1,115:1},mZd);_.Ih=function nZd(a,b){switch(a.yj()){case 21:case 22:case 23:case 24:case 26:case 31:case 32:case 37:case 38:case 39:case 40:case 43:case 44:case 48:case 49:case 20:return b==null?null:fcb(b);case 25:return gZd(b);case 27:return hZd(b);case 28:return iZd(b);case 29:return b==null?null:CQd(Pmd[0],BD(b,199));case 41:return b==null?'':hdb(BD(b,290));case 42:return fcb(b);case 50:return GD(b);default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function oZd(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;switch(a.G==-1&&(a.G=(m=bKd(a),m?HLd(m.Mh(),a):-1)),a.G){case 0:return c=new OJd,c;case 1:return b=new RHd,b;case 2:return d=new hLd,d;case 4:return e=new MPd,e;case 5:return f=new aQd,f;case 6:return g=new rQd,g;case 7:return h=new $md,h;case 10:return j=new MGd,j;case 11:return k=new SSd,k;case 12:return l=new eod,l;case 13:return n=new rUd,n;case 14:return o=new FUd,o;case 17:return p=new XUd,p;case 18:return i=new UQd,i;case 19:return q=new BYd,q;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function pZd(a,b){switch(a.yj()){case 20:return b==null?null:new tgb(b);case 21:return b==null?null:new Ygb(b);case 23:case 22:return b==null?null:fZd(b);case 26:case 24:return b==null?null:Scb(Icb(b,-128,127)<<24>>24);case 25:return Xmd(b);case 27:return jZd(b);case 28:return kZd(b);case 29:return lZd(b);case 32:case 31:return b==null?null:Hcb(b);case 38:case 37:return b==null?null:new Odb(b);case 40:case 39:return b==null?null:meb(Icb(b,Rie,Ohe));case 41:return null;case 42:return b==null?null:null;case 44:case 43:return b==null?null:Aeb(Jcb(b));case 49:case 48:return b==null?null:Web(Icb(b,awe,32767)<<16>>16);case 50:return b;default:throw vbb(new Wdb(tte+a.ne()+ute));}};var x7=mdb(qte,'EcoreFactoryImpl',1313);bcb(547,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,1939:1,49:1,97:1,150:1,179:1,547:1,114:1,115:1,675:1},AZd);_.gb=false;_.hb=false;var rZd,sZd=false;var o8=mdb(qte,'EcorePackageImpl',547);bcb(1184,1,{837:1},EZd);_._j=function FZd(){return I6d(),H6d};var I7=mdb(qte,'EcorePackageImpl/1',1184);bcb(1193,1,nwe,GZd);_.wj=function HZd(a){return JD(a,147)};_.xj=function IZd(a){return KC(k5,Uhe,147,a,0,1)};var y7=mdb(qte,'EcorePackageImpl/10',1193);bcb(1194,1,nwe,JZd);_.wj=function KZd(a){return JD(a,191)};_.xj=function LZd(a){return KC(l5,Uhe,191,a,0,1)};var z7=mdb(qte,'EcorePackageImpl/11',1194);bcb(1195,1,nwe,MZd);_.wj=function NZd(a){return JD(a,56)};_.xj=function OZd(a){return KC(m5,Uhe,56,a,0,1)};var A7=mdb(qte,'EcorePackageImpl/12',1195);bcb(1196,1,nwe,PZd);_.wj=function QZd(a){return JD(a,399)};_.xj=function RZd(a){return KC(n5,Nve,59,a,0,1)};var B7=mdb(qte,'EcorePackageImpl/13',1196);bcb(1197,1,nwe,SZd);_.wj=function TZd(a){return JD(a,235)};_.xj=function UZd(a){return KC(o5,Uhe,235,a,0,1)};var C7=mdb(qte,'EcorePackageImpl/14',1197);bcb(1198,1,nwe,VZd);_.wj=function WZd(a){return JD(a,509)};_.xj=function XZd(a){return KC(p5,Uhe,2017,a,0,1)};var D7=mdb(qte,'EcorePackageImpl/15',1198);bcb(1199,1,nwe,YZd);_.wj=function ZZd(a){return JD(a,99)};_.xj=function $Zd(a){return KC(q5,Mve,18,a,0,1)};var E7=mdb(qte,'EcorePackageImpl/16',1199);bcb(1200,1,nwe,_Zd);_.wj=function a$d(a){return JD(a,170)};_.xj=function b$d(a){return KC(t5,Mve,170,a,0,1)};var F7=mdb(qte,'EcorePackageImpl/17',1200);bcb(1201,1,nwe,c$d);_.wj=function d$d(a){return JD(a,472)};_.xj=function e$d(a){return KC(v5,Uhe,472,a,0,1)};var G7=mdb(qte,'EcorePackageImpl/18',1201);bcb(1202,1,nwe,f$d);_.wj=function g$d(a){return JD(a,548)};_.xj=function h$d(a){return KC(x6,kve,548,a,0,1)};var H7=mdb(qte,'EcorePackageImpl/19',1202);bcb(1185,1,nwe,i$d);_.wj=function j$d(a){return JD(a,322)};_.xj=function k$d(a){return KC(b5,Mve,34,a,0,1)};var T7=mdb(qte,'EcorePackageImpl/2',1185);bcb(1203,1,nwe,l$d);_.wj=function m$d(a){return JD(a,241)};_.xj=function n$d(a){return KC(j5,Tve,87,a,0,1)};var J7=mdb(qte,'EcorePackageImpl/20',1203);bcb(1204,1,nwe,o$d);_.wj=function p$d(a){return JD(a,444)};_.xj=function q$d(a){return KC(u5,Uhe,836,a,0,1)};var K7=mdb(qte,'EcorePackageImpl/21',1204);bcb(1205,1,nwe,r$d);_.wj=function s$d(a){return KD(a)};_.xj=function t$d(a){return KC(wI,nie,476,a,8,1)};var L7=mdb(qte,'EcorePackageImpl/22',1205);bcb(1206,1,nwe,u$d);_.wj=function v$d(a){return JD(a,190)};_.xj=function w$d(a){return KC(SD,nie,190,a,0,2)};var M7=mdb(qte,'EcorePackageImpl/23',1206);bcb(1207,1,nwe,x$d);_.wj=function y$d(a){return JD(a,217)};_.xj=function z$d(a){return KC(xI,nie,217,a,0,1)};var N7=mdb(qte,'EcorePackageImpl/24',1207);bcb(1208,1,nwe,A$d);_.wj=function B$d(a){return JD(a,172)};_.xj=function C$d(a){return KC(yI,nie,172,a,0,1)};var O7=mdb(qte,'EcorePackageImpl/25',1208);bcb(1209,1,nwe,D$d);_.wj=function E$d(a){return JD(a,199)};_.xj=function F$d(a){return KC($J,nie,199,a,0,1)};var P7=mdb(qte,'EcorePackageImpl/26',1209);bcb(1210,1,nwe,G$d);_.wj=function H$d(a){return false};_.xj=function I$d(a){return KC(O4,Uhe,2110,a,0,1)};var Q7=mdb(qte,'EcorePackageImpl/27',1210);bcb(1211,1,nwe,J$d);_.wj=function K$d(a){return LD(a)};_.xj=function L$d(a){return KC(BI,nie,333,a,7,1)};var R7=mdb(qte,'EcorePackageImpl/28',1211);bcb(1212,1,nwe,M$d);_.wj=function N$d(a){return JD(a,58)};_.xj=function O$d(a){return KC(T4,eme,58,a,0,1)};var S7=mdb(qte,'EcorePackageImpl/29',1212);bcb(1186,1,nwe,P$d);_.wj=function Q$d(a){return JD(a,510)};_.xj=function R$d(a){return KC(a5,{3:1,4:1,5:1,1934:1},590,a,0,1)};var c8=mdb(qte,'EcorePackageImpl/3',1186);bcb(1213,1,nwe,S$d);_.wj=function T$d(a){return JD(a,573)};_.xj=function U$d(a){return KC(U4,Uhe,1940,a,0,1)};var U7=mdb(qte,'EcorePackageImpl/30',1213);bcb(1214,1,nwe,V$d);_.wj=function W$d(a){return JD(a,153)};_.xj=function X$d(a){return KC(O9,eme,153,a,0,1)};var V7=mdb(qte,'EcorePackageImpl/31',1214);bcb(1215,1,nwe,Y$d);_.wj=function Z$d(a){return JD(a,72)};_.xj=function $$d(a){return KC(E9,owe,72,a,0,1)};var W7=mdb(qte,'EcorePackageImpl/32',1215);bcb(1216,1,nwe,_$d);_.wj=function a_d(a){return JD(a,155)};_.xj=function b_d(a){return KC(FI,nie,155,a,0,1)};var X7=mdb(qte,'EcorePackageImpl/33',1216);bcb(1217,1,nwe,c_d);_.wj=function d_d(a){return JD(a,19)};_.xj=function e_d(a){return KC(JI,nie,19,a,0,1)};var Y7=mdb(qte,'EcorePackageImpl/34',1217);bcb(1218,1,nwe,f_d);_.wj=function g_d(a){return JD(a,290)};_.xj=function h_d(a){return KC(AI,Uhe,290,a,0,1)};var Z7=mdb(qte,'EcorePackageImpl/35',1218);bcb(1219,1,nwe,i_d);_.wj=function j_d(a){return JD(a,162)};_.xj=function k_d(a){return KC(MI,nie,162,a,0,1)};var $7=mdb(qte,'EcorePackageImpl/36',1219);bcb(1220,1,nwe,l_d);_.wj=function m_d(a){return JD(a,83)};_.xj=function n_d(a){return KC(DK,Uhe,83,a,0,1)};var _7=mdb(qte,'EcorePackageImpl/37',1220);bcb(1221,1,nwe,o_d);_.wj=function p_d(a){return JD(a,591)};_.xj=function q_d(a){return KC(v8,Uhe,591,a,0,1)};var a8=mdb(qte,'EcorePackageImpl/38',1221);bcb(1222,1,nwe,r_d);_.wj=function s_d(a){return false};_.xj=function t_d(a){return KC(u8,Uhe,2111,a,0,1)};var b8=mdb(qte,'EcorePackageImpl/39',1222);bcb(1187,1,nwe,u_d);_.wj=function v_d(a){return JD(a,88)};_.xj=function w_d(a){return KC(c5,Uhe,26,a,0,1)};var i8=mdb(qte,'EcorePackageImpl/4',1187);bcb(1223,1,nwe,x_d);_.wj=function y_d(a){return JD(a,184)};_.xj=function z_d(a){return KC(UI,nie,184,a,0,1)};var d8=mdb(qte,'EcorePackageImpl/40',1223);bcb(1224,1,nwe,A_d);_.wj=function B_d(a){return ND(a)};_.xj=function C_d(a){return KC(ZI,nie,2,a,6,1)};var e8=mdb(qte,'EcorePackageImpl/41',1224);bcb(1225,1,nwe,D_d);_.wj=function E_d(a){return JD(a,588)};_.xj=function F_d(a){return KC(X4,Uhe,588,a,0,1)};var f8=mdb(qte,'EcorePackageImpl/42',1225);bcb(1226,1,nwe,G_d);_.wj=function H_d(a){return false};_.xj=function I_d(a){return KC(V4,nie,2112,a,0,1)};var g8=mdb(qte,'EcorePackageImpl/43',1226);bcb(1227,1,nwe,J_d);_.wj=function K_d(a){return JD(a,42)};_.xj=function L_d(a){return KC(CK,zie,42,a,0,1)};var h8=mdb(qte,'EcorePackageImpl/44',1227);bcb(1188,1,nwe,M_d);_.wj=function N_d(a){return JD(a,138)};_.xj=function O_d(a){return KC(d5,Uhe,138,a,0,1)};var j8=mdb(qte,'EcorePackageImpl/5',1188);bcb(1189,1,nwe,P_d);_.wj=function Q_d(a){return JD(a,148)};_.xj=function R_d(a){return KC(f5,Uhe,148,a,0,1)};var k8=mdb(qte,'EcorePackageImpl/6',1189);bcb(1190,1,nwe,S_d);_.wj=function T_d(a){return JD(a,457)};_.xj=function U_d(a){return KC(h5,Uhe,671,a,0,1)};var l8=mdb(qte,'EcorePackageImpl/7',1190);bcb(1191,1,nwe,V_d);_.wj=function W_d(a){return JD(a,573)};_.xj=function X_d(a){return KC(g5,Uhe,678,a,0,1)};var m8=mdb(qte,'EcorePackageImpl/8',1191);bcb(1192,1,nwe,Y_d);_.wj=function Z_d(a){return JD(a,471)};_.xj=function $_d(a){return KC(i5,Uhe,471,a,0,1)};var n8=mdb(qte,'EcorePackageImpl/9',1192);bcb(1025,1982,ive,c0d);_.bi=function d0d(a,b){__d(this,BD(b,415))};_.fi=function e0d(a,b){a0d(this,a,BD(b,415))};var q8=mdb(qte,'MinimalEObjectImpl/1ArrayDelegatingAdapterList',1025);bcb(1026,143,fve,f0d);_.Ai=function g0d(){return this.a.a};var p8=mdb(qte,'MinimalEObjectImpl/1ArrayDelegatingAdapterList/1',1026);bcb(1053,1052,{},i0d);var t8=mdb('org.eclipse.emf.ecore.plugin','EcorePlugin',1053);var v8=odb(pwe,'Resource');bcb(781,1378,qwe);_.Yk=function m0d(a){};_.Zk=function n0d(a){};_.Vk=function o0d(){return !this.a&&(this.a=new z0d(this)),this.a};_.Wk=function p0d(a){var b,c,d,e,f;d=a.length;if(d>0){BCb(0,a.length);if(a.charCodeAt(0)==47){f=new Skb(4);e=1;for(b=1;b0&&(a=a.substr(0,c))}}}return k0d(this,a)};_.Xk=function q0d(){return this.c};_.Ib=function r0d(){var a;return hdb(this.gm)+'@'+(a=tb(this)>>>0,a.toString(16))+" uri='"+this.d+"'"};_.b=false;var z8=mdb(rwe,'ResourceImpl',781);bcb(1379,781,qwe,s0d);var w8=mdb(rwe,'BinaryResourceImpl',1379);bcb(1169,694,pue);_.si=function v0d(a){return JD(a,56)?t0d(this,BD(a,56)):JD(a,591)?new Fyd(BD(a,591).Vk()):PD(a)===PD(this.f)?BD(a,14).Kc():(LCd(),KCd.a)};_.Ob=function w0d(){return u0d(this)};_.a=false;var z9=mdb(yve,'EcoreUtil/ContentTreeIterator',1169);bcb(1380,1169,pue,x0d);_.si=function y0d(a){return PD(a)===PD(this.f)?BD(a,15).Kc():new C6d(BD(a,56))};var x8=mdb(rwe,'ResourceImpl/5',1380);bcb(648,1994,Ove,z0d);_.Hc=function A0d(a){return this.i<=4?pud(this,a):JD(a,49)&&BD(a,49).Zg()==this.a};_.bi=function B0d(a,b){a==this.i-1&&(this.a.b||(this.a.b=true,null))};_.di=function C0d(a,b){a==0?this.a.b||(this.a.b=true,null):Atd(this,a,b)};_.fi=function D0d(a,b){};_.gi=function E0d(a,b,c){};_.aj=function F0d(){return 2};_.Ai=function G0d(){return this.a};_.bj=function H0d(){return true};_.cj=function I0d(a,b){var c;c=BD(a,49);b=c.wh(this.a,b);return b};_.dj=function J0d(a,b){var c;c=BD(a,49);return c.wh(null,b)};_.ej=function K0d(){return false};_.hi=function L0d(){return true};_.ri=function M0d(a){return KC(m5,Uhe,56,a,0,1)};_.ni=function N0d(){return false};var y8=mdb(rwe,'ResourceImpl/ContentsEList',648);bcb(957,1964,Lie,O0d);_.Zc=function P0d(a){return this.a._h(a)};_.gc=function Q0d(){return this.a.gc()};var A8=mdb(yve,'AbstractSequentialInternalEList/1',957);var K6d,L6d,M6d,N6d;bcb(624,1,{},y1d);var R0d,S0d;var G8=mdb(yve,'BasicExtendedMetaData',624);bcb(1160,1,{},C1d);_.$k=function D1d(){return null};_._k=function E1d(){this.a==-2&&A1d(this,W0d(this.d,this.b));return this.a};_.al=function F1d(){return null};_.bl=function G1d(){return mmb(),mmb(),jmb};_.ne=function H1d(){this.c==Gwe&&B1d(this,_0d(this.d,this.b));return this.c};_.cl=function I1d(){return 0};_.a=-2;_.c=Gwe;var C8=mdb(yve,'BasicExtendedMetaData/EClassExtendedMetaDataImpl',1160);bcb(1161,1,{},O1d);_.$k=function P1d(){this.a==(T0d(),R0d)&&J1d(this,V0d(this.f,this.b));return this.a};_._k=function Q1d(){return 0};_.al=function R1d(){this.c==(T0d(),R0d)&&K1d(this,Z0d(this.f,this.b));return this.c};_.bl=function S1d(){!this.d&&L1d(this,$0d(this.f,this.b));return this.d};_.ne=function T1d(){this.e==Gwe&&M1d(this,_0d(this.f,this.b));return this.e};_.cl=function U1d(){this.g==-2&&N1d(this,c1d(this.f,this.b));return this.g};_.e=Gwe;_.g=-2;var D8=mdb(yve,'BasicExtendedMetaData/EDataTypeExtendedMetaDataImpl',1161);bcb(1159,1,{},Y1d);_.b=false;_.c=false;var E8=mdb(yve,'BasicExtendedMetaData/EPackageExtendedMetaDataImpl',1159);bcb(1162,1,{},j2d);_.c=-2;_.e=Gwe;_.f=Gwe;var F8=mdb(yve,'BasicExtendedMetaData/EStructuralFeatureExtendedMetaDataImpl',1162);bcb(585,622,Pve,k2d);_.aj=function l2d(){return this.c};_.Fk=function m2d(){return false};_.li=function n2d(a,b){return b};_.c=0;var T8=mdb(yve,'EDataTypeEList',585);var O9=odb(yve,'FeatureMap');bcb(75,585,{3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},u3d);_.Vc=function v3d(a,b){o2d(this,a,BD(b,72))};_.Fc=function w3d(a){return r2d(this,BD(a,72))};_.Yh=function B3d(a){w2d(this,BD(a,72))};_.cj=function M3d(a,b){return O2d(this,BD(a,72),b)};_.dj=function N3d(a,b){return Q2d(this,BD(a,72),b)};_.ii=function P3d(a,b){return W2d(this,a,b)};_.li=function R3d(a,b){return _2d(this,a,BD(b,72))};_._c=function T3d(a,b){return c3d(this,a,BD(b,72))};_.jj=function X3d(a,b){return i3d(this,BD(a,72),b)};_.kj=function Y3d(a,b){return k3d(this,BD(a,72),b)};_.lj=function Z3d(a,b,c){return l3d(this,BD(a,72),BD(b,72),c)};_.oi=function _3d(a,b){return t3d(this,a,BD(b,72))};_.dl=function x3d(a,b){return q2d(this,a,b)};_.Wc=function y3d(a,b){var c,d,e,f,g,h,i,j,k;j=new zud(b.gc());for(e=b.Kc();e.Ob();){d=BD(e.Pb(),72);f=d.ak();if(T6d(this.e,f)){(!f.hi()||!E2d(this,f,d.dd())&&!pud(j,d))&&wtd(j,d)}else{k=S6d(this.e.Tg(),f);c=BD(this.g,119);g=true;for(h=0;h=0){b=a[this.c];if(this.k.rl(b.ak())){this.j=this.f?b:b.dd();this.i=-2;return true}}this.i=-1;this.g=-1;return false};var H8=mdb(yve,'BasicFeatureMap/FeatureEIterator',410);bcb(662,410,jie,s4d);_.Lk=function t4d(){return true};var I8=mdb(yve,'BasicFeatureMap/ResolvingFeatureEIterator',662);bcb(955,486,Vve,u4d);_.Gi=function v4d(){return this};var M8=mdb(yve,'EContentsEList/1',955);bcb(956,486,Vve,w4d);_.Lk=function x4d(){return false};var N8=mdb(yve,'EContentsEList/2',956);bcb(954,279,Wve,y4d);_.Nk=function z4d(a){};_.Ob=function A4d(){return false};_.Sb=function B4d(){return false};var O8=mdb(yve,'EContentsEList/FeatureIteratorImpl/1',954);bcb(825,585,Pve,C4d);_.ci=function D4d(){this.a=true};_.fj=function E4d(){return this.a};_.Xj=function F4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var S8=mdb(yve,'EDataTypeEList/Unsettable',825);bcb(1849,585,Pve,G4d);_.hi=function H4d(){return true};var V8=mdb(yve,'EDataTypeUniqueEList',1849);bcb(1850,825,Pve,I4d);_.hi=function J4d(){return true};var U8=mdb(yve,'EDataTypeUniqueEList/Unsettable',1850);bcb(139,85,Pve,K4d);_.Ek=function L4d(){return true};_.li=function M4d(a,b){return ILd(this,a,BD(b,56))};var W8=mdb(yve,'EObjectContainmentEList/Resolving',139);bcb(1163,545,Pve,N4d);_.Ek=function O4d(){return true};_.li=function P4d(a,b){return ILd(this,a,BD(b,56))};var X8=mdb(yve,'EObjectContainmentEList/Unsettable/Resolving',1163);bcb(748,16,Pve,Q4d);_.ci=function R4d(){this.a=true};_.fj=function S4d(){return this.a};_.Xj=function T4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var a9=mdb(yve,'EObjectContainmentWithInverseEList/Unsettable',748);bcb(1173,748,Pve,U4d);_.Ek=function V4d(){return true};_.li=function W4d(a,b){return ILd(this,a,BD(b,56))};var _8=mdb(yve,'EObjectContainmentWithInverseEList/Unsettable/Resolving',1173);bcb(743,496,Pve,X4d);_.ci=function Y4d(){this.a=true};_.fj=function Z4d(){return this.a};_.Xj=function $4d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var c9=mdb(yve,'EObjectEList/Unsettable',743);bcb(328,496,Pve,_4d);_.Ek=function a5d(){return true};_.li=function b5d(a,b){return ILd(this,a,BD(b,56))};var f9=mdb(yve,'EObjectResolvingEList',328);bcb(1641,743,Pve,c5d);_.Ek=function d5d(){return true};_.li=function e5d(a,b){return ILd(this,a,BD(b,56))};var e9=mdb(yve,'EObjectResolvingEList/Unsettable',1641);bcb(1381,1,{},h5d);var f5d;var g9=mdb(yve,'EObjectValidator',1381);bcb(546,496,Pve,i5d);_.zk=function j5d(){return this.d};_.Ak=function k5d(){return this.b};_.bj=function l5d(){return true};_.Dk=function m5d(){return true};_.b=0;var k9=mdb(yve,'EObjectWithInverseEList',546);bcb(1176,546,Pve,n5d);_.Ck=function o5d(){return true};var h9=mdb(yve,'EObjectWithInverseEList/ManyInverse',1176);bcb(625,546,Pve,p5d);_.ci=function q5d(){this.a=true};_.fj=function r5d(){return this.a};_.Xj=function s5d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var j9=mdb(yve,'EObjectWithInverseEList/Unsettable',625);bcb(1175,625,Pve,t5d);_.Ck=function u5d(){return true};var i9=mdb(yve,'EObjectWithInverseEList/Unsettable/ManyInverse',1175);bcb(749,546,Pve,v5d);_.Ek=function w5d(){return true};_.li=function x5d(a,b){return ILd(this,a,BD(b,56))};var o9=mdb(yve,'EObjectWithInverseResolvingEList',749);bcb(31,749,Pve,y5d);_.Ck=function z5d(){return true};var l9=mdb(yve,'EObjectWithInverseResolvingEList/ManyInverse',31);bcb(750,625,Pve,A5d);_.Ek=function B5d(){return true};_.li=function C5d(a,b){return ILd(this,a,BD(b,56))};var n9=mdb(yve,'EObjectWithInverseResolvingEList/Unsettable',750);bcb(1174,750,Pve,D5d);_.Ck=function E5d(){return true};var m9=mdb(yve,'EObjectWithInverseResolvingEList/Unsettable/ManyInverse',1174);bcb(1164,622,Pve);_.ai=function F5d(){return (this.b&1792)==0};_.ci=function G5d(){this.b|=1};_.Bk=function H5d(){return (this.b&4)!=0};_.bj=function I5d(){return (this.b&40)!=0};_.Ck=function J5d(){return (this.b&16)!=0};_.Dk=function K5d(){return (this.b&8)!=0};_.Ek=function L5d(){return (this.b&Dve)!=0};_.rk=function M5d(){return (this.b&32)!=0};_.Fk=function N5d(){return (this.b&zte)!=0};_.wj=function O5d(a){return !this.d?this.ak().Yj().wj(a):qEd(this.d,a)};_.fj=function P5d(){return (this.b&2)!=0?(this.b&1)!=0:this.i!=0};_.hi=function Q5d(){return (this.b&128)!=0};_.Xj=function S5d(){var a;Uxd(this);if((this.b&2)!=0){if(oid(this.e)){a=(this.b&1)!=0;this.b&=-2;GLd(this,new qSd(this.e,2,bLd(this.e.Tg(),this.ak()),a,false))}else{this.b&=-2}}};_.ni=function T5d(){return (this.b&1536)==0};_.b=0;var q9=mdb(yve,'EcoreEList/Generic',1164);bcb(1165,1164,Pve,U5d);_.ak=function V5d(){return this.a};var p9=mdb(yve,'EcoreEList/Dynamic',1165);bcb(747,63,oue,W5d);_.ri=function X5d(a){return izd(this.a.a,a)};var u9=mdb(yve,'EcoreEMap/1',747);bcb(746,85,Pve,Y5d);_.bi=function Z5d(a,b){uAd(this.b,BD(b,133))};_.di=function $5d(a,b){tAd(this.b)};_.ei=function _5d(a,b,c){var d;++(d=this.b,BD(b,133),d).e};_.fi=function a6d(a,b){vAd(this.b,BD(b,133))};_.gi=function b6d(a,b,c){vAd(this.b,BD(c,133));PD(c)===PD(b)&&BD(c,133).Th(CAd(BD(b,133).cd()));uAd(this.b,BD(b,133))};var v9=mdb(yve,'EcoreEMap/DelegateEObjectContainmentEList',746);bcb(1171,151,Ave,c6d);var x9=mdb(yve,'EcoreEMap/Unsettable',1171);bcb(1172,746,Pve,d6d);_.ci=function e6d(){this.a=true};_.fj=function f6d(){return this.a};_.Xj=function g6d(){var a;Uxd(this);if(oid(this.e)){a=this.a;this.a=false;Uhd(this.e,new qSd(this.e,2,this.c,a,false))}else{this.a=false}};_.a=false;var w9=mdb(yve,'EcoreEMap/Unsettable/UnsettableDelegateEObjectContainmentEList',1172);bcb(1168,228,fke,A6d);_.a=false;_.b=false;var A9=mdb(yve,'EcoreUtil/Copier',1168);bcb(745,1,aie,C6d);_.Nb=function D6d(a){Rrb(this,a)};_.Ob=function E6d(){return B6d(this)};_.Pb=function F6d(){var a;B6d(this);a=this.b;this.b=null;return a};_.Qb=function G6d(){this.a.Qb()};var B9=mdb(yve,'EcoreUtil/ProperContentIterator',745);bcb(1382,1381,{},J6d);var H6d;var C9=mdb(yve,'EcoreValidator',1382);var P6d;var N9=odb(yve,'FeatureMapUtil/Validator');bcb(1260,1,{1942:1},U6d);_.rl=function V6d(a){return true};var F9=mdb(yve,'FeatureMapUtil/1',1260);bcb(757,1,{1942:1},Z6d);_.rl=function $6d(a){var b;if(this.c==a)return true;b=DD(Ohb(this.a,a));if(b==null){if(Y6d(this,a)){_6d(this.a,a,(Bcb(),Acb));return true}else{_6d(this.a,a,(Bcb(),zcb));return false}}else{return b==(Bcb(),Acb)}};_.e=false;var W6d;var I9=mdb(yve,'FeatureMapUtil/BasicValidator',757);bcb(758,43,fke,a7d);var H9=mdb(yve,'FeatureMapUtil/BasicValidator/Cache',758);bcb(501,52,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,69:1,95:1},f7d);_.Vc=function g7d(a,b){p2d(this.c,this.b,a,b)};_.Fc=function h7d(a){return q2d(this.c,this.b,a)};_.Wc=function i7d(a,b){return s2d(this.c,this.b,a,b)};_.Gc=function j7d(a){return b7d(this,a)};_.Xh=function k7d(a,b){u2d(this.c,this.b,a,b)};_.lk=function l7d(a,b){return x2d(this.c,this.b,a,b)};_.pi=function m7d(a){return J2d(this.c,this.b,a,false)};_.Zh=function n7d(){return y2d(this.c,this.b)};_.$h=function o7d(){return z2d(this.c,this.b)};_._h=function p7d(a){return A2d(this.c,this.b,a)};_.mk=function q7d(a,b){return c7d(this,a,b)};_.$b=function r7d(){d7d(this)};_.Hc=function s7d(a){return E2d(this.c,this.b,a)};_.Ic=function t7d(a){return G2d(this.c,this.b,a)};_.Xb=function u7d(a){return J2d(this.c,this.b,a,true)};_.Wj=function v7d(a){return this};_.Xc=function w7d(a){return L2d(this.c,this.b,a)};_.dc=function x7d(){return e7d(this)};_.fj=function y7d(){return !R2d(this.c,this.b)};_.Kc=function z7d(){return S2d(this.c,this.b)};_.Yc=function A7d(){return U2d(this.c,this.b)};_.Zc=function B7d(a){return V2d(this.c,this.b,a)};_.ii=function C7d(a,b){return X2d(this.c,this.b,a,b)};_.ji=function D7d(a,b){Y2d(this.c,this.b,a,b)};_.$c=function E7d(a){return Z2d(this.c,this.b,a)};_.Mc=function F7d(a){return $2d(this.c,this.b,a)};_._c=function G7d(a,b){return e3d(this.c,this.b,a,b)};_.Wb=function H7d(a){D2d(this.c,this.b);b7d(this,BD(a,15))};_.gc=function I7d(){return n3d(this.c,this.b)};_.Pc=function J7d(){return o3d(this.c,this.b)};_.Qc=function K7d(a){return q3d(this.c,this.b,a)};_.Ib=function L7d(){var a,b;b=new Hfb;b.a+='[';for(a=y2d(this.c,this.b);b4d(a);){Efb(b,xfb(d4d(a)));b4d(a)&&(b.a+=She,b)}b.a+=']';return b.a};_.Xj=function M7d(){D2d(this.c,this.b)};var J9=mdb(yve,'FeatureMapUtil/FeatureEList',501);bcb(627,36,fve,O7d);_.yi=function P7d(a){return N7d(this,a)};_.Di=function Q7d(a){var b,c,d,e,f,g,h;switch(this.d){case 1:case 2:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.g=a.zi();a.xi()==1&&(this.d=1);return true}break}case 3:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=5;b=new zud(2);wtd(b,this.g);wtd(b,a.zi());this.g=b;return true}break}}break}case 5:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){c=BD(this.g,14);c.Fc(a.zi());return true}break}}break}case 4:{e=a.xi();switch(e){case 3:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=1;this.g=a.zi();return true}break}case 4:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){this.d=6;h=new zud(2);wtd(h,this.n);wtd(h,a.Bi());this.n=h;g=OC(GC(WD,1),oje,25,15,[this.o,a.Ci()]);this.g=g;return true}break}}break}case 6:{e=a.xi();switch(e){case 4:{f=a.Ai();if(PD(f)===PD(this.c)&&N7d(this,null)==a.yi(null)){c=BD(this.n,14);c.Fc(a.Bi());g=BD(this.g,48);d=KC(WD,oje,25,g.length+1,15,1);$fb(g,0,d,0,g.length);d[g.length]=a.Ci();this.g=d;return true}break}}break}}return false};var K9=mdb(yve,'FeatureMapUtil/FeatureENotificationImpl',627);bcb(552,501,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},R7d);_.dl=function S7d(a,b){return q2d(this.c,a,b)};_.el=function T7d(a,b,c){return x2d(this.c,a,b,c)};_.fl=function U7d(a,b,c){return C2d(this.c,a,b,c)};_.gl=function V7d(){return this};_.hl=function W7d(a,b){return K2d(this.c,a,b)};_.il=function X7d(a){return BD(J2d(this.c,this.b,a,false),72).ak()};_.jl=function Y7d(a){return BD(J2d(this.c,this.b,a,false),72).dd()};_.kl=function Z7d(){return this.a};_.ll=function $7d(a){return !R2d(this.c,a)};_.ml=function _7d(a,b){f3d(this.c,a,b)};_.nl=function a8d(a){return g3d(this.c,a)};_.ol=function b8d(a){s3d(this.c,a)};var L9=mdb(yve,'FeatureMapUtil/FeatureFeatureMap',552);bcb(1259,1,zve,c8d);_.Wj=function d8d(a){return J2d(this.b,this.a,-1,a)};_.fj=function e8d(){return !R2d(this.b,this.a)};_.Wb=function f8d(a){f3d(this.b,this.a,a)};_.Xj=function g8d(){D2d(this.b,this.a)};var M9=mdb(yve,'FeatureMapUtil/FeatureValue',1259);var h8d,i8d,j8d,k8d,l8d;var Q9=odb(Iwe,'AnyType');bcb(666,60,Tie,n8d);var R9=mdb(Iwe,'InvalidDatatypeValueException',666);var S9=odb(Iwe,Jwe);var T9=odb(Iwe,Kwe);var U9=odb(Iwe,Lwe);var o8d;var q8d;var s8d,t8d,u8d,v8d,w8d,x8d,y8d,z8d,A8d,B8d,C8d,D8d,E8d,F8d,G8d,H8d,I8d,J8d,K8d,L8d,M8d,N8d,O8d,P8d;bcb(830,506,{105:1,92:1,90:1,56:1,49:1,97:1,843:1},R8d);_._g=function S8d(a,b,c){switch(a){case 0:if(c)return !this.c&&(this.c=new u3d(this,0)),this.c;return !this.c&&(this.c=new u3d(this,0)),this.c.b;case 1:if(c)return !this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153);return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).kl();case 2:if(c)return !this.b&&(this.b=new u3d(this,2)),this.b;return !this.b&&(this.b=new u3d(this,2)),this.b.b;}return bid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.jh=function T8d(a,b,c){var d;switch(b){case 0:return !this.c&&(this.c=new u3d(this,0)),B2d(this.c,a,c);case 1:return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),69)).mk(a,c);case 2:return !this.b&&(this.b=new u3d(this,2)),B2d(this.b,a,c);}return d=BD(XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),b),66),d.Nj().Rj(this,Aid(this),b-aLd(this.zh()),a,c)};_.lh=function U8d(a){switch(a){case 0:return !!this.c&&this.c.i!=0;case 1:return !(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).dc();case 2:return !!this.b&&this.b.i!=0;}return cid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function V8d(a,b){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));d3d(this.c,b);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).Wb(b);return;case 2:!this.b&&(this.b=new u3d(this,2));d3d(this.b,b);return;}did(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function W8d(){return Q8d(),s8d};_.Bh=function X8d(a){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));Uxd(this.c);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).$b();return;case 2:!this.b&&(this.b=new u3d(this,2));Uxd(this.b);return;}eid(this,a-aLd(this.zh()),XKd((this.j&2)==0?this.zh():(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function Y8d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (mixed: ';Dfb(a,this.c);a.a+=', anyAttribute: ';Dfb(a,this.b);a.a+=')';return a.a};var V9=mdb(Mwe,'AnyTypeImpl',830);bcb(667,506,{105:1,92:1,90:1,56:1,49:1,97:1,2021:1,667:1},_8d);_._g=function a9d(a,b,c){switch(a){case 0:return this.a;case 1:return this.b;}return bid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.lh=function b9d(a){switch(a){case 0:return this.a!=null;case 1:return this.b!=null;}return cid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function c9d(a,b){switch(a){case 0:Z8d(this,GD(b));return;case 1:$8d(this,GD(b));return;}did(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function d9d(){return Q8d(),F8d};_.Bh=function e9d(a){switch(a){case 0:this.a=null;return;case 1:this.b=null;return;}eid(this,a-aLd((Q8d(),F8d)),XKd((this.j&2)==0?F8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function f9d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (data: ';Efb(a,this.a);a.a+=', target: ';Efb(a,this.b);a.a+=')';return a.a};_.a=null;_.b=null;var W9=mdb(Mwe,'ProcessingInstructionImpl',667);bcb(668,830,{105:1,92:1,90:1,56:1,49:1,97:1,843:1,2022:1,668:1},i9d);_._g=function j9d(a,b,c){switch(a){case 0:if(c)return !this.c&&(this.c=new u3d(this,0)),this.c;return !this.c&&(this.c=new u3d(this,0)),this.c.b;case 1:if(c)return !this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153);return (!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).kl();case 2:if(c)return !this.b&&(this.b=new u3d(this,2)),this.b;return !this.b&&(this.b=new u3d(this,2)),this.b.b;case 3:return !this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true));case 4:return j6d(this.a,(!this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))));case 5:return this.a;}return bid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.lh=function k9d(a){switch(a){case 0:return !!this.c&&this.c.i!=0;case 1:return !(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).dc();case 2:return !!this.b&&this.b.i!=0;case 3:return !this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))!=null;case 4:return j6d(this.a,(!this.c&&(this.c=new u3d(this,0)),GD(K2d(this.c,(Q8d(),I8d),true))))!=null;case 5:return !!this.a;}return cid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function l9d(a,b){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));d3d(this.c,b);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(BD(T2d(this.c,(Q8d(),t8d)),153),215)).Wb(b);return;case 2:!this.b&&(this.b=new u3d(this,2));d3d(this.b,b);return;case 3:h9d(this,GD(b));return;case 4:h9d(this,h6d(this.a,b));return;case 5:g9d(this,BD(b,148));return;}did(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function m9d(){return Q8d(),H8d};_.Bh=function n9d(a){switch(a){case 0:!this.c&&(this.c=new u3d(this,0));Uxd(this.c);return;case 1:(!this.c&&(this.c=new u3d(this,0)),BD(T2d(this.c,(Q8d(),t8d)),153)).$b();return;case 2:!this.b&&(this.b=new u3d(this,2));Uxd(this.b);return;case 3:!this.c&&(this.c=new u3d(this,0));f3d(this.c,(Q8d(),I8d),null);return;case 4:h9d(this,h6d(this.a,null));return;case 5:this.a=null;return;}eid(this,a-aLd((Q8d(),H8d)),XKd((this.j&2)==0?H8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};var X9=mdb(Mwe,'SimpleAnyTypeImpl',668);bcb(669,506,{105:1,92:1,90:1,56:1,49:1,97:1,2023:1,669:1},o9d);_._g=function p9d(a,b,c){switch(a){case 0:if(c)return !this.a&&(this.a=new u3d(this,0)),this.a;return !this.a&&(this.a=new u3d(this,0)),this.a.b;case 1:return c?(!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),this.b):(!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),FAd(this.b));case 2:return c?(!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),this.c):(!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),FAd(this.c));case 3:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),L8d));case 4:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),M8d));case 5:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),O8d));case 6:return !this.a&&(this.a=new u3d(this,0)),T2d(this.a,(Q8d(),P8d));}return bid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b,c)};_.jh=function q9d(a,b,c){var d;switch(b){case 0:return !this.a&&(this.a=new u3d(this,0)),B2d(this.a,a,c);case 1:return !this.b&&(this.b=new dId((jGd(),fGd),x6,this,1)),bId(this.b,a,c);case 2:return !this.c&&(this.c=new dId((jGd(),fGd),x6,this,2)),bId(this.c,a,c);case 5:return !this.a&&(this.a=new u3d(this,0)),c7d(T2d(this.a,(Q8d(),O8d)),a,c);}return d=BD(XKd((this.j&2)==0?(Q8d(),K8d):(!this.k&&(this.k=new HGd),this.k).ck(),b),66),d.Nj().Rj(this,Aid(this),b-aLd((Q8d(),K8d)),a,c)};_.lh=function r9d(a){switch(a){case 0:return !!this.a&&this.a.i!=0;case 1:return !!this.b&&this.b.f!=0;case 2:return !!this.c&&this.c.f!=0;case 3:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),L8d)));case 4:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),M8d)));case 5:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),O8d)));case 6:return !this.a&&(this.a=new u3d(this,0)),!e7d(T2d(this.a,(Q8d(),P8d)));}return cid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.sh=function s9d(a,b){switch(a){case 0:!this.a&&(this.a=new u3d(this,0));d3d(this.a,b);return;case 1:!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1));cId(this.b,b);return;case 2:!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2));cId(this.c,b);return;case 3:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),L8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,L8d),BD(b,14));return;case 4:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),M8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,M8d),BD(b,14));return;case 5:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),O8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,O8d),BD(b,14));return;case 6:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),P8d)));!this.a&&(this.a=new u3d(this,0));b7d(T2d(this.a,P8d),BD(b,14));return;}did(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a),b)};_.zh=function t9d(){return Q8d(),K8d};_.Bh=function u9d(a){switch(a){case 0:!this.a&&(this.a=new u3d(this,0));Uxd(this.a);return;case 1:!this.b&&(this.b=new dId((jGd(),fGd),x6,this,1));this.b.c.$b();return;case 2:!this.c&&(this.c=new dId((jGd(),fGd),x6,this,2));this.c.c.$b();return;case 3:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),L8d)));return;case 4:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),M8d)));return;case 5:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),O8d)));return;case 6:!this.a&&(this.a=new u3d(this,0));d7d(T2d(this.a,(Q8d(),P8d)));return;}eid(this,a-aLd((Q8d(),K8d)),XKd((this.j&2)==0?K8d:(!this.k&&(this.k=new HGd),this.k).ck(),a))};_.Ib=function v9d(){var a;if((this.j&4)!=0)return Eid(this);a=new Jfb(Eid(this));a.a+=' (mixed: ';Dfb(a,this.a);a.a+=')';return a.a};var Y9=mdb(Mwe,'XMLTypeDocumentRootImpl',669);bcb(1919,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1,2024:1},U9d);_.Ih=function V9d(a,b){switch(a.yj()){case 7:case 8:case 9:case 10:case 16:case 22:case 23:case 24:case 25:case 26:case 32:case 33:case 34:case 36:case 37:case 44:case 45:case 50:case 51:case 53:case 55:case 56:case 57:case 58:case 60:case 61:case 4:return b==null?null:fcb(b);case 19:case 28:case 29:case 35:case 38:case 39:case 41:case 46:case 52:case 54:case 5:return GD(b);case 6:return C9d(BD(b,190));case 12:case 47:case 49:case 11:return Vmd(this,a,b);case 13:return b==null?null:qgb(BD(b,240));case 15:case 14:return b==null?null:D9d(Edb(ED(b)));case 17:return E9d((Q8d(),b));case 18:return E9d(b);case 21:case 20:return b==null?null:F9d(BD(b,155).a);case 27:return G9d(BD(b,190));case 30:return H9d((Q8d(),BD(b,15)));case 31:return H9d(BD(b,15));case 40:return K9d((Q8d(),b));case 42:return I9d((Q8d(),b));case 43:return I9d(b);case 59:case 48:return J9d((Q8d(),b));default:throw vbb(new Wdb(tte+a.ne()+ute));}};_.Jh=function W9d(a){var b,c,d,e,f;switch(a.G==-1&&(a.G=(c=bKd(a),c?HLd(c.Mh(),a):-1)),a.G){case 0:return b=new R8d,b;case 1:return d=new _8d,d;case 2:return e=new i9d,e;case 3:return f=new o9d,f;default:throw vbb(new Wdb(xte+a.zb+ute));}};_.Kh=function X9d(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;switch(a.yj()){case 5:case 52:case 4:return b;case 6:return L9d(b);case 8:case 7:return b==null?null:B9d(b);case 9:return b==null?null:Scb(Icb((d=Qge(b,true),d.length>0&&(BCb(0,d.length),d.charCodeAt(0)==43)?d.substr(1):d),-128,127)<<24>>24);case 10:return b==null?null:Scb(Icb((e=Qge(b,true),e.length>0&&(BCb(0,e.length),e.charCodeAt(0)==43)?e.substr(1):e),-128,127)<<24>>24);case 11:return GD(Wmd(this,(Q8d(),w8d),b));case 12:return GD(Wmd(this,(Q8d(),x8d),b));case 13:return b==null?null:new tgb(Qge(b,true));case 15:case 14:return M9d(b);case 16:return GD(Wmd(this,(Q8d(),y8d),b));case 17:return N9d((Q8d(),b));case 18:return N9d(b);case 28:case 29:case 35:case 38:case 39:case 41:case 54:case 19:return Qge(b,true);case 21:case 20:return O9d(b);case 22:return GD(Wmd(this,(Q8d(),z8d),b));case 23:return GD(Wmd(this,(Q8d(),A8d),b));case 24:return GD(Wmd(this,(Q8d(),B8d),b));case 25:return GD(Wmd(this,(Q8d(),C8d),b));case 26:return GD(Wmd(this,(Q8d(),D8d),b));case 27:return P9d(b);case 30:return Q9d((Q8d(),b));case 31:return Q9d(b);case 32:return b==null?null:meb(Icb((k=Qge(b,true),k.length>0&&(BCb(0,k.length),k.charCodeAt(0)==43)?k.substr(1):k),Rie,Ohe));case 33:return b==null?null:new Ygb((l=Qge(b,true),l.length>0&&(BCb(0,l.length),l.charCodeAt(0)==43)?l.substr(1):l));case 34:return b==null?null:meb(Icb((m=Qge(b,true),m.length>0&&(BCb(0,m.length),m.charCodeAt(0)==43)?m.substr(1):m),Rie,Ohe));case 36:return b==null?null:Aeb(Jcb((n=Qge(b,true),n.length>0&&(BCb(0,n.length),n.charCodeAt(0)==43)?n.substr(1):n)));case 37:return b==null?null:Aeb(Jcb((o=Qge(b,true),o.length>0&&(BCb(0,o.length),o.charCodeAt(0)==43)?o.substr(1):o)));case 40:return T9d((Q8d(),b));case 42:return R9d((Q8d(),b));case 43:return R9d(b);case 44:return b==null?null:new Ygb((p=Qge(b,true),p.length>0&&(BCb(0,p.length),p.charCodeAt(0)==43)?p.substr(1):p));case 45:return b==null?null:new Ygb((q=Qge(b,true),q.length>0&&(BCb(0,q.length),q.charCodeAt(0)==43)?q.substr(1):q));case 46:return Qge(b,false);case 47:return GD(Wmd(this,(Q8d(),E8d),b));case 59:case 48:return S9d((Q8d(),b));case 49:return GD(Wmd(this,(Q8d(),G8d),b));case 50:return b==null?null:Web(Icb((r=Qge(b,true),r.length>0&&(BCb(0,r.length),r.charCodeAt(0)==43)?r.substr(1):r),awe,32767)<<16>>16);case 51:return b==null?null:Web(Icb((f=Qge(b,true),f.length>0&&(BCb(0,f.length),f.charCodeAt(0)==43)?f.substr(1):f),awe,32767)<<16>>16);case 53:return GD(Wmd(this,(Q8d(),J8d),b));case 55:return b==null?null:Web(Icb((g=Qge(b,true),g.length>0&&(BCb(0,g.length),g.charCodeAt(0)==43)?g.substr(1):g),awe,32767)<<16>>16);case 56:return b==null?null:Web(Icb((h=Qge(b,true),h.length>0&&(BCb(0,h.length),h.charCodeAt(0)==43)?h.substr(1):h),awe,32767)<<16>>16);case 57:return b==null?null:Aeb(Jcb((i=Qge(b,true),i.length>0&&(BCb(0,i.length),i.charCodeAt(0)==43)?i.substr(1):i)));case 58:return b==null?null:Aeb(Jcb((j=Qge(b,true),j.length>0&&(BCb(0,j.length),j.charCodeAt(0)==43)?j.substr(1):j)));case 60:return b==null?null:meb(Icb((c=Qge(b,true),c.length>0&&(BCb(0,c.length),c.charCodeAt(0)==43)?c.substr(1):c),Rie,Ohe));case 61:return b==null?null:meb(Icb(Qge(b,true),Rie,Ohe));default:throw vbb(new Wdb(tte+a.ne()+ute));}};var w9d,x9d,y9d,z9d;var Z9=mdb(Mwe,'XMLTypeFactoryImpl',1919);bcb(586,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1,1945:1,586:1},cae);_.N=false;_.O=false;var Z9d=false;var Yab=mdb(Mwe,'XMLTypePackageImpl',586);bcb(1852,1,{837:1},fae);_._j=function gae(){return Uge(),Tge};var iab=mdb(Mwe,'XMLTypePackageImpl/1',1852);bcb(1861,1,nwe,hae);_.wj=function iae(a){return ND(a)};_.xj=function jae(a){return KC(ZI,nie,2,a,6,1)};var $9=mdb(Mwe,'XMLTypePackageImpl/10',1861);bcb(1862,1,nwe,kae);_.wj=function lae(a){return ND(a)};_.xj=function mae(a){return KC(ZI,nie,2,a,6,1)};var _9=mdb(Mwe,'XMLTypePackageImpl/11',1862);bcb(1863,1,nwe,nae);_.wj=function oae(a){return ND(a)};_.xj=function pae(a){return KC(ZI,nie,2,a,6,1)};var aab=mdb(Mwe,'XMLTypePackageImpl/12',1863);bcb(1864,1,nwe,qae);_.wj=function rae(a){return LD(a)};_.xj=function sae(a){return KC(BI,nie,333,a,7,1)};var bab=mdb(Mwe,'XMLTypePackageImpl/13',1864);bcb(1865,1,nwe,tae);_.wj=function uae(a){return ND(a)};_.xj=function vae(a){return KC(ZI,nie,2,a,6,1)};var cab=mdb(Mwe,'XMLTypePackageImpl/14',1865);bcb(1866,1,nwe,wae);_.wj=function xae(a){return JD(a,15)};_.xj=function yae(a){return KC(yK,eme,15,a,0,1)};var dab=mdb(Mwe,'XMLTypePackageImpl/15',1866);bcb(1867,1,nwe,zae);_.wj=function Aae(a){return JD(a,15)};_.xj=function Bae(a){return KC(yK,eme,15,a,0,1)};var eab=mdb(Mwe,'XMLTypePackageImpl/16',1867);bcb(1868,1,nwe,Cae);_.wj=function Dae(a){return ND(a)};_.xj=function Eae(a){return KC(ZI,nie,2,a,6,1)};var fab=mdb(Mwe,'XMLTypePackageImpl/17',1868);bcb(1869,1,nwe,Fae);_.wj=function Gae(a){return JD(a,155)};_.xj=function Hae(a){return KC(FI,nie,155,a,0,1)};var gab=mdb(Mwe,'XMLTypePackageImpl/18',1869);bcb(1870,1,nwe,Iae);_.wj=function Jae(a){return ND(a)};_.xj=function Kae(a){return KC(ZI,nie,2,a,6,1)};var hab=mdb(Mwe,'XMLTypePackageImpl/19',1870);bcb(1853,1,nwe,Lae);_.wj=function Mae(a){return JD(a,843)};_.xj=function Nae(a){return KC(Q9,Uhe,843,a,0,1)};var tab=mdb(Mwe,'XMLTypePackageImpl/2',1853);bcb(1871,1,nwe,Oae);_.wj=function Pae(a){return ND(a)};_.xj=function Qae(a){return KC(ZI,nie,2,a,6,1)};var jab=mdb(Mwe,'XMLTypePackageImpl/20',1871);bcb(1872,1,nwe,Rae);_.wj=function Sae(a){return ND(a)};_.xj=function Tae(a){return KC(ZI,nie,2,a,6,1)};var kab=mdb(Mwe,'XMLTypePackageImpl/21',1872);bcb(1873,1,nwe,Uae);_.wj=function Vae(a){return ND(a)};_.xj=function Wae(a){return KC(ZI,nie,2,a,6,1)};var lab=mdb(Mwe,'XMLTypePackageImpl/22',1873);bcb(1874,1,nwe,Xae);_.wj=function Yae(a){return ND(a)};_.xj=function Zae(a){return KC(ZI,nie,2,a,6,1)};var mab=mdb(Mwe,'XMLTypePackageImpl/23',1874);bcb(1875,1,nwe,$ae);_.wj=function _ae(a){return JD(a,190)};_.xj=function abe(a){return KC(SD,nie,190,a,0,2)};var nab=mdb(Mwe,'XMLTypePackageImpl/24',1875);bcb(1876,1,nwe,bbe);_.wj=function cbe(a){return ND(a)};_.xj=function dbe(a){return KC(ZI,nie,2,a,6,1)};var oab=mdb(Mwe,'XMLTypePackageImpl/25',1876);bcb(1877,1,nwe,ebe);_.wj=function fbe(a){return ND(a)};_.xj=function gbe(a){return KC(ZI,nie,2,a,6,1)};var pab=mdb(Mwe,'XMLTypePackageImpl/26',1877);bcb(1878,1,nwe,hbe);_.wj=function ibe(a){return JD(a,15)};_.xj=function jbe(a){return KC(yK,eme,15,a,0,1)};var qab=mdb(Mwe,'XMLTypePackageImpl/27',1878);bcb(1879,1,nwe,kbe);_.wj=function lbe(a){return JD(a,15)};_.xj=function mbe(a){return KC(yK,eme,15,a,0,1)};var rab=mdb(Mwe,'XMLTypePackageImpl/28',1879);bcb(1880,1,nwe,nbe);_.wj=function obe(a){return ND(a)};_.xj=function pbe(a){return KC(ZI,nie,2,a,6,1)};var sab=mdb(Mwe,'XMLTypePackageImpl/29',1880);bcb(1854,1,nwe,qbe);_.wj=function rbe(a){return JD(a,667)};_.xj=function sbe(a){return KC(S9,Uhe,2021,a,0,1)};var Eab=mdb(Mwe,'XMLTypePackageImpl/3',1854);bcb(1881,1,nwe,tbe);_.wj=function ube(a){return JD(a,19)};_.xj=function vbe(a){return KC(JI,nie,19,a,0,1)};var uab=mdb(Mwe,'XMLTypePackageImpl/30',1881);bcb(1882,1,nwe,wbe);_.wj=function xbe(a){return ND(a)};_.xj=function ybe(a){return KC(ZI,nie,2,a,6,1)};var vab=mdb(Mwe,'XMLTypePackageImpl/31',1882);bcb(1883,1,nwe,zbe);_.wj=function Abe(a){return JD(a,162)};_.xj=function Bbe(a){return KC(MI,nie,162,a,0,1)};var wab=mdb(Mwe,'XMLTypePackageImpl/32',1883);bcb(1884,1,nwe,Cbe);_.wj=function Dbe(a){return ND(a)};_.xj=function Ebe(a){return KC(ZI,nie,2,a,6,1)};var xab=mdb(Mwe,'XMLTypePackageImpl/33',1884);bcb(1885,1,nwe,Fbe);_.wj=function Gbe(a){return ND(a)};_.xj=function Hbe(a){return KC(ZI,nie,2,a,6,1)};var yab=mdb(Mwe,'XMLTypePackageImpl/34',1885);bcb(1886,1,nwe,Ibe);_.wj=function Jbe(a){return ND(a)};_.xj=function Kbe(a){return KC(ZI,nie,2,a,6,1)};var zab=mdb(Mwe,'XMLTypePackageImpl/35',1886);bcb(1887,1,nwe,Lbe);_.wj=function Mbe(a){return ND(a)};_.xj=function Nbe(a){return KC(ZI,nie,2,a,6,1)};var Aab=mdb(Mwe,'XMLTypePackageImpl/36',1887);bcb(1888,1,nwe,Obe);_.wj=function Pbe(a){return JD(a,15)};_.xj=function Qbe(a){return KC(yK,eme,15,a,0,1)};var Bab=mdb(Mwe,'XMLTypePackageImpl/37',1888);bcb(1889,1,nwe,Rbe);_.wj=function Sbe(a){return JD(a,15)};_.xj=function Tbe(a){return KC(yK,eme,15,a,0,1)};var Cab=mdb(Mwe,'XMLTypePackageImpl/38',1889);bcb(1890,1,nwe,Ube);_.wj=function Vbe(a){return ND(a)};_.xj=function Wbe(a){return KC(ZI,nie,2,a,6,1)};var Dab=mdb(Mwe,'XMLTypePackageImpl/39',1890);bcb(1855,1,nwe,Xbe);_.wj=function Ybe(a){return JD(a,668)};_.xj=function Zbe(a){return KC(T9,Uhe,2022,a,0,1)};var Pab=mdb(Mwe,'XMLTypePackageImpl/4',1855);bcb(1891,1,nwe,$be);_.wj=function _be(a){return ND(a)};_.xj=function ace(a){return KC(ZI,nie,2,a,6,1)};var Fab=mdb(Mwe,'XMLTypePackageImpl/40',1891);bcb(1892,1,nwe,bce);_.wj=function cce(a){return ND(a)};_.xj=function dce(a){return KC(ZI,nie,2,a,6,1)};var Gab=mdb(Mwe,'XMLTypePackageImpl/41',1892);bcb(1893,1,nwe,ece);_.wj=function fce(a){return ND(a)};_.xj=function gce(a){return KC(ZI,nie,2,a,6,1)};var Hab=mdb(Mwe,'XMLTypePackageImpl/42',1893);bcb(1894,1,nwe,hce);_.wj=function ice(a){return ND(a)};_.xj=function jce(a){return KC(ZI,nie,2,a,6,1)};var Iab=mdb(Mwe,'XMLTypePackageImpl/43',1894);bcb(1895,1,nwe,kce);_.wj=function lce(a){return ND(a)};_.xj=function mce(a){return KC(ZI,nie,2,a,6,1)};var Jab=mdb(Mwe,'XMLTypePackageImpl/44',1895);bcb(1896,1,nwe,nce);_.wj=function oce(a){return JD(a,184)};_.xj=function pce(a){return KC(UI,nie,184,a,0,1)};var Kab=mdb(Mwe,'XMLTypePackageImpl/45',1896);bcb(1897,1,nwe,qce);_.wj=function rce(a){return ND(a)};_.xj=function sce(a){return KC(ZI,nie,2,a,6,1)};var Lab=mdb(Mwe,'XMLTypePackageImpl/46',1897);bcb(1898,1,nwe,tce);_.wj=function uce(a){return ND(a)};_.xj=function vce(a){return KC(ZI,nie,2,a,6,1)};var Mab=mdb(Mwe,'XMLTypePackageImpl/47',1898);bcb(1899,1,nwe,wce);_.wj=function xce(a){return ND(a)};_.xj=function yce(a){return KC(ZI,nie,2,a,6,1)};var Nab=mdb(Mwe,'XMLTypePackageImpl/48',1899);bcb(nje,1,nwe,zce);_.wj=function Ace(a){return JD(a,184)};_.xj=function Bce(a){return KC(UI,nie,184,a,0,1)};var Oab=mdb(Mwe,'XMLTypePackageImpl/49',nje);bcb(1856,1,nwe,Cce);_.wj=function Dce(a){return JD(a,669)};_.xj=function Ece(a){return KC(U9,Uhe,2023,a,0,1)};var Tab=mdb(Mwe,'XMLTypePackageImpl/5',1856);bcb(1901,1,nwe,Fce);_.wj=function Gce(a){return JD(a,162)};_.xj=function Hce(a){return KC(MI,nie,162,a,0,1)};var Qab=mdb(Mwe,'XMLTypePackageImpl/50',1901);bcb(1902,1,nwe,Ice);_.wj=function Jce(a){return ND(a)};_.xj=function Kce(a){return KC(ZI,nie,2,a,6,1)};var Rab=mdb(Mwe,'XMLTypePackageImpl/51',1902);bcb(1903,1,nwe,Lce);_.wj=function Mce(a){return JD(a,19)};_.xj=function Nce(a){return KC(JI,nie,19,a,0,1)};var Sab=mdb(Mwe,'XMLTypePackageImpl/52',1903);bcb(1857,1,nwe,Oce);_.wj=function Pce(a){return ND(a)};_.xj=function Qce(a){return KC(ZI,nie,2,a,6,1)};var Uab=mdb(Mwe,'XMLTypePackageImpl/6',1857);bcb(1858,1,nwe,Rce);_.wj=function Sce(a){return JD(a,190)};_.xj=function Tce(a){return KC(SD,nie,190,a,0,2)};var Vab=mdb(Mwe,'XMLTypePackageImpl/7',1858);bcb(1859,1,nwe,Uce);_.wj=function Vce(a){return KD(a)};_.xj=function Wce(a){return KC(wI,nie,476,a,8,1)};var Wab=mdb(Mwe,'XMLTypePackageImpl/8',1859);bcb(1860,1,nwe,Xce);_.wj=function Yce(a){return JD(a,217)};_.xj=function Zce(a){return KC(xI,nie,217,a,0,1)};var Xab=mdb(Mwe,'XMLTypePackageImpl/9',1860);var $ce,_ce;var fde,gde;var kde;bcb(50,60,Tie,mde);var Zab=mdb(kxe,'RegEx/ParseException',50);bcb(820,1,{},ude);_.sl=function vde(a){return ac*16)throw vbb(new mde(tvd((h0d(),Uue))));c=c*16+e}while(true);if(this.a!=125)throw vbb(new mde(tvd((h0d(),Vue))));if(c>lxe)throw vbb(new mde(tvd((h0d(),Wue))));a=c}else{e=0;if(this.c!=0||(e=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));c=e;nde(this);if(this.c!=0||(e=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));c=c*16+e;a=c}break;case 117:d=0;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;a=b;break;case 118:nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;nde(this);if(this.c!=0||(d=yde(this.a))<0)throw vbb(new mde(tvd((h0d(),Tue))));b=b*16+d;if(b>lxe)throw vbb(new mde(tvd((h0d(),'parser.descappe.4'))));a=b;break;case 65:case 90:case 122:throw vbb(new mde(tvd((h0d(),Xue))));}return a};_.ul=function xde(a){var b,c;switch(a){case 100:c=(this.e&32)==32?Kfe('Nd',true):(wfe(),cfe);break;case 68:c=(this.e&32)==32?Kfe('Nd',false):(wfe(),jfe);break;case 119:c=(this.e&32)==32?Kfe('IsWord',true):(wfe(),sfe);break;case 87:c=(this.e&32)==32?Kfe('IsWord',false):(wfe(),lfe);break;case 115:c=(this.e&32)==32?Kfe('IsSpace',true):(wfe(),nfe);break;case 83:c=(this.e&32)==32?Kfe('IsSpace',false):(wfe(),kfe);break;default:throw vbb(new hz((b=a,mxe+b.toString(16))));}return c};_.vl=function zde(a){var b,c,d,e,f,g,h,i,j,k,l,m;this.b=1;nde(this);b=null;if(this.c==0&&this.a==94){nde(this);if(a){k=(wfe(),wfe(),++vfe,new $fe(5))}else{b=(wfe(),wfe(),++vfe,new $fe(4));Ufe(b,0,lxe);k=(null,++vfe,new $fe(4))}}else{k=(wfe(),wfe(),++vfe,new $fe(4))}e=true;while((m=this.c)!=1){if(m==0&&this.a==93&&!e)break;e=false;c=this.a;d=false;if(m==10){switch(c){case 100:case 68:case 119:case 87:case 115:case 83:Xfe(k,this.ul(c));d=true;break;case 105:case 73:case 99:case 67:c=this.Ll(k,c);c<0&&(d=true);break;case 112:case 80:l=tde(this,c);if(!l)throw vbb(new mde(tvd((h0d(),Iue))));Xfe(k,l);d=true;break;default:c=this.tl();}}else if(m==20){g=gfb(this.i,58,this.d);if(g<0)throw vbb(new mde(tvd((h0d(),Jue))));h=true;if(bfb(this.i,this.d)==94){++this.d;h=false}f=qfb(this.i,this.d,g);i=Lfe(f,h,(this.e&512)==512);if(!i)throw vbb(new mde(tvd((h0d(),Lue))));Xfe(k,i);d=true;if(g+1>=this.j||bfb(this.i,g+1)!=93)throw vbb(new mde(tvd((h0d(),Jue))));this.d=g+2}nde(this);if(!d){if(this.c!=0||this.a!=45){Ufe(k,c,c)}else{nde(this);if((m=this.c)==1)throw vbb(new mde(tvd((h0d(),Kue))));if(m==0&&this.a==93){Ufe(k,c,c);Ufe(k,45,45)}else{j=this.a;m==10&&(j=this.tl());nde(this);Ufe(k,c,j)}}}(this.e&zte)==zte&&this.c==0&&this.a==44&&nde(this)}if(this.c==1)throw vbb(new mde(tvd((h0d(),Kue))));if(b){Zfe(b,k);k=b}Yfe(k);Vfe(k);this.b=0;nde(this);return k};_.wl=function Ade(){var a,b,c,d;c=this.vl(false);while((d=this.c)!=7){a=this.a;if(d==0&&(a==45||a==38)||d==4){nde(this);if(this.c!=9)throw vbb(new mde(tvd((h0d(),Que))));b=this.vl(false);if(d==4)Xfe(c,b);else if(a==45)Zfe(c,b);else if(a==38)Wfe(c,b);else throw vbb(new hz('ASSERT'))}else{throw vbb(new mde(tvd((h0d(),Rue))))}}nde(this);return c};_.xl=function Bde(){var a,b;a=this.a-48;b=(wfe(),wfe(),++vfe,new Hge(12,null,a));!this.g&&(this.g=new Wvb);Tvb(this.g,new cge(a));nde(this);return b};_.yl=function Cde(){nde(this);return wfe(),ofe};_.zl=function Dde(){nde(this);return wfe(),mfe};_.Al=function Ede(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Bl=function Fde(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Cl=function Gde(){nde(this);return Ife()};_.Dl=function Hde(){nde(this);return wfe(),qfe};_.El=function Ide(){nde(this);return wfe(),tfe};_.Fl=function Jde(){var a;if(this.d>=this.j||((a=bfb(this.i,this.d++))&65504)!=64)throw vbb(new mde(tvd((h0d(),Eue))));nde(this);return wfe(),wfe(),++vfe,new ige(0,a-64)};_.Gl=function Kde(){nde(this);return Jfe()};_.Hl=function Lde(){nde(this);return wfe(),ufe};_.Il=function Mde(){var a;a=(wfe(),wfe(),++vfe,new ige(0,105));nde(this);return a};_.Jl=function Nde(){nde(this);return wfe(),rfe};_.Kl=function Ode(){nde(this);return wfe(),pfe};_.Ll=function Pde(a,b){return this.tl()};_.Ml=function Qde(){nde(this);return wfe(),hfe};_.Nl=function Rde(){var a,b,c,d,e;if(this.d+1>=this.j)throw vbb(new mde(tvd((h0d(),Bue))));d=-1;b=null;a=bfb(this.i,this.d);if(49<=a&&a<=57){d=a-48;!this.g&&(this.g=new Wvb);Tvb(this.g,new cge(d));++this.d;if(bfb(this.i,this.d)!=41)throw vbb(new mde(tvd((h0d(),yue))));++this.d}else{a==63&&--this.d;nde(this);b=qde(this);switch(b.e){case 20:case 21:case 22:case 23:break;case 8:if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));break;default:throw vbb(new mde(tvd((h0d(),Cue))));}}nde(this);e=rde(this);c=null;if(e.e==2){if(e.em()!=2)throw vbb(new mde(tvd((h0d(),Due))));c=e.am(1);e=e.am(0)}if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return wfe(),wfe(),++vfe,new vge(d,b,e,c)};_.Ol=function Sde(){nde(this);return wfe(),ife};_.Pl=function Tde(){var a;nde(this);a=Cfe(24,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Ql=function Ude(){var a;nde(this);a=Cfe(20,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Rl=function Vde(){var a;nde(this);a=Cfe(22,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Sl=function Wde(){var a,b,c,d,e;a=0;c=0;b=-1;while(this.d=this.j)throw vbb(new mde(tvd((h0d(),zue))));if(b==45){++this.d;while(this.d=this.j)throw vbb(new mde(tvd((h0d(),zue))))}if(b==58){++this.d;nde(this);d=Dfe(rde(this),a,c);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this)}else if(b==41){++this.d;nde(this);d=Dfe(rde(this),a,c)}else throw vbb(new mde(tvd((h0d(),Aue))));return d};_.Tl=function Xde(){var a;nde(this);a=Cfe(21,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Ul=function Yde(){var a;nde(this);a=Cfe(23,rde(this));if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Vl=function Zde(){var a,b;nde(this);a=this.f++;b=Efe(rde(this),a);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return b};_.Wl=function $de(){var a;nde(this);a=Efe(rde(this),0);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Xl=function _de(a){nde(this);if(this.c==5){nde(this);return Bfe(a,(wfe(),wfe(),++vfe,new lge(9,a)))}else return Bfe(a,(wfe(),wfe(),++vfe,new lge(3,a)))};_.Yl=function aee(a){var b;nde(this);b=(wfe(),wfe(),++vfe,new Lge(2));if(this.c==5){nde(this);Kge(b,(null,ffe));Kge(b,a)}else{Kge(b,a);Kge(b,(null,ffe))}return b};_.Zl=function bee(a){nde(this);if(this.c==5){nde(this);return wfe(),wfe(),++vfe,new lge(9,a)}else return wfe(),wfe(),++vfe,new lge(3,a)};_.a=0;_.b=0;_.c=0;_.d=0;_.e=0;_.f=1;_.g=null;_.j=0;var bbb=mdb(kxe,'RegEx/RegexParser',820);bcb(1824,820,{},hee);_.sl=function iee(a){return false};_.tl=function jee(){return eee(this)};_.ul=function lee(a){return fee(a)};_.vl=function mee(a){return gee(this)};_.wl=function nee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.xl=function oee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.yl=function pee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.zl=function qee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Al=function ree(){nde(this);return fee(67)};_.Bl=function see(){nde(this);return fee(73)};_.Cl=function tee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Dl=function uee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.El=function vee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Fl=function wee(){nde(this);return fee(99)};_.Gl=function xee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Hl=function yee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Il=function zee(){nde(this);return fee(105)};_.Jl=function Aee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Kl=function Bee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ll=function Cee(a,b){return Xfe(a,fee(b)),-1};_.Ml=function Dee(){nde(this);return wfe(),wfe(),++vfe,new ige(0,94)};_.Nl=function Eee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ol=function Fee(){nde(this);return wfe(),wfe(),++vfe,new ige(0,36)};_.Pl=function Gee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ql=function Hee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Rl=function Iee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Sl=function Jee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Tl=function Kee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Ul=function Lee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Vl=function Mee(){var a;nde(this);a=Efe(rde(this),0);if(this.c!=7)throw vbb(new mde(tvd((h0d(),yue))));nde(this);return a};_.Wl=function Nee(){throw vbb(new mde(tvd((h0d(),Yue))))};_.Xl=function Oee(a){nde(this);return Bfe(a,(wfe(),wfe(),++vfe,new lge(3,a)))};_.Yl=function Pee(a){var b;nde(this);b=(wfe(),wfe(),++vfe,new Lge(2));Kge(b,a);Kge(b,(null,ffe));return b};_.Zl=function Qee(a){nde(this);return wfe(),wfe(),++vfe,new lge(3,a)};var cee=null,dee=null;var $ab=mdb(kxe,'RegEx/ParserForXMLSchema',1824);bcb(117,1,yxe,xfe);_.$l=function yfe(a){throw vbb(new hz('Not supported.'))};_._l=function Gfe(){return -1};_.am=function Hfe(a){return null};_.bm=function Mfe(){return null};_.cm=function Pfe(a){};_.dm=function Qfe(a){};_.em=function Rfe(){return 0};_.Ib=function Sfe(){return this.fm(0)};_.fm=function Tfe(a){return this.e==11?'.':''};_.e=0;var Yee,Zee,$ee,_ee,afe,bfe=null,cfe,dfe=null,efe,ffe,gfe=null,hfe,ife,jfe,kfe,lfe,mfe,nfe,ofe,pfe,qfe,rfe,sfe,tfe,ufe,vfe=0;var lbb=mdb(kxe,'RegEx/Token',117);bcb(136,117,{3:1,136:1,117:1},$fe);_.fm=function bge(a){var b,c,d;if(this.e==4){if(this==efe)c='.';else if(this==cfe)c='\\d';else if(this==sfe)c='\\w';else if(this==nfe)c='\\s';else{d=new Hfb;d.a+='[';for(b=0;b0&&(d.a+=',',d);if(this.b[b]===this.b[b+1]){Efb(d,age(this.b[b]))}else{Efb(d,age(this.b[b]));d.a+='-';Efb(d,age(this.b[b+1]))}}d.a+=']';c=d.a}}else{if(this==jfe)c='\\D';else if(this==lfe)c='\\W';else if(this==kfe)c='\\S';else{d=new Hfb;d.a+='[^';for(b=0;b0&&(d.a+=',',d);if(this.b[b]===this.b[b+1]){Efb(d,age(this.b[b]))}else{Efb(d,age(this.b[b]));d.a+='-';Efb(d,age(this.b[b+1]))}}d.a+=']';c=d.a}}return c};_.a=false;_.c=false;var _ab=mdb(kxe,'RegEx/RangeToken',136);bcb(584,1,{584:1},cge);_.a=0;var abb=mdb(kxe,'RegEx/RegexParser/ReferencePosition',584);bcb(583,1,{3:1,583:1},ege);_.Fb=function fge(a){var b;if(a==null)return false;if(!JD(a,583))return false;b=BD(a,583);return dfb(this.b,b.b)&&this.a==b.a};_.Hb=function gge(){return LCb(this.b+'/'+See(this.a))};_.Ib=function hge(){return this.c.fm(this.a)};_.a=0;var cbb=mdb(kxe,'RegEx/RegularExpression',583);bcb(223,117,yxe,ige);_._l=function jge(){return this.a};_.fm=function kge(a){var b,c,d;switch(this.e){case 0:switch(this.a){case 124:case 42:case 43:case 63:case 40:case 41:case 46:case 91:case 123:case 92:d='\\'+HD(this.a&aje);break;case 12:d='\\f';break;case 10:d='\\n';break;case 13:d='\\r';break;case 9:d='\\t';break;case 27:d='\\e';break;default:if(this.a>=Tje){c=(b=this.a>>>0,'0'+b.toString(16));d='\\v'+qfb(c,c.length-6,c.length)}else d=''+HD(this.a&aje);}break;case 8:this==hfe||this==ife?(d=''+HD(this.a&aje)):(d='\\'+HD(this.a&aje));break;default:d=null;}return d};_.a=0;var dbb=mdb(kxe,'RegEx/Token/CharToken',223);bcb(309,117,yxe,lge);_.am=function mge(a){return this.a};_.cm=function nge(a){this.b=a};_.dm=function oge(a){this.c=a};_.em=function pge(){return 1};_.fm=function qge(a){var b;if(this.e==3){if(this.c<0&&this.b<0){b=this.a.fm(a)+'*'}else if(this.c==this.b){b=this.a.fm(a)+'{'+this.c+'}'}else if(this.c>=0&&this.b>=0){b=this.a.fm(a)+'{'+this.c+','+this.b+'}'}else if(this.c>=0&&this.b<0){b=this.a.fm(a)+'{'+this.c+',}'}else throw vbb(new hz('Token#toString(): CLOSURE '+this.c+She+this.b))}else{if(this.c<0&&this.b<0){b=this.a.fm(a)+'*?'}else if(this.c==this.b){b=this.a.fm(a)+'{'+this.c+'}?'}else if(this.c>=0&&this.b>=0){b=this.a.fm(a)+'{'+this.c+','+this.b+'}?'}else if(this.c>=0&&this.b<0){b=this.a.fm(a)+'{'+this.c+',}?'}else throw vbb(new hz('Token#toString(): NONGREEDYCLOSURE '+this.c+She+this.b))}return b};_.b=0;_.c=0;var ebb=mdb(kxe,'RegEx/Token/ClosureToken',309);bcb(821,117,yxe,rge);_.am=function sge(a){return a==0?this.a:this.b};_.em=function tge(){return 2};_.fm=function uge(a){var b;this.b.e==3&&this.b.am(0)==this.a?(b=this.a.fm(a)+'+'):this.b.e==9&&this.b.am(0)==this.a?(b=this.a.fm(a)+'+?'):(b=this.a.fm(a)+(''+this.b.fm(a)));return b};var fbb=mdb(kxe,'RegEx/Token/ConcatToken',821);bcb(1822,117,yxe,vge);_.am=function wge(a){if(a==0)return this.d;if(a==1)return this.b;throw vbb(new hz('Internal Error: '+a))};_.em=function xge(){return !this.b?1:2};_.fm=function yge(a){var b;this.c>0?(b='(?('+this.c+')'):this.a.e==8?(b='(?('+this.a+')'):(b='(?'+this.a);!this.b?(b+=this.d+')'):(b+=this.d+'|'+this.b+')');return b};_.c=0;var gbb=mdb(kxe,'RegEx/Token/ConditionToken',1822);bcb(1823,117,yxe,zge);_.am=function Age(a){return this.b};_.em=function Bge(){return 1};_.fm=function Cge(a){return '(?'+(this.a==0?'':See(this.a))+(this.c==0?'':See(this.c))+':'+this.b.fm(a)+')'};_.a=0;_.c=0;var hbb=mdb(kxe,'RegEx/Token/ModifierToken',1823);bcb(822,117,yxe,Dge);_.am=function Ege(a){return this.a};_.em=function Fge(){return 1};_.fm=function Gge(a){var b;b=null;switch(this.e){case 6:this.b==0?(b='(?:'+this.a.fm(a)+')'):(b='('+this.a.fm(a)+')');break;case 20:b='(?='+this.a.fm(a)+')';break;case 21:b='(?!'+this.a.fm(a)+')';break;case 22:b='(?<='+this.a.fm(a)+')';break;case 23:b='(?'+this.a.fm(a)+')';}return b};_.b=0;var ibb=mdb(kxe,'RegEx/Token/ParenToken',822);bcb(521,117,{3:1,117:1,521:1},Hge);_.bm=function Ige(){return this.b};_.fm=function Jge(a){return this.e==12?'\\'+this.a:Wee(this.b)};_.a=0;var jbb=mdb(kxe,'RegEx/Token/StringToken',521);bcb(465,117,yxe,Lge);_.$l=function Mge(a){Kge(this,a)};_.am=function Nge(a){return BD(Uvb(this.a,a),117)};_.em=function Oge(){return !this.a?0:this.a.a.c.length};_.fm=function Pge(a){var b,c,d,e,f;if(this.e==1){if(this.a.a.c.length==2){b=BD(Uvb(this.a,0),117);c=BD(Uvb(this.a,1),117);c.e==3&&c.am(0)==b?(e=b.fm(a)+'+'):c.e==9&&c.am(0)==b?(e=b.fm(a)+'+?'):(e=b.fm(a)+(''+c.fm(a)))}else{f=new Hfb;for(d=0;d=this.c.b:this.a<=this.c.b};_.Sb=function whe(){return this.b>0};_.Tb=function yhe(){return this.b};_.Vb=function Ahe(){return this.b-1};_.Qb=function Bhe(){throw vbb(new cgb(Exe))};_.a=0;_.b=0;var pbb=mdb(Bxe,'ExclusiveRange/RangeIterator',254);var TD=pdb(Fve,'C');var WD=pdb(Ive,'I');var sbb=pdb(Khe,'Z');var XD=pdb(Jve,'J');var SD=pdb(Eve,'B');var UD=pdb(Gve,'D');var VD=pdb(Hve,'F');var rbb=pdb(Kve,'S');var h1=odb('org.eclipse.elk.core.labels','ILabelManager');var O4=odb(Tte,'DiagnosticChain');var u8=odb(pwe,'ResourceSet');var V4=mdb(Tte,'InvocationTargetException',null);var Ihe=(Az(),Dz);var gwtOnLoad=gwtOnLoad=Zbb;Xbb(hcb);$bb('permProps',[[[Fxe,Gxe],[Hxe,'gecko1_8']],[[Fxe,Gxe],[Hxe,'ie10']],[[Fxe,Gxe],[Hxe,'ie8']],[[Fxe,Gxe],[Hxe,'ie9']],[[Fxe,Gxe],[Hxe,'safari']]]); +// -------------- RUN GWT INITIALIZATION CODE -------------- +gwtOnLoad(null, 'elk', null); + +}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],3:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/******************************************************************************* + * Copyright (c) 2021 Kiel University and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +var ELK = require('./elk-api.js').default; + +var ELKNode = function (_ELK) { + _inherits(ELKNode, _ELK); + + function ELKNode() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, ELKNode); + + var optionsClone = Object.assign({}, options); + + var workerThreadsExist = false; + try { + require.resolve('web-worker'); + workerThreadsExist = true; + } catch (e) {} + + // user requested a worker + if (options.workerUrl) { + if (workerThreadsExist) { + var Worker = require('web-worker'); + optionsClone.workerFactory = function (url) { + return new Worker(url); + }; + } else { + console.warn('Web worker requested but \'web-worker\' package not installed. \nConsider installing the package or pass your own \'workerFactory\' to ELK\'s constructor.\n... Falling back to non-web worker version.'); + } + } + + // unless no other workerFactory is registered, use the fake worker + if (!optionsClone.workerFactory) { + var _require = require('./elk-worker.min.js'), + _Worker = _require.Worker; + + optionsClone.workerFactory = function (url) { + return new _Worker(url); + }; + } + + return _possibleConstructorReturn(this, (ELKNode.__proto__ || Object.getPrototypeOf(ELKNode)).call(this, optionsClone)); + } + + return ELKNode; +}(ELK); + +Object.defineProperty(module.exports, "__esModule", { + value: true +}); +module.exports = ELKNode; +ELKNode.default = ELKNode; +},{"./elk-api.js":1,"./elk-worker.min.js":2,"web-worker":4}],4:[function(require,module,exports){ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +module.exports = Worker; +},{}]},{},[3])(3) +}); + + +/***/ }), + +/***/ 19487: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ diagram: () => (/* binding */ diagram) +/* harmony export */ }); +/* harmony import */ var _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(87115); +/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59373); +/* harmony import */ var dagre_d3_es_src_dagre_js_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(43349); +/* harmony import */ var elkjs_lib_elk_bundled_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17295); +/* harmony import */ var elkjs_lib_elk_bundled_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(elkjs_lib_elk_bundled_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27484); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(17967); +/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20683); +/* harmony import */ var dagre_d3_es_src_dagre_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(70277); +/* harmony import */ var dagre_d3_es_src_graphlib_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(45625); +/* harmony import */ var dagre_d3_es_src_graphlib_json_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(39354); +/* harmony import */ var dagre_d3_es__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(91518); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(59542); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(10285); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(28734); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_11__); + + + + + + + + + + + + + + + + + + + + + + + +const findCommonAncestor = (id1, id2, treeData) => { + const { parentById } = treeData; + const visited = /* @__PURE__ */ new Set(); + let currentId = id1; + while (currentId) { + visited.add(currentId); + if (currentId === id2) { + return currentId; + } + currentId = parentById[currentId]; + } + currentId = id2; + while (currentId) { + if (visited.has(currentId)) { + return currentId; + } + currentId = parentById[currentId]; + } + return "root"; +}; +const elk = new (elkjs_lib_elk_bundled_js__WEBPACK_IMPORTED_MODULE_1___default())(); +const portPos = {}; +const conf = {}; +let nodeDb = {}; +const addVertices = function(vert, svgId, root, doc, diagObj, parentLookupDb, graph) { + const svg = root.select(`[id="${svgId}"]`); + const nodes = svg.insert("g").attr("class", "nodes"); + const keys = Object.keys(vert); + keys.forEach(function(id) { + const vertex = vert[id]; + let classStr = "default"; + if (vertex.classes.length > 0) { + classStr = vertex.classes.join(" "); + } + const styles2 = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.a)(vertex.styles); + let vertexText = vertex.text !== void 0 ? vertex.text : vertex.id; + let vertexNode; + const labelData = { width: 0, height: 0 }; + if ((0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.e)((0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.g)().flowchart.htmlLabels)) { + const node2 = { + label: vertexText.replace( + /fa[blrs]?:fa-[\w-]+/g, + (s) => `` + ) + }; + vertexNode = (0,dagre_d3_es_src_dagre_js_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_13__/* .addHtmlLabel */ .a)(svg, node2).node(); + const bbox = vertexNode.getBBox(); + labelData.width = bbox.width; + labelData.height = bbox.height; + labelData.labelNode = vertexNode; + vertexNode.parentNode.removeChild(vertexNode); + } else { + const svgLabel = doc.createElementNS("http://www.w3.org/2000/svg", "text"); + svgLabel.setAttribute("style", styles2.labelStyle.replace("color:", "fill:")); + const rows = vertexText.split(_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.c.lineBreakRegex); + for (const row of rows) { + const tspan = doc.createElementNS("http://www.w3.org/2000/svg", "tspan"); + tspan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space", "preserve"); + tspan.setAttribute("dy", "1em"); + tspan.setAttribute("x", "1"); + tspan.textContent = row; + svgLabel.appendChild(tspan); + } + vertexNode = svgLabel; + const bbox = vertexNode.getBBox(); + labelData.width = bbox.width; + labelData.height = bbox.height; + labelData.labelNode = vertexNode; + } + const ports = [ + { + id: vertex.id + "-west", + layoutOptions: { + "port.side": "WEST" + } + }, + { + id: vertex.id + "-east", + layoutOptions: { + "port.side": "EAST" + } + }, + { + id: vertex.id + "-south", + layoutOptions: { + "port.side": "SOUTH" + } + }, + { + id: vertex.id + "-north", + layoutOptions: { + "port.side": "NORTH" + } + } + ]; + let radious = 0; + let _shape = ""; + let layoutOptions = {}; + switch (vertex.type) { + case "round": + radious = 5; + _shape = "rect"; + break; + case "square": + _shape = "rect"; + break; + case "diamond": + _shape = "question"; + layoutOptions = { + portConstraints: "FIXED_SIDE" + }; + break; + case "hexagon": + _shape = "hexagon"; + break; + case "odd": + _shape = "rect_left_inv_arrow"; + break; + case "lean_right": + _shape = "lean_right"; + break; + case "lean_left": + _shape = "lean_left"; + break; + case "trapezoid": + _shape = "trapezoid"; + break; + case "inv_trapezoid": + _shape = "inv_trapezoid"; + break; + case "odd_right": + _shape = "rect_left_inv_arrow"; + break; + case "circle": + _shape = "circle"; + break; + case "ellipse": + _shape = "ellipse"; + break; + case "stadium": + _shape = "stadium"; + break; + case "subroutine": + _shape = "subroutine"; + break; + case "cylinder": + _shape = "cylinder"; + break; + case "group": + _shape = "rect"; + break; + case "doublecircle": + _shape = "doublecircle"; + break; + default: + _shape = "rect"; + } + const node = { + labelStyle: styles2.labelStyle, + shape: _shape, + labelText: vertexText, + rx: radious, + ry: radious, + class: classStr, + style: styles2.style, + id: vertex.id, + link: vertex.link, + linkTarget: vertex.linkTarget, + tooltip: diagObj.db.getTooltip(vertex.id) || "", + domId: diagObj.db.lookUpDomId(vertex.id), + haveCallback: vertex.haveCallback, + width: vertex.type === "group" ? 500 : void 0, + dir: vertex.dir, + type: vertex.type, + props: vertex.props, + padding: (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.g)().flowchart.padding + }; + let boundingBox; + let nodeEl; + if (node.type !== "group") { + nodeEl = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.b)(nodes, node, vertex.dir); + boundingBox = nodeEl.node().getBBox(); + } + const data = { + id: vertex.id, + ports: vertex.type === "diamond" ? ports : [], + // labelStyle: styles.labelStyle, + // shape: _shape, + layoutOptions, + labelText: vertexText, + labelData, + // labels: [{ text: vertexText }], + // rx: radius, + // ry: radius, + // class: classStr, + // style: styles.style, + // link: vertex.link, + // linkTarget: vertex.linkTarget, + // tooltip: diagObj.db.getTooltip(vertex.id) || '', + domId: diagObj.db.lookUpDomId(vertex.id), + // haveCallback: vertex.haveCallback, + width: boundingBox == null ? void 0 : boundingBox.width, + height: boundingBox == null ? void 0 : boundingBox.height, + // dir: vertex.dir, + type: vertex.type, + // props: vertex.props, + // padding: getConfig().flowchart.padding, + // boundingBox, + el: nodeEl, + parent: parentLookupDb.parentById[vertex.id] + }; + nodeDb[node.id] = data; + }); + return graph; +}; +const getNextPosition = (position, edgeDirection, graphDirection) => { + const portPos2 = { + TB: { + in: { + north: "north" + }, + out: { + south: "west", + west: "east", + east: "south" + } + }, + LR: { + in: { + west: "west" + }, + out: { + east: "south", + south: "north", + north: "east" + } + }, + RL: { + in: { + east: "east" + }, + out: { + west: "north", + north: "south", + south: "west" + } + }, + BT: { + in: { + south: "south" + }, + out: { + north: "east", + east: "west", + west: "north" + } + } + }; + portPos2.TD = portPos2.TB; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc88", graphDirection, edgeDirection, position); + return portPos2[graphDirection][edgeDirection][position]; +}; +const getNextPort = (node, edgeDirection, graphDirection) => { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("getNextPort abc88", { node, edgeDirection, graphDirection }); + if (!portPos[node]) { + switch (graphDirection) { + case "TB": + case "TD": + portPos[node] = { + inPosition: "north", + outPosition: "south" + }; + break; + case "BT": + portPos[node] = { + inPosition: "south", + outPosition: "north" + }; + break; + case "RL": + portPos[node] = { + inPosition: "east", + outPosition: "west" + }; + break; + case "LR": + portPos[node] = { + inPosition: "west", + outPosition: "east" + }; + break; + } + } + const result = edgeDirection === "in" ? portPos[node].inPosition : portPos[node].outPosition; + if (edgeDirection === "in") { + portPos[node].inPosition = getNextPosition( + portPos[node].inPosition, + edgeDirection, + graphDirection + ); + } else { + portPos[node].outPosition = getNextPosition( + portPos[node].outPosition, + edgeDirection, + graphDirection + ); + } + return result; +}; +const getEdgeStartEndPoint = (edge, dir) => { + let source = edge.start; + let target = edge.end; + const startNode = nodeDb[source]; + const endNode = nodeDb[target]; + if (!startNode || !endNode) { + return { source, target }; + } + if (startNode.type === "diamond") { + source = `${source}-${getNextPort(source, "out", dir)}`; + } + if (endNode.type === "diamond") { + target = `${target}-${getNextPort(target, "in", dir)}`; + } + return { source, target }; +}; +const addEdges = function(edges, diagObj, graph, svg) { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc78 edges = ", edges); + const labelsEl = svg.insert("g").attr("class", "edgeLabels"); + let linkIdCnt = {}; + let dir = diagObj.db.getDirection(); + let defaultStyle; + let defaultLabelStyle; + if (edges.defaultStyle !== void 0) { + const defaultStyles = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.a)(edges.defaultStyle); + defaultStyle = defaultStyles.style; + defaultLabelStyle = defaultStyles.labelStyle; + } + edges.forEach(function(edge) { + var linkIdBase = "L-" + edge.start + "-" + edge.end; + if (linkIdCnt[linkIdBase] === void 0) { + linkIdCnt[linkIdBase] = 0; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc78 new entry", linkIdBase, linkIdCnt[linkIdBase]); + } else { + linkIdCnt[linkIdBase]++; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc78 new entry", linkIdBase, linkIdCnt[linkIdBase]); + } + let linkId = linkIdBase + "-" + linkIdCnt[linkIdBase]; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("abc78 new link id to be used is", linkIdBase, linkId, linkIdCnt[linkIdBase]); + var linkNameStart = "LS-" + edge.start; + var linkNameEnd = "LE-" + edge.end; + const edgeData = { style: "", labelStyle: "" }; + edgeData.minlen = edge.length || 1; + if (edge.type === "arrow_open") { + edgeData.arrowhead = "none"; + } else { + edgeData.arrowhead = "normal"; + } + edgeData.arrowTypeStart = "arrow_open"; + edgeData.arrowTypeEnd = "arrow_open"; + switch (edge.type) { + case "double_arrow_cross": + edgeData.arrowTypeStart = "arrow_cross"; + case "arrow_cross": + edgeData.arrowTypeEnd = "arrow_cross"; + break; + case "double_arrow_point": + edgeData.arrowTypeStart = "arrow_point"; + case "arrow_point": + edgeData.arrowTypeEnd = "arrow_point"; + break; + case "double_arrow_circle": + edgeData.arrowTypeStart = "arrow_circle"; + case "arrow_circle": + edgeData.arrowTypeEnd = "arrow_circle"; + break; + } + let style = ""; + let labelStyle = ""; + switch (edge.stroke) { + case "normal": + style = "fill:none;"; + if (defaultStyle !== void 0) { + style = defaultStyle; + } + if (defaultLabelStyle !== void 0) { + labelStyle = defaultLabelStyle; + } + edgeData.thickness = "normal"; + edgeData.pattern = "solid"; + break; + case "dotted": + edgeData.thickness = "normal"; + edgeData.pattern = "dotted"; + edgeData.style = "fill:none;stroke-width:2px;stroke-dasharray:3;"; + break; + case "thick": + edgeData.thickness = "thick"; + edgeData.pattern = "solid"; + edgeData.style = "stroke-width: 3.5px;fill:none;"; + break; + } + if (edge.style !== void 0) { + const styles2 = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.a)(edge.style); + style = styles2.style; + labelStyle = styles2.labelStyle; + } + edgeData.style = edgeData.style += style; + edgeData.labelStyle = edgeData.labelStyle += labelStyle; + if (edge.interpolate !== void 0) { + edgeData.curve = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.d)(edge.interpolate, d3__WEBPACK_IMPORTED_MODULE_0__/* .curveLinear */ .c_6); + } else if (edges.defaultInterpolate !== void 0) { + edgeData.curve = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.d)(edges.defaultInterpolate, d3__WEBPACK_IMPORTED_MODULE_0__/* .curveLinear */ .c_6); + } else { + edgeData.curve = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.d)(conf.curve, d3__WEBPACK_IMPORTED_MODULE_0__/* .curveLinear */ .c_6); + } + if (edge.text === void 0) { + if (edge.style !== void 0) { + edgeData.arrowheadStyle = "fill: #333"; + } + } else { + edgeData.arrowheadStyle = "fill: #333"; + edgeData.labelpos = "c"; + } + edgeData.labelType = "text"; + edgeData.label = edge.text.replace(_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.c.lineBreakRegex, "\n"); + if (edge.style === void 0) { + edgeData.style = edgeData.style || "stroke: #333; stroke-width: 1.5px;fill:none;"; + } + edgeData.labelStyle = edgeData.labelStyle.replace("color:", "fill:"); + edgeData.id = linkId; + edgeData.classes = "flowchart-link " + linkNameStart + " " + linkNameEnd; + const labelEl = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.f)(labelsEl, edgeData); + const { source, target } = getEdgeStartEndPoint(edge, dir); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.debug("abc78 source and target", source, target); + graph.edges.push({ + id: "e" + edge.start + edge.end, + sources: [source], + targets: [target], + labelEl, + labels: [ + { + width: edgeData.width, + height: edgeData.height, + orgWidth: edgeData.width, + orgHeight: edgeData.height, + text: edgeData.label, + layoutOptions: { + "edgeLabels.inline": "true", + "edgeLabels.placement": "CENTER" + } + } + ], + edgeData + }); + }); + return graph; +}; +const addMarkersToEdge = function(svgPath, edgeData, diagramType, arrowMarkerAbsolute) { + let url = ""; + if (arrowMarkerAbsolute) { + url = window.location.protocol + "//" + window.location.host + window.location.pathname + window.location.search; + url = url.replace(/\(/g, "\\("); + url = url.replace(/\)/g, "\\)"); + } + switch (edgeData.arrowTypeStart) { + case "arrow_cross": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-crossStart)"); + break; + case "arrow_point": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-pointStart)"); + break; + case "arrow_barb": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-barbStart)"); + break; + case "arrow_circle": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-circleStart)"); + break; + case "aggregation": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-aggregationStart)"); + break; + case "extension": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-extensionStart)"); + break; + case "composition": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-compositionStart)"); + break; + case "dependency": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-dependencyStart)"); + break; + case "lollipop": + svgPath.attr("marker-start", "url(" + url + "#" + diagramType + "-lollipopStart)"); + break; + } + switch (edgeData.arrowTypeEnd) { + case "arrow_cross": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-crossEnd)"); + break; + case "arrow_point": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-pointEnd)"); + break; + case "arrow_barb": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-barbEnd)"); + break; + case "arrow_circle": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-circleEnd)"); + break; + case "aggregation": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-aggregationEnd)"); + break; + case "extension": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-extensionEnd)"); + break; + case "composition": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-compositionEnd)"); + break; + case "dependency": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-dependencyEnd)"); + break; + case "lollipop": + svgPath.attr("marker-end", "url(" + url + "#" + diagramType + "-lollipopEnd)"); + break; + } +}; +const getClasses = function(text, diagObj) { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Extracting classes"); + diagObj.db.clear("ver-2"); + try { + diagObj.parse(text); + return diagObj.db.getClasses(); + } catch (e) { + return {}; + } +}; +const addSubGraphs = function(db2) { + const parentLookupDb = { parentById: {}, childrenById: {} }; + const subgraphs = db2.getSubGraphs(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Subgraphs - ", subgraphs); + subgraphs.forEach(function(subgraph) { + subgraph.nodes.forEach(function(node) { + parentLookupDb.parentById[node] = subgraph.id; + if (parentLookupDb.childrenById[subgraph.id] === void 0) { + parentLookupDb.childrenById[subgraph.id] = []; + } + parentLookupDb.childrenById[subgraph.id].push(node); + }); + }); + subgraphs.forEach(function(subgraph) { + ({ id: subgraph.id }); + if (parentLookupDb.parentById[subgraph.id] !== void 0) { + parentLookupDb.parentById[subgraph.id]; + } + }); + return parentLookupDb; +}; +const calcOffset = function(src, dest, parentLookupDb) { + const ancestor = findCommonAncestor(src, dest, parentLookupDb); + if (ancestor === void 0 || ancestor === "root") { + return { x: 0, y: 0 }; + } + const ancestorOffset = nodeDb[ancestor].offset; + return { x: ancestorOffset.posX, y: ancestorOffset.posY }; +}; +const insertEdge = function(edgesEl, edge, edgeData, diagObj, parentLookupDb) { + const offset = calcOffset(edge.sources[0], edge.targets[0], parentLookupDb); + const src = edge.sections[0].startPoint; + const dest = edge.sections[0].endPoint; + const segments = edge.sections[0].bendPoints ? edge.sections[0].bendPoints : []; + const segPoints = segments.map((segment) => [segment.x + offset.x, segment.y + offset.y]); + const points = [ + [src.x + offset.x, src.y + offset.y], + ...segPoints, + [dest.x + offset.x, dest.y + offset.y] + ]; + const curve = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .line */ .jvg)().curve(d3__WEBPACK_IMPORTED_MODULE_0__/* .curveLinear */ .c_6); + const edgePath = edgesEl.insert("path").attr("d", curve(points)).attr("class", "path").attr("fill", "none"); + const edgeG = edgesEl.insert("g").attr("class", "edgeLabel"); + const edgeWithLabel = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(edgeG.node().appendChild(edge.labelEl)); + const box = edgeWithLabel.node().firstChild.getBoundingClientRect(); + edgeWithLabel.attr("width", box.width); + edgeWithLabel.attr("height", box.height); + edgeG.attr( + "transform", + `translate(${edge.labels[0].x + offset.x}, ${edge.labels[0].y + offset.y})` + ); + addMarkersToEdge(edgePath, edgeData, diagObj.type, diagObj.arrowMarkerAbsolute); +}; +const insertChildren = (nodeArray, parentLookupDb) => { + nodeArray.forEach((node) => { + if (!node.children) { + node.children = []; + } + const childIds = parentLookupDb.childrenById[node.id]; + if (childIds) { + childIds.forEach((childId) => { + node.children.push(nodeDb[childId]); + }); + } + insertChildren(node.children, parentLookupDb); + }); +}; +const draw = async function(text, id, _version, diagObj) { + var _a; + diagObj.db.clear(); + nodeDb = {}; + diagObj.db.setGen("gen-2"); + diagObj.parser.parse(text); + const renderEl = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body").append("div").attr("style", "height:400px").attr("id", "cy"); + let graph = { + id: "root", + layoutOptions: { + "elk.hierarchyHandling": "INCLUDE_CHILDREN", + "org.eclipse.elk.padding": "[top=100, left=100, bottom=110, right=110]", + "elk.layered.spacing.edgeNodeBetweenLayers": "30", + // 'elk.layered.mergeEdges': 'true', + "elk.direction": "DOWN" + // 'elk.ports.sameLayerEdges': true, + // 'nodePlacement.strategy': 'SIMPLE', + }, + children: [], + edges: [] + }; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Drawing flowchart using v3 renderer", elk); + let dir = diagObj.db.getDirection(); + switch (dir) { + case "BT": + graph.layoutOptions["elk.direction"] = "UP"; + break; + case "TB": + graph.layoutOptions["elk.direction"] = "DOWN"; + break; + case "LR": + graph.layoutOptions["elk.direction"] = "RIGHT"; + break; + case "RL": + graph.layoutOptions["elk.direction"] = "LEFT"; + break; + } + const { securityLevel, flowchart: conf2 } = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.g)(); + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("#i" + id); + } + const root = securityLevel === "sandbox" ? (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(sandboxElement.nodes()[0].contentDocument.body) : (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body"); + const doc = securityLevel === "sandbox" ? sandboxElement.nodes()[0].contentDocument : document; + const svg = root.select(`[id="${id}"]`); + const markers = ["point", "circle", "cross"]; + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.i)(svg, markers, diagObj.type, diagObj.arrowMarkerAbsolute); + const vert = diagObj.db.getVertices(); + let subG; + const subGraphs = diagObj.db.getSubGraphs(); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Subgraphs - ", subGraphs); + for (let i = subGraphs.length - 1; i >= 0; i--) { + subG = subGraphs[i]; + diagObj.db.addVertex(subG.id, subG.title, "group", void 0, subG.classes, subG.dir); + } + const subGraphsEl = svg.insert("g").attr("class", "subgraphs"); + const parentLookupDb = addSubGraphs(diagObj.db); + graph = addVertices(vert, id, root, doc, diagObj, parentLookupDb, graph); + const edgesEl = svg.insert("g").attr("class", "edges edgePath"); + const edges = diagObj.db.getEdges(); + graph = addEdges(edges, diagObj, graph, svg); + const nodes = Object.keys(nodeDb); + nodes.forEach((nodeId) => { + const node = nodeDb[nodeId]; + if (!node.parent) { + graph.children.push(node); + } + if (parentLookupDb.childrenById[nodeId] !== void 0) { + node.labels = [ + { + text: node.labelText, + layoutOptions: { + "nodeLabels.placement": "[H_CENTER, V_TOP, INSIDE]" + }, + width: node.labelData.width, + height: node.labelData.height + } + ]; + delete node.x; + delete node.y; + delete node.width; + delete node.height; + } + }); + insertChildren(graph.children, parentLookupDb); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("after layout", JSON.stringify(graph, null, 2)); + const g = await elk.layout(graph); + drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj, 0); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("after layout", g); + (_a = g.edges) == null ? void 0 : _a.map((edge) => { + insertEdge(edgesEl, edge, edge.edgeData, diagObj, parentLookupDb); + }); + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.s)({}, svg, conf2.diagramPadding, conf2.useMaxWidth); + renderEl.remove(); +}; +const drawNodes = (relX, relY, nodeArray, svg, subgraphsEl, diagObj, depth) => { + nodeArray.forEach(function(node) { + if (node) { + nodeDb[node.id].offset = { + posX: node.x + relX, + posY: node.y + relY, + x: relX, + y: relY, + depth, + width: node.width, + height: node.height + }; + if (node.type === "group") { + const subgraphEl = subgraphsEl.insert("g").attr("class", "subgraph"); + subgraphEl.insert("rect").attr("class", "subgraph subgraph-lvl-" + depth % 5 + " node").attr("x", node.x + relX).attr("y", node.y + relY).attr("width", node.width).attr("height", node.height); + const label = subgraphEl.insert("g").attr("class", "label"); + label.attr( + "transform", + `translate(${node.labels[0].x + relX + node.x}, ${node.labels[0].y + relY + node.y})` + ); + label.node().appendChild(node.labelData.labelNode); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Id (UGH)= ", node.type, node.labels); + } else { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.l.info("Id (UGH)= ", node.id); + node.el.attr( + "transform", + `translate(${node.x + relX + node.width / 2}, ${node.y + relY + node.height / 2})` + ); + } + } + }); + nodeArray.forEach(function(node) { + if (node && node.type === "group") { + drawNodes(relX + node.x, relY + node.y, node.children, svg, subgraphsEl, diagObj, depth + 1); + } + }); +}; +const renderer = { + getClasses, + draw +}; +const genSections = (options) => { + let sections = ""; + for (let i = 0; i < 5; i++) { + sections += ` + .subgraph-lvl-${i} { + fill: ${options[`surface${i}`]}; + stroke: ${options[`surfacePeer${i}`]}; + } + `; + } + return sections; +}; +const getStyles = (options) => `.label { + font-family: ${options.fontFamily}; + color: ${options.nodeTextColor || options.textColor}; + } + .cluster-label text { + fill: ${options.titleColor}; + } + .cluster-label span { + color: ${options.titleColor}; + } + + .label text,span { + fill: ${options.nodeTextColor || options.textColor}; + color: ${options.nodeTextColor || options.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${options.mainBkg}; + stroke: ${options.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${options.arrowheadColor}; + } + + .edgePath .path { + stroke: ${options.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${options.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${options.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${options.edgeLabelBackground}; + fill: ${options.edgeLabelBackground}; + } + text-align: center; + } + + .cluster rect { + fill: ${options.clusterBkg}; + stroke: ${options.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${options.titleColor}; + } + + .cluster span { + color: ${options.titleColor}; + } + /* .cluster div { + color: ${options.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${options.fontFamily}; + font-size: 12px; + background: ${options.tertiaryColor}; + border: 1px solid ${options.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${options.textColor}; + } + .subgraph { + stroke-width:2; + rx:3; + } + // .subgraph-lvl-1 { + // fill:#ccc; + // // stroke:black; + // } + ${genSections(options)} +`; +const styles = getStyles; +const diagram = { + db: _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.h, + renderer, + parser: _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_12__.p, + styles +}; + +//# sourceMappingURL=flowchart-elk-definition-170a3958.js.map + + +/***/ }) + +}; +; \ No newline at end of file diff --git a/assets/js/4c4e9f30.f247e2b4.js b/assets/js/4c4e9f30.f247e2b4.js new file mode 100644 index 0000000..8e42c9d --- /dev/null +++ b/assets/js/4c4e9f30.f247e2b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7883],{7803:i=>{i.exports=JSON.parse('{"label":"exponential","permalink":"/ib002/tags/exponential","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"recursion/pyramid-slide-down","title":"Introduction to dynamic programming","description":"Solving a problem in different ways.\\n","permalink":"/ib002/recursion/pyramid-slide-down"}]}')}}]); \ No newline at end of file diff --git a/assets/js/4e286f4e.b0df1295.js b/assets/js/4e286f4e.b0df1295.js new file mode 100644 index 0000000..dc7a032 --- /dev/null +++ b/assets/js/4e286f4e.b0df1295.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1501],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,p=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),d=r,h=m["".concat(p,".").concat(d)]||m[d]||c[d]||o;return n?a.createElement(h,i(i({ref:t},u),{},{components:n})):a.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[m]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var a=n(7462),r=(n(7294),n(3905));const o={id:"karel-1",title:"Recursion and backtracking with Robot Karel",description:"A problem with too many restrictions.\n",tags:["python","karel","recursion","backtracking"],last_update:{date:new Date("2022-11-29T00:00:00.000Z")}},i=void 0,l={unversionedId:"recursion/karel-1",id:"recursion/karel-1",title:"Recursion and backtracking with Robot Karel",description:"A problem with too many restrictions.\n",source:"@site/ib002/04-recursion/2022-11-29-karel-1.md",sourceDirName:"04-recursion",slug:"/recursion/karel-1",permalink:"/ib002/recursion/karel-1",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/04-recursion/2022-11-29-karel-1.md",tags:[{label:"python",permalink:"/ib002/tags/python"},{label:"karel",permalink:"/ib002/tags/karel"},{label:"recursion",permalink:"/ib002/tags/recursion"},{label:"backtracking",permalink:"/ib002/tags/backtracking"}],version:"current",lastUpdatedAt:166968e4,formattedLastUpdatedAt:"Nov 29, 2022",frontMatter:{id:"karel-1",title:"Recursion and backtracking with Robot Karel",description:"A problem with too many restrictions.\n",tags:["python","karel","recursion","backtracking"],last_update:{date:"2022-11-29T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Recursion",permalink:"/ib002/category/recursion"},next:{title:"Introduction to dynamic programming",permalink:"/ib002/recursion/pyramid-slide-down"}},p={},s=[{value:"Introduction",id:"introduction",level:2},{value:"Your environment and problem description",id:"your-environment-and-problem-description",level:2},{value:"Environment",id:"environment",level:3},{value:"Interface",id:"interface",level:3},{value:"Problem",id:"problem",level:3},{value:"Simple problem to get familiar with the robot",id:"simple-problem-to-get-familiar-with-the-robot",level:2},{value:"Brainstorm the idea",id:"brainstorm-the-idea",level:2},{value:"\xbbRough\xab pseudocode",id:"rough-pseudocode",level:2},{value:"\xbbProper\xab pseudocode",id:"proper-pseudocode",level:2},{value:"Library",id:"library",level:2},{value:"Solution",id:"solution",level:2}],u={toc:s},m="wrapper";function c(e){let{components:t,...o}=e;return(0,r.kt)(m,(0,a.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"pathname:///files/ib002/recursion/karel-1.tar.gz"},"Sources"))),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"In this exercise we will be working with a Robot Karel and with a \xbbvery\xab limited\nresources. The point of this exercise is to show how powerful recursion and\nbacktracking can be even without anything else at your hand."),(0,r.kt)("h2",{id:"your-environment-and-problem-description"},"Your environment and problem description"),(0,r.kt)("h3",{id:"environment"},"Environment"),(0,r.kt)("p",null,"You are given a robot that is present in a maze and is looking for an exit. Maze\nconsists of different walls and exit is marked with a single so-called \u201cbeeper\u201d."),(0,r.kt)("p",null,"Walking into a wall results in a permanent damage of the robot."),(0,r.kt)("h3",{id:"interface"},"Interface"),(0,r.kt)("p",null,"You can control the robot using the following interface:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"actions \u200b\xad\u2014 you can use them to change the current state of the robot and its\nsurroundings",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"robot.step()")," \u2014 moves robot one step further"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"robot.turn_left()")," \u2014 turns robot 90-degrees counter-clockwise",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"notice that you are not given ",(0,r.kt)("inlineCode",{parentName:"li"},"turn_right")," or ",(0,r.kt)("inlineCode",{parentName:"li"},"turn_around"),", but feel free\nto implement them yourself"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"robot.pick_beeper()")," and opposite operation ",(0,r.kt)("inlineCode",{parentName:"li"},"robot.put_beeper()")," \u2014 that\nallows you to either pick or put \u201cbeeper\u201d from or onto the current position"))),(0,r.kt)("li",{parentName:"ul"},"queries \u2014 you can use them to check the current state of the robot and its\nsurroundings",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"robot.beepers_present()")," \u2014 to check if there are any beepers at the robot's\ncurrent location"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"robot.left_is_clear()")," \u2014 to check if you can step to the left",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"analogically for ",(0,r.kt)("inlineCode",{parentName:"li"},"front")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"right"))))))),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"Helper functions / procedures are allowed. Return values are allowed."),(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("strong",{parentName:"p"},"Variables are prohibited!"))),(0,r.kt)("h3",{id:"problem"},"Problem"),(0,r.kt)("p",null,"Your task is to decide whether there is an exit from the maze or not. You can see\nan example of a maze here:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Image of the maze",src:n(9857).Z,width:"770",height:"839"})),(0,r.kt)("h2",{id:"simple-problem-to-get-familiar-with-the-robot"},"Simple problem to get familiar with the robot"),(0,r.kt)("p",null,"If you feel completely lost after the previous description, let me start you off\nwith a simpler problem."),(0,r.kt)("p",null,"You are standing in front of the stairs, your task is to walk up the stairs."),(0,r.kt)("p",null,"You can see an example of such map here:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Image of the stairs",src:n(8617).Z,width:"1058",height:"1161"})),(0,r.kt)("h2",{id:"brainstorm-the-idea"},"Brainstorm the idea"),(0,r.kt)("p",null,"As a first step write down any ideas and things that you have noticed or came to\nyour mind. Ideally:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Write down a nested list of the problems, e.g."),(0,r.kt)("admonition",{parentName:"li",title:"Example ",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Problem: I want to find out whether the display on smartphone should rotate."),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"Check if display has been rotated",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Read data from some sensor",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"From what sensor"))),(0,r.kt)("li",{parentName:"ul"},"In what format are the data I have read?"),(0,r.kt)("li",{parentName:"ul"},"How do I communicate with the sensor?"),(0,r.kt)("li",{parentName:"ul"},"What is the meaning of the data that I got?"),(0,r.kt)("li",{parentName:"ul"},"How can I process it?")))))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Write down list of problems that can happen, e.g."),(0,r.kt)("admonition",{parentName:"li",title:"Example continued",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Following the same problem."),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"What if the sensor doesn't work?"),(0,r.kt)("li",{parentName:"ul"},"What if the data doesn't conform to the specification?"),(0,r.kt)("li",{parentName:"ul"},"What if my formulas are wrong?")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Write down ",(0,r.kt)("strong",{parentName:"p"},"anything")," you consider important to solving the problem, e.g."),(0,r.kt)("admonition",{parentName:"li",title:"Example continued once again",type:"info"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"I could probably use gyroscope."),(0,r.kt)("li",{parentName:"ul"},"I should probably look up the datasheet for that module."),(0,r.kt)("li",{parentName:"ul"},"I could write some tests to verify that my computations are correct."))))),(0,r.kt)("h2",{id:"rough-pseudocode"},"\xbbRough\xab pseudocode"),(0,r.kt)("p",null,"As a next step write a ",(0,r.kt)("strong",{parentName:"p"},"mock up")," of a pseudocode solving the problem, you are\nallowed to use comments as placeholders for bigger chunks of code."),(0,r.kt)("p",null,"Those comments are also a very good hints for decomposition and short, but\ndescriptive, commnets (if they are short enough and you decide not to factor them\nout to separate functions)."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The smaller the function is, the easier it is to test it and argue about its\ncorrectness.")),(0,r.kt)("h2",{id:"proper-pseudocode"},"\xbbProper\xab pseudocode"),(0,r.kt)("p",null,"If you are satisfied with the ",(0,r.kt)("em",{parentName:"p"},"\xbbrough\xab pseudocode"),", it's time to convert it into\na proper one. Get rid of the uncertain pieces of functionality and replace them\nwith proper pseudocode, i.e. list of the things that should happen in its place."),(0,r.kt)("h2",{id:"library"},"Library"),(0,r.kt)("p",null,"If you got here, and you ",(0,r.kt)("strong",{parentName:"p"},"actually")," wrote down the pseudocode, you can try your\nsolution after downloading the sources linked at the beginning. If you download\nthe ZIP-file, you can there:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"generate_mazes.py")," - that was used to generate the same maze with beepers in\ndifferent locations")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"karel_tk.py")," - library which can run Karel given the his world"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"documentation can be found ",(0,r.kt)("a",{parentName:"li",href:"https://www.fi.muni.cz/~xfocko/ib111/10/docs/"},"here")),(0,r.kt)("li",{parentName:"ul"},"also requires Tk Python library to be installed (it should be included in\nmajority of Python installations)"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"*.kw")," - which represent multiple worlds for Karel I have prepared")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"skeleton.py")," - skeleton for your solution, needs to be put in the same directory\nas ",(0,r.kt)("inlineCode",{parentName:"p"},"karel_tk.py")," and takes path to the world as a first argument, example usage:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"$ python3 skeleton.py stairs.kw\n")),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"of course, this file can be renamed ;)")))),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Solution to this problem will be released as a second part, so that you can try\nit out by yourself without any influence of \u201cexample solution\u201d."),(0,r.kt)("p",null,"If you want to get any feedback, feel free to mail me your solution (including\nall the steps that lead to your final solution, if you wish to get feedback on\nthose too)."))}c.isMDXComponent=!0},9857:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/maze-a374d908bc9445061e15faeddc71641e.png"},8617:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/stairs-5ee5d03905645aeb13eeaa7774451a64.png"}}]); \ No newline at end of file diff --git a/assets/js/4edd2021.47ff14e6.js b/assets/js/4edd2021.47ff14e6.js new file mode 100644 index 0000000..9d0f2e9 --- /dev/null +++ b/assets/js/4edd2021.47ff14e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5975],{1705:a=>{a.exports=JSON.parse('{"label":"cpp","permalink":"/blog/tags/cpp","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/4ee12fa2.74d68d7b.js b/assets/js/4ee12fa2.74d68d7b.js new file mode 100644 index 0000000..f0db623 --- /dev/null +++ b/assets/js/4ee12fa2.74d68d7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7963],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}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 a(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var p=n.createContext({}),l=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(p.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,i=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=l(r),d=o,m=s["".concat(p,".").concat(d)]||s[d]||f[d]||i;return r?n.createElement(m,a(a({ref:t},u),{},{components:r})):n.createElement(m,a({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=r.length,a=new Array(i);a[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c[s]="string"==typeof e?e:o,a[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const i={id:"pb161-intro",title:"Introduction",slug:"/"},a=void 0,c={unversionedId:"pb161-intro",id:"pb161-intro",title:"Introduction",description:"",source:"@site/pb161/00-intro-pb161.md",sourceDirName:".",slug:"/",permalink:"/pb161/",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb161/00-intro-pb161.md",tags:[],version:"current",lastUpdatedAt:1694108971,formattedLastUpdatedAt:"Sep 7, 2023",sidebarPosition:0,frontMatter:{id:"pb161-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Environment",permalink:"/pb161/environment"}},p={},l=[],u={toc:l},s="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/51624505.ab30cae6.js b/assets/js/51624505.ab30cae6.js new file mode 100644 index 0000000..f2d9206 --- /dev/null +++ b/assets/js/51624505.ab30cae6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3731],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(n),m=r,h=c["".concat(l,".").concat(m)]||c[m]||d[m]||o;return n?a.createElement(h,i(i({ref:t},u),{},{components:n})):a.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:r,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const o={title:"Advent of Code '22 in Rust",description:"Preparing for Advent of Code '22.",date:"2022-12-14T21:45",slug:"aoc-2022/intro",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},i=void 0,s={permalink:"/blog/aoc-2022/intro",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/00-intro.md",source:"@site/blog/aoc-2022/00-intro.md",title:"Advent of Code '22 in Rust",description:"Preparing for Advent of Code '22.",date:"2022-12-14T21:45:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:8.665,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"Advent of Code '22 in Rust",description:"Preparing for Advent of Code '22.",date:"2022-12-14T21:45",slug:"aoc-2022/intro",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"1st week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/1st-week"}},l={authorsImageUrls:[void 0]},p=[{value:"Choosing a language",id:"choosing-a-language",level:2},{value:"Choosing libraries",id:"choosing-libraries",level:2},{value:"Preparations for Rust",id:"preparations-for-rust",level:2},{value:"Toolkit",id:"toolkit",level:3},{value:"Libraries",id:"libraries",level:3},{value:"My own \u201clibrary\u201d",id:"my-own-library",level:3},{value:"Skeleton",id:"skeleton",level:3}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Let's talk about the preparations for this year's ",(0,r.kt)("a",{parentName:"p",href:"https://adventofcode.com"},(0,r.kt)("em",{parentName:"a"},"Advent of Code")),"."),(0,r.kt)("h2",{id:"choosing-a-language"},"Choosing a language"),(0,r.kt)("p",null,"When choosing a language for AoC, you usually want a language that gives you a\nquick feedback which allows you to iterate quickly to the solution of the puzzle.\nOne of the most common choices is Python, many people also use JavaScript or Ruby."),(0,r.kt)("p",null,"Given the competitive nature of the AoC and popularity among competitive programming,\nC++ might be also a very good choice. Only if you are familiar with it, I guess\u2026"),(0,r.kt)("p",null,"If you want a challenge, you might also choose to rotate the languages each day.\nThough I prefer to use only one language."),(0,r.kt)("p",null,"For this year I have been deciding between ",(0,r.kt)("em",{parentName:"p"},"Rust"),", ",(0,r.kt)("em",{parentName:"p"},"C++")," and ",(0,r.kt)("em",{parentName:"p"},"Pascal")," or ",(0,r.kt)("em",{parentName:"p"},"Ada"),"."),(0,r.kt)("p",null,"I have tried Rust last year and have survived with it for 3 days and then gave\nup and switched to ",(0,r.kt)("em",{parentName:"p"},"Kotlin"),", which was pretty good given it is \u201cJava undercover\u201d.\nI pretty much like the ideas behind Rust, I am not sure about the whole cult and\nimplementation of those ideas though. After some years with C/C++, I would say\nthat Rust feels ",(0,r.kt)("em",{parentName:"p"},"too safe")," for my taste and tries to \u201c",(0,r.kt)("em",{parentName:"p"},"punish me"),"\u201d even for the\nmost trivial things."),(0,r.kt)("p",null,"C++ is a very robust, but also comes with a wide variety of options providing you\nthe ability to shoot yourself in the leg. I have tried to solve few days of previous\nAdvent of Code events, it was ",(0,r.kt)("em",{parentName:"p"},"relatively easy")," to solve the problems in C++, given\nthat I do not admit writing my own iterator for ",(0,r.kt)("inlineCode",{parentName:"p"},"enumerate"),"\u2026"),(0,r.kt)("p",null,"Pascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a\npretty nice standard library that offers enough to be able to quickly solve some\nproblems in it. However the toolkit is questionable :/"),(0,r.kt)("h2",{id:"choosing-libraries"},"Choosing libraries"),(0,r.kt)("h2",{id:"preparations-for-rust"},"Preparations for Rust"),(0,r.kt)("p",null,"All of the sources, later on including solutions, can be found at my\n",(0,r.kt)("a",{parentName:"p",href:"https://gitlab.com/mfocko/advent-of-code-2022"},"GitLab"),"."),(0,r.kt)("h3",{id:"toolkit"},"Toolkit"),(0,r.kt)("p",null,"Since we are using Rust, we are going to use a ",(0,r.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/cargo/"},"Cargo")," and more than likely VSCode\nwith ",(0,r.kt)("a",{parentName:"p",href:"https://rust-analyzer.github.io/"},(0,r.kt)("inlineCode",{parentName:"a"},"rust-analyzer")),". Because of my choice of libraries, we will also introduce\na ",(0,r.kt)("inlineCode",{parentName:"p"},".envrc")," file that can be used by ",(0,r.kt)("a",{parentName:"p",href:"https://direnv.net/"},(0,r.kt)("inlineCode",{parentName:"a"},"direnv")),", which allows you to set specific\nenvironment variables when you enter a directory. In our case, we will use"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# to show nice backtrace when using the color-eyre\nexport RUST_BACKTRACE=1\n\n# to catch logs generated by tracing\nexport RUST_LOG=trace\n")),(0,r.kt)("p",null,"And for the one of the most obnoxious things ever, we will use a script to download\nthe inputs instead of \u201c",(0,r.kt)("em",{parentName:"p"},"clicking, opening and copying to a file"),"\u201d",(0,r.kt)("sup",{parentName:"p",id:"fnref-1-793a30"},(0,r.kt)("a",{parentName:"sup",href:"#fn-1-793a30",className:"footnote-ref"},"1")),". There is\nno need to be ",(0,r.kt)("em",{parentName:"p"},"fancy"),", so we will adjust Python script by Martin",(0,r.kt)("sup",{parentName:"p",id:"fnref-2-793a30"},(0,r.kt)("a",{parentName:"sup",href:"#fn-2-793a30",className:"footnote-ref"},"2")),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-py"},'#!/usr/bin/env python3\n\nimport datetime\nimport yaml\nimport requests\nimport sys\n\n\ndef load_config():\n with open("env.yaml", "r") as f:\n js = yaml.load(f, Loader=yaml.Loader)\n return js["session"], js["year"]\n\n\ndef get_input(session, year, day):\n return requests.get(\n f"https://adventofcode.com/{year}/day/{day}/input",\n cookies={"session": session},\n headers={\n "User-Agent": "{repo} by {mail}".format(\n repo="gitlab.com/mfocko/advent-of-code-2022",\n mail="me@mfocko.xyz",\n )\n },\n ).content.decode("utf-8")\n\n\ndef main():\n day = datetime.datetime.now().day\n if len(sys.argv) == 2:\n day = sys.argv[1]\n\n session, year = load_config()\n problem_input = get_input(session, year, day)\n\n with open(f"./inputs/day{day:>02}.txt", "w") as f:\n f.write(problem_input)\n\n\nif __name__ == "__main__":\n main()\n')),(0,r.kt)("p",null,"If the script is called without any arguments, it will deduce the day from the\nsystem, so we do not need to change the day every morning. It also requires a\nconfiguration file:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"# env.yaml\nsession: \u2039your session cookie\u203a\nyear: 2022\n")),(0,r.kt)("h3",{id:"libraries"},"Libraries"),(0,r.kt)("p",null,"Looking at the list of the libraries, I have chosen \u201ca lot\u201d of them. Let's walk\nthrough each of them."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://crates.io/crates/tracing"},(0,r.kt)("inlineCode",{parentName:"a"},"tracing"))," and ",(0,r.kt)("a",{parentName:"p",href:"https://crates.io/crates/tracing-subscriber"},(0,r.kt)("inlineCode",{parentName:"a"},"tracing-subscriber"))," are the crates that can be used for tracing\nand logging of your Rust programs, there are also other crates that can help you\nwith providing backtrace to the Sentry in case you have deployed your application\nsomewhere and you want to watch over it. In our use case we will just utilize the\nmacros for debugging in the terminal."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://crates.io/crates/thiserror"},(0,r.kt)("inlineCode",{parentName:"a"},"thiserror")),", ",(0,r.kt)("a",{parentName:"p",href:"https://crates.io/crates/anyhow"},(0,r.kt)("inlineCode",{parentName:"a"},"anyhow"))," and ",(0,r.kt)("a",{parentName:"p",href:"https://crates.io/crates/color-eyre"},(0,r.kt)("inlineCode",{parentName:"a"},"color-eyre"))," are used for error reporting.\n",(0,r.kt)("inlineCode",{parentName:"p"},"thiserror")," is a very good choice for libraries, cause it extends the ",(0,r.kt)("inlineCode",{parentName:"p"},"Error"),"\nfrom the ",(0,r.kt)("inlineCode",{parentName:"p"},"std")," and allows you to create more convenient error types. Next is\n",(0,r.kt)("inlineCode",{parentName:"p"},"anyhow")," which kinda builds on top of the ",(0,r.kt)("inlineCode",{parentName:"p"},"thiserror")," and provides you with simpler\nerror handling in binaries",(0,r.kt)("sup",{parentName:"p",id:"fnref-3-793a30"},(0,r.kt)("a",{parentName:"sup",href:"#fn-3-793a30",className:"footnote-ref"},"3")),". And finally we have ",(0,r.kt)("inlineCode",{parentName:"p"},"color-eyre")," which, as I found\nout later, is a colorful (",(0,r.kt)("em",{parentName:"p"},"wink wink"),") extension of ",(0,r.kt)("inlineCode",{parentName:"p"},"eyre")," which is fork of ",(0,r.kt)("inlineCode",{parentName:"p"},"anyhow"),"\nwhile supporting customized reports."),(0,r.kt)("p",null,"In the end I have decided to remove ",(0,r.kt)("inlineCode",{parentName:"p"},"thiserror")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"anyhow"),", since first one is\nsuitable for libraries and the latter was basically fully replaced by ",(0,r.kt)("inlineCode",{parentName:"p"},"{color-,}eyre"),"."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://crates.io/crates/regex"},(0,r.kt)("inlineCode",{parentName:"a"},"regex"))," and ",(0,r.kt)("a",{parentName:"p",href:"https://crates.io/crates/lazy_static"},(0,r.kt)("inlineCode",{parentName:"a"},"lazy_static"))," are a very good and also, I hope, self-explanatory\ncombination. ",(0,r.kt)("inlineCode",{parentName:"p"},"lazy_static")," allows you to have static variables that must be initialized\nduring runtime."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://crates.io/crates/itertools"},(0,r.kt)("inlineCode",{parentName:"a"},"itertools"))," provides some nice extensions to the iterators from the ",(0,r.kt)("inlineCode",{parentName:"p"},"std"),"."),(0,r.kt)("h3",{id:"my-own-library"},"My own \u201clibrary\u201d"),(0,r.kt)("p",null,"When creating the crate for this year's Advent of Code, I have chosen a library\ntype. Even though standard library is huge, some things might not be included and\nalso we can follow ",(0,r.kt)("em",{parentName:"p"},"KISS"),". I have 2 modules that my \u201clibrary\u201d exports, one for\nparsing and one for 2D vector (that gets used quite often during Advent of Code)."),(0,r.kt)("p",null,"Key part is, of course, processing the input and my library exports following\nfunctions that get used a lot:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"/// Reads file to the string.\npub fn file_to_string>(pathname: P) -> String;\n\n/// Reads file and returns it as a vector of characters.\npub fn file_to_chars>(pathname: P) -> Vec;\n\n/// Reads file and returns a vector of parsed structures. Expects each structure\n/// on its own line in the file. And `T` needs to implement `FromStr` trait.\npub fn file_to_structs, T: FromStr>(pathname: P) -> Vec\nwhere\n ::Err: Debug;\n\n/// Converts iterator over strings to a vector of parsed structures. `T` needs\n/// to implement `FromStr` trait and its error must derive `Debug` trait.\npub fn strings_to_structs(\n iter: impl Iterator\n) -> Vec\nwhere\n ::Err: std::fmt::Debug,\n U: Deref;\n\n/// Reads file and returns it as a vector of its lines.\npub fn file_to_lines>(pathname: P) -> Vec;\n")),(0,r.kt)("p",null,"As for the vector, I went with a rather simple implementation that allows only\naddition of the vectors for now and accessing the elements via functions ",(0,r.kt)("inlineCode",{parentName:"p"},"x()"),"\nand ",(0,r.kt)("inlineCode",{parentName:"p"},"y()"),". Also the vector is generic, so we can use it with any numeric type we\nneed."),(0,r.kt)("h3",{id:"skeleton"},"Skeleton"),(0,r.kt)("p",null,"We can also prepare a template to quickly bootstrap each of the days. We know\nthat each puzzle has 2 parts, which means that we can start with 2 functions that\nwill solve them."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"fn part1(input: &Input) -> Output {\n todo!()\n}\n\nfn part2(input: &Input) -> Output {\n todo!()\n}\n")),(0,r.kt)("p",null,"Both functions take reference to the input and return some output (in majority\nof puzzles, it is the same type). ",(0,r.kt)("inlineCode",{parentName:"p"},"todo!()")," can be used as a nice placeholder,\nit also causes a panic when reached and we could also provide some string with\nan explanation, e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},'todo!("part 1")'),". We have not given functions a specific\ntype and to avoid as much copy-paste as possible, we will introduce type aliases."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"type Input = String;\ntype Output = i32;\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"This allows us to quickly adjust the types only in one place without the need to\ndo ",(0,r.kt)("em",{parentName:"p"},"regex-replace")," or replace them manually.")),(0,r.kt)("p",null,"For each day we get a personalized input that is provided as a text file. Almost\nall the time, we would like to get some structured type out of that input, and\ntherefore it makes sense to introduce a new function that will provide the parsing\nof the input."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"fn parse_input(path: &str) -> Input {\n todo!()\n}\n")),(0,r.kt)("p",null,"This \u201cparser\u201d will take a path to the file, just in case we would like to run the\nsample instead of input."),(0,r.kt)("p",null,"OK, so now we can write a ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," function that will take all of the pieces and\nrun them."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let input = parse_input("inputs/dayXX.txt");\n\n println!("Part 1: {}", part_1(&input));\n println!("Part 2: {}", part_2(&input));\n}\n')),(0,r.kt)("p",null,"This would definitely do :) But we have installed a few libraries and we want to\nuse them. In this part we are going to utilize ",(0,r.kt)("em",{parentName:"p"},(0,r.kt)("a",{parentName:"em",href:"https://crates.io/crates/tracing"},(0,r.kt)("inlineCode",{parentName:"a"},"tracing")))," (for tracing, duh\u2026)\nand ",(0,r.kt)("em",{parentName:"p"},(0,r.kt)("a",{parentName:"em",href:"https://crates.io/crates/color-eyre"},(0,r.kt)("inlineCode",{parentName:"a"},"color-eyre")))," (for better error reporting, e.g. from parsing)."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() -> Result<()> {\n tracing_subscriber::fmt()\n .with_env_filter(EnvFilter::from_default_env())\n .with_target(false)\n .with_file(true)\n .with_line_number(true)\n .without_time()\n .compact()\n .init();\n color_eyre::install()?;\n\n let input = parse_input("inputs/dayXX.txt");\n\n info!("Part 1: {}", part_1(&input));\n info!("Part 2: {}", part_2(&input));\n\n Ok(())\n}\n')),(0,r.kt)("p",null,"The first statement will set up tracing and configure it to print out the logs to\nterminal, based on the environment variable. We also change the formatting a bit,\nsince we do not need all the ",(0,r.kt)("em",{parentName:"p"},"fancy")," features of the logger. Pure initialization\nwould get us logs like this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"2022-12-11T19:53:19.975343Z INFO day01: Part 1: 0\n")),(0,r.kt)("p",null,"However after running that command, we will get the following:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"}," INFO src/bin/day01.rs:35: Part 1: 0\n")),(0,r.kt)("p",null,"And the ",(0,r.kt)("inlineCode",{parentName:"p"},"color_eyre::install()?")," is quite straightforward. We just initialize the\nerror reporting by ",(0,r.kt)("em",{parentName:"p"},"color eyre"),"."),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"Notice that we had to add ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(())")," to the end of the function and adjust the\nreturn type of the ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"Result<()>"),". It is caused by the ",(0,r.kt)("em",{parentName:"p"},"color eyre")," that\ncan be installed only once and therefore it can fail, that is how we got the ",(0,r.kt)("inlineCode",{parentName:"p"},"?"),"\nat the end of the ",(0,r.kt)("inlineCode",{parentName:"p"},"::install")," which ",(0,r.kt)("em",{parentName:"p"},"unwraps")," the ",(0,r.kt)("strong",{parentName:"p"},"\xbbresult\xab")," of the installation.")),(0,r.kt)("p",null,"Overall we will get to a template like this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'use aoc_2022::*;\n\nuse color_eyre::eyre::Result;\nuse tracing::info;\nuse tracing_subscriber::EnvFilter;\n\ntype Input = String;\ntype Output = i32;\n\nfn parse_input(path: &str) -> Input {\n todo!()\n}\n\nfn part1(input: &Input) -> Output {\n todo!()\n}\n\nfn part2(input: &Input) -> Output {\n todo!()\n}\n\nfn main() -> Result<()> {\n tracing_subscriber::fmt()\n .with_env_filter(EnvFilter::from_default_env())\n .with_target(false)\n .with_file(true)\n .with_line_number(true)\n .without_time()\n .compact()\n .init();\n color_eyre::install()?;\n\n let input = parse_input("inputs/dayXX.txt");\n\n info!("Part 1: {}", part_1(&input));\n info!("Part 2: {}", part_2(&input));\n\n Ok(())\n}\n')),(0,r.kt)("div",{className:"footnotes"},(0,r.kt)("hr",{parentName:"div"}),(0,r.kt)("ol",{parentName:"div"},(0,r.kt)("li",{parentName:"ol",id:"fn-1-793a30"},"Copy-pasting might be a relaxing thing to do, but you can also discover\nnasty stuff about your PC. See ",(0,r.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/adventofcode/comments/zb98pn/comment/iyq0ono"},"this Reddit post and the comment"),".",(0,r.kt)("a",{parentName:"li",href:"#fnref-1-793a30",className:"footnote-backref"},"\u21a9")),(0,r.kt)("li",{parentName:"ol",id:"fn-2-793a30"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/martinjonas"},"GitHub profile"),(0,r.kt)("a",{parentName:"li",href:"#fnref-2-793a30",className:"footnote-backref"},"\u21a9")),(0,r.kt)("li",{parentName:"ol",id:"fn-3-793a30"},"Even though you can use it even for libraries, but handling errors from\nlibraries using ",(0,r.kt)("inlineCode",{parentName:"li"},"anyhow")," is nasty\u2026 You will be the stinky one ;)",(0,r.kt)("a",{parentName:"li",href:"#fnref-3-793a30",className:"footnote-backref"},"\u21a9")))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/52bff962.6e8cadd8.js b/assets/js/52bff962.6e8cadd8.js new file mode 100644 index 0000000..de24b66 --- /dev/null +++ b/assets/js/52bff962.6e8cadd8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9710],{1193:a=>{a.exports=JSON.parse('[{"label":"python","permalink":"/ib002/tags/python","count":3},{"label":"testing","permalink":"/ib002/tags/testing","count":1},{"label":"postconditions","permalink":"/ib002/tags/postconditions","count":1},{"label":"sorting","permalink":"/ib002/tags/sorting","count":1},{"label":"graphs","permalink":"/ib002/tags/graphs","count":2},{"label":"bfs","permalink":"/ib002/tags/bfs","count":1},{"label":"csharp","permalink":"/ib002/tags/csharp","count":1},{"label":"iterators","permalink":"/ib002/tags/iterators","count":1},{"label":"iterative","permalink":"/ib002/tags/iterative","count":1},{"label":"balanced trees","permalink":"/ib002/tags/balanced-trees","count":2},{"label":"red-black trees","permalink":"/ib002/tags/red-black-trees","count":2},{"label":"applications","permalink":"/ib002/tags/applications","count":1},{"label":"karel","permalink":"/ib002/tags/karel","count":1},{"label":"recursion","permalink":"/ib002/tags/recursion","count":3},{"label":"backtracking","permalink":"/ib002/tags/backtracking","count":1},{"label":"java","permalink":"/ib002/tags/java","count":1},{"label":"exponential","permalink":"/ib002/tags/exponential","count":1},{"label":"greedy","permalink":"/ib002/tags/greedy","count":1},{"label":"dynamic-programming","permalink":"/ib002/tags/dynamic-programming","count":1},{"label":"top-down-dp","permalink":"/ib002/tags/top-down-dp","count":1},{"label":"bottom-up-dp","permalink":"/ib002/tags/bottom-up-dp","count":1},{"label":"c","permalink":"/ib002/tags/c","count":1},{"label":"dynamic array","permalink":"/ib002/tags/dynamic-array","count":1},{"label":"time complexity","permalink":"/ib002/tags/time-complexity","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/52f2a5bf.f6c9442b.js b/assets/js/52f2a5bf.f6c9442b.js new file mode 100644 index 0000000..ecc114b --- /dev/null +++ b/assets/js/52f2a5bf.f6c9442b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5430],{1387:a=>{a.exports=JSON.parse('{"label":"red-hat","permalink":"/blog/tags/red-hat","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/58dd4fbd.f45f89fa.js b/assets/js/58dd4fbd.f45f89fa.js new file mode 100644 index 0000000..6a1d36d --- /dev/null +++ b/assets/js/58dd4fbd.f45f89fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3340],{3047:e=>{e.exports=JSON.parse('{"label":"c","permalink":"/ib002/tags/c","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"time-complexity/extend","title":"Time complexity of \u2039extend\u203a","description":"How to make inefficient algorithm unknowingly.\\n","permalink":"/ib002/time-complexity/extend"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5af27364.400470ed.js b/assets/js/5af27364.400470ed.js new file mode 100644 index 0000000..ffca23a --- /dev/null +++ b/assets/js/5af27364.400470ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3502],{3162:e=>{e.exports=JSON.parse('{"label":"balanced trees","permalink":"/ib002/tags/balanced-trees","allTagsPath":"/ib002/tags","count":2,"items":[{"id":"rb-trees/rules","title":"On the rules of the red-black tree","description":"Shower thoughts on the rules of the red-black tree.\\n","permalink":"/ib002/rb-trees/rules"},{"id":"rb-trees/applications","title":"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f","description":"Uk\xe1zka pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f v standardn\xedch kni\u017enic\xedch zn\xe1m\xfdch jazyk\u016f.\\n","permalink":"/ib002/rb-trees/applications"}]}')}}]); \ No newline at end of file diff --git a/assets/js/6048.83823b1f.js b/assets/js/6048.83823b1f.js new file mode 100644 index 0000000..3dcb0ab --- /dev/null +++ b/assets/js/6048.83823b1f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6048],{9058:(e,t,a)=>{a.d(t,{Z:()=>h});var l=a(7294),r=a(6010),n=a(7452),o=a(7524),s=a(9960),i=a(5999);const m={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function c(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,r.Z)(m.sidebar,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,r.Z)(m.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,r.Z)(m.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:m.sidebarItem},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:m.sidebarItemLink,activeClassName:m.sidebarItemLinkActive},e.title)))))))}var u=a(3102);function d(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function g(e){return l.createElement(u.Zo,{component:d,props:e})}function p(e){let{sidebar:t}=e;const a=(0,o.i)();return t?.items.length?"mobile"===a?l.createElement(g,{sidebar:t}):l.createElement(c,{sidebar:t}):null}function h(e){const{sidebar:t,toc:a,children:o,...s}=e,i=t&&t.items.length>0;return l.createElement(n.Z,s,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(p,{sidebar:t}),l.createElement("main",{className:(0,r.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"http://schema.org/Blog"},o),a&&l.createElement("div",{className:"col col--2"},a))))}},390:(e,t,a)=>{a.d(t,{Z:()=>A});var l=a(7294),r=a(6010),n=a(9460),o=a(4996);function s(e){let{children:t,className:a}=e;const{frontMatter:r,assets:s}=(0,n.C)(),{withBaseUrl:i}=(0,o.C)(),m=s.image??r.image;return l.createElement("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},m&&l.createElement("meta",{itemProp:"image",content:i(m,{absolute:!0})}),t)}var i=a(9960);const m={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:o}=(0,n.C)(),{permalink:s,title:c}=a,u=o?"h1":"h2";return l.createElement(u,{className:(0,r.Z)(m.title,t),itemProp:"headline"},o?c:l.createElement(i.Z,{itemProp:"url",to:s},c))}var u=a(5999),d=a(8824);const g={container:"container_mt6G"};function p(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.c)();return t=>{const a=Math.ceil(t);return e(a,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". 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 min read|{readingTime} min read"},{readingTime:a}))}}();return l.createElement(l.Fragment,null,a(t))}function h(e){let{date:t,formattedDate:a}=e;return l.createElement("time",{dateTime:t,itemProp:"datePublished"},a)}function E(){return l.createElement(l.Fragment,null," \xb7 ")}function b(e){let{className:t}=e;const{metadata:a}=(0,n.C)(),{date:o,formattedDate:s,readingTime:i}=a;return l.createElement("div",{className:(0,r.Z)(g.container,"margin-vert--md",t)},l.createElement(h,{date:o,formattedDate:s}),void 0!==i&&l.createElement(l.Fragment,null,l.createElement(E,null),l.createElement(p,{readingTime:i})))}function f(e){return e.href?l.createElement(i.Z,e):l.createElement(l.Fragment,null,e.children)}function v(e){let{author:t,className:a}=e;const{name:n,title:o,url:s,imageURL:i,email:m}=t,c=s||m&&`mailto:${m}`||void 0;return l.createElement("div",{className:(0,r.Z)("avatar margin-bottom--sm",a)},i&&l.createElement(f,{href:c,className:"avatar__photo-link"},l.createElement("img",{className:"avatar__photo",src:i,alt:n})),n&&l.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},l.createElement("div",{className:"avatar__name"},l.createElement(f,{href:c,itemProp:"url"},l.createElement("span",{itemProp:"name"},n))),o&&l.createElement("small",{className:"avatar__subtitle",itemProp:"description"},o)))}const P={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function N(e){let{className:t}=e;const{metadata:{authors:a},assets:o}=(0,n.C)();if(0===a.length)return null;const s=a.every((e=>{let{name:t}=e;return!t}));return l.createElement("div",{className:(0,r.Z)("margin-top--md margin-bottom--sm",s?P.imageOnlyAuthorRow:"row",t)},a.map(((e,t)=>l.createElement("div",{className:(0,r.Z)(!s&&"col col--6",s?P.imageOnlyAuthorCol:P.authorCol),key:t},l.createElement(v,{author:{...e,imageURL:o.authorsImageUrls[t]??e.imageURL}})))))}function _(){return l.createElement("header",null,l.createElement(c,null),l.createElement(b,null),l.createElement(N,null))}var Z=a(8780),k=a(1098);function I(e){let{children:t,className:a}=e;const{isBlogPostPage:o}=(0,n.C)();return l.createElement("div",{id:o?Z.blogPostContainerID:void 0,className:(0,r.Z)("markdown",a),itemProp:"articleBody"},l.createElement(k.Z,null,t))}var C=a(4881),w=a(1526),T=a(7462);function y(){return l.createElement("b",null,l.createElement(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))}function F(e){const{blogPostTitle:t,...a}=e;return l.createElement(i.Z,(0,T.Z)({"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t})},a),l.createElement(y,null))}const L={blogPostFooterDetailsFull:"blogPostFooterDetailsFull_mRVl"};function B(){const{metadata:e,isBlogPostPage:t}=(0,n.C)(),{tags:a,title:o,editUrl:s,hasTruncateMarker:i}=e,m=!t&&i,c=a.length>0;return c||m||s?l.createElement("footer",{className:(0,r.Z)("row docusaurus-mt-lg",t&&L.blogPostFooterDetailsFull)},c&&l.createElement("div",{className:(0,r.Z)("col",{"col--9":m})},l.createElement(w.Z,{tags:a})),t&&s&&l.createElement("div",{className:"col margin-top--sm"},l.createElement(C.Z,{editUrl:s})),m&&l.createElement("div",{className:(0,r.Z)("col text--right",{"col--3":c})},l.createElement(F,{blogPostTitle:o,to:e.permalink}))):null}function A(e){let{children:t,className:a}=e;const o=function(){const{isBlogPostPage:e}=(0,n.C)();return e?void 0:"margin-bottom--xl"}();return l.createElement(s,{className:(0,r.Z)(o,a)},l.createElement(_,null),l.createElement(I,null,t),l.createElement(B,null))}},9460:(e,t,a)=>{a.d(t,{C:()=>s,n:()=>o});var l=a(7294),r=a(902);const n=l.createContext(null);function o(e){let{children:t,content:a,isBlogPostPage:r=!1}=e;const o=function(e){let{content:t,isBlogPostPage:a}=e;return(0,l.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:r});return l.createElement(n.Provider,{value:o},t)}function s(){const e=(0,l.useContext)(n);if(null===e)throw new r.i6("BlogPostProvider");return e}},8824:(e,t,a)=>{a.d(t,{c:()=>m});var l=a(7294),r=a(2263);const n=["zero","one","two","few","many","other"];function o(e){return n.filter((t=>e.includes(t)))}const s={locale:"en",pluralForms:o(["one","other"]),select:e=>1===e?"one":"other"};function i(){const{i18n:{currentLocale:e}}=(0,r.Z)();return(0,l.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:o(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`),s}}),[e])}function m(){const e=i();return{selectMessage:(t,a)=>function(e,t,a){const l=e.split("|");if(1===l.length)return l[0];l.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${l.length}: ${e}`);const r=a.select(t),n=a.pluralForms.indexOf(r);return l[Math.min(n,l.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/62d847b3.06e10519.js b/assets/js/62d847b3.06e10519.js new file mode 100644 index 0000000..e8788ce --- /dev/null +++ b/assets/js/62d847b3.06e10519.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8520],{1901:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/advent-of-code-2022","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/6316.0ca4149a.js b/assets/js/6316.0ca4149a.js new file mode 100644 index 0000000..4a65df6 --- /dev/null +++ b/assets/js/6316.0ca4149a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6316],{6316:(t,e,n)=>{n.d(e,{diagram:()=>A});var i=n(6432),s=n(9373),r=n(1619),a=n(5920),o=n(7201),c=(n(7484),n(7967),n(7856),n(277),n(5625),n(9354),n(1518),n(9542),n(285),n(8734),function(){var t=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},e=[1,2],n=[1,5],i=[6,9,11,17,18,20,22,23,26,27,28],s=[1,15],r=[1,16],a=[1,17],o=[1,18],c=[1,19],l=[1,23],h=[1,24],d=[1,27],u=[4,6,9,11,17,18,20,22,23,26,27,28],p={trace:function(){},yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,title:17,acc_title:18,acc_title_value:19,acc_descr:20,acc_descr_value:21,acc_descr_multiline_value:22,section:23,period_statement:24,event_statement:25,period:26,event:27,open_directive:28,type_directive:29,arg_directive:30,close_directive:31,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"acc_title",19:"acc_title_value",20:"acc_descr",21:"acc_descr_value",22:"acc_descr_multiline_value",23:"section",26:"period",27:"event",28:"open_directive",29:"type_directive",30:"arg_directive",31:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,2],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[24,1],[25,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,s,r,a){var o=r.length-1;switch(s){case 1:return r[o-1];case 3:case 7:case 8:this.$=[];break;case 4:r[o-1].push(r[o]),this.$=r[o-1];break;case 5:case 6:this.$=r[o];break;case 11:i.getCommonDb().setDiagramTitle(r[o].substr(6)),this.$=r[o].substr(6);break;case 12:this.$=r[o].trim(),i.getCommonDb().setAccTitle(this.$);break;case 13:case 14:this.$=r[o].trim(),i.getCommonDb().setAccDescription(this.$);break;case 15:i.addSection(r[o].substr(8)),this.$=r[o].substr(8);break;case 19:i.addTask(r[o],0,""),this.$=r[o];break;case 20:i.addEvent(r[o].substr(2)),this.$=r[o];break;case 21:i.parseDirective("%%{","open_directive");break;case 22:i.parseDirective(r[o],"type_directive");break;case 23:r[o]=r[o].trim().replace(/'/g,'"'),i.parseDirective(r[o],"arg_directive");break;case 24:i.parseDirective("}%%","close_directive","timeline")}},table:[{3:1,4:e,7:3,12:4,28:n},{1:[3]},t(i,[2,3],{5:6}),{3:7,4:e,7:3,12:4,28:n},{13:8,29:[1,9]},{29:[2,21]},{6:[1,10],7:22,8:11,9:[1,12],10:13,11:[1,14],12:4,17:s,18:r,20:a,22:o,23:c,24:20,25:21,26:l,27:h,28:n},{1:[2,2]},{14:25,15:[1,26],31:d},t([15,31],[2,22]),t(i,[2,8],{1:[2,1]}),t(i,[2,4]),{7:22,10:28,12:4,17:s,18:r,20:a,22:o,23:c,24:20,25:21,26:l,27:h,28:n},t(i,[2,6]),t(i,[2,7]),t(i,[2,11]),{19:[1,29]},{21:[1,30]},t(i,[2,14]),t(i,[2,15]),t(i,[2,16]),t(i,[2,17]),t(i,[2,18]),t(i,[2,19]),t(i,[2,20]),{11:[1,31]},{16:32,30:[1,33]},{11:[2,24]},t(i,[2,5]),t(i,[2,12]),t(i,[2,13]),t(u,[2,9]),{14:34,31:d},{31:[2,23]},{11:[1,35]},t(u,[2,10])],defaultActions:{5:[2,21],7:[2,2],27:[2,24],33:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],s=[null],r=[],a=this.table,o="",c=0,l=0,h=r.slice.call(arguments,1),d=Object.create(this.lexer),u={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(u.yy[p]=this.yy[p]);d.setInput(t,u.yy),u.yy.lexer=d,u.yy.parser=this,void 0===d.yylloc&&(d.yylloc={});var y=d.yylloc;r.push(y);var g=d.options&&d.options.ranges;"function"==typeof u.yy.parseError?this.parseError=u.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var f,m,_,b,k,x,v,S,w,$={};;){if(m=n[n.length-1],this.defaultActions[m]?_=this.defaultActions[m]:(null==f&&(w=void 0,"number"!=typeof(w=i.pop()||d.lex()||1)&&(w instanceof Array&&(w=(i=w).pop()),w=e.symbols_[w]||w),f=w),_=a[m]&&a[m][f]),void 0===_||!_.length||!_[0]){var E="";for(k in S=[],a[m])this.terminals_[k]&&k>2&&S.push("'"+this.terminals_[k]+"'");E=d.showPosition?"Parse error on line "+(c+1)+":\n"+d.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[f]||f)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==f?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(E,{text:d.match,token:this.terminals_[f]||f,line:d.yylineno,loc:y,expected:S})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+m+", token: "+f);switch(_[0]){case 1:n.push(f),s.push(d.yytext),r.push(d.yylloc),n.push(_[1]),f=null,l=d.yyleng,o=d.yytext,c=d.yylineno,y=d.yylloc;break;case 2:if(x=this.productions_[_[1]][1],$.$=s[s.length-x],$._$={first_line:r[r.length-(x||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(x||1)].first_column,last_column:r[r.length-1].last_column},g&&($._$.range=[r[r.length-(x||1)].range[0],r[r.length-1].range[1]]),void 0!==(b=this.performAction.apply($,[o,l,c,u.yy,_[1],s,r].concat(h))))return b;x&&(n=n.slice(0,-1*x*2),s=s.slice(0,-1*x),r=r.slice(0,-1*x)),n.push(this.productions_[_[1]][0]),s.push($.$),r.push($._$),v=a[n[n.length-2]][n[n.length-1]],n.push(v);break;case 3:return!0}}return!0}},y={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;re[0].length)){if(e=n,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,s[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),28;case 1:return this.begin("type_directive"),29;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),31;case 4:return 30;case 5:case 6:case 8:case 9:break;case 7:return 11;case 10:return 4;case 11:return 17;case 12:return this.begin("acc_title"),18;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),20;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:return 23;case 20:return 27;case 21:return 26;case 22:return 6;case 23:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?::\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,14,16,19,20,21,22,23],inclusive:!0}}};function g(){this.yy={}}return p.lexer=y,g.prototype=p,p.Parser=g,new g}());c.parser=c;const l=c;let h="",d=0;const u=[],p=[],y=[],g=()=>i.j,f=(t,e,n)=>{(0,i.k)(globalThis,t,e,n)},m=function(){u.length=0,p.length=0,h="",y.length=0,(0,i.m)()},_=function(t){h=t,u.push(t)},b=function(){return u},k=function(){let t=w();let e=0;for(;!t&&e<100;)t=w(),e++;return p.push(...y),p},x=function(t,e,n){const i={id:d++,section:h,type:h,task:t,score:e||0,events:n?[n]:[]};y.push(i)},v=function(t){y.find((t=>t.id===d-1)).events.push(t)},S=function(t){const e={section:h,type:h,description:t,task:t,classes:[]};p.push(e)},w=function(){let t=!0;for(const[e,n]of y.entries())y[e].processed,t=t&&n.processed;return t},$={clear:m,getCommonDb:g,addSection:_,getSections:b,getTasks:k,addTask:x,addTaskOrg:S,addEvent:v,parseDirective:f},E=Object.freeze(Object.defineProperty({__proto__:null,addEvent:v,addSection:_,addTask:x,addTaskOrg:S,clear:m,default:$,getCommonDb:g,getSections:b,getTasks:k,parseDirective:f},Symbol.toStringTag,{value:"Module"}));!function(){function t(t,e,n,s,r,a,o,c){i(e.append("text").attr("x",n+r/2).attr("y",s+a/2+5).style("font-color",c).style("text-anchor","middle").text(t),o)}function e(t,e,n,s,r,a,o,c,l){const{taskFontSize:h,taskFontFamily:d}=c,u=t.split(//gi);for(let p=0;p)/).reverse(),r=[],a=n.attr("y"),o=parseFloat(n.attr("dy")),c=n.text(null).append("tspan").attr("x",0).attr("y",a).attr("dy",o+"em");for(let s=0;se||"
"===t)&&(r.pop(),c.text(r.join(" ").trim()),r="
"===t?[""]:[t],c=n.append("tspan").attr("x",0).attr("y",a).attr("dy","1.1em").text(t))}))}const T=function(t,e,n){t.append("path").attr("id","node-"+e.id).attr("class","node-bkg node-"+e.type).attr("d",`M0 ${e.height-5} v${10-e.height} q0,-5 5,-5 h${e.width-10} q5,0 5,5 v${e.height-5} H0 Z`),t.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",e.height).attr("x2",e.width).attr("y2",e.height)},D=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",5).attr("refY",2).attr("markerWidth",6).attr("markerHeight",4).attr("orient","auto").append("path").attr("d","M 0,0 V 4 L6,2 Z")},L=function(t,e,n,i){const s=n%12-1,r=t.append("g");e.section=s,r.attr("class",(e.class?e.class+" ":"")+"timeline-node section-"+s);const a=r.append("g"),o=r.append("g"),c=o.append("text").text(e.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(I,e.width).node().getBBox(),l=i.fontSize&&i.fontSize.replace?i.fontSize.replace("px",""):i.fontSize;return e.height=c.height+1.1*l*.5+e.padding,e.height=Math.max(e.height,e.maxHeight),e.width=e.width+2*e.padding,o.attr("transform","translate("+e.width/2+", "+e.padding/2+")"),T(a,e,s),e},C=function(t,e,n){const i=t.append("g"),s=i.append("text").text(e.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(I,e.width).node().getBBox(),r=n.fontSize&&n.fontSize.replace?n.fontSize.replace("px",""):n.fontSize;return i.remove(),s.height+1.1*r*.5+e.padding},M=function(t,e,n,s,r,a,o,c,l,h,d){for(const u of e){const e={descr:u.task,section:n,number:n,width:150,padding:20,maxHeight:a};i.l.debug("taskNode",e);const c=t.append("g").attr("class","taskWrapper"),p=L(c,e,n,o).height;if(i.l.debug("taskHeight after draw",p),c.attr("transform",`translate(${s}, ${r})`),a=Math.max(a,p),u.events){const e=t.append("g").attr("class","lineWrapper");let i=a;r+=100,i+=O(t,u.events,n,s,r,o),r-=100,e.append("line").attr("x1",s+95).attr("y1",r+a).attr("x2",s+95).attr("y2",r+a+(d?a:h)+l+120).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}s+=200,d&&!(0,i.g)().timeline.disableMulticolor&&n++}r-=10},O=function(t,e,n,s,r,a){let o=0;const c=r;r+=100;for(const l of e){const e={descr:l,section:n,number:n,width:150,padding:20,maxHeight:50};i.l.debug("eventNode",e);const c=t.append("g").attr("class","eventWrapper"),h=L(c,e,n,a).height;o+=h,c.attr("transform",`translate(${s}, ${r})`),r=r+10+h}return r=c,o},A={db:E,renderer:{setConf:function(t){Object.keys(t).forEach((function(e){conf[e]=t[e]}))},draw:function(t,e,n,r){const a=(0,i.g)(),o=a.leftMargin?a.leftMargin:50;r.db.clear(),r.parser.parse(t+"\n"),i.l.debug("timeline",r.db);const c=a.securityLevel;let l;"sandbox"===c&&(l=(0,s.Ys)("#i"+e));const h=("sandbox"===c?(0,s.Ys)(l.nodes()[0].contentDocument.body):(0,s.Ys)("body")).select("#"+e);h.append("g");const d=r.db.getTasks(),u=r.db.getCommonDb().getDiagramTitle();i.l.debug("task",d),D(h);const p=r.db.getSections();i.l.debug("sections",p);let y=0,g=0,f=0,m=0,_=50+o,b=50;m=50;let k=0,x=!0;p.forEach((function(t){const e=C(h,{number:k,descr:t,section:k,width:150,padding:20,maxHeight:y},a);i.l.debug("sectionHeight before draw",e),y=Math.max(y,e+20)}));let v=0,S=0;i.l.debug("tasks.length",d.length);for(const[s,$]of d.entries()){const t={number:s,descr:$,section:$.section,width:150,padding:20,maxHeight:g},e=C(h,t,a);i.l.debug("taskHeight before draw",e),g=Math.max(g,e+20),v=Math.max(v,$.events.length);let n=0;for(let i=0;i<$.events.length;i++){const t={descr:$.events[i],section:$.section,number:$.section,width:150,padding:20,maxHeight:50};n+=C(h,t,a)}S=Math.max(S,n)}i.l.debug("maxSectionHeight before draw",y),i.l.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach((t=>{const e={number:k,descr:t,section:k,width:150,padding:20,maxHeight:y};i.l.debug("sectionNode",e);const n=h.append("g"),s=L(n,e,k,a);i.l.debug("sectionNode output",s),n.attr("transform",`translate(${_}, 50)`),b+=y+50;const r=d.filter((e=>e.section===t));r.length>0&&M(h,r,k,_,b,g,a,v,S,y,!1),_+=200*Math.max(r.length,1),b=50,k++})):(x=!1,M(h,d,k,_,b,g,a,v,S,y,!0));const w=h.node().getBBox();i.l.debug("bounds",w),u&&h.append("text").text(u).attr("x",w.width/2-o).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),f=x?y+g+150:g+100;h.append("g").attr("class","lineWrapper").append("line").attr("x1",o).attr("y1",f).attr("x2",w.width+3*o).attr("y2",f).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),(0,i.s)(void 0,h,a.timeline.padding?a.timeline.padding:50,!!a.timeline.useMaxWidth&&a.timeline.useMaxWidth)}},parser:l,styles:t=>`\n .edge {\n stroke-width: 3;\n }\n ${(t=>{let e="";for(let n=0;n{n.d(e,{Z:()=>o});var i=n(1691),s=n(1610);const r=t=>{const{r:e,g:n,b:r}=s.Z.parse(t),a=.2126*i.Z.channel.toLinear(e)+.7152*i.Z.channel.toLinear(n)+.0722*i.Z.channel.toLinear(r);return i.Z.lang.round(a)},a=t=>r(t)>=.5,o=t=>!a(t)}}]); \ No newline at end of file diff --git a/assets/js/66d5ef6c.fc107ca5.js b/assets/js/66d5ef6c.fc107ca5.js new file mode 100644 index 0000000..0d311cb --- /dev/null +++ b/assets/js/66d5ef6c.fc107ca5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9228],{4087:l=>{l.exports=JSON.parse('[{"label":"\ud83c\udfed","permalink":"/blog/tags/\ud83c\udfed","count":1},{"label":"red-hat","permalink":"/blog/tags/red-hat","count":1},{"label":"copr","permalink":"/blog/tags/copr","count":1},{"label":"admin","permalink":"/blog/tags/admin","count":1},{"label":"vps","permalink":"/blog/tags/vps","count":1},{"label":"advent-of-code","permalink":"/blog/tags/advent-of-code","count":5},{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022","count":5},{"label":"rust","permalink":"/blog/tags/rust","count":5},{"label":"cpp","permalink":"/blog/tags/cpp","count":1},{"label":"leetcode","permalink":"/blog/tags/leetcode","count":1},{"label":"iterators","permalink":"/blog/tags/iterators","count":1}]')}}]); \ No newline at end of file diff --git a/assets/js/6875c492.2d487359.js b/assets/js/6875c492.2d487359.js new file mode 100644 index 0000000..98d89c7 --- /dev/null +++ b/assets/js/6875c492.2d487359.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8610],{9703:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7294),l=a(5999),r=a(2244);function s(e){const{metadata:t}=e,{previousPage:a,nextPage:s}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),s&&n.createElement(r.Z,{permalink:s,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7294),l=a(9460),r=a(390);function s(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},1714:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var n=a(7294),l=a(6010),r=a(5999),s=a(8824),o=a(833),i=a(5281),g=a(9960),c=a(9058),m=a(9703),p=a(197),u=a(9985);function d(e){const t=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,r.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". 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 post|{count} posts"},{count:t}))}();return(0,r.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function h(e){let{tag:t}=e;const a=d(t);return n.createElement(n.Fragment,null,n.createElement(o.d,{title:a}),n.createElement(p.Z,{tag:"blog_tags_posts"}))}function b(e){let{tag:t,items:a,sidebar:l,listMetadata:s}=e;const o=d(t);return n.createElement(c.Z,{sidebar:l},n.createElement("header",{className:"margin-bottom--xl"},n.createElement("h1",null,o),n.createElement(g.Z,{href:t.allTagsPath},n.createElement(r.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),n.createElement(u.Z,{items:a}),n.createElement(m.Z,{metadata:s}))}function E(e){return n.createElement(o.FG,{className:(0,l.Z)(i.k.wrapper.blogPages,i.k.page.blogTagPostListPage)},n.createElement(h,e),n.createElement(b,e))}}}]); \ No newline at end of file diff --git a/assets/js/6945.04a6ca6a.js b/assets/js/6945.04a6ca6a.js new file mode 100644 index 0000000..b40e21c --- /dev/null +++ b/assets/js/6945.04a6ca6a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6945],{6945:(e,s,f)=>{f.r(s)}}]); \ No newline at end of file diff --git a/assets/js/713b7838.e5a05e06.js b/assets/js/713b7838.e5a05e06.js new file mode 100644 index 0000000..d3793b0 --- /dev/null +++ b/assets/js/713b7838.e5a05e06.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2167],{3905:(t,e,n)=>{n.d(e,{Zo:()=>s,kt:()=>h});var a=n(7294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,a)}return n}function l(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var p=a.createContext({}),m=function(t){var e=a.useContext(p),n=e;return t&&(n="function"==typeof t?t(e):l(l({},e),t)),n},s=function(t){var e=m(t.components);return a.createElement(p.Provider,{value:e},t.children)},d="mdxType",k={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},u=a.forwardRef((function(t,e){var n=t.components,r=t.mdxType,i=t.originalType,p=t.parentName,s=o(t,["components","mdxType","originalType","parentName"]),d=m(n),u=r,h=d["".concat(p,".").concat(u)]||d[u]||k[u]||i;return n?a.createElement(h,l(l({ref:e},s),{},{components:n})):a.createElement(h,l({ref:e},s))}));function h(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var i=n.length,l=new Array(i);l[0]=u;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=t,o[d]="string"==typeof t?t:r,l[1]=o;for(var m=2;m{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>k,frontMatter:()=>i,metadata:()=>o,toc:()=>m});var a=n(7462),r=(n(7294),n(3905));const i={id:"seminar-04",title:"4th seminar",description:"Robot in a maze.\n",last_update:{date:new Date("2023-03-13T00:00:00.000Z")}},l=void 0,o={unversionedId:"bonuses/seminar-04",id:"bonuses/seminar-04",title:"4th seminar",description:"Robot in a maze.\n",source:"@site/pb071/bonuses/04.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-04",permalink:"/pb071/bonuses/seminar-04",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/bonuses/04.md",tags:[],version:"current",lastUpdatedAt:1678665600,formattedLastUpdatedAt:"Mar 13, 2023",frontMatter:{id:"seminar-04",title:"4th seminar",description:"Robot in a maze.\n",last_update:{date:"2023-03-13T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"3rd seminar",permalink:"/pb071/bonuses/seminar-03"},next:{title:"5th and 6th seminar",permalink:"/pb071/bonuses/seminar-05-06"}},p={},m=[{value:"Introduction",id:"introduction",level:2},{value:"Hard requirement",id:"hard-requirement",level:2},{value:"Example of run",id:"example-of-run",level:2},{value:"Bonus part",id:"bonus-part",level:2},{value:"Easter eggs",id:"easter-eggs",level:2},{value:"Submitting",id:"submitting",level:2}],s={toc:m},d="wrapper";function k(t){let{components:e,...n}=t;return(0,r.kt)(d,(0,a.Z)({},s,n,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"Deadline for the submission of the bonus is ",(0,r.kt)("strong",{parentName:"p"},"March 23th 24:00"),".")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"In case you have any questions, feel free to reach out either by email, Discord\nor just by submitting an issue ",(0,r.kt)("a",{parentName:"p",href:"https://gitlab.fi.muni.cz/xfocko/kb/-/issues/new"},"here"),".")),(0,r.kt)("p",null,"For this bonus you can get 3 K\u20a1 and another 0.5 K\u20a1 for the bonus part of it."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"pathname:///files/pb071/bonuses/04.tar.gz"},"Source")),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"In this task you are given a 2D map for a robot. The map contains multiple markers:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"^v<>")," - which denote the directions the robot will be facing when he steps into\nthe cell or starts on it."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"K")," - denotes the key."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"T")," - denotes the treasure.")),(0,r.kt)("p",null,"In case robot lands at the beginning on unknown field, e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},".")," in the tests, he\nfaces the direction that is given through the parameter."),(0,r.kt)("p",null,"Your task is to write the ",(0,r.kt)("inlineCode",{parentName:"p"},"walk")," function that returns end result of the walk.\nWalk can end in multiple ways:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"FOUND_TREASURE")," - when you find the treasure"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"FOUND_KEY")," - when you find the key"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"OUT_OF_BOUNDS")," - when the robot falls off the map"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"INFINITE_LOOP")," - in case you will implement the bonus"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"NONE")," - which is used right now as a default return in the skeleton, has no meaning\nlater on")),(0,r.kt)("h2",{id:"hard-requirement"},"Hard requirement"),(0,r.kt)("p",null,"There is only one hard requirement that tests cannot check."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"You are not allowed to use any indexing related to map or your current position"),"\n",(0,r.kt)("strong",{parentName:"p"},"in your implementation.")),(0,r.kt)("p",null,"Reason for this requirement is for you to get used to working with pointers. And\nfor the implementation of this task it is much easier to use just the pointers."),(0,r.kt)("h2",{id:"example-of-run"},"Example of run"),(0,r.kt)("p",null,"For a better understanding of your task, I will describe a simple walk with corresponding\nfunction call."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-c"},'const char *map = (\n ">.v"\n ".K<"\n "..."\n);\n\nwalk(map, &map[6], \'^\', 3, 3);\n')),(0,r.kt)("p",null,"For this call, you should return ",(0,r.kt)("inlineCode",{parentName:"p"},"FOUND_KEY"),". Let us walk through the walk ;)"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Robot is placed at the bottom left corner, there is no direction specified, so\nhe follows the direction given by parameter (upwards, denoted as ",(0,r.kt)("inlineCode",{parentName:"p"},"N"),"(orth),\nso that we can differentiate markers on the map with the robot when using printing\nfunction)."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},">.v\n.K<\nN..\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Moves up:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},">.v\nNK<\n...\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Moves up (now covers ",(0,r.kt)("inlineCode",{parentName:"p"},">"),"), changes direction to right:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"E.v\n.K<\n...\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Moves to right:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},">Ev\n.K<\n...\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Moves to right, faces south:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},">.S\n.K<\n...\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Moves down, faces west:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},">.v\n.KW\n...\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Moves left, founds key, returns ",(0,r.kt)("inlineCode",{parentName:"p"},"FOUND_KEY"),":"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},">.v\n.W<\n...\n")))),(0,r.kt)("h2",{id:"bonus-part"},"Bonus part"),(0,r.kt)("p",null,"For the bonus part you are supposed to return ",(0,r.kt)("inlineCode",{parentName:"p"},"INFINITE_LOOP")," in case the robot\nis stuck in the infinite loop. There are three tests for it. If you pass only the\neasy and medium one, you can get 0.25 K\u20a1 for doing your best and trying it out. :)"),(0,r.kt)("h2",{id:"easter-eggs"},"Easter eggs"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Statistics"),(0,r.kt)("table",{parentName:"li"},(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Language"),(0,r.kt)("th",{parentName:"tr",align:"right"},"Files"),(0,r.kt)("th",{parentName:"tr",align:"right"},"Lines"),(0,r.kt)("th",{parentName:"tr",align:"right"},"Blanks"),(0,r.kt)("th",{parentName:"tr",align:"right"},"Comments"),(0,r.kt)("th",{parentName:"tr",align:"right"},"Code"),(0,r.kt)("th",{parentName:"tr",align:"right"},"Complexity"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"C")),(0,r.kt)("td",{parentName:"tr",align:"right"},"4"),(0,r.kt)("td",{parentName:"tr",align:"right"},"458"),(0,r.kt)("td",{parentName:"tr",align:"right"},"34"),(0,r.kt)("td",{parentName:"tr",align:"right"},"58"),(0,r.kt)("td",{parentName:"tr",align:"right"},"366"),(0,r.kt)("td",{parentName:"tr",align:"right"},"33")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"test_maze.c")),(0,r.kt)("td",{parentName:"tr",align:"right"}),(0,r.kt)("td",{parentName:"tr",align:"right"},"225"),(0,r.kt)("td",{parentName:"tr",align:"right"},"9"),(0,r.kt)("td",{parentName:"tr",align:"right"},"0"),(0,r.kt)("td",{parentName:"tr",align:"right"},"216"),(0,r.kt)("td",{parentName:"tr",align:"right"},"4")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"sol.maze.c")),(0,r.kt)("td",{parentName:"tr",align:"right"}),(0,r.kt)("td",{parentName:"tr",align:"right"},"141"),(0,r.kt)("td",{parentName:"tr",align:"right"},"15"),(0,r.kt)("td",{parentName:"tr",align:"right"},"28"),(0,r.kt)("td",{parentName:"tr",align:"right"},"98"),(0,r.kt)("td",{parentName:"tr",align:"right"},"24")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"maze.c")),(0,r.kt)("td",{parentName:"tr",align:"right"}),(0,r.kt)("td",{parentName:"tr",align:"right"},"84"),(0,r.kt)("td",{parentName:"tr",align:"right"},"8"),(0,r.kt)("td",{parentName:"tr",align:"right"},"30"),(0,r.kt)("td",{parentName:"tr",align:"right"},"46"),(0,r.kt)("td",{parentName:"tr",align:"right"},"5")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"main.c")),(0,r.kt)("td",{parentName:"tr",align:"right"}),(0,r.kt)("td",{parentName:"tr",align:"right"},"8"),(0,r.kt)("td",{parentName:"tr",align:"right"},"2"),(0,r.kt)("td",{parentName:"tr",align:"right"},"0"),(0,r.kt)("td",{parentName:"tr",align:"right"},"6"),(0,r.kt)("td",{parentName:"tr",align:"right"},"0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"C Header")),(0,r.kt)("td",{parentName:"tr",align:"right"},"1"),(0,r.kt)("td",{parentName:"tr",align:"right"},"33"),(0,r.kt)("td",{parentName:"tr",align:"right"},"3"),(0,r.kt)("td",{parentName:"tr",align:"right"},"19"),(0,r.kt)("td",{parentName:"tr",align:"right"},"11"),(0,r.kt)("td",{parentName:"tr",align:"right"},"0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"maze.h")),(0,r.kt)("td",{parentName:"tr",align:"right"}),(0,r.kt)("td",{parentName:"tr",align:"right"},"33"),(0,r.kt)("td",{parentName:"tr",align:"right"},"3"),(0,r.kt)("td",{parentName:"tr",align:"right"},"19"),(0,r.kt)("td",{parentName:"tr",align:"right"},"11"),(0,r.kt)("td",{parentName:"tr",align:"right"},"0")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"CMake")),(0,r.kt)("td",{parentName:"tr",align:"right"},"1"),(0,r.kt)("td",{parentName:"tr",align:"right"},"25"),(0,r.kt)("td",{parentName:"tr",align:"right"},"4"),(0,r.kt)("td",{parentName:"tr",align:"right"},"6"),(0,r.kt)("td",{parentName:"tr",align:"right"},"15"),(0,r.kt)("td",{parentName:"tr",align:"right"},"2")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"CMakeLists.txt")),(0,r.kt)("td",{parentName:"tr",align:"right"}),(0,r.kt)("td",{parentName:"tr",align:"right"},"25"),(0,r.kt)("td",{parentName:"tr",align:"right"},"4"),(0,r.kt)("td",{parentName:"tr",align:"right"},"6"),(0,r.kt)("td",{parentName:"tr",align:"right"},"15"),(0,r.kt)("td",{parentName:"tr",align:"right"},"2")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"td"},"Total")),(0,r.kt)("td",{parentName:"tr",align:"right"},"6"),(0,r.kt)("td",{parentName:"tr",align:"right"},"516"),(0,r.kt)("td",{parentName:"tr",align:"right"},"41"),(0,r.kt)("td",{parentName:"tr",align:"right"},"83"),(0,r.kt)("td",{parentName:"tr",align:"right"},"392"),(0,r.kt)("td",{parentName:"tr",align:"right"},"35"))))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Majority of the line count in solution is caused by the formatting :)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Included headers can be interpreted as hints, same goes for the unimplemented\n",(0,r.kt)("inlineCode",{parentName:"p"},"static")," functions which you can use, but ",(0,r.kt)("strong",{parentName:"p"},"are not required"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Given ",(0,r.kt)("inlineCode",{parentName:"p"},"CMakeLists.txt")," will generate 2 binaries, ",(0,r.kt)("inlineCode",{parentName:"p"},"test_maze")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"maze"),"."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"test_maze")," runs the tests you are given."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"maze")," runs the ",(0,r.kt)("inlineCode",{parentName:"li"},"main.c"),", where you can debug, print mazes and whatever else\nyou want."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"I keep only one copy of ",(0,r.kt)("inlineCode",{parentName:"p"},"cut.h")," in my repository, so you need to download it from\n",(0,r.kt)("a",{parentName:"p",href:"https://gitlab.fi.muni.cz/pb071/cut/-/jobs/159010/artifacts/file/1header/cut.h"},"here")," and place it into the directory where you have your source code."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Or you can use the one you have from the latest homework, git will keep it\nonly once, so it doesn't take up more space."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"I would recommend cloning this repository and copying the ",(0,r.kt)("inlineCode",{parentName:"p"},"maze")," directory to\nyour own repository, since there are multiple files and it may be easier for you."))),(0,r.kt)("p",null,"In case you have any questions, feel free to reach out to me."),(0,r.kt)("h2",{id:"submitting"},"Submitting"),(0,r.kt)("p",null,"For submitting the bonus assignment you can follow the same procedure as for\nsubmitting the homeworks, that is:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"On branch ",(0,r.kt)("inlineCode",{parentName:"li"},"main")," add the provided skeleton."),(0,r.kt)("li",{parentName:"ol"},"Checkout new branch ",(0,r.kt)("inlineCode",{parentName:"li"},"seminar-bonus-04"),"."),(0,r.kt)("li",{parentName:"ol"},"Add your solution to the newly created branch."),(0,r.kt)("li",{parentName:"ol"},"Create a MR to the ",(0,r.kt)("inlineCode",{parentName:"li"},"main")," branch with me (",(0,r.kt)("inlineCode",{parentName:"li"},"@xfocko"),") as the reviewer.")))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/724.d7e60c08.js b/assets/js/724.d7e60c08.js new file mode 100644 index 0000000..51dcae6 --- /dev/null +++ b/assets/js/724.d7e60c08.js @@ -0,0 +1,41606 @@ +exports.id = 724; +exports.ids = [724]; +exports.modules = { + +/***/ 84182: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(__webpack_require__(82241)); + else {} +})(this, function(__WEBPACK_EXTERNAL_MODULE_0__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_643__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_643__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __nested_webpack_require_643__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __nested_webpack_require_643__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __nested_webpack_require_643__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __nested_webpack_require_643__.d = function(exports, name, getter) { +/******/ if(!__nested_webpack_require_643__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __nested_webpack_require_643__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __nested_webpack_require_643__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __nested_webpack_require_643__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __nested_webpack_require_643__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __nested_webpack_require_643__(__nested_webpack_require_643__.s = 7); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_0__; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __nested_webpack_require_3185__) { + +"use strict"; + + +var FDLayoutConstants = __nested_webpack_require_3185__(0).FDLayoutConstants; + +function CoSEConstants() {} + +//CoSEConstants inherits static props in FDLayoutConstants +for (var prop in FDLayoutConstants) { + CoSEConstants[prop] = FDLayoutConstants[prop]; +} + +CoSEConstants.DEFAULT_USE_MULTI_LEVEL_SCALING = false; +CoSEConstants.DEFAULT_RADIAL_SEPARATION = FDLayoutConstants.DEFAULT_EDGE_LENGTH; +CoSEConstants.DEFAULT_COMPONENT_SEPERATION = 60; +CoSEConstants.TILE = true; +CoSEConstants.TILING_PADDING_VERTICAL = 10; +CoSEConstants.TILING_PADDING_HORIZONTAL = 10; +CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL = false; // make this true when cose is used incrementally as a part of other non-incremental layout + +module.exports = CoSEConstants; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __nested_webpack_require_4002__) { + +"use strict"; + + +var FDLayoutEdge = __nested_webpack_require_4002__(0).FDLayoutEdge; + +function CoSEEdge(source, target, vEdge) { + FDLayoutEdge.call(this, source, target, vEdge); +} + +CoSEEdge.prototype = Object.create(FDLayoutEdge.prototype); +for (var prop in FDLayoutEdge) { + CoSEEdge[prop] = FDLayoutEdge[prop]; +} + +module.exports = CoSEEdge; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __nested_webpack_require_4409__) { + +"use strict"; + + +var LGraph = __nested_webpack_require_4409__(0).LGraph; + +function CoSEGraph(parent, graphMgr, vGraph) { + LGraph.call(this, parent, graphMgr, vGraph); +} + +CoSEGraph.prototype = Object.create(LGraph.prototype); +for (var prop in LGraph) { + CoSEGraph[prop] = LGraph[prop]; +} + +module.exports = CoSEGraph; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __nested_webpack_require_4790__) { + +"use strict"; + + +var LGraphManager = __nested_webpack_require_4790__(0).LGraphManager; + +function CoSEGraphManager(layout) { + LGraphManager.call(this, layout); +} + +CoSEGraphManager.prototype = Object.create(LGraphManager.prototype); +for (var prop in LGraphManager) { + CoSEGraphManager[prop] = LGraphManager[prop]; +} + +module.exports = CoSEGraphManager; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __nested_webpack_require_5205__) { + +"use strict"; + + +var FDLayoutNode = __nested_webpack_require_5205__(0).FDLayoutNode; +var IMath = __nested_webpack_require_5205__(0).IMath; + +function CoSENode(gm, loc, size, vNode) { + FDLayoutNode.call(this, gm, loc, size, vNode); +} + +CoSENode.prototype = Object.create(FDLayoutNode.prototype); +for (var prop in FDLayoutNode) { + CoSENode[prop] = FDLayoutNode[prop]; +} + +CoSENode.prototype.move = function () { + var layout = this.graphManager.getLayout(); + this.displacementX = layout.coolingFactor * (this.springForceX + this.repulsionForceX + this.gravitationForceX) / this.noOfChildren; + this.displacementY = layout.coolingFactor * (this.springForceY + this.repulsionForceY + this.gravitationForceY) / this.noOfChildren; + + if (Math.abs(this.displacementX) > layout.coolingFactor * layout.maxNodeDisplacement) { + this.displacementX = layout.coolingFactor * layout.maxNodeDisplacement * IMath.sign(this.displacementX); + } + + if (Math.abs(this.displacementY) > layout.coolingFactor * layout.maxNodeDisplacement) { + this.displacementY = layout.coolingFactor * layout.maxNodeDisplacement * IMath.sign(this.displacementY); + } + + // a simple node, just move it + if (this.child == null) { + this.moveBy(this.displacementX, this.displacementY); + } + // an empty compound node, again just move it + else if (this.child.getNodes().length == 0) { + this.moveBy(this.displacementX, this.displacementY); + } + // non-empty compound node, propogate movement to children as well + else { + this.propogateDisplacementToChildren(this.displacementX, this.displacementY); + } + + layout.totalDisplacement += Math.abs(this.displacementX) + Math.abs(this.displacementY); + + this.springForceX = 0; + this.springForceY = 0; + this.repulsionForceX = 0; + this.repulsionForceY = 0; + this.gravitationForceX = 0; + this.gravitationForceY = 0; + this.displacementX = 0; + this.displacementY = 0; +}; + +CoSENode.prototype.propogateDisplacementToChildren = function (dX, dY) { + var nodes = this.getChild().getNodes(); + var node; + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + if (node.getChild() == null) { + node.moveBy(dX, dY); + node.displacementX += dX; + node.displacementY += dY; + } else { + node.propogateDisplacementToChildren(dX, dY); + } + } +}; + +CoSENode.prototype.setPred1 = function (pred1) { + this.pred1 = pred1; +}; + +CoSENode.prototype.getPred1 = function () { + return pred1; +}; + +CoSENode.prototype.getPred2 = function () { + return pred2; +}; + +CoSENode.prototype.setNext = function (next) { + this.next = next; +}; + +CoSENode.prototype.getNext = function () { + return next; +}; + +CoSENode.prototype.setProcessed = function (processed) { + this.processed = processed; +}; + +CoSENode.prototype.isProcessed = function () { + return processed; +}; + +module.exports = CoSENode; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __nested_webpack_require_8085__) { + +"use strict"; + + +var FDLayout = __nested_webpack_require_8085__(0).FDLayout; +var CoSEGraphManager = __nested_webpack_require_8085__(4); +var CoSEGraph = __nested_webpack_require_8085__(3); +var CoSENode = __nested_webpack_require_8085__(5); +var CoSEEdge = __nested_webpack_require_8085__(2); +var CoSEConstants = __nested_webpack_require_8085__(1); +var FDLayoutConstants = __nested_webpack_require_8085__(0).FDLayoutConstants; +var LayoutConstants = __nested_webpack_require_8085__(0).LayoutConstants; +var Point = __nested_webpack_require_8085__(0).Point; +var PointD = __nested_webpack_require_8085__(0).PointD; +var Layout = __nested_webpack_require_8085__(0).Layout; +var Integer = __nested_webpack_require_8085__(0).Integer; +var IGeometry = __nested_webpack_require_8085__(0).IGeometry; +var LGraph = __nested_webpack_require_8085__(0).LGraph; +var Transform = __nested_webpack_require_8085__(0).Transform; + +function CoSELayout() { + FDLayout.call(this); + + this.toBeTiled = {}; // Memorize if a node is to be tiled or is tiled +} + +CoSELayout.prototype = Object.create(FDLayout.prototype); + +for (var prop in FDLayout) { + CoSELayout[prop] = FDLayout[prop]; +} + +CoSELayout.prototype.newGraphManager = function () { + var gm = new CoSEGraphManager(this); + this.graphManager = gm; + return gm; +}; + +CoSELayout.prototype.newGraph = function (vGraph) { + return new CoSEGraph(null, this.graphManager, vGraph); +}; + +CoSELayout.prototype.newNode = function (vNode) { + return new CoSENode(this.graphManager, vNode); +}; + +CoSELayout.prototype.newEdge = function (vEdge) { + return new CoSEEdge(null, null, vEdge); +}; + +CoSELayout.prototype.initParameters = function () { + FDLayout.prototype.initParameters.call(this, arguments); + if (!this.isSubLayout) { + if (CoSEConstants.DEFAULT_EDGE_LENGTH < 10) { + this.idealEdgeLength = 10; + } else { + this.idealEdgeLength = CoSEConstants.DEFAULT_EDGE_LENGTH; + } + + this.useSmartIdealEdgeLengthCalculation = CoSEConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION; + this.springConstant = FDLayoutConstants.DEFAULT_SPRING_STRENGTH; + this.repulsionConstant = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH; + this.gravityConstant = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH; + this.compoundGravityConstant = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH; + this.gravityRangeFactor = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR; + this.compoundGravityRangeFactor = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR; + + // variables for tree reduction support + this.prunedNodesAll = []; + this.growTreeIterations = 0; + this.afterGrowthIterations = 0; + this.isTreeGrowing = false; + this.isGrowthFinished = false; + + // variables for cooling + this.coolingCycle = 0; + this.maxCoolingCycle = this.maxIterations / FDLayoutConstants.CONVERGENCE_CHECK_PERIOD; + this.finalTemperature = FDLayoutConstants.CONVERGENCE_CHECK_PERIOD / this.maxIterations; + this.coolingAdjuster = 1; + } +}; + +CoSELayout.prototype.layout = function () { + var createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; + if (createBendsAsNeeded) { + this.createBendpoints(); + this.graphManager.resetAllEdges(); + } + + this.level = 0; + return this.classicLayout(); +}; + +CoSELayout.prototype.classicLayout = function () { + this.nodesWithGravity = this.calculateNodesToApplyGravitationTo(); + this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity); + this.calcNoOfChildrenForAllNodes(); + this.graphManager.calcLowestCommonAncestors(); + this.graphManager.calcInclusionTreeDepths(); + this.graphManager.getRoot().calcEstimatedSize(); + this.calcIdealEdgeLengths(); + + if (!this.incremental) { + var forest = this.getFlatForest(); + + // The graph associated with this layout is flat and a forest + if (forest.length > 0) { + this.positionNodesRadially(forest); + } + // The graph associated with this layout is not flat or a forest + else { + // Reduce the trees when incremental mode is not enabled and graph is not a forest + this.reduceTrees(); + // Update nodes that gravity will be applied + this.graphManager.resetAllNodesToApplyGravitation(); + var allNodes = new Set(this.getAllNodes()); + var intersection = this.nodesWithGravity.filter(function (x) { + return allNodes.has(x); + }); + this.graphManager.setAllNodesToApplyGravitation(intersection); + + this.positionNodesRandomly(); + } + } else { + if (CoSEConstants.TREE_REDUCTION_ON_INCREMENTAL) { + // Reduce the trees in incremental mode if only this constant is set to true + this.reduceTrees(); + // Update nodes that gravity will be applied + this.graphManager.resetAllNodesToApplyGravitation(); + var allNodes = new Set(this.getAllNodes()); + var intersection = this.nodesWithGravity.filter(function (x) { + return allNodes.has(x); + }); + this.graphManager.setAllNodesToApplyGravitation(intersection); + } + } + + this.initSpringEmbedder(); + this.runSpringEmbedder(); + + return true; +}; + +CoSELayout.prototype.tick = function () { + this.totalIterations++; + + if (this.totalIterations === this.maxIterations && !this.isTreeGrowing && !this.isGrowthFinished) { + if (this.prunedNodesAll.length > 0) { + this.isTreeGrowing = true; + } else { + return true; + } + } + + if (this.totalIterations % FDLayoutConstants.CONVERGENCE_CHECK_PERIOD == 0 && !this.isTreeGrowing && !this.isGrowthFinished) { + if (this.isConverged()) { + if (this.prunedNodesAll.length > 0) { + this.isTreeGrowing = true; + } else { + return true; + } + } + + this.coolingCycle++; + + if (this.layoutQuality == 0) { + // quality - "draft" + this.coolingAdjuster = this.coolingCycle; + } else if (this.layoutQuality == 1) { + // quality - "default" + this.coolingAdjuster = this.coolingCycle / 3; + } + + // cooling schedule is based on http://www.btluke.com/simanf1.html -> cooling schedule 3 + this.coolingFactor = Math.max(this.initialCoolingFactor - Math.pow(this.coolingCycle, Math.log(100 * (this.initialCoolingFactor - this.finalTemperature)) / Math.log(this.maxCoolingCycle)) / 100 * this.coolingAdjuster, this.finalTemperature); + this.animationPeriod = Math.ceil(this.initialAnimationPeriod * Math.sqrt(this.coolingFactor)); + } + // Operations while tree is growing again + if (this.isTreeGrowing) { + if (this.growTreeIterations % 10 == 0) { + if (this.prunedNodesAll.length > 0) { + this.graphManager.updateBounds(); + this.updateGrid(); + this.growTree(this.prunedNodesAll); + // Update nodes that gravity will be applied + this.graphManager.resetAllNodesToApplyGravitation(); + var allNodes = new Set(this.getAllNodes()); + var intersection = this.nodesWithGravity.filter(function (x) { + return allNodes.has(x); + }); + this.graphManager.setAllNodesToApplyGravitation(intersection); + + this.graphManager.updateBounds(); + this.updateGrid(); + this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; + } else { + this.isTreeGrowing = false; + this.isGrowthFinished = true; + } + } + this.growTreeIterations++; + } + // Operations after growth is finished + if (this.isGrowthFinished) { + if (this.isConverged()) { + return true; + } + if (this.afterGrowthIterations % 10 == 0) { + this.graphManager.updateBounds(); + this.updateGrid(); + } + this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL * ((100 - this.afterGrowthIterations) / 100); + this.afterGrowthIterations++; + } + + var gridUpdateAllowed = !this.isTreeGrowing && !this.isGrowthFinished; + var forceToNodeSurroundingUpdate = this.growTreeIterations % 10 == 1 && this.isTreeGrowing || this.afterGrowthIterations % 10 == 1 && this.isGrowthFinished; + + this.totalDisplacement = 0; + this.graphManager.updateBounds(); + this.calcSpringForces(); + this.calcRepulsionForces(gridUpdateAllowed, forceToNodeSurroundingUpdate); + this.calcGravitationalForces(); + this.moveNodes(); + this.animate(); + + return false; // Layout is not ended yet return false +}; + +CoSELayout.prototype.getPositionsData = function () { + var allNodes = this.graphManager.getAllNodes(); + var pData = {}; + for (var i = 0; i < allNodes.length; i++) { + var rect = allNodes[i].rect; + var id = allNodes[i].id; + pData[id] = { + id: id, + x: rect.getCenterX(), + y: rect.getCenterY(), + w: rect.width, + h: rect.height + }; + } + + return pData; +}; + +CoSELayout.prototype.runSpringEmbedder = function () { + this.initialAnimationPeriod = 25; + this.animationPeriod = this.initialAnimationPeriod; + var layoutEnded = false; + + // If aminate option is 'during' signal that layout is supposed to start iterating + if (FDLayoutConstants.ANIMATE === 'during') { + this.emit('layoutstarted'); + } else { + // If aminate option is 'during' tick() function will be called on index.js + while (!layoutEnded) { + layoutEnded = this.tick(); + } + + this.graphManager.updateBounds(); + } +}; + +CoSELayout.prototype.calculateNodesToApplyGravitationTo = function () { + var nodeList = []; + var graph; + + var graphs = this.graphManager.getGraphs(); + var size = graphs.length; + var i; + for (i = 0; i < size; i++) { + graph = graphs[i]; + + graph.updateConnected(); + + if (!graph.isConnected) { + nodeList = nodeList.concat(graph.getNodes()); + } + } + + return nodeList; +}; + +CoSELayout.prototype.createBendpoints = function () { + var edges = []; + edges = edges.concat(this.graphManager.getAllEdges()); + var visited = new Set(); + var i; + for (i = 0; i < edges.length; i++) { + var edge = edges[i]; + + if (!visited.has(edge)) { + var source = edge.getSource(); + var target = edge.getTarget(); + + if (source == target) { + edge.getBendpoints().push(new PointD()); + edge.getBendpoints().push(new PointD()); + this.createDummyNodesForBendpoints(edge); + visited.add(edge); + } else { + var edgeList = []; + + edgeList = edgeList.concat(source.getEdgeListToNode(target)); + edgeList = edgeList.concat(target.getEdgeListToNode(source)); + + if (!visited.has(edgeList[0])) { + if (edgeList.length > 1) { + var k; + for (k = 0; k < edgeList.length; k++) { + var multiEdge = edgeList[k]; + multiEdge.getBendpoints().push(new PointD()); + this.createDummyNodesForBendpoints(multiEdge); + } + } + edgeList.forEach(function (edge) { + visited.add(edge); + }); + } + } + } + + if (visited.size == edges.length) { + break; + } + } +}; + +CoSELayout.prototype.positionNodesRadially = function (forest) { + // We tile the trees to a grid row by row; first tree starts at (0,0) + var currentStartingPoint = new Point(0, 0); + var numberOfColumns = Math.ceil(Math.sqrt(forest.length)); + var height = 0; + var currentY = 0; + var currentX = 0; + var point = new PointD(0, 0); + + for (var i = 0; i < forest.length; i++) { + if (i % numberOfColumns == 0) { + // Start of a new row, make the x coordinate 0, increment the + // y coordinate with the max height of the previous row + currentX = 0; + currentY = height; + + if (i != 0) { + currentY += CoSEConstants.DEFAULT_COMPONENT_SEPERATION; + } + + height = 0; + } + + var tree = forest[i]; + + // Find the center of the tree + var centerNode = Layout.findCenterOfTree(tree); + + // Set the staring point of the next tree + currentStartingPoint.x = currentX; + currentStartingPoint.y = currentY; + + // Do a radial layout starting with the center + point = CoSELayout.radialLayout(tree, centerNode, currentStartingPoint); + + if (point.y > height) { + height = Math.floor(point.y); + } + + currentX = Math.floor(point.x + CoSEConstants.DEFAULT_COMPONENT_SEPERATION); + } + + this.transform(new PointD(LayoutConstants.WORLD_CENTER_X - point.x / 2, LayoutConstants.WORLD_CENTER_Y - point.y / 2)); +}; + +CoSELayout.radialLayout = function (tree, centerNode, startingPoint) { + var radialSep = Math.max(this.maxDiagonalInTree(tree), CoSEConstants.DEFAULT_RADIAL_SEPARATION); + CoSELayout.branchRadialLayout(centerNode, null, 0, 359, 0, radialSep); + var bounds = LGraph.calculateBounds(tree); + + var transform = new Transform(); + transform.setDeviceOrgX(bounds.getMinX()); + transform.setDeviceOrgY(bounds.getMinY()); + transform.setWorldOrgX(startingPoint.x); + transform.setWorldOrgY(startingPoint.y); + + for (var i = 0; i < tree.length; i++) { + var node = tree[i]; + node.transform(transform); + } + + var bottomRight = new PointD(bounds.getMaxX(), bounds.getMaxY()); + + return transform.inverseTransformPoint(bottomRight); +}; + +CoSELayout.branchRadialLayout = function (node, parentOfNode, startAngle, endAngle, distance, radialSeparation) { + // First, position this node by finding its angle. + var halfInterval = (endAngle - startAngle + 1) / 2; + + if (halfInterval < 0) { + halfInterval += 180; + } + + var nodeAngle = (halfInterval + startAngle) % 360; + var teta = nodeAngle * IGeometry.TWO_PI / 360; + + // Make polar to java cordinate conversion. + var cos_teta = Math.cos(teta); + var x_ = distance * Math.cos(teta); + var y_ = distance * Math.sin(teta); + + node.setCenter(x_, y_); + + // Traverse all neighbors of this node and recursively call this + // function. + var neighborEdges = []; + neighborEdges = neighborEdges.concat(node.getEdges()); + var childCount = neighborEdges.length; + + if (parentOfNode != null) { + childCount--; + } + + var branchCount = 0; + + var incEdgesCount = neighborEdges.length; + var startIndex; + + var edges = node.getEdgesBetween(parentOfNode); + + // If there are multiple edges, prune them until there remains only one + // edge. + while (edges.length > 1) { + //neighborEdges.remove(edges.remove(0)); + var temp = edges[0]; + edges.splice(0, 1); + var index = neighborEdges.indexOf(temp); + if (index >= 0) { + neighborEdges.splice(index, 1); + } + incEdgesCount--; + childCount--; + } + + if (parentOfNode != null) { + //assert edges.length == 1; + startIndex = (neighborEdges.indexOf(edges[0]) + 1) % incEdgesCount; + } else { + startIndex = 0; + } + + var stepAngle = Math.abs(endAngle - startAngle) / childCount; + + for (var i = startIndex; branchCount != childCount; i = ++i % incEdgesCount) { + var currentNeighbor = neighborEdges[i].getOtherEnd(node); + + // Don't back traverse to root node in current tree. + if (currentNeighbor == parentOfNode) { + continue; + } + + var childStartAngle = (startAngle + branchCount * stepAngle) % 360; + var childEndAngle = (childStartAngle + stepAngle) % 360; + + CoSELayout.branchRadialLayout(currentNeighbor, node, childStartAngle, childEndAngle, distance + radialSeparation, radialSeparation); + + branchCount++; + } +}; + +CoSELayout.maxDiagonalInTree = function (tree) { + var maxDiagonal = Integer.MIN_VALUE; + + for (var i = 0; i < tree.length; i++) { + var node = tree[i]; + var diagonal = node.getDiagonal(); + + if (diagonal > maxDiagonal) { + maxDiagonal = diagonal; + } + } + + return maxDiagonal; +}; + +CoSELayout.prototype.calcRepulsionRange = function () { + // formula is 2 x (level + 1) x idealEdgeLength + return 2 * (this.level + 1) * this.idealEdgeLength; +}; + +// Tiling methods + +// Group zero degree members whose parents are not to be tiled, create dummy parents where needed and fill memberGroups by their dummp parent id's +CoSELayout.prototype.groupZeroDegreeMembers = function () { + var self = this; + // array of [parent_id x oneDegreeNode_id] + var tempMemberGroups = {}; // A temporary map of parent node and its zero degree members + this.memberGroups = {}; // A map of dummy parent node and its zero degree members whose parents are not to be tiled + this.idToDummyNode = {}; // A map of id to dummy node + + var zeroDegree = []; // List of zero degree nodes whose parents are not to be tiled + var allNodes = this.graphManager.getAllNodes(); + + // Fill zero degree list + for (var i = 0; i < allNodes.length; i++) { + var node = allNodes[i]; + var parent = node.getParent(); + // If a node has zero degree and its parent is not to be tiled if exists add that node to zeroDegres list + if (this.getNodeDegreeWithChildren(node) === 0 && (parent.id == undefined || !this.getToBeTiled(parent))) { + zeroDegree.push(node); + } + } + + // Create a map of parent node and its zero degree members + for (var i = 0; i < zeroDegree.length; i++) { + var node = zeroDegree[i]; // Zero degree node itself + var p_id = node.getParent().id; // Parent id + + if (typeof tempMemberGroups[p_id] === "undefined") tempMemberGroups[p_id] = []; + + tempMemberGroups[p_id] = tempMemberGroups[p_id].concat(node); // Push node to the list belongs to its parent in tempMemberGroups + } + + // If there are at least two nodes at a level, create a dummy compound for them + Object.keys(tempMemberGroups).forEach(function (p_id) { + if (tempMemberGroups[p_id].length > 1) { + var dummyCompoundId = "DummyCompound_" + p_id; // The id of dummy compound which will be created soon + self.memberGroups[dummyCompoundId] = tempMemberGroups[p_id]; // Add dummy compound to memberGroups + + var parent = tempMemberGroups[p_id][0].getParent(); // The parent of zero degree nodes will be the parent of new dummy compound + + // Create a dummy compound with calculated id + var dummyCompound = new CoSENode(self.graphManager); + dummyCompound.id = dummyCompoundId; + dummyCompound.paddingLeft = parent.paddingLeft || 0; + dummyCompound.paddingRight = parent.paddingRight || 0; + dummyCompound.paddingBottom = parent.paddingBottom || 0; + dummyCompound.paddingTop = parent.paddingTop || 0; + + self.idToDummyNode[dummyCompoundId] = dummyCompound; + + var dummyParentGraph = self.getGraphManager().add(self.newGraph(), dummyCompound); + var parentGraph = parent.getChild(); + + // Add dummy compound to parent the graph + parentGraph.add(dummyCompound); + + // For each zero degree node in this level remove it from its parent graph and add it to the graph of dummy parent + for (var i = 0; i < tempMemberGroups[p_id].length; i++) { + var node = tempMemberGroups[p_id][i]; + + parentGraph.remove(node); + dummyParentGraph.add(node); + } + } + }); +}; + +CoSELayout.prototype.clearCompounds = function () { + var childGraphMap = {}; + var idToNode = {}; + + // Get compound ordering by finding the inner one first + this.performDFSOnCompounds(); + + for (var i = 0; i < this.compoundOrder.length; i++) { + + idToNode[this.compoundOrder[i].id] = this.compoundOrder[i]; + childGraphMap[this.compoundOrder[i].id] = [].concat(this.compoundOrder[i].getChild().getNodes()); + + // Remove children of compounds + this.graphManager.remove(this.compoundOrder[i].getChild()); + this.compoundOrder[i].child = null; + } + + this.graphManager.resetAllNodes(); + + // Tile the removed children + this.tileCompoundMembers(childGraphMap, idToNode); +}; + +CoSELayout.prototype.clearZeroDegreeMembers = function () { + var self = this; + var tiledZeroDegreePack = this.tiledZeroDegreePack = []; + + Object.keys(this.memberGroups).forEach(function (id) { + var compoundNode = self.idToDummyNode[id]; // Get the dummy compound + + tiledZeroDegreePack[id] = self.tileNodes(self.memberGroups[id], compoundNode.paddingLeft + compoundNode.paddingRight); + + // Set the width and height of the dummy compound as calculated + compoundNode.rect.width = tiledZeroDegreePack[id].width; + compoundNode.rect.height = tiledZeroDegreePack[id].height; + }); +}; + +CoSELayout.prototype.repopulateCompounds = function () { + for (var i = this.compoundOrder.length - 1; i >= 0; i--) { + var lCompoundNode = this.compoundOrder[i]; + var id = lCompoundNode.id; + var horizontalMargin = lCompoundNode.paddingLeft; + var verticalMargin = lCompoundNode.paddingTop; + + this.adjustLocations(this.tiledMemberPack[id], lCompoundNode.rect.x, lCompoundNode.rect.y, horizontalMargin, verticalMargin); + } +}; + +CoSELayout.prototype.repopulateZeroDegreeMembers = function () { + var self = this; + var tiledPack = this.tiledZeroDegreePack; + + Object.keys(tiledPack).forEach(function (id) { + var compoundNode = self.idToDummyNode[id]; // Get the dummy compound by its id + var horizontalMargin = compoundNode.paddingLeft; + var verticalMargin = compoundNode.paddingTop; + + // Adjust the positions of nodes wrt its compound + self.adjustLocations(tiledPack[id], compoundNode.rect.x, compoundNode.rect.y, horizontalMargin, verticalMargin); + }); +}; + +CoSELayout.prototype.getToBeTiled = function (node) { + var id = node.id; + //firstly check the previous results + if (this.toBeTiled[id] != null) { + return this.toBeTiled[id]; + } + + //only compound nodes are to be tiled + var childGraph = node.getChild(); + if (childGraph == null) { + this.toBeTiled[id] = false; + return false; + } + + var children = childGraph.getNodes(); // Get the children nodes + + //a compound node is not to be tiled if all of its compound children are not to be tiled + for (var i = 0; i < children.length; i++) { + var theChild = children[i]; + + if (this.getNodeDegree(theChild) > 0) { + this.toBeTiled[id] = false; + return false; + } + + //pass the children not having the compound structure + if (theChild.getChild() == null) { + this.toBeTiled[theChild.id] = false; + continue; + } + + if (!this.getToBeTiled(theChild)) { + this.toBeTiled[id] = false; + return false; + } + } + this.toBeTiled[id] = true; + return true; +}; + +// Get degree of a node depending of its edges and independent of its children +CoSELayout.prototype.getNodeDegree = function (node) { + var id = node.id; + var edges = node.getEdges(); + var degree = 0; + + // For the edges connected + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + if (edge.getSource().id !== edge.getTarget().id) { + degree = degree + 1; + } + } + return degree; +}; + +// Get degree of a node with its children +CoSELayout.prototype.getNodeDegreeWithChildren = function (node) { + var degree = this.getNodeDegree(node); + if (node.getChild() == null) { + return degree; + } + var children = node.getChild().getNodes(); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + degree += this.getNodeDegreeWithChildren(child); + } + return degree; +}; + +CoSELayout.prototype.performDFSOnCompounds = function () { + this.compoundOrder = []; + this.fillCompexOrderByDFS(this.graphManager.getRoot().getNodes()); +}; + +CoSELayout.prototype.fillCompexOrderByDFS = function (children) { + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.getChild() != null) { + this.fillCompexOrderByDFS(child.getChild().getNodes()); + } + if (this.getToBeTiled(child)) { + this.compoundOrder.push(child); + } + } +}; + +/** +* This method places each zero degree member wrt given (x,y) coordinates (top left). +*/ +CoSELayout.prototype.adjustLocations = function (organization, x, y, compoundHorizontalMargin, compoundVerticalMargin) { + x += compoundHorizontalMargin; + y += compoundVerticalMargin; + + var left = x; + + for (var i = 0; i < organization.rows.length; i++) { + var row = organization.rows[i]; + x = left; + var maxHeight = 0; + + for (var j = 0; j < row.length; j++) { + var lnode = row[j]; + + lnode.rect.x = x; // + lnode.rect.width / 2; + lnode.rect.y = y; // + lnode.rect.height / 2; + + x += lnode.rect.width + organization.horizontalPadding; + + if (lnode.rect.height > maxHeight) maxHeight = lnode.rect.height; + } + + y += maxHeight + organization.verticalPadding; + } +}; + +CoSELayout.prototype.tileCompoundMembers = function (childGraphMap, idToNode) { + var self = this; + this.tiledMemberPack = []; + + Object.keys(childGraphMap).forEach(function (id) { + // Get the compound node + var compoundNode = idToNode[id]; + + self.tiledMemberPack[id] = self.tileNodes(childGraphMap[id], compoundNode.paddingLeft + compoundNode.paddingRight); + + compoundNode.rect.width = self.tiledMemberPack[id].width; + compoundNode.rect.height = self.tiledMemberPack[id].height; + }); +}; + +CoSELayout.prototype.tileNodes = function (nodes, minWidth) { + var verticalPadding = CoSEConstants.TILING_PADDING_VERTICAL; + var horizontalPadding = CoSEConstants.TILING_PADDING_HORIZONTAL; + var organization = { + rows: [], + rowWidth: [], + rowHeight: [], + width: 0, + height: minWidth, // assume minHeight equals to minWidth + verticalPadding: verticalPadding, + horizontalPadding: horizontalPadding + }; + + // Sort the nodes in ascending order of their areas + nodes.sort(function (n1, n2) { + if (n1.rect.width * n1.rect.height > n2.rect.width * n2.rect.height) return -1; + if (n1.rect.width * n1.rect.height < n2.rect.width * n2.rect.height) return 1; + return 0; + }); + + // Create the organization -> tile members + for (var i = 0; i < nodes.length; i++) { + var lNode = nodes[i]; + + if (organization.rows.length == 0) { + this.insertNodeToRow(organization, lNode, 0, minWidth); + } else if (this.canAddHorizontal(organization, lNode.rect.width, lNode.rect.height)) { + this.insertNodeToRow(organization, lNode, this.getShortestRowIndex(organization), minWidth); + } else { + this.insertNodeToRow(organization, lNode, organization.rows.length, minWidth); + } + + this.shiftToLastRow(organization); + } + + return organization; +}; + +CoSELayout.prototype.insertNodeToRow = function (organization, node, rowIndex, minWidth) { + var minCompoundSize = minWidth; + + // Add new row if needed + if (rowIndex == organization.rows.length) { + var secondDimension = []; + + organization.rows.push(secondDimension); + organization.rowWidth.push(minCompoundSize); + organization.rowHeight.push(0); + } + + // Update row width + var w = organization.rowWidth[rowIndex] + node.rect.width; + + if (organization.rows[rowIndex].length > 0) { + w += organization.horizontalPadding; + } + + organization.rowWidth[rowIndex] = w; + // Update compound width + if (organization.width < w) { + organization.width = w; + } + + // Update height + var h = node.rect.height; + if (rowIndex > 0) h += organization.verticalPadding; + + var extraHeight = 0; + if (h > organization.rowHeight[rowIndex]) { + extraHeight = organization.rowHeight[rowIndex]; + organization.rowHeight[rowIndex] = h; + extraHeight = organization.rowHeight[rowIndex] - extraHeight; + } + + organization.height += extraHeight; + + // Insert node + organization.rows[rowIndex].push(node); +}; + +//Scans the rows of an organization and returns the one with the min width +CoSELayout.prototype.getShortestRowIndex = function (organization) { + var r = -1; + var min = Number.MAX_VALUE; + + for (var i = 0; i < organization.rows.length; i++) { + if (organization.rowWidth[i] < min) { + r = i; + min = organization.rowWidth[i]; + } + } + return r; +}; + +//Scans the rows of an organization and returns the one with the max width +CoSELayout.prototype.getLongestRowIndex = function (organization) { + var r = -1; + var max = Number.MIN_VALUE; + + for (var i = 0; i < organization.rows.length; i++) { + + if (organization.rowWidth[i] > max) { + r = i; + max = organization.rowWidth[i]; + } + } + + return r; +}; + +/** +* This method checks whether adding extra width to the organization violates +* the aspect ratio(1) or not. +*/ +CoSELayout.prototype.canAddHorizontal = function (organization, extraWidth, extraHeight) { + + var sri = this.getShortestRowIndex(organization); + + if (sri < 0) { + return true; + } + + var min = organization.rowWidth[sri]; + + if (min + organization.horizontalPadding + extraWidth <= organization.width) return true; + + var hDiff = 0; + + // Adding to an existing row + if (organization.rowHeight[sri] < extraHeight) { + if (sri > 0) hDiff = extraHeight + organization.verticalPadding - organization.rowHeight[sri]; + } + + var add_to_row_ratio; + if (organization.width - min >= extraWidth + organization.horizontalPadding) { + add_to_row_ratio = (organization.height + hDiff) / (min + extraWidth + organization.horizontalPadding); + } else { + add_to_row_ratio = (organization.height + hDiff) / organization.width; + } + + // Adding a new row for this node + hDiff = extraHeight + organization.verticalPadding; + var add_new_row_ratio; + if (organization.width < extraWidth) { + add_new_row_ratio = (organization.height + hDiff) / extraWidth; + } else { + add_new_row_ratio = (organization.height + hDiff) / organization.width; + } + + if (add_new_row_ratio < 1) add_new_row_ratio = 1 / add_new_row_ratio; + + if (add_to_row_ratio < 1) add_to_row_ratio = 1 / add_to_row_ratio; + + return add_to_row_ratio < add_new_row_ratio; +}; + +//If moving the last node from the longest row and adding it to the last +//row makes the bounding box smaller, do it. +CoSELayout.prototype.shiftToLastRow = function (organization) { + var longest = this.getLongestRowIndex(organization); + var last = organization.rowWidth.length - 1; + var row = organization.rows[longest]; + var node = row[row.length - 1]; + + var diff = node.width + organization.horizontalPadding; + + // Check if there is enough space on the last row + if (organization.width - organization.rowWidth[last] > diff && longest != last) { + // Remove the last element of the longest row + row.splice(-1, 1); + + // Push it to the last row + organization.rows[last].push(node); + + organization.rowWidth[longest] = organization.rowWidth[longest] - diff; + organization.rowWidth[last] = organization.rowWidth[last] + diff; + organization.width = organization.rowWidth[instance.getLongestRowIndex(organization)]; + + // Update heights of the organization + var maxHeight = Number.MIN_VALUE; + for (var i = 0; i < row.length; i++) { + if (row[i].height > maxHeight) maxHeight = row[i].height; + } + if (longest > 0) maxHeight += organization.verticalPadding; + + var prevTotal = organization.rowHeight[longest] + organization.rowHeight[last]; + + organization.rowHeight[longest] = maxHeight; + if (organization.rowHeight[last] < node.height + organization.verticalPadding) organization.rowHeight[last] = node.height + organization.verticalPadding; + + var finalTotal = organization.rowHeight[longest] + organization.rowHeight[last]; + organization.height += finalTotal - prevTotal; + + this.shiftToLastRow(organization); + } +}; + +CoSELayout.prototype.tilingPreLayout = function () { + if (CoSEConstants.TILE) { + // Find zero degree nodes and create a compound for each level + this.groupZeroDegreeMembers(); + // Tile and clear children of each compound + this.clearCompounds(); + // Separately tile and clear zero degree nodes for each level + this.clearZeroDegreeMembers(); + } +}; + +CoSELayout.prototype.tilingPostLayout = function () { + if (CoSEConstants.TILE) { + this.repopulateZeroDegreeMembers(); + this.repopulateCompounds(); + } +}; + +// ----------------------------------------------------------------------------- +// Section: Tree Reduction methods +// ----------------------------------------------------------------------------- +// Reduce trees +CoSELayout.prototype.reduceTrees = function () { + var prunedNodesAll = []; + var containsLeaf = true; + var node; + + while (containsLeaf) { + var allNodes = this.graphManager.getAllNodes(); + var prunedNodesInStepTemp = []; + containsLeaf = false; + + for (var i = 0; i < allNodes.length; i++) { + node = allNodes[i]; + if (node.getEdges().length == 1 && !node.getEdges()[0].isInterGraph && node.getChild() == null) { + prunedNodesInStepTemp.push([node, node.getEdges()[0], node.getOwner()]); + containsLeaf = true; + } + } + if (containsLeaf == true) { + var prunedNodesInStep = []; + for (var j = 0; j < prunedNodesInStepTemp.length; j++) { + if (prunedNodesInStepTemp[j][0].getEdges().length == 1) { + prunedNodesInStep.push(prunedNodesInStepTemp[j]); + prunedNodesInStepTemp[j][0].getOwner().remove(prunedNodesInStepTemp[j][0]); + } + } + prunedNodesAll.push(prunedNodesInStep); + this.graphManager.resetAllNodes(); + this.graphManager.resetAllEdges(); + } + } + this.prunedNodesAll = prunedNodesAll; +}; + +// Grow tree one step +CoSELayout.prototype.growTree = function (prunedNodesAll) { + var lengthOfPrunedNodesInStep = prunedNodesAll.length; + var prunedNodesInStep = prunedNodesAll[lengthOfPrunedNodesInStep - 1]; + + var nodeData; + for (var i = 0; i < prunedNodesInStep.length; i++) { + nodeData = prunedNodesInStep[i]; + + this.findPlaceforPrunedNode(nodeData); + + nodeData[2].add(nodeData[0]); + nodeData[2].add(nodeData[1], nodeData[1].source, nodeData[1].target); + } + + prunedNodesAll.splice(prunedNodesAll.length - 1, 1); + this.graphManager.resetAllNodes(); + this.graphManager.resetAllEdges(); +}; + +// Find an appropriate position to replace pruned node, this method can be improved +CoSELayout.prototype.findPlaceforPrunedNode = function (nodeData) { + + var gridForPrunedNode; + var nodeToConnect; + var prunedNode = nodeData[0]; + if (prunedNode == nodeData[1].source) { + nodeToConnect = nodeData[1].target; + } else { + nodeToConnect = nodeData[1].source; + } + var startGridX = nodeToConnect.startX; + var finishGridX = nodeToConnect.finishX; + var startGridY = nodeToConnect.startY; + var finishGridY = nodeToConnect.finishY; + + var upNodeCount = 0; + var downNodeCount = 0; + var rightNodeCount = 0; + var leftNodeCount = 0; + var controlRegions = [upNodeCount, rightNodeCount, downNodeCount, leftNodeCount]; + + if (startGridY > 0) { + for (var i = startGridX; i <= finishGridX; i++) { + controlRegions[0] += this.grid[i][startGridY - 1].length + this.grid[i][startGridY].length - 1; + } + } + if (finishGridX < this.grid.length - 1) { + for (var i = startGridY; i <= finishGridY; i++) { + controlRegions[1] += this.grid[finishGridX + 1][i].length + this.grid[finishGridX][i].length - 1; + } + } + if (finishGridY < this.grid[0].length - 1) { + for (var i = startGridX; i <= finishGridX; i++) { + controlRegions[2] += this.grid[i][finishGridY + 1].length + this.grid[i][finishGridY].length - 1; + } + } + if (startGridX > 0) { + for (var i = startGridY; i <= finishGridY; i++) { + controlRegions[3] += this.grid[startGridX - 1][i].length + this.grid[startGridX][i].length - 1; + } + } + var min = Integer.MAX_VALUE; + var minCount; + var minIndex; + for (var j = 0; j < controlRegions.length; j++) { + if (controlRegions[j] < min) { + min = controlRegions[j]; + minCount = 1; + minIndex = j; + } else if (controlRegions[j] == min) { + minCount++; + } + } + + if (minCount == 3 && min == 0) { + if (controlRegions[0] == 0 && controlRegions[1] == 0 && controlRegions[2] == 0) { + gridForPrunedNode = 1; + } else if (controlRegions[0] == 0 && controlRegions[1] == 0 && controlRegions[3] == 0) { + gridForPrunedNode = 0; + } else if (controlRegions[0] == 0 && controlRegions[2] == 0 && controlRegions[3] == 0) { + gridForPrunedNode = 3; + } else if (controlRegions[1] == 0 && controlRegions[2] == 0 && controlRegions[3] == 0) { + gridForPrunedNode = 2; + } + } else if (minCount == 2 && min == 0) { + var random = Math.floor(Math.random() * 2); + if (controlRegions[0] == 0 && controlRegions[1] == 0) { + ; + if (random == 0) { + gridForPrunedNode = 0; + } else { + gridForPrunedNode = 1; + } + } else if (controlRegions[0] == 0 && controlRegions[2] == 0) { + if (random == 0) { + gridForPrunedNode = 0; + } else { + gridForPrunedNode = 2; + } + } else if (controlRegions[0] == 0 && controlRegions[3] == 0) { + if (random == 0) { + gridForPrunedNode = 0; + } else { + gridForPrunedNode = 3; + } + } else if (controlRegions[1] == 0 && controlRegions[2] == 0) { + if (random == 0) { + gridForPrunedNode = 1; + } else { + gridForPrunedNode = 2; + } + } else if (controlRegions[1] == 0 && controlRegions[3] == 0) { + if (random == 0) { + gridForPrunedNode = 1; + } else { + gridForPrunedNode = 3; + } + } else { + if (random == 0) { + gridForPrunedNode = 2; + } else { + gridForPrunedNode = 3; + } + } + } else if (minCount == 4 && min == 0) { + var random = Math.floor(Math.random() * 4); + gridForPrunedNode = random; + } else { + gridForPrunedNode = minIndex; + } + + if (gridForPrunedNode == 0) { + prunedNode.setCenter(nodeToConnect.getCenterX(), nodeToConnect.getCenterY() - nodeToConnect.getHeight() / 2 - FDLayoutConstants.DEFAULT_EDGE_LENGTH - prunedNode.getHeight() / 2); + } else if (gridForPrunedNode == 1) { + prunedNode.setCenter(nodeToConnect.getCenterX() + nodeToConnect.getWidth() / 2 + FDLayoutConstants.DEFAULT_EDGE_LENGTH + prunedNode.getWidth() / 2, nodeToConnect.getCenterY()); + } else if (gridForPrunedNode == 2) { + prunedNode.setCenter(nodeToConnect.getCenterX(), nodeToConnect.getCenterY() + nodeToConnect.getHeight() / 2 + FDLayoutConstants.DEFAULT_EDGE_LENGTH + prunedNode.getHeight() / 2); + } else { + prunedNode.setCenter(nodeToConnect.getCenterX() - nodeToConnect.getWidth() / 2 - FDLayoutConstants.DEFAULT_EDGE_LENGTH - prunedNode.getWidth() / 2, nodeToConnect.getCenterY()); + } +}; + +module.exports = CoSELayout; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __nested_webpack_require_45620__) { + +"use strict"; + + +var coseBase = {}; + +coseBase.layoutBase = __nested_webpack_require_45620__(0); +coseBase.CoSEConstants = __nested_webpack_require_45620__(1); +coseBase.CoSEEdge = __nested_webpack_require_45620__(2); +coseBase.CoSEGraph = __nested_webpack_require_45620__(3); +coseBase.CoSEGraphManager = __nested_webpack_require_45620__(4); +coseBase.CoSELayout = __nested_webpack_require_45620__(6); +coseBase.CoSENode = __nested_webpack_require_45620__(5); + +module.exports = coseBase; + +/***/ }) +/******/ ]); +}); + +/***/ }), + +/***/ 14607: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(__webpack_require__(84182)); + else {} +})(this, function(__WEBPACK_EXTERNAL_MODULE_0__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_659__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_659__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __nested_webpack_require_659__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __nested_webpack_require_659__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __nested_webpack_require_659__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __nested_webpack_require_659__.d = function(exports, name, getter) { +/******/ if(!__nested_webpack_require_659__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __nested_webpack_require_659__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __nested_webpack_require_659__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __nested_webpack_require_659__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __nested_webpack_require_659__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __nested_webpack_require_659__(__nested_webpack_require_659__.s = 1); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +module.exports = __WEBPACK_EXTERNAL_MODULE_0__; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __nested_webpack_require_3201__) { + +"use strict"; + + +var LayoutConstants = __nested_webpack_require_3201__(0).layoutBase.LayoutConstants; +var FDLayoutConstants = __nested_webpack_require_3201__(0).layoutBase.FDLayoutConstants; +var CoSEConstants = __nested_webpack_require_3201__(0).CoSEConstants; +var CoSELayout = __nested_webpack_require_3201__(0).CoSELayout; +var CoSENode = __nested_webpack_require_3201__(0).CoSENode; +var PointD = __nested_webpack_require_3201__(0).layoutBase.PointD; +var DimensionD = __nested_webpack_require_3201__(0).layoutBase.DimensionD; + +var defaults = { + // Called on `layoutready` + ready: function ready() {}, + // Called on `layoutstop` + stop: function stop() {}, + // 'draft', 'default' or 'proof" + // - 'draft' fast cooling rate + // - 'default' moderate cooling rate + // - "proof" slow cooling rate + quality: 'default', + // include labels in node dimensions + nodeDimensionsIncludeLabels: false, + // number of ticks per frame; higher is faster but more jerky + refresh: 30, + // Whether to fit the network view after when done + fit: true, + // Padding on fit + padding: 10, + // Whether to enable incremental mode + randomize: true, + // Node repulsion (non overlapping) multiplier + nodeRepulsion: 4500, + // Ideal edge (non nested) length + idealEdgeLength: 50, + // Divisor to compute edge forces + edgeElasticity: 0.45, + // Nesting factor (multiplier) to compute ideal edge length for nested edges + nestingFactor: 0.1, + // Gravity force (constant) + gravity: 0.25, + // Maximum number of iterations to perform + numIter: 2500, + // For enabling tiling + tile: true, + // Type of layout animation. The option set is {'during', 'end', false} + animate: 'end', + // Duration for animate:end + animationDuration: 500, + // Represents the amount of the vertical space to put between the zero degree members during the tiling operation(can also be a function) + tilingPaddingVertical: 10, + // Represents the amount of the horizontal space to put between the zero degree members during the tiling operation(can also be a function) + tilingPaddingHorizontal: 10, + // Gravity range (constant) for compounds + gravityRangeCompound: 1.5, + // Gravity force (constant) for compounds + gravityCompound: 1.0, + // Gravity range (constant) + gravityRange: 3.8, + // Initial cooling factor for incremental layout + initialEnergyOnIncremental: 0.5 +}; + +function extend(defaults, options) { + var obj = {}; + + for (var i in defaults) { + obj[i] = defaults[i]; + } + + for (var i in options) { + obj[i] = options[i]; + } + + return obj; +}; + +function _CoSELayout(_options) { + this.options = extend(defaults, _options); + getUserOptions(this.options); +} + +var getUserOptions = function getUserOptions(options) { + if (options.nodeRepulsion != null) CoSEConstants.DEFAULT_REPULSION_STRENGTH = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH = options.nodeRepulsion; + if (options.idealEdgeLength != null) CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = options.idealEdgeLength; + if (options.edgeElasticity != null) CoSEConstants.DEFAULT_SPRING_STRENGTH = FDLayoutConstants.DEFAULT_SPRING_STRENGTH = options.edgeElasticity; + if (options.nestingFactor != null) CoSEConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = options.nestingFactor; + if (options.gravity != null) CoSEConstants.DEFAULT_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = options.gravity; + if (options.numIter != null) CoSEConstants.MAX_ITERATIONS = FDLayoutConstants.MAX_ITERATIONS = options.numIter; + if (options.gravityRange != null) CoSEConstants.DEFAULT_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = options.gravityRange; + if (options.gravityCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = options.gravityCompound; + if (options.gravityRangeCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = options.gravityRangeCompound; + if (options.initialEnergyOnIncremental != null) CoSEConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = options.initialEnergyOnIncremental; + + if (options.quality == 'draft') LayoutConstants.QUALITY = 0;else if (options.quality == 'proof') LayoutConstants.QUALITY = 2;else LayoutConstants.QUALITY = 1; + + CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS = FDLayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = options.nodeDimensionsIncludeLabels; + CoSEConstants.DEFAULT_INCREMENTAL = FDLayoutConstants.DEFAULT_INCREMENTAL = LayoutConstants.DEFAULT_INCREMENTAL = !options.randomize; + CoSEConstants.ANIMATE = FDLayoutConstants.ANIMATE = LayoutConstants.ANIMATE = options.animate; + CoSEConstants.TILE = options.tile; + CoSEConstants.TILING_PADDING_VERTICAL = typeof options.tilingPaddingVertical === 'function' ? options.tilingPaddingVertical.call() : options.tilingPaddingVertical; + CoSEConstants.TILING_PADDING_HORIZONTAL = typeof options.tilingPaddingHorizontal === 'function' ? options.tilingPaddingHorizontal.call() : options.tilingPaddingHorizontal; +}; + +_CoSELayout.prototype.run = function () { + var ready; + var frameId; + var options = this.options; + var idToLNode = this.idToLNode = {}; + var layout = this.layout = new CoSELayout(); + var self = this; + + self.stopped = false; + + this.cy = this.options.cy; + + this.cy.trigger({ type: 'layoutstart', layout: this }); + + var gm = layout.newGraphManager(); + this.gm = gm; + + var nodes = this.options.eles.nodes(); + var edges = this.options.eles.edges(); + + this.root = gm.addRoot(); + this.processChildrenList(this.root, this.getTopMostNodes(nodes), layout); + + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var sourceNode = this.idToLNode[edge.data("source")]; + var targetNode = this.idToLNode[edge.data("target")]; + if (sourceNode !== targetNode && sourceNode.getEdgesBetween(targetNode).length == 0) { + var e1 = gm.add(layout.newEdge(), sourceNode, targetNode); + e1.id = edge.id(); + } + } + + var getPositions = function getPositions(ele, i) { + if (typeof ele === "number") { + ele = i; + } + var theId = ele.data('id'); + var lNode = self.idToLNode[theId]; + + return { + x: lNode.getRect().getCenterX(), + y: lNode.getRect().getCenterY() + }; + }; + + /* + * Reposition nodes in iterations animatedly + */ + var iterateAnimated = function iterateAnimated() { + // Thigs to perform after nodes are repositioned on screen + var afterReposition = function afterReposition() { + if (options.fit) { + options.cy.fit(options.eles, options.padding); + } + + if (!ready) { + ready = true; + self.cy.one('layoutready', options.ready); + self.cy.trigger({ type: 'layoutready', layout: self }); + } + }; + + var ticksPerFrame = self.options.refresh; + var isDone; + + for (var i = 0; i < ticksPerFrame && !isDone; i++) { + isDone = self.stopped || self.layout.tick(); + } + + // If layout is done + if (isDone) { + // If the layout is not a sublayout and it is successful perform post layout. + if (layout.checkLayoutSuccess() && !layout.isSubLayout) { + layout.doPostLayout(); + } + + // If layout has a tilingPostLayout function property call it. + if (layout.tilingPostLayout) { + layout.tilingPostLayout(); + } + + layout.isLayoutFinished = true; + + self.options.eles.nodes().positions(getPositions); + + afterReposition(); + + // trigger layoutstop when the layout stops (e.g. finishes) + self.cy.one('layoutstop', self.options.stop); + self.cy.trigger({ type: 'layoutstop', layout: self }); + + if (frameId) { + cancelAnimationFrame(frameId); + } + + ready = false; + return; + } + + var animationData = self.layout.getPositionsData(); // Get positions of layout nodes note that all nodes may not be layout nodes because of tiling + + // Position nodes, for the nodes whose id does not included in data (because they are removed from their parents and included in dummy compounds) + // use position of their ancestors or dummy ancestors + options.eles.nodes().positions(function (ele, i) { + if (typeof ele === "number") { + ele = i; + } + // If ele is a compound node, then its position will be defined by its children + if (!ele.isParent()) { + var theId = ele.id(); + var pNode = animationData[theId]; + var temp = ele; + // If pNode is undefined search until finding position data of its first ancestor (It may be dummy as well) + while (pNode == null) { + pNode = animationData[temp.data('parent')] || animationData['DummyCompound_' + temp.data('parent')]; + animationData[theId] = pNode; + temp = temp.parent()[0]; + if (temp == undefined) { + break; + } + } + if (pNode != null) { + return { + x: pNode.x, + y: pNode.y + }; + } else { + return { + x: ele.position('x'), + y: ele.position('y') + }; + } + } + }); + + afterReposition(); + + frameId = requestAnimationFrame(iterateAnimated); + }; + + /* + * Listen 'layoutstarted' event and start animated iteration if animate option is 'during' + */ + layout.addListener('layoutstarted', function () { + if (self.options.animate === 'during') { + frameId = requestAnimationFrame(iterateAnimated); + } + }); + + layout.runLayout(); // Run cose layout + + /* + * If animate option is not 'during' ('end' or false) perform these here (If it is 'during' similar things are already performed) + */ + if (this.options.animate !== "during") { + self.options.eles.nodes().not(":parent").layoutPositions(self, self.options, getPositions); // Use layout positions to reposition the nodes it considers the options parameter + ready = false; + } + + return this; // chaining +}; + +//Get the top most ones of a list of nodes +_CoSELayout.prototype.getTopMostNodes = function (nodes) { + var nodesMap = {}; + for (var i = 0; i < nodes.length; i++) { + nodesMap[nodes[i].id()] = true; + } + var roots = nodes.filter(function (ele, i) { + if (typeof ele === "number") { + ele = i; + } + var parent = ele.parent()[0]; + while (parent != null) { + if (nodesMap[parent.id()]) { + return false; + } + parent = parent.parent()[0]; + } + return true; + }); + + return roots; +}; + +_CoSELayout.prototype.processChildrenList = function (parent, children, layout) { + var size = children.length; + for (var i = 0; i < size; i++) { + var theChild = children[i]; + var children_of_children = theChild.children(); + var theNode; + + var dimensions = theChild.layoutDimensions({ + nodeDimensionsIncludeLabels: this.options.nodeDimensionsIncludeLabels + }); + + if (theChild.outerWidth() != null && theChild.outerHeight() != null) { + theNode = parent.add(new CoSENode(layout.graphManager, new PointD(theChild.position('x') - dimensions.w / 2, theChild.position('y') - dimensions.h / 2), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h)))); + } else { + theNode = parent.add(new CoSENode(this.graphManager)); + } + // Attach id to the layout node + theNode.id = theChild.data("id"); + // Attach the paddings of cy node to layout node + theNode.paddingLeft = parseInt(theChild.css('padding')); + theNode.paddingTop = parseInt(theChild.css('padding')); + theNode.paddingRight = parseInt(theChild.css('padding')); + theNode.paddingBottom = parseInt(theChild.css('padding')); + + //Attach the label properties to compound if labels will be included in node dimensions + if (this.options.nodeDimensionsIncludeLabels) { + if (theChild.isParent()) { + var labelWidth = theChild.boundingBox({ includeLabels: true, includeNodes: false }).w; + var labelHeight = theChild.boundingBox({ includeLabels: true, includeNodes: false }).h; + var labelPos = theChild.css("text-halign"); + theNode.labelWidth = labelWidth; + theNode.labelHeight = labelHeight; + theNode.labelPos = labelPos; + } + } + + // Map the layout node + this.idToLNode[theChild.data("id")] = theNode; + + if (isNaN(theNode.rect.x)) { + theNode.rect.x = 0; + } + + if (isNaN(theNode.rect.y)) { + theNode.rect.y = 0; + } + + if (children_of_children != null && children_of_children.length > 0) { + var theNewGraph; + theNewGraph = layout.getGraphManager().add(layout.newGraph(), theNode); + this.processChildrenList(theNewGraph, children_of_children, layout); + } + } +}; + +/** + * @brief : called on continuous layouts to stop them before they finish + */ +_CoSELayout.prototype.stop = function () { + this.stopped = true; + + return this; // chaining +}; + +var register = function register(cytoscape) { + // var Layout = getLayout( cytoscape ); + + cytoscape('layout', 'cose-bilkent', _CoSELayout); +}; + +// auto reg for globals +if (typeof cytoscape !== 'undefined') { + register(cytoscape); +} + +module.exports = register; + +/***/ }) +/******/ ]); +}); + +/***/ }), + +/***/ 71377: +/***/ (function(module) { + +/** + * Copyright (c) 2016-2023, The Cytoscape Consortium. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the “Software”), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +(function (global, factory) { + true ? module.exports = factory() : + 0; +})(this, (function () { 'use strict'; + + function _typeof(obj) { + "@babel/helpers - typeof"; + + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }, _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + + function _defineProperty$1(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; + + if (_i == null) return; + var _arr = []; + var _n = true; + var _d = false; + + var _s, _e; + + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var _window = typeof window === 'undefined' ? null : window; // eslint-disable-line no-undef + + var navigator = _window ? _window.navigator : null; + _window ? _window.document : null; + + var typeofstr = _typeof(''); + + var typeofobj = _typeof({}); + + var typeoffn = _typeof(function () {}); + + var typeofhtmlele = typeof HTMLElement === "undefined" ? "undefined" : _typeof(HTMLElement); + + var instanceStr = function instanceStr(obj) { + return obj && obj.instanceString && fn$6(obj.instanceString) ? obj.instanceString() : null; + }; + + var string = function string(obj) { + return obj != null && _typeof(obj) == typeofstr; + }; + var fn$6 = function fn(obj) { + return obj != null && _typeof(obj) === typeoffn; + }; + var array = function array(obj) { + return !elementOrCollection(obj) && (Array.isArray ? Array.isArray(obj) : obj != null && obj instanceof Array); + }; + var plainObject = function plainObject(obj) { + return obj != null && _typeof(obj) === typeofobj && !array(obj) && obj.constructor === Object; + }; + var object = function object(obj) { + return obj != null && _typeof(obj) === typeofobj; + }; + var number$1 = function number(obj) { + return obj != null && _typeof(obj) === _typeof(1) && !isNaN(obj); + }; + var integer = function integer(obj) { + return number$1(obj) && Math.floor(obj) === obj; + }; + var htmlElement = function htmlElement(obj) { + if ('undefined' === typeofhtmlele) { + return undefined; + } else { + return null != obj && obj instanceof HTMLElement; + } + }; + var elementOrCollection = function elementOrCollection(obj) { + return element(obj) || collection(obj); + }; + var element = function element(obj) { + return instanceStr(obj) === 'collection' && obj._private.single; + }; + var collection = function collection(obj) { + return instanceStr(obj) === 'collection' && !obj._private.single; + }; + var core = function core(obj) { + return instanceStr(obj) === 'core'; + }; + var stylesheet = function stylesheet(obj) { + return instanceStr(obj) === 'stylesheet'; + }; + var event = function event(obj) { + return instanceStr(obj) === 'event'; + }; + var emptyString = function emptyString(obj) { + if (obj === undefined || obj === null) { + // null is empty + return true; + } else if (obj === '' || obj.match(/^\s+$/)) { + return true; // empty string is empty + } + + return false; // otherwise, we don't know what we've got + }; + var domElement = function domElement(obj) { + if (typeof HTMLElement === 'undefined') { + return false; // we're not in a browser so it doesn't matter + } else { + return obj instanceof HTMLElement; + } + }; + var boundingBox = function boundingBox(obj) { + return plainObject(obj) && number$1(obj.x1) && number$1(obj.x2) && number$1(obj.y1) && number$1(obj.y2); + }; + var promise = function promise(obj) { + return object(obj) && fn$6(obj.then); + }; + var ms = function ms() { + return navigator && navigator.userAgent.match(/msie|trident|edge/i); + }; // probably a better way to detect this... + + var memoize$1 = function memoize(fn, keyFn) { + if (!keyFn) { + keyFn = function keyFn() { + if (arguments.length === 1) { + return arguments[0]; + } else if (arguments.length === 0) { + return 'undefined'; + } + + var args = []; + + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + + return args.join('$'); + }; + } + + var memoizedFn = function memoizedFn() { + var self = this; + var args = arguments; + var ret; + var k = keyFn.apply(self, args); + var cache = memoizedFn.cache; + + if (!(ret = cache[k])) { + ret = cache[k] = fn.apply(self, args); + } + + return ret; + }; + + memoizedFn.cache = {}; + return memoizedFn; + }; + + var camel2dash = memoize$1(function (str) { + return str.replace(/([A-Z])/g, function (v) { + return '-' + v.toLowerCase(); + }); + }); + var dash2camel = memoize$1(function (str) { + return str.replace(/(-\w)/g, function (v) { + return v[1].toUpperCase(); + }); + }); + var prependCamel = memoize$1(function (prefix, str) { + return prefix + str[0].toUpperCase() + str.substring(1); + }, function (prefix, str) { + return prefix + '$' + str; + }); + var capitalize = function capitalize(str) { + if (emptyString(str)) { + return str; + } + + return str.charAt(0).toUpperCase() + str.substring(1); + }; + + var number = '(?:[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?))'; + var rgba = 'rgb[a]?\\((' + number + '[%]?)\\s*,\\s*(' + number + '[%]?)\\s*,\\s*(' + number + '[%]?)(?:\\s*,\\s*(' + number + '))?\\)'; + var rgbaNoBackRefs = 'rgb[a]?\\((?:' + number + '[%]?)\\s*,\\s*(?:' + number + '[%]?)\\s*,\\s*(?:' + number + '[%]?)(?:\\s*,\\s*(?:' + number + '))?\\)'; + var hsla = 'hsl[a]?\\((' + number + ')\\s*,\\s*(' + number + '[%])\\s*,\\s*(' + number + '[%])(?:\\s*,\\s*(' + number + '))?\\)'; + var hslaNoBackRefs = 'hsl[a]?\\((?:' + number + ')\\s*,\\s*(?:' + number + '[%])\\s*,\\s*(?:' + number + '[%])(?:\\s*,\\s*(?:' + number + '))?\\)'; + var hex3 = '\\#[0-9a-fA-F]{3}'; + var hex6 = '\\#[0-9a-fA-F]{6}'; + + var ascending = function ascending(a, b) { + if (a < b) { + return -1; + } else if (a > b) { + return 1; + } else { + return 0; + } + }; + var descending = function descending(a, b) { + return -1 * ascending(a, b); + }; + + var extend = Object.assign != null ? Object.assign.bind(Object) : function (tgt) { + var args = arguments; + + for (var i = 1; i < args.length; i++) { + var obj = args[i]; + + if (obj == null) { + continue; + } + + var keys = Object.keys(obj); + + for (var j = 0; j < keys.length; j++) { + var k = keys[j]; + tgt[k] = obj[k]; + } + } + + return tgt; + }; + + var hex2tuple = function hex2tuple(hex) { + if (!(hex.length === 4 || hex.length === 7) || hex[0] !== '#') { + return; + } + + var shortHex = hex.length === 4; + var r, g, b; + var base = 16; + + if (shortHex) { + r = parseInt(hex[1] + hex[1], base); + g = parseInt(hex[2] + hex[2], base); + b = parseInt(hex[3] + hex[3], base); + } else { + r = parseInt(hex[1] + hex[2], base); + g = parseInt(hex[3] + hex[4], base); + b = parseInt(hex[5] + hex[6], base); + } + + return [r, g, b]; + }; // get [r, g, b, a] from hsl(0, 0, 0) or hsla(0, 0, 0, 0) + + var hsl2tuple = function hsl2tuple(hsl) { + var ret; + var h, s, l, a, r, g, b; + + function hue2rgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + } + + var m = new RegExp('^' + hsla + '$').exec(hsl); + + if (m) { + // get hue + h = parseInt(m[1]); + + if (h < 0) { + h = (360 - -1 * h % 360) % 360; + } else if (h > 360) { + h = h % 360; + } + + h /= 360; // normalise on [0, 1] + + s = parseFloat(m[2]); + + if (s < 0 || s > 100) { + return; + } // saturation is [0, 100] + + + s = s / 100; // normalise on [0, 1] + + l = parseFloat(m[3]); + + if (l < 0 || l > 100) { + return; + } // lightness is [0, 100] + + + l = l / 100; // normalise on [0, 1] + + a = m[4]; + + if (a !== undefined) { + a = parseFloat(a); + + if (a < 0 || a > 1) { + return; + } // alpha is [0, 1] + + } // now, convert to rgb + // code from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript + + + if (s === 0) { + r = g = b = Math.round(l * 255); // achromatic + } else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = Math.round(255 * hue2rgb(p, q, h + 1 / 3)); + g = Math.round(255 * hue2rgb(p, q, h)); + b = Math.round(255 * hue2rgb(p, q, h - 1 / 3)); + } + + ret = [r, g, b, a]; + } + + return ret; + }; // get [r, g, b, a] from rgb(0, 0, 0) or rgba(0, 0, 0, 0) + + var rgb2tuple = function rgb2tuple(rgb) { + var ret; + var m = new RegExp('^' + rgba + '$').exec(rgb); + + if (m) { + ret = []; + var isPct = []; + + for (var i = 1; i <= 3; i++) { + var channel = m[i]; + + if (channel[channel.length - 1] === '%') { + isPct[i] = true; + } + + channel = parseFloat(channel); + + if (isPct[i]) { + channel = channel / 100 * 255; // normalise to [0, 255] + } + + if (channel < 0 || channel > 255) { + return; + } // invalid channel value + + + ret.push(Math.floor(channel)); + } + + var atLeastOneIsPct = isPct[1] || isPct[2] || isPct[3]; + var allArePct = isPct[1] && isPct[2] && isPct[3]; + + if (atLeastOneIsPct && !allArePct) { + return; + } // must all be percent values if one is + + + var alpha = m[4]; + + if (alpha !== undefined) { + alpha = parseFloat(alpha); + + if (alpha < 0 || alpha > 1) { + return; + } // invalid alpha value + + + ret.push(alpha); + } + } + + return ret; + }; + var colorname2tuple = function colorname2tuple(color) { + return colors[color.toLowerCase()]; + }; + var color2tuple = function color2tuple(color) { + return (array(color) ? color : null) || colorname2tuple(color) || hex2tuple(color) || rgb2tuple(color) || hsl2tuple(color); + }; + var colors = { + // special colour names + transparent: [0, 0, 0, 0], + // NB alpha === 0 + // regular colours + aliceblue: [240, 248, 255], + antiquewhite: [250, 235, 215], + aqua: [0, 255, 255], + aquamarine: [127, 255, 212], + azure: [240, 255, 255], + beige: [245, 245, 220], + bisque: [255, 228, 196], + black: [0, 0, 0], + blanchedalmond: [255, 235, 205], + blue: [0, 0, 255], + blueviolet: [138, 43, 226], + brown: [165, 42, 42], + burlywood: [222, 184, 135], + cadetblue: [95, 158, 160], + chartreuse: [127, 255, 0], + chocolate: [210, 105, 30], + coral: [255, 127, 80], + cornflowerblue: [100, 149, 237], + cornsilk: [255, 248, 220], + crimson: [220, 20, 60], + cyan: [0, 255, 255], + darkblue: [0, 0, 139], + darkcyan: [0, 139, 139], + darkgoldenrod: [184, 134, 11], + darkgray: [169, 169, 169], + darkgreen: [0, 100, 0], + darkgrey: [169, 169, 169], + darkkhaki: [189, 183, 107], + darkmagenta: [139, 0, 139], + darkolivegreen: [85, 107, 47], + darkorange: [255, 140, 0], + darkorchid: [153, 50, 204], + darkred: [139, 0, 0], + darksalmon: [233, 150, 122], + darkseagreen: [143, 188, 143], + darkslateblue: [72, 61, 139], + darkslategray: [47, 79, 79], + darkslategrey: [47, 79, 79], + darkturquoise: [0, 206, 209], + darkviolet: [148, 0, 211], + deeppink: [255, 20, 147], + deepskyblue: [0, 191, 255], + dimgray: [105, 105, 105], + dimgrey: [105, 105, 105], + dodgerblue: [30, 144, 255], + firebrick: [178, 34, 34], + floralwhite: [255, 250, 240], + forestgreen: [34, 139, 34], + fuchsia: [255, 0, 255], + gainsboro: [220, 220, 220], + ghostwhite: [248, 248, 255], + gold: [255, 215, 0], + goldenrod: [218, 165, 32], + gray: [128, 128, 128], + grey: [128, 128, 128], + green: [0, 128, 0], + greenyellow: [173, 255, 47], + honeydew: [240, 255, 240], + hotpink: [255, 105, 180], + indianred: [205, 92, 92], + indigo: [75, 0, 130], + ivory: [255, 255, 240], + khaki: [240, 230, 140], + lavender: [230, 230, 250], + lavenderblush: [255, 240, 245], + lawngreen: [124, 252, 0], + lemonchiffon: [255, 250, 205], + lightblue: [173, 216, 230], + lightcoral: [240, 128, 128], + lightcyan: [224, 255, 255], + lightgoldenrodyellow: [250, 250, 210], + lightgray: [211, 211, 211], + lightgreen: [144, 238, 144], + lightgrey: [211, 211, 211], + lightpink: [255, 182, 193], + lightsalmon: [255, 160, 122], + lightseagreen: [32, 178, 170], + lightskyblue: [135, 206, 250], + lightslategray: [119, 136, 153], + lightslategrey: [119, 136, 153], + lightsteelblue: [176, 196, 222], + lightyellow: [255, 255, 224], + lime: [0, 255, 0], + limegreen: [50, 205, 50], + linen: [250, 240, 230], + magenta: [255, 0, 255], + maroon: [128, 0, 0], + mediumaquamarine: [102, 205, 170], + mediumblue: [0, 0, 205], + mediumorchid: [186, 85, 211], + mediumpurple: [147, 112, 219], + mediumseagreen: [60, 179, 113], + mediumslateblue: [123, 104, 238], + mediumspringgreen: [0, 250, 154], + mediumturquoise: [72, 209, 204], + mediumvioletred: [199, 21, 133], + midnightblue: [25, 25, 112], + mintcream: [245, 255, 250], + mistyrose: [255, 228, 225], + moccasin: [255, 228, 181], + navajowhite: [255, 222, 173], + navy: [0, 0, 128], + oldlace: [253, 245, 230], + olive: [128, 128, 0], + olivedrab: [107, 142, 35], + orange: [255, 165, 0], + orangered: [255, 69, 0], + orchid: [218, 112, 214], + palegoldenrod: [238, 232, 170], + palegreen: [152, 251, 152], + paleturquoise: [175, 238, 238], + palevioletred: [219, 112, 147], + papayawhip: [255, 239, 213], + peachpuff: [255, 218, 185], + peru: [205, 133, 63], + pink: [255, 192, 203], + plum: [221, 160, 221], + powderblue: [176, 224, 230], + purple: [128, 0, 128], + red: [255, 0, 0], + rosybrown: [188, 143, 143], + royalblue: [65, 105, 225], + saddlebrown: [139, 69, 19], + salmon: [250, 128, 114], + sandybrown: [244, 164, 96], + seagreen: [46, 139, 87], + seashell: [255, 245, 238], + sienna: [160, 82, 45], + silver: [192, 192, 192], + skyblue: [135, 206, 235], + slateblue: [106, 90, 205], + slategray: [112, 128, 144], + slategrey: [112, 128, 144], + snow: [255, 250, 250], + springgreen: [0, 255, 127], + steelblue: [70, 130, 180], + tan: [210, 180, 140], + teal: [0, 128, 128], + thistle: [216, 191, 216], + tomato: [255, 99, 71], + turquoise: [64, 224, 208], + violet: [238, 130, 238], + wheat: [245, 222, 179], + white: [255, 255, 255], + whitesmoke: [245, 245, 245], + yellow: [255, 255, 0], + yellowgreen: [154, 205, 50] + }; + + var setMap = function setMap(options) { + var obj = options.map; + var keys = options.keys; + var l = keys.length; + + for (var i = 0; i < l; i++) { + var key = keys[i]; + + if (plainObject(key)) { + throw Error('Tried to set map with object key'); + } + + if (i < keys.length - 1) { + // extend the map if necessary + if (obj[key] == null) { + obj[key] = {}; + } + + obj = obj[key]; + } else { + // set the value + obj[key] = options.value; + } + } + }; // gets the value in a map even if it's not built in places + + var getMap = function getMap(options) { + var obj = options.map; + var keys = options.keys; + var l = keys.length; + + for (var i = 0; i < l; i++) { + var key = keys[i]; + + if (plainObject(key)) { + throw Error('Tried to get map with object key'); + } + + obj = obj[key]; + + if (obj == null) { + return obj; + } + } + + return obj; + }; // deletes the entry in the map + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + var isObject_1 = isObject; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; + + var _freeGlobal = freeGlobal; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = _freeGlobal || freeSelf || Function('return this')(); + + var _root = root; + + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = function() { + return _root.Date.now(); + }; + + var now_1 = now; + + /** Used to match a single whitespace character. */ + var reWhitespace = /\s/; + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ + function trimmedEndIndex(string) { + var index = string.length; + + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; + } + + var _trimmedEndIndex = trimmedEndIndex; + + /** Used to match leading whitespace. */ + var reTrimStart = /^\s+/; + + /** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ + function baseTrim(string) { + return string + ? string.slice(0, _trimmedEndIndex(string) + 1).replace(reTrimStart, '') + : string; + } + + var _baseTrim = baseTrim; + + /** Built-in value references. */ + var Symbol$1 = _root.Symbol; + + var _Symbol = Symbol$1; + + /** Used for built-in method references. */ + var objectProto$5 = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty$4 = objectProto$5.hasOwnProperty; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString$1 = objectProto$5.toString; + + /** Built-in value references. */ + var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined; + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty$4.call(value, symToStringTag$1), + tag = value[symToStringTag$1]; + + try { + value[symToStringTag$1] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString$1.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag$1] = tag; + } else { + delete value[symToStringTag$1]; + } + } + return result; + } + + var _getRawTag = getRawTag; + + /** Used for built-in method references. */ + var objectProto$4 = Object.prototype; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto$4.toString; + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + var _objectToString = objectToString; + + /** `Object#toString` result references. */ + var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + + /** Built-in value references. */ + var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? _getRawTag(value) + : _objectToString(value); + } + + var _baseGetTag = baseGetTag; + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + var isObjectLike_1 = isObjectLike; + + /** `Object#toString` result references. */ + var symbolTag = '[object Symbol]'; + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike_1(value) && _baseGetTag(value) == symbolTag); + } + + var isSymbol_1 = isSymbol; + + /** Used as references for various `Number` constants. */ + var NAN = 0 / 0; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Built-in method references without a dependency on `root`. */ + var freeParseInt = parseInt; + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol_1(value)) { + return NAN; + } + if (isObject_1(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject_1(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = _baseTrim(value); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + var toNumber_1 = toNumber; + + /** Error message constants. */ + var FUNC_ERROR_TEXT$1 = 'Expected a function'; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeMax = Math.max, + nativeMin = Math.min; + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT$1); + } + wait = toNumber_1(wait) || 0; + if (isObject_1(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber_1(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now_1(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now_1()); + } + + function debounced() { + var time = now_1(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + + var debounce_1 = debounce; + + var performance = _window ? _window.performance : null; + var pnow = performance && performance.now ? function () { + return performance.now(); + } : function () { + return Date.now(); + }; + + var raf = function () { + if (_window) { + if (_window.requestAnimationFrame) { + return function (fn) { + _window.requestAnimationFrame(fn); + }; + } else if (_window.mozRequestAnimationFrame) { + return function (fn) { + _window.mozRequestAnimationFrame(fn); + }; + } else if (_window.webkitRequestAnimationFrame) { + return function (fn) { + _window.webkitRequestAnimationFrame(fn); + }; + } else if (_window.msRequestAnimationFrame) { + return function (fn) { + _window.msRequestAnimationFrame(fn); + }; + } + } + + return function (fn) { + if (fn) { + setTimeout(function () { + fn(pnow()); + }, 1000 / 60); + } + }; + }(); + + var requestAnimationFrame = function requestAnimationFrame(fn) { + return raf(fn); + }; + var performanceNow = pnow; + + var DEFAULT_HASH_SEED = 9261; + var K = 65599; // 37 also works pretty well + + var DEFAULT_HASH_SEED_ALT = 5381; + var hashIterableInts = function hashIterableInts(iterator) { + var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED; + // sdbm/string-hash + var hash = seed; + var entry; + + for (;;) { + entry = iterator.next(); + + if (entry.done) { + break; + } + + hash = hash * K + entry.value | 0; + } + + return hash; + }; + var hashInt = function hashInt(num) { + var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED; + // sdbm/string-hash + return seed * K + num | 0; + }; + var hashIntAlt = function hashIntAlt(num) { + var seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_HASH_SEED_ALT; + // djb2/string-hash + return (seed << 5) + seed + num | 0; + }; + var combineHashes = function combineHashes(hash1, hash2) { + return hash1 * 0x200000 + hash2; + }; + var combineHashesArray = function combineHashesArray(hashes) { + return hashes[0] * 0x200000 + hashes[1]; + }; + var hashArrays = function hashArrays(hashes1, hashes2) { + return [hashInt(hashes1[0], hashes2[0]), hashIntAlt(hashes1[1], hashes2[1])]; + }; + var hashIntsArray = function hashIntsArray(ints, seed) { + var entry = { + value: 0, + done: false + }; + var i = 0; + var length = ints.length; + var iterator = { + next: function next() { + if (i < length) { + entry.value = ints[i++]; + } else { + entry.done = true; + } + + return entry; + } + }; + return hashIterableInts(iterator, seed); + }; + var hashString = function hashString(str, seed) { + var entry = { + value: 0, + done: false + }; + var i = 0; + var length = str.length; + var iterator = { + next: function next() { + if (i < length) { + entry.value = str.charCodeAt(i++); + } else { + entry.done = true; + } + + return entry; + } + }; + return hashIterableInts(iterator, seed); + }; + var hashStrings = function hashStrings() { + return hashStringsArray(arguments); + }; + var hashStringsArray = function hashStringsArray(strs) { + var hash; + + for (var i = 0; i < strs.length; i++) { + var str = strs[i]; + + if (i === 0) { + hash = hashString(str); + } else { + hash = hashString(str, hash); + } + } + + return hash; + }; + + /*global console */ + var warningsEnabled = true; + var warnSupported = console.warn != null; // eslint-disable-line no-console + + var traceSupported = console.trace != null; // eslint-disable-line no-console + + var MAX_INT$1 = Number.MAX_SAFE_INTEGER || 9007199254740991; + var trueify = function trueify() { + return true; + }; + var falsify = function falsify() { + return false; + }; + var zeroify = function zeroify() { + return 0; + }; + var noop$1 = function noop() {}; + var error = function error(msg) { + throw new Error(msg); + }; + var warnings = function warnings(enabled) { + if (enabled !== undefined) { + warningsEnabled = !!enabled; + } else { + return warningsEnabled; + } + }; + var warn = function warn(msg) { + /* eslint-disable no-console */ + if (!warnings()) { + return; + } + + if (warnSupported) { + console.warn(msg); + } else { + console.log(msg); + + if (traceSupported) { + console.trace(); + } + } + }; + /* eslint-enable */ + + var clone = function clone(obj) { + return extend({}, obj); + }; // gets a shallow copy of the argument + + var copy = function copy(obj) { + if (obj == null) { + return obj; + } + + if (array(obj)) { + return obj.slice(); + } else if (plainObject(obj)) { + return clone(obj); + } else { + return obj; + } + }; + var copyArray$1 = function copyArray(arr) { + return arr.slice(); + }; + var uuid = function uuid(a, b + /* placeholders */ + ) { + for ( // loop :) + b = a = ''; // b - result , a - numeric letiable + a++ < 36; // + b += a * 51 & 52 // if "a" is not 9 or 14 or 19 or 24 + ? // return a random number or 4 + (a ^ 15 // if "a" is not 15 + ? // generate a random number from 0 to 15 + 8 ^ Math.random() * (a ^ 20 ? 16 : 4) // unless "a" is 20, in which case a random number from 8 to 11 + : 4 // otherwise 4 + ).toString(16) : '-' // in other cases (if "a" is 9,14,19,24) insert "-" + ) { + } + + return b; + }; + var _staticEmptyObject = {}; + var staticEmptyObject = function staticEmptyObject() { + return _staticEmptyObject; + }; + var defaults$g = function defaults(_defaults) { + var keys = Object.keys(_defaults); + return function (opts) { + var filledOpts = {}; + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var optVal = opts == null ? undefined : opts[key]; + filledOpts[key] = optVal === undefined ? _defaults[key] : optVal; + } + + return filledOpts; + }; + }; + var removeFromArray = function removeFromArray(arr, ele, oneCopy) { + for (var i = arr.length - 1; i >= 0; i--) { + if (arr[i] === ele) { + arr.splice(i, 1); + + if (oneCopy) { + break; + } + } + } + }; + var clearArray = function clearArray(arr) { + arr.splice(0, arr.length); + }; + var push = function push(arr, otherArr) { + for (var i = 0; i < otherArr.length; i++) { + var el = otherArr[i]; + arr.push(el); + } + }; + var getPrefixedProperty = function getPrefixedProperty(obj, propName, prefix) { + if (prefix) { + propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth + } + + return obj[propName]; + }; + var setPrefixedProperty = function setPrefixedProperty(obj, propName, prefix, value) { + if (prefix) { + propName = prependCamel(prefix, propName); // e.g. (labelWidth, source) => sourceLabelWidth + } + + obj[propName] = value; + }; + + /* global Map */ + var ObjectMap = /*#__PURE__*/function () { + function ObjectMap() { + _classCallCheck(this, ObjectMap); + + this._obj = {}; + } + + _createClass(ObjectMap, [{ + key: "set", + value: function set(key, val) { + this._obj[key] = val; + return this; + } + }, { + key: "delete", + value: function _delete(key) { + this._obj[key] = undefined; + return this; + } + }, { + key: "clear", + value: function clear() { + this._obj = {}; + } + }, { + key: "has", + value: function has(key) { + return this._obj[key] !== undefined; + } + }, { + key: "get", + value: function get(key) { + return this._obj[key]; + } + }]); + + return ObjectMap; + }(); + + var Map$2 = typeof Map !== 'undefined' ? Map : ObjectMap; + + /* global Set */ + var undef = "undefined" ; + + var ObjectSet = /*#__PURE__*/function () { + function ObjectSet(arrayOrObjectSet) { + _classCallCheck(this, ObjectSet); + + this._obj = Object.create(null); + this.size = 0; + + if (arrayOrObjectSet != null) { + var arr; + + if (arrayOrObjectSet.instanceString != null && arrayOrObjectSet.instanceString() === this.instanceString()) { + arr = arrayOrObjectSet.toArray(); + } else { + arr = arrayOrObjectSet; + } + + for (var i = 0; i < arr.length; i++) { + this.add(arr[i]); + } + } + } + + _createClass(ObjectSet, [{ + key: "instanceString", + value: function instanceString() { + return 'set'; + } + }, { + key: "add", + value: function add(val) { + var o = this._obj; + + if (o[val] !== 1) { + o[val] = 1; + this.size++; + } + } + }, { + key: "delete", + value: function _delete(val) { + var o = this._obj; + + if (o[val] === 1) { + o[val] = 0; + this.size--; + } + } + }, { + key: "clear", + value: function clear() { + this._obj = Object.create(null); + } + }, { + key: "has", + value: function has(val) { + return this._obj[val] === 1; + } + }, { + key: "toArray", + value: function toArray() { + var _this = this; + + return Object.keys(this._obj).filter(function (key) { + return _this.has(key); + }); + } + }, { + key: "forEach", + value: function forEach(callback, thisArg) { + return this.toArray().forEach(callback, thisArg); + } + }]); + + return ObjectSet; + }(); + + var Set$1 = (typeof Set === "undefined" ? "undefined" : _typeof(Set)) !== undef ? Set : ObjectSet; + + var Element = function Element(cy, params) { + var restore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + if (cy === undefined || params === undefined || !core(cy)) { + error('An element must have a core reference and parameters set'); + return; + } + + var group = params.group; // try to automatically infer the group if unspecified + + if (group == null) { + if (params.data && params.data.source != null && params.data.target != null) { + group = 'edges'; + } else { + group = 'nodes'; + } + } // validate group + + + if (group !== 'nodes' && group !== 'edges') { + error('An element must be of type `nodes` or `edges`; you specified `' + group + '`'); + return; + } // make the element array-like, just like a collection + + + this.length = 1; + this[0] = this; // NOTE: when something is added here, add also to ele.json() + + var _p = this._private = { + cy: cy, + single: true, + // indicates this is an element + data: params.data || {}, + // data object + position: params.position || { + x: 0, + y: 0 + }, + // (x, y) position pair + autoWidth: undefined, + // width and height of nodes calculated by the renderer when set to special 'auto' value + autoHeight: undefined, + autoPadding: undefined, + compoundBoundsClean: false, + // whether the compound dimensions need to be recalculated the next time dimensions are read + listeners: [], + // array of bound listeners + group: group, + // string; 'nodes' or 'edges' + style: {}, + // properties as set by the style + rstyle: {}, + // properties for style sent from the renderer to the core + styleCxts: [], + // applied style contexts from the styler + styleKeys: {}, + // per-group keys of style property values + removed: true, + // whether it's inside the vis; true if removed (set true here since we call restore) + selected: params.selected ? true : false, + // whether it's selected + selectable: params.selectable === undefined ? true : params.selectable ? true : false, + // whether it's selectable + locked: params.locked ? true : false, + // whether the element is locked (cannot be moved) + grabbed: false, + // whether the element is grabbed by the mouse; renderer sets this privately + grabbable: params.grabbable === undefined ? true : params.grabbable ? true : false, + // whether the element can be grabbed + pannable: params.pannable === undefined ? group === 'edges' ? true : false : params.pannable ? true : false, + // whether the element has passthrough panning enabled + active: false, + // whether the element is active from user interaction + classes: new Set$1(), + // map ( className => true ) + animation: { + // object for currently-running animations + current: [], + queue: [] + }, + rscratch: {}, + // object in which the renderer can store information + scratch: params.scratch || {}, + // scratch objects + edges: [], + // array of connected edges + children: [], + // array of children + parent: params.parent && params.parent.isNode() ? params.parent : null, + // parent ref + traversalCache: {}, + // cache of output of traversal functions + backgrounding: false, + // whether background images are loading + bbCache: null, + // cache of the current bounding box + bbCacheShift: { + x: 0, + y: 0 + }, + // shift applied to cached bb to be applied on next get + bodyBounds: null, + // bounds cache of element body, w/o overlay + overlayBounds: null, + // bounds cache of element body, including overlay + labelBounds: { + // bounds cache of labels + all: null, + source: null, + target: null, + main: null + }, + arrowBounds: { + // bounds cache of edge arrows + source: null, + target: null, + 'mid-source': null, + 'mid-target': null + } + }; + + if (_p.position.x == null) { + _p.position.x = 0; + } + + if (_p.position.y == null) { + _p.position.y = 0; + } // renderedPosition overrides if specified + + + if (params.renderedPosition) { + var rpos = params.renderedPosition; + var pan = cy.pan(); + var zoom = cy.zoom(); + _p.position = { + x: (rpos.x - pan.x) / zoom, + y: (rpos.y - pan.y) / zoom + }; + } + + var classes = []; + + if (array(params.classes)) { + classes = params.classes; + } else if (string(params.classes)) { + classes = params.classes.split(/\s+/); + } + + for (var i = 0, l = classes.length; i < l; i++) { + var cls = classes[i]; + + if (!cls || cls === '') { + continue; + } + + _p.classes.add(cls); + } + + this.createEmitter(); + var bypass = params.style || params.css; + + if (bypass) { + warn('Setting a `style` bypass at element creation should be done only when absolutely necessary. Try to use the stylesheet instead.'); + this.style(bypass); + } + + if (restore === undefined || restore) { + this.restore(); + } + }; + + var defineSearch = function defineSearch(params) { + params = { + bfs: params.bfs || !params.dfs, + dfs: params.dfs || !params.bfs + }; // from pseudocode on wikipedia + + return function searchFn(roots, fn, directed) { + var options; + + if (plainObject(roots) && !elementOrCollection(roots)) { + options = roots; + roots = options.roots || options.root; + fn = options.visit; + directed = options.directed; + } + + directed = arguments.length === 2 && !fn$6(fn) ? fn : directed; + fn = fn$6(fn) ? fn : function () {}; + var cy = this._private.cy; + var v = roots = string(roots) ? this.filter(roots) : roots; + var Q = []; + var connectedNodes = []; + var connectedBy = {}; + var id2depth = {}; + var V = {}; + var j = 0; + var found; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; // enqueue v + + + for (var i = 0; i < v.length; i++) { + var vi = v[i]; + var viId = vi.id(); + + if (vi.isNode()) { + Q.unshift(vi); + + if (params.bfs) { + V[viId] = true; + connectedNodes.push(vi); + } + + id2depth[viId] = 0; + } + } + + var _loop = function _loop() { + var v = params.bfs ? Q.shift() : Q.pop(); + var vId = v.id(); + + if (params.dfs) { + if (V[vId]) { + return "continue"; + } + + V[vId] = true; + connectedNodes.push(v); + } + + var depth = id2depth[vId]; + var prevEdge = connectedBy[vId]; + var src = prevEdge != null ? prevEdge.source() : null; + var tgt = prevEdge != null ? prevEdge.target() : null; + var prevNode = prevEdge == null ? undefined : v.same(src) ? tgt[0] : src[0]; + var ret = void 0; + ret = fn(v, prevEdge, prevNode, j++, depth); + + if (ret === true) { + found = v; + return "break"; + } + + if (ret === false) { + return "break"; + } + + var vwEdges = v.connectedEdges().filter(function (e) { + return (!directed || e.source().same(v)) && edges.has(e); + }); + + for (var _i2 = 0; _i2 < vwEdges.length; _i2++) { + var e = vwEdges[_i2]; + var w = e.connectedNodes().filter(function (n) { + return !n.same(v) && nodes.has(n); + }); + var wId = w.id(); + + if (w.length !== 0 && !V[wId]) { + w = w[0]; + Q.push(w); + + if (params.bfs) { + V[wId] = true; + connectedNodes.push(w); + } + + connectedBy[wId] = e; + id2depth[wId] = id2depth[vId] + 1; + } + } + }; + + while (Q.length !== 0) { + var _ret = _loop(); + + if (_ret === "continue") continue; + if (_ret === "break") break; + } + + var connectedEles = cy.collection(); + + for (var _i = 0; _i < connectedNodes.length; _i++) { + var node = connectedNodes[_i]; + var edge = connectedBy[node.id()]; + + if (edge != null) { + connectedEles.push(edge); + } + + connectedEles.push(node); + } + + return { + path: cy.collection(connectedEles), + found: cy.collection(found) + }; + }; + }; // search, spanning trees, etc + + + var elesfn$v = { + breadthFirstSearch: defineSearch({ + bfs: true + }), + depthFirstSearch: defineSearch({ + dfs: true + }) + }; // nice, short mathematical alias + + elesfn$v.bfs = elesfn$v.breadthFirstSearch; + elesfn$v.dfs = elesfn$v.depthFirstSearch; + + var heap$1 = createCommonjsModule(function (module, exports) { + // Generated by CoffeeScript 1.8.0 + (function() { + var Heap, defaultCmp, floor, heapify, heappop, heappush, heappushpop, heapreplace, insort, min, nlargest, nsmallest, updateItem, _siftdown, _siftup; + + floor = Math.floor, min = Math.min; + + + /* + Default comparison function to be used + */ + + defaultCmp = function(x, y) { + if (x < y) { + return -1; + } + if (x > y) { + return 1; + } + return 0; + }; + + + /* + Insert item x in list a, and keep it sorted assuming a is sorted. + + If x is already in a, insert it to the right of the rightmost x. + + Optional args lo (default 0) and hi (default a.length) bound the slice + of a to be searched. + */ + + insort = function(a, x, lo, hi, cmp) { + var mid; + if (lo == null) { + lo = 0; + } + if (cmp == null) { + cmp = defaultCmp; + } + if (lo < 0) { + throw new Error('lo must be non-negative'); + } + if (hi == null) { + hi = a.length; + } + while (lo < hi) { + mid = floor((lo + hi) / 2); + if (cmp(x, a[mid]) < 0) { + hi = mid; + } else { + lo = mid + 1; + } + } + return ([].splice.apply(a, [lo, lo - lo].concat(x)), x); + }; + + + /* + Push item onto heap, maintaining the heap invariant. + */ + + heappush = function(array, item, cmp) { + if (cmp == null) { + cmp = defaultCmp; + } + array.push(item); + return _siftdown(array, 0, array.length - 1, cmp); + }; + + + /* + Pop the smallest item off the heap, maintaining the heap invariant. + */ + + heappop = function(array, cmp) { + var lastelt, returnitem; + if (cmp == null) { + cmp = defaultCmp; + } + lastelt = array.pop(); + if (array.length) { + returnitem = array[0]; + array[0] = lastelt; + _siftup(array, 0, cmp); + } else { + returnitem = lastelt; + } + return returnitem; + }; + + + /* + Pop and return the current smallest value, and add the new item. + + This is more efficient than heappop() followed by heappush(), and can be + more appropriate when using a fixed size heap. Note that the value + returned may be larger than item! That constrains reasonable use of + this routine unless written as part of a conditional replacement: + if item > array[0] + item = heapreplace(array, item) + */ + + heapreplace = function(array, item, cmp) { + var returnitem; + if (cmp == null) { + cmp = defaultCmp; + } + returnitem = array[0]; + array[0] = item; + _siftup(array, 0, cmp); + return returnitem; + }; + + + /* + Fast version of a heappush followed by a heappop. + */ + + heappushpop = function(array, item, cmp) { + var _ref; + if (cmp == null) { + cmp = defaultCmp; + } + if (array.length && cmp(array[0], item) < 0) { + _ref = [array[0], item], item = _ref[0], array[0] = _ref[1]; + _siftup(array, 0, cmp); + } + return item; + }; + + + /* + Transform list into a heap, in-place, in O(array.length) time. + */ + + heapify = function(array, cmp) { + var i, _i, _len, _ref1, _results, _results1; + if (cmp == null) { + cmp = defaultCmp; + } + _ref1 = (function() { + _results1 = []; + for (var _j = 0, _ref = floor(array.length / 2); 0 <= _ref ? _j < _ref : _j > _ref; 0 <= _ref ? _j++ : _j--){ _results1.push(_j); } + return _results1; + }).apply(this).reverse(); + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + i = _ref1[_i]; + _results.push(_siftup(array, i, cmp)); + } + return _results; + }; + + + /* + Update the position of the given item in the heap. + This function should be called every time the item is being modified. + */ + + updateItem = function(array, item, cmp) { + var pos; + if (cmp == null) { + cmp = defaultCmp; + } + pos = array.indexOf(item); + if (pos === -1) { + return; + } + _siftdown(array, 0, pos, cmp); + return _siftup(array, pos, cmp); + }; + + + /* + Find the n largest elements in a dataset. + */ + + nlargest = function(array, n, cmp) { + var elem, result, _i, _len, _ref; + if (cmp == null) { + cmp = defaultCmp; + } + result = array.slice(0, n); + if (!result.length) { + return result; + } + heapify(result, cmp); + _ref = array.slice(n); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + elem = _ref[_i]; + heappushpop(result, elem, cmp); + } + return result.sort(cmp).reverse(); + }; + + + /* + Find the n smallest elements in a dataset. + */ + + nsmallest = function(array, n, cmp) { + var elem, los, result, _i, _j, _len, _ref, _ref1, _results; + if (cmp == null) { + cmp = defaultCmp; + } + if (n * 10 <= array.length) { + result = array.slice(0, n).sort(cmp); + if (!result.length) { + return result; + } + los = result[result.length - 1]; + _ref = array.slice(n); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + elem = _ref[_i]; + if (cmp(elem, los) < 0) { + insort(result, elem, 0, null, cmp); + result.pop(); + los = result[result.length - 1]; + } + } + return result; + } + heapify(array, cmp); + _results = []; + for (_j = 0, _ref1 = min(n, array.length); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; 0 <= _ref1 ? ++_j : --_j) { + _results.push(heappop(array, cmp)); + } + return _results; + }; + + _siftdown = function(array, startpos, pos, cmp) { + var newitem, parent, parentpos; + if (cmp == null) { + cmp = defaultCmp; + } + newitem = array[pos]; + while (pos > startpos) { + parentpos = (pos - 1) >> 1; + parent = array[parentpos]; + if (cmp(newitem, parent) < 0) { + array[pos] = parent; + pos = parentpos; + continue; + } + break; + } + return array[pos] = newitem; + }; + + _siftup = function(array, pos, cmp) { + var childpos, endpos, newitem, rightpos, startpos; + if (cmp == null) { + cmp = defaultCmp; + } + endpos = array.length; + startpos = pos; + newitem = array[pos]; + childpos = 2 * pos + 1; + while (childpos < endpos) { + rightpos = childpos + 1; + if (rightpos < endpos && !(cmp(array[childpos], array[rightpos]) < 0)) { + childpos = rightpos; + } + array[pos] = array[childpos]; + pos = childpos; + childpos = 2 * pos + 1; + } + array[pos] = newitem; + return _siftdown(array, startpos, pos, cmp); + }; + + Heap = (function() { + Heap.push = heappush; + + Heap.pop = heappop; + + Heap.replace = heapreplace; + + Heap.pushpop = heappushpop; + + Heap.heapify = heapify; + + Heap.updateItem = updateItem; + + Heap.nlargest = nlargest; + + Heap.nsmallest = nsmallest; + + function Heap(cmp) { + this.cmp = cmp != null ? cmp : defaultCmp; + this.nodes = []; + } + + Heap.prototype.push = function(x) { + return heappush(this.nodes, x, this.cmp); + }; + + Heap.prototype.pop = function() { + return heappop(this.nodes, this.cmp); + }; + + Heap.prototype.peek = function() { + return this.nodes[0]; + }; + + Heap.prototype.contains = function(x) { + return this.nodes.indexOf(x) !== -1; + }; + + Heap.prototype.replace = function(x) { + return heapreplace(this.nodes, x, this.cmp); + }; + + Heap.prototype.pushpop = function(x) { + return heappushpop(this.nodes, x, this.cmp); + }; + + Heap.prototype.heapify = function() { + return heapify(this.nodes, this.cmp); + }; + + Heap.prototype.updateItem = function(x) { + return updateItem(this.nodes, x, this.cmp); + }; + + Heap.prototype.clear = function() { + return this.nodes = []; + }; + + Heap.prototype.empty = function() { + return this.nodes.length === 0; + }; + + Heap.prototype.size = function() { + return this.nodes.length; + }; + + Heap.prototype.clone = function() { + var heap; + heap = new Heap(); + heap.nodes = this.nodes.slice(0); + return heap; + }; + + Heap.prototype.toArray = function() { + return this.nodes.slice(0); + }; + + Heap.prototype.insert = Heap.prototype.push; + + Heap.prototype.top = Heap.prototype.peek; + + Heap.prototype.front = Heap.prototype.peek; + + Heap.prototype.has = Heap.prototype.contains; + + Heap.prototype.copy = Heap.prototype.clone; + + return Heap; + + })(); + + (function(root, factory) { + { + return module.exports = factory(); + } + })(this, function() { + return Heap; + }); + + }).call(commonjsGlobal); + }); + + var heap = heap$1; + + var dijkstraDefaults = defaults$g({ + root: null, + weight: function weight(edge) { + return 1; + }, + directed: false + }); + var elesfn$u = { + dijkstra: function dijkstra(options) { + if (!plainObject(options)) { + var args = arguments; + options = { + root: args[0], + weight: args[1], + directed: args[2] + }; + } + + var _dijkstraDefaults = dijkstraDefaults(options), + root = _dijkstraDefaults.root, + weight = _dijkstraDefaults.weight, + directed = _dijkstraDefaults.directed; + + var eles = this; + var weightFn = weight; + var source = string(root) ? this.filter(root)[0] : root[0]; + var dist = {}; + var prev = {}; + var knownDist = {}; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + edges.unmergeBy(function (ele) { + return ele.isLoop(); + }); + + var getDist = function getDist(node) { + return dist[node.id()]; + }; + + var setDist = function setDist(node, d) { + dist[node.id()] = d; + Q.updateItem(node); + }; + + var Q = new heap(function (a, b) { + return getDist(a) - getDist(b); + }); + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + dist[node.id()] = node.same(source) ? 0 : Infinity; + Q.push(node); + } + + var distBetween = function distBetween(u, v) { + var uvs = (directed ? u.edgesTo(v) : u.edgesWith(v)).intersect(edges); + var smallestDistance = Infinity; + var smallestEdge; + + for (var _i = 0; _i < uvs.length; _i++) { + var edge = uvs[_i]; + + var _weight = weightFn(edge); + + if (_weight < smallestDistance || !smallestEdge) { + smallestDistance = _weight; + smallestEdge = edge; + } + } + + return { + edge: smallestEdge, + dist: smallestDistance + }; + }; + + while (Q.size() > 0) { + var u = Q.pop(); + var smalletsDist = getDist(u); + var uid = u.id(); + knownDist[uid] = smalletsDist; + + if (smalletsDist === Infinity) { + continue; + } + + var neighbors = u.neighborhood().intersect(nodes); + + for (var _i2 = 0; _i2 < neighbors.length; _i2++) { + var v = neighbors[_i2]; + var vid = v.id(); + var vDist = distBetween(u, v); + var alt = smalletsDist + vDist.dist; + + if (alt < getDist(v)) { + setDist(v, alt); + prev[vid] = { + node: u, + edge: vDist.edge + }; + } + } // for + + } // while + + + return { + distanceTo: function distanceTo(node) { + var target = string(node) ? nodes.filter(node)[0] : node[0]; + return knownDist[target.id()]; + }, + pathTo: function pathTo(node) { + var target = string(node) ? nodes.filter(node)[0] : node[0]; + var S = []; + var u = target; + var uid = u.id(); + + if (target.length > 0) { + S.unshift(target); + + while (prev[uid]) { + var p = prev[uid]; + S.unshift(p.edge); + S.unshift(p.node); + u = p.node; + uid = u.id(); + } + } + + return eles.spawn(S); + } + }; + } + }; + + var elesfn$t = { + // kruskal's algorithm (finds min spanning tree, assuming undirected graph) + // implemented from pseudocode from wikipedia + kruskal: function kruskal(weightFn) { + weightFn = weightFn || function (edge) { + return 1; + }; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + var numNodes = nodes.length; + var forest = new Array(numNodes); + var A = nodes; // assumes byGroup() creates new collections that can be safely mutated + + var findSetIndex = function findSetIndex(ele) { + for (var i = 0; i < forest.length; i++) { + var eles = forest[i]; + + if (eles.has(ele)) { + return i; + } + } + }; // start with one forest per node + + + for (var i = 0; i < numNodes; i++) { + forest[i] = this.spawn(nodes[i]); + } + + var S = edges.sort(function (a, b) { + return weightFn(a) - weightFn(b); + }); + + for (var _i = 0; _i < S.length; _i++) { + var edge = S[_i]; + var u = edge.source()[0]; + var v = edge.target()[0]; + var setUIndex = findSetIndex(u); + var setVIndex = findSetIndex(v); + var setU = forest[setUIndex]; + var setV = forest[setVIndex]; + + if (setUIndex !== setVIndex) { + A.merge(edge); // combine forests for u and v + + setU.merge(setV); + forest.splice(setVIndex, 1); + } + } + + return A; + } + }; + + var aStarDefaults = defaults$g({ + root: null, + goal: null, + weight: function weight(edge) { + return 1; + }, + heuristic: function heuristic(edge) { + return 0; + }, + directed: false + }); + var elesfn$s = { + // Implemented from pseudocode from wikipedia + aStar: function aStar(options) { + var cy = this.cy(); + + var _aStarDefaults = aStarDefaults(options), + root = _aStarDefaults.root, + goal = _aStarDefaults.goal, + heuristic = _aStarDefaults.heuristic, + directed = _aStarDefaults.directed, + weight = _aStarDefaults.weight; + + root = cy.collection(root)[0]; + goal = cy.collection(goal)[0]; + var sid = root.id(); + var tid = goal.id(); + var gScore = {}; + var fScore = {}; + var closedSetIds = {}; + var openSet = new heap(function (a, b) { + return fScore[a.id()] - fScore[b.id()]; + }); + var openSetIds = new Set$1(); + var cameFrom = {}; + var cameFromEdge = {}; + + var addToOpenSet = function addToOpenSet(ele, id) { + openSet.push(ele); + openSetIds.add(id); + }; + + var cMin, cMinId; + + var popFromOpenSet = function popFromOpenSet() { + cMin = openSet.pop(); + cMinId = cMin.id(); + openSetIds["delete"](cMinId); + }; + + var isInOpenSet = function isInOpenSet(id) { + return openSetIds.has(id); + }; + + addToOpenSet(root, sid); + gScore[sid] = 0; + fScore[sid] = heuristic(root); // Counter + + var steps = 0; // Main loop + + while (openSet.size() > 0) { + popFromOpenSet(); + steps++; // If we've found our goal, then we are done + + if (cMinId === tid) { + var path = []; + var pathNode = goal; + var pathNodeId = tid; + var pathEdge = cameFromEdge[pathNodeId]; + + for (;;) { + path.unshift(pathNode); + + if (pathEdge != null) { + path.unshift(pathEdge); + } + + pathNode = cameFrom[pathNodeId]; + + if (pathNode == null) { + break; + } + + pathNodeId = pathNode.id(); + pathEdge = cameFromEdge[pathNodeId]; + } + + return { + found: true, + distance: gScore[cMinId], + path: this.spawn(path), + steps: steps + }; + } // Add cMin to processed nodes + + + closedSetIds[cMinId] = true; // Update scores for neighbors of cMin + // Take into account if graph is directed or not + + var vwEdges = cMin._private.edges; + + for (var i = 0; i < vwEdges.length; i++) { + var e = vwEdges[i]; // edge must be in set of calling eles + + if (!this.hasElementWithId(e.id())) { + continue; + } // cMin must be the source of edge if directed + + + if (directed && e.data('source') !== cMinId) { + continue; + } + + var wSrc = e.source(); + var wTgt = e.target(); + var w = wSrc.id() !== cMinId ? wSrc : wTgt; + var wid = w.id(); // node must be in set of calling eles + + if (!this.hasElementWithId(wid)) { + continue; + } // if node is in closedSet, ignore it + + + if (closedSetIds[wid]) { + continue; + } // New tentative score for node w + + + var tempScore = gScore[cMinId] + weight(e); // Update gScore for node w if: + // w not present in openSet + // OR + // tentative gScore is less than previous value + // w not in openSet + + if (!isInOpenSet(wid)) { + gScore[wid] = tempScore; + fScore[wid] = tempScore + heuristic(w); + addToOpenSet(w, wid); + cameFrom[wid] = cMin; + cameFromEdge[wid] = e; + continue; + } // w already in openSet, but with greater gScore + + + if (tempScore < gScore[wid]) { + gScore[wid] = tempScore; + fScore[wid] = tempScore + heuristic(w); + cameFrom[wid] = cMin; + cameFromEdge[wid] = e; + } + } // End of neighbors update + + } // End of main loop + // If we've reached here, then we've not reached our goal + + + return { + found: false, + distance: undefined, + path: undefined, + steps: steps + }; + } + }; // elesfn + + var floydWarshallDefaults = defaults$g({ + weight: function weight(edge) { + return 1; + }, + directed: false + }); + var elesfn$r = { + // Implemented from pseudocode from wikipedia + floydWarshall: function floydWarshall(options) { + var cy = this.cy(); + + var _floydWarshallDefault = floydWarshallDefaults(options), + weight = _floydWarshallDefault.weight, + directed = _floydWarshallDefault.directed; + + var weightFn = weight; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + var N = nodes.length; + var Nsq = N * N; + + var indexOf = function indexOf(node) { + return nodes.indexOf(node); + }; + + var atIndex = function atIndex(i) { + return nodes[i]; + }; // Initialize distance matrix + + + var dist = new Array(Nsq); + + for (var n = 0; n < Nsq; n++) { + var j = n % N; + var i = (n - j) / N; + + if (i === j) { + dist[n] = 0; + } else { + dist[n] = Infinity; + } + } // Initialize matrix used for path reconstruction + // Initialize distance matrix + + + var next = new Array(Nsq); + var edgeNext = new Array(Nsq); // Process edges + + for (var _i = 0; _i < edges.length; _i++) { + var edge = edges[_i]; + var src = edge.source()[0]; + var tgt = edge.target()[0]; + + if (src === tgt) { + continue; + } // exclude loops + + + var s = indexOf(src); + var t = indexOf(tgt); + var st = s * N + t; // source to target index + + var _weight = weightFn(edge); // Check if already process another edge between same 2 nodes + + + if (dist[st] > _weight) { + dist[st] = _weight; + next[st] = t; + edgeNext[st] = edge; + } // If undirected graph, process 'reversed' edge + + + if (!directed) { + var ts = t * N + s; // target to source index + + if (!directed && dist[ts] > _weight) { + dist[ts] = _weight; + next[ts] = s; + edgeNext[ts] = edge; + } + } + } // Main loop + + + for (var k = 0; k < N; k++) { + for (var _i2 = 0; _i2 < N; _i2++) { + var ik = _i2 * N + k; + + for (var _j = 0; _j < N; _j++) { + var ij = _i2 * N + _j; + var kj = k * N + _j; + + if (dist[ik] + dist[kj] < dist[ij]) { + dist[ij] = dist[ik] + dist[kj]; + next[ij] = next[ik]; + } + } + } + } + + var getArgEle = function getArgEle(ele) { + return (string(ele) ? cy.filter(ele) : ele)[0]; + }; + + var indexOfArgEle = function indexOfArgEle(ele) { + return indexOf(getArgEle(ele)); + }; + + var res = { + distance: function distance(from, to) { + var i = indexOfArgEle(from); + var j = indexOfArgEle(to); + return dist[i * N + j]; + }, + path: function path(from, to) { + var i = indexOfArgEle(from); + var j = indexOfArgEle(to); + var fromNode = atIndex(i); + + if (i === j) { + return fromNode.collection(); + } + + if (next[i * N + j] == null) { + return cy.collection(); + } + + var path = cy.collection(); + var prev = i; + var edge; + path.merge(fromNode); + + while (i !== j) { + prev = i; + i = next[i * N + j]; + edge = edgeNext[prev * N + i]; + path.merge(edge); + path.merge(atIndex(i)); + } + + return path; + } + }; + return res; + } // floydWarshall + + }; // elesfn + + var bellmanFordDefaults = defaults$g({ + weight: function weight(edge) { + return 1; + }, + directed: false, + root: null + }); + var elesfn$q = { + // Implemented from pseudocode from wikipedia + bellmanFord: function bellmanFord(options) { + var _this = this; + + var _bellmanFordDefaults = bellmanFordDefaults(options), + weight = _bellmanFordDefaults.weight, + directed = _bellmanFordDefaults.directed, + root = _bellmanFordDefaults.root; + + var weightFn = weight; + var eles = this; + var cy = this.cy(); + + var _this$byGroup = this.byGroup(), + edges = _this$byGroup.edges, + nodes = _this$byGroup.nodes; + + var numNodes = nodes.length; + var infoMap = new Map$2(); + var hasNegativeWeightCycle = false; + var negativeWeightCycles = []; + root = cy.collection(root)[0]; // in case selector passed + + edges.unmergeBy(function (edge) { + return edge.isLoop(); + }); + var numEdges = edges.length; + + var getInfo = function getInfo(node) { + var obj = infoMap.get(node.id()); + + if (!obj) { + obj = {}; + infoMap.set(node.id(), obj); + } + + return obj; + }; + + var getNodeFromTo = function getNodeFromTo(to) { + return (string(to) ? cy.$(to) : to)[0]; + }; + + var distanceTo = function distanceTo(to) { + return getInfo(getNodeFromTo(to)).dist; + }; + + var pathTo = function pathTo(to) { + var thisStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : root; + var end = getNodeFromTo(to); + var path = []; + var node = end; + + for (;;) { + if (node == null) { + return _this.spawn(); + } + + var _getInfo = getInfo(node), + edge = _getInfo.edge, + pred = _getInfo.pred; + + path.unshift(node[0]); + + if (node.same(thisStart) && path.length > 0) { + break; + } + + if (edge != null) { + path.unshift(edge); + } + + node = pred; + } + + return eles.spawn(path); + }; // Initializations { dist, pred, edge } + + + for (var i = 0; i < numNodes; i++) { + var node = nodes[i]; + var info = getInfo(node); + + if (node.same(root)) { + info.dist = 0; + } else { + info.dist = Infinity; + } + + info.pred = null; + info.edge = null; + } // Edges relaxation + + + var replacedEdge = false; + + var checkForEdgeReplacement = function checkForEdgeReplacement(node1, node2, edge, info1, info2, weight) { + var dist = info1.dist + weight; + + if (dist < info2.dist && !edge.same(info1.edge)) { + info2.dist = dist; + info2.pred = node1; + info2.edge = edge; + replacedEdge = true; + } + }; + + for (var _i = 1; _i < numNodes; _i++) { + replacedEdge = false; + + for (var e = 0; e < numEdges; e++) { + var edge = edges[e]; + var src = edge.source(); + var tgt = edge.target(); + + var _weight = weightFn(edge); + + var srcInfo = getInfo(src); + var tgtInfo = getInfo(tgt); + checkForEdgeReplacement(src, tgt, edge, srcInfo, tgtInfo, _weight); // If undirected graph, we need to take into account the 'reverse' edge + + if (!directed) { + checkForEdgeReplacement(tgt, src, edge, tgtInfo, srcInfo, _weight); + } + } + + if (!replacedEdge) { + break; + } + } + + if (replacedEdge) { + // Check for negative weight cycles + var negativeWeightCycleIds = []; + + for (var _e = 0; _e < numEdges; _e++) { + var _edge = edges[_e]; + + var _src = _edge.source(); + + var _tgt = _edge.target(); + + var _weight2 = weightFn(_edge); + + var srcDist = getInfo(_src).dist; + var tgtDist = getInfo(_tgt).dist; + + if (srcDist + _weight2 < tgtDist || !directed && tgtDist + _weight2 < srcDist) { + if (!hasNegativeWeightCycle) { + warn('Graph contains a negative weight cycle for Bellman-Ford'); + hasNegativeWeightCycle = true; + } + + if (options.findNegativeWeightCycles !== false) { + var negativeNodes = []; + + if (srcDist + _weight2 < tgtDist) { + negativeNodes.push(_src); + } + + if (!directed && tgtDist + _weight2 < srcDist) { + negativeNodes.push(_tgt); + } + + var numNegativeNodes = negativeNodes.length; + + for (var n = 0; n < numNegativeNodes; n++) { + var start = negativeNodes[n]; + var cycle = [start]; + cycle.push(getInfo(start).edge); + var _node = getInfo(start).pred; + + while (cycle.indexOf(_node) === -1) { + cycle.push(_node); + cycle.push(getInfo(_node).edge); + _node = getInfo(_node).pred; + } + + cycle = cycle.slice(cycle.indexOf(_node)); + var smallestId = cycle[0].id(); + var smallestIndex = 0; + + for (var c = 2; c < cycle.length; c += 2) { + if (cycle[c].id() < smallestId) { + smallestId = cycle[c].id(); + smallestIndex = c; + } + } + + cycle = cycle.slice(smallestIndex).concat(cycle.slice(0, smallestIndex)); + cycle.push(cycle[0]); + var cycleId = cycle.map(function (el) { + return el.id(); + }).join(","); + + if (negativeWeightCycleIds.indexOf(cycleId) === -1) { + negativeWeightCycles.push(eles.spawn(cycle)); + negativeWeightCycleIds.push(cycleId); + } + } + } else { + break; + } + } + } + } + + return { + distanceTo: distanceTo, + pathTo: pathTo, + hasNegativeWeightCycle: hasNegativeWeightCycle, + negativeWeightCycles: negativeWeightCycles + }; + } // bellmanFord + + }; // elesfn + + var sqrt2 = Math.sqrt(2); // Function which colapses 2 (meta) nodes into one + // Updates the remaining edge lists + // Receives as a paramater the edge which causes the collapse + + var collapse = function collapse(edgeIndex, nodeMap, remainingEdges) { + if (remainingEdges.length === 0) { + error("Karger-Stein must be run on a connected (sub)graph"); + } + + var edgeInfo = remainingEdges[edgeIndex]; + var sourceIn = edgeInfo[1]; + var targetIn = edgeInfo[2]; + var partition1 = nodeMap[sourceIn]; + var partition2 = nodeMap[targetIn]; + var newEdges = remainingEdges; // re-use array + // Delete all edges between partition1 and partition2 + + for (var i = newEdges.length - 1; i >= 0; i--) { + var edge = newEdges[i]; + var src = edge[1]; + var tgt = edge[2]; + + if (nodeMap[src] === partition1 && nodeMap[tgt] === partition2 || nodeMap[src] === partition2 && nodeMap[tgt] === partition1) { + newEdges.splice(i, 1); + } + } // All edges pointing to partition2 should now point to partition1 + + + for (var _i = 0; _i < newEdges.length; _i++) { + var _edge = newEdges[_i]; + + if (_edge[1] === partition2) { + // Check source + newEdges[_i] = _edge.slice(); // copy + + newEdges[_i][1] = partition1; + } else if (_edge[2] === partition2) { + // Check target + newEdges[_i] = _edge.slice(); // copy + + newEdges[_i][2] = partition1; + } + } // Move all nodes from partition2 to partition1 + + + for (var _i2 = 0; _i2 < nodeMap.length; _i2++) { + if (nodeMap[_i2] === partition2) { + nodeMap[_i2] = partition1; + } + } + + return newEdges; + }; // Contracts a graph until we reach a certain number of meta nodes + + + var contractUntil = function contractUntil(metaNodeMap, remainingEdges, size, sizeLimit) { + while (size > sizeLimit) { + // Choose an edge randomly + var edgeIndex = Math.floor(Math.random() * remainingEdges.length); // Collapse graph based on edge + + remainingEdges = collapse(edgeIndex, metaNodeMap, remainingEdges); + size--; + } + + return remainingEdges; + }; + + var elesfn$p = { + // Computes the minimum cut of an undirected graph + // Returns the correct answer with high probability + kargerStein: function kargerStein() { + var _this = this; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + edges.unmergeBy(function (edge) { + return edge.isLoop(); + }); + var numNodes = nodes.length; + var numEdges = edges.length; + var numIter = Math.ceil(Math.pow(Math.log(numNodes) / Math.LN2, 2)); + var stopSize = Math.floor(numNodes / sqrt2); + + if (numNodes < 2) { + error('At least 2 nodes are required for Karger-Stein algorithm'); + return undefined; + } // Now store edge destination as indexes + // Format for each edge (edge index, source node index, target node index) + + + var edgeIndexes = []; + + for (var i = 0; i < numEdges; i++) { + var e = edges[i]; + edgeIndexes.push([i, nodes.indexOf(e.source()), nodes.indexOf(e.target())]); + } // We will store the best cut found here + + + var minCutSize = Infinity; + var minCutEdgeIndexes = []; + var minCutNodeMap = new Array(numNodes); // Initial meta node partition + + var metaNodeMap = new Array(numNodes); + var metaNodeMap2 = new Array(numNodes); + + var copyNodesMap = function copyNodesMap(from, to) { + for (var _i3 = 0; _i3 < numNodes; _i3++) { + to[_i3] = from[_i3]; + } + }; // Main loop + + + for (var iter = 0; iter <= numIter; iter++) { + // Reset meta node partition + for (var _i4 = 0; _i4 < numNodes; _i4++) { + metaNodeMap[_i4] = _i4; + } // Contract until stop point (stopSize nodes) + + + var edgesState = contractUntil(metaNodeMap, edgeIndexes.slice(), numNodes, stopSize); + var edgesState2 = edgesState.slice(); // copy + // Create a copy of the colapsed nodes state + + copyNodesMap(metaNodeMap, metaNodeMap2); // Run 2 iterations starting in the stop state + + var res1 = contractUntil(metaNodeMap, edgesState, stopSize, 2); + var res2 = contractUntil(metaNodeMap2, edgesState2, stopSize, 2); // Is any of the 2 results the best cut so far? + + if (res1.length <= res2.length && res1.length < minCutSize) { + minCutSize = res1.length; + minCutEdgeIndexes = res1; + copyNodesMap(metaNodeMap, minCutNodeMap); + } else if (res2.length <= res1.length && res2.length < minCutSize) { + minCutSize = res2.length; + minCutEdgeIndexes = res2; + copyNodesMap(metaNodeMap2, minCutNodeMap); + } + } // end of main loop + // Construct result + + + var cut = this.spawn(minCutEdgeIndexes.map(function (e) { + return edges[e[0]]; + })); + var partition1 = this.spawn(); + var partition2 = this.spawn(); // traverse metaNodeMap for best cut + + var witnessNodePartition = minCutNodeMap[0]; + + for (var _i5 = 0; _i5 < minCutNodeMap.length; _i5++) { + var partitionId = minCutNodeMap[_i5]; + var node = nodes[_i5]; + + if (partitionId === witnessNodePartition) { + partition1.merge(node); + } else { + partition2.merge(node); + } + } // construct components corresponding to each disjoint subset of nodes + + + var constructComponent = function constructComponent(subset) { + var component = _this.spawn(); + + subset.forEach(function (node) { + component.merge(node); + node.connectedEdges().forEach(function (edge) { + // ensure edge is within calling collection and edge is not in cut + if (_this.contains(edge) && !cut.contains(edge)) { + component.merge(edge); + } + }); + }); + return component; + }; + + var components = [constructComponent(partition1), constructComponent(partition2)]; + var ret = { + cut: cut, + components: components, + // n.b. partitions are included to be compatible with the old api spec + // (could be removed in a future major version) + partition1: partition1, + partition2: partition2 + }; + return ret; + } + }; // elesfn + + var copyPosition = function copyPosition(p) { + return { + x: p.x, + y: p.y + }; + }; + var modelToRenderedPosition = function modelToRenderedPosition(p, zoom, pan) { + return { + x: p.x * zoom + pan.x, + y: p.y * zoom + pan.y + }; + }; + var renderedToModelPosition = function renderedToModelPosition(p, zoom, pan) { + return { + x: (p.x - pan.x) / zoom, + y: (p.y - pan.y) / zoom + }; + }; + var array2point = function array2point(arr) { + return { + x: arr[0], + y: arr[1] + }; + }; + var min = function min(arr) { + var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; + var min = Infinity; + + for (var i = begin; i < end; i++) { + var val = arr[i]; + + if (isFinite(val)) { + min = Math.min(val, min); + } + } + + return min; + }; + var max = function max(arr) { + var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; + var max = -Infinity; + + for (var i = begin; i < end; i++) { + var val = arr[i]; + + if (isFinite(val)) { + max = Math.max(val, max); + } + } + + return max; + }; + var mean = function mean(arr) { + var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; + var total = 0; + var n = 0; + + for (var i = begin; i < end; i++) { + var val = arr[i]; + + if (isFinite(val)) { + total += val; + n++; + } + } + + return total / n; + }; + var median = function median(arr) { + var begin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : arr.length; + var copy = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var sort = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var includeHoles = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + + if (copy) { + arr = arr.slice(begin, end); + } else { + if (end < arr.length) { + arr.splice(end, arr.length - end); + } + + if (begin > 0) { + arr.splice(0, begin); + } + } // all non finite (e.g. Infinity, NaN) elements must be -Infinity so they go to the start + + + var off = 0; // offset from non-finite values + + for (var i = arr.length - 1; i >= 0; i--) { + var v = arr[i]; + + if (includeHoles) { + if (!isFinite(v)) { + arr[i] = -Infinity; + off++; + } + } else { + // just remove it if we don't want to consider holes + arr.splice(i, 1); + } + } + + if (sort) { + arr.sort(function (a, b) { + return a - b; + }); // requires copy = true if you don't want to change the orig + } + + var len = arr.length; + var mid = Math.floor(len / 2); + + if (len % 2 !== 0) { + return arr[mid + 1 + off]; + } else { + return (arr[mid - 1 + off] + arr[mid + off]) / 2; + } + }; + var deg2rad = function deg2rad(deg) { + return Math.PI * deg / 180; + }; + var getAngleFromDisp = function getAngleFromDisp(dispX, dispY) { + return Math.atan2(dispY, dispX) - Math.PI / 2; + }; + var log2 = Math.log2 || function (n) { + return Math.log(n) / Math.log(2); + }; + var signum = function signum(x) { + if (x > 0) { + return 1; + } else if (x < 0) { + return -1; + } else { + return 0; + } + }; + var dist = function dist(p1, p2) { + return Math.sqrt(sqdist(p1, p2)); + }; + var sqdist = function sqdist(p1, p2) { + var dx = p2.x - p1.x; + var dy = p2.y - p1.y; + return dx * dx + dy * dy; + }; + var inPlaceSumNormalize = function inPlaceSumNormalize(v) { + var length = v.length; // First, get sum of all elements + + var total = 0; + + for (var i = 0; i < length; i++) { + total += v[i]; + } // Now, divide each by the sum of all elements + + + for (var _i = 0; _i < length; _i++) { + v[_i] = v[_i] / total; + } + + return v; + }; + + var qbezierAt = function qbezierAt(p0, p1, p2, t) { + return (1 - t) * (1 - t) * p0 + 2 * (1 - t) * t * p1 + t * t * p2; + }; + var qbezierPtAt = function qbezierPtAt(p0, p1, p2, t) { + return { + x: qbezierAt(p0.x, p1.x, p2.x, t), + y: qbezierAt(p0.y, p1.y, p2.y, t) + }; + }; + var lineAt = function lineAt(p0, p1, t, d) { + var vec = { + x: p1.x - p0.x, + y: p1.y - p0.y + }; + var vecDist = dist(p0, p1); + var normVec = { + x: vec.x / vecDist, + y: vec.y / vecDist + }; + t = t == null ? 0 : t; + d = d != null ? d : t * vecDist; + return { + x: p0.x + normVec.x * d, + y: p0.y + normVec.y * d + }; + }; + var bound = function bound(min, val, max) { + return Math.max(min, Math.min(max, val)); + }; // makes a full bb (x1, y1, x2, y2, w, h) from implicit params + + var makeBoundingBox = function makeBoundingBox(bb) { + if (bb == null) { + return { + x1: Infinity, + y1: Infinity, + x2: -Infinity, + y2: -Infinity, + w: 0, + h: 0 + }; + } else if (bb.x1 != null && bb.y1 != null) { + if (bb.x2 != null && bb.y2 != null && bb.x2 >= bb.x1 && bb.y2 >= bb.y1) { + return { + x1: bb.x1, + y1: bb.y1, + x2: bb.x2, + y2: bb.y2, + w: bb.x2 - bb.x1, + h: bb.y2 - bb.y1 + }; + } else if (bb.w != null && bb.h != null && bb.w >= 0 && bb.h >= 0) { + return { + x1: bb.x1, + y1: bb.y1, + x2: bb.x1 + bb.w, + y2: bb.y1 + bb.h, + w: bb.w, + h: bb.h + }; + } + } + }; + var copyBoundingBox = function copyBoundingBox(bb) { + return { + x1: bb.x1, + x2: bb.x2, + w: bb.w, + y1: bb.y1, + y2: bb.y2, + h: bb.h + }; + }; + var clearBoundingBox = function clearBoundingBox(bb) { + bb.x1 = Infinity; + bb.y1 = Infinity; + bb.x2 = -Infinity; + bb.y2 = -Infinity; + bb.w = 0; + bb.h = 0; + }; + var updateBoundingBox = function updateBoundingBox(bb1, bb2) { + // update bb1 with bb2 bounds + bb1.x1 = Math.min(bb1.x1, bb2.x1); + bb1.x2 = Math.max(bb1.x2, bb2.x2); + bb1.w = bb1.x2 - bb1.x1; + bb1.y1 = Math.min(bb1.y1, bb2.y1); + bb1.y2 = Math.max(bb1.y2, bb2.y2); + bb1.h = bb1.y2 - bb1.y1; + }; + var expandBoundingBoxByPoint = function expandBoundingBoxByPoint(bb, x, y) { + bb.x1 = Math.min(bb.x1, x); + bb.x2 = Math.max(bb.x2, x); + bb.w = bb.x2 - bb.x1; + bb.y1 = Math.min(bb.y1, y); + bb.y2 = Math.max(bb.y2, y); + bb.h = bb.y2 - bb.y1; + }; + var expandBoundingBox = function expandBoundingBox(bb) { + var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + bb.x1 -= padding; + bb.x2 += padding; + bb.y1 -= padding; + bb.y2 += padding; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + return bb; + }; + var expandBoundingBoxSides = function expandBoundingBoxSides(bb) { + var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0]; + var top, right, bottom, left; + + if (padding.length === 1) { + top = right = bottom = left = padding[0]; + } else if (padding.length === 2) { + top = bottom = padding[0]; + left = right = padding[1]; + } else if (padding.length === 4) { + var _padding = _slicedToArray(padding, 4); + + top = _padding[0]; + right = _padding[1]; + bottom = _padding[2]; + left = _padding[3]; + } + + bb.x1 -= left; + bb.x2 += right; + bb.y1 -= top; + bb.y2 += bottom; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + return bb; + }; + + var assignBoundingBox = function assignBoundingBox(bb1, bb2) { + bb1.x1 = bb2.x1; + bb1.y1 = bb2.y1; + bb1.x2 = bb2.x2; + bb1.y2 = bb2.y2; + bb1.w = bb1.x2 - bb1.x1; + bb1.h = bb1.y2 - bb1.y1; + }; + var boundingBoxesIntersect = function boundingBoxesIntersect(bb1, bb2) { + // case: one bb to right of other + if (bb1.x1 > bb2.x2) { + return false; + } + + if (bb2.x1 > bb1.x2) { + return false; + } // case: one bb to left of other + + + if (bb1.x2 < bb2.x1) { + return false; + } + + if (bb2.x2 < bb1.x1) { + return false; + } // case: one bb above other + + + if (bb1.y2 < bb2.y1) { + return false; + } + + if (bb2.y2 < bb1.y1) { + return false; + } // case: one bb below other + + + if (bb1.y1 > bb2.y2) { + return false; + } + + if (bb2.y1 > bb1.y2) { + return false; + } // otherwise, must have some overlap + + + return true; + }; + var inBoundingBox = function inBoundingBox(bb, x, y) { + return bb.x1 <= x && x <= bb.x2 && bb.y1 <= y && y <= bb.y2; + }; + var pointInBoundingBox = function pointInBoundingBox(bb, pt) { + return inBoundingBox(bb, pt.x, pt.y); + }; + var boundingBoxInBoundingBox = function boundingBoxInBoundingBox(bb1, bb2) { + return inBoundingBox(bb1, bb2.x1, bb2.y1) && inBoundingBox(bb1, bb2.x2, bb2.y2); + }; + var roundRectangleIntersectLine = function roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding) { + var cornerRadius = getRoundRectangleRadius(width, height); + var halfWidth = width / 2; + var halfHeight = height / 2; // Check intersections with straight line segments + + var straightLineIntersections; // Top segment, left to right + + { + var topStartX = nodeX - halfWidth + cornerRadius - padding; + var topStartY = nodeY - halfHeight - padding; + var topEndX = nodeX + halfWidth - cornerRadius + padding; + var topEndY = topStartY; + straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false); + + if (straightLineIntersections.length > 0) { + return straightLineIntersections; + } + } // Right segment, top to bottom + + { + var rightStartX = nodeX + halfWidth + padding; + var rightStartY = nodeY - halfHeight + cornerRadius - padding; + var rightEndX = rightStartX; + var rightEndY = nodeY + halfHeight - cornerRadius + padding; + straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, rightStartX, rightStartY, rightEndX, rightEndY, false); + + if (straightLineIntersections.length > 0) { + return straightLineIntersections; + } + } // Bottom segment, left to right + + { + var bottomStartX = nodeX - halfWidth + cornerRadius - padding; + var bottomStartY = nodeY + halfHeight + padding; + var bottomEndX = nodeX + halfWidth - cornerRadius + padding; + var bottomEndY = bottomStartY; + straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false); + + if (straightLineIntersections.length > 0) { + return straightLineIntersections; + } + } // Left segment, top to bottom + + { + var leftStartX = nodeX - halfWidth - padding; + var leftStartY = nodeY - halfHeight + cornerRadius - padding; + var leftEndX = leftStartX; + var leftEndY = nodeY + halfHeight - cornerRadius + padding; + straightLineIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, leftStartX, leftStartY, leftEndX, leftEndY, false); + + if (straightLineIntersections.length > 0) { + return straightLineIntersections; + } + } // Check intersections with arc segments + + var arcIntersections; // Top Left + + { + var topLeftCenterX = nodeX - halfWidth + cornerRadius; + var topLeftCenterY = nodeY - halfHeight + cornerRadius; + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topLeftCenterX, topLeftCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + + if (arcIntersections.length > 0 && arcIntersections[0] <= topLeftCenterX && arcIntersections[1] <= topLeftCenterY) { + return [arcIntersections[0], arcIntersections[1]]; + } + } // Top Right + + { + var topRightCenterX = nodeX + halfWidth - cornerRadius; + var topRightCenterY = nodeY - halfHeight + cornerRadius; + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, topRightCenterX, topRightCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + + if (arcIntersections.length > 0 && arcIntersections[0] >= topRightCenterX && arcIntersections[1] <= topRightCenterY) { + return [arcIntersections[0], arcIntersections[1]]; + } + } // Bottom Right + + { + var bottomRightCenterX = nodeX + halfWidth - cornerRadius; + var bottomRightCenterY = nodeY + halfHeight - cornerRadius; + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + + if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) { + return [arcIntersections[0], arcIntersections[1]]; + } + } // Bottom Left + + { + var bottomLeftCenterX = nodeX - halfWidth + cornerRadius; + var bottomLeftCenterY = nodeY + halfHeight - cornerRadius; + arcIntersections = intersectLineCircle(x, y, nodeX, nodeY, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding); // Ensure the intersection is on the desired quarter of the circle + + if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) { + return [arcIntersections[0], arcIntersections[1]]; + } + } + return []; // if nothing + }; + var inLineVicinity = function inLineVicinity(x, y, lx1, ly1, lx2, ly2, tolerance) { + var t = tolerance; + var x1 = Math.min(lx1, lx2); + var x2 = Math.max(lx1, lx2); + var y1 = Math.min(ly1, ly2); + var y2 = Math.max(ly1, ly2); + return x1 - t <= x && x <= x2 + t && y1 - t <= y && y <= y2 + t; + }; + var inBezierVicinity = function inBezierVicinity(x, y, x1, y1, x2, y2, x3, y3, tolerance) { + var bb = { + x1: Math.min(x1, x3, x2) - tolerance, + x2: Math.max(x1, x3, x2) + tolerance, + y1: Math.min(y1, y3, y2) - tolerance, + y2: Math.max(y1, y3, y2) + tolerance + }; // if outside the rough bounding box for the bezier, then it can't be a hit + + if (x < bb.x1 || x > bb.x2 || y < bb.y1 || y > bb.y2) { + // console.log('bezier out of rough bb') + return false; + } else { + // console.log('do more expensive check'); + return true; + } + }; + var solveQuadratic = function solveQuadratic(a, b, c, val) { + c -= val; + var r = b * b - 4 * a * c; + + if (r < 0) { + return []; + } + + var sqrtR = Math.sqrt(r); + var denom = 2 * a; + var root1 = (-b + sqrtR) / denom; + var root2 = (-b - sqrtR) / denom; + return [root1, root2]; + }; + var solveCubic = function solveCubic(a, b, c, d, result) { + // Solves a cubic function, returns root in form [r1, i1, r2, i2, r3, i3], where + // r is the real component, i is the imaginary component + // An implementation of the Cardano method from the year 1545 + // http://en.wikipedia.org/wiki/Cubic_function#The_nature_of_the_roots + var epsilon = 0.00001; // avoid division by zero while keeping the overall expression close in value + + if (a === 0) { + a = epsilon; + } + + b /= a; + c /= a; + d /= a; + var discriminant, q, r, dum1, s, t, term1, r13; + q = (3.0 * c - b * b) / 9.0; + r = -(27.0 * d) + b * (9.0 * c - 2.0 * (b * b)); + r /= 54.0; + discriminant = q * q * q + r * r; + result[1] = 0; + term1 = b / 3.0; + + if (discriminant > 0) { + s = r + Math.sqrt(discriminant); + s = s < 0 ? -Math.pow(-s, 1.0 / 3.0) : Math.pow(s, 1.0 / 3.0); + t = r - Math.sqrt(discriminant); + t = t < 0 ? -Math.pow(-t, 1.0 / 3.0) : Math.pow(t, 1.0 / 3.0); + result[0] = -term1 + s + t; + term1 += (s + t) / 2.0; + result[4] = result[2] = -term1; + term1 = Math.sqrt(3.0) * (-t + s) / 2; + result[3] = term1; + result[5] = -term1; + return; + } + + result[5] = result[3] = 0; + + if (discriminant === 0) { + r13 = r < 0 ? -Math.pow(-r, 1.0 / 3.0) : Math.pow(r, 1.0 / 3.0); + result[0] = -term1 + 2.0 * r13; + result[4] = result[2] = -(r13 + term1); + return; + } + + q = -q; + dum1 = q * q * q; + dum1 = Math.acos(r / Math.sqrt(dum1)); + r13 = 2.0 * Math.sqrt(q); + result[0] = -term1 + r13 * Math.cos(dum1 / 3.0); + result[2] = -term1 + r13 * Math.cos((dum1 + 2.0 * Math.PI) / 3.0); + result[4] = -term1 + r13 * Math.cos((dum1 + 4.0 * Math.PI) / 3.0); + return; + }; + var sqdistToQuadraticBezier = function sqdistToQuadraticBezier(x, y, x1, y1, x2, y2, x3, y3) { + // Find minimum distance by using the minimum of the distance + // function between the given point and the curve + // This gives the coefficients of the resulting cubic equation + // whose roots tell us where a possible minimum is + // (Coefficients are divided by 4) + var a = 1.0 * x1 * x1 - 4 * x1 * x2 + 2 * x1 * x3 + 4 * x2 * x2 - 4 * x2 * x3 + x3 * x3 + y1 * y1 - 4 * y1 * y2 + 2 * y1 * y3 + 4 * y2 * y2 - 4 * y2 * y3 + y3 * y3; + var b = 1.0 * 9 * x1 * x2 - 3 * x1 * x1 - 3 * x1 * x3 - 6 * x2 * x2 + 3 * x2 * x3 + 9 * y1 * y2 - 3 * y1 * y1 - 3 * y1 * y3 - 6 * y2 * y2 + 3 * y2 * y3; + var c = 1.0 * 3 * x1 * x1 - 6 * x1 * x2 + x1 * x3 - x1 * x + 2 * x2 * x2 + 2 * x2 * x - x3 * x + 3 * y1 * y1 - 6 * y1 * y2 + y1 * y3 - y1 * y + 2 * y2 * y2 + 2 * y2 * y - y3 * y; + var d = 1.0 * x1 * x2 - x1 * x1 + x1 * x - x2 * x + y1 * y2 - y1 * y1 + y1 * y - y2 * y; // debug("coefficients: " + a / a + ", " + b / a + ", " + c / a + ", " + d / a); + + var roots = []; // Use the cubic solving algorithm + + solveCubic(a, b, c, d, roots); + var zeroThreshold = 0.0000001; + var params = []; + + for (var index = 0; index < 6; index += 2) { + if (Math.abs(roots[index + 1]) < zeroThreshold && roots[index] >= 0 && roots[index] <= 1.0) { + params.push(roots[index]); + } + } + + params.push(1.0); + params.push(0.0); + var minDistanceSquared = -1; + var curX, curY, distSquared; + + for (var i = 0; i < params.length; i++) { + curX = Math.pow(1.0 - params[i], 2.0) * x1 + 2.0 * (1 - params[i]) * params[i] * x2 + params[i] * params[i] * x3; + curY = Math.pow(1 - params[i], 2.0) * y1 + 2 * (1.0 - params[i]) * params[i] * y2 + params[i] * params[i] * y3; + distSquared = Math.pow(curX - x, 2) + Math.pow(curY - y, 2); // debug('distance for param ' + params[i] + ": " + Math.sqrt(distSquared)); + + if (minDistanceSquared >= 0) { + if (distSquared < minDistanceSquared) { + minDistanceSquared = distSquared; + } + } else { + minDistanceSquared = distSquared; + } + } + + return minDistanceSquared; + }; + var sqdistToFiniteLine = function sqdistToFiniteLine(x, y, x1, y1, x2, y2) { + var offset = [x - x1, y - y1]; + var line = [x2 - x1, y2 - y1]; + var lineSq = line[0] * line[0] + line[1] * line[1]; + var hypSq = offset[0] * offset[0] + offset[1] * offset[1]; + var dotProduct = offset[0] * line[0] + offset[1] * line[1]; + var adjSq = dotProduct * dotProduct / lineSq; + + if (dotProduct < 0) { + return hypSq; + } + + if (adjSq > lineSq) { + return (x - x2) * (x - x2) + (y - y2) * (y - y2); + } + + return hypSq - adjSq; + }; + var pointInsidePolygonPoints = function pointInsidePolygonPoints(x, y, points) { + var x1, y1, x2, y2; + var y3; // Intersect with vertical line through (x, y) + + var up = 0; // let down = 0; + + for (var i = 0; i < points.length / 2; i++) { + x1 = points[i * 2]; + y1 = points[i * 2 + 1]; + + if (i + 1 < points.length / 2) { + x2 = points[(i + 1) * 2]; + y2 = points[(i + 1) * 2 + 1]; + } else { + x2 = points[(i + 1 - points.length / 2) * 2]; + y2 = points[(i + 1 - points.length / 2) * 2 + 1]; + } + + if (x1 == x && x2 == x) ; else if (x1 >= x && x >= x2 || x1 <= x && x <= x2) { + y3 = (x - x1) / (x2 - x1) * (y2 - y1) + y1; + + if (y3 > y) { + up++; + } // if( y3 < y ){ + // down++; + // } + + } else { + continue; + } + } + + if (up % 2 === 0) { + return false; + } else { + return true; + } + }; + var pointInsidePolygon = function pointInsidePolygon(x, y, basePoints, centerX, centerY, width, height, direction, padding) { + var transformedPoints = new Array(basePoints.length); // Gives negative angle + + var angle; + + if (direction[0] != null) { + angle = Math.atan(direction[1] / direction[0]); + + if (direction[0] < 0) { + angle = angle + Math.PI / 2; + } else { + angle = -angle - Math.PI / 2; + } + } else { + angle = direction; + } + + var cos = Math.cos(-angle); + var sin = Math.sin(-angle); // console.log("base: " + basePoints); + + for (var i = 0; i < transformedPoints.length / 2; i++) { + transformedPoints[i * 2] = width / 2 * (basePoints[i * 2] * cos - basePoints[i * 2 + 1] * sin); + transformedPoints[i * 2 + 1] = height / 2 * (basePoints[i * 2 + 1] * cos + basePoints[i * 2] * sin); + transformedPoints[i * 2] += centerX; + transformedPoints[i * 2 + 1] += centerY; + } + + var points; + + if (padding > 0) { + var expandedLineSet = expandPolygon(transformedPoints, -padding); + points = joinLines(expandedLineSet); + } else { + points = transformedPoints; + } + + return pointInsidePolygonPoints(x, y, points); + }; + var pointInsideRoundPolygon = function pointInsideRoundPolygon(x, y, basePoints, centerX, centerY, width, height) { + var cutPolygonPoints = new Array(basePoints.length); + var halfW = width / 2; + var halfH = height / 2; + var cornerRadius = getRoundPolygonRadius(width, height); + var squaredCornerRadius = cornerRadius * cornerRadius; + + for (var i = 0; i < basePoints.length / 4; i++) { + var sourceUv = void 0, + destUv = void 0; + + if (i === 0) { + sourceUv = basePoints.length - 2; + } else { + sourceUv = i * 4 - 2; + } + + destUv = i * 4 + 2; + var px = centerX + halfW * basePoints[i * 4]; + var py = centerY + halfH * basePoints[i * 4 + 1]; + var cosTheta = -basePoints[sourceUv] * basePoints[destUv] - basePoints[sourceUv + 1] * basePoints[destUv + 1]; + var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2); + var cp0x = px - offset * basePoints[sourceUv]; + var cp0y = py - offset * basePoints[sourceUv + 1]; + var cp1x = px + offset * basePoints[destUv]; + var cp1y = py + offset * basePoints[destUv + 1]; + cutPolygonPoints[i * 4] = cp0x; + cutPolygonPoints[i * 4 + 1] = cp0y; + cutPolygonPoints[i * 4 + 2] = cp1x; + cutPolygonPoints[i * 4 + 3] = cp1y; + var orthx = basePoints[sourceUv + 1]; + var orthy = -basePoints[sourceUv]; + var cosAlpha = orthx * basePoints[destUv] + orthy * basePoints[destUv + 1]; + + if (cosAlpha < 0) { + orthx *= -1; + orthy *= -1; + } + + var cx = cp0x + orthx * cornerRadius; + var cy = cp0y + orthy * cornerRadius; + var squaredDistance = Math.pow(cx - x, 2) + Math.pow(cy - y, 2); + + if (squaredDistance <= squaredCornerRadius) { + return true; + } + } + + return pointInsidePolygonPoints(x, y, cutPolygonPoints); + }; + var joinLines = function joinLines(lineSet) { + var vertices = new Array(lineSet.length / 2); + var currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY; + var nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY; + + for (var i = 0; i < lineSet.length / 4; i++) { + currentLineStartX = lineSet[i * 4]; + currentLineStartY = lineSet[i * 4 + 1]; + currentLineEndX = lineSet[i * 4 + 2]; + currentLineEndY = lineSet[i * 4 + 3]; + + if (i < lineSet.length / 4 - 1) { + nextLineStartX = lineSet[(i + 1) * 4]; + nextLineStartY = lineSet[(i + 1) * 4 + 1]; + nextLineEndX = lineSet[(i + 1) * 4 + 2]; + nextLineEndY = lineSet[(i + 1) * 4 + 3]; + } else { + nextLineStartX = lineSet[0]; + nextLineStartY = lineSet[1]; + nextLineEndX = lineSet[2]; + nextLineEndY = lineSet[3]; + } + + var intersection = finiteLinesIntersect(currentLineStartX, currentLineStartY, currentLineEndX, currentLineEndY, nextLineStartX, nextLineStartY, nextLineEndX, nextLineEndY, true); + vertices[i * 2] = intersection[0]; + vertices[i * 2 + 1] = intersection[1]; + } + + return vertices; + }; + var expandPolygon = function expandPolygon(points, pad) { + var expandedLineSet = new Array(points.length * 2); + var currentPointX, currentPointY, nextPointX, nextPointY; + + for (var i = 0; i < points.length / 2; i++) { + currentPointX = points[i * 2]; + currentPointY = points[i * 2 + 1]; + + if (i < points.length / 2 - 1) { + nextPointX = points[(i + 1) * 2]; + nextPointY = points[(i + 1) * 2 + 1]; + } else { + nextPointX = points[0]; + nextPointY = points[1]; + } // Current line: [currentPointX, currentPointY] to [nextPointX, nextPointY] + // Assume CCW polygon winding + + + var offsetX = nextPointY - currentPointY; + var offsetY = -(nextPointX - currentPointX); // Normalize + + var offsetLength = Math.sqrt(offsetX * offsetX + offsetY * offsetY); + var normalizedOffsetX = offsetX / offsetLength; + var normalizedOffsetY = offsetY / offsetLength; + expandedLineSet[i * 4] = currentPointX + normalizedOffsetX * pad; + expandedLineSet[i * 4 + 1] = currentPointY + normalizedOffsetY * pad; + expandedLineSet[i * 4 + 2] = nextPointX + normalizedOffsetX * pad; + expandedLineSet[i * 4 + 3] = nextPointY + normalizedOffsetY * pad; + } + + return expandedLineSet; + }; + var intersectLineEllipse = function intersectLineEllipse(x, y, centerX, centerY, ellipseWradius, ellipseHradius) { + var dispX = centerX - x; + var dispY = centerY - y; + dispX /= ellipseWradius; + dispY /= ellipseHradius; + var len = Math.sqrt(dispX * dispX + dispY * dispY); + var newLength = len - 1; + + if (newLength < 0) { + return []; + } + + var lenProportion = newLength / len; + return [(centerX - x) * lenProportion + x, (centerY - y) * lenProportion + y]; + }; + var checkInEllipse = function checkInEllipse(x, y, width, height, centerX, centerY, padding) { + x -= centerX; + y -= centerY; + x /= width / 2 + padding; + y /= height / 2 + padding; + return x * x + y * y <= 1; + }; // Returns intersections of increasing distance from line's start point + + var intersectLineCircle = function intersectLineCircle(x1, y1, x2, y2, centerX, centerY, radius) { + // Calculate d, direction vector of line + var d = [x2 - x1, y2 - y1]; // Direction vector of line + + var f = [x1 - centerX, y1 - centerY]; + var a = d[0] * d[0] + d[1] * d[1]; + var b = 2 * (f[0] * d[0] + f[1] * d[1]); + var c = f[0] * f[0] + f[1] * f[1] - radius * radius; + var discriminant = b * b - 4 * a * c; + + if (discriminant < 0) { + return []; + } + + var t1 = (-b + Math.sqrt(discriminant)) / (2 * a); + var t2 = (-b - Math.sqrt(discriminant)) / (2 * a); + var tMin = Math.min(t1, t2); + var tMax = Math.max(t1, t2); + var inRangeParams = []; + + if (tMin >= 0 && tMin <= 1) { + inRangeParams.push(tMin); + } + + if (tMax >= 0 && tMax <= 1) { + inRangeParams.push(tMax); + } + + if (inRangeParams.length === 0) { + return []; + } + + var nearIntersectionX = inRangeParams[0] * d[0] + x1; + var nearIntersectionY = inRangeParams[0] * d[1] + y1; + + if (inRangeParams.length > 1) { + if (inRangeParams[0] == inRangeParams[1]) { + return [nearIntersectionX, nearIntersectionY]; + } else { + var farIntersectionX = inRangeParams[1] * d[0] + x1; + var farIntersectionY = inRangeParams[1] * d[1] + y1; + return [nearIntersectionX, nearIntersectionY, farIntersectionX, farIntersectionY]; + } + } else { + return [nearIntersectionX, nearIntersectionY]; + } + }; + var midOfThree = function midOfThree(a, b, c) { + if (b <= a && a <= c || c <= a && a <= b) { + return a; + } else if (a <= b && b <= c || c <= b && b <= a) { + return b; + } else { + return c; + } + }; // (x1,y1)=>(x2,y2) intersect with (x3,y3)=>(x4,y4) + + var finiteLinesIntersect = function finiteLinesIntersect(x1, y1, x2, y2, x3, y3, x4, y4, infiniteLines) { + var dx13 = x1 - x3; + var dx21 = x2 - x1; + var dx43 = x4 - x3; + var dy13 = y1 - y3; + var dy21 = y2 - y1; + var dy43 = y4 - y3; + var ua_t = dx43 * dy13 - dy43 * dx13; + var ub_t = dx21 * dy13 - dy21 * dx13; + var u_b = dy43 * dx21 - dx43 * dy21; + + if (u_b !== 0) { + var ua = ua_t / u_b; + var ub = ub_t / u_b; + var flptThreshold = 0.001; + + var _min = 0 - flptThreshold; + + var _max = 1 + flptThreshold; + + if (_min <= ua && ua <= _max && _min <= ub && ub <= _max) { + return [x1 + ua * dx21, y1 + ua * dy21]; + } else { + if (!infiniteLines) { + return []; + } else { + return [x1 + ua * dx21, y1 + ua * dy21]; + } + } + } else { + if (ua_t === 0 || ub_t === 0) { + // Parallel, coincident lines. Check if overlap + // Check endpoint of second line + if (midOfThree(x1, x2, x4) === x4) { + return [x4, y4]; + } // Check start point of second line + + + if (midOfThree(x1, x2, x3) === x3) { + return [x3, y3]; + } // Endpoint of first line + + + if (midOfThree(x3, x4, x2) === x2) { + return [x2, y2]; + } + + return []; + } else { + // Parallel, non-coincident + return []; + } + } + }; // math.polygonIntersectLine( x, y, basePoints, centerX, centerY, width, height, padding ) + // intersect a node polygon (pts transformed) + // + // math.polygonIntersectLine( x, y, basePoints, centerX, centerY ) + // intersect the points (no transform) + + var polygonIntersectLine = function polygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) { + var intersections = []; + var intersection; + var transformedPoints = new Array(basePoints.length); + var doTransform = true; + + if (width == null) { + doTransform = false; + } + + var points; + + if (doTransform) { + for (var i = 0; i < transformedPoints.length / 2; i++) { + transformedPoints[i * 2] = basePoints[i * 2] * width + centerX; + transformedPoints[i * 2 + 1] = basePoints[i * 2 + 1] * height + centerY; + } + + if (padding > 0) { + var expandedLineSet = expandPolygon(transformedPoints, -padding); + points = joinLines(expandedLineSet); + } else { + points = transformedPoints; + } + } else { + points = basePoints; + } + + var currentX, currentY, nextX, nextY; + + for (var _i2 = 0; _i2 < points.length / 2; _i2++) { + currentX = points[_i2 * 2]; + currentY = points[_i2 * 2 + 1]; + + if (_i2 < points.length / 2 - 1) { + nextX = points[(_i2 + 1) * 2]; + nextY = points[(_i2 + 1) * 2 + 1]; + } else { + nextX = points[0]; + nextY = points[1]; + } + + intersection = finiteLinesIntersect(x, y, centerX, centerY, currentX, currentY, nextX, nextY); + + if (intersection.length !== 0) { + intersections.push(intersection[0], intersection[1]); + } + } + + return intersections; + }; + var roundPolygonIntersectLine = function roundPolygonIntersectLine(x, y, basePoints, centerX, centerY, width, height, padding) { + var intersections = []; + var intersection; + var lines = new Array(basePoints.length); + var halfW = width / 2; + var halfH = height / 2; + var cornerRadius = getRoundPolygonRadius(width, height); + + for (var i = 0; i < basePoints.length / 4; i++) { + var sourceUv = void 0, + destUv = void 0; + + if (i === 0) { + sourceUv = basePoints.length - 2; + } else { + sourceUv = i * 4 - 2; + } + + destUv = i * 4 + 2; + var px = centerX + halfW * basePoints[i * 4]; + var py = centerY + halfH * basePoints[i * 4 + 1]; + var cosTheta = -basePoints[sourceUv] * basePoints[destUv] - basePoints[sourceUv + 1] * basePoints[destUv + 1]; + var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2); + var cp0x = px - offset * basePoints[sourceUv]; + var cp0y = py - offset * basePoints[sourceUv + 1]; + var cp1x = px + offset * basePoints[destUv]; + var cp1y = py + offset * basePoints[destUv + 1]; + + if (i === 0) { + lines[basePoints.length - 2] = cp0x; + lines[basePoints.length - 1] = cp0y; + } else { + lines[i * 4 - 2] = cp0x; + lines[i * 4 - 1] = cp0y; + } + + lines[i * 4] = cp1x; + lines[i * 4 + 1] = cp1y; + var orthx = basePoints[sourceUv + 1]; + var orthy = -basePoints[sourceUv]; + var cosAlpha = orthx * basePoints[destUv] + orthy * basePoints[destUv + 1]; + + if (cosAlpha < 0) { + orthx *= -1; + orthy *= -1; + } + + var cx = cp0x + orthx * cornerRadius; + var cy = cp0y + orthy * cornerRadius; + intersection = intersectLineCircle(x, y, centerX, centerY, cx, cy, cornerRadius); + + if (intersection.length !== 0) { + intersections.push(intersection[0], intersection[1]); + } + } + + for (var _i3 = 0; _i3 < lines.length / 4; _i3++) { + intersection = finiteLinesIntersect(x, y, centerX, centerY, lines[_i3 * 4], lines[_i3 * 4 + 1], lines[_i3 * 4 + 2], lines[_i3 * 4 + 3], false); + + if (intersection.length !== 0) { + intersections.push(intersection[0], intersection[1]); + } + } + + if (intersections.length > 2) { + var lowestIntersection = [intersections[0], intersections[1]]; + var lowestSquaredDistance = Math.pow(lowestIntersection[0] - x, 2) + Math.pow(lowestIntersection[1] - y, 2); + + for (var _i4 = 1; _i4 < intersections.length / 2; _i4++) { + var squaredDistance = Math.pow(intersections[_i4 * 2] - x, 2) + Math.pow(intersections[_i4 * 2 + 1] - y, 2); + + if (squaredDistance <= lowestSquaredDistance) { + lowestIntersection[0] = intersections[_i4 * 2]; + lowestIntersection[1] = intersections[_i4 * 2 + 1]; + lowestSquaredDistance = squaredDistance; + } + } + + return lowestIntersection; + } + + return intersections; + }; + var shortenIntersection = function shortenIntersection(intersection, offset, amount) { + var disp = [intersection[0] - offset[0], intersection[1] - offset[1]]; + var length = Math.sqrt(disp[0] * disp[0] + disp[1] * disp[1]); + var lenRatio = (length - amount) / length; + + if (lenRatio < 0) { + lenRatio = 0.00001; + } + + return [offset[0] + lenRatio * disp[0], offset[1] + lenRatio * disp[1]]; + }; + var generateUnitNgonPointsFitToSquare = function generateUnitNgonPointsFitToSquare(sides, rotationRadians) { + var points = generateUnitNgonPoints(sides, rotationRadians); + points = fitPolygonToSquare(points); + return points; + }; + var fitPolygonToSquare = function fitPolygonToSquare(points) { + var x, y; + var sides = points.length / 2; + var minX = Infinity, + minY = Infinity, + maxX = -Infinity, + maxY = -Infinity; + + for (var i = 0; i < sides; i++) { + x = points[2 * i]; + y = points[2 * i + 1]; + minX = Math.min(minX, x); + maxX = Math.max(maxX, x); + minY = Math.min(minY, y); + maxY = Math.max(maxY, y); + } // stretch factors + + + var sx = 2 / (maxX - minX); + var sy = 2 / (maxY - minY); + + for (var _i5 = 0; _i5 < sides; _i5++) { + x = points[2 * _i5] = points[2 * _i5] * sx; + y = points[2 * _i5 + 1] = points[2 * _i5 + 1] * sy; + minX = Math.min(minX, x); + maxX = Math.max(maxX, x); + minY = Math.min(minY, y); + maxY = Math.max(maxY, y); + } + + if (minY < -1) { + for (var _i6 = 0; _i6 < sides; _i6++) { + y = points[2 * _i6 + 1] = points[2 * _i6 + 1] + (-1 - minY); + } + } + + return points; + }; + var generateUnitNgonPoints = function generateUnitNgonPoints(sides, rotationRadians) { + var increment = 1.0 / sides * 2 * Math.PI; + var startAngle = sides % 2 === 0 ? Math.PI / 2.0 + increment / 2.0 : Math.PI / 2.0; + startAngle += rotationRadians; + var points = new Array(sides * 2); + var currentAngle; + + for (var i = 0; i < sides; i++) { + currentAngle = i * increment + startAngle; + points[2 * i] = Math.cos(currentAngle); // x + + points[2 * i + 1] = Math.sin(-currentAngle); // y + } + + return points; + }; // Set the default radius, unless half of width or height is smaller than default + + var getRoundRectangleRadius = function getRoundRectangleRadius(width, height) { + return Math.min(width / 4, height / 4, 8); + }; // Set the default radius + + var getRoundPolygonRadius = function getRoundPolygonRadius(width, height) { + return Math.min(width / 10, height / 10, 8); + }; + var getCutRectangleCornerLength = function getCutRectangleCornerLength() { + return 8; + }; + var bezierPtsToQuadCoeff = function bezierPtsToQuadCoeff(p0, p1, p2) { + return [p0 - 2 * p1 + p2, 2 * (p1 - p0), p0]; + }; // get curve width, height, and control point position offsets as a percentage of node height / width + + var getBarrelCurveConstants = function getBarrelCurveConstants(width, height) { + return { + heightOffset: Math.min(15, 0.05 * height), + widthOffset: Math.min(100, 0.25 * width), + ctrlPtOffsetPct: 0.05 + }; + }; + + var pageRankDefaults = defaults$g({ + dampingFactor: 0.8, + precision: 0.000001, + iterations: 200, + weight: function weight(edge) { + return 1; + } + }); + var elesfn$o = { + pageRank: function pageRank(options) { + var _pageRankDefaults = pageRankDefaults(options), + dampingFactor = _pageRankDefaults.dampingFactor, + precision = _pageRankDefaults.precision, + iterations = _pageRankDefaults.iterations, + weight = _pageRankDefaults.weight; + + var cy = this._private.cy; + + var _this$byGroup = this.byGroup(), + nodes = _this$byGroup.nodes, + edges = _this$byGroup.edges; + + var numNodes = nodes.length; + var numNodesSqd = numNodes * numNodes; + var numEdges = edges.length; // Construct transposed adjacency matrix + // First lets have a zeroed matrix of the right size + // We'll also keep track of the sum of each column + + var matrix = new Array(numNodesSqd); + var columnSum = new Array(numNodes); + var additionalProb = (1 - dampingFactor) / numNodes; // Create null matrix + + for (var i = 0; i < numNodes; i++) { + for (var j = 0; j < numNodes; j++) { + var n = i * numNodes + j; + matrix[n] = 0; + } + + columnSum[i] = 0; + } // Now, process edges + + + for (var _i = 0; _i < numEdges; _i++) { + var edge = edges[_i]; + var srcId = edge.data('source'); + var tgtId = edge.data('target'); // Don't include loops in the matrix + + if (srcId === tgtId) { + continue; + } + + var s = nodes.indexOfId(srcId); + var t = nodes.indexOfId(tgtId); + var w = weight(edge); + + var _n = t * numNodes + s; // Update matrix + + + matrix[_n] += w; // Update column sum + + columnSum[s] += w; + } // Add additional probability based on damping factor + // Also, take into account columns that have sum = 0 + + + var p = 1.0 / numNodes + additionalProb; // Shorthand + // Traverse matrix, column by column + + for (var _j = 0; _j < numNodes; _j++) { + if (columnSum[_j] === 0) { + // No 'links' out from node jth, assume equal probability for each possible node + for (var _i2 = 0; _i2 < numNodes; _i2++) { + var _n2 = _i2 * numNodes + _j; + + matrix[_n2] = p; + } + } else { + // Node jth has outgoing link, compute normalized probabilities + for (var _i3 = 0; _i3 < numNodes; _i3++) { + var _n3 = _i3 * numNodes + _j; + + matrix[_n3] = matrix[_n3] / columnSum[_j] + additionalProb; + } + } + } // Compute dominant eigenvector using power method + + + var eigenvector = new Array(numNodes); + var temp = new Array(numNodes); + var previous; // Start with a vector of all 1's + // Also, initialize a null vector which will be used as shorthand + + for (var _i4 = 0; _i4 < numNodes; _i4++) { + eigenvector[_i4] = 1; + } + + for (var iter = 0; iter < iterations; iter++) { + // Temp array with all 0's + for (var _i5 = 0; _i5 < numNodes; _i5++) { + temp[_i5] = 0; + } // Multiply matrix with previous result + + + for (var _i6 = 0; _i6 < numNodes; _i6++) { + for (var _j2 = 0; _j2 < numNodes; _j2++) { + var _n4 = _i6 * numNodes + _j2; + + temp[_i6] += matrix[_n4] * eigenvector[_j2]; + } + } + + inPlaceSumNormalize(temp); + previous = eigenvector; + eigenvector = temp; + temp = previous; + var diff = 0; // Compute difference (squared module) of both vectors + + for (var _i7 = 0; _i7 < numNodes; _i7++) { + var delta = previous[_i7] - eigenvector[_i7]; + diff += delta * delta; + } // If difference is less than the desired threshold, stop iterating + + + if (diff < precision) { + break; + } + } // Construct result + + + var res = { + rank: function rank(node) { + node = cy.collection(node)[0]; + return eigenvector[nodes.indexOf(node)]; + } + }; + return res; + } // pageRank + + }; // elesfn + + var defaults$f = defaults$g({ + root: null, + weight: function weight(edge) { + return 1; + }, + directed: false, + alpha: 0 + }); + var elesfn$n = { + degreeCentralityNormalized: function degreeCentralityNormalized(options) { + options = defaults$f(options); + var cy = this.cy(); + var nodes = this.nodes(); + var numNodes = nodes.length; + + if (!options.directed) { + var degrees = {}; + var maxDegree = 0; + + for (var i = 0; i < numNodes; i++) { + var node = nodes[i]; // add current node to the current options object and call degreeCentrality + + options.root = node; + var currDegree = this.degreeCentrality(options); + + if (maxDegree < currDegree.degree) { + maxDegree = currDegree.degree; + } + + degrees[node.id()] = currDegree.degree; + } + + return { + degree: function degree(node) { + if (maxDegree === 0) { + return 0; + } + + if (string(node)) { + // from is a selector string + node = cy.filter(node); + } + + return degrees[node.id()] / maxDegree; + } + }; + } else { + var indegrees = {}; + var outdegrees = {}; + var maxIndegree = 0; + var maxOutdegree = 0; + + for (var _i = 0; _i < numNodes; _i++) { + var _node = nodes[_i]; + + var id = _node.id(); // add current node to the current options object and call degreeCentrality + + + options.root = _node; + + var _currDegree = this.degreeCentrality(options); + + if (maxIndegree < _currDegree.indegree) maxIndegree = _currDegree.indegree; + if (maxOutdegree < _currDegree.outdegree) maxOutdegree = _currDegree.outdegree; + indegrees[id] = _currDegree.indegree; + outdegrees[id] = _currDegree.outdegree; + } + + return { + indegree: function indegree(node) { + if (maxIndegree == 0) { + return 0; + } + + if (string(node)) { + // from is a selector string + node = cy.filter(node); + } + + return indegrees[node.id()] / maxIndegree; + }, + outdegree: function outdegree(node) { + if (maxOutdegree === 0) { + return 0; + } + + if (string(node)) { + // from is a selector string + node = cy.filter(node); + } + + return outdegrees[node.id()] / maxOutdegree; + } + }; + } + }, + // degreeCentralityNormalized + // Implemented from the algorithm in Opsahl's paper + // "Node centrality in weighted networks: Generalizing degree and shortest paths" + // check the heading 2 "Degree" + degreeCentrality: function degreeCentrality(options) { + options = defaults$f(options); + var cy = this.cy(); + var callingEles = this; + var _options = options, + root = _options.root, + weight = _options.weight, + directed = _options.directed, + alpha = _options.alpha; + root = cy.collection(root)[0]; + + if (!directed) { + var connEdges = root.connectedEdges().intersection(callingEles); + var k = connEdges.length; + var s = 0; // Now, sum edge weights + + for (var i = 0; i < connEdges.length; i++) { + s += weight(connEdges[i]); + } + + return { + degree: Math.pow(k, 1 - alpha) * Math.pow(s, alpha) + }; + } else { + var edges = root.connectedEdges(); + var incoming = edges.filter(function (edge) { + return edge.target().same(root) && callingEles.has(edge); + }); + var outgoing = edges.filter(function (edge) { + return edge.source().same(root) && callingEles.has(edge); + }); + var k_in = incoming.length; + var k_out = outgoing.length; + var s_in = 0; + var s_out = 0; // Now, sum incoming edge weights + + for (var _i2 = 0; _i2 < incoming.length; _i2++) { + s_in += weight(incoming[_i2]); + } // Now, sum outgoing edge weights + + + for (var _i3 = 0; _i3 < outgoing.length; _i3++) { + s_out += weight(outgoing[_i3]); + } + + return { + indegree: Math.pow(k_in, 1 - alpha) * Math.pow(s_in, alpha), + outdegree: Math.pow(k_out, 1 - alpha) * Math.pow(s_out, alpha) + }; + } + } // degreeCentrality + + }; // elesfn + // nice, short mathematical alias + + elesfn$n.dc = elesfn$n.degreeCentrality; + elesfn$n.dcn = elesfn$n.degreeCentralityNormalised = elesfn$n.degreeCentralityNormalized; + + var defaults$e = defaults$g({ + harmonic: true, + weight: function weight() { + return 1; + }, + directed: false, + root: null + }); + var elesfn$m = { + closenessCentralityNormalized: function closenessCentralityNormalized(options) { + var _defaults = defaults$e(options), + harmonic = _defaults.harmonic, + weight = _defaults.weight, + directed = _defaults.directed; + + var cy = this.cy(); + var closenesses = {}; + var maxCloseness = 0; + var nodes = this.nodes(); + var fw = this.floydWarshall({ + weight: weight, + directed: directed + }); // Compute closeness for every node and find the maximum closeness + + for (var i = 0; i < nodes.length; i++) { + var currCloseness = 0; + var node_i = nodes[i]; + + for (var j = 0; j < nodes.length; j++) { + if (i !== j) { + var d = fw.distance(node_i, nodes[j]); + + if (harmonic) { + currCloseness += 1 / d; + } else { + currCloseness += d; + } + } + } + + if (!harmonic) { + currCloseness = 1 / currCloseness; + } + + if (maxCloseness < currCloseness) { + maxCloseness = currCloseness; + } + + closenesses[node_i.id()] = currCloseness; + } + + return { + closeness: function closeness(node) { + if (maxCloseness == 0) { + return 0; + } + + if (string(node)) { + // from is a selector string + node = cy.filter(node)[0].id(); + } else { + // from is a node + node = node.id(); + } + + return closenesses[node] / maxCloseness; + } + }; + }, + // Implemented from pseudocode from wikipedia + closenessCentrality: function closenessCentrality(options) { + var _defaults2 = defaults$e(options), + root = _defaults2.root, + weight = _defaults2.weight, + directed = _defaults2.directed, + harmonic = _defaults2.harmonic; + + root = this.filter(root)[0]; // we need distance from this node to every other node + + var dijkstra = this.dijkstra({ + root: root, + weight: weight, + directed: directed + }); + var totalDistance = 0; + var nodes = this.nodes(); + + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + + if (!n.same(root)) { + var d = dijkstra.distanceTo(n); + + if (harmonic) { + totalDistance += 1 / d; + } else { + totalDistance += d; + } + } + } + + return harmonic ? totalDistance : 1 / totalDistance; + } // closenessCentrality + + }; // elesfn + // nice, short mathematical alias + + elesfn$m.cc = elesfn$m.closenessCentrality; + elesfn$m.ccn = elesfn$m.closenessCentralityNormalised = elesfn$m.closenessCentralityNormalized; + + var defaults$d = defaults$g({ + weight: null, + directed: false + }); + var elesfn$l = { + // Implemented from the algorithm in the paper "On Variants of Shortest-Path Betweenness Centrality and their Generic Computation" by Ulrik Brandes + betweennessCentrality: function betweennessCentrality(options) { + var _defaults = defaults$d(options), + directed = _defaults.directed, + weight = _defaults.weight; + + var weighted = weight != null; + var cy = this.cy(); // starting + + var V = this.nodes(); + var A = {}; + var _C = {}; + var max = 0; + var C = { + set: function set(key, val) { + _C[key] = val; + + if (val > max) { + max = val; + } + }, + get: function get(key) { + return _C[key]; + } + }; // A contains the neighborhoods of every node + + for (var i = 0; i < V.length; i++) { + var v = V[i]; + var vid = v.id(); + + if (directed) { + A[vid] = v.outgoers().nodes(); // get outgoers of every node + } else { + A[vid] = v.openNeighborhood().nodes(); // get neighbors of every node + } + + C.set(vid, 0); + } + + var _loop = function _loop(s) { + var sid = V[s].id(); + var S = []; // stack + + var P = {}; + var g = {}; + var d = {}; + var Q = new heap(function (a, b) { + return d[a] - d[b]; + }); // queue + // init dictionaries + + for (var _i = 0; _i < V.length; _i++) { + var _vid = V[_i].id(); + + P[_vid] = []; + g[_vid] = 0; + d[_vid] = Infinity; + } + + g[sid] = 1; // sigma + + d[sid] = 0; // distance to s + + Q.push(sid); + + while (!Q.empty()) { + var _v = Q.pop(); + + S.push(_v); + + if (weighted) { + for (var j = 0; j < A[_v].length; j++) { + var w = A[_v][j]; + var vEle = cy.getElementById(_v); + var edge = void 0; + + if (vEle.edgesTo(w).length > 0) { + edge = vEle.edgesTo(w)[0]; + } else { + edge = w.edgesTo(vEle)[0]; + } + + var edgeWeight = weight(edge); + w = w.id(); + + if (d[w] > d[_v] + edgeWeight) { + d[w] = d[_v] + edgeWeight; + + if (Q.nodes.indexOf(w) < 0) { + //if w is not in Q + Q.push(w); + } else { + // update position if w is in Q + Q.updateItem(w); + } + + g[w] = 0; + P[w] = []; + } + + if (d[w] == d[_v] + edgeWeight) { + g[w] = g[w] + g[_v]; + P[w].push(_v); + } + } + } else { + for (var _j = 0; _j < A[_v].length; _j++) { + var _w = A[_v][_j].id(); + + if (d[_w] == Infinity) { + Q.push(_w); + d[_w] = d[_v] + 1; + } + + if (d[_w] == d[_v] + 1) { + g[_w] = g[_w] + g[_v]; + + P[_w].push(_v); + } + } + } + } + + var e = {}; + + for (var _i2 = 0; _i2 < V.length; _i2++) { + e[V[_i2].id()] = 0; + } + + while (S.length > 0) { + var _w2 = S.pop(); + + for (var _j2 = 0; _j2 < P[_w2].length; _j2++) { + var _v2 = P[_w2][_j2]; + e[_v2] = e[_v2] + g[_v2] / g[_w2] * (1 + e[_w2]); + } + + if (_w2 != V[s].id()) { + C.set(_w2, C.get(_w2) + e[_w2]); + } + } + }; + + for (var s = 0; s < V.length; s++) { + _loop(s); + } + + var ret = { + betweenness: function betweenness(node) { + var id = cy.collection(node).id(); + return C.get(id); + }, + betweennessNormalized: function betweennessNormalized(node) { + if (max == 0) { + return 0; + } + + var id = cy.collection(node).id(); + return C.get(id) / max; + } + }; // alias + + ret.betweennessNormalised = ret.betweennessNormalized; + return ret; + } // betweennessCentrality + + }; // elesfn + // nice, short mathematical alias + + elesfn$l.bc = elesfn$l.betweennessCentrality; + + // Implemented by Zoe Xi @zoexi for GSOC 2016 + /* eslint-disable no-unused-vars */ + + var defaults$c = defaults$g({ + expandFactor: 2, + // affects time of computation and cluster granularity to some extent: M * M + inflateFactor: 2, + // affects cluster granularity (the greater the value, the more clusters): M(i,j) / E(j) + multFactor: 1, + // optional self loops for each node. Use a neutral value to improve cluster computations. + maxIterations: 20, + // maximum number of iterations of the MCL algorithm in a single run + attributes: [// attributes/features used to group nodes, ie. similarity values between nodes + function (edge) { + return 1; + }] + }); + /* eslint-enable */ + + var setOptions$3 = function setOptions(options) { + return defaults$c(options); + }; + /* eslint-enable */ + + + var getSimilarity$1 = function getSimilarity(edge, attributes) { + var total = 0; + + for (var i = 0; i < attributes.length; i++) { + total += attributes[i](edge); + } + + return total; + }; + + var addLoops = function addLoops(M, n, val) { + for (var i = 0; i < n; i++) { + M[i * n + i] = val; + } + }; + + var normalize = function normalize(M, n) { + var sum; + + for (var col = 0; col < n; col++) { + sum = 0; + + for (var row = 0; row < n; row++) { + sum += M[row * n + col]; + } + + for (var _row = 0; _row < n; _row++) { + M[_row * n + col] = M[_row * n + col] / sum; + } + } + }; // TODO: blocked matrix multiplication? + + + var mmult = function mmult(A, B, n) { + var C = new Array(n * n); + + for (var i = 0; i < n; i++) { + for (var j = 0; j < n; j++) { + C[i * n + j] = 0; + } + + for (var k = 0; k < n; k++) { + for (var _j = 0; _j < n; _j++) { + C[i * n + _j] += A[i * n + k] * B[k * n + _j]; + } + } + } + + return C; + }; + + var expand = function expand(M, n, expandFactor + /** power **/ + ) { + var _M = M.slice(0); + + for (var p = 1; p < expandFactor; p++) { + M = mmult(M, _M, n); + } + + return M; + }; + + var inflate = function inflate(M, n, inflateFactor + /** r **/ + ) { + var _M = new Array(n * n); // M(i,j) ^ inflatePower + + + for (var i = 0; i < n * n; i++) { + _M[i] = Math.pow(M[i], inflateFactor); + } + + normalize(_M, n); + return _M; + }; + + var hasConverged = function hasConverged(M, _M, n2, roundFactor) { + // Check that both matrices have the same elements (i,j) + for (var i = 0; i < n2; i++) { + var v1 = Math.round(M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor); // truncate to 'roundFactor' decimal places + + var v2 = Math.round(_M[i] * Math.pow(10, roundFactor)) / Math.pow(10, roundFactor); + + if (v1 !== v2) { + return false; + } + } + + return true; + }; + + var assign$2 = function assign(M, n, nodes, cy) { + var clusters = []; + + for (var i = 0; i < n; i++) { + var cluster = []; + + for (var j = 0; j < n; j++) { + // Row-wise attractors and elements that they attract belong in same cluster + if (Math.round(M[i * n + j] * 1000) / 1000 > 0) { + cluster.push(nodes[j]); + } + } + + if (cluster.length !== 0) { + clusters.push(cy.collection(cluster)); + } + } + + return clusters; + }; + + var isDuplicate = function isDuplicate(c1, c2) { + for (var i = 0; i < c1.length; i++) { + if (!c2[i] || c1[i].id() !== c2[i].id()) { + return false; + } + } + + return true; + }; + + var removeDuplicates = function removeDuplicates(clusters) { + for (var i = 0; i < clusters.length; i++) { + for (var j = 0; j < clusters.length; j++) { + if (i != j && isDuplicate(clusters[i], clusters[j])) { + clusters.splice(j, 1); + } + } + } + + return clusters; + }; + + var markovClustering = function markovClustering(options) { + var nodes = this.nodes(); + var edges = this.edges(); + var cy = this.cy(); // Set parameters of algorithm: + + var opts = setOptions$3(options); // Map each node to its position in node array + + var id2position = {}; + + for (var i = 0; i < nodes.length; i++) { + id2position[nodes[i].id()] = i; + } // Generate stochastic matrix M from input graph G (should be symmetric/undirected) + + + var n = nodes.length, + n2 = n * n; + + var M = new Array(n2), + _M; + + for (var _i = 0; _i < n2; _i++) { + M[_i] = 0; + } + + for (var e = 0; e < edges.length; e++) { + var edge = edges[e]; + var _i2 = id2position[edge.source().id()]; + var j = id2position[edge.target().id()]; + var sim = getSimilarity$1(edge, opts.attributes); + M[_i2 * n + j] += sim; // G should be symmetric and undirected + + M[j * n + _i2] += sim; + } // Begin Markov cluster algorithm + // Step 1: Add self loops to each node, ie. add multFactor to matrix diagonal + + + addLoops(M, n, opts.multFactor); // Step 2: M = normalize( M ); + + normalize(M, n); + var isStillMoving = true; + var iterations = 0; + + while (isStillMoving && iterations < opts.maxIterations) { + isStillMoving = false; // Step 3: + + _M = expand(M, n, opts.expandFactor); // Step 4: + + M = inflate(_M, n, opts.inflateFactor); // Step 5: check to see if ~steady state has been reached + + if (!hasConverged(M, _M, n2, 4)) { + isStillMoving = true; + } + + iterations++; + } // Build clusters from matrix + + + var clusters = assign$2(M, n, nodes, cy); // Remove duplicate clusters due to symmetry of graph and M matrix + + clusters = removeDuplicates(clusters); + return clusters; + }; + + var markovClustering$1 = { + markovClustering: markovClustering, + mcl: markovClustering + }; + + // Common distance metrics for clustering algorithms + + var identity = function identity(x) { + return x; + }; + + var absDiff = function absDiff(p, q) { + return Math.abs(q - p); + }; + + var addAbsDiff = function addAbsDiff(total, p, q) { + return total + absDiff(p, q); + }; + + var addSquaredDiff = function addSquaredDiff(total, p, q) { + return total + Math.pow(q - p, 2); + }; + + var sqrt = function sqrt(x) { + return Math.sqrt(x); + }; + + var maxAbsDiff = function maxAbsDiff(currentMax, p, q) { + return Math.max(currentMax, absDiff(p, q)); + }; + + var getDistance = function getDistance(length, getP, getQ, init, visit) { + var post = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : identity; + var ret = init; + var p, q; + + for (var dim = 0; dim < length; dim++) { + p = getP(dim); + q = getQ(dim); + ret = visit(ret, p, q); + } + + return post(ret); + }; + + var distances = { + euclidean: function euclidean(length, getP, getQ) { + if (length >= 2) { + return getDistance(length, getP, getQ, 0, addSquaredDiff, sqrt); + } else { + // for single attr case, more efficient to avoid sqrt + return getDistance(length, getP, getQ, 0, addAbsDiff); + } + }, + squaredEuclidean: function squaredEuclidean(length, getP, getQ) { + return getDistance(length, getP, getQ, 0, addSquaredDiff); + }, + manhattan: function manhattan(length, getP, getQ) { + return getDistance(length, getP, getQ, 0, addAbsDiff); + }, + max: function max(length, getP, getQ) { + return getDistance(length, getP, getQ, -Infinity, maxAbsDiff); + } + }; // in case the user accidentally doesn't use camel case + + distances['squared-euclidean'] = distances['squaredEuclidean']; + distances['squaredeuclidean'] = distances['squaredEuclidean']; + function clusteringDistance (method, length, getP, getQ, nodeP, nodeQ) { + var impl; + + if (fn$6(method)) { + impl = method; + } else { + impl = distances[method] || distances.euclidean; + } + + if (length === 0 && fn$6(method)) { + return impl(nodeP, nodeQ); + } else { + return impl(length, getP, getQ, nodeP, nodeQ); + } + } + + var defaults$b = defaults$g({ + k: 2, + m: 2, + sensitivityThreshold: 0.0001, + distance: 'euclidean', + maxIterations: 10, + attributes: [], + testMode: false, + testCentroids: null + }); + + var setOptions$2 = function setOptions(options) { + return defaults$b(options); + }; + /* eslint-enable */ + + + var getDist = function getDist(type, node, centroid, attributes, mode) { + var noNodeP = mode !== 'kMedoids'; + var getP = noNodeP ? function (i) { + return centroid[i]; + } : function (i) { + return attributes[i](centroid); + }; + + var getQ = function getQ(i) { + return attributes[i](node); + }; + + var nodeP = centroid; + var nodeQ = node; + return clusteringDistance(type, attributes.length, getP, getQ, nodeP, nodeQ); + }; + + var randomCentroids = function randomCentroids(nodes, k, attributes) { + var ndim = attributes.length; + var min = new Array(ndim); + var max = new Array(ndim); + var centroids = new Array(k); + var centroid = null; // Find min, max values for each attribute dimension + + for (var i = 0; i < ndim; i++) { + min[i] = nodes.min(attributes[i]).value; + max[i] = nodes.max(attributes[i]).value; + } // Build k centroids, each represented as an n-dim feature vector + + + for (var c = 0; c < k; c++) { + centroid = []; + + for (var _i = 0; _i < ndim; _i++) { + centroid[_i] = Math.random() * (max[_i] - min[_i]) + min[_i]; // random initial value + } + + centroids[c] = centroid; + } + + return centroids; + }; + + var classify = function classify(node, centroids, distance, attributes, type) { + var min = Infinity; + var index = 0; + + for (var i = 0; i < centroids.length; i++) { + var dist = getDist(distance, node, centroids[i], attributes, type); + + if (dist < min) { + min = dist; + index = i; + } + } + + return index; + }; + + var buildCluster = function buildCluster(centroid, nodes, assignment) { + var cluster = []; + var node = null; + + for (var n = 0; n < nodes.length; n++) { + node = nodes[n]; + + if (assignment[node.id()] === centroid) { + //console.log("Node " + node.id() + " is associated with medoid #: " + m); + cluster.push(node); + } + } + + return cluster; + }; + + var haveValuesConverged = function haveValuesConverged(v1, v2, sensitivityThreshold) { + return Math.abs(v2 - v1) <= sensitivityThreshold; + }; + + var haveMatricesConverged = function haveMatricesConverged(v1, v2, sensitivityThreshold) { + for (var i = 0; i < v1.length; i++) { + for (var j = 0; j < v1[i].length; j++) { + var diff = Math.abs(v1[i][j] - v2[i][j]); + + if (diff > sensitivityThreshold) { + return false; + } + } + } + + return true; + }; + + var seenBefore = function seenBefore(node, medoids, n) { + for (var i = 0; i < n; i++) { + if (node === medoids[i]) return true; + } + + return false; + }; + + var randomMedoids = function randomMedoids(nodes, k) { + var medoids = new Array(k); // For small data sets, the probability of medoid conflict is greater, + // so we need to check to see if we've already seen or chose this node before. + + if (nodes.length < 50) { + // Randomly select k medoids from the n nodes + for (var i = 0; i < k; i++) { + var node = nodes[Math.floor(Math.random() * nodes.length)]; // If we've already chosen this node to be a medoid, don't choose it again (for small data sets). + // Instead choose a different random node. + + while (seenBefore(node, medoids, i)) { + node = nodes[Math.floor(Math.random() * nodes.length)]; + } + + medoids[i] = node; + } + } else { + // Relatively large data set, so pretty safe to not check and just select random nodes + for (var _i2 = 0; _i2 < k; _i2++) { + medoids[_i2] = nodes[Math.floor(Math.random() * nodes.length)]; + } + } + + return medoids; + }; + + var findCost = function findCost(potentialNewMedoid, cluster, attributes) { + var cost = 0; + + for (var n = 0; n < cluster.length; n++) { + cost += getDist('manhattan', cluster[n], potentialNewMedoid, attributes, 'kMedoids'); + } + + return cost; + }; + + var kMeans = function kMeans(options) { + var cy = this.cy(); + var nodes = this.nodes(); + var node = null; // Set parameters of algorithm: # of clusters, distance metric, etc. + + var opts = setOptions$2(options); // Begin k-means algorithm + + var clusters = new Array(opts.k); + var assignment = {}; + var centroids; // Step 1: Initialize centroid positions + + if (opts.testMode) { + if (typeof opts.testCentroids === 'number') { + // TODO: implement a seeded random number generator. + opts.testCentroids; + centroids = randomCentroids(nodes, opts.k, opts.attributes); + } else if (_typeof(opts.testCentroids) === 'object') { + centroids = opts.testCentroids; + } else { + centroids = randomCentroids(nodes, opts.k, opts.attributes); + } + } else { + centroids = randomCentroids(nodes, opts.k, opts.attributes); + } + + var isStillMoving = true; + var iterations = 0; + + while (isStillMoving && iterations < opts.maxIterations) { + // Step 2: Assign nodes to the nearest centroid + for (var n = 0; n < nodes.length; n++) { + node = nodes[n]; // Determine which cluster this node belongs to: node id => cluster # + + assignment[node.id()] = classify(node, centroids, opts.distance, opts.attributes, 'kMeans'); + } // Step 3: For each of the k clusters, update its centroid + + + isStillMoving = false; + + for (var c = 0; c < opts.k; c++) { + // Get all nodes that belong to this cluster + var cluster = buildCluster(c, nodes, assignment); + + if (cluster.length === 0) { + // If cluster is empty, break out early & move to next cluster + continue; + } // Update centroids by calculating avg of all nodes within the cluster. + + + var ndim = opts.attributes.length; + var centroid = centroids[c]; // [ dim_1, dim_2, dim_3, ... , dim_n ] + + var newCentroid = new Array(ndim); + var sum = new Array(ndim); + + for (var d = 0; d < ndim; d++) { + sum[d] = 0.0; + + for (var i = 0; i < cluster.length; i++) { + node = cluster[i]; + sum[d] += opts.attributes[d](node); + } + + newCentroid[d] = sum[d] / cluster.length; // Check to see if algorithm has converged, i.e. when centroids no longer change + + if (!haveValuesConverged(newCentroid[d], centroid[d], opts.sensitivityThreshold)) { + isStillMoving = true; + } + } + + centroids[c] = newCentroid; + clusters[c] = cy.collection(cluster); + } + + iterations++; + } + + return clusters; + }; + + var kMedoids = function kMedoids(options) { + var cy = this.cy(); + var nodes = this.nodes(); + var node = null; + var opts = setOptions$2(options); // Begin k-medoids algorithm + + var clusters = new Array(opts.k); + var medoids; + var assignment = {}; + var curCost; + var minCosts = new Array(opts.k); // minimum cost configuration for each cluster + // Step 1: Initialize k medoids + + if (opts.testMode) { + if (typeof opts.testCentroids === 'number') ; else if (_typeof(opts.testCentroids) === 'object') { + medoids = opts.testCentroids; + } else { + medoids = randomMedoids(nodes, opts.k); + } + } else { + medoids = randomMedoids(nodes, opts.k); + } + + var isStillMoving = true; + var iterations = 0; + + while (isStillMoving && iterations < opts.maxIterations) { + // Step 2: Assign nodes to the nearest medoid + for (var n = 0; n < nodes.length; n++) { + node = nodes[n]; // Determine which cluster this node belongs to: node id => cluster # + + assignment[node.id()] = classify(node, medoids, opts.distance, opts.attributes, 'kMedoids'); + } + + isStillMoving = false; // Step 3: For each medoid m, and for each node associated with mediod m, + // select the node with the lowest configuration cost as new medoid. + + for (var m = 0; m < medoids.length; m++) { + // Get all nodes that belong to this medoid + var cluster = buildCluster(m, nodes, assignment); + + if (cluster.length === 0) { + // If cluster is empty, break out early & move to next cluster + continue; + } + + minCosts[m] = findCost(medoids[m], cluster, opts.attributes); // original cost + // Select different medoid if its configuration has the lowest cost + + for (var _n = 0; _n < cluster.length; _n++) { + curCost = findCost(cluster[_n], cluster, opts.attributes); + + if (curCost < minCosts[m]) { + minCosts[m] = curCost; + medoids[m] = cluster[_n]; + isStillMoving = true; + } + } + + clusters[m] = cy.collection(cluster); + } + + iterations++; + } + + return clusters; + }; + + var updateCentroids = function updateCentroids(centroids, nodes, U, weight, opts) { + var numerator, denominator; + + for (var n = 0; n < nodes.length; n++) { + for (var c = 0; c < centroids.length; c++) { + weight[n][c] = Math.pow(U[n][c], opts.m); + } + } + + for (var _c = 0; _c < centroids.length; _c++) { + for (var dim = 0; dim < opts.attributes.length; dim++) { + numerator = 0; + denominator = 0; + + for (var _n2 = 0; _n2 < nodes.length; _n2++) { + numerator += weight[_n2][_c] * opts.attributes[dim](nodes[_n2]); + denominator += weight[_n2][_c]; + } + + centroids[_c][dim] = numerator / denominator; + } + } + }; + + var updateMembership = function updateMembership(U, _U, centroids, nodes, opts) { + // Save previous step + for (var i = 0; i < U.length; i++) { + _U[i] = U[i].slice(); + } + + var sum, numerator, denominator; + var pow = 2 / (opts.m - 1); + + for (var c = 0; c < centroids.length; c++) { + for (var n = 0; n < nodes.length; n++) { + sum = 0; + + for (var k = 0; k < centroids.length; k++) { + // against all other centroids + numerator = getDist(opts.distance, nodes[n], centroids[c], opts.attributes, 'cmeans'); + denominator = getDist(opts.distance, nodes[n], centroids[k], opts.attributes, 'cmeans'); + sum += Math.pow(numerator / denominator, pow); + } + + U[n][c] = 1 / sum; + } + } + }; + + var assign$1 = function assign(nodes, U, opts, cy) { + var clusters = new Array(opts.k); + + for (var c = 0; c < clusters.length; c++) { + clusters[c] = []; + } + + var max; + var index; + + for (var n = 0; n < U.length; n++) { + // for each node (U is N x C matrix) + max = -Infinity; + index = -1; // Determine which cluster the node is most likely to belong in + + for (var _c2 = 0; _c2 < U[0].length; _c2++) { + if (U[n][_c2] > max) { + max = U[n][_c2]; + index = _c2; + } + } + + clusters[index].push(nodes[n]); + } // Turn every array into a collection of nodes + + + for (var _c3 = 0; _c3 < clusters.length; _c3++) { + clusters[_c3] = cy.collection(clusters[_c3]); + } + + return clusters; + }; + + var fuzzyCMeans = function fuzzyCMeans(options) { + var cy = this.cy(); + var nodes = this.nodes(); + var opts = setOptions$2(options); // Begin fuzzy c-means algorithm + + var clusters; + var centroids; + var U; + + var _U; + + var weight; // Step 1: Initialize letiables. + + _U = new Array(nodes.length); + + for (var i = 0; i < nodes.length; i++) { + // N x C matrix + _U[i] = new Array(opts.k); + } + + U = new Array(nodes.length); + + for (var _i3 = 0; _i3 < nodes.length; _i3++) { + // N x C matrix + U[_i3] = new Array(opts.k); + } + + for (var _i4 = 0; _i4 < nodes.length; _i4++) { + var total = 0; + + for (var j = 0; j < opts.k; j++) { + U[_i4][j] = Math.random(); + total += U[_i4][j]; + } + + for (var _j = 0; _j < opts.k; _j++) { + U[_i4][_j] = U[_i4][_j] / total; + } + } + + centroids = new Array(opts.k); + + for (var _i5 = 0; _i5 < opts.k; _i5++) { + centroids[_i5] = new Array(opts.attributes.length); + } + + weight = new Array(nodes.length); + + for (var _i6 = 0; _i6 < nodes.length; _i6++) { + // N x C matrix + weight[_i6] = new Array(opts.k); + } // end init FCM + + + var isStillMoving = true; + var iterations = 0; + + while (isStillMoving && iterations < opts.maxIterations) { + isStillMoving = false; // Step 2: Calculate the centroids for each step. + + updateCentroids(centroids, nodes, U, weight, opts); // Step 3: Update the partition matrix U. + + updateMembership(U, _U, centroids, nodes, opts); // Step 4: Check for convergence. + + if (!haveMatricesConverged(U, _U, opts.sensitivityThreshold)) { + isStillMoving = true; + } + + iterations++; + } // Assign nodes to clusters with highest probability. + + + clusters = assign$1(nodes, U, opts, cy); + return { + clusters: clusters, + degreeOfMembership: U + }; + }; + + var kClustering = { + kMeans: kMeans, + kMedoids: kMedoids, + fuzzyCMeans: fuzzyCMeans, + fcm: fuzzyCMeans + }; + + // Implemented by Zoe Xi @zoexi for GSOC 2016 + var defaults$a = defaults$g({ + distance: 'euclidean', + // distance metric to compare nodes + linkage: 'min', + // linkage criterion : how to determine the distance between clusters of nodes + mode: 'threshold', + // mode:'threshold' => clusters must be threshold distance apart + threshold: Infinity, + // the distance threshold + // mode:'dendrogram' => the nodes are organised as leaves in a tree (siblings are close), merging makes clusters + addDendrogram: false, + // whether to add the dendrogram to the graph for viz + dendrogramDepth: 0, + // depth at which dendrogram branches are merged into the returned clusters + attributes: [] // array of attr functions + + }); + var linkageAliases = { + 'single': 'min', + 'complete': 'max' + }; + + var setOptions$1 = function setOptions(options) { + var opts = defaults$a(options); + var preferredAlias = linkageAliases[opts.linkage]; + + if (preferredAlias != null) { + opts.linkage = preferredAlias; + } + + return opts; + }; + + var mergeClosest = function mergeClosest(clusters, index, dists, mins, opts) { + // Find two closest clusters from cached mins + var minKey = 0; + var min = Infinity; + var dist; + var attrs = opts.attributes; + + var getDist = function getDist(n1, n2) { + return clusteringDistance(opts.distance, attrs.length, function (i) { + return attrs[i](n1); + }, function (i) { + return attrs[i](n2); + }, n1, n2); + }; + + for (var i = 0; i < clusters.length; i++) { + var key = clusters[i].key; + var _dist = dists[key][mins[key]]; + + if (_dist < min) { + minKey = key; + min = _dist; + } + } + + if (opts.mode === 'threshold' && min >= opts.threshold || opts.mode === 'dendrogram' && clusters.length === 1) { + return false; + } + + var c1 = index[minKey]; + var c2 = index[mins[minKey]]; + var merged; // Merge two closest clusters + + if (opts.mode === 'dendrogram') { + merged = { + left: c1, + right: c2, + key: c1.key + }; + } else { + merged = { + value: c1.value.concat(c2.value), + key: c1.key + }; + } + + clusters[c1.index] = merged; + clusters.splice(c2.index, 1); + index[c1.key] = merged; // Update distances with new merged cluster + + for (var _i = 0; _i < clusters.length; _i++) { + var cur = clusters[_i]; + + if (c1.key === cur.key) { + dist = Infinity; + } else if (opts.linkage === 'min') { + dist = dists[c1.key][cur.key]; + + if (dists[c1.key][cur.key] > dists[c2.key][cur.key]) { + dist = dists[c2.key][cur.key]; + } + } else if (opts.linkage === 'max') { + dist = dists[c1.key][cur.key]; + + if (dists[c1.key][cur.key] < dists[c2.key][cur.key]) { + dist = dists[c2.key][cur.key]; + } + } else if (opts.linkage === 'mean') { + dist = (dists[c1.key][cur.key] * c1.size + dists[c2.key][cur.key] * c2.size) / (c1.size + c2.size); + } else { + if (opts.mode === 'dendrogram') dist = getDist(cur.value, c1.value);else dist = getDist(cur.value[0], c1.value[0]); + } + + dists[c1.key][cur.key] = dists[cur.key][c1.key] = dist; // distance matrix is symmetric + } // Update cached mins + + + for (var _i2 = 0; _i2 < clusters.length; _i2++) { + var key1 = clusters[_i2].key; + + if (mins[key1] === c1.key || mins[key1] === c2.key) { + var _min = key1; + + for (var j = 0; j < clusters.length; j++) { + var key2 = clusters[j].key; + + if (dists[key1][key2] < dists[key1][_min]) { + _min = key2; + } + } + + mins[key1] = _min; + } + + clusters[_i2].index = _i2; + } // Clean up meta data used for clustering + + + c1.key = c2.key = c1.index = c2.index = null; + return true; + }; + + var getAllChildren = function getAllChildren(root, arr, cy) { + if (!root) return; + + if (root.value) { + arr.push(root.value); + } else { + if (root.left) getAllChildren(root.left, arr); + if (root.right) getAllChildren(root.right, arr); + } + }; + + var buildDendrogram = function buildDendrogram(root, cy) { + if (!root) return ''; + + if (root.left && root.right) { + var leftStr = buildDendrogram(root.left, cy); + var rightStr = buildDendrogram(root.right, cy); + var node = cy.add({ + group: 'nodes', + data: { + id: leftStr + ',' + rightStr + } + }); + cy.add({ + group: 'edges', + data: { + source: leftStr, + target: node.id() + } + }); + cy.add({ + group: 'edges', + data: { + source: rightStr, + target: node.id() + } + }); + return node.id(); + } else if (root.value) { + return root.value.id(); + } + }; + + var buildClustersFromTree = function buildClustersFromTree(root, k, cy) { + if (!root) return []; + var left = [], + right = [], + leaves = []; + + if (k === 0) { + // don't cut tree, simply return all nodes as 1 single cluster + if (root.left) getAllChildren(root.left, left); + if (root.right) getAllChildren(root.right, right); + leaves = left.concat(right); + return [cy.collection(leaves)]; + } else if (k === 1) { + // cut at root + if (root.value) { + // leaf node + return [cy.collection(root.value)]; + } else { + if (root.left) getAllChildren(root.left, left); + if (root.right) getAllChildren(root.right, right); + return [cy.collection(left), cy.collection(right)]; + } + } else { + if (root.value) { + return [cy.collection(root.value)]; + } else { + if (root.left) left = buildClustersFromTree(root.left, k - 1, cy); + if (root.right) right = buildClustersFromTree(root.right, k - 1, cy); + return left.concat(right); + } + } + }; + /* eslint-enable */ + + + var hierarchicalClustering = function hierarchicalClustering(options) { + var cy = this.cy(); + var nodes = this.nodes(); // Set parameters of algorithm: linkage type, distance metric, etc. + + var opts = setOptions$1(options); + var attrs = opts.attributes; + + var getDist = function getDist(n1, n2) { + return clusteringDistance(opts.distance, attrs.length, function (i) { + return attrs[i](n1); + }, function (i) { + return attrs[i](n2); + }, n1, n2); + }; // Begin hierarchical algorithm + + + var clusters = []; + var dists = []; // distances between each pair of clusters + + var mins = []; // closest cluster for each cluster + + var index = []; // hash of all clusters by key + // In agglomerative (bottom-up) clustering, each node starts as its own cluster + + for (var n = 0; n < nodes.length; n++) { + var cluster = { + value: opts.mode === 'dendrogram' ? nodes[n] : [nodes[n]], + key: n, + index: n + }; + clusters[n] = cluster; + index[n] = cluster; + dists[n] = []; + mins[n] = 0; + } // Calculate the distance between each pair of clusters + + + for (var i = 0; i < clusters.length; i++) { + for (var j = 0; j <= i; j++) { + var dist = void 0; + + if (opts.mode === 'dendrogram') { + // modes store cluster values differently + dist = i === j ? Infinity : getDist(clusters[i].value, clusters[j].value); + } else { + dist = i === j ? Infinity : getDist(clusters[i].value[0], clusters[j].value[0]); + } + + dists[i][j] = dist; + dists[j][i] = dist; + + if (dist < dists[i][mins[i]]) { + mins[i] = j; // Cache mins: closest cluster to cluster i is cluster j + } + } + } // Find the closest pair of clusters and merge them into a single cluster. + // Update distances between new cluster and each of the old clusters, and loop until threshold reached. + + + var merged = mergeClosest(clusters, index, dists, mins, opts); + + while (merged) { + merged = mergeClosest(clusters, index, dists, mins, opts); + } + + var retClusters; // Dendrogram mode builds the hierarchy and adds intermediary nodes + edges + // in addition to returning the clusters. + + if (opts.mode === 'dendrogram') { + retClusters = buildClustersFromTree(clusters[0], opts.dendrogramDepth, cy); + if (opts.addDendrogram) buildDendrogram(clusters[0], cy); + } else { + // Regular mode simply returns the clusters + retClusters = new Array(clusters.length); + clusters.forEach(function (cluster, i) { + // Clean up meta data used for clustering + cluster.key = cluster.index = null; + retClusters[i] = cy.collection(cluster.value); + }); + } + + return retClusters; + }; + + var hierarchicalClustering$1 = { + hierarchicalClustering: hierarchicalClustering, + hca: hierarchicalClustering + }; + + // Implemented by Zoe Xi @zoexi for GSOC 2016 + var defaults$9 = defaults$g({ + distance: 'euclidean', + // distance metric to compare attributes between two nodes + preference: 'median', + // suitability of a data point to serve as an exemplar + damping: 0.8, + // damping factor between [0.5, 1) + maxIterations: 1000, + // max number of iterations to run + minIterations: 100, + // min number of iterations to run in order for clustering to stop + attributes: [// functions to quantify the similarity between any two points + // e.g. node => node.data('weight') + ] + }); + + var setOptions = function setOptions(options) { + var dmp = options.damping; + var pref = options.preference; + + if (!(0.5 <= dmp && dmp < 1)) { + error("Damping must range on [0.5, 1). Got: ".concat(dmp)); + } + + var validPrefs = ['median', 'mean', 'min', 'max']; + + if (!(validPrefs.some(function (v) { + return v === pref; + }) || number$1(pref))) { + error("Preference must be one of [".concat(validPrefs.map(function (p) { + return "'".concat(p, "'"); + }).join(', '), "] or a number. Got: ").concat(pref)); + } + + return defaults$9(options); + }; + /* eslint-enable */ + + + var getSimilarity = function getSimilarity(type, n1, n2, attributes) { + var attr = function attr(n, i) { + return attributes[i](n); + }; // nb negative because similarity should have an inverse relationship to distance + + + return -clusteringDistance(type, attributes.length, function (i) { + return attr(n1, i); + }, function (i) { + return attr(n2, i); + }, n1, n2); + }; + + var getPreference = function getPreference(S, preference) { + // larger preference = greater # of clusters + var p = null; + + if (preference === 'median') { + p = median(S); + } else if (preference === 'mean') { + p = mean(S); + } else if (preference === 'min') { + p = min(S); + } else if (preference === 'max') { + p = max(S); + } else { + // Custom preference number, as set by user + p = preference; + } + + return p; + }; + + var findExemplars = function findExemplars(n, R, A) { + var indices = []; + + for (var i = 0; i < n; i++) { + if (R[i * n + i] + A[i * n + i] > 0) { + indices.push(i); + } + } + + return indices; + }; + + var assignClusters = function assignClusters(n, S, exemplars) { + var clusters = []; + + for (var i = 0; i < n; i++) { + var index = -1; + var max = -Infinity; + + for (var ei = 0; ei < exemplars.length; ei++) { + var e = exemplars[ei]; + + if (S[i * n + e] > max) { + index = e; + max = S[i * n + e]; + } + } + + if (index > 0) { + clusters.push(index); + } + } + + for (var _ei = 0; _ei < exemplars.length; _ei++) { + clusters[exemplars[_ei]] = exemplars[_ei]; + } + + return clusters; + }; + + var assign = function assign(n, S, exemplars) { + var clusters = assignClusters(n, S, exemplars); + + for (var ei = 0; ei < exemplars.length; ei++) { + var ii = []; + + for (var c = 0; c < clusters.length; c++) { + if (clusters[c] === exemplars[ei]) { + ii.push(c); + } + } + + var maxI = -1; + var maxSum = -Infinity; + + for (var i = 0; i < ii.length; i++) { + var sum = 0; + + for (var j = 0; j < ii.length; j++) { + sum += S[ii[j] * n + ii[i]]; + } + + if (sum > maxSum) { + maxI = i; + maxSum = sum; + } + } + + exemplars[ei] = ii[maxI]; + } + + clusters = assignClusters(n, S, exemplars); + return clusters; + }; + + var affinityPropagation = function affinityPropagation(options) { + var cy = this.cy(); + var nodes = this.nodes(); + var opts = setOptions(options); // Map each node to its position in node array + + var id2position = {}; + + for (var i = 0; i < nodes.length; i++) { + id2position[nodes[i].id()] = i; + } // Begin affinity propagation algorithm + + + var n; // number of data points + + var n2; // size of matrices + + var S; // similarity matrix (1D array) + + var p; // preference/suitability of a data point to serve as an exemplar + + var R; // responsibility matrix (1D array) + + var A; // availability matrix (1D array) + + n = nodes.length; + n2 = n * n; // Initialize and build S similarity matrix + + S = new Array(n2); + + for (var _i = 0; _i < n2; _i++) { + S[_i] = -Infinity; // for cases where two data points shouldn't be linked together + } + + for (var _i2 = 0; _i2 < n; _i2++) { + for (var j = 0; j < n; j++) { + if (_i2 !== j) { + S[_i2 * n + j] = getSimilarity(opts.distance, nodes[_i2], nodes[j], opts.attributes); + } + } + } // Place preferences on the diagonal of S + + + p = getPreference(S, opts.preference); + + for (var _i3 = 0; _i3 < n; _i3++) { + S[_i3 * n + _i3] = p; + } // Initialize R responsibility matrix + + + R = new Array(n2); + + for (var _i4 = 0; _i4 < n2; _i4++) { + R[_i4] = 0.0; + } // Initialize A availability matrix + + + A = new Array(n2); + + for (var _i5 = 0; _i5 < n2; _i5++) { + A[_i5] = 0.0; + } + + var old = new Array(n); + var Rp = new Array(n); + var se = new Array(n); + + for (var _i6 = 0; _i6 < n; _i6++) { + old[_i6] = 0.0; + Rp[_i6] = 0.0; + se[_i6] = 0; + } + + var e = new Array(n * opts.minIterations); + + for (var _i7 = 0; _i7 < e.length; _i7++) { + e[_i7] = 0; + } + + var iter; + + for (iter = 0; iter < opts.maxIterations; iter++) { + // main algorithmic loop + // Update R responsibility matrix + for (var _i8 = 0; _i8 < n; _i8++) { + var max = -Infinity, + max2 = -Infinity, + maxI = -1, + AS = 0.0; + + for (var _j = 0; _j < n; _j++) { + old[_j] = R[_i8 * n + _j]; + AS = A[_i8 * n + _j] + S[_i8 * n + _j]; + + if (AS >= max) { + max2 = max; + max = AS; + maxI = _j; + } else if (AS > max2) { + max2 = AS; + } + } + + for (var _j2 = 0; _j2 < n; _j2++) { + R[_i8 * n + _j2] = (1 - opts.damping) * (S[_i8 * n + _j2] - max) + opts.damping * old[_j2]; + } + + R[_i8 * n + maxI] = (1 - opts.damping) * (S[_i8 * n + maxI] - max2) + opts.damping * old[maxI]; + } // Update A availability matrix + + + for (var _i9 = 0; _i9 < n; _i9++) { + var sum = 0; + + for (var _j3 = 0; _j3 < n; _j3++) { + old[_j3] = A[_j3 * n + _i9]; + Rp[_j3] = Math.max(0, R[_j3 * n + _i9]); + sum += Rp[_j3]; + } + + sum -= Rp[_i9]; + Rp[_i9] = R[_i9 * n + _i9]; + sum += Rp[_i9]; + + for (var _j4 = 0; _j4 < n; _j4++) { + A[_j4 * n + _i9] = (1 - opts.damping) * Math.min(0, sum - Rp[_j4]) + opts.damping * old[_j4]; + } + + A[_i9 * n + _i9] = (1 - opts.damping) * (sum - Rp[_i9]) + opts.damping * old[_i9]; + } // Check for convergence + + + var K = 0; + + for (var _i10 = 0; _i10 < n; _i10++) { + var E = A[_i10 * n + _i10] + R[_i10 * n + _i10] > 0 ? 1 : 0; + e[iter % opts.minIterations * n + _i10] = E; + K += E; + } + + if (K > 0 && (iter >= opts.minIterations - 1 || iter == opts.maxIterations - 1)) { + var _sum = 0; + + for (var _i11 = 0; _i11 < n; _i11++) { + se[_i11] = 0; + + for (var _j5 = 0; _j5 < opts.minIterations; _j5++) { + se[_i11] += e[_j5 * n + _i11]; + } + + if (se[_i11] === 0 || se[_i11] === opts.minIterations) { + _sum++; + } + } + + if (_sum === n) { + // then we have convergence + break; + } + } + } // Identify exemplars (cluster centers) + + + var exemplarsIndices = findExemplars(n, R, A); // Assign nodes to clusters + + var clusterIndices = assign(n, S, exemplarsIndices); + var clusters = {}; + + for (var c = 0; c < exemplarsIndices.length; c++) { + clusters[exemplarsIndices[c]] = []; + } + + for (var _i12 = 0; _i12 < nodes.length; _i12++) { + var pos = id2position[nodes[_i12].id()]; + + var clusterIndex = clusterIndices[pos]; + + if (clusterIndex != null) { + // the node may have not been assigned a cluster if no valid attributes were specified + clusters[clusterIndex].push(nodes[_i12]); + } + } + + var retClusters = new Array(exemplarsIndices.length); + + for (var _c = 0; _c < exemplarsIndices.length; _c++) { + retClusters[_c] = cy.collection(clusters[exemplarsIndices[_c]]); + } + + return retClusters; + }; + + var affinityPropagation$1 = { + affinityPropagation: affinityPropagation, + ap: affinityPropagation + }; + + var hierholzerDefaults = defaults$g({ + root: undefined, + directed: false + }); + var elesfn$k = { + hierholzer: function hierholzer(options) { + if (!plainObject(options)) { + var args = arguments; + options = { + root: args[0], + directed: args[1] + }; + } + + var _hierholzerDefaults = hierholzerDefaults(options), + root = _hierholzerDefaults.root, + directed = _hierholzerDefaults.directed; + + var eles = this; + var dflag = false; + var oddIn; + var oddOut; + var startVertex; + if (root) startVertex = string(root) ? this.filter(root)[0].id() : root[0].id(); + var nodes = {}; + var edges = {}; + + if (directed) { + eles.forEach(function (ele) { + var id = ele.id(); + + if (ele.isNode()) { + var ind = ele.indegree(true); + var outd = ele.outdegree(true); + var d1 = ind - outd; + var d2 = outd - ind; + + if (d1 == 1) { + if (oddIn) dflag = true;else oddIn = id; + } else if (d2 == 1) { + if (oddOut) dflag = true;else oddOut = id; + } else if (d2 > 1 || d1 > 1) { + dflag = true; + } + + nodes[id] = []; + ele.outgoers().forEach(function (e) { + if (e.isEdge()) nodes[id].push(e.id()); + }); + } else { + edges[id] = [undefined, ele.target().id()]; + } + }); + } else { + eles.forEach(function (ele) { + var id = ele.id(); + + if (ele.isNode()) { + var d = ele.degree(true); + + if (d % 2) { + if (!oddIn) oddIn = id;else if (!oddOut) oddOut = id;else dflag = true; + } + + nodes[id] = []; + ele.connectedEdges().forEach(function (e) { + return nodes[id].push(e.id()); + }); + } else { + edges[id] = [ele.source().id(), ele.target().id()]; + } + }); + } + + var result = { + found: false, + trail: undefined + }; + if (dflag) return result;else if (oddOut && oddIn) { + if (directed) { + if (startVertex && oddOut != startVertex) { + return result; + } + + startVertex = oddOut; + } else { + if (startVertex && oddOut != startVertex && oddIn != startVertex) { + return result; + } else if (!startVertex) { + startVertex = oddOut; + } + } + } else { + if (!startVertex) startVertex = eles[0].id(); + } + + var walk = function walk(v) { + var currentNode = v; + var subtour = [v]; + var adj, adjTail, adjHead; + + while (nodes[currentNode].length) { + adj = nodes[currentNode].shift(); + adjTail = edges[adj][0]; + adjHead = edges[adj][1]; + + if (currentNode != adjHead) { + nodes[adjHead] = nodes[adjHead].filter(function (e) { + return e != adj; + }); + currentNode = adjHead; + } else if (!directed && currentNode != adjTail) { + nodes[adjTail] = nodes[adjTail].filter(function (e) { + return e != adj; + }); + currentNode = adjTail; + } + + subtour.unshift(adj); + subtour.unshift(currentNode); + } + + return subtour; + }; + + var trail = []; + var subtour = []; + subtour = walk(startVertex); + + while (subtour.length != 1) { + if (nodes[subtour[0]].length == 0) { + trail.unshift(eles.getElementById(subtour.shift())); + trail.unshift(eles.getElementById(subtour.shift())); + } else { + subtour = walk(subtour.shift()).concat(subtour); + } + } + + trail.unshift(eles.getElementById(subtour.shift())); // final node + + for (var d in nodes) { + if (nodes[d].length) { + return result; + } + } + + result.found = true; + result.trail = this.spawn(trail, true); + return result; + } + }; + + var hopcroftTarjanBiconnected = function hopcroftTarjanBiconnected() { + var eles = this; + var nodes = {}; + var id = 0; + var edgeCount = 0; + var components = []; + var stack = []; + var visitedEdges = {}; + + var buildComponent = function buildComponent(x, y) { + var i = stack.length - 1; + var cutset = []; + var component = eles.spawn(); + + while (stack[i].x != x || stack[i].y != y) { + cutset.push(stack.pop().edge); + i--; + } + + cutset.push(stack.pop().edge); + cutset.forEach(function (edge) { + var connectedNodes = edge.connectedNodes().intersection(eles); + component.merge(edge); + connectedNodes.forEach(function (node) { + var nodeId = node.id(); + var connectedEdges = node.connectedEdges().intersection(eles); + component.merge(node); + + if (!nodes[nodeId].cutVertex) { + component.merge(connectedEdges); + } else { + component.merge(connectedEdges.filter(function (edge) { + return edge.isLoop(); + })); + } + }); + }); + components.push(component); + }; + + var biconnectedSearch = function biconnectedSearch(root, currentNode, parent) { + if (root === parent) edgeCount += 1; + nodes[currentNode] = { + id: id, + low: id++, + cutVertex: false + }; + var edges = eles.getElementById(currentNode).connectedEdges().intersection(eles); + + if (edges.size() === 0) { + components.push(eles.spawn(eles.getElementById(currentNode))); + } else { + var sourceId, targetId, otherNodeId, edgeId; + edges.forEach(function (edge) { + sourceId = edge.source().id(); + targetId = edge.target().id(); + otherNodeId = sourceId === currentNode ? targetId : sourceId; + + if (otherNodeId !== parent) { + edgeId = edge.id(); + + if (!visitedEdges[edgeId]) { + visitedEdges[edgeId] = true; + stack.push({ + x: currentNode, + y: otherNodeId, + edge: edge + }); + } + + if (!(otherNodeId in nodes)) { + biconnectedSearch(root, otherNodeId, currentNode); + nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].low); + + if (nodes[currentNode].id <= nodes[otherNodeId].low) { + nodes[currentNode].cutVertex = true; + buildComponent(currentNode, otherNodeId); + } + } else { + nodes[currentNode].low = Math.min(nodes[currentNode].low, nodes[otherNodeId].id); + } + } + }); + } + }; + + eles.forEach(function (ele) { + if (ele.isNode()) { + var nodeId = ele.id(); + + if (!(nodeId in nodes)) { + edgeCount = 0; + biconnectedSearch(nodeId, nodeId); + nodes[nodeId].cutVertex = edgeCount > 1; + } + } + }); + var cutVertices = Object.keys(nodes).filter(function (id) { + return nodes[id].cutVertex; + }).map(function (id) { + return eles.getElementById(id); + }); + return { + cut: eles.spawn(cutVertices), + components: components + }; + }; + + var hopcroftTarjanBiconnected$1 = { + hopcroftTarjanBiconnected: hopcroftTarjanBiconnected, + htbc: hopcroftTarjanBiconnected, + htb: hopcroftTarjanBiconnected, + hopcroftTarjanBiconnectedComponents: hopcroftTarjanBiconnected + }; + + var tarjanStronglyConnected = function tarjanStronglyConnected() { + var eles = this; + var nodes = {}; + var index = 0; + var components = []; + var stack = []; + var cut = eles.spawn(eles); + + var stronglyConnectedSearch = function stronglyConnectedSearch(sourceNodeId) { + stack.push(sourceNodeId); + nodes[sourceNodeId] = { + index: index, + low: index++, + explored: false + }; + var connectedEdges = eles.getElementById(sourceNodeId).connectedEdges().intersection(eles); + connectedEdges.forEach(function (edge) { + var targetNodeId = edge.target().id(); + + if (targetNodeId !== sourceNodeId) { + if (!(targetNodeId in nodes)) { + stronglyConnectedSearch(targetNodeId); + } + + if (!nodes[targetNodeId].explored) { + nodes[sourceNodeId].low = Math.min(nodes[sourceNodeId].low, nodes[targetNodeId].low); + } + } + }); + + if (nodes[sourceNodeId].index === nodes[sourceNodeId].low) { + var componentNodes = eles.spawn(); + + for (;;) { + var nodeId = stack.pop(); + componentNodes.merge(eles.getElementById(nodeId)); + nodes[nodeId].low = nodes[sourceNodeId].index; + nodes[nodeId].explored = true; + + if (nodeId === sourceNodeId) { + break; + } + } + + var componentEdges = componentNodes.edgesWith(componentNodes); + var component = componentNodes.merge(componentEdges); + components.push(component); + cut = cut.difference(component); + } + }; + + eles.forEach(function (ele) { + if (ele.isNode()) { + var nodeId = ele.id(); + + if (!(nodeId in nodes)) { + stronglyConnectedSearch(nodeId); + } + } + }); + return { + cut: cut, + components: components + }; + }; + + var tarjanStronglyConnected$1 = { + tarjanStronglyConnected: tarjanStronglyConnected, + tsc: tarjanStronglyConnected, + tscc: tarjanStronglyConnected, + tarjanStronglyConnectedComponents: tarjanStronglyConnected + }; + + var elesfn$j = {}; + [elesfn$v, elesfn$u, elesfn$t, elesfn$s, elesfn$r, elesfn$q, elesfn$p, elesfn$o, elesfn$n, elesfn$m, elesfn$l, markovClustering$1, kClustering, hierarchicalClustering$1, affinityPropagation$1, elesfn$k, hopcroftTarjanBiconnected$1, tarjanStronglyConnected$1].forEach(function (props) { + extend(elesfn$j, props); + }); + + /*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + */ + + /* promise states [Promises/A+ 2.1] */ + var STATE_PENDING = 0; + /* [Promises/A+ 2.1.1] */ + + var STATE_FULFILLED = 1; + /* [Promises/A+ 2.1.2] */ + + var STATE_REJECTED = 2; + /* [Promises/A+ 2.1.3] */ + + /* promise object constructor */ + + var api = function api(executor) { + /* optionally support non-constructor/plain-function call */ + if (!(this instanceof api)) return new api(executor); + /* initialize object */ + + this.id = 'Thenable/1.0.7'; + this.state = STATE_PENDING; + /* initial state */ + + this.fulfillValue = undefined; + /* initial value */ + + /* [Promises/A+ 1.3, 2.1.2.2] */ + + this.rejectReason = undefined; + /* initial reason */ + + /* [Promises/A+ 1.5, 2.1.3.2] */ + + this.onFulfilled = []; + /* initial handlers */ + + this.onRejected = []; + /* initial handlers */ + + /* provide optional information-hiding proxy */ + + this.proxy = { + then: this.then.bind(this) + }; + /* support optional executor function */ + + if (typeof executor === 'function') executor.call(this, this.fulfill.bind(this), this.reject.bind(this)); + }; + /* promise API methods */ + + + api.prototype = { + /* promise resolving methods */ + fulfill: function fulfill(value) { + return deliver(this, STATE_FULFILLED, 'fulfillValue', value); + }, + reject: function reject(value) { + return deliver(this, STATE_REJECTED, 'rejectReason', value); + }, + + /* "The then Method" [Promises/A+ 1.1, 1.2, 2.2] */ + then: function then(onFulfilled, onRejected) { + var curr = this; + var next = new api(); + /* [Promises/A+ 2.2.7] */ + + curr.onFulfilled.push(resolver(onFulfilled, next, 'fulfill')); + /* [Promises/A+ 2.2.2/2.2.6] */ + + curr.onRejected.push(resolver(onRejected, next, 'reject')); + /* [Promises/A+ 2.2.3/2.2.6] */ + + execute(curr); + return next.proxy; + /* [Promises/A+ 2.2.7, 3.3] */ + } + }; + /* deliver an action */ + + var deliver = function deliver(curr, state, name, value) { + if (curr.state === STATE_PENDING) { + curr.state = state; + /* [Promises/A+ 2.1.2.1, 2.1.3.1] */ + + curr[name] = value; + /* [Promises/A+ 2.1.2.2, 2.1.3.2] */ + + execute(curr); + } + + return curr; + }; + /* execute all handlers */ + + + var execute = function execute(curr) { + if (curr.state === STATE_FULFILLED) execute_handlers(curr, 'onFulfilled', curr.fulfillValue);else if (curr.state === STATE_REJECTED) execute_handlers(curr, 'onRejected', curr.rejectReason); + }; + /* execute particular set of handlers */ + + + var execute_handlers = function execute_handlers(curr, name, value) { + /* global setImmediate: true */ + + /* global setTimeout: true */ + + /* short-circuit processing */ + if (curr[name].length === 0) return; + /* iterate over all handlers, exactly once */ + + var handlers = curr[name]; + curr[name] = []; + /* [Promises/A+ 2.2.2.3, 2.2.3.3] */ + + var func = function func() { + for (var i = 0; i < handlers.length; i++) { + handlers[i](value); + } + /* [Promises/A+ 2.2.5] */ + + }; + /* execute procedure asynchronously */ + + /* [Promises/A+ 2.2.4, 3.1] */ + + + if (typeof setImmediate === 'function') setImmediate(func);else setTimeout(func, 0); + }; + /* generate a resolver function */ + + + var resolver = function resolver(cb, next, method) { + return function (value) { + if (typeof cb !== 'function') + /* [Promises/A+ 2.2.1, 2.2.7.3, 2.2.7.4] */ + next[method].call(next, value); + /* [Promises/A+ 2.2.7.3, 2.2.7.4] */ + else { + var result; + + try { + result = cb(value); + } + /* [Promises/A+ 2.2.2.1, 2.2.3.1, 2.2.5, 3.2] */ + catch (e) { + next.reject(e); + /* [Promises/A+ 2.2.7.2] */ + + return; + } + + resolve(next, result); + /* [Promises/A+ 2.2.7.1] */ + } + }; + }; + /* "Promise Resolution Procedure" */ + + /* [Promises/A+ 2.3] */ + + + var resolve = function resolve(promise, x) { + /* sanity check arguments */ + + /* [Promises/A+ 2.3.1] */ + if (promise === x || promise.proxy === x) { + promise.reject(new TypeError('cannot resolve promise with itself')); + return; + } + /* surgically check for a "then" method + (mainly to just call the "getter" of "then" only once) */ + + + var then; + + if (_typeof(x) === 'object' && x !== null || typeof x === 'function') { + try { + then = x.then; + } + /* [Promises/A+ 2.3.3.1, 3.5] */ + catch (e) { + promise.reject(e); + /* [Promises/A+ 2.3.3.2] */ + + return; + } + } + /* handle own Thenables [Promises/A+ 2.3.2] + and similar "thenables" [Promises/A+ 2.3.3] */ + + + if (typeof then === 'function') { + var resolved = false; + + try { + /* call retrieved "then" method */ + + /* [Promises/A+ 2.3.3.3] */ + then.call(x, + /* resolvePromise */ + + /* [Promises/A+ 2.3.3.3.1] */ + function (y) { + if (resolved) return; + resolved = true; + /* [Promises/A+ 2.3.3.3.3] */ + + if (y === x) + /* [Promises/A+ 3.6] */ + promise.reject(new TypeError('circular thenable chain'));else resolve(promise, y); + }, + /* rejectPromise */ + + /* [Promises/A+ 2.3.3.3.2] */ + function (r) { + if (resolved) return; + resolved = true; + /* [Promises/A+ 2.3.3.3.3] */ + + promise.reject(r); + }); + } catch (e) { + if (!resolved) + /* [Promises/A+ 2.3.3.3.3] */ + promise.reject(e); + /* [Promises/A+ 2.3.3.3.4] */ + } + + return; + } + /* handle other values */ + + + promise.fulfill(x); + /* [Promises/A+ 2.3.4, 2.3.3.4] */ + }; // so we always have Promise.all() + + + api.all = function (ps) { + return new api(function (resolveAll, rejectAll) { + var vals = new Array(ps.length); + var doneCount = 0; + + var fulfill = function fulfill(i, val) { + vals[i] = val; + doneCount++; + + if (doneCount === ps.length) { + resolveAll(vals); + } + }; + + for (var i = 0; i < ps.length; i++) { + (function (i) { + var p = ps[i]; + var isPromise = p != null && p.then != null; + + if (isPromise) { + p.then(function (val) { + fulfill(i, val); + }, function (err) { + rejectAll(err); + }); + } else { + var val = p; + fulfill(i, val); + } + })(i); + } + }); + }; + + api.resolve = function (val) { + return new api(function (resolve, reject) { + resolve(val); + }); + }; + + api.reject = function (val) { + return new api(function (resolve, reject) { + reject(val); + }); + }; + + var Promise$1 = typeof Promise !== 'undefined' ? Promise : api; // eslint-disable-line no-undef + + var Animation = function Animation(target, opts, opts2) { + var isCore = core(target); + var isEle = !isCore; + + var _p = this._private = extend({ + duration: 1000 + }, opts, opts2); + + _p.target = target; + _p.style = _p.style || _p.css; + _p.started = false; + _p.playing = false; + _p.hooked = false; + _p.applying = false; + _p.progress = 0; + _p.completes = []; + _p.frames = []; + + if (_p.complete && fn$6(_p.complete)) { + _p.completes.push(_p.complete); + } + + if (isEle) { + var pos = target.position(); + _p.startPosition = _p.startPosition || { + x: pos.x, + y: pos.y + }; + _p.startStyle = _p.startStyle || target.cy().style().getAnimationStartStyle(target, _p.style); + } + + if (isCore) { + var pan = target.pan(); + _p.startPan = { + x: pan.x, + y: pan.y + }; + _p.startZoom = target.zoom(); + } // for future timeline/animations impl + + + this.length = 1; + this[0] = this; + }; + + var anifn = Animation.prototype; + extend(anifn, { + instanceString: function instanceString() { + return 'animation'; + }, + hook: function hook() { + var _p = this._private; + + if (!_p.hooked) { + // add to target's animation queue + var q; + var tAni = _p.target._private.animation; + + if (_p.queue) { + q = tAni.queue; + } else { + q = tAni.current; + } + + q.push(this); // add to the animation loop pool + + if (elementOrCollection(_p.target)) { + _p.target.cy().addToAnimationPool(_p.target); + } + + _p.hooked = true; + } + + return this; + }, + play: function play() { + var _p = this._private; // autorewind + + if (_p.progress === 1) { + _p.progress = 0; + } + + _p.playing = true; + _p.started = false; // needs to be started by animation loop + + _p.stopped = false; + this.hook(); // the animation loop will start the animation... + + return this; + }, + playing: function playing() { + return this._private.playing; + }, + apply: function apply() { + var _p = this._private; + _p.applying = true; + _p.started = false; // needs to be started by animation loop + + _p.stopped = false; + this.hook(); // the animation loop will apply the animation at this progress + + return this; + }, + applying: function applying() { + return this._private.applying; + }, + pause: function pause() { + var _p = this._private; + _p.playing = false; + _p.started = false; + return this; + }, + stop: function stop() { + var _p = this._private; + _p.playing = false; + _p.started = false; + _p.stopped = true; // to be removed from animation queues + + return this; + }, + rewind: function rewind() { + return this.progress(0); + }, + fastforward: function fastforward() { + return this.progress(1); + }, + time: function time(t) { + var _p = this._private; + + if (t === undefined) { + return _p.progress * _p.duration; + } else { + return this.progress(t / _p.duration); + } + }, + progress: function progress(p) { + var _p = this._private; + var wasPlaying = _p.playing; + + if (p === undefined) { + return _p.progress; + } else { + if (wasPlaying) { + this.pause(); + } + + _p.progress = p; + _p.started = false; + + if (wasPlaying) { + this.play(); + } + } + + return this; + }, + completed: function completed() { + return this._private.progress === 1; + }, + reverse: function reverse() { + var _p = this._private; + var wasPlaying = _p.playing; + + if (wasPlaying) { + this.pause(); + } + + _p.progress = 1 - _p.progress; + _p.started = false; + + var swap = function swap(a, b) { + var _pa = _p[a]; + + if (_pa == null) { + return; + } + + _p[a] = _p[b]; + _p[b] = _pa; + }; + + swap('zoom', 'startZoom'); + swap('pan', 'startPan'); + swap('position', 'startPosition'); // swap styles + + if (_p.style) { + for (var i = 0; i < _p.style.length; i++) { + var prop = _p.style[i]; + var name = prop.name; + var startStyleProp = _p.startStyle[name]; + _p.startStyle[name] = prop; + _p.style[i] = startStyleProp; + } + } + + if (wasPlaying) { + this.play(); + } + + return this; + }, + promise: function promise(type) { + var _p = this._private; + var arr; + + switch (type) { + case 'frame': + arr = _p.frames; + break; + + default: + case 'complete': + case 'completed': + arr = _p.completes; + } + + return new Promise$1(function (resolve, reject) { + arr.push(function () { + resolve(); + }); + }); + } + }); + anifn.complete = anifn.completed; + anifn.run = anifn.play; + anifn.running = anifn.playing; + + var define$3 = { + animated: function animated() { + return function animatedImpl() { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return false; + } + + var ele = all[0]; + + if (ele) { + return ele._private.animation.current.length > 0; + } + }; + }, + // animated + clearQueue: function clearQueue() { + return function clearQueueImpl() { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + for (var i = 0; i < all.length; i++) { + var ele = all[i]; + ele._private.animation.queue = []; + } + + return this; + }; + }, + // clearQueue + delay: function delay() { + return function delayImpl(time, complete) { + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + return this.animate({ + delay: time, + duration: time, + complete: complete + }); + }; + }, + // delay + delayAnimation: function delayAnimation() { + return function delayAnimationImpl(time, complete) { + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + return this.animation({ + delay: time, + duration: time, + complete: complete + }); + }; + }, + // delay + animation: function animation() { + return function animationImpl(properties, params) { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + var isCore = !selfIsArrayLike; + var isEles = !isCore; + + if (!cy.styleEnabled()) { + return this; + } + + var style = cy.style(); + properties = extend({}, properties, params); + var propertiesEmpty = Object.keys(properties).length === 0; + + if (propertiesEmpty) { + return new Animation(all[0], properties); // nothing to animate + } + + if (properties.duration === undefined) { + properties.duration = 400; + } + + switch (properties.duration) { + case 'slow': + properties.duration = 600; + break; + + case 'fast': + properties.duration = 200; + break; + } + + if (isEles) { + properties.style = style.getPropsList(properties.style || properties.css); + properties.css = undefined; + } + + if (isEles && properties.renderedPosition != null) { + var rpos = properties.renderedPosition; + var pan = cy.pan(); + var zoom = cy.zoom(); + properties.position = renderedToModelPosition(rpos, zoom, pan); + } // override pan w/ panBy if set + + + if (isCore && properties.panBy != null) { + var panBy = properties.panBy; + var cyPan = cy.pan(); + properties.pan = { + x: cyPan.x + panBy.x, + y: cyPan.y + panBy.y + }; + } // override pan w/ center if set + + + var center = properties.center || properties.centre; + + if (isCore && center != null) { + var centerPan = cy.getCenterPan(center.eles, properties.zoom); + + if (centerPan != null) { + properties.pan = centerPan; + } + } // override pan & zoom w/ fit if set + + + if (isCore && properties.fit != null) { + var fit = properties.fit; + var fitVp = cy.getFitViewport(fit.eles || fit.boundingBox, fit.padding); + + if (fitVp != null) { + properties.pan = fitVp.pan; + properties.zoom = fitVp.zoom; + } + } // override zoom (& potentially pan) w/ zoom obj if set + + + if (isCore && plainObject(properties.zoom)) { + var vp = cy.getZoomedViewport(properties.zoom); + + if (vp != null) { + if (vp.zoomed) { + properties.zoom = vp.zoom; + } + + if (vp.panned) { + properties.pan = vp.pan; + } + } else { + properties.zoom = null; // an inavalid zoom (e.g. no delta) gets automatically destroyed + } + } + + return new Animation(all[0], properties); + }; + }, + // animate + animate: function animate() { + return function animateImpl(properties, params) { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + if (params) { + properties = extend({}, properties, params); + } // manually hook and run the animation + + + for (var i = 0; i < all.length; i++) { + var ele = all[i]; + var queue = ele.animated() && (properties.queue === undefined || properties.queue); + var ani = ele.animation(properties, queue ? { + queue: true + } : undefined); + ani.play(); + } + + return this; // chaining + }; + }, + // animate + stop: function stop() { + return function stopImpl(clearQueue, jumpToEnd) { + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var cy = this._private.cy || this; + + if (!cy.styleEnabled()) { + return this; + } + + for (var i = 0; i < all.length; i++) { + var ele = all[i]; + var _p = ele._private; + var anis = _p.animation.current; + + for (var j = 0; j < anis.length; j++) { + var ani = anis[j]; + var ani_p = ani._private; + + if (jumpToEnd) { + // next iteration of the animation loop, the animation + // will go straight to the end and be removed + ani_p.duration = 0; + } + } // clear the queue of future animations + + + if (clearQueue) { + _p.animation.queue = []; + } + + if (!jumpToEnd) { + _p.animation.current = []; + } + } // we have to notify (the animation loop doesn't do it for us on `stop`) + + + cy.notify('draw'); + return this; + }; + } // stop + + }; // define + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + var isArray_1 = isArray; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray_1(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol_1(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + var _isKey = isKey; + + /** `Object#toString` result references. */ + var asyncTag = '[object AsyncFunction]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject_1(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = _baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + var isFunction_1 = isFunction; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = _root['__core-js_shared__']; + + var _coreJsData = coreJsData; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(_coreJsData && _coreJsData.keys && _coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + var _isMasked = isMasked; + + /** Used for built-in method references. */ + var funcProto$1 = Function.prototype; + + /** Used to resolve the decompiled source of functions. */ + var funcToString$1 = funcProto$1.toString; + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString$1.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + var _toSource = toSource; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used for built-in method references. */ + var funcProto = Function.prototype, + objectProto$3 = Object.prototype; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty$3 = objectProto$3.hasOwnProperty; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty$3).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject_1(value) || _isMasked(value)) { + return false; + } + var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor; + return pattern.test(_toSource(value)); + } + + var _baseIsNative = baseIsNative; + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue$1(object, key) { + return object == null ? undefined : object[key]; + } + + var _getValue = getValue$1; + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = _getValue(object, key); + return _baseIsNative(value) ? value : undefined; + } + + var _getNative = getNative; + + /* Built-in method references that are verified to be native. */ + var nativeCreate = _getNative(Object, 'create'); + + var _nativeCreate = nativeCreate; + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = _nativeCreate ? _nativeCreate(null) : {}; + this.size = 0; + } + + var _hashClear = hashClear; + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + var _hashDelete = hashDelete; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED$1 = '__lodash_hash_undefined__'; + + /** Used for built-in method references. */ + var objectProto$2 = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty$2 = objectProto$2.hasOwnProperty; + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (_nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED$1 ? undefined : result; + } + return hasOwnProperty$2.call(data, key) ? data[key] : undefined; + } + + var _hashGet = hashGet; + + /** Used for built-in method references. */ + var objectProto$1 = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty$1 = objectProto$1.hasOwnProperty; + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return _nativeCreate ? (data[key] !== undefined) : hasOwnProperty$1.call(data, key); + } + + var _hashHas = hashHas; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (_nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + var _hashSet = hashSet; + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + // Add methods to `Hash`. + Hash.prototype.clear = _hashClear; + Hash.prototype['delete'] = _hashDelete; + Hash.prototype.get = _hashGet; + Hash.prototype.has = _hashHas; + Hash.prototype.set = _hashSet; + + var _Hash = Hash; + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + var _listCacheClear = listCacheClear; + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + var eq_1 = eq; + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq_1(array[length][0], key)) { + return length; + } + } + return -1; + } + + var _assocIndexOf = assocIndexOf; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype; + + /** Built-in value references. */ + var splice = arrayProto.splice; + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + var _listCacheDelete = listCacheDelete; + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + var _listCacheGet = listCacheGet; + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return _assocIndexOf(this.__data__, key) > -1; + } + + var _listCacheHas = listCacheHas; + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + var _listCacheSet = listCacheSet; + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = _listCacheClear; + ListCache.prototype['delete'] = _listCacheDelete; + ListCache.prototype.get = _listCacheGet; + ListCache.prototype.has = _listCacheHas; + ListCache.prototype.set = _listCacheSet; + + var _ListCache = ListCache; + + /* Built-in method references that are verified to be native. */ + var Map$1 = _getNative(_root, 'Map'); + + var _Map = Map$1; + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new _Hash, + 'map': new (_Map || _ListCache), + 'string': new _Hash + }; + } + + var _mapCacheClear = mapCacheClear; + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + var _isKeyable = isKeyable; + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return _isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + var _getMapData = getMapData; + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = _getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + var _mapCacheDelete = mapCacheDelete; + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return _getMapData(this, key).get(key); + } + + var _mapCacheGet = mapCacheGet; + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return _getMapData(this, key).has(key); + } + + var _mapCacheHas = mapCacheHas; + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = _getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + var _mapCacheSet = mapCacheSet; + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = _mapCacheClear; + MapCache.prototype['delete'] = _mapCacheDelete; + MapCache.prototype.get = _mapCacheGet; + MapCache.prototype.has = _mapCacheHas; + MapCache.prototype.set = _mapCacheSet; + + var _MapCache = MapCache; + + /** Error message constants. */ + var FUNC_ERROR_TEXT = 'Expected a function'; + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || _MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = _MapCache; + + var memoize_1 = memoize; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize_1(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + var _memoizeCapped = memoizeCapped; + + /** Used to match property names within property paths. */ + var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = _memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + var _stringToPath = stringToPath; + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + var _arrayMap = arrayMap; + + /** Used as references for various `Number` constants. */ + var INFINITY$1 = 1 / 0; + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = _Symbol ? _Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray_1(value)) { + // Recursively convert values (susceptible to call stack limits). + return _arrayMap(value, baseToString) + ''; + } + if (isSymbol_1(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result; + } + + var _baseToString = baseToString; + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString$1(value) { + return value == null ? '' : _baseToString(value); + } + + var toString_1 = toString$1; + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray_1(value)) { + return value; + } + return _isKey(value, object) ? [value] : _stringToPath(toString_1(value)); + } + + var _castPath = castPath; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0; + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol_1(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + var _toKey = toKey; + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = _castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[_toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + var _baseGet = baseGet; + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : _baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + var get_1 = get; + + var defineProperty = (function() { + try { + var func = _getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + var _defineProperty = defineProperty; + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && _defineProperty) { + _defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + var _baseAssignValue = baseAssignValue; + + /** Used for built-in method references. */ + var objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq_1(objValue, value)) || + (value === undefined && !(key in object))) { + _baseAssignValue(object, key, value); + } + } + + var _assignValue = assignValue; + + /** Used as references for various `Number` constants. */ + var MAX_SAFE_INTEGER = 9007199254740991; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + var _isIndex = isIndex; + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject_1(object)) { + return object; + } + path = _castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = _toKey(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject_1(objValue) + ? objValue + : (_isIndex(path[index + 1]) ? [] : {}); + } + } + _assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + var _baseSet = baseSet; + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : _baseSet(object, path, value); + } + + var set_1 = set; + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + var _copyArray = copyArray; + + /** + * Converts `value` to a property path array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Util + * @param {*} value The value to convert. + * @returns {Array} Returns the new property path array. + * @example + * + * _.toPath('a.b.c'); + * // => ['a', 'b', 'c'] + * + * _.toPath('a[0].b.c'); + * // => ['a', '0', 'b', 'c'] + */ + function toPath(value) { + if (isArray_1(value)) { + return _arrayMap(value, _toKey); + } + return isSymbol_1(value) ? [value] : _copyArray(_stringToPath(toString_1(value))); + } + + var toPath_1 = toPath; + + var define$2 = { + // access data field + data: function data(params) { + var defaults = { + field: 'data', + bindingEvent: 'data', + allowBinding: false, + allowSetting: false, + allowGetting: false, + settingEvent: 'data', + settingTriggersEvent: false, + triggerFnName: 'trigger', + immutableKeys: {}, + // key => true if immutable + updateStyle: false, + beforeGet: function beforeGet(self) {}, + beforeSet: function beforeSet(self, obj) {}, + onSet: function onSet(self) {}, + canSet: function canSet(self) { + return true; + } + }; + params = extend({}, defaults, params); + return function dataImpl(name, value) { + var p = params; + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + + var single = selfIsArrayLike ? self[0] : self; // .data('foo', ...) + + if (string(name)) { + // set or get property + var isPathLike = name.indexOf('.') !== -1; // there might be a normal field with a dot + + var path = isPathLike && toPath_1(name); // .data('foo') + + if (p.allowGetting && value === undefined) { + // get + var ret; + + if (single) { + p.beforeGet(single); // check if it's path and a field with the same name doesn't exist + + if (path && single._private[p.field][name] === undefined) { + ret = get_1(single._private[p.field], path); + } else { + ret = single._private[p.field][name]; + } + } + + return ret; // .data('foo', 'bar') + } else if (p.allowSetting && value !== undefined) { + // set + var valid = !p.immutableKeys[name]; + + if (valid) { + var change = _defineProperty$1({}, name, value); + + p.beforeSet(self, change); + + for (var i = 0, l = all.length; i < l; i++) { + var ele = all[i]; + + if (p.canSet(ele)) { + if (path && single._private[p.field][name] === undefined) { + set_1(ele._private[p.field], path, value); + } else { + ele._private[p.field][name] = value; + } + } + } // update mappers if asked + + + if (p.updateStyle) { + self.updateStyle(); + } // call onSet callback + + + p.onSet(self); + + if (p.settingTriggersEvent) { + self[p.triggerFnName](p.settingEvent); + } + } + } // .data({ 'foo': 'bar' }) + + } else if (p.allowSetting && plainObject(name)) { + // extend + var obj = name; + var k, v; + var keys = Object.keys(obj); + p.beforeSet(self, obj); + + for (var _i = 0; _i < keys.length; _i++) { + k = keys[_i]; + v = obj[k]; + + var _valid = !p.immutableKeys[k]; + + if (_valid) { + for (var j = 0; j < all.length; j++) { + var _ele = all[j]; + + if (p.canSet(_ele)) { + _ele._private[p.field][k] = v; + } + } + } + } // update mappers if asked + + + if (p.updateStyle) { + self.updateStyle(); + } // call onSet callback + + + p.onSet(self); + + if (p.settingTriggersEvent) { + self[p.triggerFnName](p.settingEvent); + } // .data(function(){ ... }) + + } else if (p.allowBinding && fn$6(name)) { + // bind to event + var fn = name; + self.on(p.bindingEvent, fn); // .data() + } else if (p.allowGetting && name === undefined) { + // get whole object + var _ret; + + if (single) { + p.beforeGet(single); + _ret = single._private[p.field]; + } + + return _ret; + } + + return self; // maintain chainability + }; // function + }, + // data + // remove data field + removeData: function removeData(params) { + var defaults = { + field: 'data', + event: 'data', + triggerFnName: 'trigger', + triggerEvent: false, + immutableKeys: {} // key => true if immutable + + }; + params = extend({}, defaults, params); + return function removeDataImpl(names) { + var p = params; + var self = this; + var selfIsArrayLike = self.length !== undefined; + var all = selfIsArrayLike ? self : [self]; // put in array if not array-like + // .removeData('foo bar') + + if (string(names)) { + // then get the list of keys, and delete them + var keys = names.split(/\s+/); + var l = keys.length; + + for (var i = 0; i < l; i++) { + // delete each non-empty key + var key = keys[i]; + + if (emptyString(key)) { + continue; + } + + var valid = !p.immutableKeys[key]; // not valid if immutable + + if (valid) { + for (var i_a = 0, l_a = all.length; i_a < l_a; i_a++) { + all[i_a]._private[p.field][key] = undefined; + } + } + } + + if (p.triggerEvent) { + self[p.triggerFnName](p.event); + } // .removeData() + + } else if (names === undefined) { + // then delete all keys + for (var _i_a = 0, _l_a = all.length; _i_a < _l_a; _i_a++) { + var _privateFields = all[_i_a]._private[p.field]; + + var _keys = Object.keys(_privateFields); + + for (var _i2 = 0; _i2 < _keys.length; _i2++) { + var _key = _keys[_i2]; + var validKeyToDelete = !p.immutableKeys[_key]; + + if (validKeyToDelete) { + _privateFields[_key] = undefined; + } + } + } + + if (p.triggerEvent) { + self[p.triggerFnName](p.event); + } + } + + return self; // maintain chaining + }; // function + } // removeData + + }; // define + + var define$1 = { + eventAliasesOn: function eventAliasesOn(proto) { + var p = proto; + p.addListener = p.listen = p.bind = p.on; + p.unlisten = p.unbind = p.off = p.removeListener; + p.trigger = p.emit; // this is just a wrapper alias of .on() + + p.pon = p.promiseOn = function (events, selector) { + var self = this; + var args = Array.prototype.slice.call(arguments, 0); + return new Promise$1(function (resolve, reject) { + var callback = function callback(e) { + self.off.apply(self, offArgs); + resolve(e); + }; + + var onArgs = args.concat([callback]); + var offArgs = onArgs.concat([]); + self.on.apply(self, onArgs); + }); + }; + } + }; // define + + // use this module to cherry pick functions into your prototype + var define = {}; + [define$3, define$2, define$1].forEach(function (m) { + extend(define, m); + }); + + var elesfn$i = { + animate: define.animate(), + animation: define.animation(), + animated: define.animated(), + clearQueue: define.clearQueue(), + delay: define.delay(), + delayAnimation: define.delayAnimation(), + stop: define.stop() + }; + + var elesfn$h = { + classes: function classes(_classes) { + var self = this; + + if (_classes === undefined) { + var ret = []; + + self[0]._private.classes.forEach(function (cls) { + return ret.push(cls); + }); + + return ret; + } else if (!array(_classes)) { + // extract classes from string + _classes = (_classes || '').match(/\S+/g) || []; + } + + var changed = []; + var classesSet = new Set$1(_classes); // check and update each ele + + for (var j = 0; j < self.length; j++) { + var ele = self[j]; + var _p = ele._private; + var eleClasses = _p.classes; + var changedEle = false; // check if ele has all of the passed classes + + for (var i = 0; i < _classes.length; i++) { + var cls = _classes[i]; + var eleHasClass = eleClasses.has(cls); + + if (!eleHasClass) { + changedEle = true; + break; + } + } // check if ele has classes outside of those passed + + + if (!changedEle) { + changedEle = eleClasses.size !== _classes.length; + } + + if (changedEle) { + _p.classes = classesSet; + changed.push(ele); + } + } // trigger update style on those eles that had class changes + + + if (changed.length > 0) { + this.spawn(changed).updateStyle().emit('class'); + } + + return self; + }, + addClass: function addClass(classes) { + return this.toggleClass(classes, true); + }, + hasClass: function hasClass(className) { + var ele = this[0]; + return ele != null && ele._private.classes.has(className); + }, + toggleClass: function toggleClass(classes, toggle) { + if (!array(classes)) { + // extract classes from string + classes = classes.match(/\S+/g) || []; + } + + var self = this; + var toggleUndefd = toggle === undefined; + var changed = []; // eles who had classes changed + + for (var i = 0, il = self.length; i < il; i++) { + var ele = self[i]; + var eleClasses = ele._private.classes; + var changedEle = false; + + for (var j = 0; j < classes.length; j++) { + var cls = classes[j]; + var hasClass = eleClasses.has(cls); + var changedNow = false; + + if (toggle || toggleUndefd && !hasClass) { + eleClasses.add(cls); + changedNow = true; + } else if (!toggle || toggleUndefd && hasClass) { + eleClasses["delete"](cls); + changedNow = true; + } + + if (!changedEle && changedNow) { + changed.push(ele); + changedEle = true; + } + } // for j classes + + } // for i eles + // trigger update style on those eles that had class changes + + + if (changed.length > 0) { + this.spawn(changed).updateStyle().emit('class'); + } + + return self; + }, + removeClass: function removeClass(classes) { + return this.toggleClass(classes, false); + }, + flashClass: function flashClass(classes, duration) { + var self = this; + + if (duration == null) { + duration = 250; + } else if (duration === 0) { + return self; // nothing to do really + } + + self.addClass(classes); + setTimeout(function () { + self.removeClass(classes); + }, duration); + return self; + } + }; + elesfn$h.className = elesfn$h.classNames = elesfn$h.classes; + + var tokens = { + metaChar: '[\\!\\"\\#\\$\\%\\&\\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]', + // chars we need to escape in let names, etc + comparatorOp: '=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=', + // binary comparison op (used in data selectors) + boolOp: '\\?|\\!|\\^', + // boolean (unary) operators (used in data selectors) + string: '"(?:\\\\"|[^"])*"' + '|' + "'(?:\\\\'|[^'])*'", + // string literals (used in data selectors) -- doublequotes | singlequotes + number: number, + // number literal (used in data selectors) --- e.g. 0.1234, 1234, 12e123 + meta: 'degree|indegree|outdegree', + // allowed metadata fields (i.e. allowed functions to use from Collection) + separator: '\\s*,\\s*', + // queries are separated by commas, e.g. edge[foo = 'bar'], node.someClass + descendant: '\\s+', + child: '\\s+>\\s+', + subject: '\\$', + group: 'node|edge|\\*', + directedEdge: '\\s+->\\s+', + undirectedEdge: '\\s+<->\\s+' + }; + tokens.variable = '(?:[\\w-.]|(?:\\\\' + tokens.metaChar + '))+'; // a variable name can have letters, numbers, dashes, and periods + + tokens.className = '(?:[\\w-]|(?:\\\\' + tokens.metaChar + '))+'; // a class name has the same rules as a variable except it can't have a '.' in the name + + tokens.value = tokens.string + '|' + tokens.number; // a value literal, either a string or number + + tokens.id = tokens.variable; // an element id (follows variable conventions) + + (function () { + var ops, op, i; // add @ variants to comparatorOp + + ops = tokens.comparatorOp.split('|'); + + for (i = 0; i < ops.length; i++) { + op = ops[i]; + tokens.comparatorOp += '|@' + op; + } // add ! variants to comparatorOp + + + ops = tokens.comparatorOp.split('|'); + + for (i = 0; i < ops.length; i++) { + op = ops[i]; + + if (op.indexOf('!') >= 0) { + continue; + } // skip ops that explicitly contain ! + + + if (op === '=') { + continue; + } // skip = b/c != is explicitly defined + + + tokens.comparatorOp += '|\\!' + op; + } + })(); + + /** + * Make a new query object + * + * @prop type {Type} The type enum (int) of the query + * @prop checks List of checks to make against an ele to test for a match + */ + var newQuery = function newQuery() { + return { + checks: [] + }; + }; + + /** + * A check type enum-like object. Uses integer values for fast match() lookup. + * The ordering does not matter as long as the ints are unique. + */ + var Type = { + /** E.g. node */ + GROUP: 0, + + /** A collection of elements */ + COLLECTION: 1, + + /** A filter(ele) function */ + FILTER: 2, + + /** E.g. [foo > 1] */ + DATA_COMPARE: 3, + + /** E.g. [foo] */ + DATA_EXIST: 4, + + /** E.g. [?foo] */ + DATA_BOOL: 5, + + /** E.g. [[degree > 2]] */ + META_COMPARE: 6, + + /** E.g. :selected */ + STATE: 7, + + /** E.g. #foo */ + ID: 8, + + /** E.g. .foo */ + CLASS: 9, + + /** E.g. #foo <-> #bar */ + UNDIRECTED_EDGE: 10, + + /** E.g. #foo -> #bar */ + DIRECTED_EDGE: 11, + + /** E.g. $#foo -> #bar */ + NODE_SOURCE: 12, + + /** E.g. #foo -> $#bar */ + NODE_TARGET: 13, + + /** E.g. $#foo <-> #bar */ + NODE_NEIGHBOR: 14, + + /** E.g. #foo > #bar */ + CHILD: 15, + + /** E.g. #foo #bar */ + DESCENDANT: 16, + + /** E.g. $#foo > #bar */ + PARENT: 17, + + /** E.g. $#foo #bar */ + ANCESTOR: 18, + + /** E.g. #foo > $bar > #baz */ + COMPOUND_SPLIT: 19, + + /** Always matches, useful placeholder for subject in `COMPOUND_SPLIT` */ + TRUE: 20 + }; + + var stateSelectors = [{ + selector: ':selected', + matches: function matches(ele) { + return ele.selected(); + } + }, { + selector: ':unselected', + matches: function matches(ele) { + return !ele.selected(); + } + }, { + selector: ':selectable', + matches: function matches(ele) { + return ele.selectable(); + } + }, { + selector: ':unselectable', + matches: function matches(ele) { + return !ele.selectable(); + } + }, { + selector: ':locked', + matches: function matches(ele) { + return ele.locked(); + } + }, { + selector: ':unlocked', + matches: function matches(ele) { + return !ele.locked(); + } + }, { + selector: ':visible', + matches: function matches(ele) { + return ele.visible(); + } + }, { + selector: ':hidden', + matches: function matches(ele) { + return !ele.visible(); + } + }, { + selector: ':transparent', + matches: function matches(ele) { + return ele.transparent(); + } + }, { + selector: ':grabbed', + matches: function matches(ele) { + return ele.grabbed(); + } + }, { + selector: ':free', + matches: function matches(ele) { + return !ele.grabbed(); + } + }, { + selector: ':removed', + matches: function matches(ele) { + return ele.removed(); + } + }, { + selector: ':inside', + matches: function matches(ele) { + return !ele.removed(); + } + }, { + selector: ':grabbable', + matches: function matches(ele) { + return ele.grabbable(); + } + }, { + selector: ':ungrabbable', + matches: function matches(ele) { + return !ele.grabbable(); + } + }, { + selector: ':animated', + matches: function matches(ele) { + return ele.animated(); + } + }, { + selector: ':unanimated', + matches: function matches(ele) { + return !ele.animated(); + } + }, { + selector: ':parent', + matches: function matches(ele) { + return ele.isParent(); + } + }, { + selector: ':childless', + matches: function matches(ele) { + return ele.isChildless(); + } + }, { + selector: ':child', + matches: function matches(ele) { + return ele.isChild(); + } + }, { + selector: ':orphan', + matches: function matches(ele) { + return ele.isOrphan(); + } + }, { + selector: ':nonorphan', + matches: function matches(ele) { + return ele.isChild(); + } + }, { + selector: ':compound', + matches: function matches(ele) { + if (ele.isNode()) { + return ele.isParent(); + } else { + return ele.source().isParent() || ele.target().isParent(); + } + } + }, { + selector: ':loop', + matches: function matches(ele) { + return ele.isLoop(); + } + }, { + selector: ':simple', + matches: function matches(ele) { + return ele.isSimple(); + } + }, { + selector: ':active', + matches: function matches(ele) { + return ele.active(); + } + }, { + selector: ':inactive', + matches: function matches(ele) { + return !ele.active(); + } + }, { + selector: ':backgrounding', + matches: function matches(ele) { + return ele.backgrounding(); + } + }, { + selector: ':nonbackgrounding', + matches: function matches(ele) { + return !ele.backgrounding(); + } + }].sort(function (a, b) { + // n.b. selectors that are starting substrings of others must have the longer ones first + return descending(a.selector, b.selector); + }); + + var lookup = function () { + var selToFn = {}; + var s; + + for (var i = 0; i < stateSelectors.length; i++) { + s = stateSelectors[i]; + selToFn[s.selector] = s.matches; + } + + return selToFn; + }(); + + var stateSelectorMatches = function stateSelectorMatches(sel, ele) { + return lookup[sel](ele); + }; + var stateSelectorRegex = '(' + stateSelectors.map(function (s) { + return s.selector; + }).join('|') + ')'; + + // so that values get compared properly in Selector.filter() + + var cleanMetaChars = function cleanMetaChars(str) { + return str.replace(new RegExp('\\\\(' + tokens.metaChar + ')', 'g'), function (match, $1) { + return $1; + }); + }; + + var replaceLastQuery = function replaceLastQuery(selector, examiningQuery, replacementQuery) { + selector[selector.length - 1] = replacementQuery; + }; // NOTE: add new expression syntax here to have it recognised by the parser; + // - a query contains all adjacent (i.e. no separator in between) expressions; + // - the current query is stored in selector[i] + // - you need to check the query objects in match() for it actually filter properly, but that's pretty straight forward + + + var exprs = [{ + name: 'group', + // just used for identifying when debugging + query: true, + regex: '(' + tokens.group + ')', + populate: function populate(selector, query, _ref) { + var _ref2 = _slicedToArray(_ref, 1), + group = _ref2[0]; + + query.checks.push({ + type: Type.GROUP, + value: group === '*' ? group : group + 's' + }); + } + }, { + name: 'state', + query: true, + regex: stateSelectorRegex, + populate: function populate(selector, query, _ref3) { + var _ref4 = _slicedToArray(_ref3, 1), + state = _ref4[0]; + + query.checks.push({ + type: Type.STATE, + value: state + }); + } + }, { + name: 'id', + query: true, + regex: '\\#(' + tokens.id + ')', + populate: function populate(selector, query, _ref5) { + var _ref6 = _slicedToArray(_ref5, 1), + id = _ref6[0]; + + query.checks.push({ + type: Type.ID, + value: cleanMetaChars(id) + }); + } + }, { + name: 'className', + query: true, + regex: '\\.(' + tokens.className + ')', + populate: function populate(selector, query, _ref7) { + var _ref8 = _slicedToArray(_ref7, 1), + className = _ref8[0]; + + query.checks.push({ + type: Type.CLASS, + value: cleanMetaChars(className) + }); + } + }, { + name: 'dataExists', + query: true, + regex: '\\[\\s*(' + tokens.variable + ')\\s*\\]', + populate: function populate(selector, query, _ref9) { + var _ref10 = _slicedToArray(_ref9, 1), + variable = _ref10[0]; + + query.checks.push({ + type: Type.DATA_EXIST, + field: cleanMetaChars(variable) + }); + } + }, { + name: 'dataCompare', + query: true, + regex: '\\[\\s*(' + tokens.variable + ')\\s*(' + tokens.comparatorOp + ')\\s*(' + tokens.value + ')\\s*\\]', + populate: function populate(selector, query, _ref11) { + var _ref12 = _slicedToArray(_ref11, 3), + variable = _ref12[0], + comparatorOp = _ref12[1], + value = _ref12[2]; + + var valueIsString = new RegExp('^' + tokens.string + '$').exec(value) != null; + + if (valueIsString) { + value = value.substring(1, value.length - 1); + } else { + value = parseFloat(value); + } + + query.checks.push({ + type: Type.DATA_COMPARE, + field: cleanMetaChars(variable), + operator: comparatorOp, + value: value + }); + } + }, { + name: 'dataBool', + query: true, + regex: '\\[\\s*(' + tokens.boolOp + ')\\s*(' + tokens.variable + ')\\s*\\]', + populate: function populate(selector, query, _ref13) { + var _ref14 = _slicedToArray(_ref13, 2), + boolOp = _ref14[0], + variable = _ref14[1]; + + query.checks.push({ + type: Type.DATA_BOOL, + field: cleanMetaChars(variable), + operator: boolOp + }); + } + }, { + name: 'metaCompare', + query: true, + regex: '\\[\\[\\s*(' + tokens.meta + ')\\s*(' + tokens.comparatorOp + ')\\s*(' + tokens.number + ')\\s*\\]\\]', + populate: function populate(selector, query, _ref15) { + var _ref16 = _slicedToArray(_ref15, 3), + meta = _ref16[0], + comparatorOp = _ref16[1], + number = _ref16[2]; + + query.checks.push({ + type: Type.META_COMPARE, + field: cleanMetaChars(meta), + operator: comparatorOp, + value: parseFloat(number) + }); + } + }, { + name: 'nextQuery', + separator: true, + regex: tokens.separator, + populate: function populate(selector, query) { + var currentSubject = selector.currentSubject; + var edgeCount = selector.edgeCount; + var compoundCount = selector.compoundCount; + var lastQ = selector[selector.length - 1]; + + if (currentSubject != null) { + lastQ.subject = currentSubject; + selector.currentSubject = null; + } + + lastQ.edgeCount = edgeCount; + lastQ.compoundCount = compoundCount; + selector.edgeCount = 0; + selector.compoundCount = 0; // go on to next query + + var nextQuery = selector[selector.length++] = newQuery(); + return nextQuery; // this is the new query to be filled by the following exprs + } + }, { + name: 'directedEdge', + separator: true, + regex: tokens.directedEdge, + populate: function populate(selector, query) { + if (selector.currentSubject == null) { + // undirected edge + var edgeQuery = newQuery(); + var source = query; + var target = newQuery(); + edgeQuery.checks.push({ + type: Type.DIRECTED_EDGE, + source: source, + target: target + }); // the query in the selector should be the edge rather than the source + + replaceLastQuery(selector, query, edgeQuery); + selector.edgeCount++; // we're now populating the target query with expressions that follow + + return target; + } else { + // source/target + var srcTgtQ = newQuery(); + var _source = query; + + var _target = newQuery(); + + srcTgtQ.checks.push({ + type: Type.NODE_SOURCE, + source: _source, + target: _target + }); // the query in the selector should be the neighbourhood rather than the node + + replaceLastQuery(selector, query, srcTgtQ); + selector.edgeCount++; + return _target; // now populating the target with the following expressions + } + } + }, { + name: 'undirectedEdge', + separator: true, + regex: tokens.undirectedEdge, + populate: function populate(selector, query) { + if (selector.currentSubject == null) { + // undirected edge + var edgeQuery = newQuery(); + var source = query; + var target = newQuery(); + edgeQuery.checks.push({ + type: Type.UNDIRECTED_EDGE, + nodes: [source, target] + }); // the query in the selector should be the edge rather than the source + + replaceLastQuery(selector, query, edgeQuery); + selector.edgeCount++; // we're now populating the target query with expressions that follow + + return target; + } else { + // neighbourhood + var nhoodQ = newQuery(); + var node = query; + var neighbor = newQuery(); + nhoodQ.checks.push({ + type: Type.NODE_NEIGHBOR, + node: node, + neighbor: neighbor + }); // the query in the selector should be the neighbourhood rather than the node + + replaceLastQuery(selector, query, nhoodQ); + return neighbor; // now populating the neighbor with following expressions + } + } + }, { + name: 'child', + separator: true, + regex: tokens.child, + populate: function populate(selector, query) { + if (selector.currentSubject == null) { + // default: child query + var parentChildQuery = newQuery(); + var child = newQuery(); + var parent = selector[selector.length - 1]; + parentChildQuery.checks.push({ + type: Type.CHILD, + parent: parent, + child: child + }); // the query in the selector should be the '>' itself + + replaceLastQuery(selector, query, parentChildQuery); + selector.compoundCount++; // we're now populating the child query with expressions that follow + + return child; + } else if (selector.currentSubject === query) { + // compound split query + var compound = newQuery(); + var left = selector[selector.length - 1]; + var right = newQuery(); + var subject = newQuery(); + + var _child = newQuery(); + + var _parent = newQuery(); // set up the root compound q + + + compound.checks.push({ + type: Type.COMPOUND_SPLIT, + left: left, + right: right, + subject: subject + }); // populate the subject and replace the q at the old spot (within left) with TRUE + + subject.checks = query.checks; // take the checks from the left + + query.checks = [{ + type: Type.TRUE + }]; // checks under left refs the subject implicitly + // set up the right q + + _parent.checks.push({ + type: Type.TRUE + }); // parent implicitly refs the subject + + + right.checks.push({ + type: Type.PARENT, + // type is swapped on right side queries + parent: _parent, + child: _child // empty for now + + }); + replaceLastQuery(selector, left, compound); // update the ref since we moved things around for `query` + + selector.currentSubject = subject; + selector.compoundCount++; + return _child; // now populating the right side's child + } else { + // parent query + // info for parent query + var _parent2 = newQuery(); + + var _child2 = newQuery(); + + var pcQChecks = [{ + type: Type.PARENT, + parent: _parent2, + child: _child2 + }]; // the parent-child query takes the place of the query previously being populated + + _parent2.checks = query.checks; // the previous query contains the checks for the parent + + query.checks = pcQChecks; // pc query takes over + + selector.compoundCount++; + return _child2; // we're now populating the child + } + } + }, { + name: 'descendant', + separator: true, + regex: tokens.descendant, + populate: function populate(selector, query) { + if (selector.currentSubject == null) { + // default: descendant query + var ancChQuery = newQuery(); + var descendant = newQuery(); + var ancestor = selector[selector.length - 1]; + ancChQuery.checks.push({ + type: Type.DESCENDANT, + ancestor: ancestor, + descendant: descendant + }); // the query in the selector should be the '>' itself + + replaceLastQuery(selector, query, ancChQuery); + selector.compoundCount++; // we're now populating the descendant query with expressions that follow + + return descendant; + } else if (selector.currentSubject === query) { + // compound split query + var compound = newQuery(); + var left = selector[selector.length - 1]; + var right = newQuery(); + var subject = newQuery(); + + var _descendant = newQuery(); + + var _ancestor = newQuery(); // set up the root compound q + + + compound.checks.push({ + type: Type.COMPOUND_SPLIT, + left: left, + right: right, + subject: subject + }); // populate the subject and replace the q at the old spot (within left) with TRUE + + subject.checks = query.checks; // take the checks from the left + + query.checks = [{ + type: Type.TRUE + }]; // checks under left refs the subject implicitly + // set up the right q + + _ancestor.checks.push({ + type: Type.TRUE + }); // ancestor implicitly refs the subject + + + right.checks.push({ + type: Type.ANCESTOR, + // type is swapped on right side queries + ancestor: _ancestor, + descendant: _descendant // empty for now + + }); + replaceLastQuery(selector, left, compound); // update the ref since we moved things around for `query` + + selector.currentSubject = subject; + selector.compoundCount++; + return _descendant; // now populating the right side's descendant + } else { + // ancestor query + // info for parent query + var _ancestor2 = newQuery(); + + var _descendant2 = newQuery(); + + var adQChecks = [{ + type: Type.ANCESTOR, + ancestor: _ancestor2, + descendant: _descendant2 + }]; // the parent-child query takes the place of the query previously being populated + + _ancestor2.checks = query.checks; // the previous query contains the checks for the parent + + query.checks = adQChecks; // pc query takes over + + selector.compoundCount++; + return _descendant2; // we're now populating the child + } + } + }, { + name: 'subject', + modifier: true, + regex: tokens.subject, + populate: function populate(selector, query) { + if (selector.currentSubject != null && selector.currentSubject !== query) { + warn('Redefinition of subject in selector `' + selector.toString() + '`'); + return false; + } + + selector.currentSubject = query; + var topQ = selector[selector.length - 1]; + var topChk = topQ.checks[0]; + var topType = topChk == null ? null : topChk.type; + + if (topType === Type.DIRECTED_EDGE) { + // directed edge with subject on the target + // change to target node check + topChk.type = Type.NODE_TARGET; + } else if (topType === Type.UNDIRECTED_EDGE) { + // undirected edge with subject on the second node + // change to neighbor check + topChk.type = Type.NODE_NEIGHBOR; + topChk.node = topChk.nodes[1]; // second node is subject + + topChk.neighbor = topChk.nodes[0]; // clean up unused fields for new type + + topChk.nodes = null; + } + } + }]; + exprs.forEach(function (e) { + return e.regexObj = new RegExp('^' + e.regex); + }); + + /** + * Of all the expressions, find the first match in the remaining text. + * @param {string} remaining The remaining text to parse + * @returns The matched expression and the newly remaining text `{ expr, match, name, remaining }` + */ + + var consumeExpr = function consumeExpr(remaining) { + var expr; + var match; + var name; + + for (var j = 0; j < exprs.length; j++) { + var e = exprs[j]; + var n = e.name; + var m = remaining.match(e.regexObj); + + if (m != null) { + match = m; + expr = e; + name = n; + var consumed = m[0]; + remaining = remaining.substring(consumed.length); + break; // we've consumed one expr, so we can return now + } + } + + return { + expr: expr, + match: match, + name: name, + remaining: remaining + }; + }; + /** + * Consume all the leading whitespace + * @param {string} remaining The text to consume + * @returns The text with the leading whitespace removed + */ + + + var consumeWhitespace = function consumeWhitespace(remaining) { + var match = remaining.match(/^\s+/); + + if (match) { + var consumed = match[0]; + remaining = remaining.substring(consumed.length); + } + + return remaining; + }; + /** + * Parse the string and store the parsed representation in the Selector. + * @param {string} selector The selector string + * @returns `true` if the selector was successfully parsed, `false` otherwise + */ + + + var parse = function parse(selector) { + var self = this; + var remaining = self.inputText = selector; + var currentQuery = self[0] = newQuery(); + self.length = 1; + remaining = consumeWhitespace(remaining); // get rid of leading whitespace + + for (;;) { + var exprInfo = consumeExpr(remaining); + + if (exprInfo.expr == null) { + warn('The selector `' + selector + '`is invalid'); + return false; + } else { + var args = exprInfo.match.slice(1); // let the token populate the selector object in currentQuery + + var ret = exprInfo.expr.populate(self, currentQuery, args); + + if (ret === false) { + return false; // exit if population failed + } else if (ret != null) { + currentQuery = ret; // change the current query to be filled if the expr specifies + } + } + + remaining = exprInfo.remaining; // we're done when there's nothing left to parse + + if (remaining.match(/^\s*$/)) { + break; + } + } + + var lastQ = self[self.length - 1]; + + if (self.currentSubject != null) { + lastQ.subject = self.currentSubject; + } + + lastQ.edgeCount = self.edgeCount; + lastQ.compoundCount = self.compoundCount; + + for (var i = 0; i < self.length; i++) { + var q = self[i]; // in future, this could potentially be allowed if there were operator precedence and detection of invalid combinations + + if (q.compoundCount > 0 && q.edgeCount > 0) { + warn('The selector `' + selector + '` is invalid because it uses both a compound selector and an edge selector'); + return false; + } + + if (q.edgeCount > 1) { + warn('The selector `' + selector + '` is invalid because it uses multiple edge selectors'); + return false; + } else if (q.edgeCount === 1) { + warn('The selector `' + selector + '` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.'); + } + } + + return true; // success + }; + /** + * Get the selector represented as a string. This value uses default formatting, + * so things like spacing may differ from the input text passed to the constructor. + * @returns {string} The selector string + */ + + + var toString = function toString() { + if (this.toStringCache != null) { + return this.toStringCache; + } + + var clean = function clean(obj) { + if (obj == null) { + return ''; + } else { + return obj; + } + }; + + var cleanVal = function cleanVal(val) { + if (string(val)) { + return '"' + val + '"'; + } else { + return clean(val); + } + }; + + var space = function space(val) { + return ' ' + val + ' '; + }; + + var checkToString = function checkToString(check, subject) { + var type = check.type, + value = check.value; + + switch (type) { + case Type.GROUP: + { + var group = clean(value); + return group.substring(0, group.length - 1); + } + + case Type.DATA_COMPARE: + { + var field = check.field, + operator = check.operator; + return '[' + field + space(clean(operator)) + cleanVal(value) + ']'; + } + + case Type.DATA_BOOL: + { + var _operator = check.operator, + _field = check.field; + return '[' + clean(_operator) + _field + ']'; + } + + case Type.DATA_EXIST: + { + var _field2 = check.field; + return '[' + _field2 + ']'; + } + + case Type.META_COMPARE: + { + var _operator2 = check.operator, + _field3 = check.field; + return '[[' + _field3 + space(clean(_operator2)) + cleanVal(value) + ']]'; + } + + case Type.STATE: + { + return value; + } + + case Type.ID: + { + return '#' + value; + } + + case Type.CLASS: + { + return '.' + value; + } + + case Type.PARENT: + case Type.CHILD: + { + return queryToString(check.parent, subject) + space('>') + queryToString(check.child, subject); + } + + case Type.ANCESTOR: + case Type.DESCENDANT: + { + return queryToString(check.ancestor, subject) + ' ' + queryToString(check.descendant, subject); + } + + case Type.COMPOUND_SPLIT: + { + var lhs = queryToString(check.left, subject); + var sub = queryToString(check.subject, subject); + var rhs = queryToString(check.right, subject); + return lhs + (lhs.length > 0 ? ' ' : '') + sub + rhs; + } + + case Type.TRUE: + { + return ''; + } + } + }; + + var queryToString = function queryToString(query, subject) { + return query.checks.reduce(function (str, chk, i) { + return str + (subject === query && i === 0 ? '$' : '') + checkToString(chk, subject); + }, ''); + }; + + var str = ''; + + for (var i = 0; i < this.length; i++) { + var query = this[i]; + str += queryToString(query, query.subject); + + if (this.length > 1 && i < this.length - 1) { + str += ', '; + } + } + + this.toStringCache = str; + return str; + }; + var parse$1 = { + parse: parse, + toString: toString + }; + + var valCmp = function valCmp(fieldVal, operator, value) { + var matches; + var isFieldStr = string(fieldVal); + var isFieldNum = number$1(fieldVal); + var isValStr = string(value); + var fieldStr, valStr; + var caseInsensitive = false; + var notExpr = false; + var isIneqCmp = false; + + if (operator.indexOf('!') >= 0) { + operator = operator.replace('!', ''); + notExpr = true; + } + + if (operator.indexOf('@') >= 0) { + operator = operator.replace('@', ''); + caseInsensitive = true; + } + + if (isFieldStr || isValStr || caseInsensitive) { + fieldStr = !isFieldStr && !isFieldNum ? '' : '' + fieldVal; + valStr = '' + value; + } // if we're doing a case insensitive comparison, then we're using a STRING comparison + // even if we're comparing numbers + + + if (caseInsensitive) { + fieldVal = fieldStr = fieldStr.toLowerCase(); + value = valStr = valStr.toLowerCase(); + } + + switch (operator) { + case '*=': + matches = fieldStr.indexOf(valStr) >= 0; + break; + + case '$=': + matches = fieldStr.indexOf(valStr, fieldStr.length - valStr.length) >= 0; + break; + + case '^=': + matches = fieldStr.indexOf(valStr) === 0; + break; + + case '=': + matches = fieldVal === value; + break; + + case '>': + isIneqCmp = true; + matches = fieldVal > value; + break; + + case '>=': + isIneqCmp = true; + matches = fieldVal >= value; + break; + + case '<': + isIneqCmp = true; + matches = fieldVal < value; + break; + + case '<=': + isIneqCmp = true; + matches = fieldVal <= value; + break; + + default: + matches = false; + break; + } // apply the not op, but null vals for inequalities should always stay non-matching + + + if (notExpr && (fieldVal != null || !isIneqCmp)) { + matches = !matches; + } + + return matches; + }; + var boolCmp = function boolCmp(fieldVal, operator) { + switch (operator) { + case '?': + return fieldVal ? true : false; + + case '!': + return fieldVal ? false : true; + + case '^': + return fieldVal === undefined; + } + }; + var existCmp = function existCmp(fieldVal) { + return fieldVal !== undefined; + }; + var data$1 = function data(ele, field) { + return ele.data(field); + }; + var meta = function meta(ele, field) { + return ele[field](); + }; + + /** A lookup of `match(check, ele)` functions by `Type` int */ + + var match = []; + /** + * Returns whether the query matches for the element + * @param query The `{ type, value, ... }` query object + * @param ele The element to compare against + */ + + var matches$1 = function matches(query, ele) { + return query.checks.every(function (chk) { + return match[chk.type](chk, ele); + }); + }; + + match[Type.GROUP] = function (check, ele) { + var group = check.value; + return group === '*' || group === ele.group(); + }; + + match[Type.STATE] = function (check, ele) { + var stateSelector = check.value; + return stateSelectorMatches(stateSelector, ele); + }; + + match[Type.ID] = function (check, ele) { + var id = check.value; + return ele.id() === id; + }; + + match[Type.CLASS] = function (check, ele) { + var cls = check.value; + return ele.hasClass(cls); + }; + + match[Type.META_COMPARE] = function (check, ele) { + var field = check.field, + operator = check.operator, + value = check.value; + return valCmp(meta(ele, field), operator, value); + }; + + match[Type.DATA_COMPARE] = function (check, ele) { + var field = check.field, + operator = check.operator, + value = check.value; + return valCmp(data$1(ele, field), operator, value); + }; + + match[Type.DATA_BOOL] = function (check, ele) { + var field = check.field, + operator = check.operator; + return boolCmp(data$1(ele, field), operator); + }; + + match[Type.DATA_EXIST] = function (check, ele) { + var field = check.field; + check.operator; + return existCmp(data$1(ele, field)); + }; + + match[Type.UNDIRECTED_EDGE] = function (check, ele) { + var qA = check.nodes[0]; + var qB = check.nodes[1]; + var src = ele.source(); + var tgt = ele.target(); + return matches$1(qA, src) && matches$1(qB, tgt) || matches$1(qB, src) && matches$1(qA, tgt); + }; + + match[Type.NODE_NEIGHBOR] = function (check, ele) { + return matches$1(check.node, ele) && ele.neighborhood().some(function (n) { + return n.isNode() && matches$1(check.neighbor, n); + }); + }; + + match[Type.DIRECTED_EDGE] = function (check, ele) { + return matches$1(check.source, ele.source()) && matches$1(check.target, ele.target()); + }; + + match[Type.NODE_SOURCE] = function (check, ele) { + return matches$1(check.source, ele) && ele.outgoers().some(function (n) { + return n.isNode() && matches$1(check.target, n); + }); + }; + + match[Type.NODE_TARGET] = function (check, ele) { + return matches$1(check.target, ele) && ele.incomers().some(function (n) { + return n.isNode() && matches$1(check.source, n); + }); + }; + + match[Type.CHILD] = function (check, ele) { + return matches$1(check.child, ele) && matches$1(check.parent, ele.parent()); + }; + + match[Type.PARENT] = function (check, ele) { + return matches$1(check.parent, ele) && ele.children().some(function (c) { + return matches$1(check.child, c); + }); + }; + + match[Type.DESCENDANT] = function (check, ele) { + return matches$1(check.descendant, ele) && ele.ancestors().some(function (a) { + return matches$1(check.ancestor, a); + }); + }; + + match[Type.ANCESTOR] = function (check, ele) { + return matches$1(check.ancestor, ele) && ele.descendants().some(function (d) { + return matches$1(check.descendant, d); + }); + }; + + match[Type.COMPOUND_SPLIT] = function (check, ele) { + return matches$1(check.subject, ele) && matches$1(check.left, ele) && matches$1(check.right, ele); + }; + + match[Type.TRUE] = function () { + return true; + }; + + match[Type.COLLECTION] = function (check, ele) { + var collection = check.value; + return collection.has(ele); + }; + + match[Type.FILTER] = function (check, ele) { + var filter = check.value; + return filter(ele); + }; + + var filter = function filter(collection) { + var self = this; // for 1 id #foo queries, just get the element + + if (self.length === 1 && self[0].checks.length === 1 && self[0].checks[0].type === Type.ID) { + return collection.getElementById(self[0].checks[0].value).collection(); + } + + var selectorFunction = function selectorFunction(element) { + for (var j = 0; j < self.length; j++) { + var query = self[j]; + + if (matches$1(query, element)) { + return true; + } + } + + return false; + }; + + if (self.text() == null) { + selectorFunction = function selectorFunction() { + return true; + }; + } + + return collection.filter(selectorFunction); + }; // filter + // does selector match a single element? + + + var matches = function matches(ele) { + var self = this; + + for (var j = 0; j < self.length; j++) { + var query = self[j]; + + if (matches$1(query, ele)) { + return true; + } + } + + return false; + }; // matches + + + var matching = { + matches: matches, + filter: filter + }; + + var Selector = function Selector(selector) { + this.inputText = selector; + this.currentSubject = null; + this.compoundCount = 0; + this.edgeCount = 0; + this.length = 0; + + if (selector == null || string(selector) && selector.match(/^\s*$/)) ; else if (elementOrCollection(selector)) { + this.addQuery({ + checks: [{ + type: Type.COLLECTION, + value: selector.collection() + }] + }); + } else if (fn$6(selector)) { + this.addQuery({ + checks: [{ + type: Type.FILTER, + value: selector + }] + }); + } else if (string(selector)) { + if (!this.parse(selector)) { + this.invalid = true; + } + } else { + error('A selector must be created from a string; found '); + } + }; + + var selfn = Selector.prototype; + [parse$1, matching].forEach(function (p) { + return extend(selfn, p); + }); + + selfn.text = function () { + return this.inputText; + }; + + selfn.size = function () { + return this.length; + }; + + selfn.eq = function (i) { + return this[i]; + }; + + selfn.sameText = function (otherSel) { + return !this.invalid && !otherSel.invalid && this.text() === otherSel.text(); + }; + + selfn.addQuery = function (q) { + this[this.length++] = q; + }; + + selfn.selector = selfn.toString; + + var elesfn$g = { + allAre: function allAre(selector) { + var selObj = new Selector(selector); + return this.every(function (ele) { + return selObj.matches(ele); + }); + }, + is: function is(selector) { + var selObj = new Selector(selector); + return this.some(function (ele) { + return selObj.matches(ele); + }); + }, + some: function some(fn, thisArg) { + for (var i = 0; i < this.length; i++) { + var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]); + + if (ret) { + return true; + } + } + + return false; + }, + every: function every(fn, thisArg) { + for (var i = 0; i < this.length; i++) { + var ret = !thisArg ? fn(this[i], i, this) : fn.apply(thisArg, [this[i], i, this]); + + if (!ret) { + return false; + } + } + + return true; + }, + same: function same(collection) { + // cheap collection ref check + if (this === collection) { + return true; + } + + collection = this.cy().collection(collection); + var thisLength = this.length; + var collectionLength = collection.length; // cheap length check + + if (thisLength !== collectionLength) { + return false; + } // cheap element ref check + + + if (thisLength === 1) { + return this[0] === collection[0]; + } + + return this.every(function (ele) { + return collection.hasElementWithId(ele.id()); + }); + }, + anySame: function anySame(collection) { + collection = this.cy().collection(collection); + return this.some(function (ele) { + return collection.hasElementWithId(ele.id()); + }); + }, + allAreNeighbors: function allAreNeighbors(collection) { + collection = this.cy().collection(collection); + var nhood = this.neighborhood(); + return collection.every(function (ele) { + return nhood.hasElementWithId(ele.id()); + }); + }, + contains: function contains(collection) { + collection = this.cy().collection(collection); + var self = this; + return collection.every(function (ele) { + return self.hasElementWithId(ele.id()); + }); + } + }; + elesfn$g.allAreNeighbours = elesfn$g.allAreNeighbors; + elesfn$g.has = elesfn$g.contains; + elesfn$g.equal = elesfn$g.equals = elesfn$g.same; + + var cache = function cache(fn, name) { + return function traversalCache(arg1, arg2, arg3, arg4) { + var selectorOrEles = arg1; + var eles = this; + var key; + + if (selectorOrEles == null) { + key = ''; + } else if (elementOrCollection(selectorOrEles) && selectorOrEles.length === 1) { + key = selectorOrEles.id(); + } + + if (eles.length === 1 && key) { + var _p = eles[0]._private; + var tch = _p.traversalCache = _p.traversalCache || {}; + var ch = tch[name] = tch[name] || []; + var hash = hashString(key); + var cacheHit = ch[hash]; + + if (cacheHit) { + return cacheHit; + } else { + return ch[hash] = fn.call(eles, arg1, arg2, arg3, arg4); + } + } else { + return fn.call(eles, arg1, arg2, arg3, arg4); + } + }; + }; + + var elesfn$f = { + parent: function parent(selector) { + var parents = []; // optimisation for single ele call + + if (this.length === 1) { + var parent = this[0]._private.parent; + + if (parent) { + return parent; + } + } + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var _parent = ele._private.parent; + + if (_parent) { + parents.push(_parent); + } + } + + return this.spawn(parents, true).filter(selector); + }, + parents: function parents(selector) { + var parents = []; + var eles = this.parent(); + + while (eles.nonempty()) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + parents.push(ele); + } + + eles = eles.parent(); + } + + return this.spawn(parents, true).filter(selector); + }, + commonAncestors: function commonAncestors(selector) { + var ancestors; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var parents = ele.parents(); + ancestors = ancestors || parents; + ancestors = ancestors.intersect(parents); // current list must be common with current ele parents set + } + + return ancestors.filter(selector); + }, + orphans: function orphans(selector) { + return this.stdFilter(function (ele) { + return ele.isOrphan(); + }).filter(selector); + }, + nonorphans: function nonorphans(selector) { + return this.stdFilter(function (ele) { + return ele.isChild(); + }).filter(selector); + }, + children: cache(function (selector) { + var children = []; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var eleChildren = ele._private.children; + + for (var j = 0; j < eleChildren.length; j++) { + children.push(eleChildren[j]); + } + } + + return this.spawn(children, true).filter(selector); + }, 'children'), + siblings: function siblings(selector) { + return this.parent().children().not(this).filter(selector); + }, + isParent: function isParent() { + var ele = this[0]; + + if (ele) { + return ele.isNode() && ele._private.children.length !== 0; + } + }, + isChildless: function isChildless() { + var ele = this[0]; + + if (ele) { + return ele.isNode() && ele._private.children.length === 0; + } + }, + isChild: function isChild() { + var ele = this[0]; + + if (ele) { + return ele.isNode() && ele._private.parent != null; + } + }, + isOrphan: function isOrphan() { + var ele = this[0]; + + if (ele) { + return ele.isNode() && ele._private.parent == null; + } + }, + descendants: function descendants(selector) { + var elements = []; + + function add(eles) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + elements.push(ele); + + if (ele.children().nonempty()) { + add(ele.children()); + } + } + } + + add(this.children()); + return this.spawn(elements, true).filter(selector); + } + }; + + function forEachCompound(eles, fn, includeSelf, recursiveStep) { + var q = []; + var did = new Set$1(); + var cy = eles.cy(); + var hasCompounds = cy.hasCompoundNodes(); + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (includeSelf) { + q.push(ele); + } else if (hasCompounds) { + recursiveStep(q, did, ele); + } + } + + while (q.length > 0) { + var _ele = q.shift(); + + fn(_ele); + did.add(_ele.id()); + + if (hasCompounds) { + recursiveStep(q, did, _ele); + } + } + + return eles; + } + + function addChildren(q, did, ele) { + if (ele.isParent()) { + var children = ele._private.children; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + + if (!did.has(child.id())) { + q.push(child); + } + } + } + } // very efficient version of eles.add( eles.descendants() ).forEach() + // for internal use + + + elesfn$f.forEachDown = function (fn) { + var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return forEachCompound(this, fn, includeSelf, addChildren); + }; + + function addParent(q, did, ele) { + if (ele.isChild()) { + var parent = ele._private.parent; + + if (!did.has(parent.id())) { + q.push(parent); + } + } + } + + elesfn$f.forEachUp = function (fn) { + var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return forEachCompound(this, fn, includeSelf, addParent); + }; + + function addParentAndChildren(q, did, ele) { + addParent(q, did, ele); + addChildren(q, did, ele); + } + + elesfn$f.forEachUpAndDown = function (fn) { + var includeSelf = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + return forEachCompound(this, fn, includeSelf, addParentAndChildren); + }; // aliases + + + elesfn$f.ancestors = elesfn$f.parents; + + var fn$5, elesfn$e; + fn$5 = elesfn$e = { + data: define.data({ + field: 'data', + bindingEvent: 'data', + allowBinding: true, + allowSetting: true, + settingEvent: 'data', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + immutableKeys: { + 'id': true, + 'source': true, + 'target': true, + 'parent': true + }, + updateStyle: true + }), + removeData: define.removeData({ + field: 'data', + event: 'data', + triggerFnName: 'trigger', + triggerEvent: true, + immutableKeys: { + 'id': true, + 'source': true, + 'target': true, + 'parent': true + }, + updateStyle: true + }), + scratch: define.data({ + field: 'scratch', + bindingEvent: 'scratch', + allowBinding: true, + allowSetting: true, + settingEvent: 'scratch', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + updateStyle: true + }), + removeScratch: define.removeData({ + field: 'scratch', + event: 'scratch', + triggerFnName: 'trigger', + triggerEvent: true, + updateStyle: true + }), + rscratch: define.data({ + field: 'rscratch', + allowBinding: false, + allowSetting: true, + settingTriggersEvent: false, + allowGetting: true + }), + removeRscratch: define.removeData({ + field: 'rscratch', + triggerEvent: false + }), + id: function id() { + var ele = this[0]; + + if (ele) { + return ele._private.data.id; + } + } + }; // aliases + + fn$5.attr = fn$5.data; + fn$5.removeAttr = fn$5.removeData; + var data = elesfn$e; + + var elesfn$d = {}; + + function defineDegreeFunction(callback) { + return function (includeLoops) { + var self = this; + + if (includeLoops === undefined) { + includeLoops = true; + } + + if (self.length === 0) { + return; + } + + if (self.isNode() && !self.removed()) { + var degree = 0; + var node = self[0]; + var connectedEdges = node._private.edges; + + for (var i = 0; i < connectedEdges.length; i++) { + var edge = connectedEdges[i]; + + if (!includeLoops && edge.isLoop()) { + continue; + } + + degree += callback(node, edge); + } + + return degree; + } else { + return; + } + }; + } + + extend(elesfn$d, { + degree: defineDegreeFunction(function (node, edge) { + if (edge.source().same(edge.target())) { + return 2; + } else { + return 1; + } + }), + indegree: defineDegreeFunction(function (node, edge) { + if (edge.target().same(node)) { + return 1; + } else { + return 0; + } + }), + outdegree: defineDegreeFunction(function (node, edge) { + if (edge.source().same(node)) { + return 1; + } else { + return 0; + } + }) + }); + + function defineDegreeBoundsFunction(degreeFn, callback) { + return function (includeLoops) { + var ret; + var nodes = this.nodes(); + + for (var i = 0; i < nodes.length; i++) { + var ele = nodes[i]; + var degree = ele[degreeFn](includeLoops); + + if (degree !== undefined && (ret === undefined || callback(degree, ret))) { + ret = degree; + } + } + + return ret; + }; + } + + extend(elesfn$d, { + minDegree: defineDegreeBoundsFunction('degree', function (degree, min) { + return degree < min; + }), + maxDegree: defineDegreeBoundsFunction('degree', function (degree, max) { + return degree > max; + }), + minIndegree: defineDegreeBoundsFunction('indegree', function (degree, min) { + return degree < min; + }), + maxIndegree: defineDegreeBoundsFunction('indegree', function (degree, max) { + return degree > max; + }), + minOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, min) { + return degree < min; + }), + maxOutdegree: defineDegreeBoundsFunction('outdegree', function (degree, max) { + return degree > max; + }) + }); + extend(elesfn$d, { + totalDegree: function totalDegree(includeLoops) { + var total = 0; + var nodes = this.nodes(); + + for (var i = 0; i < nodes.length; i++) { + total += nodes[i].degree(includeLoops); + } + + return total; + } + }); + + var fn$4, elesfn$c; + + var beforePositionSet = function beforePositionSet(eles, newPos, silent) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (!ele.locked()) { + var oldPos = ele._private.position; + var delta = { + x: newPos.x != null ? newPos.x - oldPos.x : 0, + y: newPos.y != null ? newPos.y - oldPos.y : 0 + }; + + if (ele.isParent() && !(delta.x === 0 && delta.y === 0)) { + ele.children().shift(delta, silent); + } + + ele.dirtyBoundingBoxCache(); + } + } + }; + + var positionDef = { + field: 'position', + bindingEvent: 'position', + allowBinding: true, + allowSetting: true, + settingEvent: 'position', + settingTriggersEvent: true, + triggerFnName: 'emitAndNotify', + allowGetting: true, + validKeys: ['x', 'y'], + beforeGet: function beforeGet(ele) { + ele.updateCompoundBounds(); + }, + beforeSet: function beforeSet(eles, newPos) { + beforePositionSet(eles, newPos, false); + }, + onSet: function onSet(eles) { + eles.dirtyCompoundBoundsCache(); + }, + canSet: function canSet(ele) { + return !ele.locked(); + } + }; + fn$4 = elesfn$c = { + position: define.data(positionDef), + // position but no notification to renderer + silentPosition: define.data(extend({}, positionDef, { + allowBinding: false, + allowSetting: true, + settingTriggersEvent: false, + allowGetting: false, + beforeSet: function beforeSet(eles, newPos) { + beforePositionSet(eles, newPos, true); + }, + onSet: function onSet(eles) { + eles.dirtyCompoundBoundsCache(); + } + })), + positions: function positions(pos, silent) { + if (plainObject(pos)) { + if (silent) { + this.silentPosition(pos); + } else { + this.position(pos); + } + } else if (fn$6(pos)) { + var _fn = pos; + var cy = this.cy(); + cy.startBatch(); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + + var _pos = void 0; + + if (_pos = _fn(ele, i)) { + if (silent) { + ele.silentPosition(_pos); + } else { + ele.position(_pos); + } + } + } + + cy.endBatch(); + } + + return this; // chaining + }, + silentPositions: function silentPositions(pos) { + return this.positions(pos, true); + }, + shift: function shift(dim, val, silent) { + var delta; + + if (plainObject(dim)) { + delta = { + x: number$1(dim.x) ? dim.x : 0, + y: number$1(dim.y) ? dim.y : 0 + }; + silent = val; + } else if (string(dim) && number$1(val)) { + delta = { + x: 0, + y: 0 + }; + delta[dim] = val; + } + + if (delta != null) { + var cy = this.cy(); + cy.startBatch(); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; // exclude any node that is a descendant of the calling collection + + if (cy.hasCompoundNodes() && ele.isChild() && ele.ancestors().anySame(this)) { + continue; + } + + var pos = ele.position(); + var newPos = { + x: pos.x + delta.x, + y: pos.y + delta.y + }; + + if (silent) { + ele.silentPosition(newPos); + } else { + ele.position(newPos); + } + } + + cy.endBatch(); + } + + return this; + }, + silentShift: function silentShift(dim, val) { + if (plainObject(dim)) { + this.shift(dim, true); + } else if (string(dim) && number$1(val)) { + this.shift(dim, val, true); + } + + return this; + }, + // get/set the rendered (i.e. on screen) positon of the element + renderedPosition: function renderedPosition(dim, val) { + var ele = this[0]; + var cy = this.cy(); + var zoom = cy.zoom(); + var pan = cy.pan(); + var rpos = plainObject(dim) ? dim : undefined; + var setting = rpos !== undefined || val !== undefined && string(dim); + + if (ele && ele.isNode()) { + // must have an element and must be a node to return position + if (setting) { + for (var i = 0; i < this.length; i++) { + var _ele = this[i]; + + if (val !== undefined) { + // set one dimension + _ele.position(dim, (val - pan[dim]) / zoom); + } else if (rpos !== undefined) { + // set whole position + _ele.position(renderedToModelPosition(rpos, zoom, pan)); + } + } + } else { + // getting + var pos = ele.position(); + rpos = modelToRenderedPosition(pos, zoom, pan); + + if (dim === undefined) { + // then return the whole rendered position + return rpos; + } else { + // then return the specified dimension + return rpos[dim]; + } + } + } else if (!setting) { + return undefined; // for empty collection case + } + + return this; // chaining + }, + // get/set the position relative to the parent + relativePosition: function relativePosition(dim, val) { + var ele = this[0]; + var cy = this.cy(); + var ppos = plainObject(dim) ? dim : undefined; + var setting = ppos !== undefined || val !== undefined && string(dim); + var hasCompoundNodes = cy.hasCompoundNodes(); + + if (ele && ele.isNode()) { + // must have an element and must be a node to return position + if (setting) { + for (var i = 0; i < this.length; i++) { + var _ele2 = this[i]; + var parent = hasCompoundNodes ? _ele2.parent() : null; + var hasParent = parent && parent.length > 0; + var relativeToParent = hasParent; + + if (hasParent) { + parent = parent[0]; + } + + var origin = relativeToParent ? parent.position() : { + x: 0, + y: 0 + }; + + if (val !== undefined) { + // set one dimension + _ele2.position(dim, val + origin[dim]); + } else if (ppos !== undefined) { + // set whole position + _ele2.position({ + x: ppos.x + origin.x, + y: ppos.y + origin.y + }); + } + } + } else { + // getting + var pos = ele.position(); + + var _parent = hasCompoundNodes ? ele.parent() : null; + + var _hasParent = _parent && _parent.length > 0; + + var _relativeToParent = _hasParent; + + if (_hasParent) { + _parent = _parent[0]; + } + + var _origin = _relativeToParent ? _parent.position() : { + x: 0, + y: 0 + }; + + ppos = { + x: pos.x - _origin.x, + y: pos.y - _origin.y + }; + + if (dim === undefined) { + // then return the whole rendered position + return ppos; + } else { + // then return the specified dimension + return ppos[dim]; + } + } + } else if (!setting) { + return undefined; // for empty collection case + } + + return this; // chaining + } + }; // aliases + + fn$4.modelPosition = fn$4.point = fn$4.position; + fn$4.modelPositions = fn$4.points = fn$4.positions; + fn$4.renderedPoint = fn$4.renderedPosition; + fn$4.relativePoint = fn$4.relativePosition; + var position = elesfn$c; + + var fn$3, elesfn$b; + fn$3 = elesfn$b = {}; + + elesfn$b.renderedBoundingBox = function (options) { + var bb = this.boundingBox(options); + var cy = this.cy(); + var zoom = cy.zoom(); + var pan = cy.pan(); + var x1 = bb.x1 * zoom + pan.x; + var x2 = bb.x2 * zoom + pan.x; + var y1 = bb.y1 * zoom + pan.y; + var y2 = bb.y2 * zoom + pan.y; + return { + x1: x1, + x2: x2, + y1: y1, + y2: y2, + w: x2 - x1, + h: y2 - y1 + }; + }; + + elesfn$b.dirtyCompoundBoundsCache = function () { + var silent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var cy = this.cy(); + + if (!cy.styleEnabled() || !cy.hasCompoundNodes()) { + return this; + } + + this.forEachUp(function (ele) { + if (ele.isParent()) { + var _p = ele._private; + _p.compoundBoundsClean = false; + _p.bbCache = null; + + if (!silent) { + ele.emitAndNotify('bounds'); + } + } + }); + return this; + }; + + elesfn$b.updateCompoundBounds = function () { + var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var cy = this.cy(); // not possible to do on non-compound graphs or with the style disabled + + if (!cy.styleEnabled() || !cy.hasCompoundNodes()) { + return this; + } // save cycles when batching -- but bounds will be stale (or not exist yet) + + + if (!force && cy.batching()) { + return this; + } + + function update(parent) { + if (!parent.isParent()) { + return; + } + + var _p = parent._private; + var children = parent.children(); + var includeLabels = parent.pstyle('compound-sizing-wrt-labels').value === 'include'; + var min = { + width: { + val: parent.pstyle('min-width').pfValue, + left: parent.pstyle('min-width-bias-left'), + right: parent.pstyle('min-width-bias-right') + }, + height: { + val: parent.pstyle('min-height').pfValue, + top: parent.pstyle('min-height-bias-top'), + bottom: parent.pstyle('min-height-bias-bottom') + } + }; + var bb = children.boundingBox({ + includeLabels: includeLabels, + includeOverlays: false, + // updating the compound bounds happens outside of the regular + // cache cycle (i.e. before fired events) + useCache: false + }); + var pos = _p.position; // if children take up zero area then keep position and fall back on stylesheet w/h + + if (bb.w === 0 || bb.h === 0) { + bb = { + w: parent.pstyle('width').pfValue, + h: parent.pstyle('height').pfValue + }; + bb.x1 = pos.x - bb.w / 2; + bb.x2 = pos.x + bb.w / 2; + bb.y1 = pos.y - bb.h / 2; + bb.y2 = pos.y + bb.h / 2; + } + + function computeBiasValues(propDiff, propBias, propBiasComplement) { + var biasDiff = 0; + var biasComplementDiff = 0; + var biasTotal = propBias + propBiasComplement; + + if (propDiff > 0 && biasTotal > 0) { + biasDiff = propBias / biasTotal * propDiff; + biasComplementDiff = propBiasComplement / biasTotal * propDiff; + } + + return { + biasDiff: biasDiff, + biasComplementDiff: biasComplementDiff + }; + } + + function computePaddingValues(width, height, paddingObject, relativeTo) { + // Assuming percentage is number from 0 to 1 + if (paddingObject.units === '%') { + switch (relativeTo) { + case 'width': + return width > 0 ? paddingObject.pfValue * width : 0; + + case 'height': + return height > 0 ? paddingObject.pfValue * height : 0; + + case 'average': + return width > 0 && height > 0 ? paddingObject.pfValue * (width + height) / 2 : 0; + + case 'min': + return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * height : paddingObject.pfValue * width : 0; + + case 'max': + return width > 0 && height > 0 ? width > height ? paddingObject.pfValue * width : paddingObject.pfValue * height : 0; + + default: + return 0; + } + } else if (paddingObject.units === 'px') { + return paddingObject.pfValue; + } else { + return 0; + } + } + + var leftVal = min.width.left.value; + + if (min.width.left.units === 'px' && min.width.val > 0) { + leftVal = leftVal * 100 / min.width.val; + } + + var rightVal = min.width.right.value; + + if (min.width.right.units === 'px' && min.width.val > 0) { + rightVal = rightVal * 100 / min.width.val; + } + + var topVal = min.height.top.value; + + if (min.height.top.units === 'px' && min.height.val > 0) { + topVal = topVal * 100 / min.height.val; + } + + var bottomVal = min.height.bottom.value; + + if (min.height.bottom.units === 'px' && min.height.val > 0) { + bottomVal = bottomVal * 100 / min.height.val; + } + + var widthBiasDiffs = computeBiasValues(min.width.val - bb.w, leftVal, rightVal); + var diffLeft = widthBiasDiffs.biasDiff; + var diffRight = widthBiasDiffs.biasComplementDiff; + var heightBiasDiffs = computeBiasValues(min.height.val - bb.h, topVal, bottomVal); + var diffTop = heightBiasDiffs.biasDiff; + var diffBottom = heightBiasDiffs.biasComplementDiff; + _p.autoPadding = computePaddingValues(bb.w, bb.h, parent.pstyle('padding'), parent.pstyle('padding-relative-to').value); + _p.autoWidth = Math.max(bb.w, min.width.val); + pos.x = (-diffLeft + bb.x1 + bb.x2 + diffRight) / 2; + _p.autoHeight = Math.max(bb.h, min.height.val); + pos.y = (-diffTop + bb.y1 + bb.y2 + diffBottom) / 2; + } + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var _p = ele._private; + + if (!_p.compoundBoundsClean || force) { + update(ele); + + if (!cy.batching()) { + _p.compoundBoundsClean = true; + } + } + } + + return this; + }; + + var noninf = function noninf(x) { + if (x === Infinity || x === -Infinity) { + return 0; + } + + return x; + }; + + var updateBounds = function updateBounds(b, x1, y1, x2, y2) { + // don't update with zero area boxes + if (x2 - x1 === 0 || y2 - y1 === 0) { + return; + } // don't update with null dim + + + if (x1 == null || y1 == null || x2 == null || y2 == null) { + return; + } + + b.x1 = x1 < b.x1 ? x1 : b.x1; + b.x2 = x2 > b.x2 ? x2 : b.x2; + b.y1 = y1 < b.y1 ? y1 : b.y1; + b.y2 = y2 > b.y2 ? y2 : b.y2; + b.w = b.x2 - b.x1; + b.h = b.y2 - b.y1; + }; + + var updateBoundsFromBox = function updateBoundsFromBox(b, b2) { + if (b2 == null) { + return b; + } + + return updateBounds(b, b2.x1, b2.y1, b2.x2, b2.y2); + }; + + var prefixedProperty = function prefixedProperty(obj, field, prefix) { + return getPrefixedProperty(obj, field, prefix); + }; + + var updateBoundsFromArrow = function updateBoundsFromArrow(bounds, ele, prefix) { + if (ele.cy().headless()) { + return; + } + + var _p = ele._private; + var rstyle = _p.rstyle; + var halfArW = rstyle.arrowWidth / 2; + var arrowType = ele.pstyle(prefix + '-arrow-shape').value; + var x; + var y; + + if (arrowType !== 'none') { + if (prefix === 'source') { + x = rstyle.srcX; + y = rstyle.srcY; + } else if (prefix === 'target') { + x = rstyle.tgtX; + y = rstyle.tgtY; + } else { + x = rstyle.midX; + y = rstyle.midY; + } // always store the individual arrow bounds + + + var bbs = _p.arrowBounds = _p.arrowBounds || {}; + var bb = bbs[prefix] = bbs[prefix] || {}; + bb.x1 = x - halfArW; + bb.y1 = y - halfArW; + bb.x2 = x + halfArW; + bb.y2 = y + halfArW; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + expandBoundingBox(bb, 1); + updateBounds(bounds, bb.x1, bb.y1, bb.x2, bb.y2); + } + }; + + var updateBoundsFromLabel = function updateBoundsFromLabel(bounds, ele, prefix) { + if (ele.cy().headless()) { + return; + } + + var prefixDash; + + if (prefix) { + prefixDash = prefix + '-'; + } else { + prefixDash = ''; + } + + var _p = ele._private; + var rstyle = _p.rstyle; + var label = ele.pstyle(prefixDash + 'label').strValue; + + if (label) { + var halign = ele.pstyle('text-halign'); + var valign = ele.pstyle('text-valign'); + var labelWidth = prefixedProperty(rstyle, 'labelWidth', prefix); + var labelHeight = prefixedProperty(rstyle, 'labelHeight', prefix); + var labelX = prefixedProperty(rstyle, 'labelX', prefix); + var labelY = prefixedProperty(rstyle, 'labelY', prefix); + var marginX = ele.pstyle(prefixDash + 'text-margin-x').pfValue; + var marginY = ele.pstyle(prefixDash + 'text-margin-y').pfValue; + var isEdge = ele.isEdge(); + var rotation = ele.pstyle(prefixDash + 'text-rotation'); + var outlineWidth = ele.pstyle('text-outline-width').pfValue; + var borderWidth = ele.pstyle('text-border-width').pfValue; + var halfBorderWidth = borderWidth / 2; + var padding = ele.pstyle('text-background-padding').pfValue; + var marginOfError = 2; // expand to work around browser dimension inaccuracies + + var lh = labelHeight; + var lw = labelWidth; + var lw_2 = lw / 2; + var lh_2 = lh / 2; + var lx1, lx2, ly1, ly2; + + if (isEdge) { + lx1 = labelX - lw_2; + lx2 = labelX + lw_2; + ly1 = labelY - lh_2; + ly2 = labelY + lh_2; + } else { + switch (halign.value) { + case 'left': + lx1 = labelX - lw; + lx2 = labelX; + break; + + case 'center': + lx1 = labelX - lw_2; + lx2 = labelX + lw_2; + break; + + case 'right': + lx1 = labelX; + lx2 = labelX + lw; + break; + } + + switch (valign.value) { + case 'top': + ly1 = labelY - lh; + ly2 = labelY; + break; + + case 'center': + ly1 = labelY - lh_2; + ly2 = labelY + lh_2; + break; + + case 'bottom': + ly1 = labelY; + ly2 = labelY + lh; + break; + } + } // shift by margin and expand by outline and border + + + lx1 += marginX - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError; + lx2 += marginX + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError; + ly1 += marginY - Math.max(outlineWidth, halfBorderWidth) - padding - marginOfError; + ly2 += marginY + Math.max(outlineWidth, halfBorderWidth) + padding + marginOfError; // always store the unrotated label bounds separately + + var bbPrefix = prefix || 'main'; + var bbs = _p.labelBounds; + var bb = bbs[bbPrefix] = bbs[bbPrefix] || {}; + bb.x1 = lx1; + bb.y1 = ly1; + bb.x2 = lx2; + bb.y2 = ly2; + bb.w = lx2 - lx1; + bb.h = ly2 - ly1; + var isAutorotate = isEdge && rotation.strValue === 'autorotate'; + var isPfValue = rotation.pfValue != null && rotation.pfValue !== 0; + + if (isAutorotate || isPfValue) { + var theta = isAutorotate ? prefixedProperty(_p.rstyle, 'labelAngle', prefix) : rotation.pfValue; + var cos = Math.cos(theta); + var sin = Math.sin(theta); // rotation point (default value for center-center) + + var xo = (lx1 + lx2) / 2; + var yo = (ly1 + ly2) / 2; + + if (!isEdge) { + switch (halign.value) { + case 'left': + xo = lx2; + break; + + case 'right': + xo = lx1; + break; + } + + switch (valign.value) { + case 'top': + yo = ly2; + break; + + case 'bottom': + yo = ly1; + break; + } + } + + var rotate = function rotate(x, y) { + x = x - xo; + y = y - yo; + return { + x: x * cos - y * sin + xo, + y: x * sin + y * cos + yo + }; + }; + + var px1y1 = rotate(lx1, ly1); + var px1y2 = rotate(lx1, ly2); + var px2y1 = rotate(lx2, ly1); + var px2y2 = rotate(lx2, ly2); + lx1 = Math.min(px1y1.x, px1y2.x, px2y1.x, px2y2.x); + lx2 = Math.max(px1y1.x, px1y2.x, px2y1.x, px2y2.x); + ly1 = Math.min(px1y1.y, px1y2.y, px2y1.y, px2y2.y); + ly2 = Math.max(px1y1.y, px1y2.y, px2y1.y, px2y2.y); + } + + var bbPrefixRot = bbPrefix + 'Rot'; + var bbRot = bbs[bbPrefixRot] = bbs[bbPrefixRot] || {}; + bbRot.x1 = lx1; + bbRot.y1 = ly1; + bbRot.x2 = lx2; + bbRot.y2 = ly2; + bbRot.w = lx2 - lx1; + bbRot.h = ly2 - ly1; + updateBounds(bounds, lx1, ly1, lx2, ly2); + updateBounds(_p.labelBounds.all, lx1, ly1, lx2, ly2); + } + + return bounds; + }; // get the bounding box of the elements (in raw model position) + + + var boundingBoxImpl = function boundingBoxImpl(ele, options) { + var cy = ele._private.cy; + var styleEnabled = cy.styleEnabled(); + var headless = cy.headless(); + var bounds = makeBoundingBox(); + var _p = ele._private; + var isNode = ele.isNode(); + var isEdge = ele.isEdge(); + var ex1, ex2, ey1, ey2; // extrema of body / lines + + var x, y; // node pos + + var rstyle = _p.rstyle; + var manualExpansion = isNode && styleEnabled ? ele.pstyle('bounds-expansion').pfValue : [0]; // must use `display` prop only, as reading `compound.width()` causes recursion + // (other factors like width values will be considered later in this function anyway) + + var isDisplayed = function isDisplayed(ele) { + return ele.pstyle('display').value !== 'none'; + }; + + var displayed = !styleEnabled || isDisplayed(ele) // must take into account connected nodes b/c of implicit edge hiding on display:none node + && (!isEdge || isDisplayed(ele.source()) && isDisplayed(ele.target())); + + if (displayed) { + // displayed suffices, since we will find zero area eles anyway + var overlayOpacity = 0; + var overlayPadding = 0; + + if (styleEnabled && options.includeOverlays) { + overlayOpacity = ele.pstyle('overlay-opacity').value; + + if (overlayOpacity !== 0) { + overlayPadding = ele.pstyle('overlay-padding').value; + } + } + + var underlayOpacity = 0; + var underlayPadding = 0; + + if (styleEnabled && options.includeUnderlays) { + underlayOpacity = ele.pstyle('underlay-opacity').value; + + if (underlayOpacity !== 0) { + underlayPadding = ele.pstyle('underlay-padding').value; + } + } + + var padding = Math.max(overlayPadding, underlayPadding); + var w = 0; + var wHalf = 0; + + if (styleEnabled) { + w = ele.pstyle('width').pfValue; + wHalf = w / 2; + } + + if (isNode && options.includeNodes) { + var pos = ele.position(); + x = pos.x; + y = pos.y; + + var _w = ele.outerWidth(); + + var halfW = _w / 2; + var h = ele.outerHeight(); + var halfH = h / 2; // handle node dimensions + ///////////////////////// + + ex1 = x - halfW; + ex2 = x + halfW; + ey1 = y - halfH; + ey2 = y + halfH; + updateBounds(bounds, ex1, ey1, ex2, ey2); + } else if (isEdge && options.includeEdges) { + if (styleEnabled && !headless) { + var curveStyle = ele.pstyle('curve-style').strValue; // handle edge dimensions (rough box estimate) + ////////////////////////////////////////////// + + ex1 = Math.min(rstyle.srcX, rstyle.midX, rstyle.tgtX); + ex2 = Math.max(rstyle.srcX, rstyle.midX, rstyle.tgtX); + ey1 = Math.min(rstyle.srcY, rstyle.midY, rstyle.tgtY); + ey2 = Math.max(rstyle.srcY, rstyle.midY, rstyle.tgtY); // take into account edge width + + ex1 -= wHalf; + ex2 += wHalf; + ey1 -= wHalf; + ey2 += wHalf; + updateBounds(bounds, ex1, ey1, ex2, ey2); // precise edges + //////////////// + + if (curveStyle === 'haystack') { + var hpts = rstyle.haystackPts; + + if (hpts && hpts.length === 2) { + ex1 = hpts[0].x; + ey1 = hpts[0].y; + ex2 = hpts[1].x; + ey2 = hpts[1].y; + + if (ex1 > ex2) { + var temp = ex1; + ex1 = ex2; + ex2 = temp; + } + + if (ey1 > ey2) { + var _temp = ey1; + ey1 = ey2; + ey2 = _temp; + } + + updateBounds(bounds, ex1 - wHalf, ey1 - wHalf, ex2 + wHalf, ey2 + wHalf); + } + } else if (curveStyle === 'bezier' || curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'taxi') { + var pts; + + switch (curveStyle) { + case 'bezier': + case 'unbundled-bezier': + pts = rstyle.bezierPts; + break; + + case 'segments': + case 'taxi': + pts = rstyle.linePts; + break; + } + + if (pts != null) { + for (var j = 0; j < pts.length; j++) { + var pt = pts[j]; + ex1 = pt.x - wHalf; + ex2 = pt.x + wHalf; + ey1 = pt.y - wHalf; + ey2 = pt.y + wHalf; + updateBounds(bounds, ex1, ey1, ex2, ey2); + } + } + } // bezier-like or segment-like edge + + } else { + // headless or style disabled + // fallback on source and target positions + ////////////////////////////////////////// + var n1 = ele.source(); + var n1pos = n1.position(); + var n2 = ele.target(); + var n2pos = n2.position(); + ex1 = n1pos.x; + ex2 = n2pos.x; + ey1 = n1pos.y; + ey2 = n2pos.y; + + if (ex1 > ex2) { + var _temp2 = ex1; + ex1 = ex2; + ex2 = _temp2; + } + + if (ey1 > ey2) { + var _temp3 = ey1; + ey1 = ey2; + ey2 = _temp3; + } // take into account edge width + + + ex1 -= wHalf; + ex2 += wHalf; + ey1 -= wHalf; + ey2 += wHalf; + updateBounds(bounds, ex1, ey1, ex2, ey2); + } // headless or style disabled + + } // edges + // handle edge arrow size + ///////////////////////// + + + if (styleEnabled && options.includeEdges && isEdge) { + updateBoundsFromArrow(bounds, ele, 'mid-source'); + updateBoundsFromArrow(bounds, ele, 'mid-target'); + updateBoundsFromArrow(bounds, ele, 'source'); + updateBoundsFromArrow(bounds, ele, 'target'); + } // ghost + //////// + + + if (styleEnabled) { + var ghost = ele.pstyle('ghost').value === 'yes'; + + if (ghost) { + var gx = ele.pstyle('ghost-offset-x').pfValue; + var gy = ele.pstyle('ghost-offset-y').pfValue; + updateBounds(bounds, bounds.x1 + gx, bounds.y1 + gy, bounds.x2 + gx, bounds.y2 + gy); + } + } // always store the body bounds separately from the labels + + + var bbBody = _p.bodyBounds = _p.bodyBounds || {}; + assignBoundingBox(bbBody, bounds); + expandBoundingBoxSides(bbBody, manualExpansion); + expandBoundingBox(bbBody, 1); // expand to work around browser dimension inaccuracies + // overlay + ////////// + + if (styleEnabled) { + ex1 = bounds.x1; + ex2 = bounds.x2; + ey1 = bounds.y1; + ey2 = bounds.y2; + updateBounds(bounds, ex1 - padding, ey1 - padding, ex2 + padding, ey2 + padding); + } // always store the body bounds separately from the labels + + + var bbOverlay = _p.overlayBounds = _p.overlayBounds || {}; + assignBoundingBox(bbOverlay, bounds); + expandBoundingBoxSides(bbOverlay, manualExpansion); + expandBoundingBox(bbOverlay, 1); // expand to work around browser dimension inaccuracies + // handle label dimensions + ////////////////////////// + + var bbLabels = _p.labelBounds = _p.labelBounds || {}; + + if (bbLabels.all != null) { + clearBoundingBox(bbLabels.all); + } else { + bbLabels.all = makeBoundingBox(); + } + + if (styleEnabled && options.includeLabels) { + if (options.includeMainLabels) { + updateBoundsFromLabel(bounds, ele, null); + } + + if (isEdge) { + if (options.includeSourceLabels) { + updateBoundsFromLabel(bounds, ele, 'source'); + } + + if (options.includeTargetLabels) { + updateBoundsFromLabel(bounds, ele, 'target'); + } + } + } // style enabled for labels + + } // if displayed + + + bounds.x1 = noninf(bounds.x1); + bounds.y1 = noninf(bounds.y1); + bounds.x2 = noninf(bounds.x2); + bounds.y2 = noninf(bounds.y2); + bounds.w = noninf(bounds.x2 - bounds.x1); + bounds.h = noninf(bounds.y2 - bounds.y1); + + if (bounds.w > 0 && bounds.h > 0 && displayed) { + expandBoundingBoxSides(bounds, manualExpansion); // expand bounds by 1 because antialiasing can increase the visual/effective size by 1 on all sides + + expandBoundingBox(bounds, 1); + } + + return bounds; + }; + + var getKey = function getKey(opts) { + var i = 0; + + var tf = function tf(val) { + return (val ? 1 : 0) << i++; + }; + + var key = 0; + key += tf(opts.incudeNodes); + key += tf(opts.includeEdges); + key += tf(opts.includeLabels); + key += tf(opts.includeMainLabels); + key += tf(opts.includeSourceLabels); + key += tf(opts.includeTargetLabels); + key += tf(opts.includeOverlays); + return key; + }; + + var getBoundingBoxPosKey = function getBoundingBoxPosKey(ele) { + if (ele.isEdge()) { + var p1 = ele.source().position(); + var p2 = ele.target().position(); + + var r = function r(x) { + return Math.round(x); + }; + + return hashIntsArray([r(p1.x), r(p1.y), r(p2.x), r(p2.y)]); + } else { + return 0; + } + }; + + var cachedBoundingBoxImpl = function cachedBoundingBoxImpl(ele, opts) { + var _p = ele._private; + var bb; + var isEdge = ele.isEdge(); + var key = opts == null ? defBbOptsKey : getKey(opts); + var usingDefOpts = key === defBbOptsKey; + var currPosKey = getBoundingBoxPosKey(ele); + var isPosKeySame = _p.bbCachePosKey === currPosKey; + var useCache = opts.useCache && isPosKeySame; + + var isDirty = function isDirty(ele) { + return ele._private.bbCache == null || ele._private.styleDirty; + }; + + var needRecalc = !useCache || isDirty(ele) || isEdge && isDirty(ele.source()) || isDirty(ele.target()); + + if (needRecalc) { + if (!isPosKeySame) { + ele.recalculateRenderedStyle(useCache); + } + + bb = boundingBoxImpl(ele, defBbOpts); + _p.bbCache = bb; + _p.bbCachePosKey = currPosKey; + } else { + bb = _p.bbCache; + } // not using def opts => need to build up bb from combination of sub bbs + + + if (!usingDefOpts) { + var isNode = ele.isNode(); + bb = makeBoundingBox(); + + if (opts.includeNodes && isNode || opts.includeEdges && !isNode) { + if (opts.includeOverlays) { + updateBoundsFromBox(bb, _p.overlayBounds); + } else { + updateBoundsFromBox(bb, _p.bodyBounds); + } + } + + if (opts.includeLabels) { + if (opts.includeMainLabels && (!isEdge || opts.includeSourceLabels && opts.includeTargetLabels)) { + updateBoundsFromBox(bb, _p.labelBounds.all); + } else { + if (opts.includeMainLabels) { + updateBoundsFromBox(bb, _p.labelBounds.mainRot); + } + + if (opts.includeSourceLabels) { + updateBoundsFromBox(bb, _p.labelBounds.sourceRot); + } + + if (opts.includeTargetLabels) { + updateBoundsFromBox(bb, _p.labelBounds.targetRot); + } + } + } + + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + } + + return bb; + }; + + var defBbOpts = { + includeNodes: true, + includeEdges: true, + includeLabels: true, + includeMainLabels: true, + includeSourceLabels: true, + includeTargetLabels: true, + includeOverlays: true, + includeUnderlays: true, + useCache: true + }; + var defBbOptsKey = getKey(defBbOpts); + var filledBbOpts = defaults$g(defBbOpts); + + elesfn$b.boundingBox = function (options) { + var bounds; // the main usecase is ele.boundingBox() for a single element with no/def options + // specified s.t. the cache is used, so check for this case to make it faster by + // avoiding the overhead of the rest of the function + + if (this.length === 1 && this[0]._private.bbCache != null && !this[0]._private.styleDirty && (options === undefined || options.useCache === undefined || options.useCache === true)) { + if (options === undefined) { + options = defBbOpts; + } else { + options = filledBbOpts(options); + } + + bounds = cachedBoundingBoxImpl(this[0], options); + } else { + bounds = makeBoundingBox(); + options = options || defBbOpts; + var opts = filledBbOpts(options); + var eles = this; + var cy = eles.cy(); + var styleEnabled = cy.styleEnabled(); + + if (styleEnabled) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _p = ele._private; + var currPosKey = getBoundingBoxPosKey(ele); + var isPosKeySame = _p.bbCachePosKey === currPosKey; + var useCache = opts.useCache && isPosKeySame && !_p.styleDirty; + ele.recalculateRenderedStyle(useCache); + } + } + + this.updateCompoundBounds(!options.useCache); + + for (var _i = 0; _i < eles.length; _i++) { + var _ele = eles[_i]; + updateBoundsFromBox(bounds, cachedBoundingBoxImpl(_ele, opts)); + } + } + + bounds.x1 = noninf(bounds.x1); + bounds.y1 = noninf(bounds.y1); + bounds.x2 = noninf(bounds.x2); + bounds.y2 = noninf(bounds.y2); + bounds.w = noninf(bounds.x2 - bounds.x1); + bounds.h = noninf(bounds.y2 - bounds.y1); + return bounds; + }; + + elesfn$b.dirtyBoundingBoxCache = function () { + for (var i = 0; i < this.length; i++) { + var _p = this[i]._private; + _p.bbCache = null; + _p.bbCachePosKey = null; + _p.bodyBounds = null; + _p.overlayBounds = null; + _p.labelBounds.all = null; + _p.labelBounds.source = null; + _p.labelBounds.target = null; + _p.labelBounds.main = null; + _p.labelBounds.sourceRot = null; + _p.labelBounds.targetRot = null; + _p.labelBounds.mainRot = null; + _p.arrowBounds.source = null; + _p.arrowBounds.target = null; + _p.arrowBounds['mid-source'] = null; + _p.arrowBounds['mid-target'] = null; + } + + this.emitAndNotify('bounds'); + return this; + }; // private helper to get bounding box for custom node positions + // - good for perf in certain cases but currently requires dirtying the rendered style + // - would be better to not modify the nodes but the nodes are read directly everywhere in the renderer... + // - try to use for only things like discrete layouts where the node position would change anyway + + + elesfn$b.boundingBoxAt = function (fn) { + var nodes = this.nodes(); + var cy = this.cy(); + var hasCompoundNodes = cy.hasCompoundNodes(); + var parents = cy.collection(); + + if (hasCompoundNodes) { + parents = nodes.filter(function (node) { + return node.isParent(); + }); + nodes = nodes.not(parents); + } + + if (plainObject(fn)) { + var obj = fn; + + fn = function fn() { + return obj; + }; + } + + var storeOldPos = function storeOldPos(node, i) { + return node._private.bbAtOldPos = fn(node, i); + }; + + var getOldPos = function getOldPos(node) { + return node._private.bbAtOldPos; + }; + + cy.startBatch(); + nodes.forEach(storeOldPos).silentPositions(fn); + + if (hasCompoundNodes) { + parents.dirtyCompoundBoundsCache(); + parents.dirtyBoundingBoxCache(); + parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle + } + + var bb = copyBoundingBox(this.boundingBox({ + useCache: false + })); + nodes.silentPositions(getOldPos); + + if (hasCompoundNodes) { + parents.dirtyCompoundBoundsCache(); + parents.dirtyBoundingBoxCache(); + parents.updateCompoundBounds(true); // force update b/c we're inside a batch cycle + } + + cy.endBatch(); + return bb; + }; + + fn$3.boundingbox = fn$3.bb = fn$3.boundingBox; + fn$3.renderedBoundingbox = fn$3.renderedBoundingBox; + var bounds = elesfn$b; + + var fn$2, elesfn$a; + fn$2 = elesfn$a = {}; + + var defineDimFns = function defineDimFns(opts) { + opts.uppercaseName = capitalize(opts.name); + opts.autoName = 'auto' + opts.uppercaseName; + opts.labelName = 'label' + opts.uppercaseName; + opts.outerName = 'outer' + opts.uppercaseName; + opts.uppercaseOuterName = capitalize(opts.outerName); + + fn$2[opts.name] = function dimImpl() { + var ele = this[0]; + var _p = ele._private; + var cy = _p.cy; + var styleEnabled = cy._private.styleEnabled; + + if (ele) { + if (styleEnabled) { + if (ele.isParent()) { + ele.updateCompoundBounds(); + return _p[opts.autoName] || 0; + } + + var d = ele.pstyle(opts.name); + + switch (d.strValue) { + case 'label': + ele.recalculateRenderedStyle(); + return _p.rstyle[opts.labelName] || 0; + + default: + return d.pfValue; + } + } else { + return 1; + } + } + }; + + fn$2['outer' + opts.uppercaseName] = function outerDimImpl() { + var ele = this[0]; + var _p = ele._private; + var cy = _p.cy; + var styleEnabled = cy._private.styleEnabled; + + if (ele) { + if (styleEnabled) { + var dim = ele[opts.name](); + var border = ele.pstyle('border-width').pfValue; // n.b. 1/2 each side + + var padding = 2 * ele.padding(); + return dim + border + padding; + } else { + return 1; + } + } + }; + + fn$2['rendered' + opts.uppercaseName] = function renderedDimImpl() { + var ele = this[0]; + + if (ele) { + var d = ele[opts.name](); + return d * this.cy().zoom(); + } + }; + + fn$2['rendered' + opts.uppercaseOuterName] = function renderedOuterDimImpl() { + var ele = this[0]; + + if (ele) { + var od = ele[opts.outerName](); + return od * this.cy().zoom(); + } + }; + }; + + defineDimFns({ + name: 'width' + }); + defineDimFns({ + name: 'height' + }); + + elesfn$a.padding = function () { + var ele = this[0]; + var _p = ele._private; + + if (ele.isParent()) { + ele.updateCompoundBounds(); + + if (_p.autoPadding !== undefined) { + return _p.autoPadding; + } else { + return ele.pstyle('padding').pfValue; + } + } else { + return ele.pstyle('padding').pfValue; + } + }; + + elesfn$a.paddedHeight = function () { + var ele = this[0]; + return ele.height() + 2 * ele.padding(); + }; + + elesfn$a.paddedWidth = function () { + var ele = this[0]; + return ele.width() + 2 * ele.padding(); + }; + + var widthHeight = elesfn$a; + + var ifEdge = function ifEdge(ele, getValue) { + if (ele.isEdge()) { + return getValue(ele); + } + }; + + var ifEdgeRenderedPosition = function ifEdgeRenderedPosition(ele, getPoint) { + if (ele.isEdge()) { + var cy = ele.cy(); + return modelToRenderedPosition(getPoint(ele), cy.zoom(), cy.pan()); + } + }; + + var ifEdgeRenderedPositions = function ifEdgeRenderedPositions(ele, getPoints) { + if (ele.isEdge()) { + var cy = ele.cy(); + var pan = cy.pan(); + var zoom = cy.zoom(); + return getPoints(ele).map(function (p) { + return modelToRenderedPosition(p, zoom, pan); + }); + } + }; + + var controlPoints = function controlPoints(ele) { + return ele.renderer().getControlPoints(ele); + }; + + var segmentPoints = function segmentPoints(ele) { + return ele.renderer().getSegmentPoints(ele); + }; + + var sourceEndpoint = function sourceEndpoint(ele) { + return ele.renderer().getSourceEndpoint(ele); + }; + + var targetEndpoint = function targetEndpoint(ele) { + return ele.renderer().getTargetEndpoint(ele); + }; + + var midpoint = function midpoint(ele) { + return ele.renderer().getEdgeMidpoint(ele); + }; + + var pts = { + controlPoints: { + get: controlPoints, + mult: true + }, + segmentPoints: { + get: segmentPoints, + mult: true + }, + sourceEndpoint: { + get: sourceEndpoint + }, + targetEndpoint: { + get: targetEndpoint + }, + midpoint: { + get: midpoint + } + }; + + var renderedName = function renderedName(name) { + return 'rendered' + name[0].toUpperCase() + name.substr(1); + }; + + var edgePoints = Object.keys(pts).reduce(function (obj, name) { + var spec = pts[name]; + var rName = renderedName(name); + + obj[name] = function () { + return ifEdge(this, spec.get); + }; + + if (spec.mult) { + obj[rName] = function () { + return ifEdgeRenderedPositions(this, spec.get); + }; + } else { + obj[rName] = function () { + return ifEdgeRenderedPosition(this, spec.get); + }; + } + + return obj; + }, {}); + + var dimensions = extend({}, position, bounds, widthHeight, edgePoints); + + /*! + Event object based on jQuery events, MIT license + + https://jquery.org/license/ + https://tldrlegal.com/license/mit-license + https://github.com/jquery/jquery/blob/master/src/event.js + */ + var Event = function Event(src, props) { + this.recycle(src, props); + }; + + function returnFalse() { + return false; + } + + function returnTrue() { + return true; + } // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html + + + Event.prototype = { + instanceString: function instanceString() { + return 'event'; + }, + recycle: function recycle(src, props) { + this.isImmediatePropagationStopped = this.isPropagationStopped = this.isDefaultPrevented = returnFalse; + + if (src != null && src.preventDefault) { + // Browser Event object + this.type = src.type; // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + + this.isDefaultPrevented = src.defaultPrevented ? returnTrue : returnFalse; + } else if (src != null && src.type) { + // Plain object containing all event details + props = src; + } else { + // Event string + this.type = src; + } // Put explicitly provided properties onto the event object + + + if (props != null) { + // more efficient to manually copy fields we use + this.originalEvent = props.originalEvent; + this.type = props.type != null ? props.type : this.type; + this.cy = props.cy; + this.target = props.target; + this.position = props.position; + this.renderedPosition = props.renderedPosition; + this.namespace = props.namespace; + this.layout = props.layout; + } + + if (this.cy != null && this.position != null && this.renderedPosition == null) { + // create a rendered position based on the passed position + var pos = this.position; + var zoom = this.cy.zoom(); + var pan = this.cy.pan(); + this.renderedPosition = { + x: pos.x * zoom + pan.x, + y: pos.y * zoom + pan.y + }; + } // Create a timestamp if incoming event doesn't have one + + + this.timeStamp = src && src.timeStamp || Date.now(); + }, + preventDefault: function preventDefault() { + this.isDefaultPrevented = returnTrue; + var e = this.originalEvent; + + if (!e) { + return; + } // if preventDefault exists run it on the original event + + + if (e.preventDefault) { + e.preventDefault(); + } + }, + stopPropagation: function stopPropagation() { + this.isPropagationStopped = returnTrue; + var e = this.originalEvent; + + if (!e) { + return; + } // if stopPropagation exists run it on the original event + + + if (e.stopPropagation) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function stopImmediatePropagation() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse + }; + + var eventRegex = /^([^.]+)(\.(?:[^.]+))?$/; // regex for matching event strings (e.g. "click.namespace") + + var universalNamespace = '.*'; // matches as if no namespace specified and prevents users from unbinding accidentally + + var defaults$8 = { + qualifierCompare: function qualifierCompare(q1, q2) { + return q1 === q2; + }, + eventMatches: function + /*context, listener, eventObj*/ + eventMatches() { + return true; + }, + addEventFields: function + /*context, evt*/ + addEventFields() {}, + callbackContext: function callbackContext(context + /*, listener, eventObj*/ + ) { + return context; + }, + beforeEmit: function + /* context, listener, eventObj */ + beforeEmit() {}, + afterEmit: function + /* context, listener, eventObj */ + afterEmit() {}, + bubble: function + /*context*/ + bubble() { + return false; + }, + parent: function + /*context*/ + parent() { + return null; + }, + context: null + }; + var defaultsKeys = Object.keys(defaults$8); + var emptyOpts = {}; + + function Emitter() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : emptyOpts; + var context = arguments.length > 1 ? arguments[1] : undefined; + + // micro-optimisation vs Object.assign() -- reduces Element instantiation time + for (var i = 0; i < defaultsKeys.length; i++) { + var key = defaultsKeys[i]; + this[key] = opts[key] || defaults$8[key]; + } + + this.context = context || this.context; + this.listeners = []; + this.emitting = 0; + } + + var p = Emitter.prototype; + + var forEachEvent = function forEachEvent(self, handler, events, qualifier, callback, conf, confOverrides) { + if (fn$6(qualifier)) { + callback = qualifier; + qualifier = null; + } + + if (confOverrides) { + if (conf == null) { + conf = confOverrides; + } else { + conf = extend({}, conf, confOverrides); + } + } + + var eventList = array(events) ? events : events.split(/\s+/); + + for (var i = 0; i < eventList.length; i++) { + var evt = eventList[i]; + + if (emptyString(evt)) { + continue; + } + + var match = evt.match(eventRegex); // type[.namespace] + + if (match) { + var type = match[1]; + var namespace = match[2] ? match[2] : null; + var ret = handler(self, evt, type, namespace, qualifier, callback, conf); + + if (ret === false) { + break; + } // allow exiting early + + } + } + }; + + var makeEventObj = function makeEventObj(self, obj) { + self.addEventFields(self.context, obj); + return new Event(obj.type, obj); + }; + + var forEachEventObj = function forEachEventObj(self, handler, events) { + if (event(events)) { + handler(self, events); + return; + } else if (plainObject(events)) { + handler(self, makeEventObj(self, events)); + return; + } + + var eventList = array(events) ? events : events.split(/\s+/); + + for (var i = 0; i < eventList.length; i++) { + var evt = eventList[i]; + + if (emptyString(evt)) { + continue; + } + + var match = evt.match(eventRegex); // type[.namespace] + + if (match) { + var type = match[1]; + var namespace = match[2] ? match[2] : null; + var eventObj = makeEventObj(self, { + type: type, + namespace: namespace, + target: self.context + }); + handler(self, eventObj); + } + } + }; + + p.on = p.addListener = function (events, qualifier, callback, conf, confOverrides) { + forEachEvent(this, function (self, event, type, namespace, qualifier, callback, conf) { + if (fn$6(callback)) { + self.listeners.push({ + event: event, + // full event string + callback: callback, + // callback to run + type: type, + // the event type (e.g. 'click') + namespace: namespace, + // the event namespace (e.g. ".foo") + qualifier: qualifier, + // a restriction on whether to match this emitter + conf: conf // additional configuration + + }); + } + }, events, qualifier, callback, conf, confOverrides); + return this; + }; + + p.one = function (events, qualifier, callback, conf) { + return this.on(events, qualifier, callback, conf, { + one: true + }); + }; + + p.removeListener = p.off = function (events, qualifier, callback, conf) { + var _this = this; + + if (this.emitting !== 0) { + this.listeners = copyArray$1(this.listeners); + } + + var listeners = this.listeners; + + var _loop = function _loop(i) { + var listener = listeners[i]; + forEachEvent(_this, function (self, event, type, namespace, qualifier, callback + /*, conf*/ + ) { + if ((listener.type === type || events === '*') && (!namespace && listener.namespace !== '.*' || listener.namespace === namespace) && (!qualifier || self.qualifierCompare(listener.qualifier, qualifier)) && (!callback || listener.callback === callback)) { + listeners.splice(i, 1); + return false; + } + }, events, qualifier, callback, conf); + }; + + for (var i = listeners.length - 1; i >= 0; i--) { + _loop(i); + } + + return this; + }; + + p.removeAllListeners = function () { + return this.removeListener('*'); + }; + + p.emit = p.trigger = function (events, extraParams, manualCallback) { + var listeners = this.listeners; + var numListenersBeforeEmit = listeners.length; + this.emitting++; + + if (!array(extraParams)) { + extraParams = [extraParams]; + } + + forEachEventObj(this, function (self, eventObj) { + if (manualCallback != null) { + listeners = [{ + event: eventObj.event, + type: eventObj.type, + namespace: eventObj.namespace, + callback: manualCallback + }]; + numListenersBeforeEmit = listeners.length; + } + + var _loop2 = function _loop2(i) { + var listener = listeners[i]; + + if (listener.type === eventObj.type && (!listener.namespace || listener.namespace === eventObj.namespace || listener.namespace === universalNamespace) && self.eventMatches(self.context, listener, eventObj)) { + var args = [eventObj]; + + if (extraParams != null) { + push(args, extraParams); + } + + self.beforeEmit(self.context, listener, eventObj); + + if (listener.conf && listener.conf.one) { + self.listeners = self.listeners.filter(function (l) { + return l !== listener; + }); + } + + var context = self.callbackContext(self.context, listener, eventObj); + var ret = listener.callback.apply(context, args); + self.afterEmit(self.context, listener, eventObj); + + if (ret === false) { + eventObj.stopPropagation(); + eventObj.preventDefault(); + } + } // if listener matches + + }; + + for (var i = 0; i < numListenersBeforeEmit; i++) { + _loop2(i); + } // for listener + + + if (self.bubble(self.context) && !eventObj.isPropagationStopped()) { + self.parent(self.context).emit(eventObj, extraParams); + } + }, events); + this.emitting--; + return this; + }; + + var emitterOptions$1 = { + qualifierCompare: function qualifierCompare(selector1, selector2) { + if (selector1 == null || selector2 == null) { + return selector1 == null && selector2 == null; + } else { + return selector1.sameText(selector2); + } + }, + eventMatches: function eventMatches(ele, listener, eventObj) { + var selector = listener.qualifier; + + if (selector != null) { + return ele !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target); + } + + return true; + }, + addEventFields: function addEventFields(ele, evt) { + evt.cy = ele.cy(); + evt.target = ele; + }, + callbackContext: function callbackContext(ele, listener, eventObj) { + return listener.qualifier != null ? eventObj.target : ele; + }, + beforeEmit: function beforeEmit(context, listener + /*, eventObj*/ + ) { + if (listener.conf && listener.conf.once) { + listener.conf.onceCollection.removeListener(listener.event, listener.qualifier, listener.callback); + } + }, + bubble: function bubble() { + return true; + }, + parent: function parent(ele) { + return ele.isChild() ? ele.parent() : ele.cy(); + } + }; + + var argSelector$1 = function argSelector(arg) { + if (string(arg)) { + return new Selector(arg); + } else { + return arg; + } + }; + + var elesfn$9 = { + createEmitter: function createEmitter() { + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var _p = ele._private; + + if (!_p.emitter) { + _p.emitter = new Emitter(emitterOptions$1, ele); + } + } + + return this; + }, + emitter: function emitter() { + return this._private.emitter; + }, + on: function on(events, selector, callback) { + var argSel = argSelector$1(selector); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().on(events, argSel, callback); + } + + return this; + }, + removeListener: function removeListener(events, selector, callback) { + var argSel = argSelector$1(selector); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().removeListener(events, argSel, callback); + } + + return this; + }, + removeAllListeners: function removeAllListeners() { + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().removeAllListeners(); + } + + return this; + }, + one: function one(events, selector, callback) { + var argSel = argSelector$1(selector); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().one(events, argSel, callback); + } + + return this; + }, + once: function once(events, selector, callback) { + var argSel = argSelector$1(selector); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().on(events, argSel, callback, { + once: true, + onceCollection: this + }); + } + }, + emit: function emit(events, extraParams) { + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + ele.emitter().emit(events, extraParams); + } + + return this; + }, + emitAndNotify: function emitAndNotify(event, extraParams) { + // for internal use only + if (this.length === 0) { + return; + } // empty collections don't need to notify anything + // notify renderer + + + this.cy().notify(event, this); + this.emit(event, extraParams); + return this; + } + }; + define.eventAliasesOn(elesfn$9); + + var elesfn$8 = { + nodes: function nodes(selector) { + return this.filter(function (ele) { + return ele.isNode(); + }).filter(selector); + }, + edges: function edges(selector) { + return this.filter(function (ele) { + return ele.isEdge(); + }).filter(selector); + }, + // internal helper to get nodes and edges as separate collections with single iteration over elements + byGroup: function byGroup() { + var nodes = this.spawn(); + var edges = this.spawn(); + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + + if (ele.isNode()) { + nodes.push(ele); + } else { + edges.push(ele); + } + } + + return { + nodes: nodes, + edges: edges + }; + }, + filter: function filter(_filter, thisArg) { + if (_filter === undefined) { + // check this first b/c it's the most common/performant case + return this; + } else if (string(_filter) || elementOrCollection(_filter)) { + return new Selector(_filter).filter(this); + } else if (fn$6(_filter)) { + var filterEles = this.spawn(); + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var include = thisArg ? _filter.apply(thisArg, [ele, i, eles]) : _filter(ele, i, eles); + + if (include) { + filterEles.push(ele); + } + } + + return filterEles; + } + + return this.spawn(); // if not handled by above, give 'em an empty collection + }, + not: function not(toRemove) { + if (!toRemove) { + return this; + } else { + if (string(toRemove)) { + toRemove = this.filter(toRemove); + } + + var elements = this.spawn(); + + for (var i = 0; i < this.length; i++) { + var element = this[i]; + var remove = toRemove.has(element); + + if (!remove) { + elements.push(element); + } + } + + return elements; + } + }, + absoluteComplement: function absoluteComplement() { + var cy = this.cy(); + return cy.mutableElements().not(this); + }, + intersect: function intersect(other) { + // if a selector is specified, then filter by it instead + if (string(other)) { + var selector = other; + return this.filter(selector); + } + + var elements = this.spawn(); + var col1 = this; + var col2 = other; + var col1Smaller = this.length < other.length; + var colS = col1Smaller ? col1 : col2; + var colL = col1Smaller ? col2 : col1; + + for (var i = 0; i < colS.length; i++) { + var ele = colS[i]; + + if (colL.has(ele)) { + elements.push(ele); + } + } + + return elements; + }, + xor: function xor(other) { + var cy = this._private.cy; + + if (string(other)) { + other = cy.$(other); + } + + var elements = this.spawn(); + var col1 = this; + var col2 = other; + + var add = function add(col, other) { + for (var i = 0; i < col.length; i++) { + var ele = col[i]; + var id = ele._private.data.id; + var inOther = other.hasElementWithId(id); + + if (!inOther) { + elements.push(ele); + } + } + }; + + add(col1, col2); + add(col2, col1); + return elements; + }, + diff: function diff(other) { + var cy = this._private.cy; + + if (string(other)) { + other = cy.$(other); + } + + var left = this.spawn(); + var right = this.spawn(); + var both = this.spawn(); + var col1 = this; + var col2 = other; + + var add = function add(col, other, retEles) { + for (var i = 0; i < col.length; i++) { + var ele = col[i]; + var id = ele._private.data.id; + var inOther = other.hasElementWithId(id); + + if (inOther) { + both.merge(ele); + } else { + retEles.push(ele); + } + } + }; + + add(col1, col2, left); + add(col2, col1, right); + return { + left: left, + right: right, + both: both + }; + }, + add: function add(toAdd) { + var cy = this._private.cy; + + if (!toAdd) { + return this; + } + + if (string(toAdd)) { + var selector = toAdd; + toAdd = cy.mutableElements().filter(selector); + } + + var elements = this.spawnSelf(); + + for (var i = 0; i < toAdd.length; i++) { + var ele = toAdd[i]; + var add = !this.has(ele); + + if (add) { + elements.push(ele); + } + } + + return elements; + }, + // in place merge on calling collection + merge: function merge(toAdd) { + var _p = this._private; + var cy = _p.cy; + + if (!toAdd) { + return this; + } + + if (toAdd && string(toAdd)) { + var selector = toAdd; + toAdd = cy.mutableElements().filter(selector); + } + + var map = _p.map; + + for (var i = 0; i < toAdd.length; i++) { + var toAddEle = toAdd[i]; + var id = toAddEle._private.data.id; + var add = !map.has(id); + + if (add) { + var index = this.length++; + this[index] = toAddEle; + map.set(id, { + ele: toAddEle, + index: index + }); + } + } + + return this; // chaining + }, + unmergeAt: function unmergeAt(i) { + var ele = this[i]; + var id = ele.id(); + var _p = this._private; + var map = _p.map; // remove ele + + this[i] = undefined; + map["delete"](id); + var unmergedLastEle = i === this.length - 1; // replace empty spot with last ele in collection + + if (this.length > 1 && !unmergedLastEle) { + var lastEleI = this.length - 1; + var lastEle = this[lastEleI]; + var lastEleId = lastEle._private.data.id; + this[lastEleI] = undefined; + this[i] = lastEle; + map.set(lastEleId, { + ele: lastEle, + index: i + }); + } // the collection is now 1 ele smaller + + + this.length--; + return this; + }, + // remove single ele in place in calling collection + unmergeOne: function unmergeOne(ele) { + ele = ele[0]; + var _p = this._private; + var id = ele._private.data.id; + var map = _p.map; + var entry = map.get(id); + + if (!entry) { + return this; // no need to remove + } + + var i = entry.index; + this.unmergeAt(i); + return this; + }, + // remove eles in place on calling collection + unmerge: function unmerge(toRemove) { + var cy = this._private.cy; + + if (!toRemove) { + return this; + } + + if (toRemove && string(toRemove)) { + var selector = toRemove; + toRemove = cy.mutableElements().filter(selector); + } + + for (var i = 0; i < toRemove.length; i++) { + this.unmergeOne(toRemove[i]); + } + + return this; // chaining + }, + unmergeBy: function unmergeBy(toRmFn) { + for (var i = this.length - 1; i >= 0; i--) { + var ele = this[i]; + + if (toRmFn(ele)) { + this.unmergeAt(i); + } + } + + return this; + }, + map: function map(mapFn, thisArg) { + var arr = []; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var ret = thisArg ? mapFn.apply(thisArg, [ele, i, eles]) : mapFn(ele, i, eles); + arr.push(ret); + } + + return arr; + }, + reduce: function reduce(fn, initialValue) { + var val = initialValue; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + val = fn(val, eles[i], i, eles); + } + + return val; + }, + max: function max(valFn, thisArg) { + var max = -Infinity; + var maxEle; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles); + + if (val > max) { + max = val; + maxEle = ele; + } + } + + return { + value: max, + ele: maxEle + }; + }, + min: function min(valFn, thisArg) { + var min = Infinity; + var minEle; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var val = thisArg ? valFn.apply(thisArg, [ele, i, eles]) : valFn(ele, i, eles); + + if (val < min) { + min = val; + minEle = ele; + } + } + + return { + value: min, + ele: minEle + }; + } + }; // aliases + + var fn$1 = elesfn$8; + fn$1['u'] = fn$1['|'] = fn$1['+'] = fn$1.union = fn$1.or = fn$1.add; + fn$1['\\'] = fn$1['!'] = fn$1['-'] = fn$1.difference = fn$1.relativeComplement = fn$1.subtract = fn$1.not; + fn$1['n'] = fn$1['&'] = fn$1['.'] = fn$1.and = fn$1.intersection = fn$1.intersect; + fn$1['^'] = fn$1['(+)'] = fn$1['(-)'] = fn$1.symmetricDifference = fn$1.symdiff = fn$1.xor; + fn$1.fnFilter = fn$1.filterFn = fn$1.stdFilter = fn$1.filter; + fn$1.complement = fn$1.abscomp = fn$1.absoluteComplement; + + var elesfn$7 = { + isNode: function isNode() { + return this.group() === 'nodes'; + }, + isEdge: function isEdge() { + return this.group() === 'edges'; + }, + isLoop: function isLoop() { + return this.isEdge() && this.source()[0] === this.target()[0]; + }, + isSimple: function isSimple() { + return this.isEdge() && this.source()[0] !== this.target()[0]; + }, + group: function group() { + var ele = this[0]; + + if (ele) { + return ele._private.group; + } + } + }; + + /** + * Elements are drawn in a specific order based on compound depth (low to high), the element type (nodes above edges), + * and z-index (low to high). These styles affect how this applies: + * + * z-compound-depth: May be `bottom | orphan | auto | top`. The first drawn is `bottom`, then `orphan` which is the + * same depth as the root of the compound graph, followed by the default value `auto` which draws in order from + * root to leaves of the compound graph. The last drawn is `top`. + * z-index-compare: May be `auto | manual`. The default value is `auto` which always draws edges under nodes. + * `manual` ignores this convention and draws based on the `z-index` value setting. + * z-index: An integer value that affects the relative draw order of elements. In general, an element with a higher + * `z-index` will be drawn on top of an element with a lower `z-index`. + */ + + var zIndexSort = function zIndexSort(a, b) { + var cy = a.cy(); + var hasCompoundNodes = cy.hasCompoundNodes(); + + function getDepth(ele) { + var style = ele.pstyle('z-compound-depth'); + + if (style.value === 'auto') { + return hasCompoundNodes ? ele.zDepth() : 0; + } else if (style.value === 'bottom') { + return -1; + } else if (style.value === 'top') { + return MAX_INT$1; + } // 'orphan' + + + return 0; + } + + var depthDiff = getDepth(a) - getDepth(b); + + if (depthDiff !== 0) { + return depthDiff; + } + + function getEleDepth(ele) { + var style = ele.pstyle('z-index-compare'); + + if (style.value === 'auto') { + return ele.isNode() ? 1 : 0; + } // 'manual' + + + return 0; + } + + var eleDiff = getEleDepth(a) - getEleDepth(b); + + if (eleDiff !== 0) { + return eleDiff; + } + + var zDiff = a.pstyle('z-index').value - b.pstyle('z-index').value; + + if (zDiff !== 0) { + return zDiff; + } // compare indices in the core (order added to graph w/ last on top) + + + return a.poolIndex() - b.poolIndex(); + }; + + var elesfn$6 = { + forEach: function forEach(fn, thisArg) { + if (fn$6(fn)) { + var N = this.length; + + for (var i = 0; i < N; i++) { + var ele = this[i]; + var ret = thisArg ? fn.apply(thisArg, [ele, i, this]) : fn(ele, i, this); + + if (ret === false) { + break; + } // exit each early on return false + + } + } + + return this; + }, + toArray: function toArray() { + var array = []; + + for (var i = 0; i < this.length; i++) { + array.push(this[i]); + } + + return array; + }, + slice: function slice(start, end) { + var array = []; + var thisSize = this.length; + + if (end == null) { + end = thisSize; + } + + if (start == null) { + start = 0; + } + + if (start < 0) { + start = thisSize + start; + } + + if (end < 0) { + end = thisSize + end; + } + + for (var i = start; i >= 0 && i < end && i < thisSize; i++) { + array.push(this[i]); + } + + return this.spawn(array); + }, + size: function size() { + return this.length; + }, + eq: function eq(i) { + return this[i] || this.spawn(); + }, + first: function first() { + return this[0] || this.spawn(); + }, + last: function last() { + return this[this.length - 1] || this.spawn(); + }, + empty: function empty() { + return this.length === 0; + }, + nonempty: function nonempty() { + return !this.empty(); + }, + sort: function sort(sortFn) { + if (!fn$6(sortFn)) { + return this; + } + + var sorted = this.toArray().sort(sortFn); + return this.spawn(sorted); + }, + sortByZIndex: function sortByZIndex() { + return this.sort(zIndexSort); + }, + zDepth: function zDepth() { + var ele = this[0]; + + if (!ele) { + return undefined; + } // let cy = ele.cy(); + + + var _p = ele._private; + var group = _p.group; + + if (group === 'nodes') { + var depth = _p.data.parent ? ele.parents().size() : 0; + + if (!ele.isParent()) { + return MAX_INT$1 - 1; // childless nodes always on top + } + + return depth; + } else { + var src = _p.source; + var tgt = _p.target; + var srcDepth = src.zDepth(); + var tgtDepth = tgt.zDepth(); + return Math.max(srcDepth, tgtDepth, 0); // depth of deepest parent + } + } + }; + elesfn$6.each = elesfn$6.forEach; + + var defineSymbolIterator = function defineSymbolIterator() { + var typeofUndef = "undefined" ; + var isIteratorSupported = (typeof Symbol === "undefined" ? "undefined" : _typeof(Symbol)) != typeofUndef && _typeof(Symbol.iterator) != typeofUndef; // eslint-disable-line no-undef + + if (isIteratorSupported) { + elesfn$6[Symbol.iterator] = function () { + var _this = this; + + // eslint-disable-line no-undef + var entry = { + value: undefined, + done: false + }; + var i = 0; + var length = this.length; + return _defineProperty$1({ + next: function next() { + if (i < length) { + entry.value = _this[i++]; + } else { + entry.value = undefined; + entry.done = true; + } + + return entry; + } + }, Symbol.iterator, function () { + // eslint-disable-line no-undef + return this; + }); + }; + } + }; + + defineSymbolIterator(); + + var getLayoutDimensionOptions = defaults$g({ + nodeDimensionsIncludeLabels: false + }); + var elesfn$5 = { + // Calculates and returns node dimensions { x, y } based on options given + layoutDimensions: function layoutDimensions(options) { + options = getLayoutDimensionOptions(options); + var dims; + + if (!this.takesUpSpace()) { + dims = { + w: 0, + h: 0 + }; + } else if (options.nodeDimensionsIncludeLabels) { + var bbDim = this.boundingBox(); + dims = { + w: bbDim.w, + h: bbDim.h + }; + } else { + dims = { + w: this.outerWidth(), + h: this.outerHeight() + }; + } // sanitise the dimensions for external layouts (avoid division by zero) + + + if (dims.w === 0 || dims.h === 0) { + dims.w = dims.h = 1; + } + + return dims; + }, + // using standard layout options, apply position function (w/ or w/o animation) + layoutPositions: function layoutPositions(layout, options, fn) { + var nodes = this.nodes().filter(function (n) { + return !n.isParent(); + }); + var cy = this.cy(); + var layoutEles = options.eles; // nodes & edges + + var getMemoizeKey = function getMemoizeKey(node) { + return node.id(); + }; + + var fnMem = memoize$1(fn, getMemoizeKey); // memoized version of position function + + layout.emit({ + type: 'layoutstart', + layout: layout + }); + layout.animations = []; + + var calculateSpacing = function calculateSpacing(spacing, nodesBb, pos) { + var center = { + x: nodesBb.x1 + nodesBb.w / 2, + y: nodesBb.y1 + nodesBb.h / 2 + }; + var spacingVector = { + // scale from center of bounding box (not necessarily 0,0) + x: (pos.x - center.x) * spacing, + y: (pos.y - center.y) * spacing + }; + return { + x: center.x + spacingVector.x, + y: center.y + spacingVector.y + }; + }; + + var useSpacingFactor = options.spacingFactor && options.spacingFactor !== 1; + + var spacingBb = function spacingBb() { + if (!useSpacingFactor) { + return null; + } + + var bb = makeBoundingBox(); + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var pos = fnMem(node, i); + expandBoundingBoxByPoint(bb, pos.x, pos.y); + } + + return bb; + }; + + var bb = spacingBb(); + var getFinalPos = memoize$1(function (node, i) { + var newPos = fnMem(node, i); + + if (useSpacingFactor) { + var spacing = Math.abs(options.spacingFactor); + newPos = calculateSpacing(spacing, bb, newPos); + } + + if (options.transform != null) { + newPos = options.transform(node, newPos); + } + + return newPos; + }, getMemoizeKey); + + if (options.animate) { + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var newPos = getFinalPos(node, i); + var animateNode = options.animateFilter == null || options.animateFilter(node, i); + + if (animateNode) { + var ani = node.animation({ + position: newPos, + duration: options.animationDuration, + easing: options.animationEasing + }); + layout.animations.push(ani); + } else { + node.position(newPos); + } + } + + if (options.fit) { + var fitAni = cy.animation({ + fit: { + boundingBox: layoutEles.boundingBoxAt(getFinalPos), + padding: options.padding + }, + duration: options.animationDuration, + easing: options.animationEasing + }); + layout.animations.push(fitAni); + } else if (options.zoom !== undefined && options.pan !== undefined) { + var zoomPanAni = cy.animation({ + zoom: options.zoom, + pan: options.pan, + duration: options.animationDuration, + easing: options.animationEasing + }); + layout.animations.push(zoomPanAni); + } + + layout.animations.forEach(function (ani) { + return ani.play(); + }); + layout.one('layoutready', options.ready); + layout.emit({ + type: 'layoutready', + layout: layout + }); + Promise$1.all(layout.animations.map(function (ani) { + return ani.promise(); + })).then(function () { + layout.one('layoutstop', options.stop); + layout.emit({ + type: 'layoutstop', + layout: layout + }); + }); + } else { + nodes.positions(getFinalPos); + + if (options.fit) { + cy.fit(options.eles, options.padding); + } + + if (options.zoom != null) { + cy.zoom(options.zoom); + } + + if (options.pan) { + cy.pan(options.pan); + } + + layout.one('layoutready', options.ready); + layout.emit({ + type: 'layoutready', + layout: layout + }); + layout.one('layoutstop', options.stop); + layout.emit({ + type: 'layoutstop', + layout: layout + }); + } + + return this; // chaining + }, + layout: function layout(options) { + var cy = this.cy(); + return cy.makeLayout(extend({}, options, { + eles: this + })); + } + }; // aliases: + + elesfn$5.createLayout = elesfn$5.makeLayout = elesfn$5.layout; + + function styleCache(key, fn, ele) { + var _p = ele._private; + var cache = _p.styleCache = _p.styleCache || []; + var val; + + if ((val = cache[key]) != null) { + return val; + } else { + val = cache[key] = fn(ele); + return val; + } + } + + function cacheStyleFunction(key, fn) { + key = hashString(key); + return function cachedStyleFunction(ele) { + return styleCache(key, fn, ele); + }; + } + + function cachePrototypeStyleFunction(key, fn) { + key = hashString(key); + + var selfFn = function selfFn(ele) { + return fn.call(ele); + }; + + return function cachedPrototypeStyleFunction() { + var ele = this[0]; + + if (ele) { + return styleCache(key, selfFn, ele); + } + }; + } + + var elesfn$4 = { + recalculateRenderedStyle: function recalculateRenderedStyle(useCache) { + var cy = this.cy(); + var renderer = cy.renderer(); + var styleEnabled = cy.styleEnabled(); + + if (renderer && styleEnabled) { + renderer.recalculateRenderedStyle(this, useCache); + } + + return this; + }, + dirtyStyleCache: function dirtyStyleCache() { + var cy = this.cy(); + + var dirty = function dirty(ele) { + return ele._private.styleCache = null; + }; + + if (cy.hasCompoundNodes()) { + var eles; + eles = this.spawnSelf().merge(this.descendants()).merge(this.parents()); + eles.merge(eles.connectedEdges()); + eles.forEach(dirty); + } else { + this.forEach(function (ele) { + dirty(ele); + ele.connectedEdges().forEach(dirty); + }); + } + + return this; + }, + // fully updates (recalculates) the style for the elements + updateStyle: function updateStyle(notifyRenderer) { + var cy = this._private.cy; + + if (!cy.styleEnabled()) { + return this; + } + + if (cy.batching()) { + var bEles = cy._private.batchStyleEles; + bEles.merge(this); + return this; // chaining and exit early when batching + } + + var hasCompounds = cy.hasCompoundNodes(); + var updatedEles = this; + notifyRenderer = notifyRenderer || notifyRenderer === undefined ? true : false; + + if (hasCompounds) { + // then add everything up and down for compound selector checks + updatedEles = this.spawnSelf().merge(this.descendants()).merge(this.parents()); + } // let changedEles = style.apply( updatedEles ); + + + var changedEles = updatedEles; + + if (notifyRenderer) { + changedEles.emitAndNotify('style'); // let renderer know we changed style + } else { + changedEles.emit('style'); // just fire the event + } + + updatedEles.forEach(function (ele) { + return ele._private.styleDirty = true; + }); + return this; // chaining + }, + // private: clears dirty flag and recalculates style + cleanStyle: function cleanStyle() { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return; + } + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + + if (ele._private.styleDirty) { + // n.b. this flag should be set before apply() to avoid potential infinite recursion + ele._private.styleDirty = false; + cy.style().apply(ele); + } + } + }, + // get the internal parsed style object for the specified property + parsedStyle: function parsedStyle(property) { + var includeNonDefault = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var ele = this[0]; + var cy = ele.cy(); + + if (!cy.styleEnabled()) { + return; + } + + if (ele) { + this.cleanStyle(); + var overriddenStyle = ele._private.style[property]; + + if (overriddenStyle != null) { + return overriddenStyle; + } else if (includeNonDefault) { + return cy.style().getDefaultProperty(property); + } else { + return null; + } + } + }, + numericStyle: function numericStyle(property) { + var ele = this[0]; + + if (!ele.cy().styleEnabled()) { + return; + } + + if (ele) { + var pstyle = ele.pstyle(property); + return pstyle.pfValue !== undefined ? pstyle.pfValue : pstyle.value; + } + }, + numericStyleUnits: function numericStyleUnits(property) { + var ele = this[0]; + + if (!ele.cy().styleEnabled()) { + return; + } + + if (ele) { + return ele.pstyle(property).units; + } + }, + // get the specified css property as a rendered value (i.e. on-screen value) + // or get the whole rendered style if no property specified (NB doesn't allow setting) + renderedStyle: function renderedStyle(property) { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return this; + } + + var ele = this[0]; + + if (ele) { + return cy.style().getRenderedStyle(ele, property); + } + }, + // read the calculated css style of the element or override the style (via a bypass) + style: function style(name, value) { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return this; + } + + var updateTransitions = false; + var style = cy.style(); + + if (plainObject(name)) { + // then extend the bypass + var props = name; + style.applyBypass(this, props, updateTransitions); + this.emitAndNotify('style'); // let the renderer know we've updated style + } else if (string(name)) { + if (value === undefined) { + // then get the property from the style + var ele = this[0]; + + if (ele) { + return style.getStylePropertyValue(ele, name); + } else { + // empty collection => can't get any value + return; + } + } else { + // then set the bypass with the property value + style.applyBypass(this, name, value, updateTransitions); + this.emitAndNotify('style'); // let the renderer know we've updated style + } + } else if (name === undefined) { + var _ele = this[0]; + + if (_ele) { + return style.getRawStyle(_ele); + } else { + // empty collection => can't get any value + return; + } + } + + return this; // chaining + }, + removeStyle: function removeStyle(names) { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return this; + } + + var updateTransitions = false; + var style = cy.style(); + var eles = this; + + if (names === undefined) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + style.removeAllBypasses(ele, updateTransitions); + } + } else { + names = names.split(/\s+/); + + for (var _i = 0; _i < eles.length; _i++) { + var _ele2 = eles[_i]; + style.removeBypasses(_ele2, names, updateTransitions); + } + } + + this.emitAndNotify('style'); // let the renderer know we've updated style + + return this; // chaining + }, + show: function show() { + this.css('display', 'element'); + return this; // chaining + }, + hide: function hide() { + this.css('display', 'none'); + return this; // chaining + }, + effectiveOpacity: function effectiveOpacity() { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return 1; + } + + var hasCompoundNodes = cy.hasCompoundNodes(); + var ele = this[0]; + + if (ele) { + var _p = ele._private; + var parentOpacity = ele.pstyle('opacity').value; + + if (!hasCompoundNodes) { + return parentOpacity; + } + + var parents = !_p.data.parent ? null : ele.parents(); + + if (parents) { + for (var i = 0; i < parents.length; i++) { + var parent = parents[i]; + var opacity = parent.pstyle('opacity').value; + parentOpacity = opacity * parentOpacity; + } + } + + return parentOpacity; + } + }, + transparent: function transparent() { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return false; + } + + var ele = this[0]; + var hasCompoundNodes = ele.cy().hasCompoundNodes(); + + if (ele) { + if (!hasCompoundNodes) { + return ele.pstyle('opacity').value === 0; + } else { + return ele.effectiveOpacity() === 0; + } + } + }, + backgrounding: function backgrounding() { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return false; + } + + var ele = this[0]; + return ele._private.backgrounding ? true : false; + } + }; + + function checkCompound(ele, parentOk) { + var _p = ele._private; + var parents = _p.data.parent ? ele.parents() : null; + + if (parents) { + for (var i = 0; i < parents.length; i++) { + var parent = parents[i]; + + if (!parentOk(parent)) { + return false; + } + } + } + + return true; + } + + function defineDerivedStateFunction(specs) { + var ok = specs.ok; + var edgeOkViaNode = specs.edgeOkViaNode || specs.ok; + var parentOk = specs.parentOk || specs.ok; + return function () { + var cy = this.cy(); + + if (!cy.styleEnabled()) { + return true; + } + + var ele = this[0]; + var hasCompoundNodes = cy.hasCompoundNodes(); + + if (ele) { + var _p = ele._private; + + if (!ok(ele)) { + return false; + } + + if (ele.isNode()) { + return !hasCompoundNodes || checkCompound(ele, parentOk); + } else { + var src = _p.source; + var tgt = _p.target; + return edgeOkViaNode(src) && (!hasCompoundNodes || checkCompound(src, edgeOkViaNode)) && (src === tgt || edgeOkViaNode(tgt) && (!hasCompoundNodes || checkCompound(tgt, edgeOkViaNode))); + } + } + }; + } + + var eleTakesUpSpace = cacheStyleFunction('eleTakesUpSpace', function (ele) { + return ele.pstyle('display').value === 'element' && ele.width() !== 0 && (ele.isNode() ? ele.height() !== 0 : true); + }); + elesfn$4.takesUpSpace = cachePrototypeStyleFunction('takesUpSpace', defineDerivedStateFunction({ + ok: eleTakesUpSpace + })); + var eleInteractive = cacheStyleFunction('eleInteractive', function (ele) { + return ele.pstyle('events').value === 'yes' && ele.pstyle('visibility').value === 'visible' && eleTakesUpSpace(ele); + }); + var parentInteractive = cacheStyleFunction('parentInteractive', function (parent) { + return parent.pstyle('visibility').value === 'visible' && eleTakesUpSpace(parent); + }); + elesfn$4.interactive = cachePrototypeStyleFunction('interactive', defineDerivedStateFunction({ + ok: eleInteractive, + parentOk: parentInteractive, + edgeOkViaNode: eleTakesUpSpace + })); + + elesfn$4.noninteractive = function () { + var ele = this[0]; + + if (ele) { + return !ele.interactive(); + } + }; + + var eleVisible = cacheStyleFunction('eleVisible', function (ele) { + return ele.pstyle('visibility').value === 'visible' && ele.pstyle('opacity').pfValue !== 0 && eleTakesUpSpace(ele); + }); + var edgeVisibleViaNode = eleTakesUpSpace; + elesfn$4.visible = cachePrototypeStyleFunction('visible', defineDerivedStateFunction({ + ok: eleVisible, + edgeOkViaNode: edgeVisibleViaNode + })); + + elesfn$4.hidden = function () { + var ele = this[0]; + + if (ele) { + return !ele.visible(); + } + }; + + elesfn$4.isBundledBezier = cachePrototypeStyleFunction('isBundledBezier', function () { + if (!this.cy().styleEnabled()) { + return false; + } + + return !this.removed() && this.pstyle('curve-style').value === 'bezier' && this.takesUpSpace(); + }); + elesfn$4.bypass = elesfn$4.css = elesfn$4.style; + elesfn$4.renderedCss = elesfn$4.renderedStyle; + elesfn$4.removeBypass = elesfn$4.removeCss = elesfn$4.removeStyle; + elesfn$4.pstyle = elesfn$4.parsedStyle; + + var elesfn$3 = {}; + + function defineSwitchFunction(params) { + return function () { + var args = arguments; + var changedEles = []; // e.g. cy.nodes().select( data, handler ) + + if (args.length === 2) { + var data = args[0]; + var handler = args[1]; + this.on(params.event, data, handler); + } // e.g. cy.nodes().select( handler ) + else if (args.length === 1 && fn$6(args[0])) { + var _handler = args[0]; + this.on(params.event, _handler); + } // e.g. cy.nodes().select() + // e.g. (private) cy.nodes().select(['tapselect']) + else if (args.length === 0 || args.length === 1 && array(args[0])) { + var addlEvents = args.length === 1 ? args[0] : null; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var able = !params.ableField || ele._private[params.ableField]; + var changed = ele._private[params.field] != params.value; + + if (params.overrideAble) { + var overrideAble = params.overrideAble(ele); + + if (overrideAble !== undefined) { + able = overrideAble; + + if (!overrideAble) { + return this; + } // to save cycles assume not able for all on override + + } + } + + if (able) { + ele._private[params.field] = params.value; + + if (changed) { + changedEles.push(ele); + } + } + } + + var changedColl = this.spawn(changedEles); + changedColl.updateStyle(); // change of state => possible change of style + + changedColl.emit(params.event); + + if (addlEvents) { + changedColl.emit(addlEvents); + } + } + + return this; + }; + } + + function defineSwitchSet(params) { + elesfn$3[params.field] = function () { + var ele = this[0]; + + if (ele) { + if (params.overrideField) { + var val = params.overrideField(ele); + + if (val !== undefined) { + return val; + } + } + + return ele._private[params.field]; + } + }; + + elesfn$3[params.on] = defineSwitchFunction({ + event: params.on, + field: params.field, + ableField: params.ableField, + overrideAble: params.overrideAble, + value: true + }); + elesfn$3[params.off] = defineSwitchFunction({ + event: params.off, + field: params.field, + ableField: params.ableField, + overrideAble: params.overrideAble, + value: false + }); + } + + defineSwitchSet({ + field: 'locked', + overrideField: function overrideField(ele) { + return ele.cy().autolock() ? true : undefined; + }, + on: 'lock', + off: 'unlock' + }); + defineSwitchSet({ + field: 'grabbable', + overrideField: function overrideField(ele) { + return ele.cy().autoungrabify() || ele.pannable() ? false : undefined; + }, + on: 'grabify', + off: 'ungrabify' + }); + defineSwitchSet({ + field: 'selected', + ableField: 'selectable', + overrideAble: function overrideAble(ele) { + return ele.cy().autounselectify() ? false : undefined; + }, + on: 'select', + off: 'unselect' + }); + defineSwitchSet({ + field: 'selectable', + overrideField: function overrideField(ele) { + return ele.cy().autounselectify() ? false : undefined; + }, + on: 'selectify', + off: 'unselectify' + }); + elesfn$3.deselect = elesfn$3.unselect; + + elesfn$3.grabbed = function () { + var ele = this[0]; + + if (ele) { + return ele._private.grabbed; + } + }; + + defineSwitchSet({ + field: 'active', + on: 'activate', + off: 'unactivate' + }); + defineSwitchSet({ + field: 'pannable', + on: 'panify', + off: 'unpanify' + }); + + elesfn$3.inactive = function () { + var ele = this[0]; + + if (ele) { + return !ele._private.active; + } + }; + + var elesfn$2 = {}; // DAG functions + //////////////// + + var defineDagExtremity = function defineDagExtremity(params) { + return function dagExtremityImpl(selector) { + var eles = this; + var ret = []; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (!ele.isNode()) { + continue; + } + + var disqualified = false; + var edges = ele.connectedEdges(); + + for (var j = 0; j < edges.length; j++) { + var edge = edges[j]; + var src = edge.source(); + var tgt = edge.target(); + + if (params.noIncomingEdges && tgt === ele && src !== ele || params.noOutgoingEdges && src === ele && tgt !== ele) { + disqualified = true; + break; + } + } + + if (!disqualified) { + ret.push(ele); + } + } + + return this.spawn(ret, true).filter(selector); + }; + }; + + var defineDagOneHop = function defineDagOneHop(params) { + return function (selector) { + var eles = this; + var oEles = []; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (!ele.isNode()) { + continue; + } + + var edges = ele.connectedEdges(); + + for (var j = 0; j < edges.length; j++) { + var edge = edges[j]; + var src = edge.source(); + var tgt = edge.target(); + + if (params.outgoing && src === ele) { + oEles.push(edge); + oEles.push(tgt); + } else if (params.incoming && tgt === ele) { + oEles.push(edge); + oEles.push(src); + } + } + } + + return this.spawn(oEles, true).filter(selector); + }; + }; + + var defineDagAllHops = function defineDagAllHops(params) { + return function (selector) { + var eles = this; + var sEles = []; + var sElesIds = {}; + + for (;;) { + var next = params.outgoing ? eles.outgoers() : eles.incomers(); + + if (next.length === 0) { + break; + } // done if none left + + + var newNext = false; + + for (var i = 0; i < next.length; i++) { + var n = next[i]; + var nid = n.id(); + + if (!sElesIds[nid]) { + sElesIds[nid] = true; + sEles.push(n); + newNext = true; + } + } + + if (!newNext) { + break; + } // done if touched all outgoers already + + + eles = next; + } + + return this.spawn(sEles, true).filter(selector); + }; + }; + + elesfn$2.clearTraversalCache = function () { + for (var i = 0; i < this.length; i++) { + this[i]._private.traversalCache = null; + } + }; + + extend(elesfn$2, { + // get the root nodes in the DAG + roots: defineDagExtremity({ + noIncomingEdges: true + }), + // get the leaf nodes in the DAG + leaves: defineDagExtremity({ + noOutgoingEdges: true + }), + // normally called children in graph theory + // these nodes =edges=> outgoing nodes + outgoers: cache(defineDagOneHop({ + outgoing: true + }), 'outgoers'), + // aka DAG descendants + successors: defineDagAllHops({ + outgoing: true + }), + // normally called parents in graph theory + // these nodes <=edges= incoming nodes + incomers: cache(defineDagOneHop({ + incoming: true + }), 'incomers'), + // aka DAG ancestors + predecessors: defineDagAllHops({ + incoming: true + }) + }); // Neighbourhood functions + ////////////////////////// + + extend(elesfn$2, { + neighborhood: cache(function (selector) { + var elements = []; + var nodes = this.nodes(); + + for (var i = 0; i < nodes.length; i++) { + // for all nodes + var node = nodes[i]; + var connectedEdges = node.connectedEdges(); // for each connected edge, add the edge and the other node + + for (var j = 0; j < connectedEdges.length; j++) { + var edge = connectedEdges[j]; + var src = edge.source(); + var tgt = edge.target(); + var otherNode = node === src ? tgt : src; // need check in case of loop + + if (otherNode.length > 0) { + elements.push(otherNode[0]); // add node 1 hop away + } // add connected edge + + + elements.push(edge[0]); + } + } + + return this.spawn(elements, true).filter(selector); + }, 'neighborhood'), + closedNeighborhood: function closedNeighborhood(selector) { + return this.neighborhood().add(this).filter(selector); + }, + openNeighborhood: function openNeighborhood(selector) { + return this.neighborhood(selector); + } + }); // aliases + + elesfn$2.neighbourhood = elesfn$2.neighborhood; + elesfn$2.closedNeighbourhood = elesfn$2.closedNeighborhood; + elesfn$2.openNeighbourhood = elesfn$2.openNeighborhood; // Edge functions + ///////////////// + + extend(elesfn$2, { + source: cache(function sourceImpl(selector) { + var ele = this[0]; + var src; + + if (ele) { + src = ele._private.source || ele.cy().collection(); + } + + return src && selector ? src.filter(selector) : src; + }, 'source'), + target: cache(function targetImpl(selector) { + var ele = this[0]; + var tgt; + + if (ele) { + tgt = ele._private.target || ele.cy().collection(); + } + + return tgt && selector ? tgt.filter(selector) : tgt; + }, 'target'), + sources: defineSourceFunction({ + attr: 'source' + }), + targets: defineSourceFunction({ + attr: 'target' + }) + }); + + function defineSourceFunction(params) { + return function sourceImpl(selector) { + var sources = []; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var src = ele._private[params.attr]; + + if (src) { + sources.push(src); + } + } + + return this.spawn(sources, true).filter(selector); + }; + } + + extend(elesfn$2, { + edgesWith: cache(defineEdgesWithFunction(), 'edgesWith'), + edgesTo: cache(defineEdgesWithFunction({ + thisIsSrc: true + }), 'edgesTo') + }); + + function defineEdgesWithFunction(params) { + return function edgesWithImpl(otherNodes) { + var elements = []; + var cy = this._private.cy; + var p = params || {}; // get elements if a selector is specified + + if (string(otherNodes)) { + otherNodes = cy.$(otherNodes); + } + + for (var h = 0; h < otherNodes.length; h++) { + var edges = otherNodes[h]._private.edges; + + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var edgeData = edge._private.data; + var thisToOther = this.hasElementWithId(edgeData.source) && otherNodes.hasElementWithId(edgeData.target); + var otherToThis = otherNodes.hasElementWithId(edgeData.source) && this.hasElementWithId(edgeData.target); + var edgeConnectsThisAndOther = thisToOther || otherToThis; + + if (!edgeConnectsThisAndOther) { + continue; + } + + if (p.thisIsSrc || p.thisIsTgt) { + if (p.thisIsSrc && !thisToOther) { + continue; + } + + if (p.thisIsTgt && !otherToThis) { + continue; + } + } + + elements.push(edge); + } + } + + return this.spawn(elements, true); + }; + } + + extend(elesfn$2, { + connectedEdges: cache(function (selector) { + var retEles = []; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var node = eles[i]; + + if (!node.isNode()) { + continue; + } + + var edges = node._private.edges; + + for (var j = 0; j < edges.length; j++) { + var edge = edges[j]; + retEles.push(edge); + } + } + + return this.spawn(retEles, true).filter(selector); + }, 'connectedEdges'), + connectedNodes: cache(function (selector) { + var retEles = []; + var eles = this; + + for (var i = 0; i < eles.length; i++) { + var edge = eles[i]; + + if (!edge.isEdge()) { + continue; + } + + retEles.push(edge.source()[0]); + retEles.push(edge.target()[0]); + } + + return this.spawn(retEles, true).filter(selector); + }, 'connectedNodes'), + parallelEdges: cache(defineParallelEdgesFunction(), 'parallelEdges'), + codirectedEdges: cache(defineParallelEdgesFunction({ + codirected: true + }), 'codirectedEdges') + }); + + function defineParallelEdgesFunction(params) { + var defaults = { + codirected: false + }; + params = extend({}, defaults, params); + return function parallelEdgesImpl(selector) { + // micro-optimised for renderer + var elements = []; + var edges = this.edges(); + var p = params; // look at all the edges in the collection + + for (var i = 0; i < edges.length; i++) { + var edge1 = edges[i]; + var edge1_p = edge1._private; + var src1 = edge1_p.source; + var srcid1 = src1._private.data.id; + var tgtid1 = edge1_p.data.target; + var srcEdges1 = src1._private.edges; // look at edges connected to the src node of this edge + + for (var j = 0; j < srcEdges1.length; j++) { + var edge2 = srcEdges1[j]; + var edge2data = edge2._private.data; + var tgtid2 = edge2data.target; + var srcid2 = edge2data.source; + var codirected = tgtid2 === tgtid1 && srcid2 === srcid1; + var oppdirected = srcid1 === tgtid2 && tgtid1 === srcid2; + + if (p.codirected && codirected || !p.codirected && (codirected || oppdirected)) { + elements.push(edge2); + } + } + } + + return this.spawn(elements, true).filter(selector); + }; + } // Misc functions + ///////////////// + + + extend(elesfn$2, { + components: function components(root) { + var self = this; + var cy = self.cy(); + var visited = cy.collection(); + var unvisited = root == null ? self.nodes() : root.nodes(); + var components = []; + + if (root != null && unvisited.empty()) { + // root may contain only edges + unvisited = root.sources(); // doesn't matter which node to use (undirected), so just use the source sides + } + + var visitInComponent = function visitInComponent(node, component) { + visited.merge(node); + unvisited.unmerge(node); + component.merge(node); + }; + + if (unvisited.empty()) { + return self.spawn(); + } + + var _loop = function _loop() { + // each iteration yields a component + var cmpt = cy.collection(); + components.push(cmpt); + var root = unvisited[0]; + visitInComponent(root, cmpt); + self.bfs({ + directed: false, + roots: root, + visit: function visit(v) { + return visitInComponent(v, cmpt); + } + }); + cmpt.forEach(function (node) { + node.connectedEdges().forEach(function (e) { + // connectedEdges() usually cached + if (self.has(e) && cmpt.has(e.source()) && cmpt.has(e.target())) { + // has() is cheap + cmpt.merge(e); // forEach() only considers nodes -- sets N at call time + } + }); + }); + }; + + do { + _loop(); + } while (unvisited.length > 0); + + return components; + }, + component: function component() { + var ele = this[0]; + return ele.cy().mutableElements().components(ele)[0]; + } + }); + elesfn$2.componentsOf = elesfn$2.components; + + var Collection = function Collection(cy, elements) { + var unique = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var removed = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + if (cy === undefined) { + error('A collection must have a reference to the core'); + return; + } + + var map = new Map$2(); + var createdElements = false; + + if (!elements) { + elements = []; + } else if (elements.length > 0 && plainObject(elements[0]) && !element(elements[0])) { + createdElements = true; // make elements from json and restore all at once later + + var eles = []; + var elesIds = new Set$1(); + + for (var i = 0, l = elements.length; i < l; i++) { + var json = elements[i]; + + if (json.data == null) { + json.data = {}; + } + + var _data = json.data; // make sure newly created elements have valid ids + + if (_data.id == null) { + _data.id = uuid(); + } else if (cy.hasElementWithId(_data.id) || elesIds.has(_data.id)) { + continue; // can't create element if prior id already exists + } + + var ele = new Element(cy, json, false); + eles.push(ele); + elesIds.add(_data.id); + } + + elements = eles; + } + + this.length = 0; + + for (var _i = 0, _l = elements.length; _i < _l; _i++) { + var element$1 = elements[_i][0]; // [0] in case elements is an array of collections, rather than array of elements + + if (element$1 == null) { + continue; + } + + var id = element$1._private.data.id; + + if (!unique || !map.has(id)) { + if (unique) { + map.set(id, { + index: this.length, + ele: element$1 + }); + } + + this[this.length] = element$1; + this.length++; + } + } + + this._private = { + eles: this, + cy: cy, + + get map() { + if (this.lazyMap == null) { + this.rebuildMap(); + } + + return this.lazyMap; + }, + + set map(m) { + this.lazyMap = m; + }, + + rebuildMap: function rebuildMap() { + var m = this.lazyMap = new Map$2(); + var eles = this.eles; + + for (var _i2 = 0; _i2 < eles.length; _i2++) { + var _ele = eles[_i2]; + m.set(_ele.id(), { + index: _i2, + ele: _ele + }); + } + } + }; + + if (unique) { + this._private.map = map; + } // restore the elements if we created them from json + + + if (createdElements && !removed) { + this.restore(); + } + }; // Functions + //////////////////////////////////////////////////////////////////////////////////////////////////// + // keep the prototypes in sync (an element has the same functions as a collection) + // and use elefn and elesfn as shorthands to the prototypes + + + var elesfn$1 = Element.prototype = Collection.prototype = Object.create(Array.prototype); + + elesfn$1.instanceString = function () { + return 'collection'; + }; + + elesfn$1.spawn = function (eles, unique) { + return new Collection(this.cy(), eles, unique); + }; + + elesfn$1.spawnSelf = function () { + return this.spawn(this); + }; + + elesfn$1.cy = function () { + return this._private.cy; + }; + + elesfn$1.renderer = function () { + return this._private.cy.renderer(); + }; + + elesfn$1.element = function () { + return this[0]; + }; + + elesfn$1.collection = function () { + if (collection(this)) { + return this; + } else { + // an element + return new Collection(this._private.cy, [this]); + } + }; + + elesfn$1.unique = function () { + return new Collection(this._private.cy, this, true); + }; + + elesfn$1.hasElementWithId = function (id) { + id = '' + id; // id must be string + + return this._private.map.has(id); + }; + + elesfn$1.getElementById = function (id) { + id = '' + id; // id must be string + + var cy = this._private.cy; + + var entry = this._private.map.get(id); + + return entry ? entry.ele : new Collection(cy); // get ele or empty collection + }; + + elesfn$1.$id = elesfn$1.getElementById; + + elesfn$1.poolIndex = function () { + var cy = this._private.cy; + var eles = cy._private.elements; + var id = this[0]._private.data.id; + return eles._private.map.get(id).index; + }; + + elesfn$1.indexOf = function (ele) { + var id = ele[0]._private.data.id; + return this._private.map.get(id).index; + }; + + elesfn$1.indexOfId = function (id) { + id = '' + id; // id must be string + + return this._private.map.get(id).index; + }; + + elesfn$1.json = function (obj) { + var ele = this.element(); + var cy = this.cy(); + + if (ele == null && obj) { + return this; + } // can't set to no eles + + + if (ele == null) { + return undefined; + } // can't get from no eles + + + var p = ele._private; + + if (plainObject(obj)) { + // set + cy.startBatch(); + + if (obj.data) { + ele.data(obj.data); + var _data2 = p.data; + + if (ele.isEdge()) { + // source and target are immutable via data() + var move = false; + var spec = {}; + var src = obj.data.source; + var tgt = obj.data.target; + + if (src != null && src != _data2.source) { + spec.source = '' + src; // id must be string + + move = true; + } + + if (tgt != null && tgt != _data2.target) { + spec.target = '' + tgt; // id must be string + + move = true; + } + + if (move) { + ele = ele.move(spec); + } + } else { + // parent is immutable via data() + var newParentValSpecd = ('parent' in obj.data); + var parent = obj.data.parent; + + if (newParentValSpecd && (parent != null || _data2.parent != null) && parent != _data2.parent) { + if (parent === undefined) { + // can't set undefined imperatively, so use null + parent = null; + } + + if (parent != null) { + parent = '' + parent; // id must be string + } + + ele = ele.move({ + parent: parent + }); + } + } + } + + if (obj.position) { + ele.position(obj.position); + } // ignore group -- immutable + + + var checkSwitch = function checkSwitch(k, trueFnName, falseFnName) { + var obj_k = obj[k]; + + if (obj_k != null && obj_k !== p[k]) { + if (obj_k) { + ele[trueFnName](); + } else { + ele[falseFnName](); + } + } + }; + + checkSwitch('removed', 'remove', 'restore'); + checkSwitch('selected', 'select', 'unselect'); + checkSwitch('selectable', 'selectify', 'unselectify'); + checkSwitch('locked', 'lock', 'unlock'); + checkSwitch('grabbable', 'grabify', 'ungrabify'); + checkSwitch('pannable', 'panify', 'unpanify'); + + if (obj.classes != null) { + ele.classes(obj.classes); + } + + cy.endBatch(); + return this; + } else if (obj === undefined) { + // get + var json = { + data: copy(p.data), + position: copy(p.position), + group: p.group, + removed: p.removed, + selected: p.selected, + selectable: p.selectable, + locked: p.locked, + grabbable: p.grabbable, + pannable: p.pannable, + classes: null + }; + json.classes = ''; + var i = 0; + p.classes.forEach(function (cls) { + return json.classes += i++ === 0 ? cls : ' ' + cls; + }); + return json; + } + }; + + elesfn$1.jsons = function () { + var jsons = []; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var json = ele.json(); + jsons.push(json); + } + + return jsons; + }; + + elesfn$1.clone = function () { + var cy = this.cy(); + var elesArr = []; + + for (var i = 0; i < this.length; i++) { + var ele = this[i]; + var json = ele.json(); + var clone = new Element(cy, json, false); // NB no restore + + elesArr.push(clone); + } + + return new Collection(cy, elesArr); + }; + + elesfn$1.copy = elesfn$1.clone; + + elesfn$1.restore = function () { + var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var addToPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var self = this; + var cy = self.cy(); + var cy_p = cy._private; // create arrays of nodes and edges, since we need to + // restore the nodes first + + var nodes = []; + var edges = []; + var elements; + + for (var _i3 = 0, l = self.length; _i3 < l; _i3++) { + var ele = self[_i3]; + + if (addToPool && !ele.removed()) { + // don't need to handle this ele + continue; + } // keep nodes first in the array and edges after + + + if (ele.isNode()) { + // put to front of array if node + nodes.push(ele); + } else { + // put to end of array if edge + edges.push(ele); + } + } + + elements = nodes.concat(edges); + var i; + + var removeFromElements = function removeFromElements() { + elements.splice(i, 1); + i--; + }; // now, restore each element + + + for (i = 0; i < elements.length; i++) { + var _ele2 = elements[i]; + var _private = _ele2._private; + var _data3 = _private.data; // the traversal cache should start fresh when ele is added + + _ele2.clearTraversalCache(); // set id and validate + + + if (!addToPool && !_private.removed) ; else if (_data3.id === undefined) { + _data3.id = uuid(); + } else if (number$1(_data3.id)) { + _data3.id = '' + _data3.id; // now it's a string + } else if (emptyString(_data3.id) || !string(_data3.id)) { + error('Can not create element with invalid string ID `' + _data3.id + '`'); // can't create element if it has empty string as id or non-string id + + removeFromElements(); + continue; + } else if (cy.hasElementWithId(_data3.id)) { + error('Can not create second element with ID `' + _data3.id + '`'); // can't create element if one already has that id + + removeFromElements(); + continue; + } + + var id = _data3.id; // id is finalised, now let's keep a ref + + if (_ele2.isNode()) { + // extra checks for nodes + var pos = _private.position; // make sure the nodes have a defined position + + if (pos.x == null) { + pos.x = 0; + } + + if (pos.y == null) { + pos.y = 0; + } + } + + if (_ele2.isEdge()) { + // extra checks for edges + var edge = _ele2; + var fields = ['source', 'target']; + var fieldsLength = fields.length; + var badSourceOrTarget = false; + + for (var j = 0; j < fieldsLength; j++) { + var field = fields[j]; + var val = _data3[field]; + + if (number$1(val)) { + val = _data3[field] = '' + _data3[field]; // now string + } + + if (val == null || val === '') { + // can't create if source or target is not defined properly + error('Can not create edge `' + id + '` with unspecified ' + field); + badSourceOrTarget = true; + } else if (!cy.hasElementWithId(val)) { + // can't create edge if one of its nodes doesn't exist + error('Can not create edge `' + id + '` with nonexistant ' + field + ' `' + val + '`'); + badSourceOrTarget = true; + } + } + + if (badSourceOrTarget) { + removeFromElements(); + continue; + } // can't create this + + + var src = cy.getElementById(_data3.source); + var tgt = cy.getElementById(_data3.target); // only one edge in node if loop + + if (src.same(tgt)) { + src._private.edges.push(edge); + } else { + src._private.edges.push(edge); + + tgt._private.edges.push(edge); + } + + edge._private.source = src; + edge._private.target = tgt; + } // if is edge + // create mock ids / indexes maps for element so it can be used like collections + + + _private.map = new Map$2(); + + _private.map.set(id, { + ele: _ele2, + index: 0 + }); + + _private.removed = false; + + if (addToPool) { + cy.addToPool(_ele2); + } + } // for each element + // do compound node sanity checks + + + for (var _i4 = 0; _i4 < nodes.length; _i4++) { + // each node + var node = nodes[_i4]; + var _data4 = node._private.data; + + if (number$1(_data4.parent)) { + // then automake string + _data4.parent = '' + _data4.parent; + } + + var parentId = _data4.parent; + var specifiedParent = parentId != null; + + if (specifiedParent || node._private.parent) { + var parent = node._private.parent ? cy.collection().merge(node._private.parent) : cy.getElementById(parentId); + + if (parent.empty()) { + // non-existant parent; just remove it + _data4.parent = undefined; + } else if (parent[0].removed()) { + warn('Node added with missing parent, reference to parent removed'); + _data4.parent = undefined; + node._private.parent = null; + } else { + var selfAsParent = false; + var ancestor = parent; + + while (!ancestor.empty()) { + if (node.same(ancestor)) { + // mark self as parent and remove from data + selfAsParent = true; + _data4.parent = undefined; // remove parent reference + // exit or we loop forever + + break; + } + + ancestor = ancestor.parent(); + } + + if (!selfAsParent) { + // connect with children + parent[0]._private.children.push(node); + + node._private.parent = parent[0]; // let the core know we have a compound graph + + cy_p.hasCompoundNodes = true; + } + } // else + + } // if specified parent + + } // for each node + + + if (elements.length > 0) { + var restored = elements.length === self.length ? self : new Collection(cy, elements); + + for (var _i5 = 0; _i5 < restored.length; _i5++) { + var _ele3 = restored[_i5]; + + if (_ele3.isNode()) { + continue; + } // adding an edge invalidates the traversal caches for the parallel edges + + + _ele3.parallelEdges().clearTraversalCache(); // adding an edge invalidates the traversal cache for the connected nodes + + + _ele3.source().clearTraversalCache(); + + _ele3.target().clearTraversalCache(); + } + + var toUpdateStyle; + + if (cy_p.hasCompoundNodes) { + toUpdateStyle = cy.collection().merge(restored).merge(restored.connectedNodes()).merge(restored.parent()); + } else { + toUpdateStyle = restored; + } + + toUpdateStyle.dirtyCompoundBoundsCache().dirtyBoundingBoxCache().updateStyle(notifyRenderer); + + if (notifyRenderer) { + restored.emitAndNotify('add'); + } else if (addToPool) { + restored.emit('add'); + } + } + + return self; // chainability + }; + + elesfn$1.removed = function () { + var ele = this[0]; + return ele && ele._private.removed; + }; + + elesfn$1.inside = function () { + var ele = this[0]; + return ele && !ele._private.removed; + }; + + elesfn$1.remove = function () { + var notifyRenderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var removeFromPool = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var self = this; + var elesToRemove = []; + var elesToRemoveIds = {}; + var cy = self._private.cy; // add connected edges + + function addConnectedEdges(node) { + var edges = node._private.edges; + + for (var i = 0; i < edges.length; i++) { + add(edges[i]); + } + } // add descendant nodes + + + function addChildren(node) { + var children = node._private.children; + + for (var i = 0; i < children.length; i++) { + add(children[i]); + } + } + + function add(ele) { + var alreadyAdded = elesToRemoveIds[ele.id()]; + + if (removeFromPool && ele.removed() || alreadyAdded) { + return; + } else { + elesToRemoveIds[ele.id()] = true; + } + + if (ele.isNode()) { + elesToRemove.push(ele); // nodes are removed last + + addConnectedEdges(ele); + addChildren(ele); + } else { + elesToRemove.unshift(ele); // edges are removed first + } + } // make the list of elements to remove + // (may be removing more than specified due to connected edges etc) + + + for (var i = 0, l = self.length; i < l; i++) { + var ele = self[i]; + add(ele); + } + + function removeEdgeRef(node, edge) { + var connectedEdges = node._private.edges; + removeFromArray(connectedEdges, edge); // removing an edges invalidates the traversal cache for its nodes + + node.clearTraversalCache(); + } + + function removeParallelRef(pllEdge) { + // removing an edge invalidates the traversal caches for the parallel edges + pllEdge.clearTraversalCache(); + } + + var alteredParents = []; + alteredParents.ids = {}; + + function removeChildRef(parent, ele) { + ele = ele[0]; + parent = parent[0]; + var children = parent._private.children; + var pid = parent.id(); + removeFromArray(children, ele); // remove parent => child ref + + ele._private.parent = null; // remove child => parent ref + + if (!alteredParents.ids[pid]) { + alteredParents.ids[pid] = true; + alteredParents.push(parent); + } + } + + self.dirtyCompoundBoundsCache(); + + if (removeFromPool) { + cy.removeFromPool(elesToRemove); // remove from core pool + } + + for (var _i6 = 0; _i6 < elesToRemove.length; _i6++) { + var _ele4 = elesToRemove[_i6]; + + if (_ele4.isEdge()) { + // remove references to this edge in its connected nodes + var src = _ele4.source()[0]; + + var tgt = _ele4.target()[0]; + + removeEdgeRef(src, _ele4); + removeEdgeRef(tgt, _ele4); + + var pllEdges = _ele4.parallelEdges(); + + for (var j = 0; j < pllEdges.length; j++) { + var pllEdge = pllEdges[j]; + removeParallelRef(pllEdge); + + if (pllEdge.isBundledBezier()) { + pllEdge.dirtyBoundingBoxCache(); + } + } + } else { + // remove reference to parent + var parent = _ele4.parent(); + + if (parent.length !== 0) { + removeChildRef(parent, _ele4); + } + } + + if (removeFromPool) { + // mark as removed + _ele4._private.removed = true; + } + } // check to see if we have a compound graph or not + + + var elesStillInside = cy._private.elements; + cy._private.hasCompoundNodes = false; + + for (var _i7 = 0; _i7 < elesStillInside.length; _i7++) { + var _ele5 = elesStillInside[_i7]; + + if (_ele5.isParent()) { + cy._private.hasCompoundNodes = true; + break; + } + } + + var removedElements = new Collection(this.cy(), elesToRemove); + + if (removedElements.size() > 0) { + // must manually notify since trigger won't do this automatically once removed + if (notifyRenderer) { + removedElements.emitAndNotify('remove'); + } else if (removeFromPool) { + removedElements.emit('remove'); + } + } // the parents who were modified by the removal need their style updated + + + for (var _i8 = 0; _i8 < alteredParents.length; _i8++) { + var _ele6 = alteredParents[_i8]; + + if (!removeFromPool || !_ele6.removed()) { + _ele6.updateStyle(); + } + } + + return removedElements; + }; + + elesfn$1.move = function (struct) { + var cy = this._private.cy; + var eles = this; // just clean up refs, caches, etc. in the same way as when removing and then restoring + // (our calls to remove/restore do not remove from the graph or make events) + + var notifyRenderer = false; + var modifyPool = false; + + var toString = function toString(id) { + return id == null ? id : '' + id; + }; // id must be string + + + if (struct.source !== undefined || struct.target !== undefined) { + var srcId = toString(struct.source); + var tgtId = toString(struct.target); + var srcExists = srcId != null && cy.hasElementWithId(srcId); + var tgtExists = tgtId != null && cy.hasElementWithId(tgtId); + + if (srcExists || tgtExists) { + cy.batch(function () { + // avoid duplicate style updates + eles.remove(notifyRenderer, modifyPool); // clean up refs etc. + + eles.emitAndNotify('moveout'); + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _data5 = ele._private.data; + + if (ele.isEdge()) { + if (srcExists) { + _data5.source = srcId; + } + + if (tgtExists) { + _data5.target = tgtId; + } + } + } + + eles.restore(notifyRenderer, modifyPool); // make new refs, style, etc. + }); + eles.emitAndNotify('move'); + } + } else if (struct.parent !== undefined) { + // move node to new parent + var parentId = toString(struct.parent); + var parentExists = parentId === null || cy.hasElementWithId(parentId); + + if (parentExists) { + var pidToAssign = parentId === null ? undefined : parentId; + cy.batch(function () { + // avoid duplicate style updates + var updated = eles.remove(notifyRenderer, modifyPool); // clean up refs etc. + + updated.emitAndNotify('moveout'); + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _data6 = ele._private.data; + + if (ele.isNode()) { + _data6.parent = pidToAssign; + } + } + + updated.restore(notifyRenderer, modifyPool); // make new refs, style, etc. + }); + eles.emitAndNotify('move'); + } + } + + return this; + }; + + [elesfn$j, elesfn$i, elesfn$h, elesfn$g, elesfn$f, data, elesfn$d, dimensions, elesfn$9, elesfn$8, elesfn$7, elesfn$6, elesfn$5, elesfn$4, elesfn$3, elesfn$2].forEach(function (props) { + extend(elesfn$1, props); + }); + + var corefn$9 = { + add: function add(opts) { + var elements; + var cy = this; // add the elements + + if (elementOrCollection(opts)) { + var eles = opts; + + if (eles._private.cy === cy) { + // same instance => just restore + elements = eles.restore(); + } else { + // otherwise, copy from json + var jsons = []; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + jsons.push(ele.json()); + } + + elements = new Collection(cy, jsons); + } + } // specify an array of options + else if (array(opts)) { + var _jsons = opts; + elements = new Collection(cy, _jsons); + } // specify via opts.nodes and opts.edges + else if (plainObject(opts) && (array(opts.nodes) || array(opts.edges))) { + var elesByGroup = opts; + var _jsons2 = []; + var grs = ['nodes', 'edges']; + + for (var _i = 0, il = grs.length; _i < il; _i++) { + var group = grs[_i]; + var elesArray = elesByGroup[group]; + + if (array(elesArray)) { + for (var j = 0, jl = elesArray.length; j < jl; j++) { + var json = extend({ + group: group + }, elesArray[j]); + + _jsons2.push(json); + } + } + } + + elements = new Collection(cy, _jsons2); + } // specify options for one element + else { + var _json = opts; + elements = new Element(cy, _json).collection(); + } + + return elements; + }, + remove: function remove(collection) { + if (elementOrCollection(collection)) ; else if (string(collection)) { + var selector = collection; + collection = this.$(selector); + } + + return collection.remove(); + } + }; + + /* global Float32Array */ + + /*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */ + function generateCubicBezier(mX1, mY1, mX2, mY2) { + var NEWTON_ITERATIONS = 4, + NEWTON_MIN_SLOPE = 0.001, + SUBDIVISION_PRECISION = 0.0000001, + SUBDIVISION_MAX_ITERATIONS = 10, + kSplineTableSize = 11, + kSampleStepSize = 1.0 / (kSplineTableSize - 1.0), + float32ArraySupported = typeof Float32Array !== 'undefined'; + /* Must contain four arguments. */ + + if (arguments.length !== 4) { + return false; + } + /* Arguments must be numbers. */ + + + for (var i = 0; i < 4; ++i) { + if (typeof arguments[i] !== "number" || isNaN(arguments[i]) || !isFinite(arguments[i])) { + return false; + } + } + /* X values must be in the [0, 1] range. */ + + + mX1 = Math.min(mX1, 1); + mX2 = Math.min(mX2, 1); + mX1 = Math.max(mX1, 0); + mX2 = Math.max(mX2, 0); + var mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); + + function A(aA1, aA2) { + return 1.0 - 3.0 * aA2 + 3.0 * aA1; + } + + function B(aA1, aA2) { + return 3.0 * aA2 - 6.0 * aA1; + } + + function C(aA1) { + return 3.0 * aA1; + } + + function calcBezier(aT, aA1, aA2) { + return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; + } + + function getSlope(aT, aA1, aA2) { + return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); + } + + function newtonRaphsonIterate(aX, aGuessT) { + for (var _i = 0; _i < NEWTON_ITERATIONS; ++_i) { + var currentSlope = getSlope(aGuessT, mX1, mX2); + + if (currentSlope === 0.0) { + return aGuessT; + } + + var currentX = calcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + + return aGuessT; + } + + function calcSampleValues() { + for (var _i2 = 0; _i2 < kSplineTableSize; ++_i2) { + mSampleValues[_i2] = calcBezier(_i2 * kSampleStepSize, mX1, mX2); + } + } + + function binarySubdivide(aX, aA, aB) { + var currentX, + currentT, + i = 0; + + do { + currentT = aA + (aB - aA) / 2.0; + currentX = calcBezier(currentT, mX1, mX2) - aX; + + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); + + return currentT; + } + + function getTForX(aX) { + var intervalStart = 0.0, + currentSample = 1, + lastSample = kSplineTableSize - 1; + + for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) { + intervalStart += kSampleStepSize; + } + + --currentSample; + var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]), + guessForT = intervalStart + dist * kSampleStepSize, + initialSlope = getSlope(guessForT, mX1, mX2); + + if (initialSlope >= NEWTON_MIN_SLOPE) { + return newtonRaphsonIterate(aX, guessForT); + } else if (initialSlope === 0.0) { + return guessForT; + } else { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize); + } + } + + var _precomputed = false; + + function precompute() { + _precomputed = true; + + if (mX1 !== mY1 || mX2 !== mY2) { + calcSampleValues(); + } + } + + var f = function f(aX) { + if (!_precomputed) { + precompute(); + } + + if (mX1 === mY1 && mX2 === mY2) { + return aX; + } + + if (aX === 0) { + return 0; + } + + if (aX === 1) { + return 1; + } + + return calcBezier(getTForX(aX), mY1, mY2); + }; + + f.getControlPoints = function () { + return [{ + x: mX1, + y: mY1 + }, { + x: mX2, + y: mY2 + }]; + }; + + var str = "generateBezier(" + [mX1, mY1, mX2, mY2] + ")"; + + f.toString = function () { + return str; + }; + + return f; + } + + /*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */ + + /* Given a tension, friction, and duration, a simulation at 60FPS will first run without a defined duration in order to calculate the full path. A second pass + then adjusts the time delta -- using the relation between actual time and duration -- to calculate the path for the duration-constrained animation. */ + var generateSpringRK4 = function () { + function springAccelerationForState(state) { + return -state.tension * state.x - state.friction * state.v; + } + + function springEvaluateStateWithDerivative(initialState, dt, derivative) { + var state = { + x: initialState.x + derivative.dx * dt, + v: initialState.v + derivative.dv * dt, + tension: initialState.tension, + friction: initialState.friction + }; + return { + dx: state.v, + dv: springAccelerationForState(state) + }; + } + + function springIntegrateState(state, dt) { + var a = { + dx: state.v, + dv: springAccelerationForState(state) + }, + b = springEvaluateStateWithDerivative(state, dt * 0.5, a), + c = springEvaluateStateWithDerivative(state, dt * 0.5, b), + d = springEvaluateStateWithDerivative(state, dt, c), + dxdt = 1.0 / 6.0 * (a.dx + 2.0 * (b.dx + c.dx) + d.dx), + dvdt = 1.0 / 6.0 * (a.dv + 2.0 * (b.dv + c.dv) + d.dv); + state.x = state.x + dxdt * dt; + state.v = state.v + dvdt * dt; + return state; + } + + return function springRK4Factory(tension, friction, duration) { + var initState = { + x: -1, + v: 0, + tension: null, + friction: null + }, + path = [0], + time_lapsed = 0, + tolerance = 1 / 10000, + DT = 16 / 1000, + have_duration, + dt, + last_state; + tension = parseFloat(tension) || 500; + friction = parseFloat(friction) || 20; + duration = duration || null; + initState.tension = tension; + initState.friction = friction; + have_duration = duration !== null; + /* Calculate the actual time it takes for this animation to complete with the provided conditions. */ + + if (have_duration) { + /* Run the simulation without a duration. */ + time_lapsed = springRK4Factory(tension, friction); + /* Compute the adjusted time delta. */ + + dt = time_lapsed / duration * DT; + } else { + dt = DT; + } + + for (;;) { + /* Next/step function .*/ + last_state = springIntegrateState(last_state || initState, dt); + /* Store the position. */ + + path.push(1 + last_state.x); + time_lapsed += 16; + /* If the change threshold is reached, break. */ + + if (!(Math.abs(last_state.x) > tolerance && Math.abs(last_state.v) > tolerance)) { + break; + } + } + /* If duration is not defined, return the actual time required for completing this animation. Otherwise, return a closure that holds the + computed path and returns a snapshot of the position according to a given percentComplete. */ + + + return !have_duration ? time_lapsed : function (percentComplete) { + return path[percentComplete * (path.length - 1) | 0]; + }; + }; + }(); + + var cubicBezier = function cubicBezier(t1, p1, t2, p2) { + var bezier = generateCubicBezier(t1, p1, t2, p2); + return function (start, end, percent) { + return start + (end - start) * bezier(percent); + }; + }; + + var easings = { + 'linear': function linear(start, end, percent) { + return start + (end - start) * percent; + }, + // default easings + 'ease': cubicBezier(0.25, 0.1, 0.25, 1), + 'ease-in': cubicBezier(0.42, 0, 1, 1), + 'ease-out': cubicBezier(0, 0, 0.58, 1), + 'ease-in-out': cubicBezier(0.42, 0, 0.58, 1), + // sine + 'ease-in-sine': cubicBezier(0.47, 0, 0.745, 0.715), + 'ease-out-sine': cubicBezier(0.39, 0.575, 0.565, 1), + 'ease-in-out-sine': cubicBezier(0.445, 0.05, 0.55, 0.95), + // quad + 'ease-in-quad': cubicBezier(0.55, 0.085, 0.68, 0.53), + 'ease-out-quad': cubicBezier(0.25, 0.46, 0.45, 0.94), + 'ease-in-out-quad': cubicBezier(0.455, 0.03, 0.515, 0.955), + // cubic + 'ease-in-cubic': cubicBezier(0.55, 0.055, 0.675, 0.19), + 'ease-out-cubic': cubicBezier(0.215, 0.61, 0.355, 1), + 'ease-in-out-cubic': cubicBezier(0.645, 0.045, 0.355, 1), + // quart + 'ease-in-quart': cubicBezier(0.895, 0.03, 0.685, 0.22), + 'ease-out-quart': cubicBezier(0.165, 0.84, 0.44, 1), + 'ease-in-out-quart': cubicBezier(0.77, 0, 0.175, 1), + // quint + 'ease-in-quint': cubicBezier(0.755, 0.05, 0.855, 0.06), + 'ease-out-quint': cubicBezier(0.23, 1, 0.32, 1), + 'ease-in-out-quint': cubicBezier(0.86, 0, 0.07, 1), + // expo + 'ease-in-expo': cubicBezier(0.95, 0.05, 0.795, 0.035), + 'ease-out-expo': cubicBezier(0.19, 1, 0.22, 1), + 'ease-in-out-expo': cubicBezier(1, 0, 0, 1), + // circ + 'ease-in-circ': cubicBezier(0.6, 0.04, 0.98, 0.335), + 'ease-out-circ': cubicBezier(0.075, 0.82, 0.165, 1), + 'ease-in-out-circ': cubicBezier(0.785, 0.135, 0.15, 0.86), + // user param easings... + 'spring': function spring(tension, friction, duration) { + if (duration === 0) { + // can't get a spring w/ duration 0 + return easings.linear; // duration 0 => jump to end so impl doesn't matter + } + + var spring = generateSpringRK4(tension, friction, duration); + return function (start, end, percent) { + return start + (end - start) * spring(percent); + }; + }, + 'cubic-bezier': cubicBezier + }; + + function getEasedValue(type, start, end, percent, easingFn) { + if (percent === 1) { + return end; + } + + if (start === end) { + return end; + } + + var val = easingFn(start, end, percent); + + if (type == null) { + return val; + } + + if (type.roundValue || type.color) { + val = Math.round(val); + } + + if (type.min !== undefined) { + val = Math.max(val, type.min); + } + + if (type.max !== undefined) { + val = Math.min(val, type.max); + } + + return val; + } + + function getValue(prop, spec) { + if (prop.pfValue != null || prop.value != null) { + if (prop.pfValue != null && (spec == null || spec.type.units !== '%')) { + return prop.pfValue; + } else { + return prop.value; + } + } else { + return prop; + } + } + + function ease(startProp, endProp, percent, easingFn, propSpec) { + var type = propSpec != null ? propSpec.type : null; + + if (percent < 0) { + percent = 0; + } else if (percent > 1) { + percent = 1; + } + + var start = getValue(startProp, propSpec); + var end = getValue(endProp, propSpec); + + if (number$1(start) && number$1(end)) { + return getEasedValue(type, start, end, percent, easingFn); + } else if (array(start) && array(end)) { + var easedArr = []; + + for (var i = 0; i < end.length; i++) { + var si = start[i]; + var ei = end[i]; + + if (si != null && ei != null) { + var val = getEasedValue(type, si, ei, percent, easingFn); + easedArr.push(val); + } else { + easedArr.push(ei); + } + } + + return easedArr; + } + + return undefined; + } + + function step$1(self, ani, now, isCore) { + var isEles = !isCore; + var _p = self._private; + var ani_p = ani._private; + var pEasing = ani_p.easing; + var startTime = ani_p.startTime; + var cy = isCore ? self : self.cy(); + var style = cy.style(); + + if (!ani_p.easingImpl) { + if (pEasing == null) { + // use default + ani_p.easingImpl = easings['linear']; + } else { + // then define w/ name + var easingVals; + + if (string(pEasing)) { + var easingProp = style.parse('transition-timing-function', pEasing); + easingVals = easingProp.value; + } else { + // then assume preparsed array + easingVals = pEasing; + } + + var name, args; + + if (string(easingVals)) { + name = easingVals; + args = []; + } else { + name = easingVals[1]; + args = easingVals.slice(2).map(function (n) { + return +n; + }); + } + + if (args.length > 0) { + // create with args + if (name === 'spring') { + args.push(ani_p.duration); // need duration to generate spring + } + + ani_p.easingImpl = easings[name].apply(null, args); + } else { + // static impl by name + ani_p.easingImpl = easings[name]; + } + } + } + + var easing = ani_p.easingImpl; + var percent; + + if (ani_p.duration === 0) { + percent = 1; + } else { + percent = (now - startTime) / ani_p.duration; + } + + if (ani_p.applying) { + percent = ani_p.progress; + } + + if (percent < 0) { + percent = 0; + } else if (percent > 1) { + percent = 1; + } + + if (ani_p.delay == null) { + // then update + var startPos = ani_p.startPosition; + var endPos = ani_p.position; + + if (endPos && isEles && !self.locked()) { + var newPos = {}; + + if (valid(startPos.x, endPos.x)) { + newPos.x = ease(startPos.x, endPos.x, percent, easing); + } + + if (valid(startPos.y, endPos.y)) { + newPos.y = ease(startPos.y, endPos.y, percent, easing); + } + + self.position(newPos); + } + + var startPan = ani_p.startPan; + var endPan = ani_p.pan; + var pan = _p.pan; + var animatingPan = endPan != null && isCore; + + if (animatingPan) { + if (valid(startPan.x, endPan.x)) { + pan.x = ease(startPan.x, endPan.x, percent, easing); + } + + if (valid(startPan.y, endPan.y)) { + pan.y = ease(startPan.y, endPan.y, percent, easing); + } + + self.emit('pan'); + } + + var startZoom = ani_p.startZoom; + var endZoom = ani_p.zoom; + var animatingZoom = endZoom != null && isCore; + + if (animatingZoom) { + if (valid(startZoom, endZoom)) { + _p.zoom = bound(_p.minZoom, ease(startZoom, endZoom, percent, easing), _p.maxZoom); + } + + self.emit('zoom'); + } + + if (animatingPan || animatingZoom) { + self.emit('viewport'); + } + + var props = ani_p.style; + + if (props && props.length > 0 && isEles) { + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + var _name = prop.name; + var end = prop; + var start = ani_p.startStyle[_name]; + var propSpec = style.properties[start.name]; + var easedVal = ease(start, end, percent, easing, propSpec); + style.overrideBypass(self, _name, easedVal); + } // for props + + + self.emit('style'); + } // if + + } + + ani_p.progress = percent; + return percent; + } + + function valid(start, end) { + if (start == null || end == null) { + return false; + } + + if (number$1(start) && number$1(end)) { + return true; + } else if (start && end) { + return true; + } + + return false; + } + + function startAnimation(self, ani, now, isCore) { + var ani_p = ani._private; + ani_p.started = true; + ani_p.startTime = now - ani_p.progress * ani_p.duration; + } + + function stepAll(now, cy) { + var eles = cy._private.aniEles; + var doneEles = []; + + function stepOne(ele, isCore) { + var _p = ele._private; + var current = _p.animation.current; + var queue = _p.animation.queue; + var ranAnis = false; // if nothing currently animating, get something from the queue + + if (current.length === 0) { + var next = queue.shift(); + + if (next) { + current.push(next); + } + } + + var callbacks = function callbacks(_callbacks) { + for (var j = _callbacks.length - 1; j >= 0; j--) { + var cb = _callbacks[j]; + cb(); + } + + _callbacks.splice(0, _callbacks.length); + }; // step and remove if done + + + for (var i = current.length - 1; i >= 0; i--) { + var ani = current[i]; + var ani_p = ani._private; + + if (ani_p.stopped) { + current.splice(i, 1); + ani_p.hooked = false; + ani_p.playing = false; + ani_p.started = false; + callbacks(ani_p.frames); + continue; + } + + if (!ani_p.playing && !ani_p.applying) { + continue; + } // an apply() while playing shouldn't do anything + + + if (ani_p.playing && ani_p.applying) { + ani_p.applying = false; + } + + if (!ani_p.started) { + startAnimation(ele, ani, now); + } + + step$1(ele, ani, now, isCore); + + if (ani_p.applying) { + ani_p.applying = false; + } + + callbacks(ani_p.frames); + + if (ani_p.step != null) { + ani_p.step(now); + } + + if (ani.completed()) { + current.splice(i, 1); + ani_p.hooked = false; + ani_p.playing = false; + ani_p.started = false; + callbacks(ani_p.completes); + } + + ranAnis = true; + } + + if (!isCore && current.length === 0 && queue.length === 0) { + doneEles.push(ele); + } + + return ranAnis; + } // stepElement + // handle all eles + + + var ranEleAni = false; + + for (var e = 0; e < eles.length; e++) { + var ele = eles[e]; + var handledThisEle = stepOne(ele); + ranEleAni = ranEleAni || handledThisEle; + } // each element + + + var ranCoreAni = stepOne(cy, true); // notify renderer + + if (ranEleAni || ranCoreAni) { + if (eles.length > 0) { + cy.notify('draw', eles); + } else { + cy.notify('draw'); + } + } // remove elements from list of currently animating if its queues are empty + + + eles.unmerge(doneEles); + cy.emit('step'); + } // stepAll + + var corefn$8 = { + // pull in animation functions + animate: define.animate(), + animation: define.animation(), + animated: define.animated(), + clearQueue: define.clearQueue(), + delay: define.delay(), + delayAnimation: define.delayAnimation(), + stop: define.stop(), + addToAnimationPool: function addToAnimationPool(eles) { + var cy = this; + + if (!cy.styleEnabled()) { + return; + } // save cycles when no style used + + + cy._private.aniEles.merge(eles); + }, + stopAnimationLoop: function stopAnimationLoop() { + this._private.animationsRunning = false; + }, + startAnimationLoop: function startAnimationLoop() { + var cy = this; + cy._private.animationsRunning = true; + + if (!cy.styleEnabled()) { + return; + } // save cycles when no style used + // NB the animation loop will exec in headless environments if style enabled + // and explicit cy.destroy() is necessary to stop the loop + + + function headlessStep() { + if (!cy._private.animationsRunning) { + return; + } + + requestAnimationFrame(function animationStep(now) { + stepAll(now, cy); + headlessStep(); + }); + } + + var renderer = cy.renderer(); + + if (renderer && renderer.beforeRender) { + // let the renderer schedule animations + renderer.beforeRender(function rendererAnimationStep(willDraw, now) { + stepAll(now, cy); + }, renderer.beforeRenderPriorities.animations); + } else { + // manage the animation loop ourselves + headlessStep(); // first call + } + } + }; + + var emitterOptions = { + qualifierCompare: function qualifierCompare(selector1, selector2) { + if (selector1 == null || selector2 == null) { + return selector1 == null && selector2 == null; + } else { + return selector1.sameText(selector2); + } + }, + eventMatches: function eventMatches(cy, listener, eventObj) { + var selector = listener.qualifier; + + if (selector != null) { + return cy !== eventObj.target && element(eventObj.target) && selector.matches(eventObj.target); + } + + return true; + }, + addEventFields: function addEventFields(cy, evt) { + evt.cy = cy; + evt.target = cy; + }, + callbackContext: function callbackContext(cy, listener, eventObj) { + return listener.qualifier != null ? eventObj.target : cy; + } + }; + + var argSelector = function argSelector(arg) { + if (string(arg)) { + return new Selector(arg); + } else { + return arg; + } + }; + + var elesfn = { + createEmitter: function createEmitter() { + var _p = this._private; + + if (!_p.emitter) { + _p.emitter = new Emitter(emitterOptions, this); + } + + return this; + }, + emitter: function emitter() { + return this._private.emitter; + }, + on: function on(events, selector, callback) { + this.emitter().on(events, argSelector(selector), callback); + return this; + }, + removeListener: function removeListener(events, selector, callback) { + this.emitter().removeListener(events, argSelector(selector), callback); + return this; + }, + removeAllListeners: function removeAllListeners() { + this.emitter().removeAllListeners(); + return this; + }, + one: function one(events, selector, callback) { + this.emitter().one(events, argSelector(selector), callback); + return this; + }, + once: function once(events, selector, callback) { + this.emitter().one(events, argSelector(selector), callback); + return this; + }, + emit: function emit(events, extraParams) { + this.emitter().emit(events, extraParams); + return this; + }, + emitAndNotify: function emitAndNotify(event, eles) { + this.emit(event); + this.notify(event, eles); + return this; + } + }; + define.eventAliasesOn(elesfn); + + var corefn$7 = { + png: function png(options) { + var renderer = this._private.renderer; + options = options || {}; + return renderer.png(options); + }, + jpg: function jpg(options) { + var renderer = this._private.renderer; + options = options || {}; + options.bg = options.bg || '#fff'; + return renderer.jpg(options); + } + }; + corefn$7.jpeg = corefn$7.jpg; + + var corefn$6 = { + layout: function layout(options) { + var cy = this; + + if (options == null) { + error('Layout options must be specified to make a layout'); + return; + } + + if (options.name == null) { + error('A `name` must be specified to make a layout'); + return; + } + + var name = options.name; + var Layout = cy.extension('layout', name); + + if (Layout == null) { + error('No such layout `' + name + '` found. Did you forget to import it and `cytoscape.use()` it?'); + return; + } + + var eles; + + if (string(options.eles)) { + eles = cy.$(options.eles); + } else { + eles = options.eles != null ? options.eles : cy.$(); + } + + var layout = new Layout(extend({}, options, { + cy: cy, + eles: eles + })); + return layout; + } + }; + corefn$6.createLayout = corefn$6.makeLayout = corefn$6.layout; + + var corefn$5 = { + notify: function notify(eventName, eventEles) { + var _p = this._private; + + if (this.batching()) { + _p.batchNotifications = _p.batchNotifications || {}; + var eles = _p.batchNotifications[eventName] = _p.batchNotifications[eventName] || this.collection(); + + if (eventEles != null) { + eles.merge(eventEles); + } + + return; // notifications are disabled during batching + } + + if (!_p.notificationsEnabled) { + return; + } // exit on disabled + + + var renderer = this.renderer(); // exit if destroy() called on core or renderer in between frames #1499 #1528 + + if (this.destroyed() || !renderer) { + return; + } + + renderer.notify(eventName, eventEles); + }, + notifications: function notifications(bool) { + var p = this._private; + + if (bool === undefined) { + return p.notificationsEnabled; + } else { + p.notificationsEnabled = bool ? true : false; + } + + return this; + }, + noNotifications: function noNotifications(callback) { + this.notifications(false); + callback(); + this.notifications(true); + }, + batching: function batching() { + return this._private.batchCount > 0; + }, + startBatch: function startBatch() { + var _p = this._private; + + if (_p.batchCount == null) { + _p.batchCount = 0; + } + + if (_p.batchCount === 0) { + _p.batchStyleEles = this.collection(); + _p.batchNotifications = {}; + } + + _p.batchCount++; + return this; + }, + endBatch: function endBatch() { + var _p = this._private; + + if (_p.batchCount === 0) { + return this; + } + + _p.batchCount--; + + if (_p.batchCount === 0) { + // update style for dirty eles + _p.batchStyleEles.updateStyle(); + + var renderer = this.renderer(); // notify the renderer of queued eles and event types + + Object.keys(_p.batchNotifications).forEach(function (eventName) { + var eles = _p.batchNotifications[eventName]; + + if (eles.empty()) { + renderer.notify(eventName); + } else { + renderer.notify(eventName, eles); + } + }); + } + + return this; + }, + batch: function batch(callback) { + this.startBatch(); + callback(); + this.endBatch(); + return this; + }, + // for backwards compatibility + batchData: function batchData(map) { + var cy = this; + return this.batch(function () { + var ids = Object.keys(map); + + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + var data = map[id]; + var ele = cy.getElementById(id); + ele.data(data); + } + }); + } + }; + + var rendererDefaults = defaults$g({ + hideEdgesOnViewport: false, + textureOnViewport: false, + motionBlur: false, + motionBlurOpacity: 0.05, + pixelRatio: undefined, + desktopTapThreshold: 4, + touchTapThreshold: 8, + wheelSensitivity: 1, + debug: false, + showFps: false + }); + var corefn$4 = { + renderTo: function renderTo(context, zoom, pan, pxRatio) { + var r = this._private.renderer; + r.renderTo(context, zoom, pan, pxRatio); + return this; + }, + renderer: function renderer() { + return this._private.renderer; + }, + forceRender: function forceRender() { + this.notify('draw'); + return this; + }, + resize: function resize() { + this.invalidateSize(); + this.emitAndNotify('resize'); + return this; + }, + initRenderer: function initRenderer(options) { + var cy = this; + var RendererProto = cy.extension('renderer', options.name); + + if (RendererProto == null) { + error("Can not initialise: No such renderer `".concat(options.name, "` found. Did you forget to import it and `cytoscape.use()` it?")); + return; + } + + if (options.wheelSensitivity !== undefined) { + warn("You have set a custom wheel sensitivity. This will make your app zoom unnaturally when using mainstream mice. You should change this value from the default only if you can guarantee that all your users will use the same hardware and OS configuration as your current machine."); + } + + var rOpts = rendererDefaults(options); + rOpts.cy = cy; + cy._private.renderer = new RendererProto(rOpts); + this.notify('init'); + }, + destroyRenderer: function destroyRenderer() { + var cy = this; + cy.notify('destroy'); // destroy the renderer + + var domEle = cy.container(); + + if (domEle) { + domEle._cyreg = null; + + while (domEle.childNodes.length > 0) { + domEle.removeChild(domEle.childNodes[0]); + } + } + + cy._private.renderer = null; // to be extra safe, remove the ref + + cy.mutableElements().forEach(function (ele) { + var _p = ele._private; + _p.rscratch = {}; + _p.rstyle = {}; + _p.animation.current = []; + _p.animation.queue = []; + }); + }, + onRender: function onRender(fn) { + return this.on('render', fn); + }, + offRender: function offRender(fn) { + return this.off('render', fn); + } + }; + corefn$4.invalidateDimensions = corefn$4.resize; + + var corefn$3 = { + // get a collection + // - empty collection on no args + // - collection of elements in the graph on selector arg + // - guarantee a returned collection when elements or collection specified + collection: function collection(eles, opts) { + if (string(eles)) { + return this.$(eles); + } else if (elementOrCollection(eles)) { + return eles.collection(); + } else if (array(eles)) { + if (!opts) { + opts = {}; + } + + return new Collection(this, eles, opts.unique, opts.removed); + } + + return new Collection(this); + }, + nodes: function nodes(selector) { + var nodes = this.$(function (ele) { + return ele.isNode(); + }); + + if (selector) { + return nodes.filter(selector); + } + + return nodes; + }, + edges: function edges(selector) { + var edges = this.$(function (ele) { + return ele.isEdge(); + }); + + if (selector) { + return edges.filter(selector); + } + + return edges; + }, + // search the graph like jQuery + $: function $(selector) { + var eles = this._private.elements; + + if (selector) { + return eles.filter(selector); + } else { + return eles.spawnSelf(); + } + }, + mutableElements: function mutableElements() { + return this._private.elements; + } + }; // aliases + + corefn$3.elements = corefn$3.filter = corefn$3.$; + + var styfn$8 = {}; // keys for style blocks, e.g. ttfftt + + var TRUE = 't'; + var FALSE = 'f'; // (potentially expensive calculation) + // apply the style to the element based on + // - its bypass + // - what selectors match it + + styfn$8.apply = function (eles) { + var self = this; + var _p = self._private; + var cy = _p.cy; + var updatedEles = cy.collection(); + + for (var ie = 0; ie < eles.length; ie++) { + var ele = eles[ie]; + var cxtMeta = self.getContextMeta(ele); + + if (cxtMeta.empty) { + continue; + } + + var cxtStyle = self.getContextStyle(cxtMeta); + var app = self.applyContextStyle(cxtMeta, cxtStyle, ele); + + if (ele._private.appliedInitStyle) { + self.updateTransitions(ele, app.diffProps); + } else { + ele._private.appliedInitStyle = true; + } + + var hintsDiff = self.updateStyleHints(ele); + + if (hintsDiff) { + updatedEles.push(ele); + } + } // for elements + + + return updatedEles; + }; + + styfn$8.getPropertiesDiff = function (oldCxtKey, newCxtKey) { + var self = this; + var cache = self._private.propDiffs = self._private.propDiffs || {}; + var dualCxtKey = oldCxtKey + '-' + newCxtKey; + var cachedVal = cache[dualCxtKey]; + + if (cachedVal) { + return cachedVal; + } + + var diffProps = []; + var addedProp = {}; + + for (var i = 0; i < self.length; i++) { + var cxt = self[i]; + var oldHasCxt = oldCxtKey[i] === TRUE; + var newHasCxt = newCxtKey[i] === TRUE; + var cxtHasDiffed = oldHasCxt !== newHasCxt; + var cxtHasMappedProps = cxt.mappedProperties.length > 0; + + if (cxtHasDiffed || newHasCxt && cxtHasMappedProps) { + var props = void 0; + + if (cxtHasDiffed && cxtHasMappedProps) { + props = cxt.properties; // suffices b/c mappedProperties is a subset of properties + } else if (cxtHasDiffed) { + props = cxt.properties; // need to check them all + } else if (cxtHasMappedProps) { + props = cxt.mappedProperties; // only need to check mapped + } + + for (var j = 0; j < props.length; j++) { + var prop = props[j]; + var name = prop.name; // if a later context overrides this property, then the fact that this context has switched/diffed doesn't matter + // (semi expensive check since it makes this function O(n^2) on context length, but worth it since overall result + // is cached) + + var laterCxtOverrides = false; + + for (var k = i + 1; k < self.length; k++) { + var laterCxt = self[k]; + var hasLaterCxt = newCxtKey[k] === TRUE; + + if (!hasLaterCxt) { + continue; + } // can't override unless the context is active + + + laterCxtOverrides = laterCxt.properties[prop.name] != null; + + if (laterCxtOverrides) { + break; + } // exit early as long as one later context overrides + + } + + if (!addedProp[name] && !laterCxtOverrides) { + addedProp[name] = true; + diffProps.push(name); + } + } // for props + + } // if + + } // for contexts + + + cache[dualCxtKey] = diffProps; + return diffProps; + }; + + styfn$8.getContextMeta = function (ele) { + var self = this; + var cxtKey = ''; + var diffProps; + var prevKey = ele._private.styleCxtKey || ''; // get the cxt key + + for (var i = 0; i < self.length; i++) { + var context = self[i]; + var contextSelectorMatches = context.selector && context.selector.matches(ele); // NB: context.selector may be null for 'core' + + if (contextSelectorMatches) { + cxtKey += TRUE; + } else { + cxtKey += FALSE; + } + } // for context + + + diffProps = self.getPropertiesDiff(prevKey, cxtKey); + ele._private.styleCxtKey = cxtKey; + return { + key: cxtKey, + diffPropNames: diffProps, + empty: diffProps.length === 0 + }; + }; // gets a computed ele style object based on matched contexts + + + styfn$8.getContextStyle = function (cxtMeta) { + var cxtKey = cxtMeta.key; + var self = this; + var cxtStyles = this._private.contextStyles = this._private.contextStyles || {}; // if already computed style, returned cached copy + + if (cxtStyles[cxtKey]) { + return cxtStyles[cxtKey]; + } + + var style = { + _private: { + key: cxtKey + } + }; + + for (var i = 0; i < self.length; i++) { + var cxt = self[i]; + var hasCxt = cxtKey[i] === TRUE; + + if (!hasCxt) { + continue; + } + + for (var j = 0; j < cxt.properties.length; j++) { + var prop = cxt.properties[j]; + style[prop.name] = prop; + } + } + + cxtStyles[cxtKey] = style; + return style; + }; + + styfn$8.applyContextStyle = function (cxtMeta, cxtStyle, ele) { + var self = this; + var diffProps = cxtMeta.diffPropNames; + var retDiffProps = {}; + var types = self.types; + + for (var i = 0; i < diffProps.length; i++) { + var diffPropName = diffProps[i]; + var cxtProp = cxtStyle[diffPropName]; + var eleProp = ele.pstyle(diffPropName); + + if (!cxtProp) { + // no context prop means delete + if (!eleProp) { + continue; // no existing prop means nothing needs to be removed + // nb affects initial application on mapped values like control-point-distances + } else if (eleProp.bypass) { + cxtProp = { + name: diffPropName, + deleteBypassed: true + }; + } else { + cxtProp = { + name: diffPropName, + "delete": true + }; + } + } // save cycles when the context prop doesn't need to be applied + + + if (eleProp === cxtProp) { + continue; + } // save cycles when a mapped context prop doesn't need to be applied + + + if (cxtProp.mapped === types.fn // context prop is function mapper + && eleProp != null // some props can be null even by default (e.g. a prop that overrides another one) + && eleProp.mapping != null // ele prop is a concrete value from from a mapper + && eleProp.mapping.value === cxtProp.value // the current prop on the ele is a flat prop value for the function mapper + ) { + // NB don't write to cxtProp, as it's shared among eles (stored in stylesheet) + var mapping = eleProp.mapping; // can write to mapping, as it's a per-ele copy + + var fnValue = mapping.fnValue = cxtProp.value(ele); // temporarily cache the value in case of a miss + + if (fnValue === mapping.prevFnValue) { + continue; + } + } + + var retDiffProp = retDiffProps[diffPropName] = { + prev: eleProp + }; + self.applyParsedProperty(ele, cxtProp); + retDiffProp.next = ele.pstyle(diffPropName); + + if (retDiffProp.next && retDiffProp.next.bypass) { + retDiffProp.next = retDiffProp.next.bypassed; + } + } + + return { + diffProps: retDiffProps + }; + }; + + styfn$8.updateStyleHints = function (ele) { + var _p = ele._private; + var self = this; + var propNames = self.propertyGroupNames; + var propGrKeys = self.propertyGroupKeys; + + var propHash = function propHash(ele, propNames, seedKey) { + return self.getPropertiesHash(ele, propNames, seedKey); + }; + + var oldStyleKey = _p.styleKey; + + if (ele.removed()) { + return false; + } + + var isNode = _p.group === 'nodes'; // get the style key hashes per prop group + // but lazily -- only use non-default prop values to reduce the number of hashes + // + + var overriddenStyles = ele._private.style; + propNames = Object.keys(overriddenStyles); + + for (var i = 0; i < propGrKeys.length; i++) { + var grKey = propGrKeys[i]; + _p.styleKeys[grKey] = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]; + } + + var updateGrKey1 = function updateGrKey1(val, grKey) { + return _p.styleKeys[grKey][0] = hashInt(val, _p.styleKeys[grKey][0]); + }; + + var updateGrKey2 = function updateGrKey2(val, grKey) { + return _p.styleKeys[grKey][1] = hashIntAlt(val, _p.styleKeys[grKey][1]); + }; + + var updateGrKey = function updateGrKey(val, grKey) { + updateGrKey1(val, grKey); + updateGrKey2(val, grKey); + }; + + var updateGrKeyWStr = function updateGrKeyWStr(strVal, grKey) { + for (var j = 0; j < strVal.length; j++) { + var ch = strVal.charCodeAt(j); + updateGrKey1(ch, grKey); + updateGrKey2(ch, grKey); + } + }; // - hashing works on 32 bit ints b/c we use bitwise ops + // - small numbers get cut off (e.g. 0.123 is seen as 0 by the hashing function) + // - raise up small numbers so more significant digits are seen by hashing + // - make small numbers larger than a normal value to avoid collisions + // - works in practice and it's relatively cheap + + + var N = 2000000000; + + var cleanNum = function cleanNum(val) { + return -128 < val && val < 128 && Math.floor(val) !== val ? N - (val * 1024 | 0) : val; + }; + + for (var _i = 0; _i < propNames.length; _i++) { + var name = propNames[_i]; + var parsedProp = overriddenStyles[name]; + + if (parsedProp == null) { + continue; + } + + var propInfo = this.properties[name]; + var type = propInfo.type; + var _grKey = propInfo.groupKey; + var normalizedNumberVal = void 0; + + if (propInfo.hashOverride != null) { + normalizedNumberVal = propInfo.hashOverride(ele, parsedProp); + } else if (parsedProp.pfValue != null) { + normalizedNumberVal = parsedProp.pfValue; + } // might not be a number if it allows enums + + + var numberVal = propInfo.enums == null ? parsedProp.value : null; + var haveNormNum = normalizedNumberVal != null; + var haveUnitedNum = numberVal != null; + var haveNum = haveNormNum || haveUnitedNum; + var units = parsedProp.units; // numbers are cheaper to hash than strings + // 1 hash op vs n hash ops (for length n string) + + if (type.number && haveNum && !type.multiple) { + var v = haveNormNum ? normalizedNumberVal : numberVal; + updateGrKey(cleanNum(v), _grKey); + + if (!haveNormNum && units != null) { + updateGrKeyWStr(units, _grKey); + } + } else { + updateGrKeyWStr(parsedProp.strValue, _grKey); + } + } // overall style key + // + + + var hash = [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]; + + for (var _i2 = 0; _i2 < propGrKeys.length; _i2++) { + var _grKey2 = propGrKeys[_i2]; + var grHash = _p.styleKeys[_grKey2]; + hash[0] = hashInt(grHash[0], hash[0]); + hash[1] = hashIntAlt(grHash[1], hash[1]); + } + + _p.styleKey = combineHashes(hash[0], hash[1]); // label dims + // + + var sk = _p.styleKeys; + _p.labelDimsKey = combineHashesArray(sk.labelDimensions); + var labelKeys = propHash(ele, ['label'], sk.labelDimensions); + _p.labelKey = combineHashesArray(labelKeys); + _p.labelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, labelKeys)); + + if (!isNode) { + var sourceLabelKeys = propHash(ele, ['source-label'], sk.labelDimensions); + _p.sourceLabelKey = combineHashesArray(sourceLabelKeys); + _p.sourceLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, sourceLabelKeys)); + var targetLabelKeys = propHash(ele, ['target-label'], sk.labelDimensions); + _p.targetLabelKey = combineHashesArray(targetLabelKeys); + _p.targetLabelStyleKey = combineHashesArray(hashArrays(sk.commonLabel, targetLabelKeys)); + } // node + // + + + if (isNode) { + var _p$styleKeys = _p.styleKeys, + nodeBody = _p$styleKeys.nodeBody, + nodeBorder = _p$styleKeys.nodeBorder, + backgroundImage = _p$styleKeys.backgroundImage, + compound = _p$styleKeys.compound, + pie = _p$styleKeys.pie; + var nodeKeys = [nodeBody, nodeBorder, backgroundImage, compound, pie].filter(function (k) { + return k != null; + }).reduce(hashArrays, [DEFAULT_HASH_SEED, DEFAULT_HASH_SEED_ALT]); + _p.nodeKey = combineHashesArray(nodeKeys); + _p.hasPie = pie != null && pie[0] !== DEFAULT_HASH_SEED && pie[1] !== DEFAULT_HASH_SEED_ALT; + } + + return oldStyleKey !== _p.styleKey; + }; + + styfn$8.clearStyleHints = function (ele) { + var _p = ele._private; + _p.styleCxtKey = ''; + _p.styleKeys = {}; + _p.styleKey = null; + _p.labelKey = null; + _p.labelStyleKey = null; + _p.sourceLabelKey = null; + _p.sourceLabelStyleKey = null; + _p.targetLabelKey = null; + _p.targetLabelStyleKey = null; + _p.nodeKey = null; + _p.hasPie = null; + }; // apply a property to the style (for internal use) + // returns whether application was successful + // + // now, this function flattens the property, and here's how: + // + // for parsedProp:{ bypass: true, deleteBypass: true } + // no property is generated, instead the bypass property in the + // element's style is replaced by what's pointed to by the `bypassed` + // field in the bypass property (i.e. restoring the property the + // bypass was overriding) + // + // for parsedProp:{ mapped: truthy } + // the generated flattenedProp:{ mapping: prop } + // + // for parsedProp:{ bypass: true } + // the generated flattenedProp:{ bypassed: parsedProp } + + + styfn$8.applyParsedProperty = function (ele, parsedProp) { + var self = this; + var prop = parsedProp; + var style = ele._private.style; + var flatProp; + var types = self.types; + var type = self.properties[prop.name].type; + var propIsBypass = prop.bypass; + var origProp = style[prop.name]; + var origPropIsBypass = origProp && origProp.bypass; + var _p = ele._private; + var flatPropMapping = 'mapping'; + + var getVal = function getVal(p) { + if (p == null) { + return null; + } else if (p.pfValue != null) { + return p.pfValue; + } else { + return p.value; + } + }; + + var checkTriggers = function checkTriggers() { + var fromVal = getVal(origProp); + var toVal = getVal(prop); + self.checkTriggers(ele, prop.name, fromVal, toVal); + }; + + if (prop && prop.name.substr(0, 3) === 'pie') { + warn('The pie style properties are deprecated. Create charts using background images instead.'); + } // edge sanity checks to prevent the client from making serious mistakes + + + if (parsedProp.name === 'curve-style' && ele.isEdge() && ( // loops must be bundled beziers + parsedProp.value !== 'bezier' && ele.isLoop() || // edges connected to compound nodes can not be haystacks + parsedProp.value === 'haystack' && (ele.source().isParent() || ele.target().isParent()))) { + prop = parsedProp = this.parse(parsedProp.name, 'bezier', propIsBypass); + } + + if (prop["delete"]) { + // delete the property and use the default value on falsey value + style[prop.name] = undefined; + checkTriggers(); + return true; + } + + if (prop.deleteBypassed) { + // delete the property that the + if (!origProp) { + checkTriggers(); + return true; // can't delete if no prop + } else if (origProp.bypass) { + // delete bypassed + origProp.bypassed = undefined; + checkTriggers(); + return true; + } else { + return false; // we're unsuccessful deleting the bypassed + } + } // check if we need to delete the current bypass + + + if (prop.deleteBypass) { + // then this property is just here to indicate we need to delete + if (!origProp) { + checkTriggers(); + return true; // property is already not defined + } else if (origProp.bypass) { + // then replace the bypass property with the original + // because the bypassed property was already applied (and therefore parsed), we can just replace it (no reapplying necessary) + style[prop.name] = origProp.bypassed; + checkTriggers(); + return true; + } else { + return false; // we're unsuccessful deleting the bypass + } + } + + var printMappingErr = function printMappingErr() { + warn('Do not assign mappings to elements without corresponding data (i.e. ele `' + ele.id() + '` has no mapping for property `' + prop.name + '` with data field `' + prop.field + '`); try a `[' + prop.field + ']` selector to limit scope to elements with `' + prop.field + '` defined'); + }; // put the property in the style objects + + + switch (prop.mapped) { + // flatten the property if mapped + case types.mapData: + { + // flatten the field (e.g. data.foo.bar) + var fields = prop.field.split('.'); + var fieldVal = _p.data; + + for (var i = 0; i < fields.length && fieldVal; i++) { + var field = fields[i]; + fieldVal = fieldVal[field]; + } + + if (fieldVal == null) { + printMappingErr(); + return false; + } + + var percent; + + if (!number$1(fieldVal)) { + // then don't apply and fall back on the existing style + warn('Do not use continuous mappers without specifying numeric data (i.e. `' + prop.field + ': ' + fieldVal + '` for `' + ele.id() + '` is non-numeric)'); + return false; + } else { + var fieldWidth = prop.fieldMax - prop.fieldMin; + + if (fieldWidth === 0) { + // safety check -- not strictly necessary as no props of zero range should be passed here + percent = 0; + } else { + percent = (fieldVal - prop.fieldMin) / fieldWidth; + } + } // make sure to bound percent value + + + if (percent < 0) { + percent = 0; + } else if (percent > 1) { + percent = 1; + } + + if (type.color) { + var r1 = prop.valueMin[0]; + var r2 = prop.valueMax[0]; + var g1 = prop.valueMin[1]; + var g2 = prop.valueMax[1]; + var b1 = prop.valueMin[2]; + var b2 = prop.valueMax[2]; + var a1 = prop.valueMin[3] == null ? 1 : prop.valueMin[3]; + var a2 = prop.valueMax[3] == null ? 1 : prop.valueMax[3]; + var clr = [Math.round(r1 + (r2 - r1) * percent), Math.round(g1 + (g2 - g1) * percent), Math.round(b1 + (b2 - b1) * percent), Math.round(a1 + (a2 - a1) * percent)]; + flatProp = { + // colours are simple, so just create the flat property instead of expensive string parsing + bypass: prop.bypass, + // we're a bypass if the mapping property is a bypass + name: prop.name, + value: clr, + strValue: 'rgb(' + clr[0] + ', ' + clr[1] + ', ' + clr[2] + ')' + }; + } else if (type.number) { + var calcValue = prop.valueMin + (prop.valueMax - prop.valueMin) * percent; + flatProp = this.parse(prop.name, calcValue, prop.bypass, flatPropMapping); + } else { + return false; // can only map to colours and numbers + } + + if (!flatProp) { + // if we can't flatten the property, then don't apply the property and fall back on the existing style + printMappingErr(); + return false; + } + + flatProp.mapping = prop; // keep a reference to the mapping + + prop = flatProp; // the flattened (mapped) property is the one we want + + break; + } + // direct mapping + + case types.data: + { + // flatten the field (e.g. data.foo.bar) + var _fields = prop.field.split('.'); + + var _fieldVal = _p.data; + + for (var _i3 = 0; _i3 < _fields.length && _fieldVal; _i3++) { + var _field = _fields[_i3]; + _fieldVal = _fieldVal[_field]; + } + + if (_fieldVal != null) { + flatProp = this.parse(prop.name, _fieldVal, prop.bypass, flatPropMapping); + } + + if (!flatProp) { + // if we can't flatten the property, then don't apply and fall back on the existing style + printMappingErr(); + return false; + } + + flatProp.mapping = prop; // keep a reference to the mapping + + prop = flatProp; // the flattened (mapped) property is the one we want + + break; + } + + case types.fn: + { + var fn = prop.value; + var fnRetVal = prop.fnValue != null ? prop.fnValue : fn(ele); // check for cached value before calling function + + prop.prevFnValue = fnRetVal; + + if (fnRetVal == null) { + warn('Custom function mappers may not return null (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is null)'); + return false; + } + + flatProp = this.parse(prop.name, fnRetVal, prop.bypass, flatPropMapping); + + if (!flatProp) { + warn('Custom function mappers may not return invalid values for the property type (i.e. `' + prop.name + '` for ele `' + ele.id() + '` is invalid)'); + return false; + } + + flatProp.mapping = copy(prop); // keep a reference to the mapping + + prop = flatProp; // the flattened (mapped) property is the one we want + + break; + } + + case undefined: + break; + // just set the property + + default: + return false; + // not a valid mapping + } // if the property is a bypass property, then link the resultant property to the original one + + + if (propIsBypass) { + if (origPropIsBypass) { + // then this bypass overrides the existing one + prop.bypassed = origProp.bypassed; // steal bypassed prop from old bypass + } else { + // then link the orig prop to the new bypass + prop.bypassed = origProp; + } + + style[prop.name] = prop; // and set + } else { + // prop is not bypass + if (origPropIsBypass) { + // then keep the orig prop (since it's a bypass) and link to the new prop + origProp.bypassed = prop; + } else { + // then just replace the old prop with the new one + style[prop.name] = prop; + } + } + + checkTriggers(); + return true; + }; + + styfn$8.cleanElements = function (eles, keepBypasses) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + this.clearStyleHints(ele); + ele.dirtyCompoundBoundsCache(); + ele.dirtyBoundingBoxCache(); + + if (!keepBypasses) { + ele._private.style = {}; + } else { + var style = ele._private.style; + var propNames = Object.keys(style); + + for (var j = 0; j < propNames.length; j++) { + var propName = propNames[j]; + var eleProp = style[propName]; + + if (eleProp != null) { + if (eleProp.bypass) { + eleProp.bypassed = null; + } else { + style[propName] = null; + } + } + } + } + } + }; // updates the visual style for all elements (useful for manual style modification after init) + + + styfn$8.update = function () { + var cy = this._private.cy; + var eles = cy.mutableElements(); + eles.updateStyle(); + }; // diffProps : { name => { prev, next } } + + + styfn$8.updateTransitions = function (ele, diffProps) { + var self = this; + var _p = ele._private; + var props = ele.pstyle('transition-property').value; + var duration = ele.pstyle('transition-duration').pfValue; + var delay = ele.pstyle('transition-delay').pfValue; + + if (props.length > 0 && duration > 0) { + var style = {}; // build up the style to animate towards + + var anyPrev = false; + + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + var styProp = ele.pstyle(prop); + var diffProp = diffProps[prop]; + + if (!diffProp) { + continue; + } + + var prevProp = diffProp.prev; + var fromProp = prevProp; + var toProp = diffProp.next != null ? diffProp.next : styProp; + var diff = false; + var initVal = void 0; + var initDt = 0.000001; // delta time % value for initVal (allows animating out of init zero opacity) + + if (!fromProp) { + continue; + } // consider px values + + + if (number$1(fromProp.pfValue) && number$1(toProp.pfValue)) { + diff = toProp.pfValue - fromProp.pfValue; // nonzero is truthy + + initVal = fromProp.pfValue + initDt * diff; // consider numerical values + } else if (number$1(fromProp.value) && number$1(toProp.value)) { + diff = toProp.value - fromProp.value; // nonzero is truthy + + initVal = fromProp.value + initDt * diff; // consider colour values + } else if (array(fromProp.value) && array(toProp.value)) { + diff = fromProp.value[0] !== toProp.value[0] || fromProp.value[1] !== toProp.value[1] || fromProp.value[2] !== toProp.value[2]; + initVal = fromProp.strValue; + } // the previous value is good for an animation only if it's different + + + if (diff) { + style[prop] = toProp.strValue; // to val + + this.applyBypass(ele, prop, initVal); // from val + + anyPrev = true; + } + } // end if props allow ani + // can't transition if there's nothing previous to transition from + + + if (!anyPrev) { + return; + } + + _p.transitioning = true; + new Promise$1(function (resolve) { + if (delay > 0) { + ele.delayAnimation(delay).play().promise().then(resolve); + } else { + resolve(); + } + }).then(function () { + return ele.animation({ + style: style, + duration: duration, + easing: ele.pstyle('transition-timing-function').value, + queue: false + }).play().promise(); + }).then(function () { + // if( !isBypass ){ + self.removeBypasses(ele, props); + ele.emitAndNotify('style'); // } + + _p.transitioning = false; + }); + } else if (_p.transitioning) { + this.removeBypasses(ele, props); + ele.emitAndNotify('style'); + _p.transitioning = false; + } + }; + + styfn$8.checkTrigger = function (ele, name, fromValue, toValue, getTrigger, onTrigger) { + var prop = this.properties[name]; + var triggerCheck = getTrigger(prop); + + if (triggerCheck != null && triggerCheck(fromValue, toValue)) { + onTrigger(prop); + } + }; + + styfn$8.checkZOrderTrigger = function (ele, name, fromValue, toValue) { + var _this = this; + + this.checkTrigger(ele, name, fromValue, toValue, function (prop) { + return prop.triggersZOrder; + }, function () { + _this._private.cy.notify('zorder', ele); + }); + }; + + styfn$8.checkBoundsTrigger = function (ele, name, fromValue, toValue) { + this.checkTrigger(ele, name, fromValue, toValue, function (prop) { + return prop.triggersBounds; + }, function (prop) { + ele.dirtyCompoundBoundsCache(); + ele.dirtyBoundingBoxCache(); // if the prop change makes the bb of pll bezier edges invalid, + // then dirty the pll edge bb cache as well + + if ( // only for beziers -- so performance of other edges isn't affected + prop.triggersBoundsOfParallelBeziers && (name === 'curve-style' && (fromValue === 'bezier' || toValue === 'bezier') || name === 'display' && (fromValue === 'none' || toValue === 'none'))) { + ele.parallelEdges().forEach(function (pllEdge) { + if (pllEdge.isBundledBezier()) { + pllEdge.dirtyBoundingBoxCache(); + } + }); + } + }); + }; + + styfn$8.checkTriggers = function (ele, name, fromValue, toValue) { + ele.dirtyStyleCache(); + this.checkZOrderTrigger(ele, name, fromValue, toValue); + this.checkBoundsTrigger(ele, name, fromValue, toValue); + }; + + var styfn$7 = {}; // bypasses are applied to an existing style on an element, and just tacked on temporarily + // returns true iff application was successful for at least 1 specified property + + styfn$7.applyBypass = function (eles, name, value, updateTransitions) { + var self = this; + var props = []; + var isBypass = true; // put all the properties (can specify one or many) in an array after parsing them + + if (name === '*' || name === '**') { + // apply to all property names + if (value !== undefined) { + for (var i = 0; i < self.properties.length; i++) { + var prop = self.properties[i]; + var _name = prop.name; + var parsedProp = this.parse(_name, value, true); + + if (parsedProp) { + props.push(parsedProp); + } + } + } + } else if (string(name)) { + // then parse the single property + var _parsedProp = this.parse(name, value, true); + + if (_parsedProp) { + props.push(_parsedProp); + } + } else if (plainObject(name)) { + // then parse each property + var specifiedProps = name; + updateTransitions = value; + var names = Object.keys(specifiedProps); + + for (var _i = 0; _i < names.length; _i++) { + var _name2 = names[_i]; + var _value = specifiedProps[_name2]; + + if (_value === undefined) { + // try camel case name too + _value = specifiedProps[dash2camel(_name2)]; + } + + if (_value !== undefined) { + var _parsedProp2 = this.parse(_name2, _value, true); + + if (_parsedProp2) { + props.push(_parsedProp2); + } + } + } + } else { + // can't do anything without well defined properties + return false; + } // we've failed if there are no valid properties + + + if (props.length === 0) { + return false; + } // now, apply the bypass properties on the elements + + + var ret = false; // return true if at least one succesful bypass applied + + for (var _i2 = 0; _i2 < eles.length; _i2++) { + // for each ele + var ele = eles[_i2]; + var diffProps = {}; + var diffProp = void 0; + + for (var j = 0; j < props.length; j++) { + // for each prop + var _prop = props[j]; + + if (updateTransitions) { + var prevProp = ele.pstyle(_prop.name); + diffProp = diffProps[_prop.name] = { + prev: prevProp + }; + } + + ret = this.applyParsedProperty(ele, copy(_prop)) || ret; + + if (updateTransitions) { + diffProp.next = ele.pstyle(_prop.name); + } + } // for props + + + if (ret) { + this.updateStyleHints(ele); + } + + if (updateTransitions) { + this.updateTransitions(ele, diffProps, isBypass); + } + } // for eles + + + return ret; + }; // only useful in specific cases like animation + + + styfn$7.overrideBypass = function (eles, name, value) { + name = camel2dash(name); + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var prop = ele._private.style[name]; + var type = this.properties[name].type; + var isColor = type.color; + var isMulti = type.mutiple; + var oldValue = !prop ? null : prop.pfValue != null ? prop.pfValue : prop.value; + + if (!prop || !prop.bypass) { + // need a bypass if one doesn't exist + this.applyBypass(ele, name, value); + } else { + prop.value = value; + + if (prop.pfValue != null) { + prop.pfValue = value; + } + + if (isColor) { + prop.strValue = 'rgb(' + value.join(',') + ')'; + } else if (isMulti) { + prop.strValue = value.join(' '); + } else { + prop.strValue = '' + value; + } + + this.updateStyleHints(ele); + } + + this.checkTriggers(ele, name, oldValue, value); + } + }; + + styfn$7.removeAllBypasses = function (eles, updateTransitions) { + return this.removeBypasses(eles, this.propertyNames, updateTransitions); + }; + + styfn$7.removeBypasses = function (eles, props, updateTransitions) { + var isBypass = true; + + for (var j = 0; j < eles.length; j++) { + var ele = eles[j]; + var diffProps = {}; + + for (var i = 0; i < props.length; i++) { + var name = props[i]; + var prop = this.properties[name]; + var prevProp = ele.pstyle(prop.name); + + if (!prevProp || !prevProp.bypass) { + // if a bypass doesn't exist for the prop, nothing needs to be removed + continue; + } + + var value = ''; // empty => remove bypass + + var parsedProp = this.parse(name, value, true); + var diffProp = diffProps[prop.name] = { + prev: prevProp + }; + this.applyParsedProperty(ele, parsedProp); + diffProp.next = ele.pstyle(prop.name); + } // for props + + + this.updateStyleHints(ele); + + if (updateTransitions) { + this.updateTransitions(ele, diffProps, isBypass); + } + } // for eles + + }; + + var styfn$6 = {}; // gets what an em size corresponds to in pixels relative to a dom element + + styfn$6.getEmSizeInPixels = function () { + var px = this.containerCss('font-size'); + + if (px != null) { + return parseFloat(px); + } else { + return 1; // for headless + } + }; // gets css property from the core container + + + styfn$6.containerCss = function (propName) { + var cy = this._private.cy; + var domElement = cy.container(); + var containerWindow = cy.window(); + + if (containerWindow && domElement && containerWindow.getComputedStyle) { + return containerWindow.getComputedStyle(domElement).getPropertyValue(propName); + } + }; + + var styfn$5 = {}; // gets the rendered style for an element + + styfn$5.getRenderedStyle = function (ele, prop) { + if (prop) { + return this.getStylePropertyValue(ele, prop, true); + } else { + return this.getRawStyle(ele, true); + } + }; // gets the raw style for an element + + + styfn$5.getRawStyle = function (ele, isRenderedVal) { + var self = this; + ele = ele[0]; // insure it's an element + + if (ele) { + var rstyle = {}; + + for (var i = 0; i < self.properties.length; i++) { + var prop = self.properties[i]; + var val = self.getStylePropertyValue(ele, prop.name, isRenderedVal); + + if (val != null) { + rstyle[prop.name] = val; + rstyle[dash2camel(prop.name)] = val; + } + } + + return rstyle; + } + }; + + styfn$5.getIndexedStyle = function (ele, property, subproperty, index) { + var pstyle = ele.pstyle(property)[subproperty][index]; + return pstyle != null ? pstyle : ele.cy().style().getDefaultProperty(property)[subproperty][0]; + }; + + styfn$5.getStylePropertyValue = function (ele, propName, isRenderedVal) { + var self = this; + ele = ele[0]; // insure it's an element + + if (ele) { + var prop = self.properties[propName]; + + if (prop.alias) { + prop = prop.pointsTo; + } + + var type = prop.type; + var styleProp = ele.pstyle(prop.name); + + if (styleProp) { + var value = styleProp.value, + units = styleProp.units, + strValue = styleProp.strValue; + + if (isRenderedVal && type.number && value != null && number$1(value)) { + var zoom = ele.cy().zoom(); + + var getRenderedValue = function getRenderedValue(val) { + return val * zoom; + }; + + var getValueStringWithUnits = function getValueStringWithUnits(val, units) { + return getRenderedValue(val) + units; + }; + + var isArrayValue = array(value); + var haveUnits = isArrayValue ? units.every(function (u) { + return u != null; + }) : units != null; + + if (haveUnits) { + if (isArrayValue) { + return value.map(function (v, i) { + return getValueStringWithUnits(v, units[i]); + }).join(' '); + } else { + return getValueStringWithUnits(value, units); + } + } else { + if (isArrayValue) { + return value.map(function (v) { + return string(v) ? v : '' + getRenderedValue(v); + }).join(' '); + } else { + return '' + getRenderedValue(value); + } + } + } else if (strValue != null) { + return strValue; + } + } + + return null; + } + }; + + styfn$5.getAnimationStartStyle = function (ele, aniProps) { + var rstyle = {}; + + for (var i = 0; i < aniProps.length; i++) { + var aniProp = aniProps[i]; + var name = aniProp.name; + var styleProp = ele.pstyle(name); + + if (styleProp !== undefined) { + // then make a prop of it + if (plainObject(styleProp)) { + styleProp = this.parse(name, styleProp.strValue); + } else { + styleProp = this.parse(name, styleProp); + } + } + + if (styleProp) { + rstyle[name] = styleProp; + } + } + + return rstyle; + }; + + styfn$5.getPropsList = function (propsObj) { + var self = this; + var rstyle = []; + var style = propsObj; + var props = self.properties; + + if (style) { + var names = Object.keys(style); + + for (var i = 0; i < names.length; i++) { + var name = names[i]; + var val = style[name]; + var prop = props[name] || props[camel2dash(name)]; + var styleProp = this.parse(prop.name, val); + + if (styleProp) { + rstyle.push(styleProp); + } + } + } + + return rstyle; + }; + + styfn$5.getNonDefaultPropertiesHash = function (ele, propNames, seed) { + var hash = seed.slice(); + var name, val, strVal, chVal; + var i, j; + + for (i = 0; i < propNames.length; i++) { + name = propNames[i]; + val = ele.pstyle(name, false); + + if (val == null) { + continue; + } else if (val.pfValue != null) { + hash[0] = hashInt(chVal, hash[0]); + hash[1] = hashIntAlt(chVal, hash[1]); + } else { + strVal = val.strValue; + + for (j = 0; j < strVal.length; j++) { + chVal = strVal.charCodeAt(j); + hash[0] = hashInt(chVal, hash[0]); + hash[1] = hashIntAlt(chVal, hash[1]); + } + } + } + + return hash; + }; + + styfn$5.getPropertiesHash = styfn$5.getNonDefaultPropertiesHash; + + var styfn$4 = {}; + + styfn$4.appendFromJson = function (json) { + var style = this; + + for (var i = 0; i < json.length; i++) { + var context = json[i]; + var selector = context.selector; + var props = context.style || context.css; + var names = Object.keys(props); + style.selector(selector); // apply selector + + for (var j = 0; j < names.length; j++) { + var name = names[j]; + var value = props[name]; + style.css(name, value); // apply property + } + } + + return style; + }; // accessible cy.style() function + + + styfn$4.fromJson = function (json) { + var style = this; + style.resetToDefault(); + style.appendFromJson(json); + return style; + }; // get json from cy.style() api + + + styfn$4.json = function () { + var json = []; + + for (var i = this.defaultLength; i < this.length; i++) { + var cxt = this[i]; + var selector = cxt.selector; + var props = cxt.properties; + var css = {}; + + for (var j = 0; j < props.length; j++) { + var prop = props[j]; + css[prop.name] = prop.strValue; + } + + json.push({ + selector: !selector ? 'core' : selector.toString(), + style: css + }); + } + + return json; + }; + + var styfn$3 = {}; + + styfn$3.appendFromString = function (string) { + var self = this; + var style = this; + var remaining = '' + string; + var selAndBlockStr; + var blockRem; + var propAndValStr; // remove comments from the style string + + remaining = remaining.replace(/[/][*](\s|.)+?[*][/]/g, ''); + + function removeSelAndBlockFromRemaining() { + // remove the parsed selector and block from the remaining text to parse + if (remaining.length > selAndBlockStr.length) { + remaining = remaining.substr(selAndBlockStr.length); + } else { + remaining = ''; + } + } + + function removePropAndValFromRem() { + // remove the parsed property and value from the remaining block text to parse + if (blockRem.length > propAndValStr.length) { + blockRem = blockRem.substr(propAndValStr.length); + } else { + blockRem = ''; + } + } + + for (;;) { + var nothingLeftToParse = remaining.match(/^\s*$/); + + if (nothingLeftToParse) { + break; + } + + var selAndBlock = remaining.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/); + + if (!selAndBlock) { + warn('Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: ' + remaining); + break; + } + + selAndBlockStr = selAndBlock[0]; // parse the selector + + var selectorStr = selAndBlock[1]; + + if (selectorStr !== 'core') { + var selector = new Selector(selectorStr); + + if (selector.invalid) { + warn('Skipping parsing of block: Invalid selector found in string stylesheet: ' + selectorStr); // skip this selector and block + + removeSelAndBlockFromRemaining(); + continue; + } + } // parse the block of properties and values + + + var blockStr = selAndBlock[2]; + var invalidBlock = false; + blockRem = blockStr; + var props = []; + + for (;;) { + var _nothingLeftToParse = blockRem.match(/^\s*$/); + + if (_nothingLeftToParse) { + break; + } + + var propAndVal = blockRem.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/); + + if (!propAndVal) { + warn('Skipping parsing of block: Invalid formatting of style property and value definitions found in:' + blockStr); + invalidBlock = true; + break; + } + + propAndValStr = propAndVal[0]; + var propStr = propAndVal[1]; + var valStr = propAndVal[2]; + var prop = self.properties[propStr]; + + if (!prop) { + warn('Skipping property: Invalid property name in: ' + propAndValStr); // skip this property in the block + + removePropAndValFromRem(); + continue; + } + + var parsedProp = style.parse(propStr, valStr); + + if (!parsedProp) { + warn('Skipping property: Invalid property definition in: ' + propAndValStr); // skip this property in the block + + removePropAndValFromRem(); + continue; + } + + props.push({ + name: propStr, + val: valStr + }); + removePropAndValFromRem(); + } + + if (invalidBlock) { + removeSelAndBlockFromRemaining(); + break; + } // put the parsed block in the style + + + style.selector(selectorStr); + + for (var i = 0; i < props.length; i++) { + var _prop = props[i]; + style.css(_prop.name, _prop.val); + } + + removeSelAndBlockFromRemaining(); + } + + return style; + }; + + styfn$3.fromString = function (string) { + var style = this; + style.resetToDefault(); + style.appendFromString(string); + return style; + }; + + var styfn$2 = {}; + + (function () { + var number$1 = number; + var rgba = rgbaNoBackRefs; + var hsla = hslaNoBackRefs; + var hex3$1 = hex3; + var hex6$1 = hex6; + + var data = function data(prefix) { + return '^' + prefix + '\\s*\\(\\s*([\\w\\.]+)\\s*\\)$'; + }; + + var mapData = function mapData(prefix) { + var mapArg = number$1 + '|\\w+|' + rgba + '|' + hsla + '|' + hex3$1 + '|' + hex6$1; + return '^' + prefix + '\\s*\\(([\\w\\.]+)\\s*\\,\\s*(' + number$1 + ')\\s*\\,\\s*(' + number$1 + ')\\s*,\\s*(' + mapArg + ')\\s*\\,\\s*(' + mapArg + ')\\)$'; + }; + + var urlRegexes = ['^url\\s*\\(\\s*[\'"]?(.+?)[\'"]?\\s*\\)$', '^(none)$', '^(.+)$']; // each visual style property has a type and needs to be validated according to it + + styfn$2.types = { + time: { + number: true, + min: 0, + units: 's|ms', + implicitUnits: 'ms' + }, + percent: { + number: true, + min: 0, + max: 100, + units: '%', + implicitUnits: '%' + }, + percentages: { + number: true, + min: 0, + max: 100, + units: '%', + implicitUnits: '%', + multiple: true + }, + zeroOneNumber: { + number: true, + min: 0, + max: 1, + unitless: true + }, + zeroOneNumbers: { + number: true, + min: 0, + max: 1, + unitless: true, + multiple: true + }, + nOneOneNumber: { + number: true, + min: -1, + max: 1, + unitless: true + }, + nonNegativeInt: { + number: true, + min: 0, + integer: true, + unitless: true + }, + position: { + enums: ['parent', 'origin'] + }, + nodeSize: { + number: true, + min: 0, + enums: ['label'] + }, + number: { + number: true, + unitless: true + }, + numbers: { + number: true, + unitless: true, + multiple: true + }, + positiveNumber: { + number: true, + unitless: true, + min: 0, + strictMin: true + }, + size: { + number: true, + min: 0 + }, + bidirectionalSize: { + number: true + }, + // allows negative + bidirectionalSizeMaybePercent: { + number: true, + allowPercent: true + }, + // allows negative + bidirectionalSizes: { + number: true, + multiple: true + }, + // allows negative + sizeMaybePercent: { + number: true, + min: 0, + allowPercent: true + }, + axisDirection: { + enums: ['horizontal', 'leftward', 'rightward', 'vertical', 'upward', 'downward', 'auto'] + }, + paddingRelativeTo: { + enums: ['width', 'height', 'average', 'min', 'max'] + }, + bgWH: { + number: true, + min: 0, + allowPercent: true, + enums: ['auto'], + multiple: true + }, + bgPos: { + number: true, + allowPercent: true, + multiple: true + }, + bgRelativeTo: { + enums: ['inner', 'include-padding'], + multiple: true + }, + bgRepeat: { + enums: ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'], + multiple: true + }, + bgFit: { + enums: ['none', 'contain', 'cover'], + multiple: true + }, + bgCrossOrigin: { + enums: ['anonymous', 'use-credentials', 'null'], + multiple: true + }, + bgClip: { + enums: ['none', 'node'], + multiple: true + }, + bgContainment: { + enums: ['inside', 'over'], + multiple: true + }, + color: { + color: true + }, + colors: { + color: true, + multiple: true + }, + fill: { + enums: ['solid', 'linear-gradient', 'radial-gradient'] + }, + bool: { + enums: ['yes', 'no'] + }, + bools: { + enums: ['yes', 'no'], + multiple: true + }, + lineStyle: { + enums: ['solid', 'dotted', 'dashed'] + }, + lineCap: { + enums: ['butt', 'round', 'square'] + }, + borderStyle: { + enums: ['solid', 'dotted', 'dashed', 'double'] + }, + curveStyle: { + enums: ['bezier', 'unbundled-bezier', 'haystack', 'segments', 'straight', 'straight-triangle', 'taxi'] + }, + fontFamily: { + regex: '^([\\w- \\"]+(?:\\s*,\\s*[\\w- \\"]+)*)$' + }, + fontStyle: { + enums: ['italic', 'normal', 'oblique'] + }, + fontWeight: { + enums: ['normal', 'bold', 'bolder', 'lighter', '100', '200', '300', '400', '500', '600', '800', '900', 100, 200, 300, 400, 500, 600, 700, 800, 900] + }, + textDecoration: { + enums: ['none', 'underline', 'overline', 'line-through'] + }, + textTransform: { + enums: ['none', 'uppercase', 'lowercase'] + }, + textWrap: { + enums: ['none', 'wrap', 'ellipsis'] + }, + textOverflowWrap: { + enums: ['whitespace', 'anywhere'] + }, + textBackgroundShape: { + enums: ['rectangle', 'roundrectangle', 'round-rectangle'] + }, + nodeShape: { + enums: ['rectangle', 'roundrectangle', 'round-rectangle', 'cutrectangle', 'cut-rectangle', 'bottomroundrectangle', 'bottom-round-rectangle', 'barrel', 'ellipse', 'triangle', 'round-triangle', 'square', 'pentagon', 'round-pentagon', 'hexagon', 'round-hexagon', 'concavehexagon', 'concave-hexagon', 'heptagon', 'round-heptagon', 'octagon', 'round-octagon', 'tag', 'round-tag', 'star', 'diamond', 'round-diamond', 'vee', 'rhomboid', 'right-rhomboid', 'polygon'] + }, + overlayShape: { + enums: ['roundrectangle', 'round-rectangle', 'ellipse'] + }, + compoundIncludeLabels: { + enums: ['include', 'exclude'] + }, + arrowShape: { + enums: ['tee', 'triangle', 'triangle-tee', 'circle-triangle', 'triangle-cross', 'triangle-backcurve', 'vee', 'square', 'circle', 'diamond', 'chevron', 'none'] + }, + arrowFill: { + enums: ['filled', 'hollow'] + }, + display: { + enums: ['element', 'none'] + }, + visibility: { + enums: ['hidden', 'visible'] + }, + zCompoundDepth: { + enums: ['bottom', 'orphan', 'auto', 'top'] + }, + zIndexCompare: { + enums: ['auto', 'manual'] + }, + valign: { + enums: ['top', 'center', 'bottom'] + }, + halign: { + enums: ['left', 'center', 'right'] + }, + justification: { + enums: ['left', 'center', 'right', 'auto'] + }, + text: { + string: true + }, + data: { + mapping: true, + regex: data('data') + }, + layoutData: { + mapping: true, + regex: data('layoutData') + }, + scratch: { + mapping: true, + regex: data('scratch') + }, + mapData: { + mapping: true, + regex: mapData('mapData') + }, + mapLayoutData: { + mapping: true, + regex: mapData('mapLayoutData') + }, + mapScratch: { + mapping: true, + regex: mapData('mapScratch') + }, + fn: { + mapping: true, + fn: true + }, + url: { + regexes: urlRegexes, + singleRegexMatchValue: true + }, + urls: { + regexes: urlRegexes, + singleRegexMatchValue: true, + multiple: true + }, + propList: { + propList: true + }, + angle: { + number: true, + units: 'deg|rad', + implicitUnits: 'rad' + }, + textRotation: { + number: true, + units: 'deg|rad', + implicitUnits: 'rad', + enums: ['none', 'autorotate'] + }, + polygonPointList: { + number: true, + multiple: true, + evenMultiple: true, + min: -1, + max: 1, + unitless: true + }, + edgeDistances: { + enums: ['intersection', 'node-position'] + }, + edgeEndpoint: { + number: true, + multiple: true, + units: '%|px|em|deg|rad', + implicitUnits: 'px', + enums: ['inside-to-node', 'outside-to-node', 'outside-to-node-or-label', 'outside-to-line', 'outside-to-line-or-label'], + singleEnum: true, + validate: function validate(valArr, unitsArr) { + switch (valArr.length) { + case 2: + // can be % or px only + return unitsArr[0] !== 'deg' && unitsArr[0] !== 'rad' && unitsArr[1] !== 'deg' && unitsArr[1] !== 'rad'; + + case 1: + // can be enum, deg, or rad only + return string(valArr[0]) || unitsArr[0] === 'deg' || unitsArr[0] === 'rad'; + + default: + return false; + } + } + }, + easing: { + regexes: ['^(spring)\\s*\\(\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*\\)$', '^(cubic-bezier)\\s*\\(\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*,\\s*(' + number$1 + ')\\s*\\)$'], + enums: ['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'ease-in-sine', 'ease-out-sine', 'ease-in-out-sine', 'ease-in-quad', 'ease-out-quad', 'ease-in-out-quad', 'ease-in-cubic', 'ease-out-cubic', 'ease-in-out-cubic', 'ease-in-quart', 'ease-out-quart', 'ease-in-out-quart', 'ease-in-quint', 'ease-out-quint', 'ease-in-out-quint', 'ease-in-expo', 'ease-out-expo', 'ease-in-out-expo', 'ease-in-circ', 'ease-out-circ', 'ease-in-out-circ'] + }, + gradientDirection: { + enums: ['to-bottom', 'to-top', 'to-left', 'to-right', 'to-bottom-right', 'to-bottom-left', 'to-top-right', 'to-top-left', 'to-right-bottom', 'to-left-bottom', 'to-right-top', 'to-left-top' // different order + ] + }, + boundsExpansion: { + number: true, + multiple: true, + min: 0, + validate: function validate(valArr) { + var length = valArr.length; + return length === 1 || length === 2 || length === 4; + } + } + }; + var diff = { + zeroNonZero: function zeroNonZero(val1, val2) { + if ((val1 == null || val2 == null) && val1 !== val2) { + return true; // null cases could represent any value + } + + if (val1 == 0 && val2 != 0) { + return true; + } else if (val1 != 0 && val2 == 0) { + return true; + } else { + return false; + } + }, + any: function any(val1, val2) { + return val1 != val2; + }, + emptyNonEmpty: function emptyNonEmpty(str1, str2) { + var empty1 = emptyString(str1); + var empty2 = emptyString(str2); + return empty1 && !empty2 || !empty1 && empty2; + } + }; // define visual style properties + // + // - n.b. adding a new group of props may require updates to updateStyleHints() + // - adding new props to an existing group gets handled automatically + + var t = styfn$2.types; + var mainLabel = [{ + name: 'label', + type: t.text, + triggersBounds: diff.any, + triggersZOrder: diff.emptyNonEmpty + }, { + name: 'text-rotation', + type: t.textRotation, + triggersBounds: diff.any + }, { + name: 'text-margin-x', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'text-margin-y', + type: t.bidirectionalSize, + triggersBounds: diff.any + }]; + var sourceLabel = [{ + name: 'source-label', + type: t.text, + triggersBounds: diff.any + }, { + name: 'source-text-rotation', + type: t.textRotation, + triggersBounds: diff.any + }, { + name: 'source-text-margin-x', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'source-text-margin-y', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'source-text-offset', + type: t.size, + triggersBounds: diff.any + }]; + var targetLabel = [{ + name: 'target-label', + type: t.text, + triggersBounds: diff.any + }, { + name: 'target-text-rotation', + type: t.textRotation, + triggersBounds: diff.any + }, { + name: 'target-text-margin-x', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'target-text-margin-y', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'target-text-offset', + type: t.size, + triggersBounds: diff.any + }]; + var labelDimensions = [{ + name: 'font-family', + type: t.fontFamily, + triggersBounds: diff.any + }, { + name: 'font-style', + type: t.fontStyle, + triggersBounds: diff.any + }, { + name: 'font-weight', + type: t.fontWeight, + triggersBounds: diff.any + }, { + name: 'font-size', + type: t.size, + triggersBounds: diff.any + }, { + name: 'text-transform', + type: t.textTransform, + triggersBounds: diff.any + }, { + name: 'text-wrap', + type: t.textWrap, + triggersBounds: diff.any + }, { + name: 'text-overflow-wrap', + type: t.textOverflowWrap, + triggersBounds: diff.any + }, { + name: 'text-max-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'text-outline-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'line-height', + type: t.positiveNumber, + triggersBounds: diff.any + }]; + var commonLabel = [{ + name: 'text-valign', + type: t.valign, + triggersBounds: diff.any + }, { + name: 'text-halign', + type: t.halign, + triggersBounds: diff.any + }, { + name: 'color', + type: t.color + }, { + name: 'text-outline-color', + type: t.color + }, { + name: 'text-outline-opacity', + type: t.zeroOneNumber + }, { + name: 'text-background-color', + type: t.color + }, { + name: 'text-background-opacity', + type: t.zeroOneNumber + }, { + name: 'text-background-padding', + type: t.size, + triggersBounds: diff.any + }, { + name: 'text-border-opacity', + type: t.zeroOneNumber + }, { + name: 'text-border-color', + type: t.color + }, { + name: 'text-border-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'text-border-style', + type: t.borderStyle, + triggersBounds: diff.any + }, { + name: 'text-background-shape', + type: t.textBackgroundShape, + triggersBounds: diff.any + }, { + name: 'text-justification', + type: t.justification + }]; + var behavior = [{ + name: 'events', + type: t.bool + }, { + name: 'text-events', + type: t.bool + }]; + var visibility = [{ + name: 'display', + type: t.display, + triggersZOrder: diff.any, + triggersBounds: diff.any, + triggersBoundsOfParallelBeziers: true + }, { + name: 'visibility', + type: t.visibility, + triggersZOrder: diff.any + }, { + name: 'opacity', + type: t.zeroOneNumber, + triggersZOrder: diff.zeroNonZero + }, { + name: 'text-opacity', + type: t.zeroOneNumber + }, { + name: 'min-zoomed-font-size', + type: t.size + }, { + name: 'z-compound-depth', + type: t.zCompoundDepth, + triggersZOrder: diff.any + }, { + name: 'z-index-compare', + type: t.zIndexCompare, + triggersZOrder: diff.any + }, { + name: 'z-index', + type: t.nonNegativeInt, + triggersZOrder: diff.any + }]; + var overlay = [{ + name: 'overlay-padding', + type: t.size, + triggersBounds: diff.any + }, { + name: 'overlay-color', + type: t.color + }, { + name: 'overlay-opacity', + type: t.zeroOneNumber, + triggersBounds: diff.zeroNonZero + }, { + name: 'overlay-shape', + type: t.overlayShape, + triggersBounds: diff.any + }]; + var underlay = [{ + name: 'underlay-padding', + type: t.size, + triggersBounds: diff.any + }, { + name: 'underlay-color', + type: t.color + }, { + name: 'underlay-opacity', + type: t.zeroOneNumber, + triggersBounds: diff.zeroNonZero + }, { + name: 'underlay-shape', + type: t.overlayShape, + triggersBounds: diff.any + }]; + var transition = [{ + name: 'transition-property', + type: t.propList + }, { + name: 'transition-duration', + type: t.time + }, { + name: 'transition-delay', + type: t.time + }, { + name: 'transition-timing-function', + type: t.easing + }]; + + var nodeSizeHashOverride = function nodeSizeHashOverride(ele, parsedProp) { + if (parsedProp.value === 'label') { + return -ele.poolIndex(); // no hash key hits is using label size (hitrate for perf probably low anyway) + } else { + return parsedProp.pfValue; + } + }; + + var nodeBody = [{ + name: 'height', + type: t.nodeSize, + triggersBounds: diff.any, + hashOverride: nodeSizeHashOverride + }, { + name: 'width', + type: t.nodeSize, + triggersBounds: diff.any, + hashOverride: nodeSizeHashOverride + }, { + name: 'shape', + type: t.nodeShape, + triggersBounds: diff.any + }, { + name: 'shape-polygon-points', + type: t.polygonPointList, + triggersBounds: diff.any + }, { + name: 'background-color', + type: t.color + }, { + name: 'background-fill', + type: t.fill + }, { + name: 'background-opacity', + type: t.zeroOneNumber + }, { + name: 'background-blacken', + type: t.nOneOneNumber + }, { + name: 'background-gradient-stop-colors', + type: t.colors + }, { + name: 'background-gradient-stop-positions', + type: t.percentages + }, { + name: 'background-gradient-direction', + type: t.gradientDirection + }, { + name: 'padding', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'padding-relative-to', + type: t.paddingRelativeTo, + triggersBounds: diff.any + }, { + name: 'bounds-expansion', + type: t.boundsExpansion, + triggersBounds: diff.any + }]; + var nodeBorder = [{ + name: 'border-color', + type: t.color + }, { + name: 'border-opacity', + type: t.zeroOneNumber + }, { + name: 'border-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'border-style', + type: t.borderStyle + }]; + var backgroundImage = [{ + name: 'background-image', + type: t.urls + }, { + name: 'background-image-crossorigin', + type: t.bgCrossOrigin + }, { + name: 'background-image-opacity', + type: t.zeroOneNumbers + }, { + name: 'background-image-containment', + type: t.bgContainment + }, { + name: 'background-image-smoothing', + type: t.bools + }, { + name: 'background-position-x', + type: t.bgPos + }, { + name: 'background-position-y', + type: t.bgPos + }, { + name: 'background-width-relative-to', + type: t.bgRelativeTo + }, { + name: 'background-height-relative-to', + type: t.bgRelativeTo + }, { + name: 'background-repeat', + type: t.bgRepeat + }, { + name: 'background-fit', + type: t.bgFit + }, { + name: 'background-clip', + type: t.bgClip + }, { + name: 'background-width', + type: t.bgWH + }, { + name: 'background-height', + type: t.bgWH + }, { + name: 'background-offset-x', + type: t.bgPos + }, { + name: 'background-offset-y', + type: t.bgPos + }]; + var compound = [{ + name: 'position', + type: t.position, + triggersBounds: diff.any + }, { + name: 'compound-sizing-wrt-labels', + type: t.compoundIncludeLabels, + triggersBounds: diff.any + }, { + name: 'min-width', + type: t.size, + triggersBounds: diff.any + }, { + name: 'min-width-bias-left', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'min-width-bias-right', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'min-height', + type: t.size, + triggersBounds: diff.any + }, { + name: 'min-height-bias-top', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'min-height-bias-bottom', + type: t.sizeMaybePercent, + triggersBounds: diff.any + }]; + var edgeLine = [{ + name: 'line-style', + type: t.lineStyle + }, { + name: 'line-color', + type: t.color + }, { + name: 'line-fill', + type: t.fill + }, { + name: 'line-cap', + type: t.lineCap + }, { + name: 'line-opacity', + type: t.zeroOneNumber + }, { + name: 'line-dash-pattern', + type: t.numbers + }, { + name: 'line-dash-offset', + type: t.number + }, { + name: 'line-gradient-stop-colors', + type: t.colors + }, { + name: 'line-gradient-stop-positions', + type: t.percentages + }, { + name: 'curve-style', + type: t.curveStyle, + triggersBounds: diff.any, + triggersBoundsOfParallelBeziers: true + }, { + name: 'haystack-radius', + type: t.zeroOneNumber, + triggersBounds: diff.any + }, { + name: 'source-endpoint', + type: t.edgeEndpoint, + triggersBounds: diff.any + }, { + name: 'target-endpoint', + type: t.edgeEndpoint, + triggersBounds: diff.any + }, { + name: 'control-point-step-size', + type: t.size, + triggersBounds: diff.any + }, { + name: 'control-point-distances', + type: t.bidirectionalSizes, + triggersBounds: diff.any + }, { + name: 'control-point-weights', + type: t.numbers, + triggersBounds: diff.any + }, { + name: 'segment-distances', + type: t.bidirectionalSizes, + triggersBounds: diff.any + }, { + name: 'segment-weights', + type: t.numbers, + triggersBounds: diff.any + }, { + name: 'taxi-turn', + type: t.bidirectionalSizeMaybePercent, + triggersBounds: diff.any + }, { + name: 'taxi-turn-min-distance', + type: t.size, + triggersBounds: diff.any + }, { + name: 'taxi-direction', + type: t.axisDirection, + triggersBounds: diff.any + }, { + name: 'edge-distances', + type: t.edgeDistances, + triggersBounds: diff.any + }, { + name: 'arrow-scale', + type: t.positiveNumber, + triggersBounds: diff.any + }, { + name: 'loop-direction', + type: t.angle, + triggersBounds: diff.any + }, { + name: 'loop-sweep', + type: t.angle, + triggersBounds: diff.any + }, { + name: 'source-distance-from-node', + type: t.size, + triggersBounds: diff.any + }, { + name: 'target-distance-from-node', + type: t.size, + triggersBounds: diff.any + }]; + var ghost = [{ + name: 'ghost', + type: t.bool, + triggersBounds: diff.any + }, { + name: 'ghost-offset-x', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'ghost-offset-y', + type: t.bidirectionalSize, + triggersBounds: diff.any + }, { + name: 'ghost-opacity', + type: t.zeroOneNumber + }]; + var core = [{ + name: 'selection-box-color', + type: t.color + }, { + name: 'selection-box-opacity', + type: t.zeroOneNumber + }, { + name: 'selection-box-border-color', + type: t.color + }, { + name: 'selection-box-border-width', + type: t.size + }, { + name: 'active-bg-color', + type: t.color + }, { + name: 'active-bg-opacity', + type: t.zeroOneNumber + }, { + name: 'active-bg-size', + type: t.size + }, { + name: 'outside-texture-bg-color', + type: t.color + }, { + name: 'outside-texture-bg-opacity', + type: t.zeroOneNumber + }]; // pie backgrounds for nodes + + var pie = []; + styfn$2.pieBackgroundN = 16; // because the pie properties are numbered, give access to a constant N (for renderer use) + + pie.push({ + name: 'pie-size', + type: t.sizeMaybePercent + }); + + for (var i = 1; i <= styfn$2.pieBackgroundN; i++) { + pie.push({ + name: 'pie-' + i + '-background-color', + type: t.color + }); + pie.push({ + name: 'pie-' + i + '-background-size', + type: t.percent + }); + pie.push({ + name: 'pie-' + i + '-background-opacity', + type: t.zeroOneNumber + }); + } // edge arrows + + + var edgeArrow = []; + var arrowPrefixes = styfn$2.arrowPrefixes = ['source', 'mid-source', 'target', 'mid-target']; + [{ + name: 'arrow-shape', + type: t.arrowShape, + triggersBounds: diff.any + }, { + name: 'arrow-color', + type: t.color + }, { + name: 'arrow-fill', + type: t.arrowFill + }].forEach(function (prop) { + arrowPrefixes.forEach(function (prefix) { + var name = prefix + '-' + prop.name; + var type = prop.type, + triggersBounds = prop.triggersBounds; + edgeArrow.push({ + name: name, + type: type, + triggersBounds: triggersBounds + }); + }); + }, {}); + var props = styfn$2.properties = [].concat(behavior, transition, visibility, overlay, underlay, ghost, commonLabel, labelDimensions, mainLabel, sourceLabel, targetLabel, nodeBody, nodeBorder, backgroundImage, pie, compound, edgeLine, edgeArrow, core); + var propGroups = styfn$2.propertyGroups = { + // common to all eles + behavior: behavior, + transition: transition, + visibility: visibility, + overlay: overlay, + underlay: underlay, + ghost: ghost, + // labels + commonLabel: commonLabel, + labelDimensions: labelDimensions, + mainLabel: mainLabel, + sourceLabel: sourceLabel, + targetLabel: targetLabel, + // node props + nodeBody: nodeBody, + nodeBorder: nodeBorder, + backgroundImage: backgroundImage, + pie: pie, + compound: compound, + // edge props + edgeLine: edgeLine, + edgeArrow: edgeArrow, + core: core + }; + var propGroupNames = styfn$2.propertyGroupNames = {}; + var propGroupKeys = styfn$2.propertyGroupKeys = Object.keys(propGroups); + propGroupKeys.forEach(function (key) { + propGroupNames[key] = propGroups[key].map(function (prop) { + return prop.name; + }); + propGroups[key].forEach(function (prop) { + return prop.groupKey = key; + }); + }); // define aliases + + var aliases = styfn$2.aliases = [{ + name: 'content', + pointsTo: 'label' + }, { + name: 'control-point-distance', + pointsTo: 'control-point-distances' + }, { + name: 'control-point-weight', + pointsTo: 'control-point-weights' + }, { + name: 'edge-text-rotation', + pointsTo: 'text-rotation' + }, { + name: 'padding-left', + pointsTo: 'padding' + }, { + name: 'padding-right', + pointsTo: 'padding' + }, { + name: 'padding-top', + pointsTo: 'padding' + }, { + name: 'padding-bottom', + pointsTo: 'padding' + }]; // list of property names + + styfn$2.propertyNames = props.map(function (p) { + return p.name; + }); // allow access of properties by name ( e.g. style.properties.height ) + + for (var _i = 0; _i < props.length; _i++) { + var prop = props[_i]; + props[prop.name] = prop; // allow lookup by name + } // map aliases + + + for (var _i2 = 0; _i2 < aliases.length; _i2++) { + var alias = aliases[_i2]; + var pointsToProp = props[alias.pointsTo]; + var aliasProp = { + name: alias.name, + alias: true, + pointsTo: pointsToProp + }; // add alias prop for parsing + + props.push(aliasProp); + props[alias.name] = aliasProp; // allow lookup by name + } + })(); + + styfn$2.getDefaultProperty = function (name) { + return this.getDefaultProperties()[name]; + }; + + styfn$2.getDefaultProperties = function () { + var _p = this._private; + + if (_p.defaultProperties != null) { + return _p.defaultProperties; + } + + var rawProps = extend({ + // core props + 'selection-box-color': '#ddd', + 'selection-box-opacity': 0.65, + 'selection-box-border-color': '#aaa', + 'selection-box-border-width': 1, + 'active-bg-color': 'black', + 'active-bg-opacity': 0.15, + 'active-bg-size': 30, + 'outside-texture-bg-color': '#000', + 'outside-texture-bg-opacity': 0.125, + // common node/edge props + 'events': 'yes', + 'text-events': 'no', + 'text-valign': 'top', + 'text-halign': 'center', + 'text-justification': 'auto', + 'line-height': 1, + 'color': '#000', + 'text-outline-color': '#000', + 'text-outline-width': 0, + 'text-outline-opacity': 1, + 'text-opacity': 1, + 'text-decoration': 'none', + 'text-transform': 'none', + 'text-wrap': 'none', + 'text-overflow-wrap': 'whitespace', + 'text-max-width': 9999, + 'text-background-color': '#000', + 'text-background-opacity': 0, + 'text-background-shape': 'rectangle', + 'text-background-padding': 0, + 'text-border-opacity': 0, + 'text-border-width': 0, + 'text-border-style': 'solid', + 'text-border-color': '#000', + 'font-family': 'Helvetica Neue, Helvetica, sans-serif', + 'font-style': 'normal', + 'font-weight': 'normal', + 'font-size': 16, + 'min-zoomed-font-size': 0, + 'text-rotation': 'none', + 'source-text-rotation': 'none', + 'target-text-rotation': 'none', + 'visibility': 'visible', + 'display': 'element', + 'opacity': 1, + 'z-compound-depth': 'auto', + 'z-index-compare': 'auto', + 'z-index': 0, + 'label': '', + 'text-margin-x': 0, + 'text-margin-y': 0, + 'source-label': '', + 'source-text-offset': 0, + 'source-text-margin-x': 0, + 'source-text-margin-y': 0, + 'target-label': '', + 'target-text-offset': 0, + 'target-text-margin-x': 0, + 'target-text-margin-y': 0, + 'overlay-opacity': 0, + 'overlay-color': '#000', + 'overlay-padding': 10, + 'overlay-shape': 'round-rectangle', + 'underlay-opacity': 0, + 'underlay-color': '#000', + 'underlay-padding': 10, + 'underlay-shape': 'round-rectangle', + 'transition-property': 'none', + 'transition-duration': 0, + 'transition-delay': 0, + 'transition-timing-function': 'linear', + // node props + 'background-blacken': 0, + 'background-color': '#999', + 'background-fill': 'solid', + 'background-opacity': 1, + 'background-image': 'none', + 'background-image-crossorigin': 'anonymous', + 'background-image-opacity': 1, + 'background-image-containment': 'inside', + 'background-image-smoothing': 'yes', + 'background-position-x': '50%', + 'background-position-y': '50%', + 'background-offset-x': 0, + 'background-offset-y': 0, + 'background-width-relative-to': 'include-padding', + 'background-height-relative-to': 'include-padding', + 'background-repeat': 'no-repeat', + 'background-fit': 'none', + 'background-clip': 'node', + 'background-width': 'auto', + 'background-height': 'auto', + 'border-color': '#000', + 'border-opacity': 1, + 'border-width': 0, + 'border-style': 'solid', + 'height': 30, + 'width': 30, + 'shape': 'ellipse', + 'shape-polygon-points': '-1, -1, 1, -1, 1, 1, -1, 1', + 'bounds-expansion': 0, + // node gradient + 'background-gradient-direction': 'to-bottom', + 'background-gradient-stop-colors': '#999', + 'background-gradient-stop-positions': '0%', + // ghost props + 'ghost': 'no', + 'ghost-offset-y': 0, + 'ghost-offset-x': 0, + 'ghost-opacity': 0, + // compound props + 'padding': 0, + 'padding-relative-to': 'width', + 'position': 'origin', + 'compound-sizing-wrt-labels': 'include', + 'min-width': 0, + 'min-width-bias-left': 0, + 'min-width-bias-right': 0, + 'min-height': 0, + 'min-height-bias-top': 0, + 'min-height-bias-bottom': 0 + }, { + // node pie bg + 'pie-size': '100%' + }, [{ + name: 'pie-{{i}}-background-color', + value: 'black' + }, { + name: 'pie-{{i}}-background-size', + value: '0%' + }, { + name: 'pie-{{i}}-background-opacity', + value: 1 + }].reduce(function (css, prop) { + for (var i = 1; i <= styfn$2.pieBackgroundN; i++) { + var name = prop.name.replace('{{i}}', i); + var val = prop.value; + css[name] = val; + } + + return css; + }, {}), { + // edge props + 'line-style': 'solid', + 'line-color': '#999', + 'line-fill': 'solid', + 'line-cap': 'butt', + 'line-opacity': 1, + 'line-gradient-stop-colors': '#999', + 'line-gradient-stop-positions': '0%', + 'control-point-step-size': 40, + 'control-point-weights': 0.5, + 'segment-weights': 0.5, + 'segment-distances': 20, + 'taxi-turn': '50%', + 'taxi-turn-min-distance': 10, + 'taxi-direction': 'auto', + 'edge-distances': 'intersection', + 'curve-style': 'haystack', + 'haystack-radius': 0, + 'arrow-scale': 1, + 'loop-direction': '-45deg', + 'loop-sweep': '-90deg', + 'source-distance-from-node': 0, + 'target-distance-from-node': 0, + 'source-endpoint': 'outside-to-node', + 'target-endpoint': 'outside-to-node', + 'line-dash-pattern': [6, 3], + 'line-dash-offset': 0 + }, [{ + name: 'arrow-shape', + value: 'none' + }, { + name: 'arrow-color', + value: '#999' + }, { + name: 'arrow-fill', + value: 'filled' + }].reduce(function (css, prop) { + styfn$2.arrowPrefixes.forEach(function (prefix) { + var name = prefix + '-' + prop.name; + var val = prop.value; + css[name] = val; + }); + return css; + }, {})); + var parsedProps = {}; + + for (var i = 0; i < this.properties.length; i++) { + var prop = this.properties[i]; + + if (prop.pointsTo) { + continue; + } + + var name = prop.name; + var val = rawProps[name]; + var parsedProp = this.parse(name, val); + parsedProps[name] = parsedProp; + } + + _p.defaultProperties = parsedProps; + return _p.defaultProperties; + }; + + styfn$2.addDefaultStylesheet = function () { + this.selector(':parent').css({ + 'shape': 'rectangle', + 'padding': 10, + 'background-color': '#eee', + 'border-color': '#ccc', + 'border-width': 1 + }).selector('edge').css({ + 'width': 3 + }).selector(':loop').css({ + 'curve-style': 'bezier' + }).selector('edge:compound').css({ + 'curve-style': 'bezier', + 'source-endpoint': 'outside-to-line', + 'target-endpoint': 'outside-to-line' + }).selector(':selected').css({ + 'background-color': '#0169D9', + 'line-color': '#0169D9', + 'source-arrow-color': '#0169D9', + 'target-arrow-color': '#0169D9', + 'mid-source-arrow-color': '#0169D9', + 'mid-target-arrow-color': '#0169D9' + }).selector(':parent:selected').css({ + 'background-color': '#CCE1F9', + 'border-color': '#aec8e5' + }).selector(':active').css({ + 'overlay-color': 'black', + 'overlay-padding': 10, + 'overlay-opacity': 0.25 + }); + this.defaultLength = this.length; + }; + + var styfn$1 = {}; // a caching layer for property parsing + + styfn$1.parse = function (name, value, propIsBypass, propIsFlat) { + var self = this; // function values can't be cached in all cases, and there isn't much benefit of caching them anyway + + if (fn$6(value)) { + return self.parseImplWarn(name, value, propIsBypass, propIsFlat); + } + + var flatKey = propIsFlat === 'mapping' || propIsFlat === true || propIsFlat === false || propIsFlat == null ? 'dontcare' : propIsFlat; + var bypassKey = propIsBypass ? 't' : 'f'; + var valueKey = '' + value; + var argHash = hashStrings(name, valueKey, bypassKey, flatKey); + var propCache = self.propCache = self.propCache || []; + var ret; + + if (!(ret = propCache[argHash])) { + ret = propCache[argHash] = self.parseImplWarn(name, value, propIsBypass, propIsFlat); + } // - bypasses can't be shared b/c the value can be changed by animations or otherwise overridden + // - mappings can't be shared b/c mappings are per-element + + + if (propIsBypass || propIsFlat === 'mapping') { + // need a copy since props are mutated later in their lifecycles + ret = copy(ret); + + if (ret) { + ret.value = copy(ret.value); // because it could be an array, e.g. colour + } + } + + return ret; + }; + + styfn$1.parseImplWarn = function (name, value, propIsBypass, propIsFlat) { + var prop = this.parseImpl(name, value, propIsBypass, propIsFlat); + + if (!prop && value != null) { + warn("The style property `".concat(name, ": ").concat(value, "` is invalid")); + } + + if (prop && (prop.name === 'width' || prop.name === 'height') && value === 'label') { + warn('The style value of `label` is deprecated for `' + prop.name + '`'); + } + + return prop; + }; // parse a property; return null on invalid; return parsed property otherwise + // fields : + // - name : the name of the property + // - value : the parsed, native-typed value of the property + // - strValue : a string value that represents the property value in valid css + // - bypass : true iff the property is a bypass property + + + styfn$1.parseImpl = function (name, value, propIsBypass, propIsFlat) { + var self = this; + name = camel2dash(name); // make sure the property name is in dash form (e.g. 'property-name' not 'propertyName') + + var property = self.properties[name]; + var passedValue = value; + var types = self.types; + + if (!property) { + return null; + } // return null on property of unknown name + + + if (value === undefined) { + return null; + } // can't assign undefined + // the property may be an alias + + + if (property.alias) { + property = property.pointsTo; + name = property.name; + } + + var valueIsString = string(value); + + if (valueIsString) { + // trim the value to make parsing easier + value = value.trim(); + } + + var type = property.type; + + if (!type) { + return null; + } // no type, no luck + // check if bypass is null or empty string (i.e. indication to delete bypass property) + + + if (propIsBypass && (value === '' || value === null)) { + return { + name: name, + value: value, + bypass: true, + deleteBypass: true + }; + } // check if value is a function used as a mapper + + + if (fn$6(value)) { + return { + name: name, + value: value, + strValue: 'fn', + mapped: types.fn, + bypass: propIsBypass + }; + } // check if value is mapped + + + var data, mapData; + + if (!valueIsString || propIsFlat || value.length < 7 || value[1] !== 'a') ; else if (value.length >= 7 && value[0] === 'd' && (data = new RegExp(types.data.regex).exec(value))) { + if (propIsBypass) { + return false; + } // mappers not allowed in bypass + + + var mapped = types.data; + return { + name: name, + value: data, + strValue: '' + value, + mapped: mapped, + field: data[1], + bypass: propIsBypass + }; + } else if (value.length >= 10 && value[0] === 'm' && (mapData = new RegExp(types.mapData.regex).exec(value))) { + if (propIsBypass) { + return false; + } // mappers not allowed in bypass + + + if (type.multiple) { + return false; + } // impossible to map to num + + + var _mapped = types.mapData; // we can map only if the type is a colour or a number + + if (!(type.color || type.number)) { + return false; + } + + var valueMin = this.parse(name, mapData[4]); // parse to validate + + if (!valueMin || valueMin.mapped) { + return false; + } // can't be invalid or mapped + + + var valueMax = this.parse(name, mapData[5]); // parse to validate + + if (!valueMax || valueMax.mapped) { + return false; + } // can't be invalid or mapped + // check if valueMin and valueMax are the same + + + if (valueMin.pfValue === valueMax.pfValue || valueMin.strValue === valueMax.strValue) { + warn('`' + name + ': ' + value + '` is not a valid mapper because the output range is zero; converting to `' + name + ': ' + valueMin.strValue + '`'); + return this.parse(name, valueMin.strValue); // can't make much of a mapper without a range + } else if (type.color) { + var c1 = valueMin.value; + var c2 = valueMax.value; + var same = c1[0] === c2[0] // red + && c1[1] === c2[1] // green + && c1[2] === c2[2] // blue + && ( // optional alpha + c1[3] === c2[3] // same alpha outright + || (c1[3] == null || c1[3] === 1 // full opacity for colour 1? + ) && (c2[3] == null || c2[3] === 1) // full opacity for colour 2? + ); + + if (same) { + return false; + } // can't make a mapper without a range + + } + + return { + name: name, + value: mapData, + strValue: '' + value, + mapped: _mapped, + field: mapData[1], + fieldMin: parseFloat(mapData[2]), + // min & max are numeric + fieldMax: parseFloat(mapData[3]), + valueMin: valueMin.value, + valueMax: valueMax.value, + bypass: propIsBypass + }; + } + + if (type.multiple && propIsFlat !== 'multiple') { + var vals; + + if (valueIsString) { + vals = value.split(/\s+/); + } else if (array(value)) { + vals = value; + } else { + vals = [value]; + } + + if (type.evenMultiple && vals.length % 2 !== 0) { + return null; + } + + var valArr = []; + var unitsArr = []; + var pfValArr = []; + var strVal = ''; + var hasEnum = false; + + for (var i = 0; i < vals.length; i++) { + var p = self.parse(name, vals[i], propIsBypass, 'multiple'); + hasEnum = hasEnum || string(p.value); + valArr.push(p.value); + pfValArr.push(p.pfValue != null ? p.pfValue : p.value); + unitsArr.push(p.units); + strVal += (i > 0 ? ' ' : '') + p.strValue; + } + + if (type.validate && !type.validate(valArr, unitsArr)) { + return null; + } + + if (type.singleEnum && hasEnum) { + if (valArr.length === 1 && string(valArr[0])) { + return { + name: name, + value: valArr[0], + strValue: valArr[0], + bypass: propIsBypass + }; + } else { + return null; + } + } + + return { + name: name, + value: valArr, + pfValue: pfValArr, + strValue: strVal, + bypass: propIsBypass, + units: unitsArr + }; + } // several types also allow enums + + + var checkEnums = function checkEnums() { + for (var _i = 0; _i < type.enums.length; _i++) { + var en = type.enums[_i]; + + if (en === value) { + return { + name: name, + value: value, + strValue: '' + value, + bypass: propIsBypass + }; + } + } + + return null; + }; // check the type and return the appropriate object + + + if (type.number) { + var units; + var implicitUnits = 'px'; // not set => px + + if (type.units) { + // use specified units if set + units = type.units; + } + + if (type.implicitUnits) { + implicitUnits = type.implicitUnits; + } + + if (!type.unitless) { + if (valueIsString) { + var unitsRegex = 'px|em' + (type.allowPercent ? '|\\%' : ''); + + if (units) { + unitsRegex = units; + } // only allow explicit units if so set + + + var match = value.match('^(' + number + ')(' + unitsRegex + ')?' + '$'); + + if (match) { + value = match[1]; + units = match[2] || implicitUnits; + } + } else if (!units || type.implicitUnits) { + units = implicitUnits; // implicitly px if unspecified + } + } + + value = parseFloat(value); // if not a number and enums not allowed, then the value is invalid + + if (isNaN(value) && type.enums === undefined) { + return null; + } // check if this number type also accepts special keywords in place of numbers + // (i.e. `left`, `auto`, etc) + + + if (isNaN(value) && type.enums !== undefined) { + value = passedValue; + return checkEnums(); + } // check if value must be an integer + + + if (type.integer && !integer(value)) { + return null; + } // check value is within range + + + if (type.min !== undefined && (value < type.min || type.strictMin && value === type.min) || type.max !== undefined && (value > type.max || type.strictMax && value === type.max)) { + return null; + } + + var ret = { + name: name, + value: value, + strValue: '' + value + (units ? units : ''), + units: units, + bypass: propIsBypass + }; // normalise value in pixels + + if (type.unitless || units !== 'px' && units !== 'em') { + ret.pfValue = value; + } else { + ret.pfValue = units === 'px' || !units ? value : this.getEmSizeInPixels() * value; + } // normalise value in ms + + + if (units === 'ms' || units === 's') { + ret.pfValue = units === 'ms' ? value : 1000 * value; + } // normalise value in rad + + + if (units === 'deg' || units === 'rad') { + ret.pfValue = units === 'rad' ? value : deg2rad(value); + } // normalize value in % + + + if (units === '%') { + ret.pfValue = value / 100; + } + + return ret; + } else if (type.propList) { + var props = []; + var propsStr = '' + value; + + if (propsStr === 'none') ; else { + // go over each prop + var propsSplit = propsStr.split(/\s*,\s*|\s+/); + + for (var _i2 = 0; _i2 < propsSplit.length; _i2++) { + var propName = propsSplit[_i2].trim(); + + if (self.properties[propName]) { + props.push(propName); + } else { + warn('`' + propName + '` is not a valid property name'); + } + } + + if (props.length === 0) { + return null; + } + } + + return { + name: name, + value: props, + strValue: props.length === 0 ? 'none' : props.join(' '), + bypass: propIsBypass + }; + } else if (type.color) { + var tuple = color2tuple(value); + + if (!tuple) { + return null; + } + + return { + name: name, + value: tuple, + pfValue: tuple, + strValue: 'rgb(' + tuple[0] + ',' + tuple[1] + ',' + tuple[2] + ')', + // n.b. no spaces b/c of multiple support + bypass: propIsBypass + }; + } else if (type.regex || type.regexes) { + // first check enums + if (type.enums) { + var enumProp = checkEnums(); + + if (enumProp) { + return enumProp; + } + } + + var regexes = type.regexes ? type.regexes : [type.regex]; + + for (var _i3 = 0; _i3 < regexes.length; _i3++) { + var regex = new RegExp(regexes[_i3]); // make a regex from the type string + + var m = regex.exec(value); + + if (m) { + // regex matches + return { + name: name, + value: type.singleRegexMatchValue ? m[1] : m, + strValue: '' + value, + bypass: propIsBypass + }; + } + } + + return null; // didn't match any + } else if (type.string) { + // just return + return { + name: name, + value: '' + value, + strValue: '' + value, + bypass: propIsBypass + }; + } else if (type.enums) { + // check enums last because it's a combo type in others + return checkEnums(); + } else { + return null; // not a type we can handle + } + }; + + var Style = function Style(cy) { + if (!(this instanceof Style)) { + return new Style(cy); + } + + if (!core(cy)) { + error('A style must have a core reference'); + return; + } + + this._private = { + cy: cy, + coreStyle: {} + }; + this.length = 0; + this.resetToDefault(); + }; + + var styfn = Style.prototype; + + styfn.instanceString = function () { + return 'style'; + }; // remove all contexts + + + styfn.clear = function () { + var _p = this._private; + var cy = _p.cy; + var eles = cy.elements(); + + for (var i = 0; i < this.length; i++) { + this[i] = undefined; + } + + this.length = 0; + _p.contextStyles = {}; + _p.propDiffs = {}; + this.cleanElements(eles, true); + eles.forEach(function (ele) { + var ele_p = ele[0]._private; + ele_p.styleDirty = true; + ele_p.appliedInitStyle = false; + }); + return this; // chaining + }; + + styfn.resetToDefault = function () { + this.clear(); + this.addDefaultStylesheet(); + return this; + }; // builds a style object for the 'core' selector + + + styfn.core = function (propName) { + return this._private.coreStyle[propName] || this.getDefaultProperty(propName); + }; // create a new context from the specified selector string and switch to that context + + + styfn.selector = function (selectorStr) { + // 'core' is a special case and does not need a selector + var selector = selectorStr === 'core' ? null : new Selector(selectorStr); + var i = this.length++; // new context means new index + + this[i] = { + selector: selector, + properties: [], + mappedProperties: [], + index: i + }; + return this; // chaining + }; // add one or many css rules to the current context + + + styfn.css = function () { + var self = this; + var args = arguments; + + if (args.length === 1) { + var map = args[0]; + + for (var i = 0; i < self.properties.length; i++) { + var prop = self.properties[i]; + var mapVal = map[prop.name]; + + if (mapVal === undefined) { + mapVal = map[dash2camel(prop.name)]; + } + + if (mapVal !== undefined) { + this.cssRule(prop.name, mapVal); + } + } + } else if (args.length === 2) { + this.cssRule(args[0], args[1]); + } // do nothing if args are invalid + + + return this; // chaining + }; + + styfn.style = styfn.css; // add a single css rule to the current context + + styfn.cssRule = function (name, value) { + // name-value pair + var property = this.parse(name, value); // add property to current context if valid + + if (property) { + var i = this.length - 1; + this[i].properties.push(property); + this[i].properties[property.name] = property; // allow access by name as well + + if (property.name.match(/pie-(\d+)-background-size/) && property.value) { + this._private.hasPie = true; + } + + if (property.mapped) { + this[i].mappedProperties.push(property); + } // add to core style if necessary + + + var currentSelectorIsCore = !this[i].selector; + + if (currentSelectorIsCore) { + this._private.coreStyle[property.name] = property; + } + } + + return this; // chaining + }; + + styfn.append = function (style) { + if (stylesheet(style)) { + style.appendToStyle(this); + } else if (array(style)) { + this.appendFromJson(style); + } else if (string(style)) { + this.appendFromString(style); + } // you probably wouldn't want to append a Style, since you'd duplicate the default parts + + + return this; + }; // static function + + + Style.fromJson = function (cy, json) { + var style = new Style(cy); + style.fromJson(json); + return style; + }; + + Style.fromString = function (cy, string) { + return new Style(cy).fromString(string); + }; + + [styfn$8, styfn$7, styfn$6, styfn$5, styfn$4, styfn$3, styfn$2, styfn$1].forEach(function (props) { + extend(styfn, props); + }); + Style.types = styfn.types; + Style.properties = styfn.properties; + Style.propertyGroups = styfn.propertyGroups; + Style.propertyGroupNames = styfn.propertyGroupNames; + Style.propertyGroupKeys = styfn.propertyGroupKeys; + + var corefn$2 = { + style: function style(newStyle) { + if (newStyle) { + var s = this.setStyle(newStyle); + s.update(); + } + + return this._private.style; + }, + setStyle: function setStyle(style) { + var _p = this._private; + + if (stylesheet(style)) { + _p.style = style.generateStyle(this); + } else if (array(style)) { + _p.style = Style.fromJson(this, style); + } else if (string(style)) { + _p.style = Style.fromString(this, style); + } else { + _p.style = Style(this); + } + + return _p.style; + }, + // e.g. cy.data() changed => recalc ele mappers + updateStyle: function updateStyle() { + this.mutableElements().updateStyle(); // just send to all eles + } + }; + + var defaultSelectionType = 'single'; + var corefn$1 = { + autolock: function autolock(bool) { + if (bool !== undefined) { + this._private.autolock = bool ? true : false; + } else { + return this._private.autolock; + } + + return this; // chaining + }, + autoungrabify: function autoungrabify(bool) { + if (bool !== undefined) { + this._private.autoungrabify = bool ? true : false; + } else { + return this._private.autoungrabify; + } + + return this; // chaining + }, + autounselectify: function autounselectify(bool) { + if (bool !== undefined) { + this._private.autounselectify = bool ? true : false; + } else { + return this._private.autounselectify; + } + + return this; // chaining + }, + selectionType: function selectionType(selType) { + var _p = this._private; + + if (_p.selectionType == null) { + _p.selectionType = defaultSelectionType; + } + + if (selType !== undefined) { + if (selType === 'additive' || selType === 'single') { + _p.selectionType = selType; + } + } else { + return _p.selectionType; + } + + return this; + }, + panningEnabled: function panningEnabled(bool) { + if (bool !== undefined) { + this._private.panningEnabled = bool ? true : false; + } else { + return this._private.panningEnabled; + } + + return this; // chaining + }, + userPanningEnabled: function userPanningEnabled(bool) { + if (bool !== undefined) { + this._private.userPanningEnabled = bool ? true : false; + } else { + return this._private.userPanningEnabled; + } + + return this; // chaining + }, + zoomingEnabled: function zoomingEnabled(bool) { + if (bool !== undefined) { + this._private.zoomingEnabled = bool ? true : false; + } else { + return this._private.zoomingEnabled; + } + + return this; // chaining + }, + userZoomingEnabled: function userZoomingEnabled(bool) { + if (bool !== undefined) { + this._private.userZoomingEnabled = bool ? true : false; + } else { + return this._private.userZoomingEnabled; + } + + return this; // chaining + }, + boxSelectionEnabled: function boxSelectionEnabled(bool) { + if (bool !== undefined) { + this._private.boxSelectionEnabled = bool ? true : false; + } else { + return this._private.boxSelectionEnabled; + } + + return this; // chaining + }, + pan: function pan() { + var args = arguments; + var pan = this._private.pan; + var dim, val, dims, x, y; + + switch (args.length) { + case 0: + // .pan() + return pan; + + case 1: + if (string(args[0])) { + // .pan('x') + dim = args[0]; + return pan[dim]; + } else if (plainObject(args[0])) { + // .pan({ x: 0, y: 100 }) + if (!this._private.panningEnabled) { + return this; + } + + dims = args[0]; + x = dims.x; + y = dims.y; + + if (number$1(x)) { + pan.x = x; + } + + if (number$1(y)) { + pan.y = y; + } + + this.emit('pan viewport'); + } + + break; + + case 2: + // .pan('x', 100) + if (!this._private.panningEnabled) { + return this; + } + + dim = args[0]; + val = args[1]; + + if ((dim === 'x' || dim === 'y') && number$1(val)) { + pan[dim] = val; + } + + this.emit('pan viewport'); + break; + // invalid + } + + this.notify('viewport'); + return this; // chaining + }, + panBy: function panBy(arg0, arg1) { + var args = arguments; + var pan = this._private.pan; + var dim, val, dims, x, y; + + if (!this._private.panningEnabled) { + return this; + } + + switch (args.length) { + case 1: + if (plainObject(arg0)) { + // .panBy({ x: 0, y: 100 }) + dims = args[0]; + x = dims.x; + y = dims.y; + + if (number$1(x)) { + pan.x += x; + } + + if (number$1(y)) { + pan.y += y; + } + + this.emit('pan viewport'); + } + + break; + + case 2: + // .panBy('x', 100) + dim = arg0; + val = arg1; + + if ((dim === 'x' || dim === 'y') && number$1(val)) { + pan[dim] += val; + } + + this.emit('pan viewport'); + break; + // invalid + } + + this.notify('viewport'); + return this; // chaining + }, + fit: function fit(elements, padding) { + var viewportState = this.getFitViewport(elements, padding); + + if (viewportState) { + var _p = this._private; + _p.zoom = viewportState.zoom; + _p.pan = viewportState.pan; + this.emit('pan zoom viewport'); + this.notify('viewport'); + } + + return this; // chaining + }, + getFitViewport: function getFitViewport(elements, padding) { + if (number$1(elements) && padding === undefined) { + // elements is optional + padding = elements; + elements = undefined; + } + + if (!this._private.panningEnabled || !this._private.zoomingEnabled) { + return; + } + + var bb; + + if (string(elements)) { + var sel = elements; + elements = this.$(sel); + } else if (boundingBox(elements)) { + // assume bb + var bbe = elements; + bb = { + x1: bbe.x1, + y1: bbe.y1, + x2: bbe.x2, + y2: bbe.y2 + }; + bb.w = bb.x2 - bb.x1; + bb.h = bb.y2 - bb.y1; + } else if (!elementOrCollection(elements)) { + elements = this.mutableElements(); + } + + if (elementOrCollection(elements) && elements.empty()) { + return; + } // can't fit to nothing + + + bb = bb || elements.boundingBox(); + var w = this.width(); + var h = this.height(); + var zoom; + padding = number$1(padding) ? padding : 0; + + if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0 && !isNaN(bb.w) && !isNaN(bb.h) && bb.w > 0 && bb.h > 0) { + zoom = Math.min((w - 2 * padding) / bb.w, (h - 2 * padding) / bb.h); // crop zoom + + zoom = zoom > this._private.maxZoom ? this._private.maxZoom : zoom; + zoom = zoom < this._private.minZoom ? this._private.minZoom : zoom; + var pan = { + // now pan to middle + x: (w - zoom * (bb.x1 + bb.x2)) / 2, + y: (h - zoom * (bb.y1 + bb.y2)) / 2 + }; + return { + zoom: zoom, + pan: pan + }; + } + + return; + }, + zoomRange: function zoomRange(min, max) { + var _p = this._private; + + if (max == null) { + var opts = min; + min = opts.min; + max = opts.max; + } + + if (number$1(min) && number$1(max) && min <= max) { + _p.minZoom = min; + _p.maxZoom = max; + } else if (number$1(min) && max === undefined && min <= _p.maxZoom) { + _p.minZoom = min; + } else if (number$1(max) && min === undefined && max >= _p.minZoom) { + _p.maxZoom = max; + } + + return this; + }, + minZoom: function minZoom(zoom) { + if (zoom === undefined) { + return this._private.minZoom; + } else { + return this.zoomRange({ + min: zoom + }); + } + }, + maxZoom: function maxZoom(zoom) { + if (zoom === undefined) { + return this._private.maxZoom; + } else { + return this.zoomRange({ + max: zoom + }); + } + }, + getZoomedViewport: function getZoomedViewport(params) { + var _p = this._private; + var currentPan = _p.pan; + var currentZoom = _p.zoom; + var pos; // in rendered px + + var zoom; + var bail = false; + + if (!_p.zoomingEnabled) { + // zooming disabled + bail = true; + } + + if (number$1(params)) { + // then set the zoom + zoom = params; + } else if (plainObject(params)) { + // then zoom about a point + zoom = params.level; + + if (params.position != null) { + pos = modelToRenderedPosition(params.position, currentZoom, currentPan); + } else if (params.renderedPosition != null) { + pos = params.renderedPosition; + } + + if (pos != null && !_p.panningEnabled) { + // panning disabled + bail = true; + } + } // crop zoom + + + zoom = zoom > _p.maxZoom ? _p.maxZoom : zoom; + zoom = zoom < _p.minZoom ? _p.minZoom : zoom; // can't zoom with invalid params + + if (bail || !number$1(zoom) || zoom === currentZoom || pos != null && (!number$1(pos.x) || !number$1(pos.y))) { + return null; + } + + if (pos != null) { + // set zoom about position + var pan1 = currentPan; + var zoom1 = currentZoom; + var zoom2 = zoom; + var pan2 = { + x: -zoom2 / zoom1 * (pos.x - pan1.x) + pos.x, + y: -zoom2 / zoom1 * (pos.y - pan1.y) + pos.y + }; + return { + zoomed: true, + panned: true, + zoom: zoom2, + pan: pan2 + }; + } else { + // just set the zoom + return { + zoomed: true, + panned: false, + zoom: zoom, + pan: currentPan + }; + } + }, + zoom: function zoom(params) { + if (params === undefined) { + // get + return this._private.zoom; + } else { + // set + var vp = this.getZoomedViewport(params); + var _p = this._private; + + if (vp == null || !vp.zoomed) { + return this; + } + + _p.zoom = vp.zoom; + + if (vp.panned) { + _p.pan.x = vp.pan.x; + _p.pan.y = vp.pan.y; + } + + this.emit('zoom' + (vp.panned ? ' pan' : '') + ' viewport'); + this.notify('viewport'); + return this; // chaining + } + }, + viewport: function viewport(opts) { + var _p = this._private; + var zoomDefd = true; + var panDefd = true; + var events = []; // to trigger + + var zoomFailed = false; + var panFailed = false; + + if (!opts) { + return this; + } + + if (!number$1(opts.zoom)) { + zoomDefd = false; + } + + if (!plainObject(opts.pan)) { + panDefd = false; + } + + if (!zoomDefd && !panDefd) { + return this; + } + + if (zoomDefd) { + var z = opts.zoom; + + if (z < _p.minZoom || z > _p.maxZoom || !_p.zoomingEnabled) { + zoomFailed = true; + } else { + _p.zoom = z; + events.push('zoom'); + } + } + + if (panDefd && (!zoomFailed || !opts.cancelOnFailedZoom) && _p.panningEnabled) { + var p = opts.pan; + + if (number$1(p.x)) { + _p.pan.x = p.x; + panFailed = false; + } + + if (number$1(p.y)) { + _p.pan.y = p.y; + panFailed = false; + } + + if (!panFailed) { + events.push('pan'); + } + } + + if (events.length > 0) { + events.push('viewport'); + this.emit(events.join(' ')); + this.notify('viewport'); + } + + return this; // chaining + }, + center: function center(elements) { + var pan = this.getCenterPan(elements); + + if (pan) { + this._private.pan = pan; + this.emit('pan viewport'); + this.notify('viewport'); + } + + return this; // chaining + }, + getCenterPan: function getCenterPan(elements, zoom) { + if (!this._private.panningEnabled) { + return; + } + + if (string(elements)) { + var selector = elements; + elements = this.mutableElements().filter(selector); + } else if (!elementOrCollection(elements)) { + elements = this.mutableElements(); + } + + if (elements.length === 0) { + return; + } // can't centre pan to nothing + + + var bb = elements.boundingBox(); + var w = this.width(); + var h = this.height(); + zoom = zoom === undefined ? this._private.zoom : zoom; + var pan = { + // middle + x: (w - zoom * (bb.x1 + bb.x2)) / 2, + y: (h - zoom * (bb.y1 + bb.y2)) / 2 + }; + return pan; + }, + reset: function reset() { + if (!this._private.panningEnabled || !this._private.zoomingEnabled) { + return this; + } + + this.viewport({ + pan: { + x: 0, + y: 0 + }, + zoom: 1 + }); + return this; // chaining + }, + invalidateSize: function invalidateSize() { + this._private.sizeCache = null; + }, + size: function size() { + var _p = this._private; + var container = _p.container; + var cy = this; + return _p.sizeCache = _p.sizeCache || (container ? function () { + var style = cy.window().getComputedStyle(container); + + var val = function val(name) { + return parseFloat(style.getPropertyValue(name)); + }; + + return { + width: container.clientWidth - val('padding-left') - val('padding-right'), + height: container.clientHeight - val('padding-top') - val('padding-bottom') + }; + }() : { + // fallback if no container (not 0 b/c can be used for dividing etc) + width: 1, + height: 1 + }); + }, + width: function width() { + return this.size().width; + }, + height: function height() { + return this.size().height; + }, + extent: function extent() { + var pan = this._private.pan; + var zoom = this._private.zoom; + var rb = this.renderedExtent(); + var b = { + x1: (rb.x1 - pan.x) / zoom, + x2: (rb.x2 - pan.x) / zoom, + y1: (rb.y1 - pan.y) / zoom, + y2: (rb.y2 - pan.y) / zoom + }; + b.w = b.x2 - b.x1; + b.h = b.y2 - b.y1; + return b; + }, + renderedExtent: function renderedExtent() { + var width = this.width(); + var height = this.height(); + return { + x1: 0, + y1: 0, + x2: width, + y2: height, + w: width, + h: height + }; + }, + multiClickDebounceTime: function multiClickDebounceTime(_int) { + if (_int) this._private.multiClickDebounceTime = _int;else return this._private.multiClickDebounceTime; + return this; // chaining + } + }; // aliases + + corefn$1.centre = corefn$1.center; // backwards compatibility + + corefn$1.autolockNodes = corefn$1.autolock; + corefn$1.autoungrabifyNodes = corefn$1.autoungrabify; + + var fn = { + data: define.data({ + field: 'data', + bindingEvent: 'data', + allowBinding: true, + allowSetting: true, + settingEvent: 'data', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + updateStyle: true + }), + removeData: define.removeData({ + field: 'data', + event: 'data', + triggerFnName: 'trigger', + triggerEvent: true, + updateStyle: true + }), + scratch: define.data({ + field: 'scratch', + bindingEvent: 'scratch', + allowBinding: true, + allowSetting: true, + settingEvent: 'scratch', + settingTriggersEvent: true, + triggerFnName: 'trigger', + allowGetting: true, + updateStyle: true + }), + removeScratch: define.removeData({ + field: 'scratch', + event: 'scratch', + triggerFnName: 'trigger', + triggerEvent: true, + updateStyle: true + }) + }; // aliases + + fn.attr = fn.data; + fn.removeAttr = fn.removeData; + + var Core = function Core(opts) { + var cy = this; + opts = extend({}, opts); + var container = opts.container; // allow for passing a wrapped jquery object + // e.g. cytoscape({ container: $('#cy') }) + + if (container && !htmlElement(container) && htmlElement(container[0])) { + container = container[0]; + } + + var reg = container ? container._cyreg : null; // e.g. already registered some info (e.g. readies) via jquery + + reg = reg || {}; + + if (reg && reg.cy) { + reg.cy.destroy(); + reg = {}; // old instance => replace reg completely + } + + var readies = reg.readies = reg.readies || []; + + if (container) { + container._cyreg = reg; + } // make sure container assoc'd reg points to this cy + + + reg.cy = cy; + var head = _window !== undefined && container !== undefined && !opts.headless; + var options = opts; + options.layout = extend({ + name: head ? 'grid' : 'null' + }, options.layout); + options.renderer = extend({ + name: head ? 'canvas' : 'null' + }, options.renderer); + + var defVal = function defVal(def, val, altVal) { + if (val !== undefined) { + return val; + } else if (altVal !== undefined) { + return altVal; + } else { + return def; + } + }; + + var _p = this._private = { + container: container, + // html dom ele container + ready: false, + // whether ready has been triggered + options: options, + // cached options + elements: new Collection(this), + // elements in the graph + listeners: [], + // list of listeners + aniEles: new Collection(this), + // elements being animated + data: options.data || {}, + // data for the core + scratch: {}, + // scratch object for core + layout: null, + renderer: null, + destroyed: false, + // whether destroy was called + notificationsEnabled: true, + // whether notifications are sent to the renderer + minZoom: 1e-50, + maxZoom: 1e50, + zoomingEnabled: defVal(true, options.zoomingEnabled), + userZoomingEnabled: defVal(true, options.userZoomingEnabled), + panningEnabled: defVal(true, options.panningEnabled), + userPanningEnabled: defVal(true, options.userPanningEnabled), + boxSelectionEnabled: defVal(true, options.boxSelectionEnabled), + autolock: defVal(false, options.autolock, options.autolockNodes), + autoungrabify: defVal(false, options.autoungrabify, options.autoungrabifyNodes), + autounselectify: defVal(false, options.autounselectify), + styleEnabled: options.styleEnabled === undefined ? head : options.styleEnabled, + zoom: number$1(options.zoom) ? options.zoom : 1, + pan: { + x: plainObject(options.pan) && number$1(options.pan.x) ? options.pan.x : 0, + y: plainObject(options.pan) && number$1(options.pan.y) ? options.pan.y : 0 + }, + animation: { + // object for currently-running animations + current: [], + queue: [] + }, + hasCompoundNodes: false, + multiClickDebounceTime: defVal(250, options.multiClickDebounceTime) + }; + + this.createEmitter(); // set selection type + + this.selectionType(options.selectionType); // init zoom bounds + + this.zoomRange({ + min: options.minZoom, + max: options.maxZoom + }); + + var loadExtData = function loadExtData(extData, next) { + var anyIsPromise = extData.some(promise); + + if (anyIsPromise) { + return Promise$1.all(extData).then(next); // load all data asynchronously, then exec rest of init + } else { + next(extData); // exec synchronously for convenience + } + }; // start with the default stylesheet so we have something before loading an external stylesheet + + + if (_p.styleEnabled) { + cy.setStyle([]); + } // create the renderer + + + var rendererOptions = extend({}, options, options.renderer); // allow rendering hints in top level options + + cy.initRenderer(rendererOptions); + + var setElesAndLayout = function setElesAndLayout(elements, onload, ondone) { + cy.notifications(false); // remove old elements + + var oldEles = cy.mutableElements(); + + if (oldEles.length > 0) { + oldEles.remove(); + } + + if (elements != null) { + if (plainObject(elements) || array(elements)) { + cy.add(elements); + } + } + + cy.one('layoutready', function (e) { + cy.notifications(true); + cy.emit(e); // we missed this event by turning notifications off, so pass it on + + cy.one('load', onload); + cy.emitAndNotify('load'); + }).one('layoutstop', function () { + cy.one('done', ondone); + cy.emit('done'); + }); + var layoutOpts = extend({}, cy._private.options.layout); + layoutOpts.eles = cy.elements(); + cy.layout(layoutOpts).run(); + }; + + loadExtData([options.style, options.elements], function (thens) { + var initStyle = thens[0]; + var initEles = thens[1]; // init style + + if (_p.styleEnabled) { + cy.style().append(initStyle); + } // initial load + + + setElesAndLayout(initEles, function () { + // onready + cy.startAnimationLoop(); + _p.ready = true; // if a ready callback is specified as an option, the bind it + + if (fn$6(options.ready)) { + cy.on('ready', options.ready); + } // bind all the ready handlers registered before creating this instance + + + for (var i = 0; i < readies.length; i++) { + var fn = readies[i]; + cy.on('ready', fn); + } + + if (reg) { + reg.readies = []; + } // clear b/c we've bound them all and don't want to keep it around in case a new core uses the same div etc + + + cy.emit('ready'); + }, options.done); + }); + }; + + var corefn = Core.prototype; // short alias + + extend(corefn, { + instanceString: function instanceString() { + return 'core'; + }, + isReady: function isReady() { + return this._private.ready; + }, + destroyed: function destroyed() { + return this._private.destroyed; + }, + ready: function ready(fn) { + if (this.isReady()) { + this.emitter().emit('ready', [], fn); // just calls fn as though triggered via ready event + } else { + this.on('ready', fn); + } + + return this; + }, + destroy: function destroy() { + var cy = this; + if (cy.destroyed()) return; + cy.stopAnimationLoop(); + cy.destroyRenderer(); + this.emit('destroy'); + cy._private.destroyed = true; + return cy; + }, + hasElementWithId: function hasElementWithId(id) { + return this._private.elements.hasElementWithId(id); + }, + getElementById: function getElementById(id) { + return this._private.elements.getElementById(id); + }, + hasCompoundNodes: function hasCompoundNodes() { + return this._private.hasCompoundNodes; + }, + headless: function headless() { + return this._private.renderer.isHeadless(); + }, + styleEnabled: function styleEnabled() { + return this._private.styleEnabled; + }, + addToPool: function addToPool(eles) { + this._private.elements.merge(eles); + + return this; // chaining + }, + removeFromPool: function removeFromPool(eles) { + this._private.elements.unmerge(eles); + + return this; + }, + container: function container() { + return this._private.container || null; + }, + window: function window() { + var container = this._private.container; + if (container == null) return _window; + var ownerDocument = this._private.container.ownerDocument; + + if (ownerDocument === undefined || ownerDocument == null) { + return _window; + } + + return ownerDocument.defaultView || _window; + }, + mount: function mount(container) { + if (container == null) { + return; + } + + var cy = this; + var _p = cy._private; + var options = _p.options; + + if (!htmlElement(container) && htmlElement(container[0])) { + container = container[0]; + } + + cy.stopAnimationLoop(); + cy.destroyRenderer(); + _p.container = container; + _p.styleEnabled = true; + cy.invalidateSize(); + cy.initRenderer(extend({}, options, options.renderer, { + // allow custom renderer name to be re-used, otherwise use canvas + name: options.renderer.name === 'null' ? 'canvas' : options.renderer.name + })); + cy.startAnimationLoop(); + cy.style(options.style); + cy.emit('mount'); + return cy; + }, + unmount: function unmount() { + var cy = this; + cy.stopAnimationLoop(); + cy.destroyRenderer(); + cy.initRenderer({ + name: 'null' + }); + cy.emit('unmount'); + return cy; + }, + options: function options() { + return copy(this._private.options); + }, + json: function json(obj) { + var cy = this; + var _p = cy._private; + var eles = cy.mutableElements(); + + var getFreshRef = function getFreshRef(ele) { + return cy.getElementById(ele.id()); + }; + + if (plainObject(obj)) { + // set + cy.startBatch(); + + if (obj.elements) { + var idInJson = {}; + + var updateEles = function updateEles(jsons, gr) { + var toAdd = []; + var toMod = []; + + for (var i = 0; i < jsons.length; i++) { + var json = jsons[i]; + + if (!json.data.id) { + warn('cy.json() cannot handle elements without an ID attribute'); + continue; + } + + var id = '' + json.data.id; // id must be string + + var ele = cy.getElementById(id); + idInJson[id] = true; + + if (ele.length !== 0) { + // existing element should be updated + toMod.push({ + ele: ele, + json: json + }); + } else { + // otherwise should be added + if (gr) { + json.group = gr; + toAdd.push(json); + } else { + toAdd.push(json); + } + } + } + + cy.add(toAdd); + + for (var _i = 0; _i < toMod.length; _i++) { + var _toMod$_i = toMod[_i], + _ele = _toMod$_i.ele, + _json = _toMod$_i.json; + + _ele.json(_json); + } + }; + + if (array(obj.elements)) { + // elements: [] + updateEles(obj.elements); + } else { + // elements: { nodes: [], edges: [] } + var grs = ['nodes', 'edges']; + + for (var i = 0; i < grs.length; i++) { + var gr = grs[i]; + var elements = obj.elements[gr]; + + if (array(elements)) { + updateEles(elements, gr); + } + } + } + + var parentsToRemove = cy.collection(); + eles.filter(function (ele) { + return !idInJson[ele.id()]; + }).forEach(function (ele) { + if (ele.isParent()) { + parentsToRemove.merge(ele); + } else { + ele.remove(); + } + }); // so that children are not removed w/parent + + parentsToRemove.forEach(function (ele) { + return ele.children().move({ + parent: null + }); + }); // intermediate parents may be moved by prior line, so make sure we remove by fresh refs + + parentsToRemove.forEach(function (ele) { + return getFreshRef(ele).remove(); + }); + } + + if (obj.style) { + cy.style(obj.style); + } + + if (obj.zoom != null && obj.zoom !== _p.zoom) { + cy.zoom(obj.zoom); + } + + if (obj.pan) { + if (obj.pan.x !== _p.pan.x || obj.pan.y !== _p.pan.y) { + cy.pan(obj.pan); + } + } + + if (obj.data) { + cy.data(obj.data); + } + + var fields = ['minZoom', 'maxZoom', 'zoomingEnabled', 'userZoomingEnabled', 'panningEnabled', 'userPanningEnabled', 'boxSelectionEnabled', 'autolock', 'autoungrabify', 'autounselectify', 'multiClickDebounceTime']; + + for (var _i2 = 0; _i2 < fields.length; _i2++) { + var f = fields[_i2]; + + if (obj[f] != null) { + cy[f](obj[f]); + } + } + + cy.endBatch(); + return this; // chaining + } else { + // get + var flat = !!obj; + var json = {}; + + if (flat) { + json.elements = this.elements().map(function (ele) { + return ele.json(); + }); + } else { + json.elements = {}; + eles.forEach(function (ele) { + var group = ele.group(); + + if (!json.elements[group]) { + json.elements[group] = []; + } + + json.elements[group].push(ele.json()); + }); + } + + if (this._private.styleEnabled) { + json.style = cy.style().json(); + } + + json.data = copy(cy.data()); + var options = _p.options; + json.zoomingEnabled = _p.zoomingEnabled; + json.userZoomingEnabled = _p.userZoomingEnabled; + json.zoom = _p.zoom; + json.minZoom = _p.minZoom; + json.maxZoom = _p.maxZoom; + json.panningEnabled = _p.panningEnabled; + json.userPanningEnabled = _p.userPanningEnabled; + json.pan = copy(_p.pan); + json.boxSelectionEnabled = _p.boxSelectionEnabled; + json.renderer = copy(options.renderer); + json.hideEdgesOnViewport = options.hideEdgesOnViewport; + json.textureOnViewport = options.textureOnViewport; + json.wheelSensitivity = options.wheelSensitivity; + json.motionBlur = options.motionBlur; + json.multiClickDebounceTime = options.multiClickDebounceTime; + return json; + } + } + }); + corefn.$id = corefn.getElementById; + [corefn$9, corefn$8, elesfn, corefn$7, corefn$6, corefn$5, corefn$4, corefn$3, corefn$2, corefn$1, fn].forEach(function (props) { + extend(corefn, props); + }); + + /* eslint-disable no-unused-vars */ + + var defaults$7 = { + fit: true, + // whether to fit the viewport to the graph + directed: false, + // whether the tree is directed downwards (or edges can point in any direction if false) + padding: 30, + // padding on fit + circle: false, + // put depths in concentric circles if true, put depths top down if false + grid: false, + // whether to create an even grid into which the DAG is placed (circle:false only) + spacingFactor: 1.75, + // positive spacing factor, larger => more space between nodes (N.B. n/a if causes overlap) + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + roots: undefined, + // the roots of the trees + depthSort: undefined, + // a sorting function to order nodes at equal depth. e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled, + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + var deprecatedOptionDefaults = { + maximal: false, + // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only); setting acyclic to true sets maximal to true also + acyclic: false // whether the tree is acyclic and thus a node could be shifted (due to the maximal option) multiple times without causing an infinite loop; setting to true sets maximal to true also; if you are uncertain whether a tree is acyclic, set to false to avoid potential infinite loops + + }; + /* eslint-enable */ + + var getInfo = function getInfo(ele) { + return ele.scratch('breadthfirst'); + }; + + var setInfo = function setInfo(ele, obj) { + return ele.scratch('breadthfirst', obj); + }; + + function BreadthFirstLayout(options) { + this.options = extend({}, defaults$7, deprecatedOptionDefaults, options); + } + + BreadthFirstLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().filter(function (n) { + return !n.isParent(); + }); + var graph = eles; + var directed = options.directed; + var maximal = options.acyclic || options.maximal || options.maximalAdjustments > 0; // maximalAdjustments for compat. w/ old code; also, setting acyclic to true sets maximal to true + + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var roots; + + if (elementOrCollection(options.roots)) { + roots = options.roots; + } else if (array(options.roots)) { + var rootsArray = []; + + for (var i = 0; i < options.roots.length; i++) { + var id = options.roots[i]; + var ele = cy.getElementById(id); + rootsArray.push(ele); + } + + roots = cy.collection(rootsArray); + } else if (string(options.roots)) { + roots = cy.$(options.roots); + } else { + if (directed) { + roots = nodes.roots(); + } else { + var components = eles.components(); + roots = cy.collection(); + + var _loop = function _loop(_i) { + var comp = components[_i]; + var maxDegree = comp.maxDegree(false); + var compRoots = comp.filter(function (ele) { + return ele.degree(false) === maxDegree; + }); + roots = roots.add(compRoots); + }; + + for (var _i = 0; _i < components.length; _i++) { + _loop(_i); + } + } + } + + var depths = []; + var foundByBfs = {}; + + var addToDepth = function addToDepth(ele, d) { + if (depths[d] == null) { + depths[d] = []; + } + + var i = depths[d].length; + depths[d].push(ele); + setInfo(ele, { + index: i, + depth: d + }); + }; + + var changeDepth = function changeDepth(ele, newDepth) { + var _getInfo = getInfo(ele), + depth = _getInfo.depth, + index = _getInfo.index; + + depths[depth][index] = null; + addToDepth(ele, newDepth); + }; // find the depths of the nodes + + + graph.bfs({ + roots: roots, + directed: options.directed, + visit: function visit(node, edge, pNode, i, depth) { + var ele = node[0]; + var id = ele.id(); + addToDepth(ele, depth); + foundByBfs[id] = true; + } + }); // check for nodes not found by bfs + + var orphanNodes = []; + + for (var _i2 = 0; _i2 < nodes.length; _i2++) { + var _ele = nodes[_i2]; + + if (foundByBfs[_ele.id()]) { + continue; + } else { + orphanNodes.push(_ele); + } + } // assign the nodes a depth and index + + + var assignDepthsAt = function assignDepthsAt(i) { + var eles = depths[i]; + + for (var j = 0; j < eles.length; j++) { + var _ele2 = eles[j]; + + if (_ele2 == null) { + eles.splice(j, 1); + j--; + continue; + } + + setInfo(_ele2, { + depth: i, + index: j + }); + } + }; + + var assignDepths = function assignDepths() { + for (var _i3 = 0; _i3 < depths.length; _i3++) { + assignDepthsAt(_i3); + } + }; + + var adjustMaximally = function adjustMaximally(ele, shifted) { + var eInfo = getInfo(ele); + var incomers = ele.incomers().filter(function (el) { + return el.isNode() && eles.has(el); + }); + var maxDepth = -1; + var id = ele.id(); + + for (var k = 0; k < incomers.length; k++) { + var incmr = incomers[k]; + var iInfo = getInfo(incmr); + maxDepth = Math.max(maxDepth, iInfo.depth); + } + + if (eInfo.depth <= maxDepth) { + if (!options.acyclic && shifted[id]) { + return null; + } + + var newDepth = maxDepth + 1; + changeDepth(ele, newDepth); + shifted[id] = newDepth; + return true; + } + + return false; + }; // for the directed case, try to make the edges all go down (i.e. depth i => depth i + 1) + + + if (directed && maximal) { + var Q = []; + var shifted = {}; + + var enqueue = function enqueue(n) { + return Q.push(n); + }; + + var dequeue = function dequeue() { + return Q.shift(); + }; + + nodes.forEach(function (n) { + return Q.push(n); + }); + + while (Q.length > 0) { + var _ele3 = dequeue(); + + var didShift = adjustMaximally(_ele3, shifted); + + if (didShift) { + _ele3.outgoers().filter(function (el) { + return el.isNode() && eles.has(el); + }).forEach(enqueue); + } else if (didShift === null) { + warn('Detected double maximal shift for node `' + _ele3.id() + '`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.'); + break; // exit on failure + } + } + } + + assignDepths(); // clear holes + // find min distance we need to leave between nodes + + var minDistance = 0; + + if (options.avoidOverlap) { + for (var _i4 = 0; _i4 < nodes.length; _i4++) { + var n = nodes[_i4]; + var nbb = n.layoutDimensions(options); + var w = nbb.w; + var h = nbb.h; + minDistance = Math.max(minDistance, w, h); + } + } // get the weighted percent for an element based on its connectivity to other levels + + + var cachedWeightedPercent = {}; + + var getWeightedPercent = function getWeightedPercent(ele) { + if (cachedWeightedPercent[ele.id()]) { + return cachedWeightedPercent[ele.id()]; + } + + var eleDepth = getInfo(ele).depth; + var neighbors = ele.neighborhood(); + var percent = 0; + var samples = 0; + + for (var _i5 = 0; _i5 < neighbors.length; _i5++) { + var neighbor = neighbors[_i5]; + + if (neighbor.isEdge() || neighbor.isParent() || !nodes.has(neighbor)) { + continue; + } + + var bf = getInfo(neighbor); + + if (bf == null) { + continue; + } + + var index = bf.index; + var depth = bf.depth; // unassigned neighbours shouldn't affect the ordering + + if (index == null || depth == null) { + continue; + } + + var nDepth = depths[depth].length; + + if (depth < eleDepth) { + // only get influenced by elements above + percent += index / nDepth; + samples++; + } + } + + samples = Math.max(1, samples); + percent = percent / samples; + + if (samples === 0) { + // put lone nodes at the start + percent = 0; + } + + cachedWeightedPercent[ele.id()] = percent; + return percent; + }; // rearrange the indices in each depth level based on connectivity + + + var sortFn = function sortFn(a, b) { + var apct = getWeightedPercent(a); + var bpct = getWeightedPercent(b); + var diff = apct - bpct; + + if (diff === 0) { + return ascending(a.id(), b.id()); // make sure sort doesn't have don't-care comparisons + } else { + return diff; + } + }; + + if (options.depthSort !== undefined) { + sortFn = options.depthSort; + } // sort each level to make connected nodes closer + + + for (var _i6 = 0; _i6 < depths.length; _i6++) { + depths[_i6].sort(sortFn); + + assignDepthsAt(_i6); + } // assign orphan nodes to a new top-level depth + + + var orphanDepth = []; + + for (var _i7 = 0; _i7 < orphanNodes.length; _i7++) { + orphanDepth.push(orphanNodes[_i7]); + } + + depths.unshift(orphanDepth); + assignDepths(); + var biggestDepthSize = 0; + + for (var _i8 = 0; _i8 < depths.length; _i8++) { + biggestDepthSize = Math.max(depths[_i8].length, biggestDepthSize); + } + + var center = { + x: bb.x1 + bb.w / 2, + y: bb.x1 + bb.h / 2 + }; + var maxDepthSize = depths.reduce(function (max, eles) { + return Math.max(max, eles.length); + }, 0); + + var getPosition = function getPosition(ele) { + var _getInfo2 = getInfo(ele), + depth = _getInfo2.depth, + index = _getInfo2.index; + + var depthSize = depths[depth].length; + var distanceX = Math.max(bb.w / ((options.grid ? maxDepthSize : depthSize) + 1), minDistance); + var distanceY = Math.max(bb.h / (depths.length + 1), minDistance); + var radiusStepSize = Math.min(bb.w / 2 / depths.length, bb.h / 2 / depths.length); + radiusStepSize = Math.max(radiusStepSize, minDistance); + + if (!options.circle) { + var epos = { + x: center.x + (index + 1 - (depthSize + 1) / 2) * distanceX, + y: (depth + 1) * distanceY + }; + return epos; + } else { + var radius = radiusStepSize * depth + radiusStepSize - (depths.length > 0 && depths[0].length <= 3 ? radiusStepSize / 2 : 0); + var theta = 2 * Math.PI / depths[depth].length * index; + + if (depth === 0 && depths[0].length === 1) { + radius = 1; + } + + return { + x: center.x + radius * Math.cos(theta), + y: center.y + radius * Math.sin(theta) + }; + } + }; + + eles.nodes().layoutPositions(this, options, getPosition); + return this; // chaining + }; + + var defaults$6 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // the padding on fit + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox and radius if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + radius: undefined, + // the radius of the circle + startAngle: 3 / 2 * Math.PI, + // where nodes start in radians + sweep: undefined, + // how many radians should be between the first and last node (defaults to full circle) + clockwise: true, + // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) + sort: undefined, + // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function CircleLayout(options) { + this.options = extend({}, defaults$6, options); + } + + CircleLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise; + var nodes = eles.nodes().not(':parent'); + + if (options.sort) { + nodes = nodes.sort(options.sort); + } + + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var center = { + x: bb.x1 + bb.w / 2, + y: bb.y1 + bb.h / 2 + }; + var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / nodes.length : options.sweep; + var dTheta = sweep / Math.max(1, nodes.length - 1); + var r; + var minDistance = 0; + + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + var nbb = n.layoutDimensions(options); + var w = nbb.w; + var h = nbb.h; + minDistance = Math.max(minDistance, w, h); + } + + if (number$1(options.radius)) { + r = options.radius; + } else if (nodes.length <= 1) { + r = 0; + } else { + r = Math.min(bb.h, bb.w) / 2 - minDistance; + } // calculate the radius + + + if (nodes.length > 1 && options.avoidOverlap) { + // but only if more than one node (can't overlap) + minDistance *= 1.75; // just to have some nice spacing + + var dcos = Math.cos(dTheta) - Math.cos(0); + var dsin = Math.sin(dTheta) - Math.sin(0); + var rMin = Math.sqrt(minDistance * minDistance / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping + + r = Math.max(rMin, r); + } + + var getPos = function getPos(ele, i) { + var theta = options.startAngle + i * dTheta * (clockwise ? 1 : -1); + var rx = r * Math.cos(theta); + var ry = r * Math.sin(theta); + var pos = { + x: center.x + rx, + y: center.y + ry + }; + return pos; + }; + + eles.nodes().layoutPositions(this, options, getPos); + return this; // chaining + }; + + var defaults$5 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // the padding on fit + startAngle: 3 / 2 * Math.PI, + // where nodes start in radians + sweep: undefined, + // how many radians should be between the first and last node (defaults to full circle) + clockwise: true, + // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) + equidistant: false, + // whether levels have an equal radial distance betwen them, may cause bounding box overflow + minNodeSpacing: 10, + // min spacing between outside of nodes (used for radius adjustment) + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + height: undefined, + // height of layout area (overrides container height) + width: undefined, + // width of layout area (overrides container width) + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + concentric: function concentric(node) { + // returns numeric value for each node, placing higher nodes in levels towards the centre + return node.degree(); + }, + levelWidth: function levelWidth(nodes) { + // the variation of concentric values in each level + return nodes.maxDegree() / 4; + }, + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function ConcentricLayout(options) { + this.options = extend({}, defaults$5, options); + } + + ConcentricLayout.prototype.run = function () { + var params = this.options; + var options = params; + var clockwise = options.counterclockwise !== undefined ? !options.counterclockwise : options.clockwise; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().not(':parent'); + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var center = { + x: bb.x1 + bb.w / 2, + y: bb.y1 + bb.h / 2 + }; + var nodeValues = []; // { node, value } + + var maxNodeSize = 0; + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var value = void 0; // calculate the node value + + value = options.concentric(node); + nodeValues.push({ + value: value, + node: node + }); // for style mapping + + node._private.scratch.concentric = value; + } // in case we used the `concentric` in style + + + nodes.updateStyle(); // calculate max size now based on potentially updated mappers + + for (var _i = 0; _i < nodes.length; _i++) { + var _node = nodes[_i]; + + var nbb = _node.layoutDimensions(options); + + maxNodeSize = Math.max(maxNodeSize, nbb.w, nbb.h); + } // sort node values in descreasing order + + + nodeValues.sort(function (a, b) { + return b.value - a.value; + }); + var levelWidth = options.levelWidth(nodes); // put the values into levels + + var levels = [[]]; + var currentLevel = levels[0]; + + for (var _i2 = 0; _i2 < nodeValues.length; _i2++) { + var val = nodeValues[_i2]; + + if (currentLevel.length > 0) { + var diff = Math.abs(currentLevel[0].value - val.value); + + if (diff >= levelWidth) { + currentLevel = []; + levels.push(currentLevel); + } + } + + currentLevel.push(val); + } // create positions from levels + + + var minDist = maxNodeSize + options.minNodeSpacing; // min dist between nodes + + if (!options.avoidOverlap) { + // then strictly constrain to bb + var firstLvlHasMulti = levels.length > 0 && levels[0].length > 1; + var maxR = Math.min(bb.w, bb.h) / 2 - minDist; + var rStep = maxR / (levels.length + firstLvlHasMulti ? 1 : 0); + minDist = Math.min(minDist, rStep); + } // find the metrics for each level + + + var r = 0; + + for (var _i3 = 0; _i3 < levels.length; _i3++) { + var level = levels[_i3]; + var sweep = options.sweep === undefined ? 2 * Math.PI - 2 * Math.PI / level.length : options.sweep; + var dTheta = level.dTheta = sweep / Math.max(1, level.length - 1); // calculate the radius + + if (level.length > 1 && options.avoidOverlap) { + // but only if more than one node (can't overlap) + var dcos = Math.cos(dTheta) - Math.cos(0); + var dsin = Math.sin(dTheta) - Math.sin(0); + var rMin = Math.sqrt(minDist * minDist / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping + + r = Math.max(rMin, r); + } + + level.r = r; + r += minDist; + } + + if (options.equidistant) { + var rDeltaMax = 0; + var _r = 0; + + for (var _i4 = 0; _i4 < levels.length; _i4++) { + var _level = levels[_i4]; + var rDelta = _level.r - _r; + rDeltaMax = Math.max(rDeltaMax, rDelta); + } + + _r = 0; + + for (var _i5 = 0; _i5 < levels.length; _i5++) { + var _level2 = levels[_i5]; + + if (_i5 === 0) { + _r = _level2.r; + } + + _level2.r = _r; + _r += rDeltaMax; + } + } // calculate the node positions + + + var pos = {}; // id => position + + for (var _i6 = 0; _i6 < levels.length; _i6++) { + var _level3 = levels[_i6]; + var _dTheta = _level3.dTheta; + var _r2 = _level3.r; + + for (var j = 0; j < _level3.length; j++) { + var _val = _level3[j]; + var theta = options.startAngle + (clockwise ? 1 : -1) * _dTheta * j; + var p = { + x: center.x + _r2 * Math.cos(theta), + y: center.y + _r2 * Math.sin(theta) + }; + pos[_val.node.id()] = p; + } + } // position the nodes + + + eles.nodes().layoutPositions(this, options, function (ele) { + var id = ele.id(); + return pos[id]; + }); + return this; // chaining + }; + + /* + The CoSE layout was written by Gerardo Huck. + https://www.linkedin.com/in/gerardohuck/ + + Based on the following article: + http://dl.acm.org/citation.cfm?id=1498047 + + Modifications tracked on Github. + */ + var DEBUG; + /** + * @brief : default layout options + */ + + var defaults$4 = { + // Called on `layoutready` + ready: function ready() {}, + // Called on `layoutstop` + stop: function stop() {}, + // Whether to animate while running the layout + // true : Animate continuously as the layout is running + // false : Just show the end result + // 'end' : Animate with the end result, from the initial positions to the end positions + animate: true, + // Easing of the animation for animate:'end' + animationEasing: undefined, + // The duration of the animation for animate:'end' + animationDuration: undefined, + // A function that determines whether the node should be animated + // All nodes animated by default on animate enabled + // Non-animated nodes are positioned immediately when the layout starts + animateFilter: function animateFilter(node, i) { + return true; + }, + // The layout animates only after this many milliseconds for animate:true + // (prevents flashing on fast runs) + animationThreshold: 250, + // Number of iterations between consecutive screen positions update + refresh: 20, + // Whether to fit the network view after when done + fit: true, + // Padding on fit + padding: 30, + // Constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + boundingBox: undefined, + // Excludes the label when calculating node bounding boxes for the layout algorithm + nodeDimensionsIncludeLabels: false, + // Randomize the initial positions of the nodes (true) or use existing positions (false) + randomize: false, + // Extra spacing between components in non-compound graphs + componentSpacing: 40, + // Node repulsion (non overlapping) multiplier + nodeRepulsion: function nodeRepulsion(node) { + return 2048; + }, + // Node repulsion (overlapping) multiplier + nodeOverlap: 4, + // Ideal edge (non nested) length + idealEdgeLength: function idealEdgeLength(edge) { + return 32; + }, + // Divisor to compute edge forces + edgeElasticity: function edgeElasticity(edge) { + return 32; + }, + // Nesting factor (multiplier) to compute ideal edge length for nested edges + nestingFactor: 1.2, + // Gravity force (constant) + gravity: 1, + // Maximum number of iterations to perform + numIter: 1000, + // Initial temperature (maximum node displacement) + initialTemp: 1000, + // Cooling factor (how the temperature is reduced between consecutive iterations + coolingFactor: 0.99, + // Lower temperature threshold (below this point the layout will end) + minTemp: 1.0 + }; + /** + * @brief : constructor + * @arg options : object containing layout options + */ + + function CoseLayout(options) { + this.options = extend({}, defaults$4, options); + this.options.layout = this; + } + /** + * @brief : runs the layout + */ + + + CoseLayout.prototype.run = function () { + var options = this.options; + var cy = options.cy; + var layout = this; + layout.stopped = false; + + if (options.animate === true || options.animate === false) { + layout.emit({ + type: 'layoutstart', + layout: layout + }); + } // Set DEBUG - Global variable + + + if (true === options.debug) { + DEBUG = true; + } else { + DEBUG = false; + } // Initialize layout info + + + var layoutInfo = createLayoutInfo(cy, layout, options); // Show LayoutInfo contents if debugging + + if (DEBUG) { + printLayoutInfo(layoutInfo); + } // If required, randomize node positions + + + if (options.randomize) { + randomizePositions(layoutInfo); + } + + var startTime = performanceNow(); + + var refresh = function refresh() { + refreshPositions(layoutInfo, cy, options); // Fit the graph if necessary + + if (true === options.fit) { + cy.fit(options.padding); + } + }; + + var mainLoop = function mainLoop(i) { + if (layout.stopped || i >= options.numIter) { + // logDebug("Layout manually stopped. Stopping computation in step " + i); + return false; + } // Do one step in the phisical simulation + + + step(layoutInfo, options); // Update temperature + + layoutInfo.temperature = layoutInfo.temperature * options.coolingFactor; // logDebug("New temperature: " + layoutInfo.temperature); + + if (layoutInfo.temperature < options.minTemp) { + // logDebug("Temperature drop below minimum threshold. Stopping computation in step " + i); + return false; + } + + return true; + }; + + var done = function done() { + if (options.animate === true || options.animate === false) { + refresh(); // Layout has finished + + layout.one('layoutstop', options.stop); + layout.emit({ + type: 'layoutstop', + layout: layout + }); + } else { + var nodes = options.eles.nodes(); + var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes); + nodes.layoutPositions(layout, options, getScaledPos); + } + }; + + var i = 0; + var loopRet = true; + + if (options.animate === true) { + var frame = function frame() { + var f = 0; + + while (loopRet && f < options.refresh) { + loopRet = mainLoop(i); + i++; + f++; + } + + if (!loopRet) { + // it's done + separateComponents(layoutInfo, options); + done(); + } else { + var now = performanceNow(); + + if (now - startTime >= options.animationThreshold) { + refresh(); + } + + requestAnimationFrame(frame); + } + }; + + frame(); + } else { + while (loopRet) { + loopRet = mainLoop(i); + i++; + } + + separateComponents(layoutInfo, options); + done(); + } + + return this; // chaining + }; + /** + * @brief : called on continuous layouts to stop them before they finish + */ + + + CoseLayout.prototype.stop = function () { + this.stopped = true; + + if (this.thread) { + this.thread.stop(); + } + + this.emit('layoutstop'); + return this; // chaining + }; + + CoseLayout.prototype.destroy = function () { + if (this.thread) { + this.thread.stop(); + } + + return this; // chaining + }; + /** + * @brief : Creates an object which is contains all the data + * used in the layout process + * @arg cy : cytoscape.js object + * @return : layoutInfo object initialized + */ + + + var createLayoutInfo = function createLayoutInfo(cy, layout, options) { + // Shortcut + var edges = options.eles.edges(); + var nodes = options.eles.nodes(); + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + var layoutInfo = { + isCompound: cy.hasCompoundNodes(), + layoutNodes: [], + idToIndex: {}, + nodeSize: nodes.size(), + graphSet: [], + indexToGraph: [], + layoutEdges: [], + edgeSize: edges.size(), + temperature: options.initialTemp, + clientWidth: bb.w, + clientHeight: bb.h, + boundingBox: bb + }; + var components = options.eles.components(); + var id2cmptId = {}; + + for (var i = 0; i < components.length; i++) { + var component = components[i]; + + for (var j = 0; j < component.length; j++) { + var node = component[j]; + id2cmptId[node.id()] = i; + } + } // Iterate over all nodes, creating layout nodes + + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = nodes[i]; + var nbb = n.layoutDimensions(options); + var tempNode = {}; + tempNode.isLocked = n.locked(); + tempNode.id = n.data('id'); + tempNode.parentId = n.data('parent'); + tempNode.cmptId = id2cmptId[n.id()]; + tempNode.children = []; + tempNode.positionX = n.position('x'); + tempNode.positionY = n.position('y'); + tempNode.offsetX = 0; + tempNode.offsetY = 0; + tempNode.height = nbb.w; + tempNode.width = nbb.h; + tempNode.maxX = tempNode.positionX + tempNode.width / 2; + tempNode.minX = tempNode.positionX - tempNode.width / 2; + tempNode.maxY = tempNode.positionY + tempNode.height / 2; + tempNode.minY = tempNode.positionY - tempNode.height / 2; + tempNode.padLeft = parseFloat(n.style('padding')); + tempNode.padRight = parseFloat(n.style('padding')); + tempNode.padTop = parseFloat(n.style('padding')); + tempNode.padBottom = parseFloat(n.style('padding')); // forces + + tempNode.nodeRepulsion = fn$6(options.nodeRepulsion) ? options.nodeRepulsion(n) : options.nodeRepulsion; // Add new node + + layoutInfo.layoutNodes.push(tempNode); // Add entry to id-index map + + layoutInfo.idToIndex[tempNode.id] = i; + } // Inline implementation of a queue, used for traversing the graph in BFS order + + + var queue = []; + var start = 0; // Points to the start the queue + + var end = -1; // Points to the end of the queue + + var tempGraph = []; // Second pass to add child information and + // initialize queue for hierarchical traversal + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + var p_id = n.parentId; // Check if node n has a parent node + + if (null != p_id) { + // Add node Id to parent's list of children + layoutInfo.layoutNodes[layoutInfo.idToIndex[p_id]].children.push(n.id); + } else { + // If a node doesn't have a parent, then it's in the root graph + queue[++end] = n.id; + tempGraph.push(n.id); + } + } // Add root graph to graphSet + + + layoutInfo.graphSet.push(tempGraph); // Traverse the graph, level by level, + + while (start <= end) { + // Get the node to visit and remove it from queue + var node_id = queue[start++]; + var node_ix = layoutInfo.idToIndex[node_id]; + var node = layoutInfo.layoutNodes[node_ix]; + var children = node.children; + + if (children.length > 0) { + // Add children nodes as a new graph to graph set + layoutInfo.graphSet.push(children); // Add children to que queue to be visited + + for (var i = 0; i < children.length; i++) { + queue[++end] = children[i]; + } + } + } // Create indexToGraph map + + + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + + for (var j = 0; j < graph.length; j++) { + var index = layoutInfo.idToIndex[graph[j]]; + layoutInfo.indexToGraph[index] = i; + } + } // Iterate over all edges, creating Layout Edges + + + for (var i = 0; i < layoutInfo.edgeSize; i++) { + var e = edges[i]; + var tempEdge = {}; + tempEdge.id = e.data('id'); + tempEdge.sourceId = e.data('source'); + tempEdge.targetId = e.data('target'); // Compute ideal length + + var idealLength = fn$6(options.idealEdgeLength) ? options.idealEdgeLength(e) : options.idealEdgeLength; + var elasticity = fn$6(options.edgeElasticity) ? options.edgeElasticity(e) : options.edgeElasticity; // Check if it's an inter graph edge + + var sourceIx = layoutInfo.idToIndex[tempEdge.sourceId]; + var targetIx = layoutInfo.idToIndex[tempEdge.targetId]; + var sourceGraph = layoutInfo.indexToGraph[sourceIx]; + var targetGraph = layoutInfo.indexToGraph[targetIx]; + + if (sourceGraph != targetGraph) { + // Find lowest common graph ancestor + var lca = findLCA(tempEdge.sourceId, tempEdge.targetId, layoutInfo); // Compute sum of node depths, relative to lca graph + + var lcaGraph = layoutInfo.graphSet[lca]; + var depth = 0; // Source depth + + var tempNode = layoutInfo.layoutNodes[sourceIx]; + + while (-1 === lcaGraph.indexOf(tempNode.id)) { + tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]]; + depth++; + } // Target depth + + + tempNode = layoutInfo.layoutNodes[targetIx]; + + while (-1 === lcaGraph.indexOf(tempNode.id)) { + tempNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[tempNode.parentId]]; + depth++; + } // logDebug('LCA of nodes ' + tempEdge.sourceId + ' and ' + tempEdge.targetId + + // ". Index: " + lca + " Contents: " + lcaGraph.toString() + + // ". Depth: " + depth); + // Update idealLength + + + idealLength *= depth * options.nestingFactor; + } + + tempEdge.idealLength = idealLength; + tempEdge.elasticity = elasticity; + layoutInfo.layoutEdges.push(tempEdge); + } // Finally, return layoutInfo object + + + return layoutInfo; + }; + /** + * @brief : This function finds the index of the lowest common + * graph ancestor between 2 nodes in the subtree + * (from the graph hierarchy induced tree) whose + * root is graphIx + * + * @arg node1: node1's ID + * @arg node2: node2's ID + * @arg layoutInfo: layoutInfo object + * + */ + + + var findLCA = function findLCA(node1, node2, layoutInfo) { + // Find their common ancester, starting from the root graph + var res = findLCA_aux(node1, node2, 0, layoutInfo); + + if (2 > res.count) { + // If aux function couldn't find the common ancester, + // then it is the root graph + return 0; + } else { + return res.graph; + } + }; + /** + * @brief : Auxiliary function used for LCA computation + * + * @arg node1 : node1's ID + * @arg node2 : node2's ID + * @arg graphIx : subgraph index + * @arg layoutInfo : layoutInfo object + * + * @return : object of the form {count: X, graph: Y}, where: + * X is the number of ancestors (max: 2) found in + * graphIx (and it's subgraphs), + * Y is the graph index of the lowest graph containing + * all X nodes + */ + + + var findLCA_aux = function findLCA_aux(node1, node2, graphIx, layoutInfo) { + var graph = layoutInfo.graphSet[graphIx]; // If both nodes belongs to graphIx + + if (-1 < graph.indexOf(node1) && -1 < graph.indexOf(node2)) { + return { + count: 2, + graph: graphIx + }; + } // Make recursive calls for all subgraphs + + + var c = 0; + + for (var i = 0; i < graph.length; i++) { + var nodeId = graph[i]; + var nodeIx = layoutInfo.idToIndex[nodeId]; + var children = layoutInfo.layoutNodes[nodeIx].children; // If the node has no child, skip it + + if (0 === children.length) { + continue; + } + + var childGraphIx = layoutInfo.indexToGraph[layoutInfo.idToIndex[children[0]]]; + var result = findLCA_aux(node1, node2, childGraphIx, layoutInfo); + + if (0 === result.count) { + // Neither node1 nor node2 are present in this subgraph + continue; + } else if (1 === result.count) { + // One of (node1, node2) is present in this subgraph + c++; + + if (2 === c) { + // We've already found both nodes, no need to keep searching + break; + } + } else { + // Both nodes are present in this subgraph + return result; + } + } + + return { + count: c, + graph: graphIx + }; + }; + /** + * @brief: printsLayoutInfo into js console + * Only used for debbuging + */ + + +var printLayoutInfo; + /** + * @brief : Randomizes the position of all nodes + */ + + + var randomizePositions = function randomizePositions(layoutInfo, cy) { + var width = layoutInfo.clientWidth; + var height = layoutInfo.clientHeight; + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; // No need to randomize compound nodes or locked nodes + + if (0 === n.children.length && !n.isLocked) { + n.positionX = Math.random() * width; + n.positionY = Math.random() * height; + } + } + }; + + var getScaleInBoundsFn = function getScaleInBoundsFn(layoutInfo, options, nodes) { + var bb = layoutInfo.boundingBox; + var coseBB = { + x1: Infinity, + x2: -Infinity, + y1: Infinity, + y2: -Infinity + }; + + if (options.boundingBox) { + nodes.forEach(function (node) { + var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[node.data('id')]]; + coseBB.x1 = Math.min(coseBB.x1, lnode.positionX); + coseBB.x2 = Math.max(coseBB.x2, lnode.positionX); + coseBB.y1 = Math.min(coseBB.y1, lnode.positionY); + coseBB.y2 = Math.max(coseBB.y2, lnode.positionY); + }); + coseBB.w = coseBB.x2 - coseBB.x1; + coseBB.h = coseBB.y2 - coseBB.y1; + } + + return function (ele, i) { + var lnode = layoutInfo.layoutNodes[layoutInfo.idToIndex[ele.data('id')]]; + + if (options.boundingBox) { + // then add extra bounding box constraint + var pctX = (lnode.positionX - coseBB.x1) / coseBB.w; + var pctY = (lnode.positionY - coseBB.y1) / coseBB.h; + return { + x: bb.x1 + pctX * bb.w, + y: bb.y1 + pctY * bb.h + }; + } else { + return { + x: lnode.positionX, + y: lnode.positionY + }; + } + }; + }; + /** + * @brief : Updates the positions of nodes in the network + * @arg layoutInfo : LayoutInfo object + * @arg cy : Cytoscape object + * @arg options : Layout options + */ + + + var refreshPositions = function refreshPositions(layoutInfo, cy, options) { + // var s = 'Refreshing positions'; + // logDebug(s); + var layout = options.layout; + var nodes = options.eles.nodes(); + var getScaledPos = getScaleInBoundsFn(layoutInfo, options, nodes); + nodes.positions(getScaledPos); // Trigger layoutReady only on first call + + if (true !== layoutInfo.ready) { + // s = 'Triggering layoutready'; + // logDebug(s); + layoutInfo.ready = true; + layout.one('layoutready', options.ready); + layout.emit({ + type: 'layoutready', + layout: this + }); + } + }; + /** + * @brief : Logs a debug message in JS console, if DEBUG is ON + */ + // var logDebug = function(text) { + // if (DEBUG) { + // console.debug(text); + // } + // }; + + /** + * @brief : Performs one iteration of the physical simulation + * @arg layoutInfo : LayoutInfo object already initialized + * @arg cy : Cytoscape object + * @arg options : Layout options + */ + + + var step = function step(layoutInfo, options, _step) { + // var s = "\n\n###############################"; + // s += "\nSTEP: " + step; + // s += "\n###############################\n"; + // logDebug(s); + // Calculate node repulsions + calculateNodeForces(layoutInfo, options); // Calculate edge forces + + calculateEdgeForces(layoutInfo); // Calculate gravity forces + + calculateGravityForces(layoutInfo, options); // Propagate forces from parent to child + + propagateForces(layoutInfo); // Update positions based on calculated forces + + updatePositions(layoutInfo); + }; + /** + * @brief : Computes the node repulsion forces + */ + + + var calculateNodeForces = function calculateNodeForces(layoutInfo, options) { + // Go through each of the graphs in graphSet + // Nodes only repel each other if they belong to the same graph + // var s = 'calculateNodeForces'; + // logDebug(s); + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + var numNodes = graph.length; // s = "Set: " + graph.toString(); + // logDebug(s); + // Now get all the pairs of nodes + // Only get each pair once, (A, B) = (B, A) + + for (var j = 0; j < numNodes; j++) { + var node1 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; + + for (var k = j + 1; k < numNodes; k++) { + var node2 = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[k]]]; + nodeRepulsion(node1, node2, layoutInfo, options); + } + } + } + }; + + var randomDistance = function randomDistance(max) { + return -max + 2 * max * Math.random(); + }; + /** + * @brief : Compute the node repulsion forces between a pair of nodes + */ + + + var nodeRepulsion = function nodeRepulsion(node1, node2, layoutInfo, options) { + // var s = "Node repulsion. Node1: " + node1.id + " Node2: " + node2.id; + var cmptId1 = node1.cmptId; + var cmptId2 = node2.cmptId; + + if (cmptId1 !== cmptId2 && !layoutInfo.isCompound) { + return; + } // Get direction of line connecting both node centers + + + var directionX = node2.positionX - node1.positionX; + var directionY = node2.positionY - node1.positionY; + var maxRandDist = 1; // s += "\ndirectionX: " + directionX + ", directionY: " + directionY; + // If both centers are the same, apply a random force + + if (0 === directionX && 0 === directionY) { + directionX = randomDistance(maxRandDist); + directionY = randomDistance(maxRandDist); + } + + var overlap = nodesOverlap(node1, node2, directionX, directionY); + + if (overlap > 0) { + // s += "\nNodes DO overlap."; + // s += "\nOverlap: " + overlap; + // If nodes overlap, repulsion force is proportional + // to the overlap + var force = options.nodeOverlap * overlap; // Compute the module and components of the force vector + + var distance = Math.sqrt(directionX * directionX + directionY * directionY); // s += "\nDistance: " + distance; + + var forceX = force * directionX / distance; + var forceY = force * directionY / distance; + } else { + // s += "\nNodes do NOT overlap."; + // If there's no overlap, force is inversely proportional + // to squared distance + // Get clipping points for both nodes + var point1 = findClippingPoint(node1, directionX, directionY); + var point2 = findClippingPoint(node2, -1 * directionX, -1 * directionY); // Use clipping points to compute distance + + var distanceX = point2.x - point1.x; + var distanceY = point2.y - point1.y; + var distanceSqr = distanceX * distanceX + distanceY * distanceY; + var distance = Math.sqrt(distanceSqr); // s += "\nDistance: " + distance; + // Compute the module and components of the force vector + + var force = (node1.nodeRepulsion + node2.nodeRepulsion) / distanceSqr; + var forceX = force * distanceX / distance; + var forceY = force * distanceY / distance; + } // Apply force + + + if (!node1.isLocked) { + node1.offsetX -= forceX; + node1.offsetY -= forceY; + } + + if (!node2.isLocked) { + node2.offsetX += forceX; + node2.offsetY += forceY; + } // s += "\nForceX: " + forceX + " ForceY: " + forceY; + // logDebug(s); + + + return; + }; + /** + * @brief : Determines whether two nodes overlap or not + * @return : Amount of overlapping (0 => no overlap) + */ + + + var nodesOverlap = function nodesOverlap(node1, node2, dX, dY) { + if (dX > 0) { + var overlapX = node1.maxX - node2.minX; + } else { + var overlapX = node2.maxX - node1.minX; + } + + if (dY > 0) { + var overlapY = node1.maxY - node2.minY; + } else { + var overlapY = node2.maxY - node1.minY; + } + + if (overlapX >= 0 && overlapY >= 0) { + return Math.sqrt(overlapX * overlapX + overlapY * overlapY); + } else { + return 0; + } + }; + /** + * @brief : Finds the point in which an edge (direction dX, dY) intersects + * the rectangular bounding box of it's source/target node + */ + + + var findClippingPoint = function findClippingPoint(node, dX, dY) { + // Shorcuts + var X = node.positionX; + var Y = node.positionY; + var H = node.height || 1; + var W = node.width || 1; + var dirSlope = dY / dX; + var nodeSlope = H / W; // var s = 'Computing clipping point of node ' + node.id + + // " . Height: " + H + ", Width: " + W + + // "\nDirection " + dX + ", " + dY; + // + // Compute intersection + + var res = {}; // Case: Vertical direction (up) + + if (0 === dX && 0 < dY) { + res.x = X; // s += "\nUp direction"; + + res.y = Y + H / 2; + return res; + } // Case: Vertical direction (down) + + + if (0 === dX && 0 > dY) { + res.x = X; + res.y = Y + H / 2; // s += "\nDown direction"; + + return res; + } // Case: Intersects the right border + + + if (0 < dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) { + res.x = X + W / 2; + res.y = Y + W * dY / 2 / dX; // s += "\nRightborder"; + + return res; + } // Case: Intersects the left border + + + if (0 > dX && -1 * nodeSlope <= dirSlope && dirSlope <= nodeSlope) { + res.x = X - W / 2; + res.y = Y - W * dY / 2 / dX; // s += "\nLeftborder"; + + return res; + } // Case: Intersects the top border + + + if (0 < dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) { + res.x = X + H * dX / 2 / dY; + res.y = Y + H / 2; // s += "\nTop border"; + + return res; + } // Case: Intersects the bottom border + + + if (0 > dY && (dirSlope <= -1 * nodeSlope || dirSlope >= nodeSlope)) { + res.x = X - H * dX / 2 / dY; + res.y = Y - H / 2; // s += "\nBottom border"; + + return res; + } // s += "\nClipping point found at " + res.x + ", " + res.y; + // logDebug(s); + + + return res; + }; + /** + * @brief : Calculates all edge forces + */ + + + var calculateEdgeForces = function calculateEdgeForces(layoutInfo, options) { + // Iterate over all edges + for (var i = 0; i < layoutInfo.edgeSize; i++) { + // Get edge, source & target nodes + var edge = layoutInfo.layoutEdges[i]; + var sourceIx = layoutInfo.idToIndex[edge.sourceId]; + var source = layoutInfo.layoutNodes[sourceIx]; + var targetIx = layoutInfo.idToIndex[edge.targetId]; + var target = layoutInfo.layoutNodes[targetIx]; // Get direction of line connecting both node centers + + var directionX = target.positionX - source.positionX; + var directionY = target.positionY - source.positionY; // If both centers are the same, do nothing. + // A random force has already been applied as node repulsion + + if (0 === directionX && 0 === directionY) { + continue; + } // Get clipping points for both nodes + + + var point1 = findClippingPoint(source, directionX, directionY); + var point2 = findClippingPoint(target, -1 * directionX, -1 * directionY); + var lx = point2.x - point1.x; + var ly = point2.y - point1.y; + var l = Math.sqrt(lx * lx + ly * ly); + var force = Math.pow(edge.idealLength - l, 2) / edge.elasticity; + + if (0 !== l) { + var forceX = force * lx / l; + var forceY = force * ly / l; + } else { + var forceX = 0; + var forceY = 0; + } // Add this force to target and source nodes + + + if (!source.isLocked) { + source.offsetX += forceX; + source.offsetY += forceY; + } + + if (!target.isLocked) { + target.offsetX -= forceX; + target.offsetY -= forceY; + } // var s = 'Edge force between nodes ' + source.id + ' and ' + target.id; + // s += "\nDistance: " + l + " Force: (" + forceX + ", " + forceY + ")"; + // logDebug(s); + + } + }; + /** + * @brief : Computes gravity forces for all nodes + */ + + + var calculateGravityForces = function calculateGravityForces(layoutInfo, options) { + if (options.gravity === 0) { + return; + } + + var distThreshold = 1; // var s = 'calculateGravityForces'; + // logDebug(s); + + for (var i = 0; i < layoutInfo.graphSet.length; i++) { + var graph = layoutInfo.graphSet[i]; + var numNodes = graph.length; // s = "Set: " + graph.toString(); + // logDebug(s); + // Compute graph center + + if (0 === i) { + var centerX = layoutInfo.clientHeight / 2; + var centerY = layoutInfo.clientWidth / 2; + } else { + // Get Parent node for this graph, and use its position as center + var temp = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[0]]]; + var parent = layoutInfo.layoutNodes[layoutInfo.idToIndex[temp.parentId]]; + var centerX = parent.positionX; + var centerY = parent.positionY; + } // s = "Center found at: " + centerX + ", " + centerY; + // logDebug(s); + // Apply force to all nodes in graph + + + for (var j = 0; j < numNodes; j++) { + var node = layoutInfo.layoutNodes[layoutInfo.idToIndex[graph[j]]]; // s = "Node: " + node.id; + + if (node.isLocked) { + continue; + } + + var dx = centerX - node.positionX; + var dy = centerY - node.positionY; + var d = Math.sqrt(dx * dx + dy * dy); + + if (d > distThreshold) { + var fx = options.gravity * dx / d; + var fy = options.gravity * dy / d; + node.offsetX += fx; + node.offsetY += fy; // s += ": Applied force: " + fx + ", " + fy; + } // logDebug(s); + + } + } + }; + /** + * @brief : This function propagates the existing offsets from + * parent nodes to its descendents. + * @arg layoutInfo : layoutInfo Object + * @arg cy : cytoscape Object + * @arg options : Layout options + */ + + + var propagateForces = function propagateForces(layoutInfo, options) { + // Inline implementation of a queue, used for traversing the graph in BFS order + var queue = []; + var start = 0; // Points to the start the queue + + var end = -1; // Points to the end of the queue + // logDebug('propagateForces'); + // Start by visiting the nodes in the root graph + + queue.push.apply(queue, layoutInfo.graphSet[0]); + end += layoutInfo.graphSet[0].length; // Traverse the graph, level by level, + + while (start <= end) { + // Get the node to visit and remove it from queue + var nodeId = queue[start++]; + var nodeIndex = layoutInfo.idToIndex[nodeId]; + var node = layoutInfo.layoutNodes[nodeIndex]; + var children = node.children; // We only need to process the node if it's compound + + if (0 < children.length && !node.isLocked) { + var offX = node.offsetX; + var offY = node.offsetY; // var s = "Propagating offset from parent node : " + node.id + + // ". OffsetX: " + offX + ". OffsetY: " + offY; + // s += "\n Children: " + children.toString(); + // logDebug(s); + + for (var i = 0; i < children.length; i++) { + var childNode = layoutInfo.layoutNodes[layoutInfo.idToIndex[children[i]]]; // Propagate offset + + childNode.offsetX += offX; + childNode.offsetY += offY; // Add children to queue to be visited + + queue[++end] = children[i]; + } // Reset parent offsets + + + node.offsetX = 0; + node.offsetY = 0; + } + } + }; + /** + * @brief : Updates the layout model positions, based on + * the accumulated forces + */ + + + var updatePositions = function updatePositions(layoutInfo, options) { + // var s = 'Updating positions'; + // logDebug(s); + // Reset boundaries for compound nodes + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + + if (0 < n.children.length) { + // logDebug("Resetting boundaries of compound node: " + n.id); + n.maxX = undefined; + n.minX = undefined; + n.maxY = undefined; + n.minY = undefined; + } + } + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + + if (0 < n.children.length || n.isLocked) { + // No need to set compound or locked node position + // logDebug("Skipping position update of node: " + n.id); + continue; + } // s = "Node: " + n.id + " Previous position: (" + + // n.positionX + ", " + n.positionY + ")."; + // Limit displacement in order to improve stability + + + var tempForce = limitForce(n.offsetX, n.offsetY, layoutInfo.temperature); + n.positionX += tempForce.x; + n.positionY += tempForce.y; + n.offsetX = 0; + n.offsetY = 0; + n.minX = n.positionX - n.width; + n.maxX = n.positionX + n.width; + n.minY = n.positionY - n.height; + n.maxY = n.positionY + n.height; // s += " New Position: (" + n.positionX + ", " + n.positionY + ")."; + // logDebug(s); + // Update ancestry boudaries + + updateAncestryBoundaries(n, layoutInfo); + } // Update size, position of compund nodes + + + for (var i = 0; i < layoutInfo.nodeSize; i++) { + var n = layoutInfo.layoutNodes[i]; + + if (0 < n.children.length && !n.isLocked) { + n.positionX = (n.maxX + n.minX) / 2; + n.positionY = (n.maxY + n.minY) / 2; + n.width = n.maxX - n.minX; + n.height = n.maxY - n.minY; // s = "Updating position, size of compound node " + n.id; + // s += "\nPositionX: " + n.positionX + ", PositionY: " + n.positionY; + // s += "\nWidth: " + n.width + ", Height: " + n.height; + // logDebug(s); + } + } + }; + /** + * @brief : Limits a force (forceX, forceY) to be not + * greater (in modulo) than max. + 8 Preserves force direction. + */ + + + var limitForce = function limitForce(forceX, forceY, max) { + // var s = "Limiting force: (" + forceX + ", " + forceY + "). Max: " + max; + var force = Math.sqrt(forceX * forceX + forceY * forceY); + + if (force > max) { + var res = { + x: max * forceX / force, + y: max * forceY / force + }; + } else { + var res = { + x: forceX, + y: forceY + }; + } // s += ".\nResult: (" + res.x + ", " + res.y + ")"; + // logDebug(s); + + + return res; + }; + /** + * @brief : Function used for keeping track of compound node + * sizes, since they should bound all their subnodes. + */ + + + var updateAncestryBoundaries = function updateAncestryBoundaries(node, layoutInfo) { + // var s = "Propagating new position/size of node " + node.id; + var parentId = node.parentId; + + if (null == parentId) { + // If there's no parent, we are done + // s += ". No parent node."; + // logDebug(s); + return; + } // Get Parent Node + + + var p = layoutInfo.layoutNodes[layoutInfo.idToIndex[parentId]]; + var flag = false; // MaxX + + if (null == p.maxX || node.maxX + p.padRight > p.maxX) { + p.maxX = node.maxX + p.padRight; + flag = true; // s += "\nNew maxX for parent node " + p.id + ": " + p.maxX; + } // MinX + + + if (null == p.minX || node.minX - p.padLeft < p.minX) { + p.minX = node.minX - p.padLeft; + flag = true; // s += "\nNew minX for parent node " + p.id + ": " + p.minX; + } // MaxY + + + if (null == p.maxY || node.maxY + p.padBottom > p.maxY) { + p.maxY = node.maxY + p.padBottom; + flag = true; // s += "\nNew maxY for parent node " + p.id + ": " + p.maxY; + } // MinY + + + if (null == p.minY || node.minY - p.padTop < p.minY) { + p.minY = node.minY - p.padTop; + flag = true; // s += "\nNew minY for parent node " + p.id + ": " + p.minY; + } // If updated boundaries, propagate changes upward + + + if (flag) { + // logDebug(s); + return updateAncestryBoundaries(p, layoutInfo); + } // s += ". No changes in boundaries/position of parent node " + p.id; + // logDebug(s); + + + return; + }; + + var separateComponents = function separateComponents(layoutInfo, options) { + var nodes = layoutInfo.layoutNodes; + var components = []; + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var cid = node.cmptId; + var component = components[cid] = components[cid] || []; + component.push(node); + } + + var totalA = 0; + + for (var i = 0; i < components.length; i++) { + var c = components[i]; + + if (!c) { + continue; + } + + c.x1 = Infinity; + c.x2 = -Infinity; + c.y1 = Infinity; + c.y2 = -Infinity; + + for (var j = 0; j < c.length; j++) { + var n = c[j]; + c.x1 = Math.min(c.x1, n.positionX - n.width / 2); + c.x2 = Math.max(c.x2, n.positionX + n.width / 2); + c.y1 = Math.min(c.y1, n.positionY - n.height / 2); + c.y2 = Math.max(c.y2, n.positionY + n.height / 2); + } + + c.w = c.x2 - c.x1; + c.h = c.y2 - c.y1; + totalA += c.w * c.h; + } + + components.sort(function (c1, c2) { + return c2.w * c2.h - c1.w * c1.h; + }); + var x = 0; + var y = 0; + var usedW = 0; + var rowH = 0; + var maxRowW = Math.sqrt(totalA) * layoutInfo.clientWidth / layoutInfo.clientHeight; + + for (var i = 0; i < components.length; i++) { + var c = components[i]; + + if (!c) { + continue; + } + + for (var j = 0; j < c.length; j++) { + var n = c[j]; + + if (!n.isLocked) { + n.positionX += x - c.x1; + n.positionY += y - c.y1; + } + } + + x += c.w + options.componentSpacing; + usedW += c.w + options.componentSpacing; + rowH = Math.max(rowH, c.h); + + if (usedW > maxRowW) { + y += rowH + options.componentSpacing; + x = 0; + usedW = 0; + rowH = 0; + } + } + }; + + var defaults$3 = { + fit: true, + // whether to fit the viewport to the graph + padding: 30, + // padding used on fit + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + avoidOverlap: true, + // prevents node overlap, may overflow boundingBox if not enough space + avoidOverlapPadding: 10, + // extra spacing around nodes when avoidOverlap: true + nodeDimensionsIncludeLabels: false, + // Excludes the label when calculating node bounding boxes for the layout algorithm + spacingFactor: undefined, + // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up + condense: false, + // uses all available space on false, uses minimal space on true + rows: undefined, + // force num of rows in the grid + cols: undefined, + // force num of columns in the grid + position: function position(node) {}, + // returns { row, col } for element + sort: undefined, + // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function GridLayout(options) { + this.options = extend({}, defaults$3, options); + } + + GridLayout.prototype.run = function () { + var params = this.options; + var options = params; + var cy = params.cy; + var eles = options.eles; + var nodes = eles.nodes().not(':parent'); + + if (options.sort) { + nodes = nodes.sort(options.sort); + } + + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + + if (bb.h === 0 || bb.w === 0) { + eles.nodes().layoutPositions(this, options, function (ele) { + return { + x: bb.x1, + y: bb.y1 + }; + }); + } else { + // width/height * splits^2 = cells where splits is number of times to split width + var cells = nodes.size(); + var splits = Math.sqrt(cells * bb.h / bb.w); + var rows = Math.round(splits); + var cols = Math.round(bb.w / bb.h * splits); + + var small = function small(val) { + if (val == null) { + return Math.min(rows, cols); + } else { + var min = Math.min(rows, cols); + + if (min == rows) { + rows = val; + } else { + cols = val; + } + } + }; + + var large = function large(val) { + if (val == null) { + return Math.max(rows, cols); + } else { + var max = Math.max(rows, cols); + + if (max == rows) { + rows = val; + } else { + cols = val; + } + } + }; + + var oRows = options.rows; + var oCols = options.cols != null ? options.cols : options.columns; // if rows or columns were set in options, use those values + + if (oRows != null && oCols != null) { + rows = oRows; + cols = oCols; + } else if (oRows != null && oCols == null) { + rows = oRows; + cols = Math.ceil(cells / rows); + } else if (oRows == null && oCols != null) { + cols = oCols; + rows = Math.ceil(cells / cols); + } // otherwise use the automatic values and adjust accordingly + // if rounding was up, see if we can reduce rows or columns + else if (cols * rows > cells) { + var sm = small(); + var lg = large(); // reducing the small side takes away the most cells, so try it first + + if ((sm - 1) * lg >= cells) { + small(sm - 1); + } else if ((lg - 1) * sm >= cells) { + large(lg - 1); + } + } else { + // if rounding was too low, add rows or columns + while (cols * rows < cells) { + var _sm = small(); + + var _lg = large(); // try to add to larger side first (adds less in multiplication) + + + if ((_lg + 1) * _sm >= cells) { + large(_lg + 1); + } else { + small(_sm + 1); + } + } + } + + var cellWidth = bb.w / cols; + var cellHeight = bb.h / rows; + + if (options.condense) { + cellWidth = 0; + cellHeight = 0; + } + + if (options.avoidOverlap) { + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var pos = node._private.position; + + if (pos.x == null || pos.y == null) { + // for bb + pos.x = 0; + pos.y = 0; + } + + var nbb = node.layoutDimensions(options); + var p = options.avoidOverlapPadding; + var w = nbb.w + p; + var h = nbb.h + p; + cellWidth = Math.max(cellWidth, w); + cellHeight = Math.max(cellHeight, h); + } + } + + var cellUsed = {}; // e.g. 'c-0-2' => true + + var used = function used(row, col) { + return cellUsed['c-' + row + '-' + col] ? true : false; + }; + + var use = function use(row, col) { + cellUsed['c-' + row + '-' + col] = true; + }; // to keep track of current cell position + + + var row = 0; + var col = 0; + + var moveToNextCell = function moveToNextCell() { + col++; + + if (col >= cols) { + col = 0; + row++; + } + }; // get a cache of all the manual positions + + + var id2manPos = {}; + + for (var _i = 0; _i < nodes.length; _i++) { + var _node = nodes[_i]; + var rcPos = options.position(_node); + + if (rcPos && (rcPos.row !== undefined || rcPos.col !== undefined)) { + // must have at least row or col def'd + var _pos = { + row: rcPos.row, + col: rcPos.col + }; + + if (_pos.col === undefined) { + // find unused col + _pos.col = 0; + + while (used(_pos.row, _pos.col)) { + _pos.col++; + } + } else if (_pos.row === undefined) { + // find unused row + _pos.row = 0; + + while (used(_pos.row, _pos.col)) { + _pos.row++; + } + } + + id2manPos[_node.id()] = _pos; + use(_pos.row, _pos.col); + } + } + + var getPos = function getPos(element, i) { + var x, y; + + if (element.locked() || element.isParent()) { + return false; + } // see if we have a manual position set + + + var rcPos = id2manPos[element.id()]; + + if (rcPos) { + x = rcPos.col * cellWidth + cellWidth / 2 + bb.x1; + y = rcPos.row * cellHeight + cellHeight / 2 + bb.y1; + } else { + // otherwise set automatically + while (used(row, col)) { + moveToNextCell(); + } + + x = col * cellWidth + cellWidth / 2 + bb.x1; + y = row * cellHeight + cellHeight / 2 + bb.y1; + use(row, col); + moveToNextCell(); + } + + return { + x: x, + y: y + }; + }; + + nodes.layoutPositions(this, options, getPos); + } + + return this; // chaining + }; + + var defaults$2 = { + ready: function ready() {}, + // on layoutready + stop: function stop() {} // on layoutstop + + }; // constructor + // options : object containing layout options + + function NullLayout(options) { + this.options = extend({}, defaults$2, options); + } // runs the layout + + + NullLayout.prototype.run = function () { + var options = this.options; + var eles = options.eles; // elements to consider in the layout + + var layout = this; // cy is automatically populated for us in the constructor + // (disable eslint for next line as this serves as example layout code to external developers) + // eslint-disable-next-line no-unused-vars + + options.cy; + layout.emit('layoutstart'); // puts all nodes at (0, 0) + // n.b. most layouts would use layoutPositions(), instead of positions() and manual events + + eles.nodes().positions(function () { + return { + x: 0, + y: 0 + }; + }); // trigger layoutready when each node has had its position set at least once + + layout.one('layoutready', options.ready); + layout.emit('layoutready'); // trigger layoutstop when the layout stops (e.g. finishes) + + layout.one('layoutstop', options.stop); + layout.emit('layoutstop'); + return this; // chaining + }; // called on continuous layouts to stop them before they finish + + + NullLayout.prototype.stop = function () { + return this; // chaining + }; + + var defaults$1 = { + positions: undefined, + // map of (node id) => (position obj); or function(node){ return somPos; } + zoom: undefined, + // the zoom level to set (prob want fit = false if set) + pan: undefined, + // the pan level to set (prob want fit = false if set) + fit: true, + // whether to fit to viewport + padding: 30, + // padding on fit + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function PresetLayout(options) { + this.options = extend({}, defaults$1, options); + } + + PresetLayout.prototype.run = function () { + var options = this.options; + var eles = options.eles; + var nodes = eles.nodes(); + var posIsFn = fn$6(options.positions); + + function getPosition(node) { + if (options.positions == null) { + return copyPosition(node.position()); + } + + if (posIsFn) { + return options.positions(node); + } + + var pos = options.positions[node._private.data.id]; + + if (pos == null) { + return null; + } + + return pos; + } + + nodes.layoutPositions(this, options, function (node, i) { + var position = getPosition(node); + + if (node.locked() || position == null) { + return false; + } + + return position; + }); + return this; // chaining + }; + + var defaults = { + fit: true, + // whether to fit to viewport + padding: 30, + // fit padding + boundingBox: undefined, + // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } + animate: false, + // whether to transition the node positions + animationDuration: 500, + // duration of animation in ms if enabled + animationEasing: undefined, + // easing of animation if enabled + animateFilter: function animateFilter(node, i) { + return true; + }, + // a function that determines whether the node should be animated. All nodes animated by default on animate enabled. Non-animated nodes are positioned immediately when the layout starts + ready: undefined, + // callback on layoutready + stop: undefined, + // callback on layoutstop + transform: function transform(node, position) { + return position; + } // transform a given node position. Useful for changing flow direction in discrete layouts + + }; + + function RandomLayout(options) { + this.options = extend({}, defaults, options); + } + + RandomLayout.prototype.run = function () { + var options = this.options; + var cy = options.cy; + var eles = options.eles; + var bb = makeBoundingBox(options.boundingBox ? options.boundingBox : { + x1: 0, + y1: 0, + w: cy.width(), + h: cy.height() + }); + + var getPos = function getPos(node, i) { + return { + x: bb.x1 + Math.round(Math.random() * bb.w), + y: bb.y1 + Math.round(Math.random() * bb.h) + }; + }; + + eles.nodes().layoutPositions(this, options, getPos); + return this; // chaining + }; + + var layout = [{ + name: 'breadthfirst', + impl: BreadthFirstLayout + }, { + name: 'circle', + impl: CircleLayout + }, { + name: 'concentric', + impl: ConcentricLayout + }, { + name: 'cose', + impl: CoseLayout + }, { + name: 'grid', + impl: GridLayout + }, { + name: 'null', + impl: NullLayout + }, { + name: 'preset', + impl: PresetLayout + }, { + name: 'random', + impl: RandomLayout + }]; + + function NullRenderer(options) { + this.options = options; + this.notifications = 0; // for testing + } + + var noop = function noop() {}; + + var throwImgErr = function throwImgErr() { + throw new Error('A headless instance can not render images'); + }; + + NullRenderer.prototype = { + recalculateRenderedStyle: noop, + notify: function notify() { + this.notifications++; + }, + init: noop, + isHeadless: function isHeadless() { + return true; + }, + png: throwImgErr, + jpg: throwImgErr + }; + + var BRp$f = {}; + BRp$f.arrowShapeWidth = 0.3; + + BRp$f.registerArrowShapes = function () { + var arrowShapes = this.arrowShapes = {}; + var renderer = this; // Contract for arrow shapes: + // 0, 0 is arrow tip + // (0, 1) is direction towards node + // (1, 0) is right + // + // functional api: + // collide: check x, y in shape + // roughCollide: called before collide, no false negatives + // draw: draw + // spacing: dist(arrowTip, nodeBoundary) + // gap: dist(edgeTip, nodeBoundary), edgeTip may != arrowTip + + var bbCollide = function bbCollide(x, y, size, angle, translation, edgeWidth, padding) { + var x1 = translation.x - size / 2 - padding; + var x2 = translation.x + size / 2 + padding; + var y1 = translation.y - size / 2 - padding; + var y2 = translation.y + size / 2 + padding; + var inside = x1 <= x && x <= x2 && y1 <= y && y <= y2; + return inside; + }; + + var transform = function transform(x, y, size, angle, translation) { + var xRotated = x * Math.cos(angle) - y * Math.sin(angle); + var yRotated = x * Math.sin(angle) + y * Math.cos(angle); + var xScaled = xRotated * size; + var yScaled = yRotated * size; + var xTranslated = xScaled + translation.x; + var yTranslated = yScaled + translation.y; + return { + x: xTranslated, + y: yTranslated + }; + }; + + var transformPoints = function transformPoints(pts, size, angle, translation) { + var retPts = []; + + for (var i = 0; i < pts.length; i += 2) { + var x = pts[i]; + var y = pts[i + 1]; + retPts.push(transform(x, y, size, angle, translation)); + } + + return retPts; + }; + + var pointsToArr = function pointsToArr(pts) { + var ret = []; + + for (var i = 0; i < pts.length; i++) { + var p = pts[i]; + ret.push(p.x, p.y); + } + + return ret; + }; + + var standardGap = function standardGap(edge) { + return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').pfValue * 2; + }; + + var defineArrowShape = function defineArrowShape(name, defn) { + if (string(defn)) { + defn = arrowShapes[defn]; + } + + arrowShapes[name] = extend({ + name: name, + points: [-0.15, -0.3, 0.15, -0.3, 0.15, 0.3, -0.15, 0.3], + collide: function collide(x, y, size, angle, translation, padding) { + var points = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, points); + return inside; + }, + roughCollide: bbCollide, + draw: function draw(context, size, angle, translation) { + var points = transformPoints(this.points, size, angle, translation); + renderer.arrowShapeImpl('polygon')(context, points); + }, + spacing: function spacing(edge) { + return 0; + }, + gap: standardGap + }, defn); + }; + + defineArrowShape('none', { + collide: falsify, + roughCollide: falsify, + draw: noop$1, + spacing: zeroify, + gap: zeroify + }); + defineArrowShape('triangle', { + points: [-0.15, -0.3, 0, 0, 0.15, -0.3] + }); + defineArrowShape('arrow', 'triangle'); + defineArrowShape('triangle-backcurve', { + points: arrowShapes['triangle'].points, + controlPoint: [0, -0.15], + roughCollide: bbCollide, + draw: function draw(context, size, angle, translation, edgeWidth) { + var ptsTrans = transformPoints(this.points, size, angle, translation); + var ctrlPt = this.controlPoint; + var ctrlPtTrans = transform(ctrlPt[0], ctrlPt[1], size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, ptsTrans, ctrlPtTrans); + }, + gap: function gap(edge) { + return standardGap(edge) * 0.8; + } + }); + defineArrowShape('triangle-tee', { + points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0], + pointsTee: [-0.15, -0.4, -0.15, -0.5, 0.15, -0.5, 0.15, -0.4], + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var teePts = pointsToArr(transformPoints(this.pointsTee, size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.points, size, angle, translation); + var teePts = transformPoints(this.pointsTee, size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, teePts); + } + }); + defineArrowShape('circle-triangle', { + radius: 0.15, + pointsTr: [0, -0.15, 0.15, -0.45, -0.15, -0.45, 0, -0.15], + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var t = translation; + var circleInside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2); + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + return pointInsidePolygonPoints(x, y, triPts) || circleInside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.pointsTr, size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, translation.x, translation.y, this.radius * size); + }, + spacing: function spacing(edge) { + return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius; + } + }); + defineArrowShape('triangle-cross', { + points: [0, 0, 0.15, -0.3, -0.15, -0.3, 0, 0], + baseCrossLinePts: [-0.15, -0.4, // first half of the rectangle + -0.15, -0.4, 0.15, -0.4, // second half of the rectangle + 0.15, -0.4], + crossLinePts: function crossLinePts(size, edgeWidth) { + // shift points so that the distance between the cross points matches edge width + var p = this.baseCrossLinePts.slice(); + var shiftFactor = edgeWidth / size; + var y0 = 3; + var y1 = 5; + p[y0] = p[y0] - shiftFactor; + p[y1] = p[y1] - shiftFactor; + return p; + }, + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var triPts = pointsToArr(transformPoints(this.points, size + 2 * padding, angle, translation)); + var teePts = pointsToArr(transformPoints(this.crossLinePts(size, edgeWidth), size + 2 * padding, angle, translation)); + var inside = pointInsidePolygonPoints(x, y, triPts) || pointInsidePolygonPoints(x, y, teePts); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + var triPts = transformPoints(this.points, size, angle, translation); + var crossLinePts = transformPoints(this.crossLinePts(size, edgeWidth), size, angle, translation); + renderer.arrowShapeImpl(this.name)(context, triPts, crossLinePts); + } + }); + defineArrowShape('vee', { + points: [-0.15, -0.3, 0, 0, 0.15, -0.3, 0, -0.15], + gap: function gap(edge) { + return standardGap(edge) * 0.525; + } + }); + defineArrowShape('circle', { + radius: 0.15, + collide: function collide(x, y, size, angle, translation, edgeWidth, padding) { + var t = translation; + var inside = Math.pow(t.x - x, 2) + Math.pow(t.y - y, 2) <= Math.pow((size + 2 * padding) * this.radius, 2); + return inside; + }, + draw: function draw(context, size, angle, translation, edgeWidth) { + renderer.arrowShapeImpl(this.name)(context, translation.x, translation.y, this.radius * size); + }, + spacing: function spacing(edge) { + return renderer.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.radius; + } + }); + defineArrowShape('tee', { + points: [-0.15, 0, -0.15, -0.1, 0.15, -0.1, 0.15, 0], + spacing: function spacing(edge) { + return 1; + }, + gap: function gap(edge) { + return 1; + } + }); + defineArrowShape('square', { + points: [-0.15, 0.00, 0.15, 0.00, 0.15, -0.3, -0.15, -0.3] + }); + defineArrowShape('diamond', { + points: [-0.15, -0.15, 0, -0.3, 0.15, -0.15, 0, 0], + gap: function gap(edge) { + return edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value; + } + }); + defineArrowShape('chevron', { + points: [0, 0, -0.15, -0.15, -0.1, -0.2, 0, -0.1, 0.1, -0.2, 0.15, -0.15], + gap: function gap(edge) { + return 0.95 * edge.pstyle('width').pfValue * edge.pstyle('arrow-scale').value; + } + }); + }; + + var BRp$e = {}; // Project mouse + + BRp$e.projectIntoViewport = function (clientX, clientY) { + var cy = this.cy; + var offsets = this.findContainerClientCoords(); + var offsetLeft = offsets[0]; + var offsetTop = offsets[1]; + var scale = offsets[4]; + var pan = cy.pan(); + var zoom = cy.zoom(); + var x = ((clientX - offsetLeft) / scale - pan.x) / zoom; + var y = ((clientY - offsetTop) / scale - pan.y) / zoom; + return [x, y]; + }; + + BRp$e.findContainerClientCoords = function () { + if (this.containerBB) { + return this.containerBB; + } + + var container = this.container; + var rect = container.getBoundingClientRect(); + var style = this.cy.window().getComputedStyle(container); + + var styleValue = function styleValue(name) { + return parseFloat(style.getPropertyValue(name)); + }; + + var padding = { + left: styleValue('padding-left'), + right: styleValue('padding-right'), + top: styleValue('padding-top'), + bottom: styleValue('padding-bottom') + }; + var border = { + left: styleValue('border-left-width'), + right: styleValue('border-right-width'), + top: styleValue('border-top-width'), + bottom: styleValue('border-bottom-width') + }; + var clientWidth = container.clientWidth; + var clientHeight = container.clientHeight; + var paddingHor = padding.left + padding.right; + var paddingVer = padding.top + padding.bottom; + var borderHor = border.left + border.right; + var scale = rect.width / (clientWidth + borderHor); + var unscaledW = clientWidth - paddingHor; + var unscaledH = clientHeight - paddingVer; + var left = rect.left + padding.left + border.left; + var top = rect.top + padding.top + border.top; + return this.containerBB = [left, top, unscaledW, unscaledH, scale]; + }; + + BRp$e.invalidateContainerClientCoordsCache = function () { + this.containerBB = null; + }; + + BRp$e.findNearestElement = function (x, y, interactiveElementsOnly, isTouch) { + return this.findNearestElements(x, y, interactiveElementsOnly, isTouch)[0]; + }; + + BRp$e.findNearestElements = function (x, y, interactiveElementsOnly, isTouch) { + var self = this; + var r = this; + var eles = r.getCachedZSortedEles(); + var near = []; // 1 node max, 1 edge max + + var zoom = r.cy.zoom(); + var hasCompounds = r.cy.hasCompoundNodes(); + var edgeThreshold = (isTouch ? 24 : 8) / zoom; + var nodeThreshold = (isTouch ? 8 : 2) / zoom; + var labelThreshold = (isTouch ? 8 : 2) / zoom; + var minSqDist = Infinity; + var nearEdge; + var nearNode; + + if (interactiveElementsOnly) { + eles = eles.interactive; + } + + function addEle(ele, sqDist) { + if (ele.isNode()) { + if (nearNode) { + return; // can't replace node + } else { + nearNode = ele; + near.push(ele); + } + } + + if (ele.isEdge() && (sqDist == null || sqDist < minSqDist)) { + if (nearEdge) { + // then replace existing edge + // can replace only if same z-index + if (nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value && nearEdge.pstyle('z-compound-depth').value === ele.pstyle('z-compound-depth').value) { + for (var i = 0; i < near.length; i++) { + if (near[i].isEdge()) { + near[i] = ele; + nearEdge = ele; + minSqDist = sqDist != null ? sqDist : minSqDist; + break; + } + } + } + } else { + near.push(ele); + nearEdge = ele; + minSqDist = sqDist != null ? sqDist : minSqDist; + } + } + } + + function checkNode(node) { + var width = node.outerWidth() + 2 * nodeThreshold; + var height = node.outerHeight() + 2 * nodeThreshold; + var hw = width / 2; + var hh = height / 2; + var pos = node.position(); + + if (pos.x - hw <= x && x <= pos.x + hw // bb check x + && pos.y - hh <= y && y <= pos.y + hh // bb check y + ) { + var shape = r.nodeShapes[self.getNodeShape(node)]; + + if (shape.checkPoint(x, y, 0, width, height, pos.x, pos.y)) { + addEle(node, 0); + return true; + } + } + } + + function checkEdge(edge) { + var _p = edge._private; + var rs = _p.rscratch; + var styleWidth = edge.pstyle('width').pfValue; + var scale = edge.pstyle('arrow-scale').value; + var width = styleWidth / 2 + edgeThreshold; // more like a distance radius from centre + + var widthSq = width * width; + var width2 = width * 2; + var src = _p.source; + var tgt = _p.target; + var sqDist; + + if (rs.edgeType === 'segments' || rs.edgeType === 'straight' || rs.edgeType === 'haystack') { + var pts = rs.allpts; + + for (var i = 0; i + 3 < pts.length; i += 2) { + if (inLineVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], width2) && widthSq > (sqDist = sqdistToFiniteLine(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3]))) { + addEle(edge, sqDist); + return true; + } + } + } else if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') { + var pts = rs.allpts; + + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + if (inBezierVicinity(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5], width2) && widthSq > (sqDist = sqdistToQuadraticBezier(x, y, pts[i], pts[i + 1], pts[i + 2], pts[i + 3], pts[i + 4], pts[i + 5]))) { + addEle(edge, sqDist); + return true; + } + } + } // if we're close to the edge but didn't hit it, maybe we hit its arrows + + + var src = src || _p.source; + var tgt = tgt || _p.target; + var arSize = self.getArrowWidth(styleWidth, scale); + var arrows = [{ + name: 'source', + x: rs.arrowStartX, + y: rs.arrowStartY, + angle: rs.srcArrowAngle + }, { + name: 'target', + x: rs.arrowEndX, + y: rs.arrowEndY, + angle: rs.tgtArrowAngle + }, { + name: 'mid-source', + x: rs.midX, + y: rs.midY, + angle: rs.midsrcArrowAngle + }, { + name: 'mid-target', + x: rs.midX, + y: rs.midY, + angle: rs.midtgtArrowAngle + }]; + + for (var i = 0; i < arrows.length; i++) { + var ar = arrows[i]; + var shape = r.arrowShapes[edge.pstyle(ar.name + '-arrow-shape').value]; + var edgeWidth = edge.pstyle('width').pfValue; + + if (shape.roughCollide(x, y, arSize, ar.angle, { + x: ar.x, + y: ar.y + }, edgeWidth, edgeThreshold) && shape.collide(x, y, arSize, ar.angle, { + x: ar.x, + y: ar.y + }, edgeWidth, edgeThreshold)) { + addEle(edge); + return true; + } + } // for compound graphs, hitting edge may actually want a connected node instead (b/c edge may have greater z-index precedence) + + + if (hasCompounds && near.length > 0) { + checkNode(src); + checkNode(tgt); + } + } + + function preprop(obj, name, pre) { + return getPrefixedProperty(obj, name, pre); + } + + function checkLabel(ele, prefix) { + var _p = ele._private; + var th = labelThreshold; + var prefixDash; + + if (prefix) { + prefixDash = prefix + '-'; + } else { + prefixDash = ''; + } + + ele.boundingBox(); + var bb = _p.labelBounds[prefix || 'main']; + var text = ele.pstyle(prefixDash + 'label').value; + var eventsEnabled = ele.pstyle('text-events').strValue === 'yes'; + + if (!eventsEnabled || !text) { + return; + } + + var lx = preprop(_p.rscratch, 'labelX', prefix); + var ly = preprop(_p.rscratch, 'labelY', prefix); + var theta = preprop(_p.rscratch, 'labelAngle', prefix); + var ox = ele.pstyle(prefixDash + 'text-margin-x').pfValue; + var oy = ele.pstyle(prefixDash + 'text-margin-y').pfValue; + var lx1 = bb.x1 - th - ox; // (-ox, -oy) as bb already includes margin + + var lx2 = bb.x2 + th - ox; // and rotation is about (lx, ly) + + var ly1 = bb.y1 - th - oy; + var ly2 = bb.y2 + th - oy; + + if (theta) { + var cos = Math.cos(theta); + var sin = Math.sin(theta); + + var rotate = function rotate(x, y) { + x = x - lx; + y = y - ly; + return { + x: x * cos - y * sin + lx, + y: x * sin + y * cos + ly + }; + }; + + var px1y1 = rotate(lx1, ly1); + var px1y2 = rotate(lx1, ly2); + var px2y1 = rotate(lx2, ly1); + var px2y2 = rotate(lx2, ly2); + var points = [// with the margin added after the rotation is applied + px1y1.x + ox, px1y1.y + oy, px2y1.x + ox, px2y1.y + oy, px2y2.x + ox, px2y2.y + oy, px1y2.x + ox, px1y2.y + oy]; + + if (pointInsidePolygonPoints(x, y, points)) { + addEle(ele); + return true; + } + } else { + // do a cheaper bb check + if (inBoundingBox(bb, x, y)) { + addEle(ele); + return true; + } + } + } + + for (var i = eles.length - 1; i >= 0; i--) { + // reverse order for precedence + var ele = eles[i]; + + if (ele.isNode()) { + checkNode(ele) || checkLabel(ele); + } else { + // then edge + checkEdge(ele) || checkLabel(ele) || checkLabel(ele, 'source') || checkLabel(ele, 'target'); + } + } + + return near; + }; // 'Give me everything from this box' + + + BRp$e.getAllInBox = function (x1, y1, x2, y2) { + var eles = this.getCachedZSortedEles().interactive; + var box = []; + var x1c = Math.min(x1, x2); + var x2c = Math.max(x1, x2); + var y1c = Math.min(y1, y2); + var y2c = Math.max(y1, y2); + x1 = x1c; + x2 = x2c; + y1 = y1c; + y2 = y2c; + var boxBb = makeBoundingBox({ + x1: x1, + y1: y1, + x2: x2, + y2: y2 + }); + + for (var e = 0; e < eles.length; e++) { + var ele = eles[e]; + + if (ele.isNode()) { + var node = ele; + var nodeBb = node.boundingBox({ + includeNodes: true, + includeEdges: false, + includeLabels: false + }); + + if (boundingBoxesIntersect(boxBb, nodeBb) && !boundingBoxInBoundingBox(nodeBb, boxBb)) { + box.push(node); + } + } else { + var edge = ele; + var _p = edge._private; + var rs = _p.rscratch; + + if (rs.startX != null && rs.startY != null && !inBoundingBox(boxBb, rs.startX, rs.startY)) { + continue; + } + + if (rs.endX != null && rs.endY != null && !inBoundingBox(boxBb, rs.endX, rs.endY)) { + continue; + } + + if (rs.edgeType === 'bezier' || rs.edgeType === 'multibezier' || rs.edgeType === 'self' || rs.edgeType === 'compound' || rs.edgeType === 'segments' || rs.edgeType === 'haystack') { + var pts = _p.rstyle.bezierPts || _p.rstyle.linePts || _p.rstyle.haystackPts; + var allInside = true; + + for (var i = 0; i < pts.length; i++) { + if (!pointInBoundingBox(boxBb, pts[i])) { + allInside = false; + break; + } + } + + if (allInside) { + box.push(edge); + } + } else if (rs.edgeType === 'haystack' || rs.edgeType === 'straight') { + box.push(edge); + } + } + } + + return box; + }; + + var BRp$d = {}; + + BRp$d.calculateArrowAngles = function (edge) { + var rs = edge._private.rscratch; + var isHaystack = rs.edgeType === 'haystack'; + var isBezier = rs.edgeType === 'bezier'; + var isMultibezier = rs.edgeType === 'multibezier'; + var isSegments = rs.edgeType === 'segments'; + var isCompound = rs.edgeType === 'compound'; + var isSelf = rs.edgeType === 'self'; // Displacement gives direction for arrowhead orientation + + var dispX, dispY; + var startX, startY, endX, endY, midX, midY; + + if (isHaystack) { + startX = rs.haystackPts[0]; + startY = rs.haystackPts[1]; + endX = rs.haystackPts[2]; + endY = rs.haystackPts[3]; + } else { + startX = rs.arrowStartX; + startY = rs.arrowStartY; + endX = rs.arrowEndX; + endY = rs.arrowEndY; + } + + midX = rs.midX; + midY = rs.midY; // source + // + + if (isSegments) { + dispX = startX - rs.segpts[0]; + dispY = startY - rs.segpts[1]; + } else if (isMultibezier || isCompound || isSelf || isBezier) { + var pts = rs.allpts; + var bX = qbezierAt(pts[0], pts[2], pts[4], 0.1); + var bY = qbezierAt(pts[1], pts[3], pts[5], 0.1); + dispX = startX - bX; + dispY = startY - bY; + } else { + dispX = startX - midX; + dispY = startY - midY; + } + + rs.srcArrowAngle = getAngleFromDisp(dispX, dispY); // mid target + // + + var midX = rs.midX; + var midY = rs.midY; + + if (isHaystack) { + midX = (startX + endX) / 2; + midY = (startY + endY) / 2; + } + + dispX = endX - startX; + dispY = endY - startY; + + if (isSegments) { + var pts = rs.allpts; + + if (pts.length / 2 % 2 === 0) { + var i2 = pts.length / 2; + var i1 = i2 - 2; + dispX = pts[i2] - pts[i1]; + dispY = pts[i2 + 1] - pts[i1 + 1]; + } else { + var i2 = pts.length / 2 - 1; + var i1 = i2 - 2; + var i3 = i2 + 2; + dispX = pts[i2] - pts[i1]; + dispY = pts[i2 + 1] - pts[i1 + 1]; + } + } else if (isMultibezier || isCompound || isSelf) { + var pts = rs.allpts; + var cpts = rs.ctrlpts; + var bp0x, bp0y; + var bp1x, bp1y; + + if (cpts.length / 2 % 2 === 0) { + var p0 = pts.length / 2 - 1; // startpt + + var ic = p0 + 2; + var p1 = ic + 2; + bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0); + bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0); + bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.0001); + bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.0001); + } else { + var ic = pts.length / 2 - 1; // ctrpt + + var p0 = ic - 2; // startpt + + var p1 = ic + 2; // endpt + + bp0x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.4999); + bp0y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.4999); + bp1x = qbezierAt(pts[p0], pts[ic], pts[p1], 0.5); + bp1y = qbezierAt(pts[p0 + 1], pts[ic + 1], pts[p1 + 1], 0.5); + } + + dispX = bp1x - bp0x; + dispY = bp1y - bp0y; + } + + rs.midtgtArrowAngle = getAngleFromDisp(dispX, dispY); + rs.midDispX = dispX; + rs.midDispY = dispY; // mid source + // + + dispX *= -1; + dispY *= -1; + + if (isSegments) { + var pts = rs.allpts; + + if (pts.length / 2 % 2 === 0) ; else { + var i2 = pts.length / 2 - 1; + var i3 = i2 + 2; + dispX = -(pts[i3] - pts[i2]); + dispY = -(pts[i3 + 1] - pts[i2 + 1]); + } + } + + rs.midsrcArrowAngle = getAngleFromDisp(dispX, dispY); // target + // + + if (isSegments) { + dispX = endX - rs.segpts[rs.segpts.length - 2]; + dispY = endY - rs.segpts[rs.segpts.length - 1]; + } else if (isMultibezier || isCompound || isSelf || isBezier) { + var pts = rs.allpts; + var l = pts.length; + var bX = qbezierAt(pts[l - 6], pts[l - 4], pts[l - 2], 0.9); + var bY = qbezierAt(pts[l - 5], pts[l - 3], pts[l - 1], 0.9); + dispX = endX - bX; + dispY = endY - bY; + } else { + dispX = endX - midX; + dispY = endY - midY; + } + + rs.tgtArrowAngle = getAngleFromDisp(dispX, dispY); + }; + + BRp$d.getArrowWidth = BRp$d.getArrowHeight = function (edgeWidth, scale) { + var cache = this.arrowWidthCache = this.arrowWidthCache || {}; + var cachedVal = cache[edgeWidth + ', ' + scale]; + + if (cachedVal) { + return cachedVal; + } + + cachedVal = Math.max(Math.pow(edgeWidth * 13.37, 0.9), 29) * scale; + cache[edgeWidth + ', ' + scale] = cachedVal; + return cachedVal; + }; + + var BRp$c = {}; + + BRp$c.findHaystackPoints = function (edges) { + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var _p = edge._private; + var rs = _p.rscratch; + + if (!rs.haystack) { + var angle = Math.random() * 2 * Math.PI; + rs.source = { + x: Math.cos(angle), + y: Math.sin(angle) + }; + angle = Math.random() * 2 * Math.PI; + rs.target = { + x: Math.cos(angle), + y: Math.sin(angle) + }; + } + + var src = _p.source; + var tgt = _p.target; + var srcPos = src.position(); + var tgtPos = tgt.position(); + var srcW = src.width(); + var tgtW = tgt.width(); + var srcH = src.height(); + var tgtH = tgt.height(); + var radius = edge.pstyle('haystack-radius').value; + var halfRadius = radius / 2; // b/c have to half width/height + + rs.haystackPts = rs.allpts = [rs.source.x * srcW * halfRadius + srcPos.x, rs.source.y * srcH * halfRadius + srcPos.y, rs.target.x * tgtW * halfRadius + tgtPos.x, rs.target.y * tgtH * halfRadius + tgtPos.y]; + rs.midX = (rs.allpts[0] + rs.allpts[2]) / 2; + rs.midY = (rs.allpts[1] + rs.allpts[3]) / 2; // always override as haystack in case set to different type previously + + rs.edgeType = 'haystack'; + rs.haystack = true; + this.storeEdgeProjections(edge); + this.calculateArrowAngles(edge); + this.recalculateEdgeLabelProjections(edge); + this.calculateLabelAngles(edge); + } + }; + + BRp$c.findSegmentsPoints = function (edge, pairInfo) { + // Segments (multiple straight lines) + var rs = edge._private.rscratch; + var posPts = pairInfo.posPts, + intersectionPts = pairInfo.intersectionPts, + vectorNormInverse = pairInfo.vectorNormInverse; + var edgeDistances = edge.pstyle('edge-distances').value; + var segmentWs = edge.pstyle('segment-weights'); + var segmentDs = edge.pstyle('segment-distances'); + var segmentsN = Math.min(segmentWs.pfValue.length, segmentDs.pfValue.length); + rs.edgeType = 'segments'; + rs.segpts = []; + + for (var s = 0; s < segmentsN; s++) { + var w = segmentWs.pfValue[s]; + var d = segmentDs.pfValue[s]; + var w1 = 1 - w; + var w2 = w; + var midptPts = edgeDistances === 'node-position' ? posPts : intersectionPts; + var adjustedMidpt = { + x: midptPts.x1 * w1 + midptPts.x2 * w2, + y: midptPts.y1 * w1 + midptPts.y2 * w2 + }; + rs.segpts.push(adjustedMidpt.x + vectorNormInverse.x * d, adjustedMidpt.y + vectorNormInverse.y * d); + } + }; + + BRp$c.findLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) { + // Self-edge + var rs = edge._private.rscratch; + var dirCounts = pairInfo.dirCounts, + srcPos = pairInfo.srcPos; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var loopDir = edge.pstyle('loop-direction').pfValue; + var loopSwp = edge.pstyle('loop-sweep').pfValue; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + rs.edgeType = 'self'; + var j = i; + var loopDist = stepSize; + + if (edgeIsUnbundled) { + j = 0; + loopDist = ctrlptDist; + } + + var loopAngle = loopDir - Math.PI / 2; + var outAngle = loopAngle - loopSwp / 2; + var inAngle = loopAngle + loopSwp / 2; // increase by step size for overlapping loops, keyed on direction and sweep values + + var dc = String(loopDir + '_' + loopSwp); + j = dirCounts[dc] === undefined ? dirCounts[dc] = 0 : ++dirCounts[dc]; + rs.ctrlpts = [srcPos.x + Math.cos(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(outAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.x + Math.cos(inAngle) * 1.4 * loopDist * (j / 3 + 1), srcPos.y + Math.sin(inAngle) * 1.4 * loopDist * (j / 3 + 1)]; + }; + + BRp$c.findCompoundLoopPoints = function (edge, pairInfo, i, edgeIsUnbundled) { + // Compound edge + var rs = edge._private.rscratch; + rs.edgeType = 'compound'; + var srcPos = pairInfo.srcPos, + tgtPos = pairInfo.tgtPos, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var j = i; + var loopDist = stepSize; + + if (edgeIsUnbundled) { + j = 0; + loopDist = ctrlptDist; + } + + var loopW = 50; + var loopaPos = { + x: srcPos.x - srcW / 2, + y: srcPos.y - srcH / 2 + }; + var loopbPos = { + x: tgtPos.x - tgtW / 2, + y: tgtPos.y - tgtH / 2 + }; + var loopPos = { + x: Math.min(loopaPos.x, loopbPos.x), + y: Math.min(loopaPos.y, loopbPos.y) + }; // avoids cases with impossible beziers + + var minCompoundStretch = 0.5; + var compoundStretchA = Math.max(minCompoundStretch, Math.log(srcW * 0.01)); + var compoundStretchB = Math.max(minCompoundStretch, Math.log(tgtW * 0.01)); + rs.ctrlpts = [loopPos.x, loopPos.y - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchA, loopPos.x - (1 + Math.pow(loopW, 1.12) / 100) * loopDist * (j / 3 + 1) * compoundStretchB, loopPos.y]; + }; + + BRp$c.findStraightEdgePoints = function (edge) { + // Straight edge within bundle + edge._private.rscratch.edgeType = 'straight'; + }; + + BRp$c.findBezierPoints = function (edge, pairInfo, i, edgeIsUnbundled, edgeIsSwapped) { + var rs = edge._private.rscratch; + var vectorNormInverse = pairInfo.vectorNormInverse, + posPts = pairInfo.posPts, + intersectionPts = pairInfo.intersectionPts; + var edgeDistances = edge.pstyle('edge-distances').value; + var stepSize = edge.pstyle('control-point-step-size').pfValue; + var ctrlptDists = edge.pstyle('control-point-distances'); + var ctrlptWs = edge.pstyle('control-point-weights'); + var bezierN = ctrlptDists && ctrlptWs ? Math.min(ctrlptDists.value.length, ctrlptWs.value.length) : 1; + var ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[0] : undefined; + var ctrlptWeight = ctrlptWs.value[0]; // (Multi)bezier + + var multi = edgeIsUnbundled; + rs.edgeType = multi ? 'multibezier' : 'bezier'; + rs.ctrlpts = []; + + for (var b = 0; b < bezierN; b++) { + var normctrlptDist = (0.5 - pairInfo.eles.length / 2 + i) * stepSize * (edgeIsSwapped ? -1 : 1); + var manctrlptDist = void 0; + var sign = signum(normctrlptDist); + + if (multi) { + ctrlptDist = ctrlptDists ? ctrlptDists.pfValue[b] : stepSize; // fall back on step size + + ctrlptWeight = ctrlptWs.value[b]; + } + + if (edgeIsUnbundled) { + // multi or single unbundled + manctrlptDist = ctrlptDist; + } else { + manctrlptDist = ctrlptDist !== undefined ? sign * ctrlptDist : undefined; + } + + var distanceFromMidpoint = manctrlptDist !== undefined ? manctrlptDist : normctrlptDist; + var w1 = 1 - ctrlptWeight; + var w2 = ctrlptWeight; + var midptPts = edgeDistances === 'node-position' ? posPts : intersectionPts; + var adjustedMidpt = { + x: midptPts.x1 * w1 + midptPts.x2 * w2, + y: midptPts.y1 * w1 + midptPts.y2 * w2 + }; + rs.ctrlpts.push(adjustedMidpt.x + vectorNormInverse.x * distanceFromMidpoint, adjustedMidpt.y + vectorNormInverse.y * distanceFromMidpoint); + } + }; + + BRp$c.findTaxiPoints = function (edge, pairInfo) { + // Taxicab geometry with two turns maximum + var rs = edge._private.rscratch; + rs.edgeType = 'segments'; + var VERTICAL = 'vertical'; + var HORIZONTAL = 'horizontal'; + var LEFTWARD = 'leftward'; + var RIGHTWARD = 'rightward'; + var DOWNWARD = 'downward'; + var UPWARD = 'upward'; + var AUTO = 'auto'; + var posPts = pairInfo.posPts, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH; + var edgeDistances = edge.pstyle('edge-distances').value; + var dIncludesNodeBody = edgeDistances !== 'node-position'; + var taxiDir = edge.pstyle('taxi-direction').value; + var rawTaxiDir = taxiDir; // unprocessed value + + var taxiTurn = edge.pstyle('taxi-turn'); + var turnIsPercent = taxiTurn.units === '%'; + var taxiTurnPfVal = taxiTurn.pfValue; + var turnIsNegative = taxiTurnPfVal < 0; // i.e. from target side + + var minD = edge.pstyle('taxi-turn-min-distance').pfValue; + var dw = dIncludesNodeBody ? (srcW + tgtW) / 2 : 0; + var dh = dIncludesNodeBody ? (srcH + tgtH) / 2 : 0; + var pdx = posPts.x2 - posPts.x1; + var pdy = posPts.y2 - posPts.y1; // take away the effective w/h from the magnitude of the delta value + + var subDWH = function subDWH(dxy, dwh) { + if (dxy > 0) { + return Math.max(dxy - dwh, 0); + } else { + return Math.min(dxy + dwh, 0); + } + }; + + var dx = subDWH(pdx, dw); + var dy = subDWH(pdy, dh); + var isExplicitDir = false; + + if (rawTaxiDir === AUTO) { + taxiDir = Math.abs(dx) > Math.abs(dy) ? HORIZONTAL : VERTICAL; + } else if (rawTaxiDir === UPWARD || rawTaxiDir === DOWNWARD) { + taxiDir = VERTICAL; + isExplicitDir = true; + } else if (rawTaxiDir === LEFTWARD || rawTaxiDir === RIGHTWARD) { + taxiDir = HORIZONTAL; + isExplicitDir = true; + } + + var isVert = taxiDir === VERTICAL; + var l = isVert ? dy : dx; + var pl = isVert ? pdy : pdx; + var sgnL = signum(pl); + var forcedDir = false; + + if (!(isExplicitDir && (turnIsPercent || turnIsNegative)) // forcing in this case would cause weird growing in the opposite direction + && (rawTaxiDir === DOWNWARD && pl < 0 || rawTaxiDir === UPWARD && pl > 0 || rawTaxiDir === LEFTWARD && pl > 0 || rawTaxiDir === RIGHTWARD && pl < 0)) { + sgnL *= -1; + l = sgnL * Math.abs(l); + forcedDir = true; + } + + var d; + + if (turnIsPercent) { + var p = taxiTurnPfVal < 0 ? 1 + taxiTurnPfVal : taxiTurnPfVal; + d = p * l; + } else { + var k = taxiTurnPfVal < 0 ? l : 0; + d = k + taxiTurnPfVal * sgnL; + } + + var getIsTooClose = function getIsTooClose(d) { + return Math.abs(d) < minD || Math.abs(d) >= Math.abs(l); + }; + + var isTooCloseSrc = getIsTooClose(d); + var isTooCloseTgt = getIsTooClose(Math.abs(l) - Math.abs(d)); + var isTooClose = isTooCloseSrc || isTooCloseTgt; + + if (isTooClose && !forcedDir) { + // non-ideal routing + if (isVert) { + // vertical fallbacks + var lShapeInsideSrc = Math.abs(pl) <= srcH / 2; + var lShapeInsideTgt = Math.abs(pdx) <= tgtW / 2; + + if (lShapeInsideSrc) { + // horizontal Z-shape (direction not respected) + var x = (posPts.x1 + posPts.x2) / 2; + var y1 = posPts.y1, + y2 = posPts.y2; + rs.segpts = [x, y1, x, y2]; + } else if (lShapeInsideTgt) { + // vertical Z-shape (distance not respected) + var y = (posPts.y1 + posPts.y2) / 2; + var x1 = posPts.x1, + x2 = posPts.x2; + rs.segpts = [x1, y, x2, y]; + } else { + // L-shape fallback (turn distance not respected, but works well with tree siblings) + rs.segpts = [posPts.x1, posPts.y2]; + } + } else { + // horizontal fallbacks + var _lShapeInsideSrc = Math.abs(pl) <= srcW / 2; + + var _lShapeInsideTgt = Math.abs(pdy) <= tgtH / 2; + + if (_lShapeInsideSrc) { + // vertical Z-shape (direction not respected) + var _y = (posPts.y1 + posPts.y2) / 2; + + var _x = posPts.x1, + _x2 = posPts.x2; + rs.segpts = [_x, _y, _x2, _y]; + } else if (_lShapeInsideTgt) { + // horizontal Z-shape (turn distance not respected) + var _x3 = (posPts.x1 + posPts.x2) / 2; + + var _y2 = posPts.y1, + _y3 = posPts.y2; + rs.segpts = [_x3, _y2, _x3, _y3]; + } else { + // L-shape (turn distance not respected, but works well for tree siblings) + rs.segpts = [posPts.x2, posPts.y1]; + } + } + } else { + // ideal routing + if (isVert) { + var _y4 = posPts.y1 + d + (dIncludesNodeBody ? srcH / 2 * sgnL : 0); + + var _x4 = posPts.x1, + _x5 = posPts.x2; + rs.segpts = [_x4, _y4, _x5, _y4]; + } else { + // horizontal + var _x6 = posPts.x1 + d + (dIncludesNodeBody ? srcW / 2 * sgnL : 0); + + var _y5 = posPts.y1, + _y6 = posPts.y2; + rs.segpts = [_x6, _y5, _x6, _y6]; + } + } + }; + + BRp$c.tryToCorrectInvalidPoints = function (edge, pairInfo) { + var rs = edge._private.rscratch; // can only correct beziers for now... + + if (rs.edgeType === 'bezier') { + var srcPos = pairInfo.srcPos, + tgtPos = pairInfo.tgtPos, + srcW = pairInfo.srcW, + srcH = pairInfo.srcH, + tgtW = pairInfo.tgtW, + tgtH = pairInfo.tgtH, + srcShape = pairInfo.srcShape, + tgtShape = pairInfo.tgtShape; + var badStart = !number$1(rs.startX) || !number$1(rs.startY); + var badAStart = !number$1(rs.arrowStartX) || !number$1(rs.arrowStartY); + var badEnd = !number$1(rs.endX) || !number$1(rs.endY); + var badAEnd = !number$1(rs.arrowEndX) || !number$1(rs.arrowEndY); + var minCpADistFactor = 3; + var arrowW = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth; + var minCpADist = minCpADistFactor * arrowW; + var startACpDist = dist({ + x: rs.ctrlpts[0], + y: rs.ctrlpts[1] + }, { + x: rs.startX, + y: rs.startY + }); + var closeStartACp = startACpDist < minCpADist; + var endACpDist = dist({ + x: rs.ctrlpts[0], + y: rs.ctrlpts[1] + }, { + x: rs.endX, + y: rs.endY + }); + var closeEndACp = endACpDist < minCpADist; + var overlapping = false; + + if (badStart || badAStart || closeStartACp) { + overlapping = true; // project control point along line from src centre to outside the src shape + // (otherwise intersection will yield nothing) + + var cpD = { + // delta + x: rs.ctrlpts[0] - srcPos.x, + y: rs.ctrlpts[1] - srcPos.y + }; + var cpL = Math.sqrt(cpD.x * cpD.x + cpD.y * cpD.y); // length of line + + var cpM = { + // normalised delta + x: cpD.x / cpL, + y: cpD.y / cpL + }; + var radius = Math.max(srcW, srcH); + var cpProj = { + // *2 radius guarantees outside shape + x: rs.ctrlpts[0] + cpM.x * 2 * radius, + y: rs.ctrlpts[1] + cpM.y * 2 * radius + }; + var srcCtrlPtIntn = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, cpProj.x, cpProj.y, 0); + + if (closeStartACp) { + rs.ctrlpts[0] = rs.ctrlpts[0] + cpM.x * (minCpADist - startACpDist); + rs.ctrlpts[1] = rs.ctrlpts[1] + cpM.y * (minCpADist - startACpDist); + } else { + rs.ctrlpts[0] = srcCtrlPtIntn[0] + cpM.x * minCpADist; + rs.ctrlpts[1] = srcCtrlPtIntn[1] + cpM.y * minCpADist; + } + } + + if (badEnd || badAEnd || closeEndACp) { + overlapping = true; // project control point along line from tgt centre to outside the tgt shape + // (otherwise intersection will yield nothing) + + var _cpD = { + // delta + x: rs.ctrlpts[0] - tgtPos.x, + y: rs.ctrlpts[1] - tgtPos.y + }; + + var _cpL = Math.sqrt(_cpD.x * _cpD.x + _cpD.y * _cpD.y); // length of line + + + var _cpM = { + // normalised delta + x: _cpD.x / _cpL, + y: _cpD.y / _cpL + }; + + var _radius = Math.max(srcW, srcH); + + var _cpProj = { + // *2 radius guarantees outside shape + x: rs.ctrlpts[0] + _cpM.x * 2 * _radius, + y: rs.ctrlpts[1] + _cpM.y * 2 * _radius + }; + var tgtCtrlPtIntn = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, _cpProj.x, _cpProj.y, 0); + + if (closeEndACp) { + rs.ctrlpts[0] = rs.ctrlpts[0] + _cpM.x * (minCpADist - endACpDist); + rs.ctrlpts[1] = rs.ctrlpts[1] + _cpM.y * (minCpADist - endACpDist); + } else { + rs.ctrlpts[0] = tgtCtrlPtIntn[0] + _cpM.x * minCpADist; + rs.ctrlpts[1] = tgtCtrlPtIntn[1] + _cpM.y * minCpADist; + } + } + + if (overlapping) { + // recalc endpts + this.findEndpoints(edge); + } + } + }; + + BRp$c.storeAllpts = function (edge) { + var rs = edge._private.rscratch; + + if (rs.edgeType === 'multibezier' || rs.edgeType === 'bezier' || rs.edgeType === 'self' || rs.edgeType === 'compound') { + rs.allpts = []; + rs.allpts.push(rs.startX, rs.startY); + + for (var b = 0; b + 1 < rs.ctrlpts.length; b += 2) { + // ctrl pt itself + rs.allpts.push(rs.ctrlpts[b], rs.ctrlpts[b + 1]); // the midpt between ctrlpts as intermediate destination pts + + if (b + 3 < rs.ctrlpts.length) { + rs.allpts.push((rs.ctrlpts[b] + rs.ctrlpts[b + 2]) / 2, (rs.ctrlpts[b + 1] + rs.ctrlpts[b + 3]) / 2); + } + } + + rs.allpts.push(rs.endX, rs.endY); + var m, mt; + + if (rs.ctrlpts.length / 2 % 2 === 0) { + m = rs.allpts.length / 2 - 1; + rs.midX = rs.allpts[m]; + rs.midY = rs.allpts[m + 1]; + } else { + m = rs.allpts.length / 2 - 3; + mt = 0.5; + rs.midX = qbezierAt(rs.allpts[m], rs.allpts[m + 2], rs.allpts[m + 4], mt); + rs.midY = qbezierAt(rs.allpts[m + 1], rs.allpts[m + 3], rs.allpts[m + 5], mt); + } + } else if (rs.edgeType === 'straight') { + // need to calc these after endpts + rs.allpts = [rs.startX, rs.startY, rs.endX, rs.endY]; // default midpt for labels etc + + rs.midX = (rs.startX + rs.endX + rs.arrowStartX + rs.arrowEndX) / 4; + rs.midY = (rs.startY + rs.endY + rs.arrowStartY + rs.arrowEndY) / 4; + } else if (rs.edgeType === 'segments') { + rs.allpts = []; + rs.allpts.push(rs.startX, rs.startY); + rs.allpts.push.apply(rs.allpts, rs.segpts); + rs.allpts.push(rs.endX, rs.endY); + + if (rs.segpts.length % 4 === 0) { + var i2 = rs.segpts.length / 2; + var i1 = i2 - 2; + rs.midX = (rs.segpts[i1] + rs.segpts[i2]) / 2; + rs.midY = (rs.segpts[i1 + 1] + rs.segpts[i2 + 1]) / 2; + } else { + var _i = rs.segpts.length / 2 - 1; + + rs.midX = rs.segpts[_i]; + rs.midY = rs.segpts[_i + 1]; + } + } + }; + + BRp$c.checkForInvalidEdgeWarning = function (edge) { + var rs = edge[0]._private.rscratch; + + if (rs.nodesOverlap || number$1(rs.startX) && number$1(rs.startY) && number$1(rs.endX) && number$1(rs.endY)) { + rs.loggedErr = false; + } else { + if (!rs.loggedErr) { + rs.loggedErr = true; + warn('Edge `' + edge.id() + '` has invalid endpoints and so it is impossible to draw. Adjust your edge style (e.g. control points) accordingly or use an alternative edge type. This is expected behaviour when the source node and the target node overlap.'); + } + } + }; + + BRp$c.findEdgeControlPoints = function (edges) { + var _this = this; + + if (!edges || edges.length === 0) { + return; + } + + var r = this; + var cy = r.cy; + var hasCompounds = cy.hasCompoundNodes(); + var hashTable = { + map: new Map$2(), + get: function get(pairId) { + var map2 = this.map.get(pairId[0]); + + if (map2 != null) { + return map2.get(pairId[1]); + } else { + return null; + } + }, + set: function set(pairId, val) { + var map2 = this.map.get(pairId[0]); + + if (map2 == null) { + map2 = new Map$2(); + this.map.set(pairId[0], map2); + } + + map2.set(pairId[1], val); + } + }; + var pairIds = []; + var haystackEdges = []; // create a table of edge (src, tgt) => list of edges between them + + for (var i = 0; i < edges.length; i++) { + var edge = edges[i]; + var _p = edge._private; + var curveStyle = edge.pstyle('curve-style').value; // ignore edges who are not to be displayed + // they shouldn't take up space + + if (edge.removed() || !edge.takesUpSpace()) { + continue; + } + + if (curveStyle === 'haystack') { + haystackEdges.push(edge); + continue; + } + + var edgeIsUnbundled = curveStyle === 'unbundled-bezier' || curveStyle === 'segments' || curveStyle === 'straight' || curveStyle === 'straight-triangle' || curveStyle === 'taxi'; + var edgeIsBezier = curveStyle === 'unbundled-bezier' || curveStyle === 'bezier'; + var src = _p.source; + var tgt = _p.target; + var srcIndex = src.poolIndex(); + var tgtIndex = tgt.poolIndex(); + var pairId = [srcIndex, tgtIndex].sort(); + var tableEntry = hashTable.get(pairId); + + if (tableEntry == null) { + tableEntry = { + eles: [] + }; + hashTable.set(pairId, tableEntry); + pairIds.push(pairId); + } + + tableEntry.eles.push(edge); + + if (edgeIsUnbundled) { + tableEntry.hasUnbundled = true; + } + + if (edgeIsBezier) { + tableEntry.hasBezier = true; + } + } // for each pair (src, tgt), create the ctrl pts + // Nested for loop is OK; total number of iterations for both loops = edgeCount + + + var _loop = function _loop(p) { + var pairId = pairIds[p]; + var pairInfo = hashTable.get(pairId); + var swappedpairInfo = void 0; + + if (!pairInfo.hasUnbundled) { + var pllEdges = pairInfo.eles[0].parallelEdges().filter(function (e) { + return e.isBundledBezier(); + }); + clearArray(pairInfo.eles); + pllEdges.forEach(function (edge) { + return pairInfo.eles.push(edge); + }); // for each pair id, the edges should be sorted by index + + pairInfo.eles.sort(function (edge1, edge2) { + return edge1.poolIndex() - edge2.poolIndex(); + }); + } + + var firstEdge = pairInfo.eles[0]; + var src = firstEdge.source(); + var tgt = firstEdge.target(); // make sure src/tgt distinction is consistent w.r.t. pairId + + if (src.poolIndex() > tgt.poolIndex()) { + var temp = src; + src = tgt; + tgt = temp; + } + + var srcPos = pairInfo.srcPos = src.position(); + var tgtPos = pairInfo.tgtPos = tgt.position(); + var srcW = pairInfo.srcW = src.outerWidth(); + var srcH = pairInfo.srcH = src.outerHeight(); + var tgtW = pairInfo.tgtW = tgt.outerWidth(); + var tgtH = pairInfo.tgtH = tgt.outerHeight(); + + var srcShape = pairInfo.srcShape = r.nodeShapes[_this.getNodeShape(src)]; + + var tgtShape = pairInfo.tgtShape = r.nodeShapes[_this.getNodeShape(tgt)]; + + pairInfo.dirCounts = { + 'north': 0, + 'west': 0, + 'south': 0, + 'east': 0, + 'northwest': 0, + 'southwest': 0, + 'northeast': 0, + 'southeast': 0 + }; + + for (var _i2 = 0; _i2 < pairInfo.eles.length; _i2++) { + var _edge = pairInfo.eles[_i2]; + var rs = _edge[0]._private.rscratch; + + var _curveStyle = _edge.pstyle('curve-style').value; + + var _edgeIsUnbundled = _curveStyle === 'unbundled-bezier' || _curveStyle === 'segments' || _curveStyle === 'taxi'; // whether the normalised pair order is the reverse of the edge's src-tgt order + + + var edgeIsSwapped = !src.same(_edge.source()); + + if (!pairInfo.calculatedIntersection && src !== tgt && (pairInfo.hasBezier || pairInfo.hasUnbundled)) { + pairInfo.calculatedIntersection = true; // pt outside src shape to calc distance/displacement from src to tgt + + var srcOutside = srcShape.intersectLine(srcPos.x, srcPos.y, srcW, srcH, tgtPos.x, tgtPos.y, 0); + var srcIntn = pairInfo.srcIntn = srcOutside; // pt outside tgt shape to calc distance/displacement from src to tgt + + var tgtOutside = tgtShape.intersectLine(tgtPos.x, tgtPos.y, tgtW, tgtH, srcPos.x, srcPos.y, 0); + var tgtIntn = pairInfo.tgtIntn = tgtOutside; + var intersectionPts = pairInfo.intersectionPts = { + x1: srcOutside[0], + x2: tgtOutside[0], + y1: srcOutside[1], + y2: tgtOutside[1] + }; + var posPts = pairInfo.posPts = { + x1: srcPos.x, + x2: tgtPos.x, + y1: srcPos.y, + y2: tgtPos.y + }; + var dy = tgtOutside[1] - srcOutside[1]; + var dx = tgtOutside[0] - srcOutside[0]; + var l = Math.sqrt(dx * dx + dy * dy); + var vector = pairInfo.vector = { + x: dx, + y: dy + }; + var vectorNorm = pairInfo.vectorNorm = { + x: vector.x / l, + y: vector.y / l + }; + var vectorNormInverse = { + x: -vectorNorm.y, + y: vectorNorm.x + }; // if node shapes overlap, then no ctrl pts to draw + + pairInfo.nodesOverlap = !number$1(l) || tgtShape.checkPoint(srcOutside[0], srcOutside[1], 0, tgtW, tgtH, tgtPos.x, tgtPos.y) || srcShape.checkPoint(tgtOutside[0], tgtOutside[1], 0, srcW, srcH, srcPos.x, srcPos.y); + pairInfo.vectorNormInverse = vectorNormInverse; + swappedpairInfo = { + nodesOverlap: pairInfo.nodesOverlap, + dirCounts: pairInfo.dirCounts, + calculatedIntersection: true, + hasBezier: pairInfo.hasBezier, + hasUnbundled: pairInfo.hasUnbundled, + eles: pairInfo.eles, + srcPos: tgtPos, + tgtPos: srcPos, + srcW: tgtW, + srcH: tgtH, + tgtW: srcW, + tgtH: srcH, + srcIntn: tgtIntn, + tgtIntn: srcIntn, + srcShape: tgtShape, + tgtShape: srcShape, + posPts: { + x1: posPts.x2, + y1: posPts.y2, + x2: posPts.x1, + y2: posPts.y1 + }, + intersectionPts: { + x1: intersectionPts.x2, + y1: intersectionPts.y2, + x2: intersectionPts.x1, + y2: intersectionPts.y1 + }, + vector: { + x: -vector.x, + y: -vector.y + }, + vectorNorm: { + x: -vectorNorm.x, + y: -vectorNorm.y + }, + vectorNormInverse: { + x: -vectorNormInverse.x, + y: -vectorNormInverse.y + } + }; + } + + var passedPairInfo = edgeIsSwapped ? swappedpairInfo : pairInfo; + rs.nodesOverlap = passedPairInfo.nodesOverlap; + rs.srcIntn = passedPairInfo.srcIntn; + rs.tgtIntn = passedPairInfo.tgtIntn; + + if (hasCompounds && (src.isParent() || src.isChild() || tgt.isParent() || tgt.isChild()) && (src.parents().anySame(tgt) || tgt.parents().anySame(src) || src.same(tgt) && src.isParent())) { + _this.findCompoundLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled); + } else if (src === tgt) { + _this.findLoopPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled); + } else if (_curveStyle === 'segments') { + _this.findSegmentsPoints(_edge, passedPairInfo); + } else if (_curveStyle === 'taxi') { + _this.findTaxiPoints(_edge, passedPairInfo); + } else if (_curveStyle === 'straight' || !_edgeIsUnbundled && pairInfo.eles.length % 2 === 1 && _i2 === Math.floor(pairInfo.eles.length / 2)) { + _this.findStraightEdgePoints(_edge); + } else { + _this.findBezierPoints(_edge, passedPairInfo, _i2, _edgeIsUnbundled, edgeIsSwapped); + } + + _this.findEndpoints(_edge); + + _this.tryToCorrectInvalidPoints(_edge, passedPairInfo); + + _this.checkForInvalidEdgeWarning(_edge); + + _this.storeAllpts(_edge); + + _this.storeEdgeProjections(_edge); + + _this.calculateArrowAngles(_edge); + + _this.recalculateEdgeLabelProjections(_edge); + + _this.calculateLabelAngles(_edge); + } // for pair edges + + }; + + for (var p = 0; p < pairIds.length; p++) { + _loop(p); + } // for pair ids + // haystacks avoid the expense of pairInfo stuff (intersections etc.) + + + this.findHaystackPoints(haystackEdges); + }; + + function getPts(pts) { + var retPts = []; + + if (pts == null) { + return; + } + + for (var i = 0; i < pts.length; i += 2) { + var x = pts[i]; + var y = pts[i + 1]; + retPts.push({ + x: x, + y: y + }); + } + + return retPts; + } + + BRp$c.getSegmentPoints = function (edge) { + var rs = edge[0]._private.rscratch; + var type = rs.edgeType; + + if (type === 'segments') { + this.recalculateRenderedStyle(edge); + return getPts(rs.segpts); + } + }; + + BRp$c.getControlPoints = function (edge) { + var rs = edge[0]._private.rscratch; + var type = rs.edgeType; + + if (type === 'bezier' || type === 'multibezier' || type === 'self' || type === 'compound') { + this.recalculateRenderedStyle(edge); + return getPts(rs.ctrlpts); + } + }; + + BRp$c.getEdgeMidpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + return { + x: rs.midX, + y: rs.midY + }; + }; + + var BRp$b = {}; + + BRp$b.manualEndptToPx = function (node, prop) { + var r = this; + var npos = node.position(); + var w = node.outerWidth(); + var h = node.outerHeight(); + + if (prop.value.length === 2) { + var p = [prop.pfValue[0], prop.pfValue[1]]; + + if (prop.units[0] === '%') { + p[0] = p[0] * w; + } + + if (prop.units[1] === '%') { + p[1] = p[1] * h; + } + + p[0] += npos.x; + p[1] += npos.y; + return p; + } else { + var angle = prop.pfValue[0]; + angle = -Math.PI / 2 + angle; // start at 12 o'clock + + var l = 2 * Math.max(w, h); + var _p = [npos.x + Math.cos(angle) * l, npos.y + Math.sin(angle) * l]; + return r.nodeShapes[this.getNodeShape(node)].intersectLine(npos.x, npos.y, w, h, _p[0], _p[1], 0); + } + }; + + BRp$b.findEndpoints = function (edge) { + var r = this; + var intersect; + var source = edge.source()[0]; + var target = edge.target()[0]; + var srcPos = source.position(); + var tgtPos = target.position(); + var tgtArShape = edge.pstyle('target-arrow-shape').value; + var srcArShape = edge.pstyle('source-arrow-shape').value; + var tgtDist = edge.pstyle('target-distance-from-node').pfValue; + var srcDist = edge.pstyle('source-distance-from-node').pfValue; + var curveStyle = edge.pstyle('curve-style').value; + var rs = edge._private.rscratch; + var et = rs.edgeType; + var taxi = curveStyle === 'taxi'; + var self = et === 'self' || et === 'compound'; + var bezier = et === 'bezier' || et === 'multibezier' || self; + var multi = et !== 'bezier'; + var lines = et === 'straight' || et === 'segments'; + var segments = et === 'segments'; + var hasEndpts = bezier || multi || lines; + var overrideEndpts = self || taxi; + var srcManEndpt = edge.pstyle('source-endpoint'); + var srcManEndptVal = overrideEndpts ? 'outside-to-node' : srcManEndpt.value; + var tgtManEndpt = edge.pstyle('target-endpoint'); + var tgtManEndptVal = overrideEndpts ? 'outside-to-node' : tgtManEndpt.value; + rs.srcManEndpt = srcManEndpt; + rs.tgtManEndpt = tgtManEndpt; + var p1; // last known point of edge on target side + + var p2; // last known point of edge on source side + + var p1_i; // point to intersect with target shape + + var p2_i; // point to intersect with source shape + + if (bezier) { + var cpStart = [rs.ctrlpts[0], rs.ctrlpts[1]]; + var cpEnd = multi ? [rs.ctrlpts[rs.ctrlpts.length - 2], rs.ctrlpts[rs.ctrlpts.length - 1]] : cpStart; + p1 = cpEnd; + p2 = cpStart; + } else if (lines) { + var srcArrowFromPt = !segments ? [tgtPos.x, tgtPos.y] : rs.segpts.slice(0, 2); + var tgtArrowFromPt = !segments ? [srcPos.x, srcPos.y] : rs.segpts.slice(rs.segpts.length - 2); + p1 = tgtArrowFromPt; + p2 = srcArrowFromPt; + } + + if (tgtManEndptVal === 'inside-to-node') { + intersect = [tgtPos.x, tgtPos.y]; + } else if (tgtManEndpt.units) { + intersect = this.manualEndptToPx(target, tgtManEndpt); + } else if (tgtManEndptVal === 'outside-to-line') { + intersect = rs.tgtIntn; // use cached value from ctrlpt calc + } else { + if (tgtManEndptVal === 'outside-to-node' || tgtManEndptVal === 'outside-to-node-or-label') { + p1_i = p1; + } else if (tgtManEndptVal === 'outside-to-line' || tgtManEndptVal === 'outside-to-line-or-label') { + p1_i = [srcPos.x, srcPos.y]; + } + + intersect = r.nodeShapes[this.getNodeShape(target)].intersectLine(tgtPos.x, tgtPos.y, target.outerWidth(), target.outerHeight(), p1_i[0], p1_i[1], 0); + + if (tgtManEndptVal === 'outside-to-node-or-label' || tgtManEndptVal === 'outside-to-line-or-label') { + var trs = target._private.rscratch; + var lw = trs.labelWidth; + var lh = trs.labelHeight; + var lx = trs.labelX; + var ly = trs.labelY; + var lw2 = lw / 2; + var lh2 = lh / 2; + var va = target.pstyle('text-valign').value; + + if (va === 'top') { + ly -= lh2; + } else if (va === 'bottom') { + ly += lh2; + } + + var ha = target.pstyle('text-halign').value; + + if (ha === 'left') { + lx -= lw2; + } else if (ha === 'right') { + lx += lw2; + } + + var labelIntersect = polygonIntersectLine(p1_i[0], p1_i[1], [lx - lw2, ly - lh2, lx + lw2, ly - lh2, lx + lw2, ly + lh2, lx - lw2, ly + lh2], tgtPos.x, tgtPos.y); + + if (labelIntersect.length > 0) { + var refPt = srcPos; + var intSqdist = sqdist(refPt, array2point(intersect)); + var labIntSqdist = sqdist(refPt, array2point(labelIntersect)); + var minSqDist = intSqdist; + + if (labIntSqdist < intSqdist) { + intersect = labelIntersect; + minSqDist = labIntSqdist; + } + + if (labelIntersect.length > 2) { + var labInt2SqDist = sqdist(refPt, { + x: labelIntersect[2], + y: labelIntersect[3] + }); + + if (labInt2SqDist < minSqDist) { + intersect = [labelIntersect[2], labelIntersect[3]]; + } + } + } + } + } + + var arrowEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].spacing(edge) + tgtDist); + var edgeEnd = shortenIntersection(intersect, p1, r.arrowShapes[tgtArShape].gap(edge) + tgtDist); + rs.endX = edgeEnd[0]; + rs.endY = edgeEnd[1]; + rs.arrowEndX = arrowEnd[0]; + rs.arrowEndY = arrowEnd[1]; + + if (srcManEndptVal === 'inside-to-node') { + intersect = [srcPos.x, srcPos.y]; + } else if (srcManEndpt.units) { + intersect = this.manualEndptToPx(source, srcManEndpt); + } else if (srcManEndptVal === 'outside-to-line') { + intersect = rs.srcIntn; // use cached value from ctrlpt calc + } else { + if (srcManEndptVal === 'outside-to-node' || srcManEndptVal === 'outside-to-node-or-label') { + p2_i = p2; + } else if (srcManEndptVal === 'outside-to-line' || srcManEndptVal === 'outside-to-line-or-label') { + p2_i = [tgtPos.x, tgtPos.y]; + } + + intersect = r.nodeShapes[this.getNodeShape(source)].intersectLine(srcPos.x, srcPos.y, source.outerWidth(), source.outerHeight(), p2_i[0], p2_i[1], 0); + + if (srcManEndptVal === 'outside-to-node-or-label' || srcManEndptVal === 'outside-to-line-or-label') { + var srs = source._private.rscratch; + var _lw = srs.labelWidth; + var _lh = srs.labelHeight; + var _lx = srs.labelX; + var _ly = srs.labelY; + + var _lw2 = _lw / 2; + + var _lh2 = _lh / 2; + + var _va = source.pstyle('text-valign').value; + + if (_va === 'top') { + _ly -= _lh2; + } else if (_va === 'bottom') { + _ly += _lh2; + } + + var _ha = source.pstyle('text-halign').value; + + if (_ha === 'left') { + _lx -= _lw2; + } else if (_ha === 'right') { + _lx += _lw2; + } + + var _labelIntersect = polygonIntersectLine(p2_i[0], p2_i[1], [_lx - _lw2, _ly - _lh2, _lx + _lw2, _ly - _lh2, _lx + _lw2, _ly + _lh2, _lx - _lw2, _ly + _lh2], srcPos.x, srcPos.y); + + if (_labelIntersect.length > 0) { + var _refPt = tgtPos; + + var _intSqdist = sqdist(_refPt, array2point(intersect)); + + var _labIntSqdist = sqdist(_refPt, array2point(_labelIntersect)); + + var _minSqDist = _intSqdist; + + if (_labIntSqdist < _intSqdist) { + intersect = [_labelIntersect[0], _labelIntersect[1]]; + _minSqDist = _labIntSqdist; + } + + if (_labelIntersect.length > 2) { + var _labInt2SqDist = sqdist(_refPt, { + x: _labelIntersect[2], + y: _labelIntersect[3] + }); + + if (_labInt2SqDist < _minSqDist) { + intersect = [_labelIntersect[2], _labelIntersect[3]]; + } + } + } + } + } + + var arrowStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].spacing(edge) + srcDist); + var edgeStart = shortenIntersection(intersect, p2, r.arrowShapes[srcArShape].gap(edge) + srcDist); + rs.startX = edgeStart[0]; + rs.startY = edgeStart[1]; + rs.arrowStartX = arrowStart[0]; + rs.arrowStartY = arrowStart[1]; + + if (hasEndpts) { + if (!number$1(rs.startX) || !number$1(rs.startY) || !number$1(rs.endX) || !number$1(rs.endY)) { + rs.badLine = true; + } else { + rs.badLine = false; + } + } + }; + + BRp$b.getSourceEndpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + + switch (rs.edgeType) { + case 'haystack': + return { + x: rs.haystackPts[0], + y: rs.haystackPts[1] + }; + + default: + return { + x: rs.arrowStartX, + y: rs.arrowStartY + }; + } + }; + + BRp$b.getTargetEndpoint = function (edge) { + var rs = edge[0]._private.rscratch; + this.recalculateRenderedStyle(edge); + + switch (rs.edgeType) { + case 'haystack': + return { + x: rs.haystackPts[2], + y: rs.haystackPts[3] + }; + + default: + return { + x: rs.arrowEndX, + y: rs.arrowEndY + }; + } + }; + + var BRp$a = {}; + + function pushBezierPts(r, edge, pts) { + var qbezierAt$1 = function qbezierAt$1(p1, p2, p3, t) { + return qbezierAt(p1, p2, p3, t); + }; + + var _p = edge._private; + var bpts = _p.rstyle.bezierPts; + + for (var i = 0; i < r.bezierProjPcts.length; i++) { + var p = r.bezierProjPcts[i]; + bpts.push({ + x: qbezierAt$1(pts[0], pts[2], pts[4], p), + y: qbezierAt$1(pts[1], pts[3], pts[5], p) + }); + } + } + + BRp$a.storeEdgeProjections = function (edge) { + var _p = edge._private; + var rs = _p.rscratch; + var et = rs.edgeType; // clear the cached points state + + _p.rstyle.bezierPts = null; + _p.rstyle.linePts = null; + _p.rstyle.haystackPts = null; + + if (et === 'multibezier' || et === 'bezier' || et === 'self' || et === 'compound') { + _p.rstyle.bezierPts = []; + + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + pushBezierPts(this, edge, rs.allpts.slice(i, i + 6)); + } + } else if (et === 'segments') { + var lpts = _p.rstyle.linePts = []; + + for (var i = 0; i + 1 < rs.allpts.length; i += 2) { + lpts.push({ + x: rs.allpts[i], + y: rs.allpts[i + 1] + }); + } + } else if (et === 'haystack') { + var hpts = rs.haystackPts; + _p.rstyle.haystackPts = [{ + x: hpts[0], + y: hpts[1] + }, { + x: hpts[2], + y: hpts[3] + }]; + } + + _p.rstyle.arrowWidth = this.getArrowWidth(edge.pstyle('width').pfValue, edge.pstyle('arrow-scale').value) * this.arrowShapeWidth; + }; + + BRp$a.recalculateEdgeProjections = function (edges) { + this.findEdgeControlPoints(edges); + }; + + /* global document */ + + var BRp$9 = {}; + + BRp$9.recalculateNodeLabelProjection = function (node) { + var content = node.pstyle('label').strValue; + + if (emptyString(content)) { + return; + } + + var textX, textY; + var _p = node._private; + var nodeWidth = node.width(); + var nodeHeight = node.height(); + var padding = node.padding(); + var nodePos = node.position(); + var textHalign = node.pstyle('text-halign').strValue; + var textValign = node.pstyle('text-valign').strValue; + var rs = _p.rscratch; + var rstyle = _p.rstyle; + + switch (textHalign) { + case 'left': + textX = nodePos.x - nodeWidth / 2 - padding; + break; + + case 'right': + textX = nodePos.x + nodeWidth / 2 + padding; + break; + + default: + // e.g. center + textX = nodePos.x; + } + + switch (textValign) { + case 'top': + textY = nodePos.y - nodeHeight / 2 - padding; + break; + + case 'bottom': + textY = nodePos.y + nodeHeight / 2 + padding; + break; + + default: + // e.g. middle + textY = nodePos.y; + } + + rs.labelX = textX; + rs.labelY = textY; + rstyle.labelX = textX; + rstyle.labelY = textY; + this.calculateLabelAngles(node); + this.applyLabelDimensions(node); + }; + + var lineAngleFromDelta = function lineAngleFromDelta(dx, dy) { + var angle = Math.atan(dy / dx); + + if (dx === 0 && angle < 0) { + angle = angle * -1; + } + + return angle; + }; + + var lineAngle = function lineAngle(p0, p1) { + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + return lineAngleFromDelta(dx, dy); + }; + + var bezierAngle = function bezierAngle(p0, p1, p2, t) { + var t0 = bound(0, t - 0.001, 1); + var t1 = bound(0, t + 0.001, 1); + var lp0 = qbezierPtAt(p0, p1, p2, t0); + var lp1 = qbezierPtAt(p0, p1, p2, t1); + return lineAngle(lp0, lp1); + }; + + BRp$9.recalculateEdgeLabelProjections = function (edge) { + var p; + var _p = edge._private; + var rs = _p.rscratch; + var r = this; + var content = { + mid: edge.pstyle('label').strValue, + source: edge.pstyle('source-label').strValue, + target: edge.pstyle('target-label').strValue + }; + + if (content.mid || content.source || content.target) ; else { + return; // no labels => no calcs + } // add center point to style so bounding box calculations can use it + // + + + p = { + x: rs.midX, + y: rs.midY + }; + + var setRs = function setRs(propName, prefix, value) { + setPrefixedProperty(_p.rscratch, propName, prefix, value); + setPrefixedProperty(_p.rstyle, propName, prefix, value); + }; + + setRs('labelX', null, p.x); + setRs('labelY', null, p.y); + var midAngle = lineAngleFromDelta(rs.midDispX, rs.midDispY); + setRs('labelAutoAngle', null, midAngle); + + var createControlPointInfo = function createControlPointInfo() { + if (createControlPointInfo.cache) { + return createControlPointInfo.cache; + } // use cache so only 1x per edge + + + var ctrlpts = []; // store each ctrlpt info init + + for (var i = 0; i + 5 < rs.allpts.length; i += 4) { + var p0 = { + x: rs.allpts[i], + y: rs.allpts[i + 1] + }; + var p1 = { + x: rs.allpts[i + 2], + y: rs.allpts[i + 3] + }; // ctrlpt + + var p2 = { + x: rs.allpts[i + 4], + y: rs.allpts[i + 5] + }; + ctrlpts.push({ + p0: p0, + p1: p1, + p2: p2, + startDist: 0, + length: 0, + segments: [] + }); + } + + var bpts = _p.rstyle.bezierPts; + var nProjs = r.bezierProjPcts.length; + + function addSegment(cp, p0, p1, t0, t1) { + var length = dist(p0, p1); + var prevSegment = cp.segments[cp.segments.length - 1]; + var segment = { + p0: p0, + p1: p1, + t0: t0, + t1: t1, + startDist: prevSegment ? prevSegment.startDist + prevSegment.length : 0, + length: length + }; + cp.segments.push(segment); + cp.length += length; + } // update each ctrlpt with segment info + + + for (var _i = 0; _i < ctrlpts.length; _i++) { + var cp = ctrlpts[_i]; + var prevCp = ctrlpts[_i - 1]; + + if (prevCp) { + cp.startDist = prevCp.startDist + prevCp.length; + } + + addSegment(cp, cp.p0, bpts[_i * nProjs], 0, r.bezierProjPcts[0]); // first + + for (var j = 0; j < nProjs - 1; j++) { + addSegment(cp, bpts[_i * nProjs + j], bpts[_i * nProjs + j + 1], r.bezierProjPcts[j], r.bezierProjPcts[j + 1]); + } + + addSegment(cp, bpts[_i * nProjs + nProjs - 1], cp.p2, r.bezierProjPcts[nProjs - 1], 1); // last + } + + return createControlPointInfo.cache = ctrlpts; + }; + + var calculateEndProjection = function calculateEndProjection(prefix) { + var angle; + var isSrc = prefix === 'source'; + + if (!content[prefix]) { + return; + } + + var offset = edge.pstyle(prefix + '-text-offset').pfValue; + + switch (rs.edgeType) { + case 'self': + case 'compound': + case 'bezier': + case 'multibezier': + { + var cps = createControlPointInfo(); + var selected; + var startDist = 0; + var totalDist = 0; // find the segment we're on + + for (var i = 0; i < cps.length; i++) { + var _cp = cps[isSrc ? i : cps.length - 1 - i]; + + for (var j = 0; j < _cp.segments.length; j++) { + var _seg = _cp.segments[isSrc ? j : _cp.segments.length - 1 - j]; + var lastSeg = i === cps.length - 1 && j === _cp.segments.length - 1; + startDist = totalDist; + totalDist += _seg.length; + + if (totalDist >= offset || lastSeg) { + selected = { + cp: _cp, + segment: _seg + }; + break; + } + } + + if (selected) { + break; + } + } + + var cp = selected.cp; + var seg = selected.segment; + var tSegment = (offset - startDist) / seg.length; + var segDt = seg.t1 - seg.t0; + var t = isSrc ? seg.t0 + segDt * tSegment : seg.t1 - segDt * tSegment; + t = bound(0, t, 1); + p = qbezierPtAt(cp.p0, cp.p1, cp.p2, t); + angle = bezierAngle(cp.p0, cp.p1, cp.p2, t); + break; + } + + case 'straight': + case 'segments': + case 'haystack': + { + var d = 0, + di, + d0; + var p0, p1; + var l = rs.allpts.length; + + for (var _i2 = 0; _i2 + 3 < l; _i2 += 2) { + if (isSrc) { + p0 = { + x: rs.allpts[_i2], + y: rs.allpts[_i2 + 1] + }; + p1 = { + x: rs.allpts[_i2 + 2], + y: rs.allpts[_i2 + 3] + }; + } else { + p0 = { + x: rs.allpts[l - 2 - _i2], + y: rs.allpts[l - 1 - _i2] + }; + p1 = { + x: rs.allpts[l - 4 - _i2], + y: rs.allpts[l - 3 - _i2] + }; + } + + di = dist(p0, p1); + d0 = d; + d += di; + + if (d >= offset) { + break; + } + } + + var pD = offset - d0; + + var _t = pD / di; + + _t = bound(0, _t, 1); + p = lineAt(p0, p1, _t); + angle = lineAngle(p0, p1); + break; + } + } + + setRs('labelX', prefix, p.x); + setRs('labelY', prefix, p.y); + setRs('labelAutoAngle', prefix, angle); + }; + + calculateEndProjection('source'); + calculateEndProjection('target'); + this.applyLabelDimensions(edge); + }; + + BRp$9.applyLabelDimensions = function (ele) { + this.applyPrefixedLabelDimensions(ele); + + if (ele.isEdge()) { + this.applyPrefixedLabelDimensions(ele, 'source'); + this.applyPrefixedLabelDimensions(ele, 'target'); + } + }; + + BRp$9.applyPrefixedLabelDimensions = function (ele, prefix) { + var _p = ele._private; + var text = this.getLabelText(ele, prefix); + var labelDims = this.calculateLabelDimensions(ele, text); + var lineHeight = ele.pstyle('line-height').pfValue; + var textWrap = ele.pstyle('text-wrap').strValue; + var lines = getPrefixedProperty(_p.rscratch, 'labelWrapCachedLines', prefix) || []; + var numLines = textWrap !== 'wrap' ? 1 : Math.max(lines.length, 1); + var normPerLineHeight = labelDims.height / numLines; + var labelLineHeight = normPerLineHeight * lineHeight; + var width = labelDims.width; + var height = labelDims.height + (numLines - 1) * (lineHeight - 1) * normPerLineHeight; + setPrefixedProperty(_p.rstyle, 'labelWidth', prefix, width); + setPrefixedProperty(_p.rscratch, 'labelWidth', prefix, width); + setPrefixedProperty(_p.rstyle, 'labelHeight', prefix, height); + setPrefixedProperty(_p.rscratch, 'labelHeight', prefix, height); + setPrefixedProperty(_p.rscratch, 'labelLineHeight', prefix, labelLineHeight); + }; + + BRp$9.getLabelText = function (ele, prefix) { + var _p = ele._private; + var pfd = prefix ? prefix + '-' : ''; + var text = ele.pstyle(pfd + 'label').strValue; + var textTransform = ele.pstyle('text-transform').value; + + var rscratch = function rscratch(propName, value) { + if (value) { + setPrefixedProperty(_p.rscratch, propName, prefix, value); + return value; + } else { + return getPrefixedProperty(_p.rscratch, propName, prefix); + } + }; // for empty text, skip all processing + + + if (!text) { + return ''; + } + + if (textTransform == 'none') ; else if (textTransform == 'uppercase') { + text = text.toUpperCase(); + } else if (textTransform == 'lowercase') { + text = text.toLowerCase(); + } + + var wrapStyle = ele.pstyle('text-wrap').value; + + if (wrapStyle === 'wrap') { + var labelKey = rscratch('labelKey'); // save recalc if the label is the same as before + + if (labelKey != null && rscratch('labelWrapKey') === labelKey) { + return rscratch('labelWrapCachedText'); + } + + var zwsp = "\u200B"; + var lines = text.split('\n'); + var maxW = ele.pstyle('text-max-width').pfValue; + var overflow = ele.pstyle('text-overflow-wrap').value; + var overflowAny = overflow === 'anywhere'; + var wrappedLines = []; + var wordsRegex = /[\s\u200b]+/; + var wordSeparator = overflowAny ? '' : ' '; + + for (var l = 0; l < lines.length; l++) { + var line = lines[l]; + var lineDims = this.calculateLabelDimensions(ele, line); + var lineW = lineDims.width; + + if (overflowAny) { + var processedLine = line.split('').join(zwsp); + line = processedLine; + } + + if (lineW > maxW) { + // line is too long + var words = line.split(wordsRegex); + var subline = ''; + + for (var w = 0; w < words.length; w++) { + var word = words[w]; + var testLine = subline.length === 0 ? word : subline + wordSeparator + word; + var testDims = this.calculateLabelDimensions(ele, testLine); + var testW = testDims.width; + + if (testW <= maxW) { + // word fits on current line + subline += word + wordSeparator; + } else { + // word starts new line + if (subline) { + wrappedLines.push(subline); + } + + subline = word + wordSeparator; + } + } // if there's remaining text, put it in a wrapped line + + + if (!subline.match(/^[\s\u200b]+$/)) { + wrappedLines.push(subline); + } + } else { + // line is already short enough + wrappedLines.push(line); + } + } // for + + + rscratch('labelWrapCachedLines', wrappedLines); + text = rscratch('labelWrapCachedText', wrappedLines.join('\n')); + rscratch('labelWrapKey', labelKey); + } else if (wrapStyle === 'ellipsis') { + var _maxW = ele.pstyle('text-max-width').pfValue; + var ellipsized = ''; + var ellipsis = "\u2026"; + var incLastCh = false; + + if (this.calculateLabelDimensions(ele, text).width < _maxW) { + // the label already fits + return text; + } + + for (var i = 0; i < text.length; i++) { + var widthWithNextCh = this.calculateLabelDimensions(ele, ellipsized + text[i] + ellipsis).width; + + if (widthWithNextCh > _maxW) { + break; + } + + ellipsized += text[i]; + + if (i === text.length - 1) { + incLastCh = true; + } + } + + if (!incLastCh) { + ellipsized += ellipsis; + } + + return ellipsized; + } // if ellipsize + + + return text; + }; + + BRp$9.getLabelJustification = function (ele) { + var justification = ele.pstyle('text-justification').strValue; + var textHalign = ele.pstyle('text-halign').strValue; + + if (justification === 'auto') { + if (ele.isNode()) { + switch (textHalign) { + case 'left': + return 'right'; + + case 'right': + return 'left'; + + default: + return 'center'; + } + } else { + return 'center'; + } + } else { + return justification; + } + }; + + BRp$9.calculateLabelDimensions = function (ele, text) { + var r = this; + var cacheKey = hashString(text, ele._private.labelDimsKey); + var cache = r.labelDimCache || (r.labelDimCache = []); + var existingVal = cache[cacheKey]; + + if (existingVal != null) { + return existingVal; + } + + var padding = 0; // add padding around text dims, as the measurement isn't that accurate + + var fStyle = ele.pstyle('font-style').strValue; + var size = ele.pstyle('font-size').pfValue; + var family = ele.pstyle('font-family').strValue; + var weight = ele.pstyle('font-weight').strValue; + var canvas = this.labelCalcCanvas; + var c2d = this.labelCalcCanvasContext; + + if (!canvas) { + canvas = this.labelCalcCanvas = document.createElement('canvas'); + c2d = this.labelCalcCanvasContext = canvas.getContext('2d'); + var ds = canvas.style; + ds.position = 'absolute'; + ds.left = '-9999px'; + ds.top = '-9999px'; + ds.zIndex = '-1'; + ds.visibility = 'hidden'; + ds.pointerEvents = 'none'; + } + + c2d.font = "".concat(fStyle, " ").concat(weight, " ").concat(size, "px ").concat(family); + var width = 0; + var height = 0; + var lines = text.split('\n'); + + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + var metrics = c2d.measureText(line); + var w = Math.ceil(metrics.width); + var h = size; + width = Math.max(w, width); + height += h; + } + + width += padding; + height += padding; + return cache[cacheKey] = { + width: width, + height: height + }; + }; + + BRp$9.calculateLabelAngle = function (ele, prefix) { + var _p = ele._private; + var rs = _p.rscratch; + var isEdge = ele.isEdge(); + var prefixDash = prefix ? prefix + '-' : ''; + var rot = ele.pstyle(prefixDash + 'text-rotation'); + var rotStr = rot.strValue; + + if (rotStr === 'none') { + return 0; + } else if (isEdge && rotStr === 'autorotate') { + return rs.labelAutoAngle; + } else if (rotStr === 'autorotate') { + return 0; + } else { + return rot.pfValue; + } + }; + + BRp$9.calculateLabelAngles = function (ele) { + var r = this; + var isEdge = ele.isEdge(); + var _p = ele._private; + var rs = _p.rscratch; + rs.labelAngle = r.calculateLabelAngle(ele); + + if (isEdge) { + rs.sourceLabelAngle = r.calculateLabelAngle(ele, 'source'); + rs.targetLabelAngle = r.calculateLabelAngle(ele, 'target'); + } + }; + + var BRp$8 = {}; + var TOO_SMALL_CUT_RECT = 28; + var warnedCutRect = false; + + BRp$8.getNodeShape = function (node) { + var r = this; + var shape = node.pstyle('shape').value; + + if (shape === 'cutrectangle' && (node.width() < TOO_SMALL_CUT_RECT || node.height() < TOO_SMALL_CUT_RECT)) { + if (!warnedCutRect) { + warn('The `cutrectangle` node shape can not be used at small sizes so `rectangle` is used instead'); + warnedCutRect = true; + } + + return 'rectangle'; + } + + if (node.isParent()) { + if (shape === 'rectangle' || shape === 'roundrectangle' || shape === 'round-rectangle' || shape === 'cutrectangle' || shape === 'cut-rectangle' || shape === 'barrel') { + return shape; + } else { + return 'rectangle'; + } + } + + if (shape === 'polygon') { + var points = node.pstyle('shape-polygon-points').value; + return r.nodeShapes.makePolygon(points).name; + } + + return shape; + }; + + var BRp$7 = {}; + + BRp$7.registerCalculationListeners = function () { + var cy = this.cy; + var elesToUpdate = cy.collection(); + var r = this; + + var enqueue = function enqueue(eles) { + var dirtyStyleCaches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + elesToUpdate.merge(eles); + + if (dirtyStyleCaches) { + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _p = ele._private; + var rstyle = _p.rstyle; + rstyle.clean = false; + rstyle.cleanConnected = false; + } + } + }; + + r.binder(cy).on('bounds.* dirty.*', function onDirtyBounds(e) { + var ele = e.target; + enqueue(ele); + }).on('style.* background.*', function onDirtyStyle(e) { + var ele = e.target; + enqueue(ele, false); + }); + + var updateEleCalcs = function updateEleCalcs(willDraw) { + if (willDraw) { + var fns = r.onUpdateEleCalcsFns; // because we need to have up-to-date style (e.g. stylesheet mappers) + // before calculating rendered style (and pstyle might not be called yet) + + elesToUpdate.cleanStyle(); + + for (var i = 0; i < elesToUpdate.length; i++) { + var ele = elesToUpdate[i]; + var rstyle = ele._private.rstyle; + + if (ele.isNode() && !rstyle.cleanConnected) { + enqueue(ele.connectedEdges()); + rstyle.cleanConnected = true; + } + } + + if (fns) { + for (var _i = 0; _i < fns.length; _i++) { + var fn = fns[_i]; + fn(willDraw, elesToUpdate); + } + } + + r.recalculateRenderedStyle(elesToUpdate); + elesToUpdate = cy.collection(); + } + }; + + r.flushRenderedStyleQueue = function () { + updateEleCalcs(true); + }; + + r.beforeRender(updateEleCalcs, r.beforeRenderPriorities.eleCalcs); + }; + + BRp$7.onUpdateEleCalcs = function (fn) { + var fns = this.onUpdateEleCalcsFns = this.onUpdateEleCalcsFns || []; + fns.push(fn); + }; + + BRp$7.recalculateRenderedStyle = function (eles, useCache) { + var isCleanConnected = function isCleanConnected(ele) { + return ele._private.rstyle.cleanConnected; + }; + + var edges = []; + var nodes = []; // the renderer can't be used for calcs when destroyed, e.g. ele.boundingBox() + + if (this.destroyed) { + return; + } // use cache by default for perf + + + if (useCache === undefined) { + useCache = true; + } + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var _p = ele._private; + var rstyle = _p.rstyle; // an edge may be implicitly dirty b/c of one of its connected nodes + // (and a request for recalc may come in between frames) + + if (ele.isEdge() && (!isCleanConnected(ele.source()) || !isCleanConnected(ele.target()))) { + rstyle.clean = false; + } // only update if dirty and in graph + + + if (useCache && rstyle.clean || ele.removed()) { + continue; + } // only update if not display: none + + + if (ele.pstyle('display').value === 'none') { + continue; + } + + if (_p.group === 'nodes') { + nodes.push(ele); + } else { + // edges + edges.push(ele); + } + + rstyle.clean = true; + } // update node data from projections + + + for (var _i2 = 0; _i2 < nodes.length; _i2++) { + var _ele = nodes[_i2]; + var _p2 = _ele._private; + var _rstyle = _p2.rstyle; + + var pos = _ele.position(); + + this.recalculateNodeLabelProjection(_ele); + _rstyle.nodeX = pos.x; + _rstyle.nodeY = pos.y; + _rstyle.nodeW = _ele.pstyle('width').pfValue; + _rstyle.nodeH = _ele.pstyle('height').pfValue; + } + + this.recalculateEdgeProjections(edges); // update edge data from projections + + for (var _i3 = 0; _i3 < edges.length; _i3++) { + var _ele2 = edges[_i3]; + var _p3 = _ele2._private; + var _rstyle2 = _p3.rstyle; + var rs = _p3.rscratch; // update rstyle positions + + _rstyle2.srcX = rs.arrowStartX; + _rstyle2.srcY = rs.arrowStartY; + _rstyle2.tgtX = rs.arrowEndX; + _rstyle2.tgtY = rs.arrowEndY; + _rstyle2.midX = rs.midX; + _rstyle2.midY = rs.midY; + _rstyle2.labelAngle = rs.labelAngle; + _rstyle2.sourceLabelAngle = rs.sourceLabelAngle; + _rstyle2.targetLabelAngle = rs.targetLabelAngle; + } + }; + + var BRp$6 = {}; + + BRp$6.updateCachedGrabbedEles = function () { + var eles = this.cachedZSortedEles; + + if (!eles) { + // just let this be recalculated on the next z sort tick + return; + } + + eles.drag = []; + eles.nondrag = []; + var grabTargets = []; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var rs = ele._private.rscratch; + + if (ele.grabbed() && !ele.isParent()) { + grabTargets.push(ele); + } else if (rs.inDragLayer) { + eles.drag.push(ele); + } else { + eles.nondrag.push(ele); + } + } // put the grab target nodes last so it's on top of its neighbourhood + + + for (var i = 0; i < grabTargets.length; i++) { + var ele = grabTargets[i]; + eles.drag.push(ele); + } + }; + + BRp$6.invalidateCachedZSortedEles = function () { + this.cachedZSortedEles = null; + }; + + BRp$6.getCachedZSortedEles = function (forceRecalc) { + if (forceRecalc || !this.cachedZSortedEles) { + var eles = this.cy.mutableElements().toArray(); + eles.sort(zIndexSort); + eles.interactive = eles.filter(function (ele) { + return ele.interactive(); + }); + this.cachedZSortedEles = eles; + this.updateCachedGrabbedEles(); + } else { + eles = this.cachedZSortedEles; + } + + return eles; + }; + + var BRp$5 = {}; + [BRp$e, BRp$d, BRp$c, BRp$b, BRp$a, BRp$9, BRp$8, BRp$7, BRp$6].forEach(function (props) { + extend(BRp$5, props); + }); + + var BRp$4 = {}; + + BRp$4.getCachedImage = function (url, crossOrigin, onLoad) { + var r = this; + var imageCache = r.imageCache = r.imageCache || {}; + var cache = imageCache[url]; + + if (cache) { + if (!cache.image.complete) { + cache.image.addEventListener('load', onLoad); + } + + return cache.image; + } else { + cache = imageCache[url] = imageCache[url] || {}; + var image = cache.image = new Image(); // eslint-disable-line no-undef + + image.addEventListener('load', onLoad); + image.addEventListener('error', function () { + image.error = true; + }); // #1582 safari doesn't load data uris with crossOrigin properly + // https://bugs.webkit.org/show_bug.cgi?id=123978 + + var dataUriPrefix = 'data:'; + var isDataUri = url.substring(0, dataUriPrefix.length).toLowerCase() === dataUriPrefix; + + if (!isDataUri) { + // if crossorigin is 'null'(stringified), then manually set it to null + crossOrigin = crossOrigin === 'null' ? null : crossOrigin; + image.crossOrigin = crossOrigin; // prevent tainted canvas + } + + image.src = url; + return image; + } + }; + + var BRp$3 = {}; + /* global document, window, ResizeObserver, MutationObserver */ + + BRp$3.registerBinding = function (target, event, handler, useCapture) { + // eslint-disable-line no-unused-vars + var args = Array.prototype.slice.apply(arguments, [1]); // copy + + var b = this.binder(target); + return b.on.apply(b, args); + }; + + BRp$3.binder = function (tgt) { + var r = this; + var containerWindow = r.cy.window(); + var tgtIsDom = tgt === containerWindow || tgt === containerWindow.document || tgt === containerWindow.document.body || domElement(tgt); + + if (r.supportsPassiveEvents == null) { + // from https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection + var supportsPassive = false; + + try { + var opts = Object.defineProperty({}, 'passive', { + get: function get() { + supportsPassive = true; + return true; + } + }); + containerWindow.addEventListener('test', null, opts); + } catch (err) {// not supported + } + + r.supportsPassiveEvents = supportsPassive; + } + + var on = function on(event, handler, useCapture) { + var args = Array.prototype.slice.call(arguments); + + if (tgtIsDom && r.supportsPassiveEvents) { + // replace useCapture w/ opts obj + args[2] = { + capture: useCapture != null ? useCapture : false, + passive: false, + once: false + }; + } + + r.bindings.push({ + target: tgt, + args: args + }); + (tgt.addEventListener || tgt.on).apply(tgt, args); + return this; + }; + + return { + on: on, + addEventListener: on, + addListener: on, + bind: on + }; + }; + + BRp$3.nodeIsDraggable = function (node) { + return node && node.isNode() && !node.locked() && node.grabbable(); + }; + + BRp$3.nodeIsGrabbable = function (node) { + return this.nodeIsDraggable(node) && node.interactive(); + }; + + BRp$3.load = function () { + var r = this; + var containerWindow = r.cy.window(); + + var isSelected = function isSelected(ele) { + return ele.selected(); + }; + + var triggerEvents = function triggerEvents(target, names, e, position) { + if (target == null) { + target = r.cy; + } + + for (var i = 0; i < names.length; i++) { + var name = names[i]; + target.emit({ + originalEvent: e, + type: name, + position: position + }); + } + }; + + var isMultSelKeyDown = function isMultSelKeyDown(e) { + return e.shiftKey || e.metaKey || e.ctrlKey; // maybe e.altKey + }; + + var allowPanningPassthrough = function allowPanningPassthrough(down, downs) { + var allowPassthrough = true; + + if (r.cy.hasCompoundNodes() && down && down.pannable()) { + // a grabbable compound node below the ele => no passthrough panning + for (var i = 0; downs && i < downs.length; i++) { + var down = downs[i]; //if any parent node in event hierarchy isn't pannable, reject passthrough + + if (down.isNode() && down.isParent() && !down.pannable()) { + allowPassthrough = false; + break; + } + } + } else { + allowPassthrough = true; + } + + return allowPassthrough; + }; + + var setGrabbed = function setGrabbed(ele) { + ele[0]._private.grabbed = true; + }; + + var setFreed = function setFreed(ele) { + ele[0]._private.grabbed = false; + }; + + var setInDragLayer = function setInDragLayer(ele) { + ele[0]._private.rscratch.inDragLayer = true; + }; + + var setOutDragLayer = function setOutDragLayer(ele) { + ele[0]._private.rscratch.inDragLayer = false; + }; + + var setGrabTarget = function setGrabTarget(ele) { + ele[0]._private.rscratch.isGrabTarget = true; + }; + + var removeGrabTarget = function removeGrabTarget(ele) { + ele[0]._private.rscratch.isGrabTarget = false; + }; + + var addToDragList = function addToDragList(ele, opts) { + var list = opts.addToList; + var listHasEle = list.has(ele); + + if (!listHasEle && ele.grabbable() && !ele.locked()) { + list.merge(ele); + setGrabbed(ele); + } + }; // helper function to determine which child nodes and inner edges + // of a compound node to be dragged as well as the grabbed and selected nodes + + + var addDescendantsToDrag = function addDescendantsToDrag(node, opts) { + if (!node.cy().hasCompoundNodes()) { + return; + } + + if (opts.inDragLayer == null && opts.addToList == null) { + return; + } // nothing to do + + + var innerNodes = node.descendants(); + + if (opts.inDragLayer) { + innerNodes.forEach(setInDragLayer); + innerNodes.connectedEdges().forEach(setInDragLayer); + } + + if (opts.addToList) { + addToDragList(innerNodes, opts); + } + }; // adds the given nodes and its neighbourhood to the drag layer + + + var addNodesToDrag = function addNodesToDrag(nodes, opts) { + opts = opts || {}; + var hasCompoundNodes = nodes.cy().hasCompoundNodes(); + + if (opts.inDragLayer) { + nodes.forEach(setInDragLayer); + nodes.neighborhood().stdFilter(function (ele) { + return !hasCompoundNodes || ele.isEdge(); + }).forEach(setInDragLayer); + } + + if (opts.addToList) { + nodes.forEach(function (ele) { + addToDragList(ele, opts); + }); + } + + addDescendantsToDrag(nodes, opts); // always add to drag + // also add nodes and edges related to the topmost ancestor + + updateAncestorsInDragLayer(nodes, { + inDragLayer: opts.inDragLayer + }); + r.updateCachedGrabbedEles(); + }; + + var addNodeToDrag = addNodesToDrag; + + var freeDraggedElements = function freeDraggedElements(grabbedEles) { + if (!grabbedEles) { + return; + } // just go over all elements rather than doing a bunch of (possibly expensive) traversals + + + r.getCachedZSortedEles().forEach(function (ele) { + setFreed(ele); + setOutDragLayer(ele); + removeGrabTarget(ele); + }); + r.updateCachedGrabbedEles(); + }; // helper function to determine which ancestor nodes and edges should go + // to the drag layer (or should be removed from drag layer). + + + var updateAncestorsInDragLayer = function updateAncestorsInDragLayer(node, opts) { + if (opts.inDragLayer == null && opts.addToList == null) { + return; + } // nothing to do + + + if (!node.cy().hasCompoundNodes()) { + return; + } // find top-level parent + + + var parent = node.ancestors().orphans(); // no parent node: no nodes to add to the drag layer + + if (parent.same(node)) { + return; + } + + var nodes = parent.descendants().spawnSelf().merge(parent).unmerge(node).unmerge(node.descendants()); + var edges = nodes.connectedEdges(); + + if (opts.inDragLayer) { + edges.forEach(setInDragLayer); + nodes.forEach(setInDragLayer); + } + + if (opts.addToList) { + nodes.forEach(function (ele) { + addToDragList(ele, opts); + }); + } + }; + + var blurActiveDomElement = function blurActiveDomElement() { + if (document.activeElement != null && document.activeElement.blur != null) { + document.activeElement.blur(); + } + }; + + var haveMutationsApi = typeof MutationObserver !== 'undefined'; + var haveResizeObserverApi = typeof ResizeObserver !== 'undefined'; // watch for when the cy container is removed from the dom + + if (haveMutationsApi) { + r.removeObserver = new MutationObserver(function (mutns) { + // eslint-disable-line no-undef + for (var i = 0; i < mutns.length; i++) { + var mutn = mutns[i]; + var rNodes = mutn.removedNodes; + + if (rNodes) { + for (var j = 0; j < rNodes.length; j++) { + var rNode = rNodes[j]; + + if (rNode === r.container) { + r.destroy(); + break; + } + } + } + } + }); + + if (r.container.parentNode) { + r.removeObserver.observe(r.container.parentNode, { + childList: true + }); + } + } else { + r.registerBinding(r.container, 'DOMNodeRemoved', function (e) { + // eslint-disable-line no-unused-vars + r.destroy(); + }); + } + + var onResize = debounce_1(function () { + r.cy.resize(); + }, 100); + + if (haveMutationsApi) { + r.styleObserver = new MutationObserver(onResize); // eslint-disable-line no-undef + + r.styleObserver.observe(r.container, { + attributes: true + }); + } // auto resize + + + r.registerBinding(containerWindow, 'resize', onResize); // eslint-disable-line no-undef + + if (haveResizeObserverApi) { + r.resizeObserver = new ResizeObserver(onResize); // eslint-disable-line no-undef + + r.resizeObserver.observe(r.container); + } + + var forEachUp = function forEachUp(domEle, fn) { + while (domEle != null) { + fn(domEle); + domEle = domEle.parentNode; + } + }; + + var invalidateCoords = function invalidateCoords() { + r.invalidateContainerClientCoordsCache(); + }; + + forEachUp(r.container, function (domEle) { + r.registerBinding(domEle, 'transitionend', invalidateCoords); + r.registerBinding(domEle, 'animationend', invalidateCoords); + r.registerBinding(domEle, 'scroll', invalidateCoords); + }); // stop right click menu from appearing on cy + + r.registerBinding(r.container, 'contextmenu', function (e) { + e.preventDefault(); + }); + + var inBoxSelection = function inBoxSelection() { + return r.selection[4] !== 0; + }; + + var eventInContainer = function eventInContainer(e) { + // save cycles if mouse events aren't to be captured + var containerPageCoords = r.findContainerClientCoords(); + var x = containerPageCoords[0]; + var y = containerPageCoords[1]; + var width = containerPageCoords[2]; + var height = containerPageCoords[3]; + var positions = e.touches ? e.touches : [e]; + var atLeastOnePosInside = false; + + for (var i = 0; i < positions.length; i++) { + var p = positions[i]; + + if (x <= p.clientX && p.clientX <= x + width && y <= p.clientY && p.clientY <= y + height) { + atLeastOnePosInside = true; + break; + } + } + + if (!atLeastOnePosInside) { + return false; + } + + var container = r.container; + var target = e.target; + var tParent = target.parentNode; + var containerIsTarget = false; + + while (tParent) { + if (tParent === container) { + containerIsTarget = true; + break; + } + + tParent = tParent.parentNode; + } + + if (!containerIsTarget) { + return false; + } // if target is outisde cy container, then this event is not for us + + + return true; + }; // Primary key + + + r.registerBinding(r.container, 'mousedown', function mousedownHandler(e) { + if (!eventInContainer(e)) { + return; + } + + e.preventDefault(); + blurActiveDomElement(); + r.hoverData.capture = true; + r.hoverData.which = e.which; + var cy = r.cy; + var gpos = [e.clientX, e.clientY]; + var pos = r.projectIntoViewport(gpos[0], gpos[1]); + var select = r.selection; + var nears = r.findNearestElements(pos[0], pos[1], true, false); + var near = nears[0]; + var draggedElements = r.dragData.possibleDragElements; + r.hoverData.mdownPos = pos; + r.hoverData.mdownGPos = gpos; + + var checkForTaphold = function checkForTaphold() { + r.hoverData.tapholdCancelled = false; + clearTimeout(r.hoverData.tapholdTimeout); + r.hoverData.tapholdTimeout = setTimeout(function () { + if (r.hoverData.tapholdCancelled) { + return; + } else { + var ele = r.hoverData.down; + + if (ele) { + ele.emit({ + originalEvent: e, + type: 'taphold', + position: { + x: pos[0], + y: pos[1] + } + }); + } else { + cy.emit({ + originalEvent: e, + type: 'taphold', + position: { + x: pos[0], + y: pos[1] + } + }); + } + } + }, r.tapholdDuration); + }; // Right click button + + + if (e.which == 3) { + r.hoverData.cxtStarted = true; + var cxtEvt = { + originalEvent: e, + type: 'cxttapstart', + position: { + x: pos[0], + y: pos[1] + } + }; + + if (near) { + near.activate(); + near.emit(cxtEvt); + r.hoverData.down = near; + } else { + cy.emit(cxtEvt); + } + + r.hoverData.downTime = new Date().getTime(); + r.hoverData.cxtDragged = false; // Primary button + } else if (e.which == 1) { + if (near) { + near.activate(); + } // Element dragging + + + { + // If something is under the cursor and it is draggable, prepare to grab it + if (near != null) { + if (r.nodeIsGrabbable(near)) { + var makeEvent = function makeEvent(type) { + return { + originalEvent: e, + type: type, + position: { + x: pos[0], + y: pos[1] + } + }; + }; + + var triggerGrab = function triggerGrab(ele) { + ele.emit(makeEvent('grab')); + }; + + setGrabTarget(near); + + if (!near.selected()) { + draggedElements = r.dragData.possibleDragElements = cy.collection(); + addNodeToDrag(near, { + addToList: draggedElements + }); + near.emit(makeEvent('grabon')).emit(makeEvent('grab')); + } else { + draggedElements = r.dragData.possibleDragElements = cy.collection(); + var selectedNodes = cy.$(function (ele) { + return ele.isNode() && ele.selected() && r.nodeIsGrabbable(ele); + }); + addNodesToDrag(selectedNodes, { + addToList: draggedElements + }); + near.emit(makeEvent('grabon')); + selectedNodes.forEach(triggerGrab); + } + + r.redrawHint('eles', true); + r.redrawHint('drag', true); + } + } + + r.hoverData.down = near; + r.hoverData.downs = nears; + r.hoverData.downTime = new Date().getTime(); + } + triggerEvents(near, ['mousedown', 'tapstart', 'vmousedown'], e, { + x: pos[0], + y: pos[1] + }); + + if (near == null) { + select[4] = 1; + r.data.bgActivePosistion = { + x: pos[0], + y: pos[1] + }; + r.redrawHint('select', true); + r.redraw(); + } else if (near.pannable()) { + select[4] = 1; // for future pan + } + + checkForTaphold(); + } // Initialize selection box coordinates + + + select[0] = select[2] = pos[0]; + select[1] = select[3] = pos[1]; + }, false); + r.registerBinding(containerWindow, 'mousemove', function mousemoveHandler(e) { + // eslint-disable-line no-undef + var capture = r.hoverData.capture; + + if (!capture && !eventInContainer(e)) { + return; + } + + var preventDefault = false; + var cy = r.cy; + var zoom = cy.zoom(); + var gpos = [e.clientX, e.clientY]; + var pos = r.projectIntoViewport(gpos[0], gpos[1]); + var mdownPos = r.hoverData.mdownPos; + var mdownGPos = r.hoverData.mdownGPos; + var select = r.selection; + var near = null; + + if (!r.hoverData.draggingEles && !r.hoverData.dragging && !r.hoverData.selecting) { + near = r.findNearestElement(pos[0], pos[1], true, false); + } + + var last = r.hoverData.last; + var down = r.hoverData.down; + var disp = [pos[0] - select[2], pos[1] - select[3]]; + var draggedElements = r.dragData.possibleDragElements; + var isOverThresholdDrag; + + if (mdownGPos) { + var dx = gpos[0] - mdownGPos[0]; + var dx2 = dx * dx; + var dy = gpos[1] - mdownGPos[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + r.hoverData.isOverThresholdDrag = isOverThresholdDrag = dist2 >= r.desktopTapThreshold2; + } + + var multSelKeyDown = isMultSelKeyDown(e); + + if (isOverThresholdDrag) { + r.hoverData.tapholdCancelled = true; + } + + var updateDragDelta = function updateDragDelta() { + var dragDelta = r.hoverData.dragDelta = r.hoverData.dragDelta || []; + + if (dragDelta.length === 0) { + dragDelta.push(disp[0]); + dragDelta.push(disp[1]); + } else { + dragDelta[0] += disp[0]; + dragDelta[1] += disp[1]; + } + }; + + preventDefault = true; + triggerEvents(near, ['mousemove', 'vmousemove', 'tapdrag'], e, { + x: pos[0], + y: pos[1] + }); + + var goIntoBoxMode = function goIntoBoxMode() { + r.data.bgActivePosistion = undefined; + + if (!r.hoverData.selecting) { + cy.emit({ + originalEvent: e, + type: 'boxstart', + position: { + x: pos[0], + y: pos[1] + } + }); + } + + select[4] = 1; + r.hoverData.selecting = true; + r.redrawHint('select', true); + r.redraw(); + }; // trigger context drag if rmouse down + + + if (r.hoverData.which === 3) { + // but only if over threshold + if (isOverThresholdDrag) { + var cxtEvt = { + originalEvent: e, + type: 'cxtdrag', + position: { + x: pos[0], + y: pos[1] + } + }; + + if (down) { + down.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + + r.hoverData.cxtDragged = true; + + if (!r.hoverData.cxtOver || near !== r.hoverData.cxtOver) { + if (r.hoverData.cxtOver) { + r.hoverData.cxtOver.emit({ + originalEvent: e, + type: 'cxtdragout', + position: { + x: pos[0], + y: pos[1] + } + }); + } + + r.hoverData.cxtOver = near; + + if (near) { + near.emit({ + originalEvent: e, + type: 'cxtdragover', + position: { + x: pos[0], + y: pos[1] + } + }); + } + } + } // Check if we are drag panning the entire graph + + } else if (r.hoverData.dragging) { + preventDefault = true; + + if (cy.panningEnabled() && cy.userPanningEnabled()) { + var deltaP; + + if (r.hoverData.justStartedPan) { + var mdPos = r.hoverData.mdownPos; + deltaP = { + x: (pos[0] - mdPos[0]) * zoom, + y: (pos[1] - mdPos[1]) * zoom + }; + r.hoverData.justStartedPan = false; + } else { + deltaP = { + x: disp[0] * zoom, + y: disp[1] * zoom + }; + } + + cy.panBy(deltaP); + cy.emit('dragpan'); + r.hoverData.dragged = true; + } // Needs reproject due to pan changing viewport + + + pos = r.projectIntoViewport(e.clientX, e.clientY); // Checks primary button down & out of time & mouse not moved much + } else if (select[4] == 1 && (down == null || down.pannable())) { + if (isOverThresholdDrag) { + if (!r.hoverData.dragging && cy.boxSelectionEnabled() && (multSelKeyDown || !cy.panningEnabled() || !cy.userPanningEnabled())) { + goIntoBoxMode(); + } else if (!r.hoverData.selecting && cy.panningEnabled() && cy.userPanningEnabled()) { + var allowPassthrough = allowPanningPassthrough(down, r.hoverData.downs); + + if (allowPassthrough) { + r.hoverData.dragging = true; + r.hoverData.justStartedPan = true; + select[4] = 0; + r.data.bgActivePosistion = array2point(mdownPos); + r.redrawHint('select', true); + r.redraw(); + } + } + + if (down && down.pannable() && down.active()) { + down.unactivate(); + } + } + } else { + if (down && down.pannable() && down.active()) { + down.unactivate(); + } + + if ((!down || !down.grabbed()) && near != last) { + if (last) { + triggerEvents(last, ['mouseout', 'tapdragout'], e, { + x: pos[0], + y: pos[1] + }); + } + + if (near) { + triggerEvents(near, ['mouseover', 'tapdragover'], e, { + x: pos[0], + y: pos[1] + }); + } + + r.hoverData.last = near; + } + + if (down) { + if (isOverThresholdDrag) { + // then we can take action + if (cy.boxSelectionEnabled() && multSelKeyDown) { + // then selection overrides + if (down && down.grabbed()) { + freeDraggedElements(draggedElements); + down.emit('freeon'); + draggedElements.emit('free'); + + if (r.dragData.didDrag) { + down.emit('dragfreeon'); + draggedElements.emit('dragfree'); + } + } + + goIntoBoxMode(); + } else if (down && down.grabbed() && r.nodeIsDraggable(down)) { + // drag node + var justStartedDrag = !r.dragData.didDrag; + + if (justStartedDrag) { + r.redrawHint('eles', true); + } + + r.dragData.didDrag = true; // indicate that we actually did drag the node + // now, add the elements to the drag layer if not done already + + if (!r.hoverData.draggingEles) { + addNodesToDrag(draggedElements, { + inDragLayer: true + }); + } + + var totalShift = { + x: 0, + y: 0 + }; + + if (number$1(disp[0]) && number$1(disp[1])) { + totalShift.x += disp[0]; + totalShift.y += disp[1]; + + if (justStartedDrag) { + var dragDelta = r.hoverData.dragDelta; + + if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) { + totalShift.x += dragDelta[0]; + totalShift.y += dragDelta[1]; + } + } + } + + r.hoverData.draggingEles = true; + draggedElements.silentShift(totalShift).emit('position drag'); + r.redrawHint('drag', true); + r.redraw(); + } + } else { + // otherwise save drag delta for when we actually start dragging so the relative grab pos is constant + updateDragDelta(); + } + } // prevent the dragging from triggering text selection on the page + + + preventDefault = true; + } + + select[2] = pos[0]; + select[3] = pos[1]; + + if (preventDefault) { + if (e.stopPropagation) e.stopPropagation(); + if (e.preventDefault) e.preventDefault(); + return false; + } + }, false); + var clickTimeout, didDoubleClick, prevClickTimeStamp; + r.registerBinding(containerWindow, 'mouseup', function mouseupHandler(e) { + // eslint-disable-line no-undef + var capture = r.hoverData.capture; + + if (!capture) { + return; + } + + r.hoverData.capture = false; + var cy = r.cy; + var pos = r.projectIntoViewport(e.clientX, e.clientY); + var select = r.selection; + var near = r.findNearestElement(pos[0], pos[1], true, false); + var draggedElements = r.dragData.possibleDragElements; + var down = r.hoverData.down; + var multSelKeyDown = isMultSelKeyDown(e); + + if (r.data.bgActivePosistion) { + r.redrawHint('select', true); + r.redraw(); + } + + r.hoverData.tapholdCancelled = true; + r.data.bgActivePosistion = undefined; // not active bg now + + if (down) { + down.unactivate(); + } + + if (r.hoverData.which === 3) { + var cxtEvt = { + originalEvent: e, + type: 'cxttapend', + position: { + x: pos[0], + y: pos[1] + } + }; + + if (down) { + down.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + + if (!r.hoverData.cxtDragged) { + var cxtTap = { + originalEvent: e, + type: 'cxttap', + position: { + x: pos[0], + y: pos[1] + } + }; + + if (down) { + down.emit(cxtTap); + } else { + cy.emit(cxtTap); + } + } + + r.hoverData.cxtDragged = false; + r.hoverData.which = null; + } else if (r.hoverData.which === 1) { + triggerEvents(near, ['mouseup', 'tapend', 'vmouseup'], e, { + x: pos[0], + y: pos[1] + }); + + if (!r.dragData.didDrag && // didn't move a node around + !r.hoverData.dragged && // didn't pan + !r.hoverData.selecting && // not box selection + !r.hoverData.isOverThresholdDrag // didn't move too much + ) { + triggerEvents(down, ["click", "tap", "vclick"], e, { + x: pos[0], + y: pos[1] + }); + didDoubleClick = false; + + if (e.timeStamp - prevClickTimeStamp <= cy.multiClickDebounceTime()) { + clickTimeout && clearTimeout(clickTimeout); + didDoubleClick = true; + prevClickTimeStamp = null; + triggerEvents(down, ["dblclick", "dbltap", "vdblclick"], e, { + x: pos[0], + y: pos[1] + }); + } else { + clickTimeout = setTimeout(function () { + if (didDoubleClick) return; + triggerEvents(down, ["oneclick", "onetap", "voneclick"], e, { + x: pos[0], + y: pos[1] + }); + }, cy.multiClickDebounceTime()); + prevClickTimeStamp = e.timeStamp; + } + } // Deselect all elements if nothing is currently under the mouse cursor and we aren't dragging something + + + if (down == null // not mousedown on node + && !r.dragData.didDrag // didn't move the node around + && !r.hoverData.selecting // not box selection + && !r.hoverData.dragged // didn't pan + && !isMultSelKeyDown(e)) { + cy.$(isSelected).unselect(['tapunselect']); + + if (draggedElements.length > 0) { + r.redrawHint('eles', true); + } + + r.dragData.possibleDragElements = draggedElements = cy.collection(); + } // Single selection + + + if (near == down && !r.dragData.didDrag && !r.hoverData.selecting) { + if (near != null && near._private.selectable) { + if (r.hoverData.dragging) ; else if (cy.selectionType() === 'additive' || multSelKeyDown) { + if (near.selected()) { + near.unselect(['tapunselect']); + } else { + near.select(['tapselect']); + } + } else { + if (!multSelKeyDown) { + cy.$(isSelected).unmerge(near).unselect(['tapunselect']); + near.select(['tapselect']); + } + } + + r.redrawHint('eles', true); + } + } + + if (r.hoverData.selecting) { + var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3])); + r.redrawHint('select', true); + + if (box.length > 0) { + r.redrawHint('eles', true); + } + + cy.emit({ + type: 'boxend', + originalEvent: e, + position: { + x: pos[0], + y: pos[1] + } + }); + + var eleWouldBeSelected = function eleWouldBeSelected(ele) { + return ele.selectable() && !ele.selected(); + }; + + if (cy.selectionType() === 'additive') { + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + } else { + if (!multSelKeyDown) { + cy.$(isSelected).unmerge(box).unselect(); + } + + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + } // always need redraw in case eles unselectable + + + r.redraw(); + } // Cancel drag pan + + + if (r.hoverData.dragging) { + r.hoverData.dragging = false; + r.redrawHint('select', true); + r.redrawHint('eles', true); + r.redraw(); + } + + if (!select[4]) { + r.redrawHint('drag', true); + r.redrawHint('eles', true); + var downWasGrabbed = down && down.grabbed(); + freeDraggedElements(draggedElements); + + if (downWasGrabbed) { + down.emit('freeon'); + draggedElements.emit('free'); + + if (r.dragData.didDrag) { + down.emit('dragfreeon'); + draggedElements.emit('dragfree'); + } + } + } + } // else not right mouse + + + select[4] = 0; + r.hoverData.down = null; + r.hoverData.cxtStarted = false; + r.hoverData.draggingEles = false; + r.hoverData.selecting = false; + r.hoverData.isOverThresholdDrag = false; + r.dragData.didDrag = false; + r.hoverData.dragged = false; + r.hoverData.dragDelta = []; + r.hoverData.mdownPos = null; + r.hoverData.mdownGPos = null; + }, false); + + var wheelHandler = function wheelHandler(e) { + if (r.scrollingPage) { + return; + } // while scrolling, ignore wheel-to-zoom + + + var cy = r.cy; + var zoom = cy.zoom(); + var pan = cy.pan(); + var pos = r.projectIntoViewport(e.clientX, e.clientY); + var rpos = [pos[0] * zoom + pan.x, pos[1] * zoom + pan.y]; + + if (r.hoverData.draggingEles || r.hoverData.dragging || r.hoverData.cxtStarted || inBoxSelection()) { + // if pan dragging or cxt dragging, wheel movements make no zoom + e.preventDefault(); + return; + } + + if (cy.panningEnabled() && cy.userPanningEnabled() && cy.zoomingEnabled() && cy.userZoomingEnabled()) { + e.preventDefault(); + r.data.wheelZooming = true; + clearTimeout(r.data.wheelTimeout); + r.data.wheelTimeout = setTimeout(function () { + r.data.wheelZooming = false; + r.redrawHint('eles', true); + r.redraw(); + }, 150); + var diff; + + if (e.deltaY != null) { + diff = e.deltaY / -250; + } else if (e.wheelDeltaY != null) { + diff = e.wheelDeltaY / 1000; + } else { + diff = e.wheelDelta / 1000; + } + + diff = diff * r.wheelSensitivity; + var needsWheelFix = e.deltaMode === 1; + + if (needsWheelFix) { + // fixes slow wheel events on ff/linux and ff/windows + diff *= 33; + } + + var newZoom = cy.zoom() * Math.pow(10, diff); + + if (e.type === 'gesturechange') { + newZoom = r.gestureStartZoom * e.scale; + } + + cy.zoom({ + level: newZoom, + renderedPosition: { + x: rpos[0], + y: rpos[1] + } + }); + cy.emit(e.type === 'gesturechange' ? 'pinchzoom' : 'scrollzoom'); + } + }; // Functions to help with whether mouse wheel should trigger zooming + // -- + + + r.registerBinding(r.container, 'wheel', wheelHandler, true); // disable nonstandard wheel events + // r.registerBinding(r.container, 'mousewheel', wheelHandler, true); + // r.registerBinding(r.container, 'DOMMouseScroll', wheelHandler, true); + // r.registerBinding(r.container, 'MozMousePixelScroll', wheelHandler, true); // older firefox + + r.registerBinding(containerWindow, 'scroll', function scrollHandler(e) { + // eslint-disable-line no-unused-vars + r.scrollingPage = true; + clearTimeout(r.scrollingPageTimeout); + r.scrollingPageTimeout = setTimeout(function () { + r.scrollingPage = false; + }, 250); + }, true); // desktop safari pinch to zoom start + + r.registerBinding(r.container, 'gesturestart', function gestureStartHandler(e) { + r.gestureStartZoom = r.cy.zoom(); + + if (!r.hasTouchStarted) { + // don't affect touch devices like iphone + e.preventDefault(); + } + }, true); + r.registerBinding(r.container, 'gesturechange', function (e) { + if (!r.hasTouchStarted) { + // don't affect touch devices like iphone + wheelHandler(e); + } + }, true); // Functions to help with handling mouseout/mouseover on the Cytoscape container + // Handle mouseout on Cytoscape container + + r.registerBinding(r.container, 'mouseout', function mouseOutHandler(e) { + var pos = r.projectIntoViewport(e.clientX, e.clientY); + r.cy.emit({ + originalEvent: e, + type: 'mouseout', + position: { + x: pos[0], + y: pos[1] + } + }); + }, false); + r.registerBinding(r.container, 'mouseover', function mouseOverHandler(e) { + var pos = r.projectIntoViewport(e.clientX, e.clientY); + r.cy.emit({ + originalEvent: e, + type: 'mouseover', + position: { + x: pos[0], + y: pos[1] + } + }); + }, false); + var f1x1, f1y1, f2x1, f2y1; // starting points for pinch-to-zoom + + var distance1, distance1Sq; // initial distance between finger 1 and finger 2 for pinch-to-zoom + + var center1, modelCenter1; // center point on start pinch to zoom + + var offsetLeft, offsetTop; + var containerWidth, containerHeight; + var twoFingersStartInside; + + var distance = function distance(x1, y1, x2, y2) { + return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); + }; + + var distanceSq = function distanceSq(x1, y1, x2, y2) { + return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); + }; + + var touchstartHandler; + r.registerBinding(r.container, 'touchstart', touchstartHandler = function touchstartHandler(e) { + r.hasTouchStarted = true; + + if (!eventInContainer(e)) { + return; + } + + blurActiveDomElement(); + r.touchData.capture = true; + r.data.bgActivePosistion = undefined; + var cy = r.cy; + var now = r.touchData.now; + var earlier = r.touchData.earlier; + + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } // record starting points for pinch-to-zoom + + + if (e.touches[1]) { + r.touchData.singleTouchMoved = true; + freeDraggedElements(r.dragData.touchDragEles); + var offsets = r.findContainerClientCoords(); + offsetLeft = offsets[0]; + offsetTop = offsets[1]; + containerWidth = offsets[2]; + containerHeight = offsets[3]; + f1x1 = e.touches[0].clientX - offsetLeft; + f1y1 = e.touches[0].clientY - offsetTop; + f2x1 = e.touches[1].clientX - offsetLeft; + f2y1 = e.touches[1].clientY - offsetTop; + twoFingersStartInside = 0 <= f1x1 && f1x1 <= containerWidth && 0 <= f2x1 && f2x1 <= containerWidth && 0 <= f1y1 && f1y1 <= containerHeight && 0 <= f2y1 && f2y1 <= containerHeight; + var pan = cy.pan(); + var zoom = cy.zoom(); + distance1 = distance(f1x1, f1y1, f2x1, f2y1); + distance1Sq = distanceSq(f1x1, f1y1, f2x1, f2y1); + center1 = [(f1x1 + f2x1) / 2, (f1y1 + f2y1) / 2]; + modelCenter1 = [(center1[0] - pan.x) / zoom, (center1[1] - pan.y) / zoom]; // consider context tap + + var cxtDistThreshold = 200; + var cxtDistThresholdSq = cxtDistThreshold * cxtDistThreshold; + + if (distance1Sq < cxtDistThresholdSq && !e.touches[2]) { + var near1 = r.findNearestElement(now[0], now[1], true, true); + var near2 = r.findNearestElement(now[2], now[3], true, true); + + if (near1 && near1.isNode()) { + near1.activate().emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + r.touchData.start = near1; + } else if (near2 && near2.isNode()) { + near2.activate().emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + r.touchData.start = near2; + } else { + cy.emit({ + originalEvent: e, + type: 'cxttapstart', + position: { + x: now[0], + y: now[1] + } + }); + } + + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; + } + + r.touchData.cxt = true; + r.touchData.cxtDragged = false; + r.data.bgActivePosistion = undefined; + r.redraw(); + return; + } + } + + if (e.touches[2]) { + // ignore + // safari on ios pans the page otherwise (normally you should be able to preventdefault on touchmove...) + if (cy.boxSelectionEnabled()) { + e.preventDefault(); + } + } else if (e.touches[1]) ; else if (e.touches[0]) { + var nears = r.findNearestElements(now[0], now[1], true, true); + var near = nears[0]; + + if (near != null) { + near.activate(); + r.touchData.start = near; + r.touchData.starts = nears; + + if (r.nodeIsGrabbable(near)) { + var draggedEles = r.dragData.touchDragEles = cy.collection(); + var selectedNodes = null; + r.redrawHint('eles', true); + r.redrawHint('drag', true); + + if (near.selected()) { + // reset drag elements, since near will be added again + selectedNodes = cy.$(function (ele) { + return ele.selected() && r.nodeIsGrabbable(ele); + }); + addNodesToDrag(selectedNodes, { + addToList: draggedEles + }); + } else { + addNodeToDrag(near, { + addToList: draggedEles + }); + } + + setGrabTarget(near); + + var makeEvent = function makeEvent(type) { + return { + originalEvent: e, + type: type, + position: { + x: now[0], + y: now[1] + } + }; + }; + + near.emit(makeEvent('grabon')); + + if (selectedNodes) { + selectedNodes.forEach(function (n) { + n.emit(makeEvent('grab')); + }); + } else { + near.emit(makeEvent('grab')); + } + } + } + + triggerEvents(near, ['touchstart', 'tapstart', 'vmousedown'], e, { + x: now[0], + y: now[1] + }); + + if (near == null) { + r.data.bgActivePosistion = { + x: pos[0], + y: pos[1] + }; + r.redrawHint('select', true); + r.redraw(); + } // Tap, taphold + // ----- + + + r.touchData.singleTouchMoved = false; + r.touchData.singleTouchStartTime = +new Date(); + clearTimeout(r.touchData.tapholdTimeout); + r.touchData.tapholdTimeout = setTimeout(function () { + if (r.touchData.singleTouchMoved === false && !r.pinching // if pinching, then taphold unselect shouldn't take effect + && !r.touchData.selecting // box selection shouldn't allow taphold through + ) { + triggerEvents(r.touchData.start, ['taphold'], e, { + x: now[0], + y: now[1] + }); + } + }, r.tapholdDuration); + } + + if (e.touches.length >= 1) { + var sPos = r.touchData.startPosition = [null, null, null, null, null, null]; + + for (var i = 0; i < now.length; i++) { + sPos[i] = earlier[i] = now[i]; + } + + var touch0 = e.touches[0]; + r.touchData.startGPosition = [touch0.clientX, touch0.clientY]; + } + }, false); + var touchmoveHandler; + r.registerBinding(window, 'touchmove', touchmoveHandler = function touchmoveHandler(e) { + // eslint-disable-line no-undef + var capture = r.touchData.capture; + + if (!capture && !eventInContainer(e)) { + return; + } + + var select = r.selection; + var cy = r.cy; + var now = r.touchData.now; + var earlier = r.touchData.earlier; + var zoom = cy.zoom(); + + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } + + var startGPos = r.touchData.startGPosition; + var isOverThresholdDrag; + + if (capture && e.touches[0] && startGPos) { + var disp = []; + + for (var j = 0; j < now.length; j++) { + disp[j] = now[j] - earlier[j]; + } + + var dx = e.touches[0].clientX - startGPos[0]; + var dx2 = dx * dx; + var dy = e.touches[0].clientY - startGPos[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + isOverThresholdDrag = dist2 >= r.touchTapThreshold2; + } // context swipe cancelling + + + if (capture && r.touchData.cxt) { + e.preventDefault(); + var f1x2 = e.touches[0].clientX - offsetLeft, + f1y2 = e.touches[0].clientY - offsetTop; + var f2x2 = e.touches[1].clientX - offsetLeft, + f2y2 = e.touches[1].clientY - offsetTop; // var distance2 = distance( f1x2, f1y2, f2x2, f2y2 ); + + var distance2Sq = distanceSq(f1x2, f1y2, f2x2, f2y2); + var factorSq = distance2Sq / distance1Sq; + var distThreshold = 150; + var distThresholdSq = distThreshold * distThreshold; + var factorThreshold = 1.5; + var factorThresholdSq = factorThreshold * factorThreshold; // cancel ctx gestures if the distance b/t the fingers increases + + if (factorSq >= factorThresholdSq || distance2Sq >= distThresholdSq) { + r.touchData.cxt = false; + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var cxtEvt = { + originalEvent: e, + type: 'cxttapend', + position: { + x: now[0], + y: now[1] + } + }; + + if (r.touchData.start) { + r.touchData.start.unactivate().emit(cxtEvt); + r.touchData.start = null; + } else { + cy.emit(cxtEvt); + } + } + } // context swipe + + + if (capture && r.touchData.cxt) { + var cxtEvt = { + originalEvent: e, + type: 'cxtdrag', + position: { + x: now[0], + y: now[1] + } + }; + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + + if (r.touchData.start) { + r.touchData.start.emit(cxtEvt); + } else { + cy.emit(cxtEvt); + } + + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; + } + + r.touchData.cxtDragged = true; + var near = r.findNearestElement(now[0], now[1], true, true); + + if (!r.touchData.cxtOver || near !== r.touchData.cxtOver) { + if (r.touchData.cxtOver) { + r.touchData.cxtOver.emit({ + originalEvent: e, + type: 'cxtdragout', + position: { + x: now[0], + y: now[1] + } + }); + } + + r.touchData.cxtOver = near; + + if (near) { + near.emit({ + originalEvent: e, + type: 'cxtdragover', + position: { + x: now[0], + y: now[1] + } + }); + } + } // box selection + + } else if (capture && e.touches[2] && cy.boxSelectionEnabled()) { + e.preventDefault(); + r.data.bgActivePosistion = undefined; + this.lastThreeTouch = +new Date(); + + if (!r.touchData.selecting) { + cy.emit({ + originalEvent: e, + type: 'boxstart', + position: { + x: now[0], + y: now[1] + } + }); + } + + r.touchData.selecting = true; + r.touchData.didSelect = true; + select[4] = 1; + + if (!select || select.length === 0 || select[0] === undefined) { + select[0] = (now[0] + now[2] + now[4]) / 3; + select[1] = (now[1] + now[3] + now[5]) / 3; + select[2] = (now[0] + now[2] + now[4]) / 3 + 1; + select[3] = (now[1] + now[3] + now[5]) / 3 + 1; + } else { + select[2] = (now[0] + now[2] + now[4]) / 3; + select[3] = (now[1] + now[3] + now[5]) / 3; + } + + r.redrawHint('select', true); + r.redraw(); // pinch to zoom + } else if (capture && e.touches[1] && !r.touchData.didSelect // don't allow box selection to degrade to pinch-to-zoom + && cy.zoomingEnabled() && cy.panningEnabled() && cy.userZoomingEnabled() && cy.userPanningEnabled()) { + // two fingers => pinch to zoom + e.preventDefault(); + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var draggedEles = r.dragData.touchDragEles; + + if (draggedEles) { + r.redrawHint('drag', true); + + for (var i = 0; i < draggedEles.length; i++) { + var de_p = draggedEles[i]._private; + de_p.grabbed = false; + de_p.rscratch.inDragLayer = false; + } + } + + var _start = r.touchData.start; // (x2, y2) for fingers 1 and 2 + + var f1x2 = e.touches[0].clientX - offsetLeft, + f1y2 = e.touches[0].clientY - offsetTop; + var f2x2 = e.touches[1].clientX - offsetLeft, + f2y2 = e.touches[1].clientY - offsetTop; + var distance2 = distance(f1x2, f1y2, f2x2, f2y2); // var distance2Sq = distanceSq( f1x2, f1y2, f2x2, f2y2 ); + // var factor = Math.sqrt( distance2Sq ) / Math.sqrt( distance1Sq ); + + var factor = distance2 / distance1; + + if (twoFingersStartInside) { + // delta finger1 + var df1x = f1x2 - f1x1; + var df1y = f1y2 - f1y1; // delta finger 2 + + var df2x = f2x2 - f2x1; + var df2y = f2y2 - f2y1; // translation is the normalised vector of the two fingers movement + // i.e. so pinching cancels out and moving together pans + + var tx = (df1x + df2x) / 2; + var ty = (df1y + df2y) / 2; // now calculate the zoom + + var zoom1 = cy.zoom(); + var zoom2 = zoom1 * factor; + var pan1 = cy.pan(); // the model center point converted to the current rendered pos + + var ctrx = modelCenter1[0] * zoom1 + pan1.x; + var ctry = modelCenter1[1] * zoom1 + pan1.y; + var pan2 = { + x: -zoom2 / zoom1 * (ctrx - pan1.x - tx) + ctrx, + y: -zoom2 / zoom1 * (ctry - pan1.y - ty) + ctry + }; // remove dragged eles + + if (_start && _start.active()) { + var draggedEles = r.dragData.touchDragEles; + freeDraggedElements(draggedEles); + r.redrawHint('drag', true); + r.redrawHint('eles', true); + + _start.unactivate().emit('freeon'); + + draggedEles.emit('free'); + + if (r.dragData.didDrag) { + _start.emit('dragfreeon'); + + draggedEles.emit('dragfree'); + } + } + + cy.viewport({ + zoom: zoom2, + pan: pan2, + cancelOnFailedZoom: true + }); + cy.emit('pinchzoom'); + distance1 = distance2; + f1x1 = f1x2; + f1y1 = f1y2; + f2x1 = f2x2; + f2y1 = f2y2; + r.pinching = true; + } // Re-project + + + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } + } else if (e.touches[0] && !r.touchData.didSelect // don't allow box selection to degrade to single finger events like panning + ) { + var start = r.touchData.start; + var last = r.touchData.last; + var near; + + if (!r.hoverData.draggingEles && !r.swipePanning) { + near = r.findNearestElement(now[0], now[1], true, true); + } + + if (capture && start != null) { + e.preventDefault(); + } // dragging nodes + + + if (capture && start != null && r.nodeIsDraggable(start)) { + if (isOverThresholdDrag) { + // then dragging can happen + var draggedEles = r.dragData.touchDragEles; + var justStartedDrag = !r.dragData.didDrag; + + if (justStartedDrag) { + addNodesToDrag(draggedEles, { + inDragLayer: true + }); + } + + r.dragData.didDrag = true; + var totalShift = { + x: 0, + y: 0 + }; + + if (number$1(disp[0]) && number$1(disp[1])) { + totalShift.x += disp[0]; + totalShift.y += disp[1]; + + if (justStartedDrag) { + r.redrawHint('eles', true); + var dragDelta = r.touchData.dragDelta; + + if (dragDelta && number$1(dragDelta[0]) && number$1(dragDelta[1])) { + totalShift.x += dragDelta[0]; + totalShift.y += dragDelta[1]; + } + } + } + + r.hoverData.draggingEles = true; + draggedEles.silentShift(totalShift).emit('position drag'); + r.redrawHint('drag', true); + + if (r.touchData.startPosition[0] == earlier[0] && r.touchData.startPosition[1] == earlier[1]) { + r.redrawHint('eles', true); + } + + r.redraw(); + } else { + // otherwise keep track of drag delta for later + var dragDelta = r.touchData.dragDelta = r.touchData.dragDelta || []; + + if (dragDelta.length === 0) { + dragDelta.push(disp[0]); + dragDelta.push(disp[1]); + } else { + dragDelta[0] += disp[0]; + dragDelta[1] += disp[1]; + } + } + } // touchmove + + + { + triggerEvents(start || near, ['touchmove', 'tapdrag', 'vmousemove'], e, { + x: now[0], + y: now[1] + }); + + if ((!start || !start.grabbed()) && near != last) { + if (last) { + last.emit({ + originalEvent: e, + type: 'tapdragout', + position: { + x: now[0], + y: now[1] + } + }); + } + + if (near) { + near.emit({ + originalEvent: e, + type: 'tapdragover', + position: { + x: now[0], + y: now[1] + } + }); + } + } + + r.touchData.last = near; + } // check to cancel taphold + + if (capture) { + for (var i = 0; i < now.length; i++) { + if (now[i] && r.touchData.startPosition[i] && isOverThresholdDrag) { + r.touchData.singleTouchMoved = true; + } + } + } // panning + + + if (capture && (start == null || start.pannable()) && cy.panningEnabled() && cy.userPanningEnabled()) { + var allowPassthrough = allowPanningPassthrough(start, r.touchData.starts); + + if (allowPassthrough) { + e.preventDefault(); + + if (!r.data.bgActivePosistion) { + r.data.bgActivePosistion = array2point(r.touchData.startPosition); + } + + if (r.swipePanning) { + cy.panBy({ + x: disp[0] * zoom, + y: disp[1] * zoom + }); + cy.emit('dragpan'); + } else if (isOverThresholdDrag) { + r.swipePanning = true; + cy.panBy({ + x: dx * zoom, + y: dy * zoom + }); + cy.emit('dragpan'); + + if (start) { + start.unactivate(); + r.redrawHint('select', true); + r.touchData.start = null; + } + } + } // Re-project + + + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + } + + for (var j = 0; j < now.length; j++) { + earlier[j] = now[j]; + } // the active bg indicator should be removed when making a swipe that is neither for dragging nodes or panning + + + if (capture && e.touches.length > 0 && !r.hoverData.draggingEles && !r.swipePanning && r.data.bgActivePosistion != null) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + r.redraw(); + } + }, false); + var touchcancelHandler; + r.registerBinding(containerWindow, 'touchcancel', touchcancelHandler = function touchcancelHandler(e) { + // eslint-disable-line no-unused-vars + var start = r.touchData.start; + r.touchData.capture = false; + + if (start) { + start.unactivate(); + } + }); + var touchendHandler, didDoubleTouch, touchTimeout, prevTouchTimeStamp; + r.registerBinding(containerWindow, 'touchend', touchendHandler = function touchendHandler(e) { + // eslint-disable-line no-unused-vars + var start = r.touchData.start; + var capture = r.touchData.capture; + + if (capture) { + if (e.touches.length === 0) { + r.touchData.capture = false; + } + + e.preventDefault(); + } else { + return; + } + + var select = r.selection; + r.swipePanning = false; + r.hoverData.draggingEles = false; + var cy = r.cy; + var zoom = cy.zoom(); + var now = r.touchData.now; + var earlier = r.touchData.earlier; + + if (e.touches[0]) { + var pos = r.projectIntoViewport(e.touches[0].clientX, e.touches[0].clientY); + now[0] = pos[0]; + now[1] = pos[1]; + } + + if (e.touches[1]) { + var pos = r.projectIntoViewport(e.touches[1].clientX, e.touches[1].clientY); + now[2] = pos[0]; + now[3] = pos[1]; + } + + if (e.touches[2]) { + var pos = r.projectIntoViewport(e.touches[2].clientX, e.touches[2].clientY); + now[4] = pos[0]; + now[5] = pos[1]; + } + + if (start) { + start.unactivate(); + } + + var ctxTapend; + + if (r.touchData.cxt) { + ctxTapend = { + originalEvent: e, + type: 'cxttapend', + position: { + x: now[0], + y: now[1] + } + }; + + if (start) { + start.emit(ctxTapend); + } else { + cy.emit(ctxTapend); + } + + if (!r.touchData.cxtDragged) { + var ctxTap = { + originalEvent: e, + type: 'cxttap', + position: { + x: now[0], + y: now[1] + } + }; + + if (start) { + start.emit(ctxTap); + } else { + cy.emit(ctxTap); + } + } + + if (r.touchData.start) { + r.touchData.start._private.grabbed = false; + } + + r.touchData.cxt = false; + r.touchData.start = null; + r.redraw(); + return; + } // no more box selection if we don't have three fingers + + + if (!e.touches[2] && cy.boxSelectionEnabled() && r.touchData.selecting) { + r.touchData.selecting = false; + var box = cy.collection(r.getAllInBox(select[0], select[1], select[2], select[3])); + select[0] = undefined; + select[1] = undefined; + select[2] = undefined; + select[3] = undefined; + select[4] = 0; + r.redrawHint('select', true); + cy.emit({ + type: 'boxend', + originalEvent: e, + position: { + x: now[0], + y: now[1] + } + }); + + var eleWouldBeSelected = function eleWouldBeSelected(ele) { + return ele.selectable() && !ele.selected(); + }; + + box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect'); + + if (box.nonempty()) { + r.redrawHint('eles', true); + } + + r.redraw(); + } + + if (start != null) { + start.unactivate(); + } + + if (e.touches[2]) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + } else if (e.touches[1]) ; else if (e.touches[0]) ; else if (!e.touches[0]) { + r.data.bgActivePosistion = undefined; + r.redrawHint('select', true); + var draggedEles = r.dragData.touchDragEles; + + if (start != null) { + var startWasGrabbed = start._private.grabbed; + freeDraggedElements(draggedEles); + r.redrawHint('drag', true); + r.redrawHint('eles', true); + + if (startWasGrabbed) { + start.emit('freeon'); + draggedEles.emit('free'); + + if (r.dragData.didDrag) { + start.emit('dragfreeon'); + draggedEles.emit('dragfree'); + } + } + + triggerEvents(start, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, { + x: now[0], + y: now[1] + }); + start.unactivate(); + r.touchData.start = null; + } else { + var near = r.findNearestElement(now[0], now[1], true, true); + triggerEvents(near, ['touchend', 'tapend', 'vmouseup', 'tapdragout'], e, { + x: now[0], + y: now[1] + }); + } + + var dx = r.touchData.startPosition[0] - now[0]; + var dx2 = dx * dx; + var dy = r.touchData.startPosition[1] - now[1]; + var dy2 = dy * dy; + var dist2 = dx2 + dy2; + var rdist2 = dist2 * zoom * zoom; // Tap event, roughly same as mouse click event for touch + + if (!r.touchData.singleTouchMoved) { + if (!start) { + cy.$(':selected').unselect(['tapunselect']); + } + + triggerEvents(start, ['tap', 'vclick'], e, { + x: now[0], + y: now[1] + }); + didDoubleTouch = false; + + if (e.timeStamp - prevTouchTimeStamp <= cy.multiClickDebounceTime()) { + touchTimeout && clearTimeout(touchTimeout); + didDoubleTouch = true; + prevTouchTimeStamp = null; + triggerEvents(start, ['dbltap', 'vdblclick'], e, { + x: now[0], + y: now[1] + }); + } else { + touchTimeout = setTimeout(function () { + if (didDoubleTouch) return; + triggerEvents(start, ['onetap', 'voneclick'], e, { + x: now[0], + y: now[1] + }); + }, cy.multiClickDebounceTime()); + prevTouchTimeStamp = e.timeStamp; + } + } // Prepare to select the currently touched node, only if it hasn't been dragged past a certain distance + + + if (start != null && !r.dragData.didDrag // didn't drag nodes around + && start._private.selectable && rdist2 < r.touchTapThreshold2 && !r.pinching // pinch to zoom should not affect selection + ) { + if (cy.selectionType() === 'single') { + cy.$(isSelected).unmerge(start).unselect(['tapunselect']); + start.select(['tapselect']); + } else { + if (start.selected()) { + start.unselect(['tapunselect']); + } else { + start.select(['tapselect']); + } + } + + r.redrawHint('eles', true); + } + + r.touchData.singleTouchMoved = true; + } + + for (var j = 0; j < now.length; j++) { + earlier[j] = now[j]; + } + + r.dragData.didDrag = false; // reset for next touchstart + + if (e.touches.length === 0) { + r.touchData.dragDelta = []; + r.touchData.startPosition = [null, null, null, null, null, null]; + r.touchData.startGPosition = null; + r.touchData.didSelect = false; + } + + if (e.touches.length < 2) { + if (e.touches.length === 1) { + // the old start global pos'n may not be the same finger that remains + r.touchData.startGPosition = [e.touches[0].clientX, e.touches[0].clientY]; + } + + r.pinching = false; + r.redrawHint('eles', true); + r.redraw(); + } //r.redraw(); + + }, false); // fallback compatibility layer for ms pointer events + + if (typeof TouchEvent === 'undefined') { + var pointers = []; + + var makeTouch = function makeTouch(e) { + return { + clientX: e.clientX, + clientY: e.clientY, + force: 1, + identifier: e.pointerId, + pageX: e.pageX, + pageY: e.pageY, + radiusX: e.width / 2, + radiusY: e.height / 2, + screenX: e.screenX, + screenY: e.screenY, + target: e.target + }; + }; + + var makePointer = function makePointer(e) { + return { + event: e, + touch: makeTouch(e) + }; + }; + + var addPointer = function addPointer(e) { + pointers.push(makePointer(e)); + }; + + var removePointer = function removePointer(e) { + for (var i = 0; i < pointers.length; i++) { + var p = pointers[i]; + + if (p.event.pointerId === e.pointerId) { + pointers.splice(i, 1); + return; + } + } + }; + + var updatePointer = function updatePointer(e) { + var p = pointers.filter(function (p) { + return p.event.pointerId === e.pointerId; + })[0]; + p.event = e; + p.touch = makeTouch(e); + }; + + var addTouchesToEvent = function addTouchesToEvent(e) { + e.touches = pointers.map(function (p) { + return p.touch; + }); + }; + + var pointerIsMouse = function pointerIsMouse(e) { + return e.pointerType === 'mouse' || e.pointerType === 4; + }; + + r.registerBinding(r.container, 'pointerdown', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + + + e.preventDefault(); + addPointer(e); + addTouchesToEvent(e); + touchstartHandler(e); + }); + r.registerBinding(r.container, 'pointerup', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + + + removePointer(e); + addTouchesToEvent(e); + touchendHandler(e); + }); + r.registerBinding(r.container, 'pointercancel', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + + + removePointer(e); + addTouchesToEvent(e); + touchcancelHandler(e); + }); + r.registerBinding(r.container, 'pointermove', function (e) { + if (pointerIsMouse(e)) { + return; + } // mouse already handled + + + e.preventDefault(); + updatePointer(e); + addTouchesToEvent(e); + touchmoveHandler(e); + }); + } + }; + + var BRp$2 = {}; + + BRp$2.generatePolygon = function (name, points) { + return this.nodeShapes[name] = { + renderer: this, + name: name, + points: points, + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl('polygon', context, centerX, centerY, width, height, this.points); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return polygonIntersectLine(x, y, this.points, nodeX, nodeY, width / 2, height / 2, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return pointInsidePolygon(x, y, this.points, centerX, centerY, width, height, [0, -1], padding); + } + }; + }; + + BRp$2.generateEllipse = function () { + return this.nodeShapes['ellipse'] = { + renderer: this, + name: 'ellipse', + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return intersectLineEllipse(x, y, nodeX, nodeY, width / 2 + padding, height / 2 + padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return checkInEllipse(x, y, width, height, centerX, centerY, padding); + } + }; + }; + + BRp$2.generateRoundPolygon = function (name, points) { + // Pre-compute control points + // Since these points depend on the radius length (which in turns depend on the width/height of the node) we will only pre-compute + // the unit vectors. + // For simplicity the layout will be: + // [ p0, UnitVectorP0P1, p1, UniVectorP1P2, ..., pn, UnitVectorPnP0 ] + var allPoints = new Array(points.length * 2); + + for (var i = 0; i < points.length / 2; i++) { + var sourceIndex = i * 2; + var destIndex = void 0; + + if (i < points.length / 2 - 1) { + destIndex = (i + 1) * 2; + } else { + destIndex = 0; + } + + allPoints[i * 4] = points[sourceIndex]; + allPoints[i * 4 + 1] = points[sourceIndex + 1]; + var xDest = points[destIndex] - points[sourceIndex]; + var yDest = points[destIndex + 1] - points[sourceIndex + 1]; + var norm = Math.sqrt(xDest * xDest + yDest * yDest); + allPoints[i * 4 + 2] = xDest / norm; + allPoints[i * 4 + 3] = yDest / norm; + } + + return this.nodeShapes[name] = { + renderer: this, + name: name, + points: allPoints, + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl('round-polygon', context, centerX, centerY, width, height, this.points); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return roundPolygonIntersectLine(x, y, this.points, nodeX, nodeY, width, height); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + return pointInsideRoundPolygon(x, y, this.points, centerX, centerY, width, height); + } + }; + }; + + BRp$2.generateRoundRectangle = function () { + return this.nodeShapes['round-rectangle'] = this.nodeShapes['roundrectangle'] = { + renderer: this, + name: 'round-rectangle', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var cornerRadius = getRoundRectangleRadius(width, height); + var diam = cornerRadius * 2; // Check hBox + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) { + return true; + } // Check vBox + + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) { + return true; + } // Check top left quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY - height / 2 + cornerRadius, padding)) { + return true; + } // Check top right quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY - height / 2 + cornerRadius, padding)) { + return true; + } // Check bottom right quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } // Check bottom left quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } + + return false; + } + }; + }; + + BRp$2.generateCutRectangle = function () { + return this.nodeShapes['cut-rectangle'] = this.nodeShapes['cutrectangle'] = { + renderer: this, + name: 'cut-rectangle', + cornerLength: getCutRectangleCornerLength(), + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + generateCutTrianglePts: function generateCutTrianglePts(width, height, centerX, centerY) { + var cl = this.cornerLength; + var hh = height / 2; + var hw = width / 2; + var xBegin = centerX - hw; + var xEnd = centerX + hw; + var yBegin = centerY - hh; + var yEnd = centerY + hh; // points are in clockwise order, inner (imaginary) triangle pt on [4, 5] + + return { + topLeft: [xBegin, yBegin + cl, xBegin + cl, yBegin, xBegin + cl, yBegin + cl], + topRight: [xEnd - cl, yBegin, xEnd, yBegin + cl, xEnd - cl, yBegin + cl], + bottomRight: [xEnd, yEnd - cl, xEnd - cl, yEnd, xEnd - cl, yEnd - cl], + bottomLeft: [xBegin + cl, yEnd, xBegin, yEnd - cl, xBegin + cl, yEnd - cl] + }; + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + var cPts = this.generateCutTrianglePts(width + 2 * padding, height + 2 * padding, nodeX, nodeY); + var pts = [].concat.apply([], [cPts.topLeft.splice(0, 4), cPts.topRight.splice(0, 4), cPts.bottomRight.splice(0, 4), cPts.bottomLeft.splice(0, 4)]); + return polygonIntersectLine(x, y, pts, nodeX, nodeY); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + // Check hBox + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * this.cornerLength, [0, -1], padding)) { + return true; + } // Check vBox + + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * this.cornerLength, height, [0, -1], padding)) { + return true; + } + + var cutTrianglePts = this.generateCutTrianglePts(width, height, centerX, centerY); + return pointInsidePolygonPoints(x, y, cutTrianglePts.topLeft) || pointInsidePolygonPoints(x, y, cutTrianglePts.topRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomRight) || pointInsidePolygonPoints(x, y, cutTrianglePts.bottomLeft); + } + }; + }; + + BRp$2.generateBarrel = function () { + return this.nodeShapes['barrel'] = { + renderer: this, + name: 'barrel', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + // use two fixed t values for the bezier curve approximation + var t0 = 0.15; + var t1 = 0.5; + var t2 = 0.85; + var bPts = this.generateBarrelBezierPts(width + 2 * padding, height + 2 * padding, nodeX, nodeY); + + var approximateBarrelCurvePts = function approximateBarrelCurvePts(pts) { + // approximate curve pts based on the two t values + var m0 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t0); + var m1 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t1); + var m2 = qbezierPtAt({ + x: pts[0], + y: pts[1] + }, { + x: pts[2], + y: pts[3] + }, { + x: pts[4], + y: pts[5] + }, t2); + return [pts[0], pts[1], m0.x, m0.y, m1.x, m1.y, m2.x, m2.y, pts[4], pts[5]]; + }; + + var pts = [].concat(approximateBarrelCurvePts(bPts.topLeft), approximateBarrelCurvePts(bPts.topRight), approximateBarrelCurvePts(bPts.bottomRight), approximateBarrelCurvePts(bPts.bottomLeft)); + return polygonIntersectLine(x, y, pts, nodeX, nodeY); + }, + generateBarrelBezierPts: function generateBarrelBezierPts(width, height, centerX, centerY) { + var hh = height / 2; + var hw = width / 2; + var xBegin = centerX - hw; + var xEnd = centerX + hw; + var yBegin = centerY - hh; + var yEnd = centerY + hh; + var curveConstants = getBarrelCurveConstants(width, height); + var hOffset = curveConstants.heightOffset; + var wOffset = curveConstants.widthOffset; + var ctrlPtXOffset = curveConstants.ctrlPtOffsetPct * width; // points are in clockwise order, inner (imaginary) control pt on [4, 5] + + var pts = { + topLeft: [xBegin, yBegin + hOffset, xBegin + ctrlPtXOffset, yBegin, xBegin + wOffset, yBegin], + topRight: [xEnd - wOffset, yBegin, xEnd - ctrlPtXOffset, yBegin, xEnd, yBegin + hOffset], + bottomRight: [xEnd, yEnd - hOffset, xEnd - ctrlPtXOffset, yEnd, xEnd - wOffset, yEnd], + bottomLeft: [xBegin + wOffset, yEnd, xBegin + ctrlPtXOffset, yEnd, xBegin, yEnd - hOffset] + }; + pts.topLeft.isTop = true; + pts.topRight.isTop = true; + pts.bottomLeft.isBottom = true; + pts.bottomRight.isBottom = true; + return pts; + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var curveConstants = getBarrelCurveConstants(width, height); + var hOffset = curveConstants.heightOffset; + var wOffset = curveConstants.widthOffset; // Check hBox + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - 2 * hOffset, [0, -1], padding)) { + return true; + } // Check vBox + + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - 2 * wOffset, height, [0, -1], padding)) { + return true; + } + + var barrelCurvePts = this.generateBarrelBezierPts(width, height, centerX, centerY); + + var getCurveT = function getCurveT(x, y, curvePts) { + var x0 = curvePts[4]; + var x1 = curvePts[2]; + var x2 = curvePts[0]; + var y0 = curvePts[5]; // var y1 = curvePts[ 3 ]; + + var y2 = curvePts[1]; + var xMin = Math.min(x0, x2); + var xMax = Math.max(x0, x2); + var yMin = Math.min(y0, y2); + var yMax = Math.max(y0, y2); + + if (xMin <= x && x <= xMax && yMin <= y && y <= yMax) { + var coeff = bezierPtsToQuadCoeff(x0, x1, x2); + var roots = solveQuadratic(coeff[0], coeff[1], coeff[2], x); + var validRoots = roots.filter(function (r) { + return 0 <= r && r <= 1; + }); + + if (validRoots.length > 0) { + return validRoots[0]; + } + } + + return null; + }; + + var curveRegions = Object.keys(barrelCurvePts); + + for (var i = 0; i < curveRegions.length; i++) { + var corner = curveRegions[i]; + var cornerPts = barrelCurvePts[corner]; + var t = getCurveT(x, y, cornerPts); + + if (t == null) { + continue; + } + + var y0 = cornerPts[5]; + var y1 = cornerPts[3]; + var y2 = cornerPts[1]; + var bezY = qbezierAt(y0, y1, y2, t); + + if (cornerPts.isTop && bezY <= y) { + return true; + } + + if (cornerPts.isBottom && y <= bezY) { + return true; + } + } + + return false; + } + }; + }; + + BRp$2.generateBottomRoundrectangle = function () { + return this.nodeShapes['bottom-round-rectangle'] = this.nodeShapes['bottomroundrectangle'] = { + renderer: this, + name: 'bottom-round-rectangle', + points: generateUnitNgonPointsFitToSquare(4, 0), + draw: function draw(context, centerX, centerY, width, height) { + this.renderer.nodeShapeImpl(this.name, context, centerX, centerY, width, height); + }, + intersectLine: function intersectLine(nodeX, nodeY, width, height, x, y, padding) { + var topStartX = nodeX - (width / 2 + padding); + var topStartY = nodeY - (height / 2 + padding); + var topEndY = topStartY; + var topEndX = nodeX + (width / 2 + padding); + var topIntersections = finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false); + + if (topIntersections.length > 0) { + return topIntersections; + } + + return roundRectangleIntersectLine(x, y, nodeX, nodeY, width, height, padding); + }, + checkPoint: function checkPoint(x, y, padding, width, height, centerX, centerY) { + var cornerRadius = getRoundRectangleRadius(width, height); + var diam = 2 * cornerRadius; // Check hBox + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width, height - diam, [0, -1], padding)) { + return true; + } // Check vBox + + + if (pointInsidePolygon(x, y, this.points, centerX, centerY, width - diam, height, [0, -1], padding)) { + return true; + } // check non-rounded top side + + + var outerWidth = width / 2 + 2 * padding; + var outerHeight = height / 2 + 2 * padding; + var points = [centerX - outerWidth, centerY - outerHeight, centerX - outerWidth, centerY, centerX + outerWidth, centerY, centerX + outerWidth, centerY - outerHeight]; + + if (pointInsidePolygonPoints(x, y, points)) { + return true; + } // Check bottom right quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } // Check bottom left quarter circle + + + if (checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) { + return true; + } + + return false; + } + }; + }; + + BRp$2.registerNodeShapes = function () { + var nodeShapes = this.nodeShapes = {}; + var renderer = this; + this.generateEllipse(); + this.generatePolygon('triangle', generateUnitNgonPointsFitToSquare(3, 0)); + this.generateRoundPolygon('round-triangle', generateUnitNgonPointsFitToSquare(3, 0)); + this.generatePolygon('rectangle', generateUnitNgonPointsFitToSquare(4, 0)); + nodeShapes['square'] = nodeShapes['rectangle']; + this.generateRoundRectangle(); + this.generateCutRectangle(); + this.generateBarrel(); + this.generateBottomRoundrectangle(); + { + var diamondPoints = [0, 1, 1, 0, 0, -1, -1, 0]; + this.generatePolygon('diamond', diamondPoints); + this.generateRoundPolygon('round-diamond', diamondPoints); + } + this.generatePolygon('pentagon', generateUnitNgonPointsFitToSquare(5, 0)); + this.generateRoundPolygon('round-pentagon', generateUnitNgonPointsFitToSquare(5, 0)); + this.generatePolygon('hexagon', generateUnitNgonPointsFitToSquare(6, 0)); + this.generateRoundPolygon('round-hexagon', generateUnitNgonPointsFitToSquare(6, 0)); + this.generatePolygon('heptagon', generateUnitNgonPointsFitToSquare(7, 0)); + this.generateRoundPolygon('round-heptagon', generateUnitNgonPointsFitToSquare(7, 0)); + this.generatePolygon('octagon', generateUnitNgonPointsFitToSquare(8, 0)); + this.generateRoundPolygon('round-octagon', generateUnitNgonPointsFitToSquare(8, 0)); + var star5Points = new Array(20); + { + var outerPoints = generateUnitNgonPoints(5, 0); + var innerPoints = generateUnitNgonPoints(5, Math.PI / 5); // Outer radius is 1; inner radius of star is smaller + + var innerRadius = 0.5 * (3 - Math.sqrt(5)); + innerRadius *= 1.57; + + for (var i = 0; i < innerPoints.length / 2; i++) { + innerPoints[i * 2] *= innerRadius; + innerPoints[i * 2 + 1] *= innerRadius; + } + + for (var i = 0; i < 20 / 4; i++) { + star5Points[i * 4] = outerPoints[i * 2]; + star5Points[i * 4 + 1] = outerPoints[i * 2 + 1]; + star5Points[i * 4 + 2] = innerPoints[i * 2]; + star5Points[i * 4 + 3] = innerPoints[i * 2 + 1]; + } + } + star5Points = fitPolygonToSquare(star5Points); + this.generatePolygon('star', star5Points); + this.generatePolygon('vee', [-1, -1, 0, -0.333, 1, -1, 0, 1]); + this.generatePolygon('rhomboid', [-1, -1, 0.333, -1, 1, 1, -0.333, 1]); + this.generatePolygon('right-rhomboid', [-0.333, -1, 1, -1, 0.333, 1, -1, 1]); + this.nodeShapes['concavehexagon'] = this.generatePolygon('concave-hexagon', [-1, -0.95, -0.75, 0, -1, 0.95, 1, 0.95, 0.75, 0, 1, -0.95]); + { + var tagPoints = [-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1]; + this.generatePolygon('tag', tagPoints); + this.generateRoundPolygon('round-tag', tagPoints); + } + + nodeShapes.makePolygon = function (points) { + // use caching on user-specified polygons so they are as fast as native shapes + var key = points.join('$'); + var name = 'polygon-' + key; + var shape; + + if (shape = this[name]) { + // got cached shape + return shape; + } // create and cache new shape + + + return renderer.generatePolygon(name, points); + }; + }; + + var BRp$1 = {}; + + BRp$1.timeToRender = function () { + return this.redrawTotalTime / this.redrawCount; + }; + + BRp$1.redraw = function (options) { + options = options || staticEmptyObject(); + var r = this; + + if (r.averageRedrawTime === undefined) { + r.averageRedrawTime = 0; + } + + if (r.lastRedrawTime === undefined) { + r.lastRedrawTime = 0; + } + + if (r.lastDrawTime === undefined) { + r.lastDrawTime = 0; + } + + r.requestedFrame = true; + r.renderOptions = options; + }; + + BRp$1.beforeRender = function (fn, priority) { + // the renderer can't add tick callbacks when destroyed + if (this.destroyed) { + return; + } + + if (priority == null) { + error('Priority is not optional for beforeRender'); + } + + var cbs = this.beforeRenderCallbacks; + cbs.push({ + fn: fn, + priority: priority + }); // higher priority callbacks executed first + + cbs.sort(function (a, b) { + return b.priority - a.priority; + }); + }; + + var beforeRenderCallbacks = function beforeRenderCallbacks(r, willDraw, startTime) { + var cbs = r.beforeRenderCallbacks; + + for (var i = 0; i < cbs.length; i++) { + cbs[i].fn(willDraw, startTime); + } + }; + + BRp$1.startRenderLoop = function () { + var r = this; + var cy = r.cy; + + if (r.renderLoopStarted) { + return; + } else { + r.renderLoopStarted = true; + } + + var renderFn = function renderFn(requestTime) { + if (r.destroyed) { + return; + } + + if (cy.batching()) ; else if (r.requestedFrame && !r.skipFrame) { + beforeRenderCallbacks(r, true, requestTime); + var startTime = performanceNow(); + r.render(r.renderOptions); + var endTime = r.lastDrawTime = performanceNow(); + + if (r.averageRedrawTime === undefined) { + r.averageRedrawTime = endTime - startTime; + } + + if (r.redrawCount === undefined) { + r.redrawCount = 0; + } + + r.redrawCount++; + + if (r.redrawTotalTime === undefined) { + r.redrawTotalTime = 0; + } + + var duration = endTime - startTime; + r.redrawTotalTime += duration; + r.lastRedrawTime = duration; // use a weighted average with a bias from the previous average so we don't spike so easily + + r.averageRedrawTime = r.averageRedrawTime / 2 + duration / 2; + r.requestedFrame = false; + } else { + beforeRenderCallbacks(r, false, requestTime); + } + + r.skipFrame = false; + requestAnimationFrame(renderFn); + }; + + requestAnimationFrame(renderFn); + }; + + var BaseRenderer = function BaseRenderer(options) { + this.init(options); + }; + + var BR = BaseRenderer; + var BRp = BR.prototype; + BRp.clientFunctions = ['redrawHint', 'render', 'renderTo', 'matchCanvasSize', 'nodeShapeImpl', 'arrowShapeImpl']; + + BRp.init = function (options) { + var r = this; + r.options = options; + r.cy = options.cy; + var ctr = r.container = options.cy.container(); + var containerWindow = r.cy.window(); // prepend a stylesheet in the head such that + + if (containerWindow) { + var document = containerWindow.document; + var head = document.head; + var stylesheetId = '__________cytoscape_stylesheet'; + var className = '__________cytoscape_container'; + var stylesheetAlreadyExists = document.getElementById(stylesheetId) != null; + + if (ctr.className.indexOf(className) < 0) { + ctr.className = (ctr.className || '') + ' ' + className; + } + + if (!stylesheetAlreadyExists) { + var stylesheet = document.createElement('style'); + stylesheet.id = stylesheetId; + stylesheet.textContent = '.' + className + ' { position: relative; }'; + head.insertBefore(stylesheet, head.children[0]); // first so lowest priority + } + + var computedStyle = containerWindow.getComputedStyle(ctr); + var position = computedStyle.getPropertyValue('position'); + + if (position === 'static') { + warn('A Cytoscape container has style position:static and so can not use UI extensions properly'); + } + } + + r.selection = [undefined, undefined, undefined, undefined, 0]; // Coordinates for selection box, plus enabled flag + + r.bezierProjPcts = [0.05, 0.225, 0.4, 0.5, 0.6, 0.775, 0.95]; //--Pointer-related data + + r.hoverData = { + down: null, + last: null, + downTime: null, + triggerMode: null, + dragging: false, + initialPan: [null, null], + capture: false + }; + r.dragData = { + possibleDragElements: [] + }; + r.touchData = { + start: null, + capture: false, + // These 3 fields related to tap, taphold events + startPosition: [null, null, null, null, null, null], + singleTouchStartTime: null, + singleTouchMoved: true, + now: [null, null, null, null, null, null], + earlier: [null, null, null, null, null, null] + }; + r.redraws = 0; + r.showFps = options.showFps; + r.debug = options.debug; + r.hideEdgesOnViewport = options.hideEdgesOnViewport; + r.textureOnViewport = options.textureOnViewport; + r.wheelSensitivity = options.wheelSensitivity; + r.motionBlurEnabled = options.motionBlur; // on by default + + r.forcedPixelRatio = number$1(options.pixelRatio) ? options.pixelRatio : null; + r.motionBlur = options.motionBlur; // for initial kick off + + r.motionBlurOpacity = options.motionBlurOpacity; + r.motionBlurTransparency = 1 - r.motionBlurOpacity; + r.motionBlurPxRatio = 1; + r.mbPxRBlurry = 1; //0.8; + + r.minMbLowQualFrames = 4; + r.fullQualityMb = false; + r.clearedForMotionBlur = []; + r.desktopTapThreshold = options.desktopTapThreshold; + r.desktopTapThreshold2 = options.desktopTapThreshold * options.desktopTapThreshold; + r.touchTapThreshold = options.touchTapThreshold; + r.touchTapThreshold2 = options.touchTapThreshold * options.touchTapThreshold; + r.tapholdDuration = 500; + r.bindings = []; + r.beforeRenderCallbacks = []; + r.beforeRenderPriorities = { + // higher priority execs before lower one + animations: 400, + eleCalcs: 300, + eleTxrDeq: 200, + lyrTxrDeq: 150, + lyrTxrSkip: 100 + }; + r.registerNodeShapes(); + r.registerArrowShapes(); + r.registerCalculationListeners(); + }; + + BRp.notify = function (eventName, eles) { + var r = this; + var cy = r.cy; // the renderer can't be notified after it's destroyed + + if (this.destroyed) { + return; + } + + if (eventName === 'init') { + r.load(); + return; + } + + if (eventName === 'destroy') { + r.destroy(); + return; + } + + if (eventName === 'add' || eventName === 'remove' || eventName === 'move' && cy.hasCompoundNodes() || eventName === 'load' || eventName === 'zorder' || eventName === 'mount') { + r.invalidateCachedZSortedEles(); + } + + if (eventName === 'viewport') { + r.redrawHint('select', true); + } + + if (eventName === 'load' || eventName === 'resize' || eventName === 'mount') { + r.invalidateContainerClientCoordsCache(); + r.matchCanvasSize(r.container); + } + + r.redrawHint('eles', true); + r.redrawHint('drag', true); + this.startRenderLoop(); + this.redraw(); + }; + + BRp.destroy = function () { + var r = this; + r.destroyed = true; + r.cy.stopAnimationLoop(); + + for (var i = 0; i < r.bindings.length; i++) { + var binding = r.bindings[i]; + var b = binding; + var tgt = b.target; + (tgt.off || tgt.removeEventListener).apply(tgt, b.args); + } + + r.bindings = []; + r.beforeRenderCallbacks = []; + r.onUpdateEleCalcsFns = []; + + if (r.removeObserver) { + r.removeObserver.disconnect(); + } + + if (r.styleObserver) { + r.styleObserver.disconnect(); + } + + if (r.resizeObserver) { + r.resizeObserver.disconnect(); + } + + if (r.labelCalcDiv) { + try { + document.body.removeChild(r.labelCalcDiv); // eslint-disable-line no-undef + } catch (e) {// ie10 issue #1014 + } + } + }; + + BRp.isHeadless = function () { + return false; + }; + + [BRp$f, BRp$5, BRp$4, BRp$3, BRp$2, BRp$1].forEach(function (props) { + extend(BRp, props); + }); + + var fullFpsTime = 1000 / 60; // assume 60 frames per second + + var defs = { + setupDequeueing: function setupDequeueing(opts) { + return function setupDequeueingImpl() { + var self = this; + var r = this.renderer; + + if (self.dequeueingSetup) { + return; + } else { + self.dequeueingSetup = true; + } + + var queueRedraw = debounce_1(function () { + r.redrawHint('eles', true); + r.redrawHint('drag', true); + r.redraw(); + }, opts.deqRedrawThreshold); + + var dequeue = function dequeue(willDraw, frameStartTime) { + var startTime = performanceNow(); + var avgRenderTime = r.averageRedrawTime; + var renderTime = r.lastRedrawTime; + var deqd = []; + var extent = r.cy.extent(); + var pixelRatio = r.getPixelRatio(); // if we aren't in a tick that causes a draw, then the rendered style + // queue won't automatically be flushed before dequeueing starts + + if (!willDraw) { + r.flushRenderedStyleQueue(); + } + + while (true) { + // eslint-disable-line no-constant-condition + var now = performanceNow(); + var duration = now - startTime; + var frameDuration = now - frameStartTime; + + if (renderTime < fullFpsTime) { + // if we're rendering faster than the ideal fps, then do dequeueing + // during all of the remaining frame time + var timeAvailable = fullFpsTime - (willDraw ? avgRenderTime : 0); + + if (frameDuration >= opts.deqFastCost * timeAvailable) { + break; + } + } else { + if (willDraw) { + if (duration >= opts.deqCost * renderTime || duration >= opts.deqAvgCost * avgRenderTime) { + break; + } + } else if (frameDuration >= opts.deqNoDrawCost * fullFpsTime) { + break; + } + } + + var thisDeqd = opts.deq(self, pixelRatio, extent); + + if (thisDeqd.length > 0) { + for (var i = 0; i < thisDeqd.length; i++) { + deqd.push(thisDeqd[i]); + } + } else { + break; + } + } // callbacks on dequeue + + + if (deqd.length > 0) { + opts.onDeqd(self, deqd); + + if (!willDraw && opts.shouldRedraw(self, deqd, pixelRatio, extent)) { + queueRedraw(); + } + } + }; + + var priority = opts.priority || noop$1; + r.beforeRender(dequeue, priority(self)); + }; + } + }; + + // Uses keys so elements may share the same cache. + + var ElementTextureCacheLookup = /*#__PURE__*/function () { + function ElementTextureCacheLookup(getKey) { + var doesEleInvalidateKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : falsify; + + _classCallCheck(this, ElementTextureCacheLookup); + + this.idsByKey = new Map$2(); + this.keyForId = new Map$2(); + this.cachesByLvl = new Map$2(); + this.lvls = []; + this.getKey = getKey; + this.doesEleInvalidateKey = doesEleInvalidateKey; + } + + _createClass(ElementTextureCacheLookup, [{ + key: "getIdsFor", + value: function getIdsFor(key) { + if (key == null) { + error("Can not get id list for null key"); + } + + var idsByKey = this.idsByKey; + var ids = this.idsByKey.get(key); + + if (!ids) { + ids = new Set$1(); + idsByKey.set(key, ids); + } + + return ids; + } + }, { + key: "addIdForKey", + value: function addIdForKey(key, id) { + if (key != null) { + this.getIdsFor(key).add(id); + } + } + }, { + key: "deleteIdForKey", + value: function deleteIdForKey(key, id) { + if (key != null) { + this.getIdsFor(key)["delete"](id); + } + } + }, { + key: "getNumberOfIdsForKey", + value: function getNumberOfIdsForKey(key) { + if (key == null) { + return 0; + } else { + return this.getIdsFor(key).size; + } + } + }, { + key: "updateKeyMappingFor", + value: function updateKeyMappingFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + var currKey = this.getKey(ele); + this.deleteIdForKey(prevKey, id); + this.addIdForKey(currKey, id); + this.keyForId.set(id, currKey); + } + }, { + key: "deleteKeyMappingFor", + value: function deleteKeyMappingFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + this.deleteIdForKey(prevKey, id); + this.keyForId["delete"](id); + } + }, { + key: "keyHasChangedFor", + value: function keyHasChangedFor(ele) { + var id = ele.id(); + var prevKey = this.keyForId.get(id); + var newKey = this.getKey(ele); + return prevKey !== newKey; + } + }, { + key: "isInvalid", + value: function isInvalid(ele) { + return this.keyHasChangedFor(ele) || this.doesEleInvalidateKey(ele); + } + }, { + key: "getCachesAt", + value: function getCachesAt(lvl) { + var cachesByLvl = this.cachesByLvl, + lvls = this.lvls; + var caches = cachesByLvl.get(lvl); + + if (!caches) { + caches = new Map$2(); + cachesByLvl.set(lvl, caches); + lvls.push(lvl); + } + + return caches; + } + }, { + key: "getCache", + value: function getCache(key, lvl) { + return this.getCachesAt(lvl).get(key); + } + }, { + key: "get", + value: function get(ele, lvl) { + var key = this.getKey(ele); + var cache = this.getCache(key, lvl); // getting for an element may need to add to the id list b/c eles can share keys + + if (cache != null) { + this.updateKeyMappingFor(ele); + } + + return cache; + } + }, { + key: "getForCachedKey", + value: function getForCachedKey(ele, lvl) { + var key = this.keyForId.get(ele.id()); // n.b. use cached key, not newly computed key + + var cache = this.getCache(key, lvl); + return cache; + } + }, { + key: "hasCache", + value: function hasCache(key, lvl) { + return this.getCachesAt(lvl).has(key); + } + }, { + key: "has", + value: function has(ele, lvl) { + var key = this.getKey(ele); + return this.hasCache(key, lvl); + } + }, { + key: "setCache", + value: function setCache(key, lvl, cache) { + cache.key = key; + this.getCachesAt(lvl).set(key, cache); + } + }, { + key: "set", + value: function set(ele, lvl, cache) { + var key = this.getKey(ele); + this.setCache(key, lvl, cache); + this.updateKeyMappingFor(ele); + } + }, { + key: "deleteCache", + value: function deleteCache(key, lvl) { + this.getCachesAt(lvl)["delete"](key); + } + }, { + key: "delete", + value: function _delete(ele, lvl) { + var key = this.getKey(ele); + this.deleteCache(key, lvl); + } + }, { + key: "invalidateKey", + value: function invalidateKey(key) { + var _this = this; + + this.lvls.forEach(function (lvl) { + return _this.deleteCache(key, lvl); + }); + } // returns true if no other eles reference the invalidated cache (n.b. other eles may need the cache with the same key) + + }, { + key: "invalidate", + value: function invalidate(ele) { + var id = ele.id(); + var key = this.keyForId.get(id); // n.b. use stored key rather than current (potential key) + + this.deleteKeyMappingFor(ele); + var entireKeyInvalidated = this.doesEleInvalidateKey(ele); + + if (entireKeyInvalidated) { + // clear mapping for current key + this.invalidateKey(key); + } + + return entireKeyInvalidated || this.getNumberOfIdsForKey(key) === 0; + } + }]); + + return ElementTextureCacheLookup; + }(); + + var minTxrH = 25; // the size of the texture cache for small height eles (special case) + + var txrStepH = 50; // the min size of the regular cache, and the size it increases with each step up + + var minLvl$1 = -4; // when scaling smaller than that we don't need to re-render + + var maxLvl$1 = 3; // when larger than this scale just render directly (caching is not helpful) + + var maxZoom$1 = 7.99; // beyond this zoom level, layered textures are not used + + var eleTxrSpacing = 8; // spacing between elements on textures to avoid blitting overlaps + + var defTxrWidth = 1024; // default/minimum texture width + + var maxTxrW = 1024; // the maximum width of a texture + + var maxTxrH = 1024; // the maximum height of a texture + + var minUtility = 0.2; // if usage of texture is less than this, it is retired + + var maxFullness = 0.8; // fullness of texture after which queue removal is checked + + var maxFullnessChecks = 10; // dequeued after this many checks + + var deqCost$1 = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame + + var deqAvgCost$1 = 0.1; // % of add'l rendering cost compared to average overall redraw time + + var deqNoDrawCost$1 = 0.9; // % of avg frame time that can be used for dequeueing when not drawing + + var deqFastCost$1 = 0.9; // % of frame time to be used when >60fps + + var deqRedrawThreshold$1 = 100; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile + + var maxDeqSize$1 = 1; // number of eles to dequeue and render at higher texture in each batch + + var getTxrReasons = { + dequeue: 'dequeue', + downscale: 'downscale', + highQuality: 'highQuality' + }; + var initDefaults = defaults$g({ + getKey: null, + doesEleInvalidateKey: falsify, + drawElement: null, + getBoundingBox: null, + getRotationPoint: null, + getRotationOffset: null, + isVisible: trueify, + allowEdgeTxrCaching: true, + allowParentTxrCaching: true + }); + + var ElementTextureCache = function ElementTextureCache(renderer, initOptions) { + var self = this; + self.renderer = renderer; + self.onDequeues = []; + var opts = initDefaults(initOptions); + extend(self, opts); + self.lookup = new ElementTextureCacheLookup(opts.getKey, opts.doesEleInvalidateKey); + self.setupDequeueing(); + }; + + var ETCp = ElementTextureCache.prototype; + ETCp.reasons = getTxrReasons; // the list of textures in which new subtextures for elements can be placed + + ETCp.getTextureQueue = function (txrH) { + var self = this; + self.eleImgCaches = self.eleImgCaches || {}; + return self.eleImgCaches[txrH] = self.eleImgCaches[txrH] || []; + }; // the list of usused textures which can be recycled (in use in texture queue) + + + ETCp.getRetiredTextureQueue = function (txrH) { + var self = this; + var rtxtrQs = self.eleImgCaches.retired = self.eleImgCaches.retired || {}; + var rtxtrQ = rtxtrQs[txrH] = rtxtrQs[txrH] || []; + return rtxtrQ; + }; // queue of element draw requests at different scale levels + + + ETCp.getElementQueue = function () { + var self = this; + var q = self.eleCacheQueue = self.eleCacheQueue || new heap(function (a, b) { + return b.reqs - a.reqs; + }); + return q; + }; // queue of element draw requests at different scale levels (element id lookup) + + + ETCp.getElementKeyToQueue = function () { + var self = this; + var k2q = self.eleKeyToCacheQueue = self.eleKeyToCacheQueue || {}; + return k2q; + }; + + ETCp.getElement = function (ele, bb, pxRatio, lvl, reason) { + var self = this; + var r = this.renderer; + var zoom = r.cy.zoom(); + var lookup = this.lookup; + + if (!bb || bb.w === 0 || bb.h === 0 || isNaN(bb.w) || isNaN(bb.h) || !ele.visible() || ele.removed()) { + return null; + } + + if (!self.allowEdgeTxrCaching && ele.isEdge() || !self.allowParentTxrCaching && ele.isParent()) { + return null; + } + + if (lvl == null) { + lvl = Math.ceil(log2(zoom * pxRatio)); + } + + if (lvl < minLvl$1) { + lvl = minLvl$1; + } else if (zoom >= maxZoom$1 || lvl > maxLvl$1) { + return null; + } + + var scale = Math.pow(2, lvl); + var eleScaledH = bb.h * scale; + var eleScaledW = bb.w * scale; + var scaledLabelShown = r.eleTextBiggerThanMin(ele, scale); + + if (!this.isVisible(ele, scaledLabelShown)) { + return null; + } + + var eleCache = lookup.get(ele, lvl); // if this get was on an unused/invalidated cache, then restore the texture usage metric + + if (eleCache && eleCache.invalidated) { + eleCache.invalidated = false; + eleCache.texture.invalidatedWidth -= eleCache.width; + } + + if (eleCache) { + return eleCache; + } + + var txrH; // which texture height this ele belongs to + + if (eleScaledH <= minTxrH) { + txrH = minTxrH; + } else if (eleScaledH <= txrStepH) { + txrH = txrStepH; + } else { + txrH = Math.ceil(eleScaledH / txrStepH) * txrStepH; + } + + if (eleScaledH > maxTxrH || eleScaledW > maxTxrW) { + return null; // caching large elements is not efficient + } + + var txrQ = self.getTextureQueue(txrH); // first try the second last one in case it has space at the end + + var txr = txrQ[txrQ.length - 2]; + + var addNewTxr = function addNewTxr() { + return self.recycleTexture(txrH, eleScaledW) || self.addTexture(txrH, eleScaledW); + }; // try the last one if there is no second last one + + + if (!txr) { + txr = txrQ[txrQ.length - 1]; + } // if the last one doesn't exist, we need a first one + + + if (!txr) { + txr = addNewTxr(); + } // if there's no room in the current texture, we need a new one + + + if (txr.width - txr.usedWidth < eleScaledW) { + txr = addNewTxr(); + } + + var scalableFrom = function scalableFrom(otherCache) { + return otherCache && otherCache.scaledLabelShown === scaledLabelShown; + }; + + var deqing = reason && reason === getTxrReasons.dequeue; + var highQualityReq = reason && reason === getTxrReasons.highQuality; + var downscaleReq = reason && reason === getTxrReasons.downscale; + var higherCache; // the nearest cache with a higher level + + for (var l = lvl + 1; l <= maxLvl$1; l++) { + var c = lookup.get(ele, l); + + if (c) { + higherCache = c; + break; + } + } + + var oneUpCache = higherCache && higherCache.level === lvl + 1 ? higherCache : null; + + var downscale = function downscale() { + txr.context.drawImage(oneUpCache.texture.canvas, oneUpCache.x, 0, oneUpCache.width, oneUpCache.height, txr.usedWidth, 0, eleScaledW, eleScaledH); + }; // reset ele area in texture + + + txr.context.setTransform(1, 0, 0, 1, 0, 0); + txr.context.clearRect(txr.usedWidth, 0, eleScaledW, txrH); + + if (scalableFrom(oneUpCache)) { + // then we can relatively cheaply rescale the existing image w/o rerendering + downscale(); + } else if (scalableFrom(higherCache)) { + // then use the higher cache for now and queue the next level down + // to cheaply scale towards the smaller level + if (highQualityReq) { + for (var _l = higherCache.level; _l > lvl; _l--) { + oneUpCache = self.getElement(ele, bb, pxRatio, _l, getTxrReasons.downscale); + } + + downscale(); + } else { + self.queueElement(ele, higherCache.level - 1); + return higherCache; + } + } else { + var lowerCache; // the nearest cache with a lower level + + if (!deqing && !highQualityReq && !downscaleReq) { + for (var _l2 = lvl - 1; _l2 >= minLvl$1; _l2--) { + var _c = lookup.get(ele, _l2); + + if (_c) { + lowerCache = _c; + break; + } + } + } + + if (scalableFrom(lowerCache)) { + // then use the lower quality cache for now and queue the better one for later + self.queueElement(ele, lvl); + return lowerCache; + } + + txr.context.translate(txr.usedWidth, 0); + txr.context.scale(scale, scale); + this.drawElement(txr.context, ele, bb, scaledLabelShown, false); + txr.context.scale(1 / scale, 1 / scale); + txr.context.translate(-txr.usedWidth, 0); + } + + eleCache = { + x: txr.usedWidth, + texture: txr, + level: lvl, + scale: scale, + width: eleScaledW, + height: eleScaledH, + scaledLabelShown: scaledLabelShown + }; + txr.usedWidth += Math.ceil(eleScaledW + eleTxrSpacing); + txr.eleCaches.push(eleCache); + lookup.set(ele, lvl, eleCache); + self.checkTextureFullness(txr); + return eleCache; + }; + + ETCp.invalidateElements = function (eles) { + for (var i = 0; i < eles.length; i++) { + this.invalidateElement(eles[i]); + } + }; + + ETCp.invalidateElement = function (ele) { + var self = this; + var lookup = self.lookup; + var caches = []; + var invalid = lookup.isInvalid(ele); + + if (!invalid) { + return; // override the invalidation request if the element key has not changed + } + + for (var lvl = minLvl$1; lvl <= maxLvl$1; lvl++) { + var cache = lookup.getForCachedKey(ele, lvl); + + if (cache) { + caches.push(cache); + } + } + + var noOtherElesUseCache = lookup.invalidate(ele); + + if (noOtherElesUseCache) { + for (var i = 0; i < caches.length; i++) { + var _cache = caches[i]; + var txr = _cache.texture; // remove space from the texture it belongs to + + txr.invalidatedWidth += _cache.width; // mark the cache as invalidated + + _cache.invalidated = true; // retire the texture if its utility is low + + self.checkTextureUtility(txr); + } + } // remove from queue since the old req was for the old state + + + self.removeFromQueue(ele); + }; + + ETCp.checkTextureUtility = function (txr) { + // invalidate all entries in the cache if the cache size is small + if (txr.invalidatedWidth >= minUtility * txr.width) { + this.retireTexture(txr); + } + }; + + ETCp.checkTextureFullness = function (txr) { + // if texture has been mostly filled and passed over several times, remove + // it from the queue so we don't need to waste time looking at it to put new things + var self = this; + var txrQ = self.getTextureQueue(txr.height); + + if (txr.usedWidth / txr.width > maxFullness && txr.fullnessChecks >= maxFullnessChecks) { + removeFromArray(txrQ, txr); + } else { + txr.fullnessChecks++; + } + }; + + ETCp.retireTexture = function (txr) { + var self = this; + var txrH = txr.height; + var txrQ = self.getTextureQueue(txrH); + var lookup = this.lookup; // retire the texture from the active / searchable queue: + + removeFromArray(txrQ, txr); + txr.retired = true; // remove the refs from the eles to the caches: + + var eleCaches = txr.eleCaches; + + for (var i = 0; i < eleCaches.length; i++) { + var eleCache = eleCaches[i]; + lookup.deleteCache(eleCache.key, eleCache.level); + } + + clearArray(eleCaches); // add the texture to a retired queue so it can be recycled in future: + + var rtxtrQ = self.getRetiredTextureQueue(txrH); + rtxtrQ.push(txr); + }; + + ETCp.addTexture = function (txrH, minW) { + var self = this; + var txrQ = self.getTextureQueue(txrH); + var txr = {}; + txrQ.push(txr); + txr.eleCaches = []; + txr.height = txrH; + txr.width = Math.max(defTxrWidth, minW); + txr.usedWidth = 0; + txr.invalidatedWidth = 0; + txr.fullnessChecks = 0; + txr.canvas = self.renderer.makeOffscreenCanvas(txr.width, txr.height); + txr.context = txr.canvas.getContext('2d'); + return txr; + }; + + ETCp.recycleTexture = function (txrH, minW) { + var self = this; + var txrQ = self.getTextureQueue(txrH); + var rtxtrQ = self.getRetiredTextureQueue(txrH); + + for (var i = 0; i < rtxtrQ.length; i++) { + var txr = rtxtrQ[i]; + + if (txr.width >= minW) { + txr.retired = false; + txr.usedWidth = 0; + txr.invalidatedWidth = 0; + txr.fullnessChecks = 0; + clearArray(txr.eleCaches); + txr.context.setTransform(1, 0, 0, 1, 0, 0); + txr.context.clearRect(0, 0, txr.width, txr.height); + removeFromArray(rtxtrQ, txr); + txrQ.push(txr); + return txr; + } + } + }; + + ETCp.queueElement = function (ele, lvl) { + var self = this; + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var key = this.getKey(ele); + var existingReq = k2q[key]; + + if (existingReq) { + // use the max lvl b/c in between lvls are cheap to make + existingReq.level = Math.max(existingReq.level, lvl); + existingReq.eles.merge(ele); + existingReq.reqs++; + q.updateItem(existingReq); + } else { + var req = { + eles: ele.spawn().merge(ele), + level: lvl, + reqs: 1, + key: key + }; + q.push(req); + k2q[key] = req; + } + }; + + ETCp.dequeue = function (pxRatio + /*, extent*/ + ) { + var self = this; + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var dequeued = []; + var lookup = self.lookup; + + for (var i = 0; i < maxDeqSize$1; i++) { + if (q.size() > 0) { + var req = q.pop(); + var key = req.key; + var ele = req.eles[0]; // all eles have the same key + + var cacheExists = lookup.hasCache(ele, req.level); // clear out the key to req lookup + + k2q[key] = null; // dequeueing isn't necessary with an existing cache + + if (cacheExists) { + continue; + } + + dequeued.push(req); + var bb = self.getBoundingBox(ele); + self.getElement(ele, bb, pxRatio, req.level, getTxrReasons.dequeue); + } else { + break; + } + } + + return dequeued; + }; + + ETCp.removeFromQueue = function (ele) { + var self = this; + var q = self.getElementQueue(); + var k2q = self.getElementKeyToQueue(); + var key = this.getKey(ele); + var req = k2q[key]; + + if (req != null) { + if (req.eles.length === 1) { + // remove if last ele in the req + // bring to front of queue + req.reqs = MAX_INT$1; + q.updateItem(req); + q.pop(); // remove from queue + + k2q[key] = null; // remove from lookup map + } else { + // otherwise just remove ele from req + req.eles.unmerge(ele); + } + } + }; + + ETCp.onDequeue = function (fn) { + this.onDequeues.push(fn); + }; + + ETCp.offDequeue = function (fn) { + removeFromArray(this.onDequeues, fn); + }; + + ETCp.setupDequeueing = defs.setupDequeueing({ + deqRedrawThreshold: deqRedrawThreshold$1, + deqCost: deqCost$1, + deqAvgCost: deqAvgCost$1, + deqNoDrawCost: deqNoDrawCost$1, + deqFastCost: deqFastCost$1, + deq: function deq(self, pxRatio, extent) { + return self.dequeue(pxRatio, extent); + }, + onDeqd: function onDeqd(self, deqd) { + for (var i = 0; i < self.onDequeues.length; i++) { + var fn = self.onDequeues[i]; + fn(deqd); + } + }, + shouldRedraw: function shouldRedraw(self, deqd, pxRatio, extent) { + for (var i = 0; i < deqd.length; i++) { + var eles = deqd[i].eles; + + for (var j = 0; j < eles.length; j++) { + var bb = eles[j].boundingBox(); + + if (boundingBoxesIntersect(bb, extent)) { + return true; + } + } + } + + return false; + }, + priority: function priority(self) { + return self.renderer.beforeRenderPriorities.eleTxrDeq; + } + }); + + var defNumLayers = 1; // default number of layers to use + + var minLvl = -4; // when scaling smaller than that we don't need to re-render + + var maxLvl = 2; // when larger than this scale just render directly (caching is not helpful) + + var maxZoom = 3.99; // beyond this zoom level, layered textures are not used + + var deqRedrawThreshold = 50; // time to batch redraws together from dequeueing to allow more dequeueing calcs to happen in the meanwhile + + var refineEleDebounceTime = 50; // time to debounce sharper ele texture updates + + var deqCost = 0.15; // % of add'l rendering cost allowed for dequeuing ele caches each frame + + var deqAvgCost = 0.1; // % of add'l rendering cost compared to average overall redraw time + + var deqNoDrawCost = 0.9; // % of avg frame time that can be used for dequeueing when not drawing + + var deqFastCost = 0.9; // % of frame time to be used when >60fps + + var maxDeqSize = 1; // number of eles to dequeue and render at higher texture in each batch + + var invalidThreshold = 250; // time threshold for disabling b/c of invalidations + + var maxLayerArea = 4000 * 4000; // layers can't be bigger than this + + var useHighQualityEleTxrReqs = true; // whether to use high quality ele txr requests (generally faster and cheaper in the longterm) + // var log = function(){ console.log.apply( console, arguments ); }; + + var LayeredTextureCache = function LayeredTextureCache(renderer) { + var self = this; + var r = self.renderer = renderer; + var cy = r.cy; + self.layersByLevel = {}; // e.g. 2 => [ layer1, layer2, ..., layerN ] + + self.firstGet = true; + self.lastInvalidationTime = performanceNow() - 2 * invalidThreshold; + self.skipping = false; + self.eleTxrDeqs = cy.collection(); + self.scheduleElementRefinement = debounce_1(function () { + self.refineElementTextures(self.eleTxrDeqs); + self.eleTxrDeqs.unmerge(self.eleTxrDeqs); + }, refineEleDebounceTime); + r.beforeRender(function (willDraw, now) { + if (now - self.lastInvalidationTime <= invalidThreshold) { + self.skipping = true; + } else { + self.skipping = false; + } + }, r.beforeRenderPriorities.lyrTxrSkip); + + var qSort = function qSort(a, b) { + return b.reqs - a.reqs; + }; + + self.layersQueue = new heap(qSort); + self.setupDequeueing(); + }; + + var LTCp = LayeredTextureCache.prototype; + var layerIdPool = 0; + var MAX_INT = Math.pow(2, 53) - 1; + + LTCp.makeLayer = function (bb, lvl) { + var scale = Math.pow(2, lvl); + var w = Math.ceil(bb.w * scale); + var h = Math.ceil(bb.h * scale); + var canvas = this.renderer.makeOffscreenCanvas(w, h); + var layer = { + id: layerIdPool = ++layerIdPool % MAX_INT, + bb: bb, + level: lvl, + width: w, + height: h, + canvas: canvas, + context: canvas.getContext('2d'), + eles: [], + elesQueue: [], + reqs: 0 + }; // log('make layer %s with w %s and h %s and lvl %s', layer.id, layer.width, layer.height, layer.level); + + var cxt = layer.context; + var dx = -layer.bb.x1; + var dy = -layer.bb.y1; // do the transform on creation to save cycles (it's the same for all eles) + + cxt.scale(scale, scale); + cxt.translate(dx, dy); + return layer; + }; + + LTCp.getLayers = function (eles, pxRatio, lvl) { + var self = this; + var r = self.renderer; + var cy = r.cy; + var zoom = cy.zoom(); + var firstGet = self.firstGet; + self.firstGet = false; // log('--\nget layers with %s eles', eles.length); + //log eles.map(function(ele){ return ele.id() }) ); + + if (lvl == null) { + lvl = Math.ceil(log2(zoom * pxRatio)); + + if (lvl < minLvl) { + lvl = minLvl; + } else if (zoom >= maxZoom || lvl > maxLvl) { + return null; + } + } + + self.validateLayersElesOrdering(lvl, eles); + var layersByLvl = self.layersByLevel; + var scale = Math.pow(2, lvl); + var layers = layersByLvl[lvl] = layersByLvl[lvl] || []; + var bb; + var lvlComplete = self.levelIsComplete(lvl, eles); + var tmpLayers; + + var checkTempLevels = function checkTempLevels() { + var canUseAsTmpLvl = function canUseAsTmpLvl(l) { + self.validateLayersElesOrdering(l, eles); + + if (self.levelIsComplete(l, eles)) { + tmpLayers = layersByLvl[l]; + return true; + } + }; + + var checkLvls = function checkLvls(dir) { + if (tmpLayers) { + return; + } + + for (var l = lvl + dir; minLvl <= l && l <= maxLvl; l += dir) { + if (canUseAsTmpLvl(l)) { + break; + } + } + }; + + checkLvls(+1); + checkLvls(-1); // remove the invalid layers; they will be replaced as needed later in this function + + for (var i = layers.length - 1; i >= 0; i--) { + var layer = layers[i]; + + if (layer.invalid) { + removeFromArray(layers, layer); + } + } + }; + + if (!lvlComplete) { + // if the current level is incomplete, then use the closest, best quality layerset temporarily + // and later queue the current layerset so we can get the proper quality level soon + checkTempLevels(); + } else { + // log('level complete, using existing layers\n--'); + return layers; + } + + var getBb = function getBb() { + if (!bb) { + bb = makeBoundingBox(); + + for (var i = 0; i < eles.length; i++) { + updateBoundingBox(bb, eles[i].boundingBox()); + } + } + + return bb; + }; + + var makeLayer = function makeLayer(opts) { + opts = opts || {}; + var after = opts.after; + getBb(); + var area = bb.w * scale * (bb.h * scale); + + if (area > maxLayerArea) { + return null; + } + + var layer = self.makeLayer(bb, lvl); + + if (after != null) { + var index = layers.indexOf(after) + 1; + layers.splice(index, 0, layer); + } else if (opts.insert === undefined || opts.insert) { + // no after specified => first layer made so put at start + layers.unshift(layer); + } // if( tmpLayers ){ + //self.queueLayer( layer ); + // } + + + return layer; + }; + + if (self.skipping && !firstGet) { + // log('skip layers'); + return null; + } // log('do layers'); + + + var layer = null; + var maxElesPerLayer = eles.length / defNumLayers; + var allowLazyQueueing = !firstGet; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + var rs = ele._private.rscratch; + var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; // log('look at ele', ele.id()); + + var existingLayer = caches[lvl]; + + if (existingLayer) { + // reuse layer for later eles + // log('reuse layer for', ele.id()); + layer = existingLayer; + continue; + } + + if (!layer || layer.eles.length >= maxElesPerLayer || !boundingBoxInBoundingBox(layer.bb, ele.boundingBox())) { + // log('make new layer for ele %s', ele.id()); + layer = makeLayer({ + insert: true, + after: layer + }); // if now layer can be built then we can't use layers at this level + + if (!layer) { + return null; + } // log('new layer with id %s', layer.id); + + } + + if (tmpLayers || allowLazyQueueing) { + // log('queue ele %s in layer %s', ele.id(), layer.id); + self.queueLayer(layer, ele); + } else { + // log('draw ele %s in layer %s', ele.id(), layer.id); + self.drawEleInLayer(layer, ele, lvl, pxRatio); + } + + layer.eles.push(ele); + caches[lvl] = layer; + } // log('--'); + + + if (tmpLayers) { + // then we only queued the current layerset and can't draw it yet + return tmpLayers; + } + + if (allowLazyQueueing) { + // log('lazy queue level', lvl); + return null; + } + + return layers; + }; // a layer may want to use an ele cache of a higher level to avoid blurriness + // so the layer level might not equal the ele level + + + LTCp.getEleLevelForLayerLevel = function (lvl, pxRatio) { + return lvl; + }; + + LTCp.drawEleInLayer = function (layer, ele, lvl, pxRatio) { + var self = this; + var r = this.renderer; + var context = layer.context; + var bb = ele.boundingBox(); + + if (bb.w === 0 || bb.h === 0 || !ele.visible()) { + return; + } + + lvl = self.getEleLevelForLayerLevel(lvl, pxRatio); + + { + r.setImgSmoothing(context, false); + } + + { + r.drawCachedElement(context, ele, null, null, lvl, useHighQualityEleTxrReqs); + } + + { + r.setImgSmoothing(context, true); + } + }; + + LTCp.levelIsComplete = function (lvl, eles) { + var self = this; + var layers = self.layersByLevel[lvl]; + + if (!layers || layers.length === 0) { + return false; + } + + var numElesInLayers = 0; + + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; // if there are any eles needed to be drawn yet, the level is not complete + + if (layer.reqs > 0) { + return false; + } // if the layer is invalid, the level is not complete + + + if (layer.invalid) { + return false; + } + + numElesInLayers += layer.eles.length; + } // we should have exactly the number of eles passed in to be complete + + + if (numElesInLayers !== eles.length) { + return false; + } + + return true; + }; + + LTCp.validateLayersElesOrdering = function (lvl, eles) { + var layers = this.layersByLevel[lvl]; + + if (!layers) { + return; + } // if in a layer the eles are not in the same order, then the layer is invalid + // (i.e. there is an ele in between the eles in the layer) + + + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; + var offset = -1; // find the offset + + for (var j = 0; j < eles.length; j++) { + if (layer.eles[0] === eles[j]) { + offset = j; + break; + } + } + + if (offset < 0) { + // then the layer has nonexistent elements and is invalid + this.invalidateLayer(layer); + continue; + } // the eles in the layer must be in the same continuous order, else the layer is invalid + + + var o = offset; + + for (var j = 0; j < layer.eles.length; j++) { + if (layer.eles[j] !== eles[o + j]) { + // log('invalidate based on ordering', layer.id); + this.invalidateLayer(layer); + break; + } + } + } + }; + + LTCp.updateElementsInLayers = function (eles, update) { + var self = this; + var isEles = element(eles[0]); // collect udpated elements (cascaded from the layers) and update each + // layer itself along the way + + for (var i = 0; i < eles.length; i++) { + var req = isEles ? null : eles[i]; + var ele = isEles ? eles[i] : eles[i].ele; + var rs = ele._private.rscratch; + var caches = rs.imgLayerCaches = rs.imgLayerCaches || {}; + + for (var l = minLvl; l <= maxLvl; l++) { + var layer = caches[l]; + + if (!layer) { + continue; + } // if update is a request from the ele cache, then it affects only + // the matching level + + + if (req && self.getEleLevelForLayerLevel(layer.level) !== req.level) { + continue; + } + + update(layer, ele, req); + } + } + }; + + LTCp.haveLayers = function () { + var self = this; + var haveLayers = false; + + for (var l = minLvl; l <= maxLvl; l++) { + var layers = self.layersByLevel[l]; + + if (layers && layers.length > 0) { + haveLayers = true; + break; + } + } + + return haveLayers; + }; + + LTCp.invalidateElements = function (eles) { + var self = this; + + if (eles.length === 0) { + return; + } + + self.lastInvalidationTime = performanceNow(); // log('update invalidate layer time from eles'); + + if (eles.length === 0 || !self.haveLayers()) { + return; + } + + self.updateElementsInLayers(eles, function invalAssocLayers(layer, ele, req) { + self.invalidateLayer(layer); + }); + }; + + LTCp.invalidateLayer = function (layer) { + // log('update invalidate layer time'); + this.lastInvalidationTime = performanceNow(); + + if (layer.invalid) { + return; + } // save cycles + + + var lvl = layer.level; + var eles = layer.eles; + var layers = this.layersByLevel[lvl]; // log('invalidate layer', layer.id ); + + removeFromArray(layers, layer); // layer.eles = []; + + layer.elesQueue = []; + layer.invalid = true; + + if (layer.replacement) { + layer.replacement.invalid = true; + } + + for (var i = 0; i < eles.length; i++) { + var caches = eles[i]._private.rscratch.imgLayerCaches; + + if (caches) { + caches[lvl] = null; + } + } + }; + + LTCp.refineElementTextures = function (eles) { + var self = this; // log('refine', eles.length); + + self.updateElementsInLayers(eles, function refineEachEle(layer, ele, req) { + var rLyr = layer.replacement; + + if (!rLyr) { + rLyr = layer.replacement = self.makeLayer(layer.bb, layer.level); + rLyr.replaces = layer; + rLyr.eles = layer.eles; // log('make replacement layer %s for %s with level %s', rLyr.id, layer.id, rLyr.level); + } + + if (!rLyr.reqs) { + for (var i = 0; i < rLyr.eles.length; i++) { + self.queueLayer(rLyr, rLyr.eles[i]); + } // log('queue replacement layer refinement', rLyr.id); + + } + }); + }; + + LTCp.enqueueElementRefinement = function (ele) { + + this.eleTxrDeqs.merge(ele); + this.scheduleElementRefinement(); + }; + + LTCp.queueLayer = function (layer, ele) { + var self = this; + var q = self.layersQueue; + var elesQ = layer.elesQueue; + var hasId = elesQ.hasId = elesQ.hasId || {}; // if a layer is going to be replaced, queuing is a waste of time + + if (layer.replacement) { + return; + } + + if (ele) { + if (hasId[ele.id()]) { + return; + } + + elesQ.push(ele); + hasId[ele.id()] = true; + } + + if (layer.reqs) { + layer.reqs++; + q.updateItem(layer); + } else { + layer.reqs = 1; + q.push(layer); + } + }; + + LTCp.dequeue = function (pxRatio) { + var self = this; + var q = self.layersQueue; + var deqd = []; + var eleDeqs = 0; + + while (eleDeqs < maxDeqSize) { + if (q.size() === 0) { + break; + } + + var layer = q.peek(); // if a layer has been or will be replaced, then don't waste time with it + + if (layer.replacement) { + // log('layer %s in queue skipped b/c it already has a replacement', layer.id); + q.pop(); + continue; + } // if this is a replacement layer that has been superceded, then forget it + + + if (layer.replaces && layer !== layer.replaces.replacement) { + // log('layer is no longer the most uptodate replacement; dequeued', layer.id) + q.pop(); + continue; + } + + if (layer.invalid) { + // log('replacement layer %s is invalid; dequeued', layer.id); + q.pop(); + continue; + } + + var ele = layer.elesQueue.shift(); + + if (ele) { + // log('dequeue layer %s', layer.id); + self.drawEleInLayer(layer, ele, layer.level, pxRatio); + eleDeqs++; + } + + if (deqd.length === 0) { + // we need only one entry in deqd to queue redrawing etc + deqd.push(true); + } // if the layer has all its eles done, then remove from the queue + + + if (layer.elesQueue.length === 0) { + q.pop(); + layer.reqs = 0; // log('dequeue of layer %s complete', layer.id); + // when a replacement layer is dequeued, it replaces the old layer in the level + + if (layer.replaces) { + self.applyLayerReplacement(layer); + } + + self.requestRedraw(); + } + } + + return deqd; + }; + + LTCp.applyLayerReplacement = function (layer) { + var self = this; + var layersInLevel = self.layersByLevel[layer.level]; + var replaced = layer.replaces; + var index = layersInLevel.indexOf(replaced); // if the replaced layer is not in the active list for the level, then replacing + // refs would be a mistake (i.e. overwriting the true active layer) + + if (index < 0 || replaced.invalid) { + // log('replacement layer would have no effect', layer.id); + return; + } + + layersInLevel[index] = layer; // replace level ref + // replace refs in eles + + for (var i = 0; i < layer.eles.length; i++) { + var _p = layer.eles[i]._private; + var cache = _p.imgLayerCaches = _p.imgLayerCaches || {}; + + if (cache) { + cache[layer.level] = layer; + } + } // log('apply replacement layer %s over %s', layer.id, replaced.id); + + + self.requestRedraw(); + }; + + LTCp.requestRedraw = debounce_1(function () { + var r = this.renderer; + r.redrawHint('eles', true); + r.redrawHint('drag', true); + r.redraw(); + }, 100); + LTCp.setupDequeueing = defs.setupDequeueing({ + deqRedrawThreshold: deqRedrawThreshold, + deqCost: deqCost, + deqAvgCost: deqAvgCost, + deqNoDrawCost: deqNoDrawCost, + deqFastCost: deqFastCost, + deq: function deq(self, pxRatio) { + return self.dequeue(pxRatio); + }, + onDeqd: noop$1, + shouldRedraw: trueify, + priority: function priority(self) { + return self.renderer.beforeRenderPriorities.lyrTxrDeq; + } + }); + + var CRp$a = {}; + var impl; + + function polygon(context, points) { + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + context.lineTo(pt.x, pt.y); + } + } + + function triangleBackcurve(context, points, controlPoint) { + var firstPt; + + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + + if (i === 0) { + firstPt = pt; + } + + context.lineTo(pt.x, pt.y); + } + + context.quadraticCurveTo(controlPoint.x, controlPoint.y, firstPt.x, firstPt.y); + } + + function triangleTee(context, trianglePoints, teePoints) { + if (context.beginPath) { + context.beginPath(); + } + + var triPts = trianglePoints; + + for (var i = 0; i < triPts.length; i++) { + var pt = triPts[i]; + context.lineTo(pt.x, pt.y); + } + + var teePts = teePoints; + var firstTeePt = teePoints[0]; + context.moveTo(firstTeePt.x, firstTeePt.y); + + for (var i = 1; i < teePts.length; i++) { + var pt = teePts[i]; + context.lineTo(pt.x, pt.y); + } + + if (context.closePath) { + context.closePath(); + } + } + + function circleTriangle(context, trianglePoints, rx, ry, r) { + if (context.beginPath) { + context.beginPath(); + } + + context.arc(rx, ry, r, 0, Math.PI * 2, false); + var triPts = trianglePoints; + var firstTrPt = triPts[0]; + context.moveTo(firstTrPt.x, firstTrPt.y); + + for (var i = 0; i < triPts.length; i++) { + var pt = triPts[i]; + context.lineTo(pt.x, pt.y); + } + + if (context.closePath) { + context.closePath(); + } + } + + function circle(context, rx, ry, r) { + context.arc(rx, ry, r, 0, Math.PI * 2, false); + } + + CRp$a.arrowShapeImpl = function (name) { + return (impl || (impl = { + 'polygon': polygon, + 'triangle-backcurve': triangleBackcurve, + 'triangle-tee': triangleTee, + 'circle-triangle': circleTriangle, + 'triangle-cross': triangleTee, + 'circle': circle + }))[name]; + }; + + var CRp$9 = {}; + + CRp$9.drawElement = function (context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity) { + var r = this; + + if (ele.isNode()) { + r.drawNode(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity); + } else { + r.drawEdge(context, ele, shiftToOriginWithBb, showLabel, showOverlay, showOpacity); + } + }; + + CRp$9.drawElementOverlay = function (context, ele) { + var r = this; + + if (ele.isNode()) { + r.drawNodeOverlay(context, ele); + } else { + r.drawEdgeOverlay(context, ele); + } + }; + + CRp$9.drawElementUnderlay = function (context, ele) { + var r = this; + + if (ele.isNode()) { + r.drawNodeUnderlay(context, ele); + } else { + r.drawEdgeUnderlay(context, ele); + } + }; + + CRp$9.drawCachedElementPortion = function (context, ele, eleTxrCache, pxRatio, lvl, reason, getRotation, getOpacity) { + var r = this; + var bb = eleTxrCache.getBoundingBox(ele); + + if (bb.w === 0 || bb.h === 0) { + return; + } // ignore zero size case + + + var eleCache = eleTxrCache.getElement(ele, bb, pxRatio, lvl, reason); + + if (eleCache != null) { + var opacity = getOpacity(r, ele); + + if (opacity === 0) { + return; + } + + var theta = getRotation(r, ele); + var x1 = bb.x1, + y1 = bb.y1, + w = bb.w, + h = bb.h; + var x, y, sx, sy, smooth; + + if (theta !== 0) { + var rotPt = eleTxrCache.getRotationPoint(ele); + sx = rotPt.x; + sy = rotPt.y; + context.translate(sx, sy); + context.rotate(theta); + smooth = r.getImgSmoothing(context); + + if (!smooth) { + r.setImgSmoothing(context, true); + } + + var off = eleTxrCache.getRotationOffset(ele); + x = off.x; + y = off.y; + } else { + x = x1; + y = y1; + } + + var oldGlobalAlpha; + + if (opacity !== 1) { + oldGlobalAlpha = context.globalAlpha; + context.globalAlpha = oldGlobalAlpha * opacity; + } + + context.drawImage(eleCache.texture.canvas, eleCache.x, 0, eleCache.width, eleCache.height, x, y, w, h); + + if (opacity !== 1) { + context.globalAlpha = oldGlobalAlpha; + } + + if (theta !== 0) { + context.rotate(-theta); + context.translate(-sx, -sy); + + if (!smooth) { + r.setImgSmoothing(context, false); + } + } + } else { + eleTxrCache.drawElement(context, ele); // direct draw fallback + } + }; + + var getZeroRotation = function getZeroRotation() { + return 0; + }; + + var getLabelRotation = function getLabelRotation(r, ele) { + return r.getTextAngle(ele, null); + }; + + var getSourceLabelRotation = function getSourceLabelRotation(r, ele) { + return r.getTextAngle(ele, 'source'); + }; + + var getTargetLabelRotation = function getTargetLabelRotation(r, ele) { + return r.getTextAngle(ele, 'target'); + }; + + var getOpacity = function getOpacity(r, ele) { + return ele.effectiveOpacity(); + }; + + var getTextOpacity = function getTextOpacity(e, ele) { + return ele.pstyle('text-opacity').pfValue * ele.effectiveOpacity(); + }; + + CRp$9.drawCachedElement = function (context, ele, pxRatio, extent, lvl, requestHighQuality) { + var r = this; + var _r$data = r.data, + eleTxrCache = _r$data.eleTxrCache, + lblTxrCache = _r$data.lblTxrCache, + slbTxrCache = _r$data.slbTxrCache, + tlbTxrCache = _r$data.tlbTxrCache; + var bb = ele.boundingBox(); + var reason = requestHighQuality === true ? eleTxrCache.reasons.highQuality : null; + + if (bb.w === 0 || bb.h === 0 || !ele.visible()) { + return; + } + + if (!extent || boundingBoxesIntersect(bb, extent)) { + var isEdge = ele.isEdge(); + + var badLine = ele.element()._private.rscratch.badLine; + + r.drawElementUnderlay(context, ele); + r.drawCachedElementPortion(context, ele, eleTxrCache, pxRatio, lvl, reason, getZeroRotation, getOpacity); + + if (!isEdge || !badLine) { + r.drawCachedElementPortion(context, ele, lblTxrCache, pxRatio, lvl, reason, getLabelRotation, getTextOpacity); + } + + if (isEdge && !badLine) { + r.drawCachedElementPortion(context, ele, slbTxrCache, pxRatio, lvl, reason, getSourceLabelRotation, getTextOpacity); + r.drawCachedElementPortion(context, ele, tlbTxrCache, pxRatio, lvl, reason, getTargetLabelRotation, getTextOpacity); + } + + r.drawElementOverlay(context, ele); + } + }; + + CRp$9.drawElements = function (context, eles) { + var r = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + r.drawElement(context, ele); + } + }; + + CRp$9.drawCachedElements = function (context, eles, pxRatio, extent) { + var r = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + r.drawCachedElement(context, ele, pxRatio, extent); + } + }; + + CRp$9.drawCachedNodes = function (context, eles, pxRatio, extent) { + var r = this; + + for (var i = 0; i < eles.length; i++) { + var ele = eles[i]; + + if (!ele.isNode()) { + continue; + } + + r.drawCachedElement(context, ele, pxRatio, extent); + } + }; + + CRp$9.drawLayeredElements = function (context, eles, pxRatio, extent) { + var r = this; + var layers = r.data.lyrTxrCache.getLayers(eles, pxRatio); + + if (layers) { + for (var i = 0; i < layers.length; i++) { + var layer = layers[i]; + var bb = layer.bb; + + if (bb.w === 0 || bb.h === 0) { + continue; + } + + context.drawImage(layer.canvas, bb.x1, bb.y1, bb.w, bb.h); + } + } else { + // fall back on plain caching if no layers + r.drawCachedElements(context, eles, pxRatio, extent); + } + }; + + /* global Path2D */ + var CRp$8 = {}; + + CRp$8.drawEdge = function (context, edge, shiftToOriginWithBb) { + var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + var rs = edge._private.rscratch; + + if (shouldDrawOpacity && !edge.visible()) { + return; + } // if bezier ctrl pts can not be calculated, then die + + + if (rs.badLine || rs.allpts == null || isNaN(rs.allpts[0])) { + // isNaN in case edge is impossible and browser bugs (e.g. safari) + return; + } + + var bb; + + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); + } + + var opacity = shouldDrawOpacity ? edge.pstyle('opacity').value : 1; + var lineOpacity = shouldDrawOpacity ? edge.pstyle('line-opacity').value : 1; + var curveStyle = edge.pstyle('curve-style').value; + var lineStyle = edge.pstyle('line-style').value; + var edgeWidth = edge.pstyle('width').pfValue; + var lineCap = edge.pstyle('line-cap').value; + var effectiveLineOpacity = opacity * lineOpacity; // separate arrow opacity would require arrow-opacity property + + var effectiveArrowOpacity = opacity * lineOpacity; + + var drawLine = function drawLine() { + var strokeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveLineOpacity; + + if (curveStyle === 'straight-triangle') { + r.eleStrokeStyle(context, edge, strokeOpacity); + r.drawEdgeTrianglePath(edge, context, rs.allpts); + } else { + context.lineWidth = edgeWidth; + context.lineCap = lineCap; + r.eleStrokeStyle(context, edge, strokeOpacity); + r.drawEdgePath(edge, context, rs.allpts, lineStyle); + context.lineCap = 'butt'; // reset for other drawing functions + } + }; + + var drawOverlay = function drawOverlay() { + if (!shouldDrawOverlay) { + return; + } + + r.drawEdgeOverlay(context, edge); + }; + + var drawUnderlay = function drawUnderlay() { + if (!shouldDrawOverlay) { + return; + } + + r.drawEdgeUnderlay(context, edge); + }; + + var drawArrows = function drawArrows() { + var arrowOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : effectiveArrowOpacity; + r.drawArrowheads(context, edge, arrowOpacity); + }; + + var drawText = function drawText() { + r.drawElementText(context, edge, null, drawLabel); + }; + + context.lineJoin = 'round'; + var ghost = edge.pstyle('ghost').value === 'yes'; + + if (ghost) { + var gx = edge.pstyle('ghost-offset-x').pfValue; + var gy = edge.pstyle('ghost-offset-y').pfValue; + var ghostOpacity = edge.pstyle('ghost-opacity').value; + var effectiveGhostOpacity = effectiveLineOpacity * ghostOpacity; + context.translate(gx, gy); + drawLine(effectiveGhostOpacity); + drawArrows(effectiveGhostOpacity); + context.translate(-gx, -gy); + } + + drawUnderlay(); + drawLine(); + drawArrows(); + drawOverlay(); + drawText(); + + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); + } + }; + + var drawEdgeOverlayUnderlay = function drawEdgeOverlayUnderlay(overlayOrUnderlay) { + if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) { + throw new Error('Invalid state'); + } + + return function (context, edge) { + if (!edge.visible()) { + return; + } + + var opacity = edge.pstyle("".concat(overlayOrUnderlay, "-opacity")).value; + + if (opacity === 0) { + return; + } + + var r = this; + var usePaths = r.usePaths(); + var rs = edge._private.rscratch; + var padding = edge.pstyle("".concat(overlayOrUnderlay, "-padding")).pfValue; + var width = 2 * padding; + var color = edge.pstyle("".concat(overlayOrUnderlay, "-color")).value; + context.lineWidth = width; + + if (rs.edgeType === 'self' && !usePaths) { + context.lineCap = 'butt'; + } else { + context.lineCap = 'round'; + } + + r.colorStrokeStyle(context, color[0], color[1], color[2], opacity); + r.drawEdgePath(edge, context, rs.allpts, 'solid'); + }; + }; + + CRp$8.drawEdgeOverlay = drawEdgeOverlayUnderlay('overlay'); + CRp$8.drawEdgeUnderlay = drawEdgeOverlayUnderlay('underlay'); + + CRp$8.drawEdgePath = function (edge, context, pts, type) { + var rs = edge._private.rscratch; + var canvasCxt = context; + var path; + var pathCacheHit = false; + var usePaths = this.usePaths(); + var lineDashPattern = edge.pstyle('line-dash-pattern').pfValue; + var lineDashOffset = edge.pstyle('line-dash-offset').pfValue; + + if (usePaths) { + var pathCacheKey = pts.join('$'); + var keyMatches = rs.pathCacheKey && rs.pathCacheKey === pathCacheKey; + + if (keyMatches) { + path = context = rs.pathCache; + pathCacheHit = true; + } else { + path = context = new Path2D(); + rs.pathCacheKey = pathCacheKey; + rs.pathCache = path; + } + } + + if (canvasCxt.setLineDash) { + // for very outofdate browsers + switch (type) { + case 'dotted': + canvasCxt.setLineDash([1, 1]); + break; + + case 'dashed': + canvasCxt.setLineDash(lineDashPattern); + canvasCxt.lineDashOffset = lineDashOffset; + break; + + case 'solid': + canvasCxt.setLineDash([]); + break; + } + } + + if (!pathCacheHit && !rs.badLine) { + if (context.beginPath) { + context.beginPath(); + } + + context.moveTo(pts[0], pts[1]); + + switch (rs.edgeType) { + case 'bezier': + case 'self': + case 'compound': + case 'multibezier': + for (var i = 2; i + 3 < pts.length; i += 4) { + context.quadraticCurveTo(pts[i], pts[i + 1], pts[i + 2], pts[i + 3]); + } + + break; + + case 'straight': + case 'segments': + case 'haystack': + for (var _i = 2; _i + 1 < pts.length; _i += 2) { + context.lineTo(pts[_i], pts[_i + 1]); + } + + break; + } + } + + context = canvasCxt; + + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } // reset any line dashes + + + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); + } + }; + + CRp$8.drawEdgeTrianglePath = function (edge, context, pts) { + // use line stroke style for triangle fill style + context.fillStyle = context.strokeStyle; + var edgeWidth = edge.pstyle('width').pfValue; + + for (var i = 0; i + 1 < pts.length; i += 2) { + var vector = [pts[i + 2] - pts[i], pts[i + 3] - pts[i + 1]]; + var length = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]); + var normal = [vector[1] / length, -vector[0] / length]; + var triangleHead = [normal[0] * edgeWidth / 2, normal[1] * edgeWidth / 2]; + context.beginPath(); + context.moveTo(pts[i] - triangleHead[0], pts[i + 1] - triangleHead[1]); + context.lineTo(pts[i] + triangleHead[0], pts[i + 1] + triangleHead[1]); + context.lineTo(pts[i + 2], pts[i + 3]); + context.closePath(); + context.fill(); + } + }; + + CRp$8.drawArrowheads = function (context, edge, opacity) { + var rs = edge._private.rscratch; + var isHaystack = rs.edgeType === 'haystack'; + + if (!isHaystack) { + this.drawArrowhead(context, edge, 'source', rs.arrowStartX, rs.arrowStartY, rs.srcArrowAngle, opacity); + } + + this.drawArrowhead(context, edge, 'mid-target', rs.midX, rs.midY, rs.midtgtArrowAngle, opacity); + this.drawArrowhead(context, edge, 'mid-source', rs.midX, rs.midY, rs.midsrcArrowAngle, opacity); + + if (!isHaystack) { + this.drawArrowhead(context, edge, 'target', rs.arrowEndX, rs.arrowEndY, rs.tgtArrowAngle, opacity); + } + }; + + CRp$8.drawArrowhead = function (context, edge, prefix, x, y, angle, opacity) { + if (isNaN(x) || x == null || isNaN(y) || y == null || isNaN(angle) || angle == null) { + return; + } + + var self = this; + var arrowShape = edge.pstyle(prefix + '-arrow-shape').value; + + if (arrowShape === 'none') { + return; + } + + var arrowClearFill = edge.pstyle(prefix + '-arrow-fill').value === 'hollow' ? 'both' : 'filled'; + var arrowFill = edge.pstyle(prefix + '-arrow-fill').value; + var edgeWidth = edge.pstyle('width').pfValue; + var edgeOpacity = edge.pstyle('opacity').value; + + if (opacity === undefined) { + opacity = edgeOpacity; + } + + var gco = context.globalCompositeOperation; + + if (opacity !== 1 || arrowFill === 'hollow') { + // then extra clear is needed + context.globalCompositeOperation = 'destination-out'; + self.colorFillStyle(context, 255, 255, 255, 1); + self.colorStrokeStyle(context, 255, 255, 255, 1); + self.drawArrowShape(edge, context, arrowClearFill, edgeWidth, arrowShape, x, y, angle); + context.globalCompositeOperation = gco; + } // otherwise, the opaque arrow clears it for free :) + + + var color = edge.pstyle(prefix + '-arrow-color').value; + self.colorFillStyle(context, color[0], color[1], color[2], opacity); + self.colorStrokeStyle(context, color[0], color[1], color[2], opacity); + self.drawArrowShape(edge, context, arrowFill, edgeWidth, arrowShape, x, y, angle); + }; + + CRp$8.drawArrowShape = function (edge, context, fill, edgeWidth, shape, x, y, angle) { + var r = this; + var usePaths = this.usePaths() && shape !== 'triangle-cross'; + var pathCacheHit = false; + var path; + var canvasContext = context; + var translation = { + x: x, + y: y + }; + var scale = edge.pstyle('arrow-scale').value; + var size = this.getArrowWidth(edgeWidth, scale); + var shapeImpl = r.arrowShapes[shape]; + + if (usePaths) { + var cache = r.arrowPathCache = r.arrowPathCache || []; + var key = hashString(shape); + var cachedPath = cache[key]; + + if (cachedPath != null) { + path = context = cachedPath; + pathCacheHit = true; + } else { + path = context = new Path2D(); + cache[key] = path; + } + } + + if (!pathCacheHit) { + if (context.beginPath) { + context.beginPath(); + } + + if (usePaths) { + // store in the path cache with values easily manipulated later + shapeImpl.draw(context, 1, 0, { + x: 0, + y: 0 + }, 1); + } else { + shapeImpl.draw(context, size, angle, translation, edgeWidth); + } + + if (context.closePath) { + context.closePath(); + } + } + + context = canvasContext; + + if (usePaths) { + // set transform to arrow position/orientation + context.translate(x, y); + context.rotate(angle); + context.scale(size, size); + } + + if (fill === 'filled' || fill === 'both') { + if (usePaths) { + context.fill(path); + } else { + context.fill(); + } + } + + if (fill === 'hollow' || fill === 'both') { + context.lineWidth = (shapeImpl.matchEdgeWidth ? edgeWidth : 1) / (usePaths ? size : 1); + context.lineJoin = 'miter'; + + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } + } + + if (usePaths) { + // reset transform by applying inverse + context.scale(1 / size, 1 / size); + context.rotate(-angle); + context.translate(-x, -y); + } + }; + + var CRp$7 = {}; + + CRp$7.safeDrawImage = function (context, img, ix, iy, iw, ih, x, y, w, h) { + // detect problematic cases for old browsers with bad images (cheaper than try-catch) + if (iw <= 0 || ih <= 0 || w <= 0 || h <= 0) { + return; + } + + try { + context.drawImage(img, ix, iy, iw, ih, x, y, w, h); + } catch (e) { + warn(e); + } + }; + + CRp$7.drawInscribedImage = function (context, img, node, index, nodeOpacity) { + var r = this; + var pos = node.position(); + var nodeX = pos.x; + var nodeY = pos.y; + var styleObj = node.cy().style(); + var getIndexedStyle = styleObj.getIndexedStyle.bind(styleObj); + var fit = getIndexedStyle(node, 'background-fit', 'value', index); + var repeat = getIndexedStyle(node, 'background-repeat', 'value', index); + var nodeW = node.width(); + var nodeH = node.height(); + var paddingX2 = node.padding() * 2; + var nodeTW = nodeW + (getIndexedStyle(node, 'background-width-relative-to', 'value', index) === 'inner' ? 0 : paddingX2); + var nodeTH = nodeH + (getIndexedStyle(node, 'background-height-relative-to', 'value', index) === 'inner' ? 0 : paddingX2); + var rs = node._private.rscratch; + var clip = getIndexedStyle(node, 'background-clip', 'value', index); + var shouldClip = clip === 'node'; + var imgOpacity = getIndexedStyle(node, 'background-image-opacity', 'value', index) * nodeOpacity; + var smooth = getIndexedStyle(node, 'background-image-smoothing', 'value', index); + var imgW = img.width || img.cachedW; + var imgH = img.height || img.cachedH; // workaround for broken browsers like ie + + if (null == imgW || null == imgH) { + document.body.appendChild(img); // eslint-disable-line no-undef + + imgW = img.cachedW = img.width || img.offsetWidth; + imgH = img.cachedH = img.height || img.offsetHeight; + document.body.removeChild(img); // eslint-disable-line no-undef + } + + var w = imgW; + var h = imgH; + + if (getIndexedStyle(node, 'background-width', 'value', index) !== 'auto') { + if (getIndexedStyle(node, 'background-width', 'units', index) === '%') { + w = getIndexedStyle(node, 'background-width', 'pfValue', index) * nodeTW; + } else { + w = getIndexedStyle(node, 'background-width', 'pfValue', index); + } + } + + if (getIndexedStyle(node, 'background-height', 'value', index) !== 'auto') { + if (getIndexedStyle(node, 'background-height', 'units', index) === '%') { + h = getIndexedStyle(node, 'background-height', 'pfValue', index) * nodeTH; + } else { + h = getIndexedStyle(node, 'background-height', 'pfValue', index); + } + } + + if (w === 0 || h === 0) { + return; // no point in drawing empty image (and chrome is broken in this case) + } + + if (fit === 'contain') { + var scale = Math.min(nodeTW / w, nodeTH / h); + w *= scale; + h *= scale; + } else if (fit === 'cover') { + var scale = Math.max(nodeTW / w, nodeTH / h); + w *= scale; + h *= scale; + } + + var x = nodeX - nodeTW / 2; // left + + var posXUnits = getIndexedStyle(node, 'background-position-x', 'units', index); + var posXPfVal = getIndexedStyle(node, 'background-position-x', 'pfValue', index); + + if (posXUnits === '%') { + x += (nodeTW - w) * posXPfVal; + } else { + x += posXPfVal; + } + + var offXUnits = getIndexedStyle(node, 'background-offset-x', 'units', index); + var offXPfVal = getIndexedStyle(node, 'background-offset-x', 'pfValue', index); + + if (offXUnits === '%') { + x += (nodeTW - w) * offXPfVal; + } else { + x += offXPfVal; + } + + var y = nodeY - nodeTH / 2; // top + + var posYUnits = getIndexedStyle(node, 'background-position-y', 'units', index); + var posYPfVal = getIndexedStyle(node, 'background-position-y', 'pfValue', index); + + if (posYUnits === '%') { + y += (nodeTH - h) * posYPfVal; + } else { + y += posYPfVal; + } + + var offYUnits = getIndexedStyle(node, 'background-offset-y', 'units', index); + var offYPfVal = getIndexedStyle(node, 'background-offset-y', 'pfValue', index); + + if (offYUnits === '%') { + y += (nodeTH - h) * offYPfVal; + } else { + y += offYPfVal; + } + + if (rs.pathCache) { + x -= nodeX; + y -= nodeY; + nodeX = 0; + nodeY = 0; + } + + var gAlpha = context.globalAlpha; + context.globalAlpha = imgOpacity; + var smoothingEnabled = r.getImgSmoothing(context); + var isSmoothingSwitched = false; + + if (smooth === 'no' && smoothingEnabled) { + r.setImgSmoothing(context, false); + isSmoothingSwitched = true; + } else if (smooth === 'yes' && !smoothingEnabled) { + r.setImgSmoothing(context, true); + isSmoothingSwitched = true; + } + + if (repeat === 'no-repeat') { + if (shouldClip) { + context.save(); + + if (rs.pathCache) { + context.clip(rs.pathCache); + } else { + r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH); + context.clip(); + } + } + + r.safeDrawImage(context, img, 0, 0, imgW, imgH, x, y, w, h); + + if (shouldClip) { + context.restore(); + } + } else { + var pattern = context.createPattern(img, repeat); + context.fillStyle = pattern; + r.nodeShapes[r.getNodeShape(node)].draw(context, nodeX, nodeY, nodeTW, nodeTH); + context.translate(x, y); + context.fill(); + context.translate(-x, -y); + } + + context.globalAlpha = gAlpha; + + if (isSmoothingSwitched) { + r.setImgSmoothing(context, smoothingEnabled); + } + }; + + var CRp$6 = {}; + + CRp$6.eleTextBiggerThanMin = function (ele, scale) { + if (!scale) { + var zoom = ele.cy().zoom(); + var pxRatio = this.getPixelRatio(); + var lvl = Math.ceil(log2(zoom * pxRatio)); // the effective texture level + + scale = Math.pow(2, lvl); + } + + var computedSize = ele.pstyle('font-size').pfValue * scale; + var minSize = ele.pstyle('min-zoomed-font-size').pfValue; + + if (computedSize < minSize) { + return false; + } + + return true; + }; + + CRp$6.drawElementText = function (context, ele, shiftToOriginWithBb, force, prefix) { + var useEleOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + + if (force == null) { + if (useEleOpacity && !r.eleTextBiggerThanMin(ele)) { + return; + } + } else if (force === false) { + return; + } + + if (ele.isNode()) { + var label = ele.pstyle('label'); + + if (!label || !label.value) { + return; + } + + var justification = r.getLabelJustification(ele); + context.textAlign = justification; + context.textBaseline = 'bottom'; + } else { + var badLine = ele.element()._private.rscratch.badLine; + + var _label = ele.pstyle('label'); + + var srcLabel = ele.pstyle('source-label'); + var tgtLabel = ele.pstyle('target-label'); + + if (badLine || (!_label || !_label.value) && (!srcLabel || !srcLabel.value) && (!tgtLabel || !tgtLabel.value)) { + return; + } + + context.textAlign = 'center'; + context.textBaseline = 'bottom'; + } + + var applyRotation = !shiftToOriginWithBb; + var bb; + + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); + } + + if (prefix == null) { + r.drawText(context, ele, null, applyRotation, useEleOpacity); + + if (ele.isEdge()) { + r.drawText(context, ele, 'source', applyRotation, useEleOpacity); + r.drawText(context, ele, 'target', applyRotation, useEleOpacity); + } + } else { + r.drawText(context, ele, prefix, applyRotation, useEleOpacity); + } + + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); + } + }; + + CRp$6.getFontCache = function (context) { + var cache; + this.fontCaches = this.fontCaches || []; + + for (var i = 0; i < this.fontCaches.length; i++) { + cache = this.fontCaches[i]; + + if (cache.context === context) { + return cache; + } + } + + cache = { + context: context + }; + this.fontCaches.push(cache); + return cache; + }; // set up canvas context with font + // returns transformed text string + + + CRp$6.setupTextStyle = function (context, ele) { + var useEleOpacity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + // Font style + var labelStyle = ele.pstyle('font-style').strValue; + var labelSize = ele.pstyle('font-size').pfValue + 'px'; + var labelFamily = ele.pstyle('font-family').strValue; + var labelWeight = ele.pstyle('font-weight').strValue; + var opacity = useEleOpacity ? ele.effectiveOpacity() * ele.pstyle('text-opacity').value : 1; + var outlineOpacity = ele.pstyle('text-outline-opacity').value * opacity; + var color = ele.pstyle('color').value; + var outlineColor = ele.pstyle('text-outline-color').value; + context.font = labelStyle + ' ' + labelWeight + ' ' + labelSize + ' ' + labelFamily; + context.lineJoin = 'round'; // so text outlines aren't jagged + + this.colorFillStyle(context, color[0], color[1], color[2], opacity); + this.colorStrokeStyle(context, outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity); + }; // TODO ensure re-used + + + function roundRect(ctx, x, y, width, height) { + var radius = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 5; + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + ctx.fill(); + } + + CRp$6.getTextAngle = function (ele, prefix) { + var theta; + var _p = ele._private; + var rscratch = _p.rscratch; + var pdash = prefix ? prefix + '-' : ''; + var rotation = ele.pstyle(pdash + 'text-rotation'); + var textAngle = getPrefixedProperty(rscratch, 'labelAngle', prefix); + + if (rotation.strValue === 'autorotate') { + theta = ele.isEdge() ? textAngle : 0; + } else if (rotation.strValue === 'none') { + theta = 0; + } else { + theta = rotation.pfValue; + } + + return theta; + }; + + CRp$6.drawText = function (context, ele, prefix) { + var applyRotation = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var useEleOpacity = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var _p = ele._private; + var rscratch = _p.rscratch; + var parentOpacity = useEleOpacity ? ele.effectiveOpacity() : 1; + + if (useEleOpacity && (parentOpacity === 0 || ele.pstyle('text-opacity').value === 0)) { + return; + } // use 'main' as an alias for the main label (i.e. null prefix) + + + if (prefix === 'main') { + prefix = null; + } + + var textX = getPrefixedProperty(rscratch, 'labelX', prefix); + var textY = getPrefixedProperty(rscratch, 'labelY', prefix); + var orgTextX, orgTextY; // used for rotation + + var text = this.getLabelText(ele, prefix); + + if (text != null && text !== '' && !isNaN(textX) && !isNaN(textY)) { + this.setupTextStyle(context, ele, useEleOpacity); + var pdash = prefix ? prefix + '-' : ''; + var textW = getPrefixedProperty(rscratch, 'labelWidth', prefix); + var textH = getPrefixedProperty(rscratch, 'labelHeight', prefix); + var marginX = ele.pstyle(pdash + 'text-margin-x').pfValue; + var marginY = ele.pstyle(pdash + 'text-margin-y').pfValue; + var isEdge = ele.isEdge(); + var halign = ele.pstyle('text-halign').value; + var valign = ele.pstyle('text-valign').value; + + if (isEdge) { + halign = 'center'; + valign = 'center'; + } + + textX += marginX; + textY += marginY; + var theta; + + if (!applyRotation) { + theta = 0; + } else { + theta = this.getTextAngle(ele, prefix); + } + + if (theta !== 0) { + orgTextX = textX; + orgTextY = textY; + context.translate(orgTextX, orgTextY); + context.rotate(theta); + textX = 0; + textY = 0; + } + + switch (valign) { + case 'top': + break; + + case 'center': + textY += textH / 2; + break; + + case 'bottom': + textY += textH; + break; + } + + var backgroundOpacity = ele.pstyle('text-background-opacity').value; + var borderOpacity = ele.pstyle('text-border-opacity').value; + var textBorderWidth = ele.pstyle('text-border-width').pfValue; + var backgroundPadding = ele.pstyle('text-background-padding').pfValue; + + if (backgroundOpacity > 0 || textBorderWidth > 0 && borderOpacity > 0) { + var bgX = textX - backgroundPadding; + + switch (halign) { + case 'left': + bgX -= textW; + break; + + case 'center': + bgX -= textW / 2; + break; + } + + var bgY = textY - textH - backgroundPadding; + var bgW = textW + 2 * backgroundPadding; + var bgH = textH + 2 * backgroundPadding; + + if (backgroundOpacity > 0) { + var textFill = context.fillStyle; + var textBackgroundColor = ele.pstyle('text-background-color').value; + context.fillStyle = 'rgba(' + textBackgroundColor[0] + ',' + textBackgroundColor[1] + ',' + textBackgroundColor[2] + ',' + backgroundOpacity * parentOpacity + ')'; + var styleShape = ele.pstyle('text-background-shape').strValue; + + if (styleShape.indexOf('round') === 0) { + roundRect(context, bgX, bgY, bgW, bgH, 2); + } else { + context.fillRect(bgX, bgY, bgW, bgH); + } + + context.fillStyle = textFill; + } + + if (textBorderWidth > 0 && borderOpacity > 0) { + var textStroke = context.strokeStyle; + var textLineWidth = context.lineWidth; + var textBorderColor = ele.pstyle('text-border-color').value; + var textBorderStyle = ele.pstyle('text-border-style').value; + context.strokeStyle = 'rgba(' + textBorderColor[0] + ',' + textBorderColor[1] + ',' + textBorderColor[2] + ',' + borderOpacity * parentOpacity + ')'; + context.lineWidth = textBorderWidth; + + if (context.setLineDash) { + // for very outofdate browsers + switch (textBorderStyle) { + case 'dotted': + context.setLineDash([1, 1]); + break; + + case 'dashed': + context.setLineDash([4, 2]); + break; + + case 'double': + context.lineWidth = textBorderWidth / 4; // 50% reserved for white between the two borders + + context.setLineDash([]); + break; + + case 'solid': + context.setLineDash([]); + break; + } + } + + context.strokeRect(bgX, bgY, bgW, bgH); + + if (textBorderStyle === 'double') { + var whiteWidth = textBorderWidth / 2; + context.strokeRect(bgX + whiteWidth, bgY + whiteWidth, bgW - whiteWidth * 2, bgH - whiteWidth * 2); + } + + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); + } + + context.lineWidth = textLineWidth; + context.strokeStyle = textStroke; + } + } + + var lineWidth = 2 * ele.pstyle('text-outline-width').pfValue; // *2 b/c the stroke is drawn centred on the middle + + if (lineWidth > 0) { + context.lineWidth = lineWidth; + } + + if (ele.pstyle('text-wrap').value === 'wrap') { + var lines = getPrefixedProperty(rscratch, 'labelWrapCachedLines', prefix); + var lineHeight = getPrefixedProperty(rscratch, 'labelLineHeight', prefix); + var halfTextW = textW / 2; + var justification = this.getLabelJustification(ele); + + if (justification === 'auto') ; else if (halign === 'left') { + // auto justification : right + if (justification === 'left') { + textX += -textW; + } else if (justification === 'center') { + textX += -halfTextW; + } // else same as auto + + } else if (halign === 'center') { + // auto justfication : center + if (justification === 'left') { + textX += -halfTextW; + } else if (justification === 'right') { + textX += halfTextW; + } // else same as auto + + } else if (halign === 'right') { + // auto justification : left + if (justification === 'center') { + textX += halfTextW; + } else if (justification === 'right') { + textX += textW; + } // else same as auto + + } + + switch (valign) { + case 'top': + textY -= (lines.length - 1) * lineHeight; + break; + + case 'center': + case 'bottom': + textY -= (lines.length - 1) * lineHeight; + break; + } + + for (var l = 0; l < lines.length; l++) { + if (lineWidth > 0) { + context.strokeText(lines[l], textX, textY); + } + + context.fillText(lines[l], textX, textY); + textY += lineHeight; + } + } else { + if (lineWidth > 0) { + context.strokeText(text, textX, textY); + } + + context.fillText(text, textX, textY); + } + + if (theta !== 0) { + context.rotate(-theta); + context.translate(-orgTextX, -orgTextY); + } + } + }; + + /* global Path2D */ + var CRp$5 = {}; + + CRp$5.drawNode = function (context, node, shiftToOriginWithBb) { + var drawLabel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var shouldDrawOverlay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var shouldDrawOpacity = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true; + var r = this; + var nodeWidth, nodeHeight; + var _p = node._private; + var rs = _p.rscratch; + var pos = node.position(); + + if (!number$1(pos.x) || !number$1(pos.y)) { + return; // can't draw node with undefined position + } + + if (shouldDrawOpacity && !node.visible()) { + return; + } + + var eleOpacity = shouldDrawOpacity ? node.effectiveOpacity() : 1; + var usePaths = r.usePaths(); + var path; + var pathCacheHit = false; + var padding = node.padding(); + nodeWidth = node.width() + 2 * padding; + nodeHeight = node.height() + 2 * padding; // + // setup shift + + var bb; + + if (shiftToOriginWithBb) { + bb = shiftToOriginWithBb; + context.translate(-bb.x1, -bb.y1); + } // + // load bg image + + + var bgImgProp = node.pstyle('background-image'); + var urls = bgImgProp.value; + var urlDefined = new Array(urls.length); + var image = new Array(urls.length); + var numImages = 0; + + for (var i = 0; i < urls.length; i++) { + var url = urls[i]; + var defd = urlDefined[i] = url != null && url !== 'none'; + + if (defd) { + var bgImgCrossOrigin = node.cy().style().getIndexedStyle(node, 'background-image-crossorigin', 'value', i); + numImages++; // get image, and if not loaded then ask to redraw when later loaded + + image[i] = r.getCachedImage(url, bgImgCrossOrigin, function () { + _p.backgroundTimestamp = Date.now(); + node.emitAndNotify('background'); + }); + } + } // + // setup styles + + + var darkness = node.pstyle('background-blacken').value; + var borderWidth = node.pstyle('border-width').pfValue; + var bgOpacity = node.pstyle('background-opacity').value * eleOpacity; + var borderColor = node.pstyle('border-color').value; + var borderStyle = node.pstyle('border-style').value; + var borderOpacity = node.pstyle('border-opacity').value * eleOpacity; + context.lineJoin = 'miter'; // so borders are square with the node shape + + var setupShapeColor = function setupShapeColor() { + var bgOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : bgOpacity; + r.eleFillStyle(context, node, bgOpy); + }; + + var setupBorderColor = function setupBorderColor() { + var bdrOpy = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : borderOpacity; + r.colorStrokeStyle(context, borderColor[0], borderColor[1], borderColor[2], bdrOpy); + }; // + // setup shape + + + var styleShape = node.pstyle('shape').strValue; + var shapePts = node.pstyle('shape-polygon-points').pfValue; + + if (usePaths) { + context.translate(pos.x, pos.y); + var pathCache = r.nodePathCache = r.nodePathCache || []; + var key = hashStrings(styleShape === 'polygon' ? styleShape + ',' + shapePts.join(',') : styleShape, '' + nodeHeight, '' + nodeWidth); + var cachedPath = pathCache[key]; + + if (cachedPath != null) { + path = cachedPath; + pathCacheHit = true; + rs.pathCache = path; + } else { + path = new Path2D(); + pathCache[key] = rs.pathCache = path; + } + } + + var drawShape = function drawShape() { + if (!pathCacheHit) { + var npos = pos; + + if (usePaths) { + npos = { + x: 0, + y: 0 + }; + } + + r.nodeShapes[r.getNodeShape(node)].draw(path || context, npos.x, npos.y, nodeWidth, nodeHeight); + } + + if (usePaths) { + context.fill(path); + } else { + context.fill(); + } + }; + + var drawImages = function drawImages() { + var nodeOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity; + var inside = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var prevBging = _p.backgrounding; + var totalCompleted = 0; + + for (var _i = 0; _i < image.length; _i++) { + var bgContainment = node.cy().style().getIndexedStyle(node, 'background-image-containment', 'value', _i); + + if (inside && bgContainment === 'over' || !inside && bgContainment === 'inside') { + totalCompleted++; + continue; + } + + if (urlDefined[_i] && image[_i].complete && !image[_i].error) { + totalCompleted++; + r.drawInscribedImage(context, image[_i], node, _i, nodeOpacity); + } + } + + _p.backgrounding = !(totalCompleted === numImages); + + if (prevBging !== _p.backgrounding) { + // update style b/c :backgrounding state changed + node.updateStyle(false); + } + }; + + var drawPie = function drawPie() { + var redrawShape = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var pieOpacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : eleOpacity; + + if (r.hasPie(node)) { + r.drawPie(context, node, pieOpacity); // redraw/restore path if steps after pie need it + + if (redrawShape) { + if (!usePaths) { + r.nodeShapes[r.getNodeShape(node)].draw(context, pos.x, pos.y, nodeWidth, nodeHeight); + } + } + } + }; + + var darken = function darken() { + var darkenOpacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : eleOpacity; + var opacity = (darkness > 0 ? darkness : -darkness) * darkenOpacity; + var c = darkness > 0 ? 0 : 255; + + if (darkness !== 0) { + r.colorFillStyle(context, c, c, c, opacity); + + if (usePaths) { + context.fill(path); + } else { + context.fill(); + } + } + }; + + var drawBorder = function drawBorder() { + if (borderWidth > 0) { + context.lineWidth = borderWidth; + context.lineCap = 'butt'; + + if (context.setLineDash) { + // for very outofdate browsers + switch (borderStyle) { + case 'dotted': + context.setLineDash([1, 1]); + break; + + case 'dashed': + context.setLineDash([4, 2]); + break; + + case 'solid': + case 'double': + context.setLineDash([]); + break; + } + } + + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } + + if (borderStyle === 'double') { + context.lineWidth = borderWidth / 3; + var gco = context.globalCompositeOperation; + context.globalCompositeOperation = 'destination-out'; + + if (usePaths) { + context.stroke(path); + } else { + context.stroke(); + } + + context.globalCompositeOperation = gco; + } // reset in case we changed the border style + + + if (context.setLineDash) { + // for very outofdate browsers + context.setLineDash([]); + } + } + }; + + var drawOverlay = function drawOverlay() { + if (shouldDrawOverlay) { + r.drawNodeOverlay(context, node, pos, nodeWidth, nodeHeight); + } + }; + + var drawUnderlay = function drawUnderlay() { + if (shouldDrawOverlay) { + r.drawNodeUnderlay(context, node, pos, nodeWidth, nodeHeight); + } + }; + + var drawText = function drawText() { + r.drawElementText(context, node, null, drawLabel); + }; + + var ghost = node.pstyle('ghost').value === 'yes'; + + if (ghost) { + var gx = node.pstyle('ghost-offset-x').pfValue; + var gy = node.pstyle('ghost-offset-y').pfValue; + var ghostOpacity = node.pstyle('ghost-opacity').value; + var effGhostOpacity = ghostOpacity * eleOpacity; + context.translate(gx, gy); + setupShapeColor(ghostOpacity * bgOpacity); + drawShape(); + drawImages(effGhostOpacity, true); + setupBorderColor(ghostOpacity * borderOpacity); + drawBorder(); + drawPie(darkness !== 0 || borderWidth !== 0); + drawImages(effGhostOpacity, false); + darken(effGhostOpacity); + context.translate(-gx, -gy); + } + + if (usePaths) { + context.translate(-pos.x, -pos.y); + } + + drawUnderlay(); + + if (usePaths) { + context.translate(pos.x, pos.y); + } + + setupShapeColor(); + drawShape(); + drawImages(eleOpacity, true); + setupBorderColor(); + drawBorder(); + drawPie(darkness !== 0 || borderWidth !== 0); + drawImages(eleOpacity, false); + darken(); + + if (usePaths) { + context.translate(-pos.x, -pos.y); + } + + drawText(); + drawOverlay(); // + // clean up shift + + if (shiftToOriginWithBb) { + context.translate(bb.x1, bb.y1); + } + }; + + var drawNodeOverlayUnderlay = function drawNodeOverlayUnderlay(overlayOrUnderlay) { + if (!['overlay', 'underlay'].includes(overlayOrUnderlay)) { + throw new Error('Invalid state'); + } + + return function (context, node, pos, nodeWidth, nodeHeight) { + var r = this; + + if (!node.visible()) { + return; + } + + var padding = node.pstyle("".concat(overlayOrUnderlay, "-padding")).pfValue; + var opacity = node.pstyle("".concat(overlayOrUnderlay, "-opacity")).value; + var color = node.pstyle("".concat(overlayOrUnderlay, "-color")).value; + var shape = node.pstyle("".concat(overlayOrUnderlay, "-shape")).value; + + if (opacity > 0) { + pos = pos || node.position(); + + if (nodeWidth == null || nodeHeight == null) { + var _padding = node.padding(); + + nodeWidth = node.width() + 2 * _padding; + nodeHeight = node.height() + 2 * _padding; + } + + r.colorFillStyle(context, color[0], color[1], color[2], opacity); + r.nodeShapes[shape].draw(context, pos.x, pos.y, nodeWidth + padding * 2, nodeHeight + padding * 2); + context.fill(); + } + }; + }; + + CRp$5.drawNodeOverlay = drawNodeOverlayUnderlay('overlay'); + CRp$5.drawNodeUnderlay = drawNodeOverlayUnderlay('underlay'); // does the node have at least one pie piece? + + CRp$5.hasPie = function (node) { + node = node[0]; // ensure ele ref + + return node._private.hasPie; + }; + + CRp$5.drawPie = function (context, node, nodeOpacity, pos) { + node = node[0]; // ensure ele ref + + pos = pos || node.position(); + var cyStyle = node.cy().style(); + var pieSize = node.pstyle('pie-size'); + var x = pos.x; + var y = pos.y; + var nodeW = node.width(); + var nodeH = node.height(); + var radius = Math.min(nodeW, nodeH) / 2; // must fit in node + + var lastPercent = 0; // what % to continue drawing pie slices from on [0, 1] + + var usePaths = this.usePaths(); + + if (usePaths) { + x = 0; + y = 0; + } + + if (pieSize.units === '%') { + radius = radius * pieSize.pfValue; + } else if (pieSize.pfValue !== undefined) { + radius = pieSize.pfValue / 2; + } + + for (var i = 1; i <= cyStyle.pieBackgroundN; i++) { + // 1..N + var size = node.pstyle('pie-' + i + '-background-size').value; + var color = node.pstyle('pie-' + i + '-background-color').value; + var opacity = node.pstyle('pie-' + i + '-background-opacity').value * nodeOpacity; + var percent = size / 100; // map integer range [0, 100] to [0, 1] + // percent can't push beyond 1 + + if (percent + lastPercent > 1) { + percent = 1 - lastPercent; + } + + var angleStart = 1.5 * Math.PI + 2 * Math.PI * lastPercent; // start at 12 o'clock and go clockwise + + var angleDelta = 2 * Math.PI * percent; + var angleEnd = angleStart + angleDelta; // ignore if + // - zero size + // - we're already beyond the full circle + // - adding the current slice would go beyond the full circle + + if (size === 0 || lastPercent >= 1 || lastPercent + percent > 1) { + continue; + } + + context.beginPath(); + context.moveTo(x, y); + context.arc(x, y, radius, angleStart, angleEnd); + context.closePath(); + this.colorFillStyle(context, color[0], color[1], color[2], opacity); + context.fill(); + lastPercent += percent; + } + }; + + var CRp$4 = {}; + var motionBlurDelay = 100; // var isFirefox = typeof InstallTrigger !== 'undefined'; + + CRp$4.getPixelRatio = function () { + var context = this.data.contexts[0]; + + if (this.forcedPixelRatio != null) { + return this.forcedPixelRatio; + } + + var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; + return (window.devicePixelRatio || 1) / backingStore; // eslint-disable-line no-undef + }; + + CRp$4.paintCache = function (context) { + var caches = this.paintCaches = this.paintCaches || []; + var needToCreateCache = true; + var cache; + + for (var i = 0; i < caches.length; i++) { + cache = caches[i]; + + if (cache.context === context) { + needToCreateCache = false; + break; + } + } + + if (needToCreateCache) { + cache = { + context: context + }; + caches.push(cache); + } + + return cache; + }; + + CRp$4.createGradientStyleFor = function (context, shapeStyleName, ele, fill, opacity) { + var gradientStyle; + var usePaths = this.usePaths(); + var colors = ele.pstyle(shapeStyleName + '-gradient-stop-colors').value, + positions = ele.pstyle(shapeStyleName + '-gradient-stop-positions').pfValue; + + if (fill === 'radial-gradient') { + if (ele.isEdge()) { + var start = ele.sourceEndpoint(), + end = ele.targetEndpoint(), + mid = ele.midpoint(); + var d1 = dist(start, mid); + var d2 = dist(end, mid); + gradientStyle = context.createRadialGradient(mid.x, mid.y, 0, mid.x, mid.y, Math.max(d1, d2)); + } else { + var pos = usePaths ? { + x: 0, + y: 0 + } : ele.position(), + width = ele.paddedWidth(), + height = ele.paddedHeight(); + gradientStyle = context.createRadialGradient(pos.x, pos.y, 0, pos.x, pos.y, Math.max(width, height)); + } + } else { + if (ele.isEdge()) { + var _start = ele.sourceEndpoint(), + _end = ele.targetEndpoint(); + + gradientStyle = context.createLinearGradient(_start.x, _start.y, _end.x, _end.y); + } else { + var _pos = usePaths ? { + x: 0, + y: 0 + } : ele.position(), + _width = ele.paddedWidth(), + _height = ele.paddedHeight(), + halfWidth = _width / 2, + halfHeight = _height / 2; + + var direction = ele.pstyle('background-gradient-direction').value; + + switch (direction) { + case 'to-bottom': + gradientStyle = context.createLinearGradient(_pos.x, _pos.y - halfHeight, _pos.x, _pos.y + halfHeight); + break; + + case 'to-top': + gradientStyle = context.createLinearGradient(_pos.x, _pos.y + halfHeight, _pos.x, _pos.y - halfHeight); + break; + + case 'to-left': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y, _pos.x - halfWidth, _pos.y); + break; + + case 'to-right': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y, _pos.x + halfWidth, _pos.y); + break; + + case 'to-bottom-right': + case 'to-right-bottom': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y - halfHeight, _pos.x + halfWidth, _pos.y + halfHeight); + break; + + case 'to-top-right': + case 'to-right-top': + gradientStyle = context.createLinearGradient(_pos.x - halfWidth, _pos.y + halfHeight, _pos.x + halfWidth, _pos.y - halfHeight); + break; + + case 'to-bottom-left': + case 'to-left-bottom': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y - halfHeight, _pos.x - halfWidth, _pos.y + halfHeight); + break; + + case 'to-top-left': + case 'to-left-top': + gradientStyle = context.createLinearGradient(_pos.x + halfWidth, _pos.y + halfHeight, _pos.x - halfWidth, _pos.y - halfHeight); + break; + } + } + } + + if (!gradientStyle) return null; // invalid gradient style + + var hasPositions = positions.length === colors.length; + var length = colors.length; + + for (var i = 0; i < length; i++) { + gradientStyle.addColorStop(hasPositions ? positions[i] : i / (length - 1), 'rgba(' + colors[i][0] + ',' + colors[i][1] + ',' + colors[i][2] + ',' + opacity + ')'); + } + + return gradientStyle; + }; + + CRp$4.gradientFillStyle = function (context, ele, fill, opacity) { + var gradientStyle = this.createGradientStyleFor(context, 'background', ele, fill, opacity); + if (!gradientStyle) return null; // error + + context.fillStyle = gradientStyle; + }; + + CRp$4.colorFillStyle = function (context, r, g, b, a) { + context.fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; // turn off for now, seems context does its own caching + // var cache = this.paintCache(context); + // var fillStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + // if( cache.fillStyle !== fillStyle ){ + // context.fillStyle = cache.fillStyle = fillStyle; + // } + }; + + CRp$4.eleFillStyle = function (context, ele, opacity) { + var backgroundFill = ele.pstyle('background-fill').value; + + if (backgroundFill === 'linear-gradient' || backgroundFill === 'radial-gradient') { + this.gradientFillStyle(context, ele, backgroundFill, opacity); + } else { + var backgroundColor = ele.pstyle('background-color').value; + this.colorFillStyle(context, backgroundColor[0], backgroundColor[1], backgroundColor[2], opacity); + } + }; + + CRp$4.gradientStrokeStyle = function (context, ele, fill, opacity) { + var gradientStyle = this.createGradientStyleFor(context, 'line', ele, fill, opacity); + if (!gradientStyle) return null; // error + + context.strokeStyle = gradientStyle; + }; + + CRp$4.colorStrokeStyle = function (context, r, g, b, a) { + context.strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; // turn off for now, seems context does its own caching + // var cache = this.paintCache(context); + // var strokeStyle = 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')'; + // if( cache.strokeStyle !== strokeStyle ){ + // context.strokeStyle = cache.strokeStyle = strokeStyle; + // } + }; + + CRp$4.eleStrokeStyle = function (context, ele, opacity) { + var lineFill = ele.pstyle('line-fill').value; + + if (lineFill === 'linear-gradient' || lineFill === 'radial-gradient') { + this.gradientStrokeStyle(context, ele, lineFill, opacity); + } else { + var lineColor = ele.pstyle('line-color').value; + this.colorStrokeStyle(context, lineColor[0], lineColor[1], lineColor[2], opacity); + } + }; // Resize canvas + + + CRp$4.matchCanvasSize = function (container) { + var r = this; + var data = r.data; + var bb = r.findContainerClientCoords(); + var width = bb[2]; + var height = bb[3]; + var pixelRatio = r.getPixelRatio(); + var mbPxRatio = r.motionBlurPxRatio; + + if (container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE] || container === r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]) { + pixelRatio = mbPxRatio; + } + + var canvasWidth = width * pixelRatio; + var canvasHeight = height * pixelRatio; + var canvas; + + if (canvasWidth === r.canvasWidth && canvasHeight === r.canvasHeight) { + return; // save cycles if same + } + + r.fontCaches = null; // resizing resets the style + + var canvasContainer = data.canvasContainer; + canvasContainer.style.width = width + 'px'; + canvasContainer.style.height = height + 'px'; + + for (var i = 0; i < r.CANVAS_LAYERS; i++) { + canvas = data.canvases[i]; + canvas.width = canvasWidth; + canvas.height = canvasHeight; + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + + for (var i = 0; i < r.BUFFER_COUNT; i++) { + canvas = data.bufferCanvases[i]; + canvas.width = canvasWidth; + canvas.height = canvasHeight; + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + } + + r.textureMult = 1; + + if (pixelRatio <= 1) { + canvas = data.bufferCanvases[r.TEXTURE_BUFFER]; + r.textureMult = 2; + canvas.width = canvasWidth * r.textureMult; + canvas.height = canvasHeight * r.textureMult; + } + + r.canvasWidth = canvasWidth; + r.canvasHeight = canvasHeight; + }; + + CRp$4.renderTo = function (cxt, zoom, pan, pxRatio) { + this.render({ + forcedContext: cxt, + forcedZoom: zoom, + forcedPan: pan, + drawAllLayers: true, + forcedPxRatio: pxRatio + }); + }; + + CRp$4.render = function (options) { + options = options || staticEmptyObject(); + var forcedContext = options.forcedContext; + var drawAllLayers = options.drawAllLayers; + var drawOnlyNodeLayer = options.drawOnlyNodeLayer; + var forcedZoom = options.forcedZoom; + var forcedPan = options.forcedPan; + var r = this; + var pixelRatio = options.forcedPxRatio === undefined ? this.getPixelRatio() : options.forcedPxRatio; + var cy = r.cy; + var data = r.data; + var needDraw = data.canvasNeedsRedraw; + var textureDraw = r.textureOnViewport && !forcedContext && (r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming); + var motionBlur = options.motionBlur !== undefined ? options.motionBlur : r.motionBlur; + var mbPxRatio = r.motionBlurPxRatio; + var hasCompoundNodes = cy.hasCompoundNodes(); + var inNodeDragGesture = r.hoverData.draggingEles; + var inBoxSelection = r.hoverData.selecting || r.touchData.selecting ? true : false; + motionBlur = motionBlur && !forcedContext && r.motionBlurEnabled && !inBoxSelection; + var motionBlurFadeEffect = motionBlur; + + if (!forcedContext) { + if (r.prevPxRatio !== pixelRatio) { + r.invalidateContainerClientCoordsCache(); + r.matchCanvasSize(r.container); + r.redrawHint('eles', true); + r.redrawHint('drag', true); + } + + r.prevPxRatio = pixelRatio; + } + + if (!forcedContext && r.motionBlurTimeout) { + clearTimeout(r.motionBlurTimeout); + } + + if (motionBlur) { + if (r.mbFrames == null) { + r.mbFrames = 0; + } + + r.mbFrames++; + + if (r.mbFrames < 3) { + // need several frames before even high quality motionblur + motionBlurFadeEffect = false; + } // go to lower quality blurry frames when several m/b frames have been rendered (avoids flashing) + + + if (r.mbFrames > r.minMbLowQualFrames) { + //r.fullQualityMb = false; + r.motionBlurPxRatio = r.mbPxRBlurry; + } + } + + if (r.clearingMotionBlur) { + r.motionBlurPxRatio = 1; + } // b/c drawToContext() may be async w.r.t. redraw(), keep track of last texture frame + // because a rogue async texture frame would clear needDraw + + + if (r.textureDrawLastFrame && !textureDraw) { + needDraw[r.NODE] = true; + needDraw[r.SELECT_BOX] = true; + } + + var style = cy.style(); + var zoom = cy.zoom(); + var effectiveZoom = forcedZoom !== undefined ? forcedZoom : zoom; + var pan = cy.pan(); + var effectivePan = { + x: pan.x, + y: pan.y + }; + var vp = { + zoom: zoom, + pan: { + x: pan.x, + y: pan.y + } + }; + var prevVp = r.prevViewport; + var viewportIsDiff = prevVp === undefined || vp.zoom !== prevVp.zoom || vp.pan.x !== prevVp.pan.x || vp.pan.y !== prevVp.pan.y; // we want the low quality motionblur only when the viewport is being manipulated etc (where it's not noticed) + + if (!viewportIsDiff && !(inNodeDragGesture && !hasCompoundNodes)) { + r.motionBlurPxRatio = 1; + } + + if (forcedPan) { + effectivePan = forcedPan; + } // apply pixel ratio + + + effectiveZoom *= pixelRatio; + effectivePan.x *= pixelRatio; + effectivePan.y *= pixelRatio; + var eles = r.getCachedZSortedEles(); + + function mbclear(context, x, y, w, h) { + var gco = context.globalCompositeOperation; + context.globalCompositeOperation = 'destination-out'; + r.colorFillStyle(context, 255, 255, 255, r.motionBlurTransparency); + context.fillRect(x, y, w, h); + context.globalCompositeOperation = gco; + } + + function setContextTransform(context, clear) { + var ePan, eZoom, w, h; + + if (!r.clearingMotionBlur && (context === data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] || context === data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG])) { + ePan = { + x: pan.x * mbPxRatio, + y: pan.y * mbPxRatio + }; + eZoom = zoom * mbPxRatio; + w = r.canvasWidth * mbPxRatio; + h = r.canvasHeight * mbPxRatio; + } else { + ePan = effectivePan; + eZoom = effectiveZoom; + w = r.canvasWidth; + h = r.canvasHeight; + } + + context.setTransform(1, 0, 0, 1, 0, 0); + + if (clear === 'motionBlur') { + mbclear(context, 0, 0, w, h); + } else if (!forcedContext && (clear === undefined || clear)) { + context.clearRect(0, 0, w, h); + } + + if (!drawAllLayers) { + context.translate(ePan.x, ePan.y); + context.scale(eZoom, eZoom); + } + + if (forcedPan) { + context.translate(forcedPan.x, forcedPan.y); + } + + if (forcedZoom) { + context.scale(forcedZoom, forcedZoom); + } + } + + if (!textureDraw) { + r.textureDrawLastFrame = false; + } + + if (textureDraw) { + r.textureDrawLastFrame = true; + + if (!r.textureCache) { + r.textureCache = {}; + r.textureCache.bb = cy.mutableElements().boundingBox(); + r.textureCache.texture = r.data.bufferCanvases[r.TEXTURE_BUFFER]; + var cxt = r.data.bufferContexts[r.TEXTURE_BUFFER]; + cxt.setTransform(1, 0, 0, 1, 0, 0); + cxt.clearRect(0, 0, r.canvasWidth * r.textureMult, r.canvasHeight * r.textureMult); + r.render({ + forcedContext: cxt, + drawOnlyNodeLayer: true, + forcedPxRatio: pixelRatio * r.textureMult + }); + var vp = r.textureCache.viewport = { + zoom: cy.zoom(), + pan: cy.pan(), + width: r.canvasWidth, + height: r.canvasHeight + }; + vp.mpan = { + x: (0 - vp.pan.x) / vp.zoom, + y: (0 - vp.pan.y) / vp.zoom + }; + } + + needDraw[r.DRAG] = false; + needDraw[r.NODE] = false; + var context = data.contexts[r.NODE]; + var texture = r.textureCache.texture; + var vp = r.textureCache.viewport; + context.setTransform(1, 0, 0, 1, 0, 0); + + if (motionBlur) { + mbclear(context, 0, 0, vp.width, vp.height); + } else { + context.clearRect(0, 0, vp.width, vp.height); + } + + var outsideBgColor = style.core('outside-texture-bg-color').value; + var outsideBgOpacity = style.core('outside-texture-bg-opacity').value; + r.colorFillStyle(context, outsideBgColor[0], outsideBgColor[1], outsideBgColor[2], outsideBgOpacity); + context.fillRect(0, 0, vp.width, vp.height); + var zoom = cy.zoom(); + setContextTransform(context, false); + context.clearRect(vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio); + context.drawImage(texture, vp.mpan.x, vp.mpan.y, vp.width / vp.zoom / pixelRatio, vp.height / vp.zoom / pixelRatio); + } else if (r.textureOnViewport && !forcedContext) { + // clear the cache since we don't need it + r.textureCache = null; + } + + var extent = cy.extent(); + var vpManip = r.pinching || r.hoverData.dragging || r.swipePanning || r.data.wheelZooming || r.hoverData.draggingEles || r.cy.animated(); + var hideEdges = r.hideEdgesOnViewport && vpManip; + var needMbClear = []; + needMbClear[r.NODE] = !needDraw[r.NODE] && motionBlur && !r.clearedForMotionBlur[r.NODE] || r.clearingMotionBlur; + + if (needMbClear[r.NODE]) { + r.clearedForMotionBlur[r.NODE] = true; + } + + needMbClear[r.DRAG] = !needDraw[r.DRAG] && motionBlur && !r.clearedForMotionBlur[r.DRAG] || r.clearingMotionBlur; + + if (needMbClear[r.DRAG]) { + r.clearedForMotionBlur[r.DRAG] = true; + } + + if (needDraw[r.NODE] || drawAllLayers || drawOnlyNodeLayer || needMbClear[r.NODE]) { + var useBuffer = motionBlur && !needMbClear[r.NODE] && mbPxRatio !== 1; + var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_NODE] : data.contexts[r.NODE]); + var clear = motionBlur && !useBuffer ? 'motionBlur' : undefined; + setContextTransform(context, clear); + + if (hideEdges) { + r.drawCachedNodes(context, eles.nondrag, pixelRatio, extent); + } else { + r.drawLayeredElements(context, eles.nondrag, pixelRatio, extent); + } + + if (r.debug) { + r.drawDebugPoints(context, eles.nondrag); + } + + if (!drawAllLayers && !motionBlur) { + needDraw[r.NODE] = false; + } + } + + if (!drawOnlyNodeLayer && (needDraw[r.DRAG] || drawAllLayers || needMbClear[r.DRAG])) { + var useBuffer = motionBlur && !needMbClear[r.DRAG] && mbPxRatio !== 1; + var context = forcedContext || (useBuffer ? r.data.bufferContexts[r.MOTIONBLUR_BUFFER_DRAG] : data.contexts[r.DRAG]); + setContextTransform(context, motionBlur && !useBuffer ? 'motionBlur' : undefined); + + if (hideEdges) { + r.drawCachedNodes(context, eles.drag, pixelRatio, extent); + } else { + r.drawCachedElements(context, eles.drag, pixelRatio, extent); + } + + if (r.debug) { + r.drawDebugPoints(context, eles.drag); + } + + if (!drawAllLayers && !motionBlur) { + needDraw[r.DRAG] = false; + } + } + + if (r.showFps || !drawOnlyNodeLayer && needDraw[r.SELECT_BOX] && !drawAllLayers) { + var context = forcedContext || data.contexts[r.SELECT_BOX]; + setContextTransform(context); + + if (r.selection[4] == 1 && (r.hoverData.selecting || r.touchData.selecting)) { + var zoom = r.cy.zoom(); + var borderWidth = style.core('selection-box-border-width').value / zoom; + context.lineWidth = borderWidth; + context.fillStyle = 'rgba(' + style.core('selection-box-color').value[0] + ',' + style.core('selection-box-color').value[1] + ',' + style.core('selection-box-color').value[2] + ',' + style.core('selection-box-opacity').value + ')'; + context.fillRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]); + + if (borderWidth > 0) { + context.strokeStyle = 'rgba(' + style.core('selection-box-border-color').value[0] + ',' + style.core('selection-box-border-color').value[1] + ',' + style.core('selection-box-border-color').value[2] + ',' + style.core('selection-box-opacity').value + ')'; + context.strokeRect(r.selection[0], r.selection[1], r.selection[2] - r.selection[0], r.selection[3] - r.selection[1]); + } + } + + if (data.bgActivePosistion && !r.hoverData.selecting) { + var zoom = r.cy.zoom(); + var pos = data.bgActivePosistion; + context.fillStyle = 'rgba(' + style.core('active-bg-color').value[0] + ',' + style.core('active-bg-color').value[1] + ',' + style.core('active-bg-color').value[2] + ',' + style.core('active-bg-opacity').value + ')'; + context.beginPath(); + context.arc(pos.x, pos.y, style.core('active-bg-size').pfValue / zoom, 0, 2 * Math.PI); + context.fill(); + } + + var timeToRender = r.lastRedrawTime; + + if (r.showFps && timeToRender) { + timeToRender = Math.round(timeToRender); + var fps = Math.round(1000 / timeToRender); + context.setTransform(1, 0, 0, 1, 0, 0); + context.fillStyle = 'rgba(255, 0, 0, 0.75)'; + context.strokeStyle = 'rgba(255, 0, 0, 0.75)'; + context.lineWidth = 1; + context.fillText('1 frame = ' + timeToRender + ' ms = ' + fps + ' fps', 0, 20); + var maxFps = 60; + context.strokeRect(0, 30, 250, 20); + context.fillRect(0, 30, 250 * Math.min(fps / maxFps, 1), 20); + } + + if (!drawAllLayers) { + needDraw[r.SELECT_BOX] = false; + } + } // motionblur: blit rendered blurry frames + + + if (motionBlur && mbPxRatio !== 1) { + var cxtNode = data.contexts[r.NODE]; + var txtNode = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_NODE]; + var cxtDrag = data.contexts[r.DRAG]; + var txtDrag = r.data.bufferCanvases[r.MOTIONBLUR_BUFFER_DRAG]; + + var drawMotionBlur = function drawMotionBlur(cxt, txt, needClear) { + cxt.setTransform(1, 0, 0, 1, 0, 0); + + if (needClear || !motionBlurFadeEffect) { + cxt.clearRect(0, 0, r.canvasWidth, r.canvasHeight); + } else { + mbclear(cxt, 0, 0, r.canvasWidth, r.canvasHeight); + } + + var pxr = mbPxRatio; + cxt.drawImage(txt, // img + 0, 0, // sx, sy + r.canvasWidth * pxr, r.canvasHeight * pxr, // sw, sh + 0, 0, // x, y + r.canvasWidth, r.canvasHeight // w, h + ); + }; + + if (needDraw[r.NODE] || needMbClear[r.NODE]) { + drawMotionBlur(cxtNode, txtNode, needMbClear[r.NODE]); + needDraw[r.NODE] = false; + } + + if (needDraw[r.DRAG] || needMbClear[r.DRAG]) { + drawMotionBlur(cxtDrag, txtDrag, needMbClear[r.DRAG]); + needDraw[r.DRAG] = false; + } + } + + r.prevViewport = vp; + + if (r.clearingMotionBlur) { + r.clearingMotionBlur = false; + r.motionBlurCleared = true; + r.motionBlur = true; + } + + if (motionBlur) { + r.motionBlurTimeout = setTimeout(function () { + r.motionBlurTimeout = null; + r.clearedForMotionBlur[r.NODE] = false; + r.clearedForMotionBlur[r.DRAG] = false; + r.motionBlur = false; + r.clearingMotionBlur = !textureDraw; + r.mbFrames = 0; + needDraw[r.NODE] = true; + needDraw[r.DRAG] = true; + r.redraw(); + }, motionBlurDelay); + } + + if (!forcedContext) { + cy.emit('render'); + } + }; + + var CRp$3 = {}; // @O Polygon drawing + + CRp$3.drawPolygonPath = function (context, x, y, width, height, points) { + var halfW = width / 2; + var halfH = height / 2; + + if (context.beginPath) { + context.beginPath(); + } + + context.moveTo(x + halfW * points[0], y + halfH * points[1]); + + for (var i = 1; i < points.length / 2; i++) { + context.lineTo(x + halfW * points[i * 2], y + halfH * points[i * 2 + 1]); + } + + context.closePath(); + }; + + CRp$3.drawRoundPolygonPath = function (context, x, y, width, height, points) { + var halfW = width / 2; + var halfH = height / 2; + var cornerRadius = getRoundPolygonRadius(width, height); + + if (context.beginPath) { + context.beginPath(); + } + + for (var _i = 0; _i < points.length / 4; _i++) { + var sourceUv = void 0, + destUv = void 0; + + if (_i === 0) { + sourceUv = points.length - 2; + } else { + sourceUv = _i * 4 - 2; + } + + destUv = _i * 4 + 2; + var px = x + halfW * points[_i * 4]; + var py = y + halfH * points[_i * 4 + 1]; + var cosTheta = -points[sourceUv] * points[destUv] - points[sourceUv + 1] * points[destUv + 1]; + var offset = cornerRadius / Math.tan(Math.acos(cosTheta) / 2); + var cp0x = px - offset * points[sourceUv]; + var cp0y = py - offset * points[sourceUv + 1]; + var cp1x = px + offset * points[destUv]; + var cp1y = py + offset * points[destUv + 1]; + + if (_i === 0) { + context.moveTo(cp0x, cp0y); + } else { + context.lineTo(cp0x, cp0y); + } + + context.arcTo(px, py, cp1x, cp1y, cornerRadius); + } + + context.closePath(); + }; // Round rectangle drawing + + + CRp$3.drawRoundRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerRadius = getRoundRectangleRadius(width, height); + + if (context.beginPath) { + context.beginPath(); + } // Start at top middle + + + context.moveTo(x, y - halfHeight); // Arc from middle top to right side + + context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius); // Arc from right side to bottom + + context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); // Arc from bottom to left side + + context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); // Arc from left side to topBorder + + context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius); // Join line + + context.lineTo(x, y - halfHeight); + context.closePath(); + }; + + CRp$3.drawBottomRoundRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerRadius = getRoundRectangleRadius(width, height); + + if (context.beginPath) { + context.beginPath(); + } // Start at top middle + + + context.moveTo(x, y - halfHeight); + context.lineTo(x + halfWidth, y - halfHeight); + context.lineTo(x + halfWidth, y); + context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius); + context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius); + context.lineTo(x - halfWidth, y - halfHeight); + context.lineTo(x, y - halfHeight); + context.closePath(); + }; + + CRp$3.drawCutRectanglePath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var cornerLength = getCutRectangleCornerLength(); + + if (context.beginPath) { + context.beginPath(); + } + + context.moveTo(x - halfWidth + cornerLength, y - halfHeight); + context.lineTo(x + halfWidth - cornerLength, y - halfHeight); + context.lineTo(x + halfWidth, y - halfHeight + cornerLength); + context.lineTo(x + halfWidth, y + halfHeight - cornerLength); + context.lineTo(x + halfWidth - cornerLength, y + halfHeight); + context.lineTo(x - halfWidth + cornerLength, y + halfHeight); + context.lineTo(x - halfWidth, y + halfHeight - cornerLength); + context.lineTo(x - halfWidth, y - halfHeight + cornerLength); + context.closePath(); + }; + + CRp$3.drawBarrelPath = function (context, x, y, width, height) { + var halfWidth = width / 2; + var halfHeight = height / 2; + var xBegin = x - halfWidth; + var xEnd = x + halfWidth; + var yBegin = y - halfHeight; + var yEnd = y + halfHeight; + var barrelCurveConstants = getBarrelCurveConstants(width, height); + var wOffset = barrelCurveConstants.widthOffset; + var hOffset = barrelCurveConstants.heightOffset; + var ctrlPtXOffset = barrelCurveConstants.ctrlPtOffsetPct * wOffset; + + if (context.beginPath) { + context.beginPath(); + } + + context.moveTo(xBegin, yBegin + hOffset); + context.lineTo(xBegin, yEnd - hOffset); + context.quadraticCurveTo(xBegin + ctrlPtXOffset, yEnd, xBegin + wOffset, yEnd); + context.lineTo(xEnd - wOffset, yEnd); + context.quadraticCurveTo(xEnd - ctrlPtXOffset, yEnd, xEnd, yEnd - hOffset); + context.lineTo(xEnd, yBegin + hOffset); + context.quadraticCurveTo(xEnd - ctrlPtXOffset, yBegin, xEnd - wOffset, yBegin); + context.lineTo(xBegin + wOffset, yBegin); + context.quadraticCurveTo(xBegin + ctrlPtXOffset, yBegin, xBegin, yBegin + hOffset); + context.closePath(); + }; + + var sin0 = Math.sin(0); + var cos0 = Math.cos(0); + var sin = {}; + var cos = {}; + var ellipseStepSize = Math.PI / 40; + + for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) { + sin[i] = Math.sin(i); + cos[i] = Math.cos(i); + } + + CRp$3.drawEllipsePath = function (context, centerX, centerY, width, height) { + if (context.beginPath) { + context.beginPath(); + } + + if (context.ellipse) { + context.ellipse(centerX, centerY, width / 2, height / 2, 0, 0, 2 * Math.PI); + } else { + var xPos, yPos; + var rw = width / 2; + var rh = height / 2; + + for (var i = 0 * Math.PI; i < 2 * Math.PI; i += ellipseStepSize) { + xPos = centerX - rw * sin[i] * sin0 + rw * cos[i] * cos0; + yPos = centerY + rh * cos[i] * sin0 + rh * sin[i] * cos0; + + if (i === 0) { + context.moveTo(xPos, yPos); + } else { + context.lineTo(xPos, yPos); + } + } + } + + context.closePath(); + }; + + /* global atob, ArrayBuffer, Uint8Array, Blob */ + var CRp$2 = {}; + + CRp$2.createBuffer = function (w, h) { + var buffer = document.createElement('canvas'); // eslint-disable-line no-undef + + buffer.width = w; + buffer.height = h; + return [buffer, buffer.getContext('2d')]; + }; + + CRp$2.bufferCanvasImage = function (options) { + var cy = this.cy; + var eles = cy.mutableElements(); + var bb = eles.boundingBox(); + var ctrRect = this.findContainerClientCoords(); + var width = options.full ? Math.ceil(bb.w) : ctrRect[2]; + var height = options.full ? Math.ceil(bb.h) : ctrRect[3]; + var specdMaxDims = number$1(options.maxWidth) || number$1(options.maxHeight); + var pxRatio = this.getPixelRatio(); + var scale = 1; + + if (options.scale !== undefined) { + width *= options.scale; + height *= options.scale; + scale = options.scale; + } else if (specdMaxDims) { + var maxScaleW = Infinity; + var maxScaleH = Infinity; + + if (number$1(options.maxWidth)) { + maxScaleW = scale * options.maxWidth / width; + } + + if (number$1(options.maxHeight)) { + maxScaleH = scale * options.maxHeight / height; + } + + scale = Math.min(maxScaleW, maxScaleH); + width *= scale; + height *= scale; + } + + if (!specdMaxDims) { + width *= pxRatio; + height *= pxRatio; + scale *= pxRatio; + } + + var buffCanvas = document.createElement('canvas'); // eslint-disable-line no-undef + + buffCanvas.width = width; + buffCanvas.height = height; + buffCanvas.style.width = width + 'px'; + buffCanvas.style.height = height + 'px'; + var buffCxt = buffCanvas.getContext('2d'); // Rasterize the layers, but only if container has nonzero size + + if (width > 0 && height > 0) { + buffCxt.clearRect(0, 0, width, height); + buffCxt.globalCompositeOperation = 'source-over'; + var zsortedEles = this.getCachedZSortedEles(); + + if (options.full) { + // draw the full bounds of the graph + buffCxt.translate(-bb.x1 * scale, -bb.y1 * scale); + buffCxt.scale(scale, scale); + this.drawElements(buffCxt, zsortedEles); + buffCxt.scale(1 / scale, 1 / scale); + buffCxt.translate(bb.x1 * scale, bb.y1 * scale); + } else { + // draw the current view + var pan = cy.pan(); + var translation = { + x: pan.x * scale, + y: pan.y * scale + }; + scale *= cy.zoom(); + buffCxt.translate(translation.x, translation.y); + buffCxt.scale(scale, scale); + this.drawElements(buffCxt, zsortedEles); + buffCxt.scale(1 / scale, 1 / scale); + buffCxt.translate(-translation.x, -translation.y); + } // need to fill bg at end like this in order to fill cleared transparent pixels in jpgs + + + if (options.bg) { + buffCxt.globalCompositeOperation = 'destination-over'; + buffCxt.fillStyle = options.bg; + buffCxt.rect(0, 0, width, height); + buffCxt.fill(); + } + } + + return buffCanvas; + }; + + function b64ToBlob(b64, mimeType) { + var bytes = atob(b64); + var buff = new ArrayBuffer(bytes.length); + var buffUint8 = new Uint8Array(buff); + + for (var i = 0; i < bytes.length; i++) { + buffUint8[i] = bytes.charCodeAt(i); + } + + return new Blob([buff], { + type: mimeType + }); + } + + function b64UriToB64(b64uri) { + var i = b64uri.indexOf(','); + return b64uri.substr(i + 1); + } + + function output(options, canvas, mimeType) { + var getB64Uri = function getB64Uri() { + return canvas.toDataURL(mimeType, options.quality); + }; + + switch (options.output) { + case 'blob-promise': + return new Promise$1(function (resolve, reject) { + try { + canvas.toBlob(function (blob) { + if (blob != null) { + resolve(blob); + } else { + reject(new Error('`canvas.toBlob()` sent a null value in its callback')); + } + }, mimeType, options.quality); + } catch (err) { + reject(err); + } + }); + + case 'blob': + return b64ToBlob(b64UriToB64(getB64Uri()), mimeType); + + case 'base64': + return b64UriToB64(getB64Uri()); + + case 'base64uri': + default: + return getB64Uri(); + } + } + + CRp$2.png = function (options) { + return output(options, this.bufferCanvasImage(options), 'image/png'); + }; + + CRp$2.jpg = function (options) { + return output(options, this.bufferCanvasImage(options), 'image/jpeg'); + }; + + var CRp$1 = {}; + + CRp$1.nodeShapeImpl = function (name, context, centerX, centerY, width, height, points) { + switch (name) { + case 'ellipse': + return this.drawEllipsePath(context, centerX, centerY, width, height); + + case 'polygon': + return this.drawPolygonPath(context, centerX, centerY, width, height, points); + + case 'round-polygon': + return this.drawRoundPolygonPath(context, centerX, centerY, width, height, points); + + case 'roundrectangle': + case 'round-rectangle': + return this.drawRoundRectanglePath(context, centerX, centerY, width, height); + + case 'cutrectangle': + case 'cut-rectangle': + return this.drawCutRectanglePath(context, centerX, centerY, width, height); + + case 'bottomroundrectangle': + case 'bottom-round-rectangle': + return this.drawBottomRoundRectanglePath(context, centerX, centerY, width, height); + + case 'barrel': + return this.drawBarrelPath(context, centerX, centerY, width, height); + } + }; + + var CR = CanvasRenderer; + var CRp = CanvasRenderer.prototype; + CRp.CANVAS_LAYERS = 3; // + + CRp.SELECT_BOX = 0; + CRp.DRAG = 1; + CRp.NODE = 2; + CRp.BUFFER_COUNT = 3; // + + CRp.TEXTURE_BUFFER = 0; + CRp.MOTIONBLUR_BUFFER_NODE = 1; + CRp.MOTIONBLUR_BUFFER_DRAG = 2; + + function CanvasRenderer(options) { + var r = this; + r.data = { + canvases: new Array(CRp.CANVAS_LAYERS), + contexts: new Array(CRp.CANVAS_LAYERS), + canvasNeedsRedraw: new Array(CRp.CANVAS_LAYERS), + bufferCanvases: new Array(CRp.BUFFER_COUNT), + bufferContexts: new Array(CRp.CANVAS_LAYERS) + }; + var tapHlOffAttr = '-webkit-tap-highlight-color'; + var tapHlOffStyle = 'rgba(0,0,0,0)'; + r.data.canvasContainer = document.createElement('div'); // eslint-disable-line no-undef + + var containerStyle = r.data.canvasContainer.style; + r.data.canvasContainer.style[tapHlOffAttr] = tapHlOffStyle; + containerStyle.position = 'relative'; + containerStyle.zIndex = '0'; + containerStyle.overflow = 'hidden'; + var container = options.cy.container(); + container.appendChild(r.data.canvasContainer); + container.style[tapHlOffAttr] = tapHlOffStyle; + var styleMap = { + '-webkit-user-select': 'none', + '-moz-user-select': '-moz-none', + 'user-select': 'none', + '-webkit-tap-highlight-color': 'rgba(0,0,0,0)', + 'outline-style': 'none' + }; + + if (ms()) { + styleMap['-ms-touch-action'] = 'none'; + styleMap['touch-action'] = 'none'; + } + + for (var i = 0; i < CRp.CANVAS_LAYERS; i++) { + var canvas = r.data.canvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef + + r.data.contexts[i] = canvas.getContext('2d'); + Object.keys(styleMap).forEach(function (k) { + canvas.style[k] = styleMap[k]; + }); + canvas.style.position = 'absolute'; + canvas.setAttribute('data-id', 'layer' + i); + canvas.style.zIndex = String(CRp.CANVAS_LAYERS - i); + r.data.canvasContainer.appendChild(canvas); + r.data.canvasNeedsRedraw[i] = false; + } + + r.data.topCanvas = r.data.canvases[0]; + r.data.canvases[CRp.NODE].setAttribute('data-id', 'layer' + CRp.NODE + '-node'); + r.data.canvases[CRp.SELECT_BOX].setAttribute('data-id', 'layer' + CRp.SELECT_BOX + '-selectbox'); + r.data.canvases[CRp.DRAG].setAttribute('data-id', 'layer' + CRp.DRAG + '-drag'); + + for (var i = 0; i < CRp.BUFFER_COUNT; i++) { + r.data.bufferCanvases[i] = document.createElement('canvas'); // eslint-disable-line no-undef + + r.data.bufferContexts[i] = r.data.bufferCanvases[i].getContext('2d'); + r.data.bufferCanvases[i].style.position = 'absolute'; + r.data.bufferCanvases[i].setAttribute('data-id', 'buffer' + i); + r.data.bufferCanvases[i].style.zIndex = String(-i - 1); + r.data.bufferCanvases[i].style.visibility = 'hidden'; //r.data.canvasContainer.appendChild(r.data.bufferCanvases[i]); + } + + r.pathsEnabled = true; + var emptyBb = makeBoundingBox(); + + var getBoxCenter = function getBoxCenter(bb) { + return { + x: (bb.x1 + bb.x2) / 2, + y: (bb.y1 + bb.y2) / 2 + }; + }; + + var getCenterOffset = function getCenterOffset(bb) { + return { + x: -bb.w / 2, + y: -bb.h / 2 + }; + }; + + var backgroundTimestampHasChanged = function backgroundTimestampHasChanged(ele) { + var _p = ele[0]._private; + var same = _p.oldBackgroundTimestamp === _p.backgroundTimestamp; + return !same; + }; + + var getStyleKey = function getStyleKey(ele) { + return ele[0]._private.nodeKey; + }; + + var getLabelKey = function getLabelKey(ele) { + return ele[0]._private.labelStyleKey; + }; + + var getSourceLabelKey = function getSourceLabelKey(ele) { + return ele[0]._private.sourceLabelStyleKey; + }; + + var getTargetLabelKey = function getTargetLabelKey(ele) { + return ele[0]._private.targetLabelStyleKey; + }; + + var drawElement = function drawElement(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElement(context, ele, bb, false, false, useEleOpacity); + }; + + var drawLabel = function drawLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'main', useEleOpacity); + }; + + var drawSourceLabel = function drawSourceLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'source', useEleOpacity); + }; + + var drawTargetLabel = function drawTargetLabel(context, ele, bb, scaledLabelShown, useEleOpacity) { + return r.drawElementText(context, ele, bb, scaledLabelShown, 'target', useEleOpacity); + }; + + var getElementBox = function getElementBox(ele) { + ele.boundingBox(); + return ele[0]._private.bodyBounds; + }; + + var getLabelBox = function getLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.main || emptyBb; + }; + + var getSourceLabelBox = function getSourceLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.source || emptyBb; + }; + + var getTargetLabelBox = function getTargetLabelBox(ele) { + ele.boundingBox(); + return ele[0]._private.labelBounds.target || emptyBb; + }; + + var isLabelVisibleAtScale = function isLabelVisibleAtScale(ele, scaledLabelShown) { + return scaledLabelShown; + }; + + var getElementRotationPoint = function getElementRotationPoint(ele) { + return getBoxCenter(getElementBox(ele)); + }; + + var addTextMargin = function addTextMargin(prefix, pt, ele) { + var pre = prefix ? prefix + '-' : ''; + return { + x: pt.x + ele.pstyle(pre + 'text-margin-x').pfValue, + y: pt.y + ele.pstyle(pre + 'text-margin-y').pfValue + }; + }; + + var getRsPt = function getRsPt(ele, x, y) { + var rs = ele[0]._private.rscratch; + return { + x: rs[x], + y: rs[y] + }; + }; + + var getLabelRotationPoint = function getLabelRotationPoint(ele) { + return addTextMargin('', getRsPt(ele, 'labelX', 'labelY'), ele); + }; + + var getSourceLabelRotationPoint = function getSourceLabelRotationPoint(ele) { + return addTextMargin('source', getRsPt(ele, 'sourceLabelX', 'sourceLabelY'), ele); + }; + + var getTargetLabelRotationPoint = function getTargetLabelRotationPoint(ele) { + return addTextMargin('target', getRsPt(ele, 'targetLabelX', 'targetLabelY'), ele); + }; + + var getElementRotationOffset = function getElementRotationOffset(ele) { + return getCenterOffset(getElementBox(ele)); + }; + + var getSourceLabelRotationOffset = function getSourceLabelRotationOffset(ele) { + return getCenterOffset(getSourceLabelBox(ele)); + }; + + var getTargetLabelRotationOffset = function getTargetLabelRotationOffset(ele) { + return getCenterOffset(getTargetLabelBox(ele)); + }; + + var getLabelRotationOffset = function getLabelRotationOffset(ele) { + var bb = getLabelBox(ele); + var p = getCenterOffset(getLabelBox(ele)); + + if (ele.isNode()) { + switch (ele.pstyle('text-halign').value) { + case 'left': + p.x = -bb.w; + break; + + case 'right': + p.x = 0; + break; + } + + switch (ele.pstyle('text-valign').value) { + case 'top': + p.y = -bb.h; + break; + + case 'bottom': + p.y = 0; + break; + } + } + + return p; + }; + + var eleTxrCache = r.data.eleTxrCache = new ElementTextureCache(r, { + getKey: getStyleKey, + doesEleInvalidateKey: backgroundTimestampHasChanged, + drawElement: drawElement, + getBoundingBox: getElementBox, + getRotationPoint: getElementRotationPoint, + getRotationOffset: getElementRotationOffset, + allowEdgeTxrCaching: false, + allowParentTxrCaching: false + }); + var lblTxrCache = r.data.lblTxrCache = new ElementTextureCache(r, { + getKey: getLabelKey, + drawElement: drawLabel, + getBoundingBox: getLabelBox, + getRotationPoint: getLabelRotationPoint, + getRotationOffset: getLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var slbTxrCache = r.data.slbTxrCache = new ElementTextureCache(r, { + getKey: getSourceLabelKey, + drawElement: drawSourceLabel, + getBoundingBox: getSourceLabelBox, + getRotationPoint: getSourceLabelRotationPoint, + getRotationOffset: getSourceLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var tlbTxrCache = r.data.tlbTxrCache = new ElementTextureCache(r, { + getKey: getTargetLabelKey, + drawElement: drawTargetLabel, + getBoundingBox: getTargetLabelBox, + getRotationPoint: getTargetLabelRotationPoint, + getRotationOffset: getTargetLabelRotationOffset, + isVisible: isLabelVisibleAtScale + }); + var lyrTxrCache = r.data.lyrTxrCache = new LayeredTextureCache(r); + r.onUpdateEleCalcs(function invalidateTextureCaches(willDraw, eles) { + // each cache should check for sub-key diff to see that the update affects that cache particularly + eleTxrCache.invalidateElements(eles); + lblTxrCache.invalidateElements(eles); + slbTxrCache.invalidateElements(eles); + tlbTxrCache.invalidateElements(eles); // any change invalidates the layers + + lyrTxrCache.invalidateElements(eles); // update the old bg timestamp so diffs can be done in the ele txr caches + + for (var _i = 0; _i < eles.length; _i++) { + var _p = eles[_i]._private; + _p.oldBackgroundTimestamp = _p.backgroundTimestamp; + } + }); + + var refineInLayers = function refineInLayers(reqs) { + for (var i = 0; i < reqs.length; i++) { + lyrTxrCache.enqueueElementRefinement(reqs[i].ele); + } + }; + + eleTxrCache.onDequeue(refineInLayers); + lblTxrCache.onDequeue(refineInLayers); + slbTxrCache.onDequeue(refineInLayers); + tlbTxrCache.onDequeue(refineInLayers); + } + + CRp.redrawHint = function (group, bool) { + var r = this; + + switch (group) { + case 'eles': + r.data.canvasNeedsRedraw[CRp.NODE] = bool; + break; + + case 'drag': + r.data.canvasNeedsRedraw[CRp.DRAG] = bool; + break; + + case 'select': + r.data.canvasNeedsRedraw[CRp.SELECT_BOX] = bool; + break; + } + }; // whether to use Path2D caching for drawing + + + var pathsImpld = typeof Path2D !== 'undefined'; + + CRp.path2dEnabled = function (on) { + if (on === undefined) { + return this.pathsEnabled; + } + + this.pathsEnabled = on ? true : false; + }; + + CRp.usePaths = function () { + return pathsImpld && this.pathsEnabled; + }; + + CRp.setImgSmoothing = function (context, bool) { + if (context.imageSmoothingEnabled != null) { + context.imageSmoothingEnabled = bool; + } else { + context.webkitImageSmoothingEnabled = bool; + context.mozImageSmoothingEnabled = bool; + context.msImageSmoothingEnabled = bool; + } + }; + + CRp.getImgSmoothing = function (context) { + if (context.imageSmoothingEnabled != null) { + return context.imageSmoothingEnabled; + } else { + return context.webkitImageSmoothingEnabled || context.mozImageSmoothingEnabled || context.msImageSmoothingEnabled; + } + }; + + CRp.makeOffscreenCanvas = function (width, height) { + var canvas; + + if ((typeof OffscreenCanvas === "undefined" ? "undefined" : _typeof(OffscreenCanvas)) !== ("undefined" )) { + canvas = new OffscreenCanvas(width, height); + } else { + canvas = document.createElement('canvas'); // eslint-disable-line no-undef + + canvas.width = width; + canvas.height = height; + } + + return canvas; + }; + + [CRp$a, CRp$9, CRp$8, CRp$7, CRp$6, CRp$5, CRp$4, CRp$3, CRp$2, CRp$1].forEach(function (props) { + extend(CRp, props); + }); + + var renderer = [{ + name: 'null', + impl: NullRenderer + }, { + name: 'base', + impl: BR + }, { + name: 'canvas', + impl: CR + }]; + + var incExts = [{ + type: 'layout', + extensions: layout + }, { + type: 'renderer', + extensions: renderer + }]; + + var extensions = {}; // registered modules for extensions, indexed by name + + var modules = {}; + + function setExtension(type, name, registrant) { + var ext = registrant; + + var overrideErr = function overrideErr(field) { + warn('Can not register `' + name + '` for `' + type + '` since `' + field + '` already exists in the prototype and can not be overridden'); + }; + + if (type === 'core') { + if (Core.prototype[name]) { + return overrideErr(name); + } else { + Core.prototype[name] = registrant; + } + } else if (type === 'collection') { + if (Collection.prototype[name]) { + return overrideErr(name); + } else { + Collection.prototype[name] = registrant; + } + } else if (type === 'layout') { + // fill in missing layout functions in the prototype + var Layout = function Layout(options) { + this.options = options; + registrant.call(this, options); // make sure layout has _private for use w/ std apis like .on() + + if (!plainObject(this._private)) { + this._private = {}; + } + + this._private.cy = options.cy; + this._private.listeners = []; + this.createEmitter(); + }; + + var layoutProto = Layout.prototype = Object.create(registrant.prototype); + var optLayoutFns = []; + + for (var i = 0; i < optLayoutFns.length; i++) { + var fnName = optLayoutFns[i]; + + layoutProto[fnName] = layoutProto[fnName] || function () { + return this; + }; + } // either .start() or .run() is defined, so autogen the other + + + if (layoutProto.start && !layoutProto.run) { + layoutProto.run = function () { + this.start(); + return this; + }; + } else if (!layoutProto.start && layoutProto.run) { + layoutProto.start = function () { + this.run(); + return this; + }; + } + + var regStop = registrant.prototype.stop; + + layoutProto.stop = function () { + var opts = this.options; + + if (opts && opts.animate) { + var anis = this.animations; + + if (anis) { + for (var _i = 0; _i < anis.length; _i++) { + anis[_i].stop(); + } + } + } + + if (regStop) { + regStop.call(this); + } else { + this.emit('layoutstop'); + } + + return this; + }; + + if (!layoutProto.destroy) { + layoutProto.destroy = function () { + return this; + }; + } + + layoutProto.cy = function () { + return this._private.cy; + }; + + var getCy = function getCy(layout) { + return layout._private.cy; + }; + + var emitterOpts = { + addEventFields: function addEventFields(layout, evt) { + evt.layout = layout; + evt.cy = getCy(layout); + evt.target = layout; + }, + bubble: function bubble() { + return true; + }, + parent: function parent(layout) { + return getCy(layout); + } + }; + extend(layoutProto, { + createEmitter: function createEmitter() { + this._private.emitter = new Emitter(emitterOpts, this); + return this; + }, + emitter: function emitter() { + return this._private.emitter; + }, + on: function on(evt, cb) { + this.emitter().on(evt, cb); + return this; + }, + one: function one(evt, cb) { + this.emitter().one(evt, cb); + return this; + }, + once: function once(evt, cb) { + this.emitter().one(evt, cb); + return this; + }, + removeListener: function removeListener(evt, cb) { + this.emitter().removeListener(evt, cb); + return this; + }, + removeAllListeners: function removeAllListeners() { + this.emitter().removeAllListeners(); + return this; + }, + emit: function emit(evt, params) { + this.emitter().emit(evt, params); + return this; + } + }); + define.eventAliasesOn(layoutProto); + ext = Layout; // replace with our wrapped layout + } else if (type === 'renderer' && name !== 'null' && name !== 'base') { + // user registered renderers inherit from base + var BaseRenderer = getExtension('renderer', 'base'); + var bProto = BaseRenderer.prototype; + var RegistrantRenderer = registrant; + var rProto = registrant.prototype; + + var Renderer = function Renderer() { + BaseRenderer.apply(this, arguments); + RegistrantRenderer.apply(this, arguments); + }; + + var proto = Renderer.prototype; + + for (var pName in bProto) { + var pVal = bProto[pName]; + var existsInR = rProto[pName] != null; + + if (existsInR) { + return overrideErr(pName); + } + + proto[pName] = pVal; // take impl from base + } + + for (var _pName in rProto) { + proto[_pName] = rProto[_pName]; // take impl from registrant + } + + bProto.clientFunctions.forEach(function (name) { + proto[name] = proto[name] || function () { + error('Renderer does not implement `renderer.' + name + '()` on its prototype'); + }; + }); + ext = Renderer; + } else if (type === '__proto__' || type === 'constructor' || type === 'prototype') { + // to avoid potential prototype pollution + return error(type + ' is an illegal type to be registered, possibly lead to prototype pollutions'); + } + + return setMap({ + map: extensions, + keys: [type, name], + value: ext + }); + } + + function getExtension(type, name) { + return getMap({ + map: extensions, + keys: [type, name] + }); + } + + function setModule(type, name, moduleType, moduleName, registrant) { + return setMap({ + map: modules, + keys: [type, name, moduleType, moduleName], + value: registrant + }); + } + + function getModule(type, name, moduleType, moduleName) { + return getMap({ + map: modules, + keys: [type, name, moduleType, moduleName] + }); + } + + var extension = function extension() { + // e.g. extension('renderer', 'svg') + if (arguments.length === 2) { + return getExtension.apply(null, arguments); + } // e.g. extension('renderer', 'svg', { ... }) + else if (arguments.length === 3) { + return setExtension.apply(null, arguments); + } // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse') + else if (arguments.length === 4) { + return getModule.apply(null, arguments); + } // e.g. extension('renderer', 'svg', 'nodeShape', 'ellipse', { ... }) + else if (arguments.length === 5) { + return setModule.apply(null, arguments); + } else { + error('Invalid extension access syntax'); + } + }; // allows a core instance to access extensions internally + + + Core.prototype.extension = extension; // included extensions + + incExts.forEach(function (group) { + group.extensions.forEach(function (ext) { + setExtension(group.type, ext.name, ext.impl); + }); + }); + + // (useful for init) + + var Stylesheet = function Stylesheet() { + if (!(this instanceof Stylesheet)) { + return new Stylesheet(); + } + + this.length = 0; + }; + + var sheetfn = Stylesheet.prototype; + + sheetfn.instanceString = function () { + return 'stylesheet'; + }; // just store the selector to be parsed later + + + sheetfn.selector = function (selector) { + var i = this.length++; + this[i] = { + selector: selector, + properties: [] + }; + return this; // chaining + }; // just store the property to be parsed later + + + sheetfn.css = function (name, value) { + var i = this.length - 1; + + if (string(name)) { + this[i].properties.push({ + name: name, + value: value + }); + } else if (plainObject(name)) { + var map = name; + var propNames = Object.keys(map); + + for (var j = 0; j < propNames.length; j++) { + var key = propNames[j]; + var mapVal = map[key]; + + if (mapVal == null) { + continue; + } + + var prop = Style.properties[key] || Style.properties[dash2camel(key)]; + + if (prop == null) { + continue; + } + + var _name = prop.name; + var _value = mapVal; + this[i].properties.push({ + name: _name, + value: _value + }); + } + } + + return this; // chaining + }; + + sheetfn.style = sheetfn.css; // generate a real style object from the dummy stylesheet + + sheetfn.generateStyle = function (cy) { + var style = new Style(cy); + return this.appendToStyle(style); + }; // append a dummy stylesheet object on a real style object + + + sheetfn.appendToStyle = function (style) { + for (var i = 0; i < this.length; i++) { + var context = this[i]; + var selector = context.selector; + var props = context.properties; + style.selector(selector); // apply selector + + for (var j = 0; j < props.length; j++) { + var prop = props[j]; + style.css(prop.name, prop.value); // apply property + } + } + + return style; + }; + + var version = "3.26.0"; + + var cytoscape = function cytoscape(options) { + // if no options specified, use default + if (options === undefined) { + options = {}; + } // create instance + + + if (plainObject(options)) { + return new Core(options); + } // allow for registration of extensions + else if (string(options)) { + return extension.apply(extension, arguments); + } + }; // e.g. cytoscape.use( require('cytoscape-foo'), bar ) + + + cytoscape.use = function (ext) { + var args = Array.prototype.slice.call(arguments, 1); // args to pass to ext + + args.unshift(cytoscape); // cytoscape is first arg to ext + + ext.apply(null, args); + return this; + }; + + cytoscape.warnings = function (bool) { + return warnings(bool); + }; // replaced by build system + + + cytoscape.version = version; // expose public apis (mostly for extensions) + + cytoscape.stylesheet = cytoscape.Stylesheet = Stylesheet; + + return cytoscape; + +})); + + +/***/ }), + +/***/ 82241: +/***/ (function(module) { + +(function webpackUniversalModuleDefinition(root, factory) { + if(true) + module.exports = factory(); + else {} +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __nested_webpack_require_543__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_543__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __nested_webpack_require_543__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __nested_webpack_require_543__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __nested_webpack_require_543__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __nested_webpack_require_543__.d = function(exports, name, getter) { +/******/ if(!__nested_webpack_require_543__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __nested_webpack_require_543__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __nested_webpack_require_543__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __nested_webpack_require_543__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __nested_webpack_require_543__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __nested_webpack_require_543__(__nested_webpack_require_543__.s = 26); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function LayoutConstants() {} + +/** + * Layout Quality: 0:draft, 1:default, 2:proof + */ +LayoutConstants.QUALITY = 1; + +/** + * Default parameters + */ +LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED = false; +LayoutConstants.DEFAULT_INCREMENTAL = false; +LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT = true; +LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT = false; +LayoutConstants.DEFAULT_ANIMATION_PERIOD = 50; +LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES = false; + +// ----------------------------------------------------------------------------- +// Section: General other constants +// ----------------------------------------------------------------------------- +/* + * Margins of a graph to be applied on bouding rectangle of its contents. We + * assume margins on all four sides to be uniform. + */ +LayoutConstants.DEFAULT_GRAPH_MARGIN = 15; + +/* + * Whether to consider labels in node dimensions or not + */ +LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = false; + +/* + * Default dimension of a non-compound node. + */ +LayoutConstants.SIMPLE_NODE_SIZE = 40; + +/* + * Default dimension of a non-compound node. + */ +LayoutConstants.SIMPLE_NODE_HALF_SIZE = LayoutConstants.SIMPLE_NODE_SIZE / 2; + +/* + * Empty compound node size. When a compound node is empty, its both + * dimensions should be of this value. + */ +LayoutConstants.EMPTY_COMPOUND_NODE_SIZE = 40; + +/* + * Minimum length that an edge should take during layout + */ +LayoutConstants.MIN_EDGE_LENGTH = 1; + +/* + * World boundaries that layout operates on + */ +LayoutConstants.WORLD_BOUNDARY = 1000000; + +/* + * World boundaries that random positioning can be performed with + */ +LayoutConstants.INITIAL_WORLD_BOUNDARY = LayoutConstants.WORLD_BOUNDARY / 1000; + +/* + * Coordinates of the world center + */ +LayoutConstants.WORLD_CENTER_X = 1200; +LayoutConstants.WORLD_CENTER_Y = 900; + +module.exports = LayoutConstants; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __nested_webpack_require_4947__) { + +"use strict"; + + +var LGraphObject = __nested_webpack_require_4947__(2); +var IGeometry = __nested_webpack_require_4947__(8); +var IMath = __nested_webpack_require_4947__(9); + +function LEdge(source, target, vEdge) { + LGraphObject.call(this, vEdge); + + this.isOverlapingSourceAndTarget = false; + this.vGraphObject = vEdge; + this.bendpoints = []; + this.source = source; + this.target = target; +} + +LEdge.prototype = Object.create(LGraphObject.prototype); + +for (var prop in LGraphObject) { + LEdge[prop] = LGraphObject[prop]; +} + +LEdge.prototype.getSource = function () { + return this.source; +}; + +LEdge.prototype.getTarget = function () { + return this.target; +}; + +LEdge.prototype.isInterGraph = function () { + return this.isInterGraph; +}; + +LEdge.prototype.getLength = function () { + return this.length; +}; + +LEdge.prototype.isOverlapingSourceAndTarget = function () { + return this.isOverlapingSourceAndTarget; +}; + +LEdge.prototype.getBendpoints = function () { + return this.bendpoints; +}; + +LEdge.prototype.getLca = function () { + return this.lca; +}; + +LEdge.prototype.getSourceInLca = function () { + return this.sourceInLca; +}; + +LEdge.prototype.getTargetInLca = function () { + return this.targetInLca; +}; + +LEdge.prototype.getOtherEnd = function (node) { + if (this.source === node) { + return this.target; + } else if (this.target === node) { + return this.source; + } else { + throw "Node is not incident with this edge"; + } +}; + +LEdge.prototype.getOtherEndInGraph = function (node, graph) { + var otherEnd = this.getOtherEnd(node); + var root = graph.getGraphManager().getRoot(); + + while (true) { + if (otherEnd.getOwner() == graph) { + return otherEnd; + } + + if (otherEnd.getOwner() == root) { + break; + } + + otherEnd = otherEnd.getOwner().getParent(); + } + + return null; +}; + +LEdge.prototype.updateLength = function () { + var clipPointCoordinates = new Array(4); + + this.isOverlapingSourceAndTarget = IGeometry.getIntersection(this.target.getRect(), this.source.getRect(), clipPointCoordinates); + + if (!this.isOverlapingSourceAndTarget) { + this.lengthX = clipPointCoordinates[0] - clipPointCoordinates[2]; + this.lengthY = clipPointCoordinates[1] - clipPointCoordinates[3]; + + if (Math.abs(this.lengthX) < 1.0) { + this.lengthX = IMath.sign(this.lengthX); + } + + if (Math.abs(this.lengthY) < 1.0) { + this.lengthY = IMath.sign(this.lengthY); + } + + this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY); + } +}; + +LEdge.prototype.updateLengthSimple = function () { + this.lengthX = this.target.getCenterX() - this.source.getCenterX(); + this.lengthY = this.target.getCenterY() - this.source.getCenterY(); + + if (Math.abs(this.lengthX) < 1.0) { + this.lengthX = IMath.sign(this.lengthX); + } + + if (Math.abs(this.lengthY) < 1.0) { + this.lengthY = IMath.sign(this.lengthY); + } + + this.length = Math.sqrt(this.lengthX * this.lengthX + this.lengthY * this.lengthY); +}; + +module.exports = LEdge; + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function LGraphObject(vGraphObject) { + this.vGraphObject = vGraphObject; +} + +module.exports = LGraphObject; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __nested_webpack_require_8167__) { + +"use strict"; + + +var LGraphObject = __nested_webpack_require_8167__(2); +var Integer = __nested_webpack_require_8167__(10); +var RectangleD = __nested_webpack_require_8167__(13); +var LayoutConstants = __nested_webpack_require_8167__(0); +var RandomSeed = __nested_webpack_require_8167__(16); +var PointD = __nested_webpack_require_8167__(4); + +function LNode(gm, loc, size, vNode) { + //Alternative constructor 1 : LNode(LGraphManager gm, Point loc, Dimension size, Object vNode) + if (size == null && vNode == null) { + vNode = loc; + } + + LGraphObject.call(this, vNode); + + //Alternative constructor 2 : LNode(Layout layout, Object vNode) + if (gm.graphManager != null) gm = gm.graphManager; + + this.estimatedSize = Integer.MIN_VALUE; + this.inclusionTreeDepth = Integer.MAX_VALUE; + this.vGraphObject = vNode; + this.edges = []; + this.graphManager = gm; + + if (size != null && loc != null) this.rect = new RectangleD(loc.x, loc.y, size.width, size.height);else this.rect = new RectangleD(); +} + +LNode.prototype = Object.create(LGraphObject.prototype); +for (var prop in LGraphObject) { + LNode[prop] = LGraphObject[prop]; +} + +LNode.prototype.getEdges = function () { + return this.edges; +}; + +LNode.prototype.getChild = function () { + return this.child; +}; + +LNode.prototype.getOwner = function () { + // if (this.owner != null) { + // if (!(this.owner == null || this.owner.getNodes().indexOf(this) > -1)) { + // throw "assert failed"; + // } + // } + + return this.owner; +}; + +LNode.prototype.getWidth = function () { + return this.rect.width; +}; + +LNode.prototype.setWidth = function (width) { + this.rect.width = width; +}; + +LNode.prototype.getHeight = function () { + return this.rect.height; +}; + +LNode.prototype.setHeight = function (height) { + this.rect.height = height; +}; + +LNode.prototype.getCenterX = function () { + return this.rect.x + this.rect.width / 2; +}; + +LNode.prototype.getCenterY = function () { + return this.rect.y + this.rect.height / 2; +}; + +LNode.prototype.getCenter = function () { + return new PointD(this.rect.x + this.rect.width / 2, this.rect.y + this.rect.height / 2); +}; + +LNode.prototype.getLocation = function () { + return new PointD(this.rect.x, this.rect.y); +}; + +LNode.prototype.getRect = function () { + return this.rect; +}; + +LNode.prototype.getDiagonal = function () { + return Math.sqrt(this.rect.width * this.rect.width + this.rect.height * this.rect.height); +}; + +/** + * This method returns half the diagonal length of this node. + */ +LNode.prototype.getHalfTheDiagonal = function () { + return Math.sqrt(this.rect.height * this.rect.height + this.rect.width * this.rect.width) / 2; +}; + +LNode.prototype.setRect = function (upperLeft, dimension) { + this.rect.x = upperLeft.x; + this.rect.y = upperLeft.y; + this.rect.width = dimension.width; + this.rect.height = dimension.height; +}; + +LNode.prototype.setCenter = function (cx, cy) { + this.rect.x = cx - this.rect.width / 2; + this.rect.y = cy - this.rect.height / 2; +}; + +LNode.prototype.setLocation = function (x, y) { + this.rect.x = x; + this.rect.y = y; +}; + +LNode.prototype.moveBy = function (dx, dy) { + this.rect.x += dx; + this.rect.y += dy; +}; + +LNode.prototype.getEdgeListToNode = function (to) { + var edgeList = []; + var edge; + var self = this; + + self.edges.forEach(function (edge) { + + if (edge.target == to) { + if (edge.source != self) throw "Incorrect edge source!"; + + edgeList.push(edge); + } + }); + + return edgeList; +}; + +LNode.prototype.getEdgesBetween = function (other) { + var edgeList = []; + var edge; + + var self = this; + self.edges.forEach(function (edge) { + + if (!(edge.source == self || edge.target == self)) throw "Incorrect edge source and/or target"; + + if (edge.target == other || edge.source == other) { + edgeList.push(edge); + } + }); + + return edgeList; +}; + +LNode.prototype.getNeighborsList = function () { + var neighbors = new Set(); + + var self = this; + self.edges.forEach(function (edge) { + + if (edge.source == self) { + neighbors.add(edge.target); + } else { + if (edge.target != self) { + throw "Incorrect incidency!"; + } + + neighbors.add(edge.source); + } + }); + + return neighbors; +}; + +LNode.prototype.withChildren = function () { + var withNeighborsList = new Set(); + var childNode; + var children; + + withNeighborsList.add(this); + + if (this.child != null) { + var nodes = this.child.getNodes(); + for (var i = 0; i < nodes.length; i++) { + childNode = nodes[i]; + children = childNode.withChildren(); + children.forEach(function (node) { + withNeighborsList.add(node); + }); + } + } + + return withNeighborsList; +}; + +LNode.prototype.getNoOfChildren = function () { + var noOfChildren = 0; + var childNode; + + if (this.child == null) { + noOfChildren = 1; + } else { + var nodes = this.child.getNodes(); + for (var i = 0; i < nodes.length; i++) { + childNode = nodes[i]; + + noOfChildren += childNode.getNoOfChildren(); + } + } + + if (noOfChildren == 0) { + noOfChildren = 1; + } + return noOfChildren; +}; + +LNode.prototype.getEstimatedSize = function () { + if (this.estimatedSize == Integer.MIN_VALUE) { + throw "assert failed"; + } + return this.estimatedSize; +}; + +LNode.prototype.calcEstimatedSize = function () { + if (this.child == null) { + return this.estimatedSize = (this.rect.width + this.rect.height) / 2; + } else { + this.estimatedSize = this.child.calcEstimatedSize(); + this.rect.width = this.estimatedSize; + this.rect.height = this.estimatedSize; + + return this.estimatedSize; + } +}; + +LNode.prototype.scatter = function () { + var randomCenterX; + var randomCenterY; + + var minX = -LayoutConstants.INITIAL_WORLD_BOUNDARY; + var maxX = LayoutConstants.INITIAL_WORLD_BOUNDARY; + randomCenterX = LayoutConstants.WORLD_CENTER_X + RandomSeed.nextDouble() * (maxX - minX) + minX; + + var minY = -LayoutConstants.INITIAL_WORLD_BOUNDARY; + var maxY = LayoutConstants.INITIAL_WORLD_BOUNDARY; + randomCenterY = LayoutConstants.WORLD_CENTER_Y + RandomSeed.nextDouble() * (maxY - minY) + minY; + + this.rect.x = randomCenterX; + this.rect.y = randomCenterY; +}; + +LNode.prototype.updateBounds = function () { + if (this.getChild() == null) { + throw "assert failed"; + } + if (this.getChild().getNodes().length != 0) { + // wrap the children nodes by re-arranging the boundaries + var childGraph = this.getChild(); + childGraph.updateBounds(true); + + this.rect.x = childGraph.getLeft(); + this.rect.y = childGraph.getTop(); + + this.setWidth(childGraph.getRight() - childGraph.getLeft()); + this.setHeight(childGraph.getBottom() - childGraph.getTop()); + + // Update compound bounds considering its label properties + if (LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS) { + + var width = childGraph.getRight() - childGraph.getLeft(); + var height = childGraph.getBottom() - childGraph.getTop(); + + if (this.labelWidth > width) { + this.rect.x -= (this.labelWidth - width) / 2; + this.setWidth(this.labelWidth); + } + + if (this.labelHeight > height) { + if (this.labelPos == "center") { + this.rect.y -= (this.labelHeight - height) / 2; + } else if (this.labelPos == "top") { + this.rect.y -= this.labelHeight - height; + } + this.setHeight(this.labelHeight); + } + } + } +}; + +LNode.prototype.getInclusionTreeDepth = function () { + if (this.inclusionTreeDepth == Integer.MAX_VALUE) { + throw "assert failed"; + } + return this.inclusionTreeDepth; +}; + +LNode.prototype.transform = function (trans) { + var left = this.rect.x; + + if (left > LayoutConstants.WORLD_BOUNDARY) { + left = LayoutConstants.WORLD_BOUNDARY; + } else if (left < -LayoutConstants.WORLD_BOUNDARY) { + left = -LayoutConstants.WORLD_BOUNDARY; + } + + var top = this.rect.y; + + if (top > LayoutConstants.WORLD_BOUNDARY) { + top = LayoutConstants.WORLD_BOUNDARY; + } else if (top < -LayoutConstants.WORLD_BOUNDARY) { + top = -LayoutConstants.WORLD_BOUNDARY; + } + + var leftTop = new PointD(left, top); + var vLeftTop = trans.inverseTransformPoint(leftTop); + + this.setLocation(vLeftTop.x, vLeftTop.y); +}; + +LNode.prototype.getLeft = function () { + return this.rect.x; +}; + +LNode.prototype.getRight = function () { + return this.rect.x + this.rect.width; +}; + +LNode.prototype.getTop = function () { + return this.rect.y; +}; + +LNode.prototype.getBottom = function () { + return this.rect.y + this.rect.height; +}; + +LNode.prototype.getParent = function () { + if (this.owner == null) { + return null; + } + + return this.owner.getParent(); +}; + +module.exports = LNode; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function PointD(x, y) { + if (x == null && y == null) { + this.x = 0; + this.y = 0; + } else { + this.x = x; + this.y = y; + } +} + +PointD.prototype.getX = function () { + return this.x; +}; + +PointD.prototype.getY = function () { + return this.y; +}; + +PointD.prototype.setX = function (x) { + this.x = x; +}; + +PointD.prototype.setY = function (y) { + this.y = y; +}; + +PointD.prototype.getDifference = function (pt) { + return new DimensionD(this.x - pt.x, this.y - pt.y); +}; + +PointD.prototype.getCopy = function () { + return new PointD(this.x, this.y); +}; + +PointD.prototype.translate = function (dim) { + this.x += dim.width; + this.y += dim.height; + return this; +}; + +module.exports = PointD; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __nested_webpack_require_17549__) { + +"use strict"; + + +var LGraphObject = __nested_webpack_require_17549__(2); +var Integer = __nested_webpack_require_17549__(10); +var LayoutConstants = __nested_webpack_require_17549__(0); +var LGraphManager = __nested_webpack_require_17549__(6); +var LNode = __nested_webpack_require_17549__(3); +var LEdge = __nested_webpack_require_17549__(1); +var RectangleD = __nested_webpack_require_17549__(13); +var Point = __nested_webpack_require_17549__(12); +var LinkedList = __nested_webpack_require_17549__(11); + +function LGraph(parent, obj2, vGraph) { + LGraphObject.call(this, vGraph); + this.estimatedSize = Integer.MIN_VALUE; + this.margin = LayoutConstants.DEFAULT_GRAPH_MARGIN; + this.edges = []; + this.nodes = []; + this.isConnected = false; + this.parent = parent; + + if (obj2 != null && obj2 instanceof LGraphManager) { + this.graphManager = obj2; + } else if (obj2 != null && obj2 instanceof Layout) { + this.graphManager = obj2.graphManager; + } +} + +LGraph.prototype = Object.create(LGraphObject.prototype); +for (var prop in LGraphObject) { + LGraph[prop] = LGraphObject[prop]; +} + +LGraph.prototype.getNodes = function () { + return this.nodes; +}; + +LGraph.prototype.getEdges = function () { + return this.edges; +}; + +LGraph.prototype.getGraphManager = function () { + return this.graphManager; +}; + +LGraph.prototype.getParent = function () { + return this.parent; +}; + +LGraph.prototype.getLeft = function () { + return this.left; +}; + +LGraph.prototype.getRight = function () { + return this.right; +}; + +LGraph.prototype.getTop = function () { + return this.top; +}; + +LGraph.prototype.getBottom = function () { + return this.bottom; +}; + +LGraph.prototype.isConnected = function () { + return this.isConnected; +}; + +LGraph.prototype.add = function (obj1, sourceNode, targetNode) { + if (sourceNode == null && targetNode == null) { + var newNode = obj1; + if (this.graphManager == null) { + throw "Graph has no graph mgr!"; + } + if (this.getNodes().indexOf(newNode) > -1) { + throw "Node already in graph!"; + } + newNode.owner = this; + this.getNodes().push(newNode); + + return newNode; + } else { + var newEdge = obj1; + if (!(this.getNodes().indexOf(sourceNode) > -1 && this.getNodes().indexOf(targetNode) > -1)) { + throw "Source or target not in graph!"; + } + + if (!(sourceNode.owner == targetNode.owner && sourceNode.owner == this)) { + throw "Both owners must be this graph!"; + } + + if (sourceNode.owner != targetNode.owner) { + return null; + } + + // set source and target + newEdge.source = sourceNode; + newEdge.target = targetNode; + + // set as intra-graph edge + newEdge.isInterGraph = false; + + // add to graph edge list + this.getEdges().push(newEdge); + + // add to incidency lists + sourceNode.edges.push(newEdge); + + if (targetNode != sourceNode) { + targetNode.edges.push(newEdge); + } + + return newEdge; + } +}; + +LGraph.prototype.remove = function (obj) { + var node = obj; + if (obj instanceof LNode) { + if (node == null) { + throw "Node is null!"; + } + if (!(node.owner != null && node.owner == this)) { + throw "Owner graph is invalid!"; + } + if (this.graphManager == null) { + throw "Owner graph manager is invalid!"; + } + // remove incident edges first (make a copy to do it safely) + var edgesToBeRemoved = node.edges.slice(); + var edge; + var s = edgesToBeRemoved.length; + for (var i = 0; i < s; i++) { + edge = edgesToBeRemoved[i]; + + if (edge.isInterGraph) { + this.graphManager.remove(edge); + } else { + edge.source.owner.remove(edge); + } + } + + // now the node itself + var index = this.nodes.indexOf(node); + if (index == -1) { + throw "Node not in owner node list!"; + } + + this.nodes.splice(index, 1); + } else if (obj instanceof LEdge) { + var edge = obj; + if (edge == null) { + throw "Edge is null!"; + } + if (!(edge.source != null && edge.target != null)) { + throw "Source and/or target is null!"; + } + if (!(edge.source.owner != null && edge.target.owner != null && edge.source.owner == this && edge.target.owner == this)) { + throw "Source and/or target owner is invalid!"; + } + + var sourceIndex = edge.source.edges.indexOf(edge); + var targetIndex = edge.target.edges.indexOf(edge); + if (!(sourceIndex > -1 && targetIndex > -1)) { + throw "Source and/or target doesn't know this edge!"; + } + + edge.source.edges.splice(sourceIndex, 1); + + if (edge.target != edge.source) { + edge.target.edges.splice(targetIndex, 1); + } + + var index = edge.source.owner.getEdges().indexOf(edge); + if (index == -1) { + throw "Not in owner's edge list!"; + } + + edge.source.owner.getEdges().splice(index, 1); + } +}; + +LGraph.prototype.updateLeftTop = function () { + var top = Integer.MAX_VALUE; + var left = Integer.MAX_VALUE; + var nodeTop; + var nodeLeft; + var margin; + + var nodes = this.getNodes(); + var s = nodes.length; + + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + nodeTop = lNode.getTop(); + nodeLeft = lNode.getLeft(); + + if (top > nodeTop) { + top = nodeTop; + } + + if (left > nodeLeft) { + left = nodeLeft; + } + } + + // Do we have any nodes in this graph? + if (top == Integer.MAX_VALUE) { + return null; + } + + if (nodes[0].getParent().paddingLeft != undefined) { + margin = nodes[0].getParent().paddingLeft; + } else { + margin = this.margin; + } + + this.left = left - margin; + this.top = top - margin; + + // Apply the margins and return the result + return new Point(this.left, this.top); +}; + +LGraph.prototype.updateBounds = function (recursive) { + // calculate bounds + var left = Integer.MAX_VALUE; + var right = -Integer.MAX_VALUE; + var top = Integer.MAX_VALUE; + var bottom = -Integer.MAX_VALUE; + var nodeLeft; + var nodeRight; + var nodeTop; + var nodeBottom; + var margin; + + var nodes = this.nodes; + var s = nodes.length; + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + + if (recursive && lNode.child != null) { + lNode.updateBounds(); + } + nodeLeft = lNode.getLeft(); + nodeRight = lNode.getRight(); + nodeTop = lNode.getTop(); + nodeBottom = lNode.getBottom(); + + if (left > nodeLeft) { + left = nodeLeft; + } + + if (right < nodeRight) { + right = nodeRight; + } + + if (top > nodeTop) { + top = nodeTop; + } + + if (bottom < nodeBottom) { + bottom = nodeBottom; + } + } + + var boundingRect = new RectangleD(left, top, right - left, bottom - top); + if (left == Integer.MAX_VALUE) { + this.left = this.parent.getLeft(); + this.right = this.parent.getRight(); + this.top = this.parent.getTop(); + this.bottom = this.parent.getBottom(); + } + + if (nodes[0].getParent().paddingLeft != undefined) { + margin = nodes[0].getParent().paddingLeft; + } else { + margin = this.margin; + } + + this.left = boundingRect.x - margin; + this.right = boundingRect.x + boundingRect.width + margin; + this.top = boundingRect.y - margin; + this.bottom = boundingRect.y + boundingRect.height + margin; +}; + +LGraph.calculateBounds = function (nodes) { + var left = Integer.MAX_VALUE; + var right = -Integer.MAX_VALUE; + var top = Integer.MAX_VALUE; + var bottom = -Integer.MAX_VALUE; + var nodeLeft; + var nodeRight; + var nodeTop; + var nodeBottom; + + var s = nodes.length; + + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + nodeLeft = lNode.getLeft(); + nodeRight = lNode.getRight(); + nodeTop = lNode.getTop(); + nodeBottom = lNode.getBottom(); + + if (left > nodeLeft) { + left = nodeLeft; + } + + if (right < nodeRight) { + right = nodeRight; + } + + if (top > nodeTop) { + top = nodeTop; + } + + if (bottom < nodeBottom) { + bottom = nodeBottom; + } + } + + var boundingRect = new RectangleD(left, top, right - left, bottom - top); + + return boundingRect; +}; + +LGraph.prototype.getInclusionTreeDepth = function () { + if (this == this.graphManager.getRoot()) { + return 1; + } else { + return this.parent.getInclusionTreeDepth(); + } +}; + +LGraph.prototype.getEstimatedSize = function () { + if (this.estimatedSize == Integer.MIN_VALUE) { + throw "assert failed"; + } + return this.estimatedSize; +}; + +LGraph.prototype.calcEstimatedSize = function () { + var size = 0; + var nodes = this.nodes; + var s = nodes.length; + + for (var i = 0; i < s; i++) { + var lNode = nodes[i]; + size += lNode.calcEstimatedSize(); + } + + if (size == 0) { + this.estimatedSize = LayoutConstants.EMPTY_COMPOUND_NODE_SIZE; + } else { + this.estimatedSize = size / Math.sqrt(this.nodes.length); + } + + return this.estimatedSize; +}; + +LGraph.prototype.updateConnected = function () { + var self = this; + if (this.nodes.length == 0) { + this.isConnected = true; + return; + } + + var queue = new LinkedList(); + var visited = new Set(); + var currentNode = this.nodes[0]; + var neighborEdges; + var currentNeighbor; + var childrenOfNode = currentNode.withChildren(); + childrenOfNode.forEach(function (node) { + queue.push(node); + visited.add(node); + }); + + while (queue.length !== 0) { + currentNode = queue.shift(); + + // Traverse all neighbors of this node + neighborEdges = currentNode.getEdges(); + var size = neighborEdges.length; + for (var i = 0; i < size; i++) { + var neighborEdge = neighborEdges[i]; + currentNeighbor = neighborEdge.getOtherEndInGraph(currentNode, this); + + // Add unvisited neighbors to the list to visit + if (currentNeighbor != null && !visited.has(currentNeighbor)) { + var childrenOfNeighbor = currentNeighbor.withChildren(); + + childrenOfNeighbor.forEach(function (node) { + queue.push(node); + visited.add(node); + }); + } + } + } + + this.isConnected = false; + + if (visited.size >= this.nodes.length) { + var noOfVisitedInThisGraph = 0; + + visited.forEach(function (visitedNode) { + if (visitedNode.owner == self) { + noOfVisitedInThisGraph++; + } + }); + + if (noOfVisitedInThisGraph == this.nodes.length) { + this.isConnected = true; + } + } +}; + +module.exports = LGraph; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __nested_webpack_require_27617__) { + +"use strict"; + + +var LGraph; +var LEdge = __nested_webpack_require_27617__(1); + +function LGraphManager(layout) { + LGraph = __nested_webpack_require_27617__(5); // It may be better to initilize this out of this function but it gives an error (Right-hand side of 'instanceof' is not callable) now. + this.layout = layout; + + this.graphs = []; + this.edges = []; +} + +LGraphManager.prototype.addRoot = function () { + var ngraph = this.layout.newGraph(); + var nnode = this.layout.newNode(null); + var root = this.add(ngraph, nnode); + this.setRootGraph(root); + return this.rootGraph; +}; + +LGraphManager.prototype.add = function (newGraph, parentNode, newEdge, sourceNode, targetNode) { + //there are just 2 parameters are passed then it adds an LGraph else it adds an LEdge + if (newEdge == null && sourceNode == null && targetNode == null) { + if (newGraph == null) { + throw "Graph is null!"; + } + if (parentNode == null) { + throw "Parent node is null!"; + } + if (this.graphs.indexOf(newGraph) > -1) { + throw "Graph already in this graph mgr!"; + } + + this.graphs.push(newGraph); + + if (newGraph.parent != null) { + throw "Already has a parent!"; + } + if (parentNode.child != null) { + throw "Already has a child!"; + } + + newGraph.parent = parentNode; + parentNode.child = newGraph; + + return newGraph; + } else { + //change the order of the parameters + targetNode = newEdge; + sourceNode = parentNode; + newEdge = newGraph; + var sourceGraph = sourceNode.getOwner(); + var targetGraph = targetNode.getOwner(); + + if (!(sourceGraph != null && sourceGraph.getGraphManager() == this)) { + throw "Source not in this graph mgr!"; + } + if (!(targetGraph != null && targetGraph.getGraphManager() == this)) { + throw "Target not in this graph mgr!"; + } + + if (sourceGraph == targetGraph) { + newEdge.isInterGraph = false; + return sourceGraph.add(newEdge, sourceNode, targetNode); + } else { + newEdge.isInterGraph = true; + + // set source and target + newEdge.source = sourceNode; + newEdge.target = targetNode; + + // add edge to inter-graph edge list + if (this.edges.indexOf(newEdge) > -1) { + throw "Edge already in inter-graph edge list!"; + } + + this.edges.push(newEdge); + + // add edge to source and target incidency lists + if (!(newEdge.source != null && newEdge.target != null)) { + throw "Edge source and/or target is null!"; + } + + if (!(newEdge.source.edges.indexOf(newEdge) == -1 && newEdge.target.edges.indexOf(newEdge) == -1)) { + throw "Edge already in source and/or target incidency list!"; + } + + newEdge.source.edges.push(newEdge); + newEdge.target.edges.push(newEdge); + + return newEdge; + } + } +}; + +LGraphManager.prototype.remove = function (lObj) { + if (lObj instanceof LGraph) { + var graph = lObj; + if (graph.getGraphManager() != this) { + throw "Graph not in this graph mgr"; + } + if (!(graph == this.rootGraph || graph.parent != null && graph.parent.graphManager == this)) { + throw "Invalid parent node!"; + } + + // first the edges (make a copy to do it safely) + var edgesToBeRemoved = []; + + edgesToBeRemoved = edgesToBeRemoved.concat(graph.getEdges()); + + var edge; + var s = edgesToBeRemoved.length; + for (var i = 0; i < s; i++) { + edge = edgesToBeRemoved[i]; + graph.remove(edge); + } + + // then the nodes (make a copy to do it safely) + var nodesToBeRemoved = []; + + nodesToBeRemoved = nodesToBeRemoved.concat(graph.getNodes()); + + var node; + s = nodesToBeRemoved.length; + for (var i = 0; i < s; i++) { + node = nodesToBeRemoved[i]; + graph.remove(node); + } + + // check if graph is the root + if (graph == this.rootGraph) { + this.setRootGraph(null); + } + + // now remove the graph itself + var index = this.graphs.indexOf(graph); + this.graphs.splice(index, 1); + + // also reset the parent of the graph + graph.parent = null; + } else if (lObj instanceof LEdge) { + edge = lObj; + if (edge == null) { + throw "Edge is null!"; + } + if (!edge.isInterGraph) { + throw "Not an inter-graph edge!"; + } + if (!(edge.source != null && edge.target != null)) { + throw "Source and/or target is null!"; + } + + // remove edge from source and target nodes' incidency lists + + if (!(edge.source.edges.indexOf(edge) != -1 && edge.target.edges.indexOf(edge) != -1)) { + throw "Source and/or target doesn't know this edge!"; + } + + var index = edge.source.edges.indexOf(edge); + edge.source.edges.splice(index, 1); + index = edge.target.edges.indexOf(edge); + edge.target.edges.splice(index, 1); + + // remove edge from owner graph manager's inter-graph edge list + + if (!(edge.source.owner != null && edge.source.owner.getGraphManager() != null)) { + throw "Edge owner graph or owner graph manager is null!"; + } + if (edge.source.owner.getGraphManager().edges.indexOf(edge) == -1) { + throw "Not in owner graph manager's edge list!"; + } + + var index = edge.source.owner.getGraphManager().edges.indexOf(edge); + edge.source.owner.getGraphManager().edges.splice(index, 1); + } +}; + +LGraphManager.prototype.updateBounds = function () { + this.rootGraph.updateBounds(true); +}; + +LGraphManager.prototype.getGraphs = function () { + return this.graphs; +}; + +LGraphManager.prototype.getAllNodes = function () { + if (this.allNodes == null) { + var nodeList = []; + var graphs = this.getGraphs(); + var s = graphs.length; + for (var i = 0; i < s; i++) { + nodeList = nodeList.concat(graphs[i].getNodes()); + } + this.allNodes = nodeList; + } + return this.allNodes; +}; + +LGraphManager.prototype.resetAllNodes = function () { + this.allNodes = null; +}; + +LGraphManager.prototype.resetAllEdges = function () { + this.allEdges = null; +}; + +LGraphManager.prototype.resetAllNodesToApplyGravitation = function () { + this.allNodesToApplyGravitation = null; +}; + +LGraphManager.prototype.getAllEdges = function () { + if (this.allEdges == null) { + var edgeList = []; + var graphs = this.getGraphs(); + var s = graphs.length; + for (var i = 0; i < graphs.length; i++) { + edgeList = edgeList.concat(graphs[i].getEdges()); + } + + edgeList = edgeList.concat(this.edges); + + this.allEdges = edgeList; + } + return this.allEdges; +}; + +LGraphManager.prototype.getAllNodesToApplyGravitation = function () { + return this.allNodesToApplyGravitation; +}; + +LGraphManager.prototype.setAllNodesToApplyGravitation = function (nodeList) { + if (this.allNodesToApplyGravitation != null) { + throw "assert failed"; + } + + this.allNodesToApplyGravitation = nodeList; +}; + +LGraphManager.prototype.getRoot = function () { + return this.rootGraph; +}; + +LGraphManager.prototype.setRootGraph = function (graph) { + if (graph.getGraphManager() != this) { + throw "Root not in this graph mgr!"; + } + + this.rootGraph = graph; + // root graph must have a root node associated with it for convenience + if (graph.parent == null) { + graph.parent = this.layout.newNode("Root node"); + } +}; + +LGraphManager.prototype.getLayout = function () { + return this.layout; +}; + +LGraphManager.prototype.isOneAncestorOfOther = function (firstNode, secondNode) { + if (!(firstNode != null && secondNode != null)) { + throw "assert failed"; + } + + if (firstNode == secondNode) { + return true; + } + // Is second node an ancestor of the first one? + var ownerGraph = firstNode.getOwner(); + var parentNode; + + do { + parentNode = ownerGraph.getParent(); + + if (parentNode == null) { + break; + } + + if (parentNode == secondNode) { + return true; + } + + ownerGraph = parentNode.getOwner(); + if (ownerGraph == null) { + break; + } + } while (true); + // Is first node an ancestor of the second one? + ownerGraph = secondNode.getOwner(); + + do { + parentNode = ownerGraph.getParent(); + + if (parentNode == null) { + break; + } + + if (parentNode == firstNode) { + return true; + } + + ownerGraph = parentNode.getOwner(); + if (ownerGraph == null) { + break; + } + } while (true); + + return false; +}; + +LGraphManager.prototype.calcLowestCommonAncestors = function () { + var edge; + var sourceNode; + var targetNode; + var sourceAncestorGraph; + var targetAncestorGraph; + + var edges = this.getAllEdges(); + var s = edges.length; + for (var i = 0; i < s; i++) { + edge = edges[i]; + + sourceNode = edge.source; + targetNode = edge.target; + edge.lca = null; + edge.sourceInLca = sourceNode; + edge.targetInLca = targetNode; + + if (sourceNode == targetNode) { + edge.lca = sourceNode.getOwner(); + continue; + } + + sourceAncestorGraph = sourceNode.getOwner(); + + while (edge.lca == null) { + edge.targetInLca = targetNode; + targetAncestorGraph = targetNode.getOwner(); + + while (edge.lca == null) { + if (targetAncestorGraph == sourceAncestorGraph) { + edge.lca = targetAncestorGraph; + break; + } + + if (targetAncestorGraph == this.rootGraph) { + break; + } + + if (edge.lca != null) { + throw "assert failed"; + } + edge.targetInLca = targetAncestorGraph.getParent(); + targetAncestorGraph = edge.targetInLca.getOwner(); + } + + if (sourceAncestorGraph == this.rootGraph) { + break; + } + + if (edge.lca == null) { + edge.sourceInLca = sourceAncestorGraph.getParent(); + sourceAncestorGraph = edge.sourceInLca.getOwner(); + } + } + + if (edge.lca == null) { + throw "assert failed"; + } + } +}; + +LGraphManager.prototype.calcLowestCommonAncestor = function (firstNode, secondNode) { + if (firstNode == secondNode) { + return firstNode.getOwner(); + } + var firstOwnerGraph = firstNode.getOwner(); + + do { + if (firstOwnerGraph == null) { + break; + } + var secondOwnerGraph = secondNode.getOwner(); + + do { + if (secondOwnerGraph == null) { + break; + } + + if (secondOwnerGraph == firstOwnerGraph) { + return secondOwnerGraph; + } + secondOwnerGraph = secondOwnerGraph.getParent().getOwner(); + } while (true); + + firstOwnerGraph = firstOwnerGraph.getParent().getOwner(); + } while (true); + + return firstOwnerGraph; +}; + +LGraphManager.prototype.calcInclusionTreeDepths = function (graph, depth) { + if (graph == null && depth == null) { + graph = this.rootGraph; + depth = 1; + } + var node; + + var nodes = graph.getNodes(); + var s = nodes.length; + for (var i = 0; i < s; i++) { + node = nodes[i]; + node.inclusionTreeDepth = depth; + + if (node.child != null) { + this.calcInclusionTreeDepths(node.child, depth + 1); + } + } +}; + +LGraphManager.prototype.includesInvalidEdge = function () { + var edge; + + var s = this.edges.length; + for (var i = 0; i < s; i++) { + edge = this.edges[i]; + + if (this.isOneAncestorOfOther(edge.source, edge.target)) { + return true; + } + } + return false; +}; + +module.exports = LGraphManager; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __nested_webpack_require_38707__) { + +"use strict"; + + +var LayoutConstants = __nested_webpack_require_38707__(0); + +function FDLayoutConstants() {} + +//FDLayoutConstants inherits static props in LayoutConstants +for (var prop in LayoutConstants) { + FDLayoutConstants[prop] = LayoutConstants[prop]; +} + +FDLayoutConstants.MAX_ITERATIONS = 2500; + +FDLayoutConstants.DEFAULT_EDGE_LENGTH = 50; +FDLayoutConstants.DEFAULT_SPRING_STRENGTH = 0.45; +FDLayoutConstants.DEFAULT_REPULSION_STRENGTH = 4500.0; +FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = 0.4; +FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = 1.0; +FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = 3.8; +FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = 1.5; +FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION = true; +FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION = true; +FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = 0.3; +FDLayoutConstants.COOLING_ADAPTATION_FACTOR = 0.33; +FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT = 1000; +FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT = 5000; +FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL = 100.0; +FDLayoutConstants.MAX_NODE_DISPLACEMENT = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL * 3; +FDLayoutConstants.MIN_REPULSION_DIST = FDLayoutConstants.DEFAULT_EDGE_LENGTH / 10.0; +FDLayoutConstants.CONVERGENCE_CHECK_PERIOD = 100; +FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = 0.1; +FDLayoutConstants.MIN_EDGE_LENGTH = 1; +FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD = 10; + +module.exports = FDLayoutConstants; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __nested_webpack_require_40298__) { + +"use strict"; + + +/** + * This class maintains a list of static geometry related utility methods. + * + * + * Copyright: i-Vis Research Group, Bilkent University, 2007 - present + */ + +var Point = __nested_webpack_require_40298__(12); + +function IGeometry() {} + +/** + * This method calculates *half* the amount in x and y directions of the two + * input rectangles needed to separate them keeping their respective + * positioning, and returns the result in the input array. An input + * separation buffer added to the amount in both directions. We assume that + * the two rectangles do intersect. + */ +IGeometry.calcSeparationAmount = function (rectA, rectB, overlapAmount, separationBuffer) { + if (!rectA.intersects(rectB)) { + throw "assert failed"; + } + + var directions = new Array(2); + + this.decideDirectionsForOverlappingNodes(rectA, rectB, directions); + + overlapAmount[0] = Math.min(rectA.getRight(), rectB.getRight()) - Math.max(rectA.x, rectB.x); + overlapAmount[1] = Math.min(rectA.getBottom(), rectB.getBottom()) - Math.max(rectA.y, rectB.y); + + // update the overlapping amounts for the following cases: + if (rectA.getX() <= rectB.getX() && rectA.getRight() >= rectB.getRight()) { + /* Case x.1: + * + * rectA + * | | + * | _________ | + * | | | | + * |________|_______|______| + * | | + * | | + * rectB + */ + overlapAmount[0] += Math.min(rectB.getX() - rectA.getX(), rectA.getRight() - rectB.getRight()); + } else if (rectB.getX() <= rectA.getX() && rectB.getRight() >= rectA.getRight()) { + /* Case x.2: + * + * rectB + * | | + * | _________ | + * | | | | + * |________|_______|______| + * | | + * | | + * rectA + */ + overlapAmount[0] += Math.min(rectA.getX() - rectB.getX(), rectB.getRight() - rectA.getRight()); + } + if (rectA.getY() <= rectB.getY() && rectA.getBottom() >= rectB.getBottom()) { + /* Case y.1: + * ________ rectA + * | + * | + * ______|____ rectB + * | | + * | | + * ______|____| + * | + * | + * |________ + * + */ + overlapAmount[1] += Math.min(rectB.getY() - rectA.getY(), rectA.getBottom() - rectB.getBottom()); + } else if (rectB.getY() <= rectA.getY() && rectB.getBottom() >= rectA.getBottom()) { + /* Case y.2: + * ________ rectB + * | + * | + * ______|____ rectA + * | | + * | | + * ______|____| + * | + * | + * |________ + * + */ + overlapAmount[1] += Math.min(rectA.getY() - rectB.getY(), rectB.getBottom() - rectA.getBottom()); + } + + // find slope of the line passes two centers + var slope = Math.abs((rectB.getCenterY() - rectA.getCenterY()) / (rectB.getCenterX() - rectA.getCenterX())); + // if centers are overlapped + if (rectB.getCenterY() === rectA.getCenterY() && rectB.getCenterX() === rectA.getCenterX()) { + // assume the slope is 1 (45 degree) + slope = 1.0; + } + + var moveByY = slope * overlapAmount[0]; + var moveByX = overlapAmount[1] / slope; + if (overlapAmount[0] < moveByX) { + moveByX = overlapAmount[0]; + } else { + moveByY = overlapAmount[1]; + } + // return half the amount so that if each rectangle is moved by these + // amounts in opposite directions, overlap will be resolved + overlapAmount[0] = -1 * directions[0] * (moveByX / 2 + separationBuffer); + overlapAmount[1] = -1 * directions[1] * (moveByY / 2 + separationBuffer); +}; + +/** + * This method decides the separation direction of overlapping nodes + * + * if directions[0] = -1, then rectA goes left + * if directions[0] = 1, then rectA goes right + * if directions[1] = -1, then rectA goes up + * if directions[1] = 1, then rectA goes down + */ +IGeometry.decideDirectionsForOverlappingNodes = function (rectA, rectB, directions) { + if (rectA.getCenterX() < rectB.getCenterX()) { + directions[0] = -1; + } else { + directions[0] = 1; + } + + if (rectA.getCenterY() < rectB.getCenterY()) { + directions[1] = -1; + } else { + directions[1] = 1; + } +}; + +/** + * This method calculates the intersection (clipping) points of the two + * input rectangles with line segment defined by the centers of these two + * rectangles. The clipping points are saved in the input double array and + * whether or not the two rectangles overlap is returned. + */ +IGeometry.getIntersection2 = function (rectA, rectB, result) { + //result[0-1] will contain clipPoint of rectA, result[2-3] will contain clipPoint of rectB + var p1x = rectA.getCenterX(); + var p1y = rectA.getCenterY(); + var p2x = rectB.getCenterX(); + var p2y = rectB.getCenterY(); + + //if two rectangles intersect, then clipping points are centers + if (rectA.intersects(rectB)) { + result[0] = p1x; + result[1] = p1y; + result[2] = p2x; + result[3] = p2y; + return true; + } + //variables for rectA + var topLeftAx = rectA.getX(); + var topLeftAy = rectA.getY(); + var topRightAx = rectA.getRight(); + var bottomLeftAx = rectA.getX(); + var bottomLeftAy = rectA.getBottom(); + var bottomRightAx = rectA.getRight(); + var halfWidthA = rectA.getWidthHalf(); + var halfHeightA = rectA.getHeightHalf(); + //variables for rectB + var topLeftBx = rectB.getX(); + var topLeftBy = rectB.getY(); + var topRightBx = rectB.getRight(); + var bottomLeftBx = rectB.getX(); + var bottomLeftBy = rectB.getBottom(); + var bottomRightBx = rectB.getRight(); + var halfWidthB = rectB.getWidthHalf(); + var halfHeightB = rectB.getHeightHalf(); + + //flag whether clipping points are found + var clipPointAFound = false; + var clipPointBFound = false; + + // line is vertical + if (p1x === p2x) { + if (p1y > p2y) { + result[0] = p1x; + result[1] = topLeftAy; + result[2] = p2x; + result[3] = bottomLeftBy; + return false; + } else if (p1y < p2y) { + result[0] = p1x; + result[1] = bottomLeftAy; + result[2] = p2x; + result[3] = topLeftBy; + return false; + } else { + //not line, return null; + } + } + // line is horizontal + else if (p1y === p2y) { + if (p1x > p2x) { + result[0] = topLeftAx; + result[1] = p1y; + result[2] = topRightBx; + result[3] = p2y; + return false; + } else if (p1x < p2x) { + result[0] = topRightAx; + result[1] = p1y; + result[2] = topLeftBx; + result[3] = p2y; + return false; + } else { + //not valid line, return null; + } + } else { + //slopes of rectA's and rectB's diagonals + var slopeA = rectA.height / rectA.width; + var slopeB = rectB.height / rectB.width; + + //slope of line between center of rectA and center of rectB + var slopePrime = (p2y - p1y) / (p2x - p1x); + var cardinalDirectionA = void 0; + var cardinalDirectionB = void 0; + var tempPointAx = void 0; + var tempPointAy = void 0; + var tempPointBx = void 0; + var tempPointBy = void 0; + + //determine whether clipping point is the corner of nodeA + if (-slopeA === slopePrime) { + if (p1x > p2x) { + result[0] = bottomLeftAx; + result[1] = bottomLeftAy; + clipPointAFound = true; + } else { + result[0] = topRightAx; + result[1] = topLeftAy; + clipPointAFound = true; + } + } else if (slopeA === slopePrime) { + if (p1x > p2x) { + result[0] = topLeftAx; + result[1] = topLeftAy; + clipPointAFound = true; + } else { + result[0] = bottomRightAx; + result[1] = bottomLeftAy; + clipPointAFound = true; + } + } + + //determine whether clipping point is the corner of nodeB + if (-slopeB === slopePrime) { + if (p2x > p1x) { + result[2] = bottomLeftBx; + result[3] = bottomLeftBy; + clipPointBFound = true; + } else { + result[2] = topRightBx; + result[3] = topLeftBy; + clipPointBFound = true; + } + } else if (slopeB === slopePrime) { + if (p2x > p1x) { + result[2] = topLeftBx; + result[3] = topLeftBy; + clipPointBFound = true; + } else { + result[2] = bottomRightBx; + result[3] = bottomLeftBy; + clipPointBFound = true; + } + } + + //if both clipping points are corners + if (clipPointAFound && clipPointBFound) { + return false; + } + + //determine Cardinal Direction of rectangles + if (p1x > p2x) { + if (p1y > p2y) { + cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 4); + cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 2); + } else { + cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 3); + cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 1); + } + } else { + if (p1y > p2y) { + cardinalDirectionA = this.getCardinalDirection(-slopeA, slopePrime, 1); + cardinalDirectionB = this.getCardinalDirection(-slopeB, slopePrime, 3); + } else { + cardinalDirectionA = this.getCardinalDirection(slopeA, slopePrime, 2); + cardinalDirectionB = this.getCardinalDirection(slopeB, slopePrime, 4); + } + } + //calculate clipping Point if it is not found before + if (!clipPointAFound) { + switch (cardinalDirectionA) { + case 1: + tempPointAy = topLeftAy; + tempPointAx = p1x + -halfHeightA / slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 2: + tempPointAx = bottomRightAx; + tempPointAy = p1y + halfWidthA * slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 3: + tempPointAy = bottomLeftAy; + tempPointAx = p1x + halfHeightA / slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + case 4: + tempPointAx = bottomLeftAx; + tempPointAy = p1y + -halfWidthA * slopePrime; + result[0] = tempPointAx; + result[1] = tempPointAy; + break; + } + } + if (!clipPointBFound) { + switch (cardinalDirectionB) { + case 1: + tempPointBy = topLeftBy; + tempPointBx = p2x + -halfHeightB / slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 2: + tempPointBx = bottomRightBx; + tempPointBy = p2y + halfWidthB * slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 3: + tempPointBy = bottomLeftBy; + tempPointBx = p2x + halfHeightB / slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + case 4: + tempPointBx = bottomLeftBx; + tempPointBy = p2y + -halfWidthB * slopePrime; + result[2] = tempPointBx; + result[3] = tempPointBy; + break; + } + } + } + return false; +}; + +/** + * This method returns in which cardinal direction does input point stays + * 1: North + * 2: East + * 3: South + * 4: West + */ +IGeometry.getCardinalDirection = function (slope, slopePrime, line) { + if (slope > slopePrime) { + return line; + } else { + return 1 + line % 4; + } +}; + +/** + * This method calculates the intersection of the two lines defined by + * point pairs (s1,s2) and (f1,f2). + */ +IGeometry.getIntersection = function (s1, s2, f1, f2) { + if (f2 == null) { + return this.getIntersection2(s1, s2, f1); + } + + var x1 = s1.x; + var y1 = s1.y; + var x2 = s2.x; + var y2 = s2.y; + var x3 = f1.x; + var y3 = f1.y; + var x4 = f2.x; + var y4 = f2.y; + var x = void 0, + y = void 0; // intersection point + var a1 = void 0, + a2 = void 0, + b1 = void 0, + b2 = void 0, + c1 = void 0, + c2 = void 0; // coefficients of line eqns. + var denom = void 0; + + a1 = y2 - y1; + b1 = x1 - x2; + c1 = x2 * y1 - x1 * y2; // { a1*x + b1*y + c1 = 0 is line 1 } + + a2 = y4 - y3; + b2 = x3 - x4; + c2 = x4 * y3 - x3 * y4; // { a2*x + b2*y + c2 = 0 is line 2 } + + denom = a1 * b2 - a2 * b1; + + if (denom === 0) { + return null; + } + + x = (b1 * c2 - b2 * c1) / denom; + y = (a2 * c1 - a1 * c2) / denom; + + return new Point(x, y); +}; + +/** + * This method finds and returns the angle of the vector from the + x-axis + * in clockwise direction (compatible w/ Java coordinate system!). + */ +IGeometry.angleOfVector = function (Cx, Cy, Nx, Ny) { + var C_angle = void 0; + + if (Cx !== Nx) { + C_angle = Math.atan((Ny - Cy) / (Nx - Cx)); + + if (Nx < Cx) { + C_angle += Math.PI; + } else if (Ny < Cy) { + C_angle += this.TWO_PI; + } + } else if (Ny < Cy) { + C_angle = this.ONE_AND_HALF_PI; // 270 degrees + } else { + C_angle = this.HALF_PI; // 90 degrees + } + + return C_angle; +}; + +/** + * This method checks whether the given two line segments (one with point + * p1 and p2, the other with point p3 and p4) intersect at a point other + * than these points. + */ +IGeometry.doIntersect = function (p1, p2, p3, p4) { + var a = p1.x; + var b = p1.y; + var c = p2.x; + var d = p2.y; + var p = p3.x; + var q = p3.y; + var r = p4.x; + var s = p4.y; + var det = (c - a) * (s - q) - (r - p) * (d - b); + + if (det === 0) { + return false; + } else { + var lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det; + var gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det; + return 0 < lambda && lambda < 1 && 0 < gamma && gamma < 1; + } +}; + +// ----------------------------------------------------------------------------- +// Section: Class Constants +// ----------------------------------------------------------------------------- +/** + * Some useful pre-calculated constants + */ +IGeometry.HALF_PI = 0.5 * Math.PI; +IGeometry.ONE_AND_HALF_PI = 1.5 * Math.PI; +IGeometry.TWO_PI = 2.0 * Math.PI; +IGeometry.THREE_PI = 3.0 * Math.PI; + +module.exports = IGeometry; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function IMath() {} + +/** + * This method returns the sign of the input value. + */ +IMath.sign = function (value) { + if (value > 0) { + return 1; + } else if (value < 0) { + return -1; + } else { + return 0; + } +}; + +IMath.floor = function (value) { + return value < 0 ? Math.ceil(value) : Math.floor(value); +}; + +IMath.ceil = function (value) { + return value < 0 ? Math.floor(value) : Math.ceil(value); +}; + +module.exports = IMath; + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function Integer() {} + +Integer.MAX_VALUE = 2147483647; +Integer.MIN_VALUE = -2147483648; + +module.exports = Integer; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var nodeFrom = function nodeFrom(value) { + return { value: value, next: null, prev: null }; +}; + +var add = function add(prev, node, next, list) { + if (prev !== null) { + prev.next = node; + } else { + list.head = node; + } + + if (next !== null) { + next.prev = node; + } else { + list.tail = node; + } + + node.prev = prev; + node.next = next; + + list.length++; + + return node; +}; + +var _remove = function _remove(node, list) { + var prev = node.prev, + next = node.next; + + + if (prev !== null) { + prev.next = next; + } else { + list.head = next; + } + + if (next !== null) { + next.prev = prev; + } else { + list.tail = prev; + } + + node.prev = node.next = null; + + list.length--; + + return node; +}; + +var LinkedList = function () { + function LinkedList(vals) { + var _this = this; + + _classCallCheck(this, LinkedList); + + this.length = 0; + this.head = null; + this.tail = null; + + if (vals != null) { + vals.forEach(function (v) { + return _this.push(v); + }); + } + } + + _createClass(LinkedList, [{ + key: "size", + value: function size() { + return this.length; + } + }, { + key: "insertBefore", + value: function insertBefore(val, otherNode) { + return add(otherNode.prev, nodeFrom(val), otherNode, this); + } + }, { + key: "insertAfter", + value: function insertAfter(val, otherNode) { + return add(otherNode, nodeFrom(val), otherNode.next, this); + } + }, { + key: "insertNodeBefore", + value: function insertNodeBefore(newNode, otherNode) { + return add(otherNode.prev, newNode, otherNode, this); + } + }, { + key: "insertNodeAfter", + value: function insertNodeAfter(newNode, otherNode) { + return add(otherNode, newNode, otherNode.next, this); + } + }, { + key: "push", + value: function push(val) { + return add(this.tail, nodeFrom(val), null, this); + } + }, { + key: "unshift", + value: function unshift(val) { + return add(null, nodeFrom(val), this.head, this); + } + }, { + key: "remove", + value: function remove(node) { + return _remove(node, this); + } + }, { + key: "pop", + value: function pop() { + return _remove(this.tail, this).value; + } + }, { + key: "popNode", + value: function popNode() { + return _remove(this.tail, this); + } + }, { + key: "shift", + value: function shift() { + return _remove(this.head, this).value; + } + }, { + key: "shiftNode", + value: function shiftNode() { + return _remove(this.head, this); + } + }, { + key: "get_object_at", + value: function get_object_at(index) { + if (index <= this.length()) { + var i = 1; + var current = this.head; + while (i < index) { + current = current.next; + i++; + } + return current.value; + } + } + }, { + key: "set_object_at", + value: function set_object_at(index, value) { + if (index <= this.length()) { + var i = 1; + var current = this.head; + while (i < index) { + current = current.next; + i++; + } + current.value = value; + } + } + }]); + + return LinkedList; +}(); + +module.exports = LinkedList; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/* + *This class is the javascript implementation of the Point.java class in jdk + */ +function Point(x, y, p) { + this.x = null; + this.y = null; + if (x == null && y == null && p == null) { + this.x = 0; + this.y = 0; + } else if (typeof x == 'number' && typeof y == 'number' && p == null) { + this.x = x; + this.y = y; + } else if (x.constructor.name == 'Point' && y == null && p == null) { + p = x; + this.x = p.x; + this.y = p.y; + } +} + +Point.prototype.getX = function () { + return this.x; +}; + +Point.prototype.getY = function () { + return this.y; +}; + +Point.prototype.getLocation = function () { + return new Point(this.x, this.y); +}; + +Point.prototype.setLocation = function (x, y, p) { + if (x.constructor.name == 'Point' && y == null && p == null) { + p = x; + this.setLocation(p.x, p.y); + } else if (typeof x == 'number' && typeof y == 'number' && p == null) { + //if both parameters are integer just move (x,y) location + if (parseInt(x) == x && parseInt(y) == y) { + this.move(x, y); + } else { + this.x = Math.floor(x + 0.5); + this.y = Math.floor(y + 0.5); + } + } +}; + +Point.prototype.move = function (x, y) { + this.x = x; + this.y = y; +}; + +Point.prototype.translate = function (dx, dy) { + this.x += dx; + this.y += dy; +}; + +Point.prototype.equals = function (obj) { + if (obj.constructor.name == "Point") { + var pt = obj; + return this.x == pt.x && this.y == pt.y; + } + return this == obj; +}; + +Point.prototype.toString = function () { + return new Point().constructor.name + "[x=" + this.x + ",y=" + this.y + "]"; +}; + +module.exports = Point; + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function RectangleD(x, y, width, height) { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + + if (x != null && y != null && width != null && height != null) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } +} + +RectangleD.prototype.getX = function () { + return this.x; +}; + +RectangleD.prototype.setX = function (x) { + this.x = x; +}; + +RectangleD.prototype.getY = function () { + return this.y; +}; + +RectangleD.prototype.setY = function (y) { + this.y = y; +}; + +RectangleD.prototype.getWidth = function () { + return this.width; +}; + +RectangleD.prototype.setWidth = function (width) { + this.width = width; +}; + +RectangleD.prototype.getHeight = function () { + return this.height; +}; + +RectangleD.prototype.setHeight = function (height) { + this.height = height; +}; + +RectangleD.prototype.getRight = function () { + return this.x + this.width; +}; + +RectangleD.prototype.getBottom = function () { + return this.y + this.height; +}; + +RectangleD.prototype.intersects = function (a) { + if (this.getRight() < a.x) { + return false; + } + + if (this.getBottom() < a.y) { + return false; + } + + if (a.getRight() < this.x) { + return false; + } + + if (a.getBottom() < this.y) { + return false; + } + + return true; +}; + +RectangleD.prototype.getCenterX = function () { + return this.x + this.width / 2; +}; + +RectangleD.prototype.getMinX = function () { + return this.getX(); +}; + +RectangleD.prototype.getMaxX = function () { + return this.getX() + this.width; +}; + +RectangleD.prototype.getCenterY = function () { + return this.y + this.height / 2; +}; + +RectangleD.prototype.getMinY = function () { + return this.getY(); +}; + +RectangleD.prototype.getMaxY = function () { + return this.getY() + this.height; +}; + +RectangleD.prototype.getWidthHalf = function () { + return this.width / 2; +}; + +RectangleD.prototype.getHeightHalf = function () { + return this.height / 2; +}; + +module.exports = RectangleD; + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +function UniqueIDGeneretor() {} + +UniqueIDGeneretor.lastID = 0; + +UniqueIDGeneretor.createID = function (obj) { + if (UniqueIDGeneretor.isPrimitive(obj)) { + return obj; + } + if (obj.uniqueID != null) { + return obj.uniqueID; + } + obj.uniqueID = UniqueIDGeneretor.getString(); + UniqueIDGeneretor.lastID++; + return obj.uniqueID; +}; + +UniqueIDGeneretor.getString = function (id) { + if (id == null) id = UniqueIDGeneretor.lastID; + return "Object#" + id + ""; +}; + +UniqueIDGeneretor.isPrimitive = function (arg) { + var type = typeof arg === "undefined" ? "undefined" : _typeof(arg); + return arg == null || type != "object" && type != "function"; +}; + +module.exports = UniqueIDGeneretor; + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __nested_webpack_require_64072__) { + +"use strict"; + + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var LayoutConstants = __nested_webpack_require_64072__(0); +var LGraphManager = __nested_webpack_require_64072__(6); +var LNode = __nested_webpack_require_64072__(3); +var LEdge = __nested_webpack_require_64072__(1); +var LGraph = __nested_webpack_require_64072__(5); +var PointD = __nested_webpack_require_64072__(4); +var Transform = __nested_webpack_require_64072__(17); +var Emitter = __nested_webpack_require_64072__(27); + +function Layout(isRemoteUse) { + Emitter.call(this); + + //Layout Quality: 0:draft, 1:default, 2:proof + this.layoutQuality = LayoutConstants.QUALITY; + //Whether layout should create bendpoints as needed or not + this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; + //Whether layout should be incremental or not + this.incremental = LayoutConstants.DEFAULT_INCREMENTAL; + //Whether we animate from before to after layout node positions + this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT; + //Whether we animate the layout process or not + this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT; + //Number iterations that should be done between two successive animations + this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD; + /** + * Whether or not leaf nodes (non-compound nodes) are of uniform sizes. When + * they are, both spring and repulsion forces between two leaf nodes can be + * calculated without the expensive clipping point calculations, resulting + * in major speed-up. + */ + this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES; + /** + * This is used for creation of bendpoints by using dummy nodes and edges. + * Maps an LEdge to its dummy bendpoint path. + */ + this.edgeToDummyNodes = new Map(); + this.graphManager = new LGraphManager(this); + this.isLayoutFinished = false; + this.isSubLayout = false; + this.isRemoteUse = false; + + if (isRemoteUse != null) { + this.isRemoteUse = isRemoteUse; + } +} + +Layout.RANDOM_SEED = 1; + +Layout.prototype = Object.create(Emitter.prototype); + +Layout.prototype.getGraphManager = function () { + return this.graphManager; +}; + +Layout.prototype.getAllNodes = function () { + return this.graphManager.getAllNodes(); +}; + +Layout.prototype.getAllEdges = function () { + return this.graphManager.getAllEdges(); +}; + +Layout.prototype.getAllNodesToApplyGravitation = function () { + return this.graphManager.getAllNodesToApplyGravitation(); +}; + +Layout.prototype.newGraphManager = function () { + var gm = new LGraphManager(this); + this.graphManager = gm; + return gm; +}; + +Layout.prototype.newGraph = function (vGraph) { + return new LGraph(null, this.graphManager, vGraph); +}; + +Layout.prototype.newNode = function (vNode) { + return new LNode(this.graphManager, vNode); +}; + +Layout.prototype.newEdge = function (vEdge) { + return new LEdge(null, null, vEdge); +}; + +Layout.prototype.checkLayoutSuccess = function () { + return this.graphManager.getRoot() == null || this.graphManager.getRoot().getNodes().length == 0 || this.graphManager.includesInvalidEdge(); +}; + +Layout.prototype.runLayout = function () { + this.isLayoutFinished = false; + + if (this.tilingPreLayout) { + this.tilingPreLayout(); + } + + this.initParameters(); + var isLayoutSuccessfull; + + if (this.checkLayoutSuccess()) { + isLayoutSuccessfull = false; + } else { + isLayoutSuccessfull = this.layout(); + } + + if (LayoutConstants.ANIMATE === 'during') { + // If this is a 'during' layout animation. Layout is not finished yet. + // We need to perform these in index.js when layout is really finished. + return false; + } + + if (isLayoutSuccessfull) { + if (!this.isSubLayout) { + this.doPostLayout(); + } + } + + if (this.tilingPostLayout) { + this.tilingPostLayout(); + } + + this.isLayoutFinished = true; + + return isLayoutSuccessfull; +}; + +/** + * This method performs the operations required after layout. + */ +Layout.prototype.doPostLayout = function () { + //assert !isSubLayout : "Should not be called on sub-layout!"; + // Propagate geometric changes to v-level objects + if (!this.incremental) { + this.transform(); + } + this.update(); +}; + +/** + * This method updates the geometry of the target graph according to + * calculated layout. + */ +Layout.prototype.update2 = function () { + // update bend points + if (this.createBendsAsNeeded) { + this.createBendpointsFromDummyNodes(); + + // reset all edges, since the topology has changed + this.graphManager.resetAllEdges(); + } + + // perform edge, node and root updates if layout is not called + // remotely + if (!this.isRemoteUse) { + // update all edges + var edge; + var allEdges = this.graphManager.getAllEdges(); + for (var i = 0; i < allEdges.length; i++) { + edge = allEdges[i]; + // this.update(edge); + } + + // recursively update nodes + var node; + var nodes = this.graphManager.getRoot().getNodes(); + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + // this.update(node); + } + + // update root graph + this.update(this.graphManager.getRoot()); + } +}; + +Layout.prototype.update = function (obj) { + if (obj == null) { + this.update2(); + } else if (obj instanceof LNode) { + var node = obj; + if (node.getChild() != null) { + // since node is compound, recursively update child nodes + var nodes = node.getChild().getNodes(); + for (var i = 0; i < nodes.length; i++) { + update(nodes[i]); + } + } + + // if the l-level node is associated with a v-level graph object, + // then it is assumed that the v-level node implements the + // interface Updatable. + if (node.vGraphObject != null) { + // cast to Updatable without any type check + var vNode = node.vGraphObject; + + // call the update method of the interface + vNode.update(node); + } + } else if (obj instanceof LEdge) { + var edge = obj; + // if the l-level edge is associated with a v-level graph object, + // then it is assumed that the v-level edge implements the + // interface Updatable. + + if (edge.vGraphObject != null) { + // cast to Updatable without any type check + var vEdge = edge.vGraphObject; + + // call the update method of the interface + vEdge.update(edge); + } + } else if (obj instanceof LGraph) { + var graph = obj; + // if the l-level graph is associated with a v-level graph object, + // then it is assumed that the v-level object implements the + // interface Updatable. + + if (graph.vGraphObject != null) { + // cast to Updatable without any type check + var vGraph = graph.vGraphObject; + + // call the update method of the interface + vGraph.update(graph); + } + } +}; + +/** + * This method is used to set all layout parameters to default values + * determined at compile time. + */ +Layout.prototype.initParameters = function () { + if (!this.isSubLayout) { + this.layoutQuality = LayoutConstants.QUALITY; + this.animationDuringLayout = LayoutConstants.DEFAULT_ANIMATION_DURING_LAYOUT; + this.animationPeriod = LayoutConstants.DEFAULT_ANIMATION_PERIOD; + this.animationOnLayout = LayoutConstants.DEFAULT_ANIMATION_ON_LAYOUT; + this.incremental = LayoutConstants.DEFAULT_INCREMENTAL; + this.createBendsAsNeeded = LayoutConstants.DEFAULT_CREATE_BENDS_AS_NEEDED; + this.uniformLeafNodeSizes = LayoutConstants.DEFAULT_UNIFORM_LEAF_NODE_SIZES; + } + + if (this.animationDuringLayout) { + this.animationOnLayout = false; + } +}; + +Layout.prototype.transform = function (newLeftTop) { + if (newLeftTop == undefined) { + this.transform(new PointD(0, 0)); + } else { + // create a transformation object (from Eclipse to layout). When an + // inverse transform is applied, we get upper-left coordinate of the + // drawing or the root graph at given input coordinate (some margins + // already included in calculation of left-top). + + var trans = new Transform(); + var leftTop = this.graphManager.getRoot().updateLeftTop(); + + if (leftTop != null) { + trans.setWorldOrgX(newLeftTop.x); + trans.setWorldOrgY(newLeftTop.y); + + trans.setDeviceOrgX(leftTop.x); + trans.setDeviceOrgY(leftTop.y); + + var nodes = this.getAllNodes(); + var node; + + for (var i = 0; i < nodes.length; i++) { + node = nodes[i]; + node.transform(trans); + } + } + } +}; + +Layout.prototype.positionNodesRandomly = function (graph) { + + if (graph == undefined) { + //assert !this.incremental; + this.positionNodesRandomly(this.getGraphManager().getRoot()); + this.getGraphManager().getRoot().updateBounds(true); + } else { + var lNode; + var childGraph; + + var nodes = graph.getNodes(); + for (var i = 0; i < nodes.length; i++) { + lNode = nodes[i]; + childGraph = lNode.getChild(); + + if (childGraph == null) { + lNode.scatter(); + } else if (childGraph.getNodes().length == 0) { + lNode.scatter(); + } else { + this.positionNodesRandomly(childGraph); + lNode.updateBounds(); + } + } + } +}; + +/** + * This method returns a list of trees where each tree is represented as a + * list of l-nodes. The method returns a list of size 0 when: + * - The graph is not flat or + * - One of the component(s) of the graph is not a tree. + */ +Layout.prototype.getFlatForest = function () { + var flatForest = []; + var isForest = true; + + // Quick reference for all nodes in the graph manager associated with + // this layout. The list should not be changed. + var allNodes = this.graphManager.getRoot().getNodes(); + + // First be sure that the graph is flat + var isFlat = true; + + for (var i = 0; i < allNodes.length; i++) { + if (allNodes[i].getChild() != null) { + isFlat = false; + } + } + + // Return empty forest if the graph is not flat. + if (!isFlat) { + return flatForest; + } + + // Run BFS for each component of the graph. + + var visited = new Set(); + var toBeVisited = []; + var parents = new Map(); + var unProcessedNodes = []; + + unProcessedNodes = unProcessedNodes.concat(allNodes); + + // Each iteration of this loop finds a component of the graph and + // decides whether it is a tree or not. If it is a tree, adds it to the + // forest and continued with the next component. + + while (unProcessedNodes.length > 0 && isForest) { + toBeVisited.push(unProcessedNodes[0]); + + // Start the BFS. Each iteration of this loop visits a node in a + // BFS manner. + while (toBeVisited.length > 0 && isForest) { + //pool operation + var currentNode = toBeVisited[0]; + toBeVisited.splice(0, 1); + visited.add(currentNode); + + // Traverse all neighbors of this node + var neighborEdges = currentNode.getEdges(); + + for (var i = 0; i < neighborEdges.length; i++) { + var currentNeighbor = neighborEdges[i].getOtherEnd(currentNode); + + // If BFS is not growing from this neighbor. + if (parents.get(currentNode) != currentNeighbor) { + // We haven't previously visited this neighbor. + if (!visited.has(currentNeighbor)) { + toBeVisited.push(currentNeighbor); + parents.set(currentNeighbor, currentNode); + } + // Since we have previously visited this neighbor and + // this neighbor is not parent of currentNode, given + // graph contains a component that is not tree, hence + // it is not a forest. + else { + isForest = false; + break; + } + } + } + } + + // The graph contains a component that is not a tree. Empty + // previously found trees. The method will end. + if (!isForest) { + flatForest = []; + } + // Save currently visited nodes as a tree in our forest. Reset + // visited and parents lists. Continue with the next component of + // the graph, if any. + else { + var temp = [].concat(_toConsumableArray(visited)); + flatForest.push(temp); + //flatForest = flatForest.concat(temp); + //unProcessedNodes.removeAll(visited); + for (var i = 0; i < temp.length; i++) { + var value = temp[i]; + var index = unProcessedNodes.indexOf(value); + if (index > -1) { + unProcessedNodes.splice(index, 1); + } + } + visited = new Set(); + parents = new Map(); + } + } + + return flatForest; +}; + +/** + * This method creates dummy nodes (an l-level node with minimal dimensions) + * for the given edge (one per bendpoint). The existing l-level structure + * is updated accordingly. + */ +Layout.prototype.createDummyNodesForBendpoints = function (edge) { + var dummyNodes = []; + var prev = edge.source; + + var graph = this.graphManager.calcLowestCommonAncestor(edge.source, edge.target); + + for (var i = 0; i < edge.bendpoints.length; i++) { + // create new dummy node + var dummyNode = this.newNode(null); + dummyNode.setRect(new Point(0, 0), new Dimension(1, 1)); + + graph.add(dummyNode); + + // create new dummy edge between prev and dummy node + var dummyEdge = this.newEdge(null); + this.graphManager.add(dummyEdge, prev, dummyNode); + + dummyNodes.add(dummyNode); + prev = dummyNode; + } + + var dummyEdge = this.newEdge(null); + this.graphManager.add(dummyEdge, prev, edge.target); + + this.edgeToDummyNodes.set(edge, dummyNodes); + + // remove real edge from graph manager if it is inter-graph + if (edge.isInterGraph()) { + this.graphManager.remove(edge); + } + // else, remove the edge from the current graph + else { + graph.remove(edge); + } + + return dummyNodes; +}; + +/** + * This method creates bendpoints for edges from the dummy nodes + * at l-level. + */ +Layout.prototype.createBendpointsFromDummyNodes = function () { + var edges = []; + edges = edges.concat(this.graphManager.getAllEdges()); + edges = [].concat(_toConsumableArray(this.edgeToDummyNodes.keys())).concat(edges); + + for (var k = 0; k < edges.length; k++) { + var lEdge = edges[k]; + + if (lEdge.bendpoints.length > 0) { + var path = this.edgeToDummyNodes.get(lEdge); + + for (var i = 0; i < path.length; i++) { + var dummyNode = path[i]; + var p = new PointD(dummyNode.getCenterX(), dummyNode.getCenterY()); + + // update bendpoint's location according to dummy node + var ebp = lEdge.bendpoints.get(i); + ebp.x = p.x; + ebp.y = p.y; + + // remove the dummy node, dummy edges incident with this + // dummy node is also removed (within the remove method) + dummyNode.getOwner().remove(dummyNode); + } + + // add the real edge to graph + this.graphManager.add(lEdge, lEdge.source, lEdge.target); + } + } +}; + +Layout.transform = function (sliderValue, defaultValue, minDiv, maxMul) { + if (minDiv != undefined && maxMul != undefined) { + var value = defaultValue; + + if (sliderValue <= 50) { + var minValue = defaultValue / minDiv; + value -= (defaultValue - minValue) / 50 * (50 - sliderValue); + } else { + var maxValue = defaultValue * maxMul; + value += (maxValue - defaultValue) / 50 * (sliderValue - 50); + } + + return value; + } else { + var a, b; + + if (sliderValue <= 50) { + a = 9.0 * defaultValue / 500.0; + b = defaultValue / 10.0; + } else { + a = 9.0 * defaultValue / 50.0; + b = -8 * defaultValue; + } + + return a * sliderValue + b; + } +}; + +/** + * This method finds and returns the center of the given nodes, assuming + * that the given nodes form a tree in themselves. + */ +Layout.findCenterOfTree = function (nodes) { + var list = []; + list = list.concat(nodes); + + var removedNodes = []; + var remainingDegrees = new Map(); + var foundCenter = false; + var centerNode = null; + + if (list.length == 1 || list.length == 2) { + foundCenter = true; + centerNode = list[0]; + } + + for (var i = 0; i < list.length; i++) { + var node = list[i]; + var degree = node.getNeighborsList().size; + remainingDegrees.set(node, node.getNeighborsList().size); + + if (degree == 1) { + removedNodes.push(node); + } + } + + var tempList = []; + tempList = tempList.concat(removedNodes); + + while (!foundCenter) { + var tempList2 = []; + tempList2 = tempList2.concat(tempList); + tempList = []; + + for (var i = 0; i < list.length; i++) { + var node = list[i]; + + var index = list.indexOf(node); + if (index >= 0) { + list.splice(index, 1); + } + + var neighbours = node.getNeighborsList(); + + neighbours.forEach(function (neighbour) { + if (removedNodes.indexOf(neighbour) < 0) { + var otherDegree = remainingDegrees.get(neighbour); + var newDegree = otherDegree - 1; + + if (newDegree == 1) { + tempList.push(neighbour); + } + + remainingDegrees.set(neighbour, newDegree); + } + }); + } + + removedNodes = removedNodes.concat(tempList); + + if (list.length == 1 || list.length == 2) { + foundCenter = true; + centerNode = list[0]; + } + } + + return centerNode; +}; + +/** + * During the coarsening process, this layout may be referenced by two graph managers + * this setter function grants access to change the currently being used graph manager + */ +Layout.prototype.setGraphManager = function (gm) { + this.graphManager = gm; +}; + +module.exports = Layout; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function RandomSeed() {} +// adapted from: https://stackoverflow.com/a/19303725 +RandomSeed.seed = 1; +RandomSeed.x = 0; + +RandomSeed.nextDouble = function () { + RandomSeed.x = Math.sin(RandomSeed.seed++) * 10000; + return RandomSeed.x - Math.floor(RandomSeed.x); +}; + +module.exports = RandomSeed; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __nested_webpack_require_81860__) { + +"use strict"; + + +var PointD = __nested_webpack_require_81860__(4); + +function Transform(x, y) { + this.lworldOrgX = 0.0; + this.lworldOrgY = 0.0; + this.ldeviceOrgX = 0.0; + this.ldeviceOrgY = 0.0; + this.lworldExtX = 1.0; + this.lworldExtY = 1.0; + this.ldeviceExtX = 1.0; + this.ldeviceExtY = 1.0; +} + +Transform.prototype.getWorldOrgX = function () { + return this.lworldOrgX; +}; + +Transform.prototype.setWorldOrgX = function (wox) { + this.lworldOrgX = wox; +}; + +Transform.prototype.getWorldOrgY = function () { + return this.lworldOrgY; +}; + +Transform.prototype.setWorldOrgY = function (woy) { + this.lworldOrgY = woy; +}; + +Transform.prototype.getWorldExtX = function () { + return this.lworldExtX; +}; + +Transform.prototype.setWorldExtX = function (wex) { + this.lworldExtX = wex; +}; + +Transform.prototype.getWorldExtY = function () { + return this.lworldExtY; +}; + +Transform.prototype.setWorldExtY = function (wey) { + this.lworldExtY = wey; +}; + +/* Device related */ + +Transform.prototype.getDeviceOrgX = function () { + return this.ldeviceOrgX; +}; + +Transform.prototype.setDeviceOrgX = function (dox) { + this.ldeviceOrgX = dox; +}; + +Transform.prototype.getDeviceOrgY = function () { + return this.ldeviceOrgY; +}; + +Transform.prototype.setDeviceOrgY = function (doy) { + this.ldeviceOrgY = doy; +}; + +Transform.prototype.getDeviceExtX = function () { + return this.ldeviceExtX; +}; + +Transform.prototype.setDeviceExtX = function (dex) { + this.ldeviceExtX = dex; +}; + +Transform.prototype.getDeviceExtY = function () { + return this.ldeviceExtY; +}; + +Transform.prototype.setDeviceExtY = function (dey) { + this.ldeviceExtY = dey; +}; + +Transform.prototype.transformX = function (x) { + var xDevice = 0.0; + var worldExtX = this.lworldExtX; + if (worldExtX != 0.0) { + xDevice = this.ldeviceOrgX + (x - this.lworldOrgX) * this.ldeviceExtX / worldExtX; + } + + return xDevice; +}; + +Transform.prototype.transformY = function (y) { + var yDevice = 0.0; + var worldExtY = this.lworldExtY; + if (worldExtY != 0.0) { + yDevice = this.ldeviceOrgY + (y - this.lworldOrgY) * this.ldeviceExtY / worldExtY; + } + + return yDevice; +}; + +Transform.prototype.inverseTransformX = function (x) { + var xWorld = 0.0; + var deviceExtX = this.ldeviceExtX; + if (deviceExtX != 0.0) { + xWorld = this.lworldOrgX + (x - this.ldeviceOrgX) * this.lworldExtX / deviceExtX; + } + + return xWorld; +}; + +Transform.prototype.inverseTransformY = function (y) { + var yWorld = 0.0; + var deviceExtY = this.ldeviceExtY; + if (deviceExtY != 0.0) { + yWorld = this.lworldOrgY + (y - this.ldeviceOrgY) * this.lworldExtY / deviceExtY; + } + return yWorld; +}; + +Transform.prototype.inverseTransformPoint = function (inPoint) { + var outPoint = new PointD(this.inverseTransformX(inPoint.x), this.inverseTransformY(inPoint.y)); + return outPoint; +}; + +module.exports = Transform; + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __nested_webpack_require_84747__) { + +"use strict"; + + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var Layout = __nested_webpack_require_84747__(15); +var FDLayoutConstants = __nested_webpack_require_84747__(7); +var LayoutConstants = __nested_webpack_require_84747__(0); +var IGeometry = __nested_webpack_require_84747__(8); +var IMath = __nested_webpack_require_84747__(9); + +function FDLayout() { + Layout.call(this); + + this.useSmartIdealEdgeLengthCalculation = FDLayoutConstants.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION; + this.idealEdgeLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH; + this.springConstant = FDLayoutConstants.DEFAULT_SPRING_STRENGTH; + this.repulsionConstant = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH; + this.gravityConstant = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH; + this.compoundGravityConstant = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH; + this.gravityRangeFactor = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR; + this.compoundGravityRangeFactor = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR; + this.displacementThresholdPerNode = 3.0 * FDLayoutConstants.DEFAULT_EDGE_LENGTH / 100; + this.coolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; + this.initialCoolingFactor = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL; + this.totalDisplacement = 0.0; + this.oldTotalDisplacement = 0.0; + this.maxIterations = FDLayoutConstants.MAX_ITERATIONS; +} + +FDLayout.prototype = Object.create(Layout.prototype); + +for (var prop in Layout) { + FDLayout[prop] = Layout[prop]; +} + +FDLayout.prototype.initParameters = function () { + Layout.prototype.initParameters.call(this, arguments); + + this.totalIterations = 0; + this.notAnimatedIterations = 0; + + this.useFRGridVariant = FDLayoutConstants.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION; + + this.grid = []; +}; + +FDLayout.prototype.calcIdealEdgeLengths = function () { + var edge; + var lcaDepth; + var source; + var target; + var sizeOfSourceInLca; + var sizeOfTargetInLca; + + var allEdges = this.getGraphManager().getAllEdges(); + for (var i = 0; i < allEdges.length; i++) { + edge = allEdges[i]; + + edge.idealLength = this.idealEdgeLength; + + if (edge.isInterGraph) { + source = edge.getSource(); + target = edge.getTarget(); + + sizeOfSourceInLca = edge.getSourceInLca().getEstimatedSize(); + sizeOfTargetInLca = edge.getTargetInLca().getEstimatedSize(); + + if (this.useSmartIdealEdgeLengthCalculation) { + edge.idealLength += sizeOfSourceInLca + sizeOfTargetInLca - 2 * LayoutConstants.SIMPLE_NODE_SIZE; + } + + lcaDepth = edge.getLca().getInclusionTreeDepth(); + + edge.idealLength += FDLayoutConstants.DEFAULT_EDGE_LENGTH * FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR * (source.getInclusionTreeDepth() + target.getInclusionTreeDepth() - 2 * lcaDepth); + } + } +}; + +FDLayout.prototype.initSpringEmbedder = function () { + + var s = this.getAllNodes().length; + if (this.incremental) { + if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) { + this.coolingFactor = Math.max(this.coolingFactor * FDLayoutConstants.COOLING_ADAPTATION_FACTOR, this.coolingFactor - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * this.coolingFactor * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR)); + } + this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT_INCREMENTAL; + } else { + if (s > FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) { + this.coolingFactor = Math.max(FDLayoutConstants.COOLING_ADAPTATION_FACTOR, 1.0 - (s - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) / (FDLayoutConstants.ADAPTATION_UPPER_NODE_LIMIT - FDLayoutConstants.ADAPTATION_LOWER_NODE_LIMIT) * (1 - FDLayoutConstants.COOLING_ADAPTATION_FACTOR)); + } else { + this.coolingFactor = 1.0; + } + this.initialCoolingFactor = this.coolingFactor; + this.maxNodeDisplacement = FDLayoutConstants.MAX_NODE_DISPLACEMENT; + } + + this.maxIterations = Math.max(this.getAllNodes().length * 5, this.maxIterations); + + this.totalDisplacementThreshold = this.displacementThresholdPerNode * this.getAllNodes().length; + + this.repulsionRange = this.calcRepulsionRange(); +}; + +FDLayout.prototype.calcSpringForces = function () { + var lEdges = this.getAllEdges(); + var edge; + + for (var i = 0; i < lEdges.length; i++) { + edge = lEdges[i]; + + this.calcSpringForce(edge, edge.idealLength); + } +}; + +FDLayout.prototype.calcRepulsionForces = function () { + var gridUpdateAllowed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + var forceToNodeSurroundingUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var i, j; + var nodeA, nodeB; + var lNodes = this.getAllNodes(); + var processedNodeSet; + + if (this.useFRGridVariant) { + if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed) { + this.updateGrid(); + } + + processedNodeSet = new Set(); + + // calculate repulsion forces between each nodes and its surrounding + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; + this.calculateRepulsionForceOfANode(nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate); + processedNodeSet.add(nodeA); + } + } else { + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; + + for (j = i + 1; j < lNodes.length; j++) { + nodeB = lNodes[j]; + + // If both nodes are not members of the same graph, skip. + if (nodeA.getOwner() != nodeB.getOwner()) { + continue; + } + + this.calcRepulsionForce(nodeA, nodeB); + } + } + } +}; + +FDLayout.prototype.calcGravitationalForces = function () { + var node; + var lNodes = this.getAllNodesToApplyGravitation(); + + for (var i = 0; i < lNodes.length; i++) { + node = lNodes[i]; + this.calcGravitationalForce(node); + } +}; + +FDLayout.prototype.moveNodes = function () { + var lNodes = this.getAllNodes(); + var node; + + for (var i = 0; i < lNodes.length; i++) { + node = lNodes[i]; + node.move(); + } +}; + +FDLayout.prototype.calcSpringForce = function (edge, idealLength) { + var sourceNode = edge.getSource(); + var targetNode = edge.getTarget(); + + var length; + var springForce; + var springForceX; + var springForceY; + + // Update edge length + if (this.uniformLeafNodeSizes && sourceNode.getChild() == null && targetNode.getChild() == null) { + edge.updateLengthSimple(); + } else { + edge.updateLength(); + + if (edge.isOverlapingSourceAndTarget) { + return; + } + } + + length = edge.getLength(); + + if (length == 0) return; + + // Calculate spring forces + springForce = this.springConstant * (length - idealLength); + + // Project force onto x and y axes + springForceX = springForce * (edge.lengthX / length); + springForceY = springForce * (edge.lengthY / length); + + // Apply forces on the end nodes + sourceNode.springForceX += springForceX; + sourceNode.springForceY += springForceY; + targetNode.springForceX -= springForceX; + targetNode.springForceY -= springForceY; +}; + +FDLayout.prototype.calcRepulsionForce = function (nodeA, nodeB) { + var rectA = nodeA.getRect(); + var rectB = nodeB.getRect(); + var overlapAmount = new Array(2); + var clipPoints = new Array(4); + var distanceX; + var distanceY; + var distanceSquared; + var distance; + var repulsionForce; + var repulsionForceX; + var repulsionForceY; + + if (rectA.intersects(rectB)) // two nodes overlap + { + // calculate separation amount in x and y directions + IGeometry.calcSeparationAmount(rectA, rectB, overlapAmount, FDLayoutConstants.DEFAULT_EDGE_LENGTH / 2.0); + + repulsionForceX = 2 * overlapAmount[0]; + repulsionForceY = 2 * overlapAmount[1]; + + var childrenConstant = nodeA.noOfChildren * nodeB.noOfChildren / (nodeA.noOfChildren + nodeB.noOfChildren); + + // Apply forces on the two nodes + nodeA.repulsionForceX -= childrenConstant * repulsionForceX; + nodeA.repulsionForceY -= childrenConstant * repulsionForceY; + nodeB.repulsionForceX += childrenConstant * repulsionForceX; + nodeB.repulsionForceY += childrenConstant * repulsionForceY; + } else // no overlap + { + // calculate distance + + if (this.uniformLeafNodeSizes && nodeA.getChild() == null && nodeB.getChild() == null) // simply base repulsion on distance of node centers + { + distanceX = rectB.getCenterX() - rectA.getCenterX(); + distanceY = rectB.getCenterY() - rectA.getCenterY(); + } else // use clipping points + { + IGeometry.getIntersection(rectA, rectB, clipPoints); + + distanceX = clipPoints[2] - clipPoints[0]; + distanceY = clipPoints[3] - clipPoints[1]; + } + + // No repulsion range. FR grid variant should take care of this. + if (Math.abs(distanceX) < FDLayoutConstants.MIN_REPULSION_DIST) { + distanceX = IMath.sign(distanceX) * FDLayoutConstants.MIN_REPULSION_DIST; + } + + if (Math.abs(distanceY) < FDLayoutConstants.MIN_REPULSION_DIST) { + distanceY = IMath.sign(distanceY) * FDLayoutConstants.MIN_REPULSION_DIST; + } + + distanceSquared = distanceX * distanceX + distanceY * distanceY; + distance = Math.sqrt(distanceSquared); + + repulsionForce = this.repulsionConstant * nodeA.noOfChildren * nodeB.noOfChildren / distanceSquared; + + // Project force onto x and y axes + repulsionForceX = repulsionForce * distanceX / distance; + repulsionForceY = repulsionForce * distanceY / distance; + + // Apply forces on the two nodes + nodeA.repulsionForceX -= repulsionForceX; + nodeA.repulsionForceY -= repulsionForceY; + nodeB.repulsionForceX += repulsionForceX; + nodeB.repulsionForceY += repulsionForceY; + } +}; + +FDLayout.prototype.calcGravitationalForce = function (node) { + var ownerGraph; + var ownerCenterX; + var ownerCenterY; + var distanceX; + var distanceY; + var absDistanceX; + var absDistanceY; + var estimatedSize; + ownerGraph = node.getOwner(); + + ownerCenterX = (ownerGraph.getRight() + ownerGraph.getLeft()) / 2; + ownerCenterY = (ownerGraph.getTop() + ownerGraph.getBottom()) / 2; + distanceX = node.getCenterX() - ownerCenterX; + distanceY = node.getCenterY() - ownerCenterY; + absDistanceX = Math.abs(distanceX) + node.getWidth() / 2; + absDistanceY = Math.abs(distanceY) + node.getHeight() / 2; + + if (node.getOwner() == this.graphManager.getRoot()) // in the root graph + { + estimatedSize = ownerGraph.getEstimatedSize() * this.gravityRangeFactor; + + if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { + node.gravitationForceX = -this.gravityConstant * distanceX; + node.gravitationForceY = -this.gravityConstant * distanceY; + } + } else // inside a compound + { + estimatedSize = ownerGraph.getEstimatedSize() * this.compoundGravityRangeFactor; + + if (absDistanceX > estimatedSize || absDistanceY > estimatedSize) { + node.gravitationForceX = -this.gravityConstant * distanceX * this.compoundGravityConstant; + node.gravitationForceY = -this.gravityConstant * distanceY * this.compoundGravityConstant; + } + } +}; + +FDLayout.prototype.isConverged = function () { + var converged; + var oscilating = false; + + if (this.totalIterations > this.maxIterations / 3) { + oscilating = Math.abs(this.totalDisplacement - this.oldTotalDisplacement) < 2; + } + + converged = this.totalDisplacement < this.totalDisplacementThreshold; + + this.oldTotalDisplacement = this.totalDisplacement; + + return converged || oscilating; +}; + +FDLayout.prototype.animate = function () { + if (this.animationDuringLayout && !this.isSubLayout) { + if (this.notAnimatedIterations == this.animationPeriod) { + this.update(); + this.notAnimatedIterations = 0; + } else { + this.notAnimatedIterations++; + } + } +}; + +//This method calculates the number of children (weight) for all nodes +FDLayout.prototype.calcNoOfChildrenForAllNodes = function () { + var node; + var allNodes = this.graphManager.getAllNodes(); + + for (var i = 0; i < allNodes.length; i++) { + node = allNodes[i]; + node.noOfChildren = node.getNoOfChildren(); + } +}; + +// ----------------------------------------------------------------------------- +// Section: FR-Grid Variant Repulsion Force Calculation +// ----------------------------------------------------------------------------- + +FDLayout.prototype.calcGrid = function (graph) { + + var sizeX = 0; + var sizeY = 0; + + sizeX = parseInt(Math.ceil((graph.getRight() - graph.getLeft()) / this.repulsionRange)); + sizeY = parseInt(Math.ceil((graph.getBottom() - graph.getTop()) / this.repulsionRange)); + + var grid = new Array(sizeX); + + for (var i = 0; i < sizeX; i++) { + grid[i] = new Array(sizeY); + } + + for (var i = 0; i < sizeX; i++) { + for (var j = 0; j < sizeY; j++) { + grid[i][j] = new Array(); + } + } + + return grid; +}; + +FDLayout.prototype.addNodeToGrid = function (v, left, top) { + + var startX = 0; + var finishX = 0; + var startY = 0; + var finishY = 0; + + startX = parseInt(Math.floor((v.getRect().x - left) / this.repulsionRange)); + finishX = parseInt(Math.floor((v.getRect().width + v.getRect().x - left) / this.repulsionRange)); + startY = parseInt(Math.floor((v.getRect().y - top) / this.repulsionRange)); + finishY = parseInt(Math.floor((v.getRect().height + v.getRect().y - top) / this.repulsionRange)); + + for (var i = startX; i <= finishX; i++) { + for (var j = startY; j <= finishY; j++) { + this.grid[i][j].push(v); + v.setGridCoordinates(startX, finishX, startY, finishY); + } + } +}; + +FDLayout.prototype.updateGrid = function () { + var i; + var nodeA; + var lNodes = this.getAllNodes(); + + this.grid = this.calcGrid(this.graphManager.getRoot()); + + // put all nodes to proper grid cells + for (i = 0; i < lNodes.length; i++) { + nodeA = lNodes[i]; + this.addNodeToGrid(nodeA, this.graphManager.getRoot().getLeft(), this.graphManager.getRoot().getTop()); + } +}; + +FDLayout.prototype.calculateRepulsionForceOfANode = function (nodeA, processedNodeSet, gridUpdateAllowed, forceToNodeSurroundingUpdate) { + + if (this.totalIterations % FDLayoutConstants.GRID_CALCULATION_CHECK_PERIOD == 1 && gridUpdateAllowed || forceToNodeSurroundingUpdate) { + var surrounding = new Set(); + nodeA.surrounding = new Array(); + var nodeB; + var grid = this.grid; + + for (var i = nodeA.startX - 1; i < nodeA.finishX + 2; i++) { + for (var j = nodeA.startY - 1; j < nodeA.finishY + 2; j++) { + if (!(i < 0 || j < 0 || i >= grid.length || j >= grid[0].length)) { + for (var k = 0; k < grid[i][j].length; k++) { + nodeB = grid[i][j][k]; + + // If both nodes are not members of the same graph, + // or both nodes are the same, skip. + if (nodeA.getOwner() != nodeB.getOwner() || nodeA == nodeB) { + continue; + } + + // check if the repulsion force between + // nodeA and nodeB has already been calculated + if (!processedNodeSet.has(nodeB) && !surrounding.has(nodeB)) { + var distanceX = Math.abs(nodeA.getCenterX() - nodeB.getCenterX()) - (nodeA.getWidth() / 2 + nodeB.getWidth() / 2); + var distanceY = Math.abs(nodeA.getCenterY() - nodeB.getCenterY()) - (nodeA.getHeight() / 2 + nodeB.getHeight() / 2); + + // if the distance between nodeA and nodeB + // is less then calculation range + if (distanceX <= this.repulsionRange && distanceY <= this.repulsionRange) { + //then add nodeB to surrounding of nodeA + surrounding.add(nodeB); + } + } + } + } + } + } + + nodeA.surrounding = [].concat(_toConsumableArray(surrounding)); + } + for (i = 0; i < nodeA.surrounding.length; i++) { + this.calcRepulsionForce(nodeA, nodeA.surrounding[i]); + } +}; + +FDLayout.prototype.calcRepulsionRange = function () { + return 0.0; +}; + +module.exports = FDLayout; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __nested_webpack_require_100902__) { + +"use strict"; + + +var LEdge = __nested_webpack_require_100902__(1); +var FDLayoutConstants = __nested_webpack_require_100902__(7); + +function FDLayoutEdge(source, target, vEdge) { + LEdge.call(this, source, target, vEdge); + this.idealLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH; +} + +FDLayoutEdge.prototype = Object.create(LEdge.prototype); + +for (var prop in LEdge) { + FDLayoutEdge[prop] = LEdge[prop]; +} + +module.exports = FDLayoutEdge; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __nested_webpack_require_101387__) { + +"use strict"; + + +var LNode = __nested_webpack_require_101387__(3); + +function FDLayoutNode(gm, loc, size, vNode) { + // alternative constructor is handled inside LNode + LNode.call(this, gm, loc, size, vNode); + //Spring, repulsion and gravitational forces acting on this node + this.springForceX = 0; + this.springForceY = 0; + this.repulsionForceX = 0; + this.repulsionForceY = 0; + this.gravitationForceX = 0; + this.gravitationForceY = 0; + //Amount by which this node is to be moved in this iteration + this.displacementX = 0; + this.displacementY = 0; + + //Start and finish grid coordinates that this node is fallen into + this.startX = 0; + this.finishX = 0; + this.startY = 0; + this.finishY = 0; + + //Geometric neighbors of this node + this.surrounding = []; +} + +FDLayoutNode.prototype = Object.create(LNode.prototype); + +for (var prop in LNode) { + FDLayoutNode[prop] = LNode[prop]; +} + +FDLayoutNode.prototype.setGridCoordinates = function (_startX, _finishX, _startY, _finishY) { + this.startX = _startX; + this.finishX = _finishX; + this.startY = _startY; + this.finishY = _finishY; +}; + +module.exports = FDLayoutNode; + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function DimensionD(width, height) { + this.width = 0; + this.height = 0; + if (width !== null && height !== null) { + this.height = height; + this.width = width; + } +} + +DimensionD.prototype.getWidth = function () { + return this.width; +}; + +DimensionD.prototype.setWidth = function (width) { + this.width = width; +}; + +DimensionD.prototype.getHeight = function () { + return this.height; +}; + +DimensionD.prototype.setHeight = function (height) { + this.height = height; +}; + +module.exports = DimensionD; + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __nested_webpack_require_103173__) { + +"use strict"; + + +var UniqueIDGeneretor = __nested_webpack_require_103173__(14); + +function HashMap() { + this.map = {}; + this.keys = []; +} + +HashMap.prototype.put = function (key, value) { + var theId = UniqueIDGeneretor.createID(key); + if (!this.contains(theId)) { + this.map[theId] = value; + this.keys.push(key); + } +}; + +HashMap.prototype.contains = function (key) { + var theId = UniqueIDGeneretor.createID(key); + return this.map[key] != null; +}; + +HashMap.prototype.get = function (key) { + var theId = UniqueIDGeneretor.createID(key); + return this.map[theId]; +}; + +HashMap.prototype.keySet = function () { + return this.keys; +}; + +module.exports = HashMap; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __nested_webpack_require_103901__) { + +"use strict"; + + +var UniqueIDGeneretor = __nested_webpack_require_103901__(14); + +function HashSet() { + this.set = {}; +} +; + +HashSet.prototype.add = function (obj) { + var theId = UniqueIDGeneretor.createID(obj); + if (!this.contains(theId)) this.set[theId] = obj; +}; + +HashSet.prototype.remove = function (obj) { + delete this.set[UniqueIDGeneretor.createID(obj)]; +}; + +HashSet.prototype.clear = function () { + this.set = {}; +}; + +HashSet.prototype.contains = function (obj) { + return this.set[UniqueIDGeneretor.createID(obj)] == obj; +}; + +HashSet.prototype.isEmpty = function () { + return this.size() === 0; +}; + +HashSet.prototype.size = function () { + return Object.keys(this.set).length; +}; + +//concats this.set to the given list +HashSet.prototype.addAllTo = function (list) { + var keys = Object.keys(this.set); + var length = keys.length; + for (var i = 0; i < length; i++) { + list.push(this.set[keys[i]]); + } +}; + +HashSet.prototype.size = function () { + return Object.keys(this.set).length; +}; + +HashSet.prototype.addAll = function (list) { + var s = list.length; + for (var i = 0; i < s; i++) { + var v = list[i]; + this.add(v); + } +}; + +module.exports = HashSet; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __nested_webpack_require_105138__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * A classic Quicksort algorithm with Hoare's partition + * - Works also on LinkedList objects + * + * Copyright: i-Vis Research Group, Bilkent University, 2007 - present + */ + +var LinkedList = __nested_webpack_require_105138__(11); + +var Quicksort = function () { + function Quicksort(A, compareFunction) { + _classCallCheck(this, Quicksort); + + if (compareFunction !== null || compareFunction !== undefined) this.compareFunction = this._defaultCompareFunction; + + var length = void 0; + if (A instanceof LinkedList) length = A.size();else length = A.length; + + this._quicksort(A, 0, length - 1); + } + + _createClass(Quicksort, [{ + key: '_quicksort', + value: function _quicksort(A, p, r) { + if (p < r) { + var q = this._partition(A, p, r); + this._quicksort(A, p, q); + this._quicksort(A, q + 1, r); + } + } + }, { + key: '_partition', + value: function _partition(A, p, r) { + var x = this._get(A, p); + var i = p; + var j = r; + while (true) { + while (this.compareFunction(x, this._get(A, j))) { + j--; + }while (this.compareFunction(this._get(A, i), x)) { + i++; + }if (i < j) { + this._swap(A, i, j); + i++; + j--; + } else return j; + } + } + }, { + key: '_get', + value: function _get(object, index) { + if (object instanceof LinkedList) return object.get_object_at(index);else return object[index]; + } + }, { + key: '_set', + value: function _set(object, index, value) { + if (object instanceof LinkedList) object.set_object_at(index, value);else object[index] = value; + } + }, { + key: '_swap', + value: function _swap(A, i, j) { + var temp = this._get(A, i); + this._set(A, i, this._get(A, j)); + this._set(A, j, temp); + } + }, { + key: '_defaultCompareFunction', + value: function _defaultCompareFunction(a, b) { + return b > a; + } + }]); + + return Quicksort; +}(); + +module.exports = Quicksort; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Needleman-Wunsch algorithm is an procedure to compute the optimal global alignment of two string + * sequences by S.B.Needleman and C.D.Wunsch (1970). + * + * Aside from the inputs, you can assign the scores for, + * - Match: The two characters at the current index are same. + * - Mismatch: The two characters at the current index are different. + * - Insertion/Deletion(gaps): The best alignment involves one letter aligning to a gap in the other string. + */ + +var NeedlemanWunsch = function () { + function NeedlemanWunsch(sequence1, sequence2) { + var match_score = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; + var mismatch_penalty = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1; + var gap_penalty = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + + _classCallCheck(this, NeedlemanWunsch); + + this.sequence1 = sequence1; + this.sequence2 = sequence2; + this.match_score = match_score; + this.mismatch_penalty = mismatch_penalty; + this.gap_penalty = gap_penalty; + + // Just the remove redundancy + this.iMax = sequence1.length + 1; + this.jMax = sequence2.length + 1; + + // Grid matrix of scores + this.grid = new Array(this.iMax); + for (var i = 0; i < this.iMax; i++) { + this.grid[i] = new Array(this.jMax); + + for (var j = 0; j < this.jMax; j++) { + this.grid[i][j] = 0; + } + } + + // Traceback matrix (2D array, each cell is an array of boolean values for [`Diag`, `Up`, `Left`] positions) + this.tracebackGrid = new Array(this.iMax); + for (var _i = 0; _i < this.iMax; _i++) { + this.tracebackGrid[_i] = new Array(this.jMax); + + for (var _j = 0; _j < this.jMax; _j++) { + this.tracebackGrid[_i][_j] = [null, null, null]; + } + } + + // The aligned sequences (return multiple possibilities) + this.alignments = []; + + // Final alignment score + this.score = -1; + + // Calculate scores and tracebacks + this.computeGrids(); + } + + _createClass(NeedlemanWunsch, [{ + key: "getScore", + value: function getScore() { + return this.score; + } + }, { + key: "getAlignments", + value: function getAlignments() { + return this.alignments; + } + + // Main dynamic programming procedure + + }, { + key: "computeGrids", + value: function computeGrids() { + // Fill in the first row + for (var j = 1; j < this.jMax; j++) { + this.grid[0][j] = this.grid[0][j - 1] + this.gap_penalty; + this.tracebackGrid[0][j] = [false, false, true]; + } + + // Fill in the first column + for (var i = 1; i < this.iMax; i++) { + this.grid[i][0] = this.grid[i - 1][0] + this.gap_penalty; + this.tracebackGrid[i][0] = [false, true, false]; + } + + // Fill the rest of the grid + for (var _i2 = 1; _i2 < this.iMax; _i2++) { + for (var _j2 = 1; _j2 < this.jMax; _j2++) { + // Find the max score(s) among [`Diag`, `Up`, `Left`] + var diag = void 0; + if (this.sequence1[_i2 - 1] === this.sequence2[_j2 - 1]) diag = this.grid[_i2 - 1][_j2 - 1] + this.match_score;else diag = this.grid[_i2 - 1][_j2 - 1] + this.mismatch_penalty; + + var up = this.grid[_i2 - 1][_j2] + this.gap_penalty; + var left = this.grid[_i2][_j2 - 1] + this.gap_penalty; + + // If there exists multiple max values, capture them for multiple paths + var maxOf = [diag, up, left]; + var indices = this.arrayAllMaxIndexes(maxOf); + + // Update Grids + this.grid[_i2][_j2] = maxOf[indices[0]]; + this.tracebackGrid[_i2][_j2] = [indices.includes(0), indices.includes(1), indices.includes(2)]; + } + } + + // Update alignment score + this.score = this.grid[this.iMax - 1][this.jMax - 1]; + } + + // Gets all possible valid sequence combinations + + }, { + key: "alignmentTraceback", + value: function alignmentTraceback() { + var inProcessAlignments = []; + + inProcessAlignments.push({ pos: [this.sequence1.length, this.sequence2.length], + seq1: "", + seq2: "" + }); + + while (inProcessAlignments[0]) { + var current = inProcessAlignments[0]; + var directions = this.tracebackGrid[current.pos[0]][current.pos[1]]; + + if (directions[0]) { + inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1] - 1], + seq1: this.sequence1[current.pos[0] - 1] + current.seq1, + seq2: this.sequence2[current.pos[1] - 1] + current.seq2 + }); + } + if (directions[1]) { + inProcessAlignments.push({ pos: [current.pos[0] - 1, current.pos[1]], + seq1: this.sequence1[current.pos[0] - 1] + current.seq1, + seq2: '-' + current.seq2 + }); + } + if (directions[2]) { + inProcessAlignments.push({ pos: [current.pos[0], current.pos[1] - 1], + seq1: '-' + current.seq1, + seq2: this.sequence2[current.pos[1] - 1] + current.seq2 + }); + } + + if (current.pos[0] === 0 && current.pos[1] === 0) this.alignments.push({ sequence1: current.seq1, + sequence2: current.seq2 + }); + + inProcessAlignments.shift(); + } + + return this.alignments; + } + + // Helper Functions + + }, { + key: "getAllIndexes", + value: function getAllIndexes(arr, val) { + var indexes = [], + i = -1; + while ((i = arr.indexOf(val, i + 1)) !== -1) { + indexes.push(i); + } + return indexes; + } + }, { + key: "arrayAllMaxIndexes", + value: function arrayAllMaxIndexes(array) { + return this.getAllIndexes(array, Math.max.apply(null, array)); + } + }]); + + return NeedlemanWunsch; +}(); + +module.exports = NeedlemanWunsch; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __nested_webpack_require_115611__) { + +"use strict"; + + +var layoutBase = function layoutBase() { + return; +}; + +layoutBase.FDLayout = __nested_webpack_require_115611__(18); +layoutBase.FDLayoutConstants = __nested_webpack_require_115611__(7); +layoutBase.FDLayoutEdge = __nested_webpack_require_115611__(19); +layoutBase.FDLayoutNode = __nested_webpack_require_115611__(20); +layoutBase.DimensionD = __nested_webpack_require_115611__(21); +layoutBase.HashMap = __nested_webpack_require_115611__(22); +layoutBase.HashSet = __nested_webpack_require_115611__(23); +layoutBase.IGeometry = __nested_webpack_require_115611__(8); +layoutBase.IMath = __nested_webpack_require_115611__(9); +layoutBase.Integer = __nested_webpack_require_115611__(10); +layoutBase.Point = __nested_webpack_require_115611__(12); +layoutBase.PointD = __nested_webpack_require_115611__(4); +layoutBase.RandomSeed = __nested_webpack_require_115611__(16); +layoutBase.RectangleD = __nested_webpack_require_115611__(13); +layoutBase.Transform = __nested_webpack_require_115611__(17); +layoutBase.UniqueIDGeneretor = __nested_webpack_require_115611__(14); +layoutBase.Quicksort = __nested_webpack_require_115611__(24); +layoutBase.LinkedList = __nested_webpack_require_115611__(11); +layoutBase.LGraphObject = __nested_webpack_require_115611__(2); +layoutBase.LGraph = __nested_webpack_require_115611__(5); +layoutBase.LEdge = __nested_webpack_require_115611__(1); +layoutBase.LGraphManager = __nested_webpack_require_115611__(6); +layoutBase.LNode = __nested_webpack_require_115611__(3); +layoutBase.Layout = __nested_webpack_require_115611__(15); +layoutBase.LayoutConstants = __nested_webpack_require_115611__(0); +layoutBase.NeedlemanWunsch = __nested_webpack_require_115611__(25); + +module.exports = layoutBase; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function Emitter() { + this.listeners = []; +} + +var p = Emitter.prototype; + +p.addListener = function (event, callback) { + this.listeners.push({ + event: event, + callback: callback + }); +}; + +p.removeListener = function (event, callback) { + for (var i = this.listeners.length; i >= 0; i--) { + var l = this.listeners[i]; + + if (l.event === event && l.callback === callback) { + this.listeners.splice(i, 1); + } + } +}; + +p.emit = function (event, data) { + for (var i = 0; i < this.listeners.length; i++) { + var l = this.listeners[i]; + + if (event === l.event) { + l.callback(data); + } + } +}; + +module.exports = Emitter; + +/***/ }) +/******/ ]); +}); + +/***/ }), + +/***/ 47724: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ diagram: () => (/* binding */ diagram) +/* harmony export */ }); +/* harmony import */ var _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(87115); +/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59373); +/* harmony import */ var cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(71377); +/* harmony import */ var cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var cytoscape_cose_bilkent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(14607); +/* harmony import */ var cytoscape_cose_bilkent__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(cytoscape_cose_bilkent__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(91619); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(12281); +/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(7201); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(27484); +/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17967); +/* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(20683); +/* harmony import */ var dagre_d3_es_src_dagre_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(70277); +/* harmony import */ var dagre_d3_es_src_graphlib_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(45625); +/* harmony import */ var dagre_d3_es_src_graphlib_json_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(39354); +/* harmony import */ var dagre_d3_es__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(91518); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(59542); +/* harmony import */ var dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_isoWeek_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(10285); +/* harmony import */ var dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_customParseFormat_js__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(28734); +/* harmony import */ var dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(dayjs_plugin_advancedFormat_js__WEBPACK_IMPORTED_MODULE_12__); + + + + + + + + + + + + + + + + + + + + + + + + +var parser = function() { + var o = function(k, v, o2, l) { + for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) + ; + return o2; + }, $V0 = [1, 4], $V1 = [1, 13], $V2 = [1, 12], $V3 = [1, 15], $V4 = [1, 16], $V5 = [1, 20], $V6 = [1, 19], $V7 = [6, 7, 8], $V8 = [1, 26], $V9 = [1, 24], $Va = [1, 25], $Vb = [6, 7, 11], $Vc = [1, 6, 13, 15, 16, 19, 22], $Vd = [1, 33], $Ve = [1, 34], $Vf = [1, 6, 7, 11, 13, 15, 16, 19, 22]; + var parser2 = { + trace: function trace() { + }, + yy: {}, + symbols_: { "error": 2, "start": 3, "mindMap": 4, "spaceLines": 5, "SPACELINE": 6, "NL": 7, "MINDMAP": 8, "document": 9, "stop": 10, "EOF": 11, "statement": 12, "SPACELIST": 13, "node": 14, "ICON": 15, "CLASS": 16, "nodeWithId": 17, "nodeWithoutId": 18, "NODE_DSTART": 19, "NODE_DESCR": 20, "NODE_DEND": 21, "NODE_ID": 22, "$accept": 0, "$end": 1 }, + terminals_: { 2: "error", 6: "SPACELINE", 7: "NL", 8: "MINDMAP", 11: "EOF", 13: "SPACELIST", 15: "ICON", 16: "CLASS", 19: "NODE_DSTART", 20: "NODE_DESCR", 21: "NODE_DEND", 22: "NODE_ID" }, + productions_: [0, [3, 1], [3, 2], [5, 1], [5, 2], [5, 2], [4, 2], [4, 3], [10, 1], [10, 1], [10, 1], [10, 2], [10, 2], [9, 3], [9, 2], [12, 2], [12, 2], [12, 2], [12, 1], [12, 1], [12, 1], [12, 1], [12, 1], [14, 1], [14, 1], [18, 3], [17, 1], [17, 4]], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { + var $0 = $$.length - 1; + switch (yystate) { + case 6: + case 7: + return yy; + case 8: + yy.getLogger().trace("Stop NL "); + break; + case 9: + yy.getLogger().trace("Stop EOF "); + break; + case 11: + yy.getLogger().trace("Stop NL2 "); + break; + case 12: + yy.getLogger().trace("Stop EOF2 "); + break; + case 15: + yy.getLogger().info("Node: ", $$[$0].id); + yy.addNode($$[$0 - 1].length, $$[$0].id, $$[$0].descr, $$[$0].type); + break; + case 16: + yy.getLogger().trace("Icon: ", $$[$0]); + yy.decorateNode({ icon: $$[$0] }); + break; + case 17: + case 21: + yy.decorateNode({ class: $$[$0] }); + break; + case 18: + yy.getLogger().trace("SPACELIST"); + break; + case 19: + yy.getLogger().trace("Node: ", $$[$0].id); + yy.addNode(0, $$[$0].id, $$[$0].descr, $$[$0].type); + break; + case 20: + yy.decorateNode({ icon: $$[$0] }); + break; + case 25: + yy.getLogger().trace("node found ..", $$[$0 - 2]); + this.$ = { id: $$[$0 - 1], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) }; + break; + case 26: + this.$ = { id: $$[$0], descr: $$[$0], type: yy.nodeType.DEFAULT }; + break; + case 27: + yy.getLogger().trace("node found ..", $$[$0 - 3]); + this.$ = { id: $$[$0 - 3], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) }; + break; + } + }, + table: [{ 3: 1, 4: 2, 5: 3, 6: [1, 5], 8: $V0 }, { 1: [3] }, { 1: [2, 1] }, { 4: 6, 6: [1, 7], 7: [1, 8], 8: $V0 }, { 6: $V1, 7: [1, 10], 9: 9, 12: 11, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, o($V7, [2, 3]), { 1: [2, 2] }, o($V7, [2, 4]), o($V7, [2, 5]), { 1: [2, 6], 6: $V1, 12: 21, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, { 6: $V1, 9: 22, 12: 11, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, { 6: $V8, 7: $V9, 10: 23, 11: $Va }, o($Vb, [2, 22], { 17: 17, 18: 18, 14: 27, 15: [1, 28], 16: [1, 29], 19: $V5, 22: $V6 }), o($Vb, [2, 18]), o($Vb, [2, 19]), o($Vb, [2, 20]), o($Vb, [2, 21]), o($Vb, [2, 23]), o($Vb, [2, 24]), o($Vb, [2, 26], { 19: [1, 30] }), { 20: [1, 31] }, { 6: $V8, 7: $V9, 10: 32, 11: $Va }, { 1: [2, 7], 6: $V1, 12: 21, 13: $V2, 14: 14, 15: $V3, 16: $V4, 17: 17, 18: 18, 19: $V5, 22: $V6 }, o($Vc, [2, 14], { 7: $Vd, 11: $Ve }), o($Vf, [2, 8]), o($Vf, [2, 9]), o($Vf, [2, 10]), o($Vb, [2, 15]), o($Vb, [2, 16]), o($Vb, [2, 17]), { 20: [1, 35] }, { 21: [1, 36] }, o($Vc, [2, 13], { 7: $Vd, 11: $Ve }), o($Vf, [2, 11]), o($Vf, [2, 12]), { 21: [1, 37] }, o($Vb, [2, 25]), o($Vb, [2, 27])], + defaultActions: { 2: [2, 1], 6: [2, 2] }, + parseError: function parseError2(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } + }, + parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer2 = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer2.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer2; + sharedState.yy.parser = this; + if (typeof lexer2.yylloc == "undefined") { + lexer2.yylloc = {}; + } + var yyloc = lexer2.yylloc; + lstack.push(yyloc); + var ranges = lexer2.options && lexer2.options.ranges; + if (typeof sharedState.yy.parseError === "function") { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function lex() { + var token; + token = tstack.pop() || lexer2.lex() || EOF; + if (typeof token !== "number") { + if (token instanceof Array) { + tstack = token; + token = tstack.pop(); + } + token = self.symbols_[token] || token; + } + return token; + } + var symbol, state, action, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == "undefined") { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === "undefined" || !action.length || !action[0]) { + var errStr = ""; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push("'" + this.terminals_[p] + "'"); + } + } + if (lexer2.showPosition) { + errStr = "Parse error on line " + (yylineno + 1) + ":\n" + lexer2.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; + } else { + errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == EOF ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); + } + this.parseError(errStr, { + text: lexer2.match, + token: this.terminals_[symbol] || symbol, + line: lexer2.yylineno, + loc: yyloc, + expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer2.yytext); + lstack.push(lexer2.yylloc); + stack.push(action[1]); + symbol = null; + { + yyleng = lexer2.yyleng; + yytext = lexer2.yytext; + yylineno = lexer2.yylineno; + yyloc = lexer2.yylloc; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== "undefined") { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; + } + }; + var lexer = function() { + var lexer2 = { + EOF: 1, + parseError: function parseError2(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + // resets the lexer, sets new input + setInput: function(input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ""; + this.conditionStack = ["INITIAL"]; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0, 0]; + } + this.offset = 0; + return this; + }, + // consumes and returns one char from the input + input: function() { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + this._input = this._input.slice(1); + return ch; + }, + // unshifts one char (or a string) into the input + unput: function(ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len + }; + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + // When called from action, caches matched text and appends it on next action + more: function() { + this._more = true; + return this; + }, + // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. + reject: function() { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + return this; + }, + // retain first n characters of the match + less: function(n) { + this.unput(this.match.slice(n)); + }, + // displays already matched input, i.e. for error messages + pastInput: function() { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); + }, + // displays upcoming input, i.e. for error messages + upcomingInput: function() { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20 - next.length); + } + return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); + }, + // displays the character position where the lexing error occurred, i.e. for error messages + showPosition: function() { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + // test the lexed token: return FALSE when not a match, otherwise return token + test_match: function(match, indexed_rule) { + var token, lines, backup; + if (this.options.backtrack_lexer) { + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + for (var k in backup) { + this[k] = backup[k]; + } + return false; + } + return false; + }, + // return next match in input + next: function() { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + var token, match, tempMatch, index; + if (!this._more) { + this.yytext = ""; + this.match = ""; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; + } else { + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + // return next match that has a token + lex: function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) + begin: function begin(condition) { + this.conditionStack.push(condition); + }, + // pop the previously active lexer condition state off the condition stack + popState: function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + // produce the lexer rule set which is active for the currently active lexer condition state + _currentRules: function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available + topState: function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + // alias for begin(condition) + pushState: function pushState(condition) { + this.begin(condition); + }, + // return the number of states currently on the stack + stateStackSize: function stateStackSize() { + return this.conditionStack.length; + }, + options: { "case-insensitive": true }, + performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { + switch ($avoiding_name_collisions) { + case 0: + yy.getLogger().trace("Found comment", yy_.yytext); + break; + case 1: + return 8; + case 2: + this.begin("CLASS"); + break; + case 3: + this.popState(); + return 16; + case 4: + this.popState(); + break; + case 5: + yy.getLogger().trace("Begin icon"); + this.begin("ICON"); + break; + case 6: + yy.getLogger().trace("SPACELINE"); + return 6; + case 7: + return 7; + case 8: + return 15; + case 9: + yy.getLogger().trace("end icon"); + this.popState(); + break; + case 10: + yy.getLogger().trace("Exploding node"); + this.begin("NODE"); + return 19; + case 11: + yy.getLogger().trace("Cloud"); + this.begin("NODE"); + return 19; + case 12: + yy.getLogger().trace("Explosion Bang"); + this.begin("NODE"); + return 19; + case 13: + yy.getLogger().trace("Cloud Bang"); + this.begin("NODE"); + return 19; + case 14: + this.begin("NODE"); + return 19; + case 15: + this.begin("NODE"); + return 19; + case 16: + this.begin("NODE"); + return 19; + case 17: + this.begin("NODE"); + return 19; + case 18: + return 13; + case 19: + return 22; + case 20: + return 11; + case 21: + yy.getLogger().trace("Starting NSTR"); + this.begin("NSTR"); + break; + case 22: + yy.getLogger().trace("description:", yy_.yytext); + return "NODE_DESCR"; + case 23: + this.popState(); + break; + case 24: + this.popState(); + yy.getLogger().trace("node end ))"); + return "NODE_DEND"; + case 25: + this.popState(); + yy.getLogger().trace("node end )"); + return "NODE_DEND"; + case 26: + this.popState(); + yy.getLogger().trace("node end ...", yy_.yytext); + return "NODE_DEND"; + case 27: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + case 28: + this.popState(); + yy.getLogger().trace("node end (-"); + return "NODE_DEND"; + case 29: + this.popState(); + yy.getLogger().trace("node end (-"); + return "NODE_DEND"; + case 30: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + case 31: + this.popState(); + yy.getLogger().trace("node end (("); + return "NODE_DEND"; + case 32: + yy.getLogger().trace("Long description:", yy_.yytext); + return 20; + case 33: + yy.getLogger().trace("Long description:", yy_.yytext); + return 20; + } + }, + rules: [/^(?:\s*%%.*)/i, /^(?:mindmap\b)/i, /^(?::::)/i, /^(?:.+)/i, /^(?:\n)/i, /^(?:::icon\()/i, /^(?:[\s]+[\n])/i, /^(?:[\n]+)/i, /^(?:[^\)]+)/i, /^(?:\))/i, /^(?:-\))/i, /^(?:\(-)/i, /^(?:\)\))/i, /^(?:\))/i, /^(?:\(\()/i, /^(?:\{\{)/i, /^(?:\()/i, /^(?:\[)/i, /^(?:[\s]+)/i, /^(?:[^\(\[\n\-\)\{\}]+)/i, /^(?:$)/i, /^(?:["])/i, /^(?:[^"]+)/i, /^(?:["])/i, /^(?:[\)]\))/i, /^(?:[\)])/i, /^(?:[\]])/i, /^(?:\}\})/i, /^(?:\(-)/i, /^(?:-\))/i, /^(?:\(\()/i, /^(?:\()/i, /^(?:[^\)\]\(\}]+)/i, /^(?:.+(?!\(\())/i], + conditions: { "CLASS": { "rules": [3, 4], "inclusive": false }, "ICON": { "rules": [8, 9], "inclusive": false }, "NSTR": { "rules": [22, 23], "inclusive": false }, "NODE": { "rules": [21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33], "inclusive": false }, "INITIAL": { "rules": [0, 1, 2, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "inclusive": true } } + }; + return lexer2; + }(); + parser2.lexer = lexer; + function Parser() { + this.yy = {}; + } + Parser.prototype = parser2; + parser2.Parser = Parser; + return new Parser(); +}(); +parser.parser = parser; +const mindmapParser = parser; +const sanitizeText = (text) => (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.n)(text, (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)()); +let nodes = []; +let cnt = 0; +let elements = {}; +const clear = () => { + nodes = []; + cnt = 0; + elements = {}; +}; +const getParent = function(level) { + for (let i = nodes.length - 1; i >= 0; i--) { + if (nodes[i].level < level) { + return nodes[i]; + } + } + return null; +}; +const getMindmap = () => { + return nodes.length > 0 ? nodes[0] : null; +}; +const addNode = (level, id, descr, type) => { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.info("addNode", level, id, descr, type); + const conf = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)(); + const node = { + id: cnt++, + nodeId: sanitizeText(id), + level, + descr: sanitizeText(descr), + type, + children: [], + width: (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)().mindmap.maxNodeWidth + }; + switch (node.type) { + case nodeType.ROUNDED_RECT: + node.padding = 2 * conf.mindmap.padding; + break; + case nodeType.RECT: + node.padding = 2 * conf.mindmap.padding; + break; + case nodeType.HEXAGON: + node.padding = 2 * conf.mindmap.padding; + break; + default: + node.padding = conf.mindmap.padding; + } + const parent = getParent(level); + if (parent) { + parent.children.push(node); + nodes.push(node); + } else { + if (nodes.length === 0) { + nodes.push(node); + } else { + let error = new Error( + 'There can be only one root. No parent could be found for ("' + node.descr + '")' + ); + error.hash = { + text: "branch " + name, + token: "branch " + name, + line: "1", + loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 }, + expected: ['"checkout ' + name + '"'] + }; + throw error; + } + } +}; +const nodeType = { + DEFAULT: 0, + NO_BORDER: 0, + ROUNDED_RECT: 1, + RECT: 2, + CIRCLE: 3, + CLOUD: 4, + BANG: 5, + HEXAGON: 6 +}; +const getType = (startStr, endStr) => { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.debug("In get type", startStr, endStr); + switch (startStr) { + case "[": + return nodeType.RECT; + case "(": + return endStr === ")" ? nodeType.ROUNDED_RECT : nodeType.CLOUD; + case "((": + return nodeType.CIRCLE; + case ")": + return nodeType.CLOUD; + case "))": + return nodeType.BANG; + case "{{": + return nodeType.HEXAGON; + default: + return nodeType.DEFAULT; + } +}; +const setElementForId = (id, element) => { + elements[id] = element; +}; +const decorateNode = (decoration) => { + const node = nodes[nodes.length - 1]; + if (decoration && decoration.icon) { + node.icon = sanitizeText(decoration.icon); + } + if (decoration && decoration.class) { + node.class = sanitizeText(decoration.class); + } +}; +const type2Str = (type) => { + switch (type) { + case nodeType.DEFAULT: + return "no-border"; + case nodeType.RECT: + return "rect"; + case nodeType.ROUNDED_RECT: + return "rounded-rect"; + case nodeType.CIRCLE: + return "circle"; + case nodeType.CLOUD: + return "cloud"; + case nodeType.BANG: + return "bang"; + case nodeType.HEXAGON: + return "hexgon"; + default: + return "no-border"; + } +}; +let parseError; +const setErrorHandler = (handler) => { + parseError = handler; +}; +const getLogger = () => _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l; +const getNodeById = (id) => nodes[id]; +const getElementById = (id) => elements[id]; +const mindmapDb = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + addNode, + clear, + decorateNode, + getElementById, + getLogger, + getMindmap, + getNodeById, + getType, + nodeType, + get parseError() { + return parseError; + }, + sanitizeText, + setElementForId, + setErrorHandler, + type2Str +}, Symbol.toStringTag, { value: "Module" })); +const MAX_SECTIONS = 12; +function wrap(text, width) { + text.each(function() { + var text2 = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(this), words = text2.text().split(/(\s+|
)/).reverse(), word, line = [], lineHeight = 1.1, y = text2.attr("y"), dy = parseFloat(text2.attr("dy")), tspan = text2.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em"); + for (let j = 0; j < words.length; j++) { + word = words[words.length - 1 - j]; + line.push(word); + tspan.text(line.join(" ").trim()); + if (tspan.node().getComputedTextLength() > width || word === "
") { + line.pop(); + tspan.text(line.join(" ").trim()); + if (word === "
") { + line = [""]; + } else { + line = [word]; + } + tspan = text2.append("tspan").attr("x", 0).attr("y", y).attr("dy", lineHeight + "em").text(word); + } + } + }); +} +const defaultBkg = function(elem, node, section) { + const rd = 5; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr( + "d", + `M0 ${node.height - rd} v${-node.height + 2 * rd} q0,-5 5,-5 h${node.width - 2 * rd} q5,0 5,5 v${node.height - rd} H0 Z` + ); + elem.append("line").attr("class", "node-line-" + section).attr("x1", 0).attr("y1", node.height).attr("x2", node.width).attr("y2", node.height); +}; +const rectBkg = function(elem, node) { + elem.append("rect").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr("height", node.height).attr("width", node.width); +}; +const cloudBkg = function(elem, node) { + const w = node.width; + const h = node.height; + const r1 = 0.15 * w; + const r2 = 0.25 * w; + const r3 = 0.35 * w; + const r4 = 0.2 * w; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr( + "d", + `M0 0 a${r1},${r1} 0 0,1 ${w * 0.25},${-1 * w * 0.1} + a${r3},${r3} 1 0,1 ${w * 0.4},${-1 * w * 0.1} + a${r2},${r2} 1 0,1 ${w * 0.35},${1 * w * 0.2} + + a${r1},${r1} 1 0,1 ${w * 0.15},${1 * h * 0.35} + a${r4},${r4} 1 0,1 ${-1 * w * 0.15},${1 * h * 0.65} + + a${r2},${r1} 1 0,1 ${-1 * w * 0.25},${w * 0.15} + a${r3},${r3} 1 0,1 ${-1 * w * 0.5},${0} + a${r1},${r1} 1 0,1 ${-1 * w * 0.25},${-1 * w * 0.15} + + a${r1},${r1} 1 0,1 ${-1 * w * 0.1},${-1 * h * 0.35} + a${r4},${r4} 1 0,1 ${w * 0.1},${-1 * h * 0.65} + + H0 V0 Z` + ); +}; +const bangBkg = function(elem, node) { + const w = node.width; + const h = node.height; + const r = 0.15 * w; + elem.append("path").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr( + "d", + `M0 0 a${r},${r} 1 0,0 ${w * 0.25},${-1 * h * 0.1} + a${r},${r} 1 0,0 ${w * 0.25},${0} + a${r},${r} 1 0,0 ${w * 0.25},${0} + a${r},${r} 1 0,0 ${w * 0.25},${1 * h * 0.1} + + a${r},${r} 1 0,0 ${w * 0.15},${1 * h * 0.33} + a${r * 0.8},${r * 0.8} 1 0,0 ${0},${1 * h * 0.34} + a${r},${r} 1 0,0 ${-1 * w * 0.15},${1 * h * 0.33} + + a${r},${r} 1 0,0 ${-1 * w * 0.25},${h * 0.15} + a${r},${r} 1 0,0 ${-1 * w * 0.25},${0} + a${r},${r} 1 0,0 ${-1 * w * 0.25},${0} + a${r},${r} 1 0,0 ${-1 * w * 0.25},${-1 * h * 0.15} + + a${r},${r} 1 0,0 ${-1 * w * 0.1},${-1 * h * 0.33} + a${r * 0.8},${r * 0.8} 1 0,0 ${0},${-1 * h * 0.34} + a${r},${r} 1 0,0 ${w * 0.1},${-1 * h * 0.33} + + H0 V0 Z` + ); +}; +const circleBkg = function(elem, node) { + elem.append("circle").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr("r", node.width / 2); +}; +function insertPolygonShape(parent, w, h, points, node) { + return parent.insert("polygon", ":first-child").attr( + "points", + points.map(function(d) { + return d.x + "," + d.y; + }).join(" ") + ).attr("transform", "translate(" + (node.width - w) / 2 + ", " + h + ")"); +} +const hexagonBkg = function(elem, node) { + const h = node.height; + const f = 4; + const m = h / f; + const w = node.width - node.padding + 2 * m; + const points = [ + { x: m, y: 0 }, + { x: w - m, y: 0 }, + { x: w, y: -h / 2 }, + { x: w - m, y: -h }, + { x: m, y: -h }, + { x: 0, y: -h / 2 } + ]; + insertPolygonShape(elem, w, h, points, node); +}; +const roundedRectBkg = function(elem, node) { + elem.append("rect").attr("id", "node-" + node.id).attr("class", "node-bkg node-" + type2Str(node.type)).attr("height", node.height).attr("rx", node.padding).attr("ry", node.padding).attr("width", node.width); +}; +const drawNode = function(elem, node, fullSection, conf) { + const section = fullSection % (MAX_SECTIONS - 1); + const nodeElem = elem.append("g"); + node.section = section; + let sectionClass = "section-" + section; + if (section < 0) { + sectionClass += " section-root"; + } + nodeElem.attr("class", (node.class ? node.class + " " : "") + "mindmap-node " + sectionClass); + const bkgElem = nodeElem.append("g"); + const textElem = nodeElem.append("g"); + const txt = textElem.append("text").text(node.descr).attr("dy", "1em").attr("alignment-baseline", "middle").attr("dominant-baseline", "middle").attr("text-anchor", "middle").call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf.fontSize.replace ? conf.fontSize.replace("px", "") : conf.fontSize; + node.height = bbox.height + fontSize * 1.1 * 0.5 + node.padding; + node.width = bbox.width + 2 * node.padding; + if (node.icon) { + if (node.type === nodeType.CIRCLE) { + node.height += 50; + node.width += 50; + const icon = nodeElem.append("foreignObject").attr("height", "50px").attr("width", node.width).attr("style", "text-align: center;"); + icon.append("div").attr("class", "icon-container").append("i").attr("class", "node-icon-" + section + " " + node.icon); + textElem.attr( + "transform", + "translate(" + node.width / 2 + ", " + (node.height / 2 - 1.5 * node.padding) + ")" + ); + } else { + node.width += 50; + const orgHeight = node.height; + node.height = Math.max(orgHeight, 60); + const heightDiff = Math.abs(node.height - orgHeight); + const icon = nodeElem.append("foreignObject").attr("width", "60px").attr("height", node.height).attr("style", "text-align: center;margin-top:" + heightDiff / 2 + "px;"); + icon.append("div").attr("class", "icon-container").append("i").attr("class", "node-icon-" + section + " " + node.icon); + textElem.attr( + "transform", + "translate(" + (25 + node.width / 2) + ", " + (heightDiff / 2 + node.padding / 2) + ")" + ); + } + } else { + textElem.attr("transform", "translate(" + node.width / 2 + ", " + node.padding / 2 + ")"); + } + switch (node.type) { + case nodeType.DEFAULT: + defaultBkg(bkgElem, node, section); + break; + case nodeType.ROUNDED_RECT: + roundedRectBkg(bkgElem, node); + break; + case nodeType.RECT: + rectBkg(bkgElem, node); + break; + case nodeType.CIRCLE: + bkgElem.attr("transform", "translate(" + node.width / 2 + ", " + +node.height / 2 + ")"); + circleBkg(bkgElem, node); + break; + case nodeType.CLOUD: + cloudBkg(bkgElem, node); + break; + case nodeType.BANG: + bangBkg(bkgElem, node); + break; + case nodeType.HEXAGON: + hexagonBkg(bkgElem, node); + break; + } + setElementForId(node.id, nodeElem); + return node.height; +}; +const drawEdge = function drawEdge2(edgesElem, mindmap, parent, depth, fullSection) { + const section = fullSection % (MAX_SECTIONS - 1); + const sx = parent.x + parent.width / 2; + const sy = parent.y + parent.height / 2; + const ex = mindmap.x + mindmap.width / 2; + const ey = mindmap.y + mindmap.height / 2; + const mx = ex > sx ? sx + Math.abs(sx - ex) / 2 : sx - Math.abs(sx - ex) / 2; + const my = ey > sy ? sy + Math.abs(sy - ey) / 2 : sy - Math.abs(sy - ey) / 2; + const qx = ex > sx ? Math.abs(sx - mx) / 2 + sx : -Math.abs(sx - mx) / 2 + sx; + const qy = ey > sy ? Math.abs(sy - my) / 2 + sy : -Math.abs(sy - my) / 2 + sy; + edgesElem.append("path").attr( + "d", + parent.direction === "TB" || parent.direction === "BT" ? `M${sx},${sy} Q${sx},${qy} ${mx},${my} T${ex},${ey}` : `M${sx},${sy} Q${qx},${sy} ${mx},${my} T${ex},${ey}` + ).attr("class", "edge section-edge-" + section + " edge-depth-" + depth); +}; +const positionNode = function(node) { + const nodeElem = getElementById(node.id); + const x = node.x || 0; + const y = node.y || 0; + nodeElem.attr("transform", "translate(" + x + "," + y + ")"); +}; +const svgDraw = { drawNode, positionNode, drawEdge }; +cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1___default().use((cytoscape_cose_bilkent__WEBPACK_IMPORTED_MODULE_2___default())); +function drawNodes(svg, mindmap, section, conf) { + svgDraw.drawNode(svg, mindmap, section, conf); + if (mindmap.children) { + mindmap.children.forEach((child, index) => { + drawNodes(svg, child, section < 0 ? index : section, conf); + }); + } +} +function drawEdges(edgesEl, cy) { + cy.edges().map((edge, id) => { + const data = edge.data(); + if (edge[0]._private.bodyBounds) { + const bounds = edge[0]._private.rscratch; + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.trace("Edge: ", id, data); + edgesEl.insert("path").attr( + "d", + `M ${bounds.startX},${bounds.startY} L ${bounds.midX},${bounds.midY} L${bounds.endX},${bounds.endY} ` + ).attr("class", "edge section-edge-" + data.section + " edge-depth-" + data.depth); + } + }); +} +function addNodes(mindmap, cy, conf, level) { + cy.add({ + group: "nodes", + data: { + id: mindmap.id, + labelText: mindmap.descr, + height: mindmap.height, + width: mindmap.width, + level, + nodeId: mindmap.id, + padding: mindmap.padding, + type: mindmap.type + }, + position: { + x: mindmap.x, + y: mindmap.y + } + }); + if (mindmap.children) { + mindmap.children.forEach((child) => { + addNodes(child, cy, conf, level + 1); + cy.add({ + group: "edges", + data: { + id: `${mindmap.id}_${child.id}`, + source: mindmap.id, + target: child.id, + depth: level, + section: child.section + } + }); + }); + } +} +function layoutMindmap(node, conf) { + return new Promise((resolve) => { + const renderEl = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body").append("div").attr("id", "cy").attr("style", "display:none"); + const cy = cytoscape_dist_cytoscape_umd_js__WEBPACK_IMPORTED_MODULE_1___default()({ + container: document.getElementById("cy"), + // container to render in + style: [ + { + selector: "edge", + style: { + "curve-style": "bezier" + } + } + ] + }); + renderEl.remove(); + addNodes(node, cy, conf, 0); + cy.nodes().forEach(function(n) { + n.layoutDimensions = () => { + const data = n.data(); + return { w: data.width, h: data.height }; + }; + }); + cy.layout({ + name: "cose-bilkent", + quality: "proof", + // headless: true, + styleEnabled: false, + animate: false + }).run(); + cy.ready((e) => { + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.info("Ready", e); + resolve(cy); + }); + }); +} +function positionNodes(cy) { + cy.nodes().map((node, id) => { + const data = node.data(); + data.x = node.position().x; + data.y = node.position().y; + svgDraw.positionNode(data); + const el = getElementById(data.nodeId); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.info("Id:", id, "Position: (", node.position().x, ", ", node.position().y, ")", data); + el.attr( + "transform", + `translate(${node.position().x - data.width / 2}, ${node.position().y - data.height / 2})` + ); + el.attr("attr", `apa-${id})`); + }); +} +const draw = async (text, id, version, diagObj) => { + const conf = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)(); + diagObj.db.clear(); + diagObj.parser.parse(text); + _mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.l.debug("Renering info diagram\n" + text); + const securityLevel = (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.g)().securityLevel; + let sandboxElement; + if (securityLevel === "sandbox") { + sandboxElement = (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("#i" + id); + } + const root = securityLevel === "sandbox" ? (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)(sandboxElement.nodes()[0].contentDocument.body) : (0,d3__WEBPACK_IMPORTED_MODULE_0__/* .select */ .Ys)("body"); + const svg = root.select("#" + id); + svg.append("g"); + const mm = diagObj.db.getMindmap(); + const edgesElem = svg.append("g"); + edgesElem.attr("class", "mindmap-edges"); + const nodesElem = svg.append("g"); + nodesElem.attr("class", "mindmap-nodes"); + drawNodes(nodesElem, mm, -1, conf); + const cy = await layoutMindmap(mm, conf); + drawEdges(edgesElem, cy); + positionNodes(cy); + (0,_mermaid_ae477ddf_js__WEBPACK_IMPORTED_MODULE_13__.s)(void 0, svg, conf.mindmap.padding, conf.mindmap.useMaxWidth); +}; +const mindmapRenderer = { + draw +}; +const genSections = (options) => { + let sections = ""; + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + options["lineColor" + i] = options["lineColor" + i] || options["cScaleInv" + i]; + if ((0,khroma__WEBPACK_IMPORTED_MODULE_14__/* ["default"] */ .Z)(options["lineColor" + i])) { + options["lineColor" + i] = (0,khroma__WEBPACK_IMPORTED_MODULE_15__/* ["default"] */ .Z)(options["lineColor" + i], 20); + } else { + options["lineColor" + i] = (0,khroma__WEBPACK_IMPORTED_MODULE_16__/* ["default"] */ .Z)(options["lineColor" + i], 20); + } + } + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + const sw = "" + (17 - 3 * i); + sections += ` + .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${i - 1} polygon, .section-${i - 1} path { + fill: ${options["cScale" + i]}; + } + .section-${i - 1} text { + fill: ${options["cScaleLabel" + i]}; + } + .node-icon-${i - 1} { + font-size: 40px; + color: ${options["cScaleLabel" + i]}; + } + .section-edge-${i - 1}{ + stroke: ${options["cScale" + i]}; + } + .edge-depth-${i - 1}{ + stroke-width: ${sw}; + } + .section-${i - 1} line { + stroke: ${options["cScaleInv" + i]} ; + stroke-width: 3; + } + + .disabled, .disabled circle, .disabled text { + fill: lightgray; + } + .disabled text { + fill: #efefef; + } + `; + } + return sections; +}; +const getStyles = (options) => ` + .edge { + stroke-width: 3; + } + ${genSections(options)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${options.git0}; + } + .section-root text { + fill: ${options.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } +`; +const mindmapStyles = getStyles; +const diagram = { + db: mindmapDb, + renderer: mindmapRenderer, + parser: mindmapParser, + styles: mindmapStyles +}; + +//# sourceMappingURL=mindmap-definition-44684416.js.map + + +/***/ }), + +/***/ 91619: +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + Z: () => (/* binding */ is_dark) +}); + +// EXTERNAL MODULE: ./node_modules/khroma/dist/utils/index.js + 3 modules +var utils = __webpack_require__(61691); +// EXTERNAL MODULE: ./node_modules/khroma/dist/color/index.js + 4 modules +var dist_color = __webpack_require__(71610); +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/luminance.js +/* IMPORT */ + + +/* MAIN */ +//SOURCE: https://planetcalc.com/7779 +const luminance = (color) => { + const { r, g, b } = dist_color/* default */.Z.parse(color); + const luminance = .2126 * utils/* default */.Z.channel.toLinear(r) + .7152 * utils/* default */.Z.channel.toLinear(g) + .0722 * utils/* default */.Z.channel.toLinear(b); + return utils/* default */.Z.lang.round(luminance); +}; +/* EXPORT */ +/* harmony default export */ const methods_luminance = (luminance); + +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/is_light.js +/* IMPORT */ + +/* MAIN */ +const isLight = (color) => { + return methods_luminance(color) >= .5; +}; +/* EXPORT */ +/* harmony default export */ const is_light = (isLight); + +;// CONCATENATED MODULE: ./node_modules/khroma/dist/methods/is_dark.js +/* IMPORT */ + +/* MAIN */ +const isDark = (color) => { + return !is_light(color); +}; +/* EXPORT */ +/* harmony default export */ const is_dark = (isDark); + + +/***/ }) + +}; +; \ No newline at end of file diff --git a/assets/js/73d5f13d.2c8e245a.js b/assets/js/73d5f13d.2c8e245a.js new file mode 100644 index 0000000..34eb8f8 --- /dev/null +++ b/assets/js/73d5f13d.2c8e245a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7555],{3974:t=>{t.exports=JSON.parse('{"label":"iterators","permalink":"/ib002/tags/iterators","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"graphs/iterative-and-iterators","title":"Iterative algorithms via iterators","description":"Iterative DFS using iterators.\\n","permalink":"/ib002/graphs/iterative-and-iterators"}]}')}}]); \ No newline at end of file diff --git a/assets/js/74c2e0e9.fc48acce.js b/assets/js/74c2e0e9.fc48acce.js new file mode 100644 index 0000000..086643c --- /dev/null +++ b/assets/js/74c2e0e9.fc48acce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3528],{2235:i=>{i.exports=JSON.parse('{"label":"backtracking","permalink":"/ib002/tags/backtracking","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"recursion/karel-1","title":"Recursion and backtracking with Robot Karel","description":"A problem with too many restrictions.\\n","permalink":"/ib002/recursion/karel-1"}]}')}}]); \ No newline at end of file diff --git a/assets/js/7515.45da5915.js b/assets/js/7515.45da5915.js new file mode 100644 index 0000000..4d47702 --- /dev/null +++ b/assets/js/7515.45da5915.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7515],{4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(7294),l=n(5999),o=n(833),r=n(7452);function i(){return a.createElement(a.Fragment,null,a.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"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/75316eff.a7b24a88.js b/assets/js/75316eff.a7b24a88.js new file mode 100644 index 0000000..f045c6f --- /dev/null +++ b/assets/js/75316eff.a7b24a88.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4287],{5603:i=>{i.exports=JSON.parse('{"label":"python","permalink":"/ib002/tags/python","allTagsPath":"/ib002/tags","count":3,"items":[{"id":"recursion/karel-1","title":"Recursion and backtracking with Robot Karel","description":"A problem with too many restrictions.\\n","permalink":"/ib002/recursion/karel-1"},{"id":"time-complexity/extend","title":"Time complexity of \u2039extend\u203a","description":"How to make inefficient algorithm unknowingly.\\n","permalink":"/ib002/time-complexity/extend"},{"id":"algorithms-correctness/postcondition-ambiguity","title":"Vague postconditions and proving correctness of algorithms","description":"Debugging and testing with precise postconditions.\\n","permalink":"/ib002/algorithms-correctness/postcondition-ambiguity"}]}')}}]); \ No newline at end of file diff --git a/assets/js/75cccf44.5b6f1b34.js b/assets/js/75cccf44.5b6f1b34.js new file mode 100644 index 0000000..0f2a841 --- /dev/null +++ b/assets/js/75cccf44.5b6f1b34.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4256],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>u});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function l(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=o.createContext({}),s=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=s(e.components);return o.createElement(c.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),m=s(r),f=n,u=m["".concat(c,".").concat(f)]||m[f]||d[f]||a;return r?o.createElement(u,l(l({ref:t},p),{},{components:r})):o.createElement(u,l({ref:t},p))}));function u(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,l=new Array(a);l[0]=f;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[m]="string"==typeof e?e:n,l[1]=i;for(var s=2;s{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>s});var o=r(7462),n=(r(7294),r(3905));const a={title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15",slug:"leetcode/sort-diagonally",authors:"mf",tags:["cpp","leetcode","iterators"],hide_table_of_contents:!1},l=void 0,i={permalink:"/blog/leetcode/sort-diagonally",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md",source:"@site/blog/leetcode/sort-matrix-diagonally.md",title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15:00.000Z",formattedDate:"March 4, 2023",tags:[{label:"cpp",permalink:"/blog/tags/cpp"},{label:"leetcode",permalink:"/blog/tags/leetcode"},{label:"iterators",permalink:"/blog/tags/iterators"}],readingTime:16.99,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15",slug:"leetcode/sort-diagonally",authors:"mf",tags:["cpp","leetcode","iterators"],hide_table_of_contents:!1},prevItem:{title:"3rd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/3rd-week"},nextItem:{title:"2nd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/2nd-week"}},c={authorsImageUrls:[void 0]},s=[],p={toc:s},m="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,o.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Let's try to solve one of the LeetCode challenges in easy and hard mode at the\nsame time."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/765ea78b.eff9c6dc.js b/assets/js/765ea78b.eff9c6dc.js new file mode 100644 index 0000000..be23db0 --- /dev/null +++ b/assets/js/765ea78b.eff9c6dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3039],{3010:a=>{a.exports=JSON.parse('{"label":"\ud83c\udfed","permalink":"/blog/tags/\ud83c\udfed","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/7724.0fff5da7.js b/assets/js/7724.0fff5da7.js new file mode 100644 index 0000000..ea3c90d --- /dev/null +++ b/assets/js/7724.0fff5da7.js @@ -0,0 +1,2 @@ +/*! For license information please see 7724.0fff5da7.js.LICENSE.txt */ +(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7724],{4182:function(e,t,n){var r;r=function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(t,n){t.exports=e},function(e,t,n){"use strict";var r=n(0).FDLayoutConstants;function i(){}for(var a in r)i[a]=r[a];i.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,i.DEFAULT_RADIAL_SEPARATION=r.DEFAULT_EDGE_LENGTH,i.DEFAULT_COMPONENT_SEPERATION=60,i.TILE=!0,i.TILING_PADDING_VERTICAL=10,i.TILING_PADDING_HORIZONTAL=10,i.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=i},function(e,t,n){"use strict";var r=n(0).FDLayoutEdge;function i(e,t,n){r.call(this,e,t,n)}for(var a in i.prototype=Object.create(r.prototype),r)i[a]=r[a];e.exports=i},function(e,t,n){"use strict";var r=n(0).LGraph;function i(e,t,n){r.call(this,e,t,n)}for(var a in i.prototype=Object.create(r.prototype),r)i[a]=r[a];e.exports=i},function(e,t,n){"use strict";var r=n(0).LGraphManager;function i(e){r.call(this,e)}for(var a in i.prototype=Object.create(r.prototype),r)i[a]=r[a];e.exports=i},function(e,t,n){"use strict";var r=n(0).FDLayoutNode,i=n(0).IMath;function a(e,t,n,i){r.call(this,e,t,n,i)}for(var o in a.prototype=Object.create(r.prototype),r)a[o]=r[o];a.prototype.move=function(){var e=this.graphManager.getLayout();this.displacementX=e.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=e.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>e.coolingFactor*e.maxNodeDisplacement&&(this.displacementX=e.coolingFactor*e.maxNodeDisplacement*i.sign(this.displacementX)),Math.abs(this.displacementY)>e.coolingFactor*e.maxNodeDisplacement&&(this.displacementY=e.coolingFactor*e.maxNodeDisplacement*i.sign(this.displacementY)),null==this.child||0==this.child.getNodes().length?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),e.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},a.prototype.propogateDisplacementToChildren=function(e,t){for(var n,r=this.getChild().getNodes(),i=0;i0)this.positionNodesRadially(e);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var t=new Set(this.getAllNodes()),n=this.nodesWithGravity.filter((function(e){return t.has(e)}));this.graphManager.setAllNodesToApplyGravitation(n),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},m.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}if(this.totalIterations%u.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged()){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}this.coolingCycle++,0==this.layoutQuality?this.coolingAdjuster=this.coolingCycle:1==this.layoutQuality&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var e=new Set(this.getAllNodes()),t=this.nodesWithGravity.filter((function(t){return e.has(t)}));this.graphManager.setAllNodesToApplyGravitation(t),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=u.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=u.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var n=!this.isTreeGrowing&&!this.isGrowthFinished,r=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(n,r),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},m.prototype.getPositionsData=function(){for(var e=this.graphManager.getAllNodes(),t={},n=0;n1)for(s=0;sr&&(r=Math.floor(o.y)),a=Math.floor(o.x+l.DEFAULT_COMPONENT_SEPERATION)}this.transform(new d(c.WORLD_CENTER_X-o.x/2,c.WORLD_CENTER_Y-o.y/2))},m.radialLayout=function(e,t,n){var r=Math.max(this.maxDiagonalInTree(e),l.DEFAULT_RADIAL_SEPARATION);m.branchRadialLayout(t,null,0,359,0,r);var i=v.calculateBounds(e),a=new y;a.setDeviceOrgX(i.getMinX()),a.setDeviceOrgY(i.getMinY()),a.setWorldOrgX(n.x),a.setWorldOrgY(n.y);for(var o=0;o1;){var y=v[0];v.splice(0,1);var b=c.indexOf(y);b>=0&&c.splice(b,1),g--,h--}d=null!=t?(c.indexOf(v[0])+1)%g:0;for(var x=Math.abs(r-n)/h,w=d;p!=h;w=++w%g){var E=c[w].getOtherEnd(e);if(E!=t){var T=(n+p*x)%360,_=(T+x)%360;m.branchRadialLayout(E,e,T,_,i+a,a),p++}}},m.maxDiagonalInTree=function(e){for(var t=g.MIN_VALUE,n=0;nt&&(t=r)}return t},m.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},m.prototype.groupZeroDegreeMembers=function(){var e=this,t={};this.memberGroups={},this.idToDummyNode={};for(var n=[],r=this.graphManager.getAllNodes(),i=0;i1){var r="DummyCompound_"+n;e.memberGroups[r]=t[n];var i=t[n][0].getParent(),a=new o(e.graphManager);a.id=r,a.paddingLeft=i.paddingLeft||0,a.paddingRight=i.paddingRight||0,a.paddingBottom=i.paddingBottom||0,a.paddingTop=i.paddingTop||0,e.idToDummyNode[r]=a;var s=e.getGraphManager().add(e.newGraph(),a),l=i.getChild();l.add(a);for(var u=0;u=0;e--){var t=this.compoundOrder[e],n=t.id,r=t.paddingLeft,i=t.paddingTop;this.adjustLocations(this.tiledMemberPack[n],t.rect.x,t.rect.y,r,i)}},m.prototype.repopulateZeroDegreeMembers=function(){var e=this,t=this.tiledZeroDegreePack;Object.keys(t).forEach((function(n){var r=e.idToDummyNode[n],i=r.paddingLeft,a=r.paddingTop;e.adjustLocations(t[n],r.rect.x,r.rect.y,i,a)}))},m.prototype.getToBeTiled=function(e){var t=e.id;if(null!=this.toBeTiled[t])return this.toBeTiled[t];var n=e.getChild();if(null==n)return this.toBeTiled[t]=!1,!1;for(var r=n.getNodes(),i=0;i0)return this.toBeTiled[t]=!1,!1;if(null!=a.getChild()){if(!this.getToBeTiled(a))return this.toBeTiled[t]=!1,!1}else this.toBeTiled[a.id]=!1}return this.toBeTiled[t]=!0,!0},m.prototype.getNodeDegree=function(e){e.id;for(var t=e.getEdges(),n=0,r=0;rl&&(l=c.rect.height)}n+=l+e.verticalPadding}},m.prototype.tileCompoundMembers=function(e,t){var n=this;this.tiledMemberPack=[],Object.keys(e).forEach((function(r){var i=t[r];n.tiledMemberPack[r]=n.tileNodes(e[r],i.paddingLeft+i.paddingRight),i.rect.width=n.tiledMemberPack[r].width,i.rect.height=n.tiledMemberPack[r].height}))},m.prototype.tileNodes=function(e,t){var n={rows:[],rowWidth:[],rowHeight:[],width:0,height:t,verticalPadding:l.TILING_PADDING_VERTICAL,horizontalPadding:l.TILING_PADDING_HORIZONTAL};e.sort((function(e,t){return e.rect.width*e.rect.height>t.rect.width*t.rect.height?-1:e.rect.width*e.rect.height0&&(a+=e.horizontalPadding),e.rowWidth[n]=a,e.width0&&(o+=e.verticalPadding);var s=0;o>e.rowHeight[n]&&(s=e.rowHeight[n],e.rowHeight[n]=o,s=e.rowHeight[n]-s),e.height+=s,e.rows[n].push(t)},m.prototype.getShortestRowIndex=function(e){for(var t=-1,n=Number.MAX_VALUE,r=0;rn&&(t=r,n=e.rowWidth[r]);return t},m.prototype.canAddHorizontal=function(e,t,n){var r=this.getShortestRowIndex(e);if(r<0)return!0;var i=e.rowWidth[r];if(i+e.horizontalPadding+t<=e.width)return!0;var a,o,s=0;return e.rowHeight[r]0&&(s=n+e.verticalPadding-e.rowHeight[r]),a=e.width-i>=t+e.horizontalPadding?(e.height+s)/(i+t+e.horizontalPadding):(e.height+s)/e.width,s=n+e.verticalPadding,(o=e.widtha&&t!=n){r.splice(-1,1),e.rows[n].push(i),e.rowWidth[t]=e.rowWidth[t]-a,e.rowWidth[n]=e.rowWidth[n]+a,e.width=e.rowWidth[instance.getLongestRowIndex(e)];for(var o=Number.MIN_VALUE,s=0;so&&(o=r[s].height);t>0&&(o+=e.verticalPadding);var l=e.rowHeight[t]+e.rowHeight[n];e.rowHeight[t]=o,e.rowHeight[n]0)for(var c=i;c<=a;c++)l[0]+=this.grid[c][o-1].length+this.grid[c][o].length-1;if(a0)for(c=o;c<=s;c++)l[3]+=this.grid[i-1][c].length+this.grid[i][c].length-1;for(var h,d,p=g.MAX_VALUE,f=0;f0&&(o=n.getGraphManager().add(n.newGraph(),a),this.processChildrenList(o,h,n))}},h.prototype.stop=function(){return this.stopped=!0,this};var p=function(e){e("layout","cose-bilkent",h)};"undefined"!=typeof cytoscape&&p(cytoscape),e.exports=p}])},e.exports=r(n(4182))},1377:function(e,t,n){e.exports=function(){"use strict";function e(t){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(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);nt?1:0},Z=function(e,t){return-1*K(e,t)},Q=null!=Object.assign?Object.assign.bind(Object):function(e){for(var t=arguments,n=1;n1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var c=new RegExp("^"+H+"$").exec(e);if(c){if((n=parseInt(c[1]))<0?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,(r=parseFloat(c[2]))<0||r>100)return;if(r/=100,(i=parseFloat(c[3]))<0||i>100)return;if(i/=100,void 0!==(a=c[4])&&((a=parseFloat(a))<0||a>1))return;if(0===r)o=s=l=Math.round(255*i);else{var h=i<.5?i*(1+r):i+r-i*r,d=2*i-h;o=Math.round(255*u(d,h,n+1/3)),s=Math.round(255*u(d,h,n)),l=Math.round(255*u(d,h,n-1/3))}t=[o,s,l,a]}return t},te=function(e){var t,n=new RegExp("^"+U+"$").exec(e);if(n){t=[];for(var r=[],i=1;i<=3;i++){var a=n[i];if("%"===a[a.length-1]&&(r[i]=!0),a=parseFloat(a),r[i]&&(a=a/100*255),a<0||a>255)return;t.push(Math.floor(a))}var o=r[1]||r[2]||r[3],s=r[1]&&r[2]&&r[3];if(o&&!s)return;var l=n[4];if(void 0!==l){if((l=parseFloat(l))<0||l>1)return;t.push(l)}}return t},ne=function(e){return ie[e.toLowerCase()]},re=function(e){return(w(e)?e:null)||ne(e)||J(e)||te(e)||ee(e)},ie={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},ae=function(e){for(var t=e.map,n=e.keys,r=n.length,i=0;i=t||n<0||h&&e-u>=a}function y(){var e=ge();if(v(e))return m(e);s=setTimeout(y,f(e))}function m(e){return s=void 0,d&&r?p(e):(r=i=void 0,o)}function b(){void 0!==s&&clearTimeout(s),u=0,r=l=i=s=void 0}function x(){return void 0===s?o:m(ge())}function w(){var e=ge(),n=v(e);if(r=arguments,i=this,l=e,n){if(void 0===s)return g(l);if(h)return clearTimeout(s),s=setTimeout(y,t),p(l)}return void 0===s&&(s=setTimeout(y,t)),o}return t=qe(t)||0,le(n)&&(c=!!n.leading,a=(h="maxWait"in n)?$e(qe(n.maxWait)||0,t):a,d="trailing"in n?!!n.trailing:d),w.cancel=b,w.flush=x,w}var Qe=Ze,Je=d?d.performance:null,et=Je&&Je.now?function(){return Je.now()}:function(){return Date.now()},tt=function(){if(d){if(d.requestAnimationFrame)return function(e){d.requestAnimationFrame(e)};if(d.mozRequestAnimationFrame)return function(e){d.mozRequestAnimationFrame(e)};if(d.webkitRequestAnimationFrame)return function(e){d.webkitRequestAnimationFrame(e)};if(d.msRequestAnimationFrame)return function(e){d.msRequestAnimationFrame(e)}}return function(e){e&&setTimeout((function(){e(et())}),1e3/60)}}(),nt=function(e){return tt(e)},rt=et,it=9261,at=65599,ot=5381,st=function(e){for(var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:it;!(t=e.next()).done;)n=n*at+t.value|0;return n},lt=function(e){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:it)*at+e|0},ut=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ot;return(t<<5)+t+e|0},ct=function(e,t){return 2097152*e+t},ht=function(e){return 2097152*e[0]+e[1]},dt=function(e,t){return[lt(e[0],t[0]),ut(e[1],t[1])]},pt=function(e,t){var n={value:0,done:!1},r=0,i=e.length;return st({next:function(){return r=0&&(e[r]!==t||(e.splice(r,1),!n));r--);},Rt=function(e){e.splice(0,e.length)},Bt=function(e,t){for(var n=0;n2&&void 0!==arguments[2])||arguments[2];if(void 0!==e&&void 0!==t&&S(e)){var r=t.group;if(null==r&&(r=t.data&&null!=t.data.source&&null!=t.data.target?"edges":"nodes"),"nodes"===r||"edges"===r){this.length=1,this[0]=this;var i=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:r,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:void 0===t.selectable||!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:void 0===t.grabbable||!!t.grabbable,pannable:void 0===t.pannable?"edges"===r:!!t.pannable,active:!1,classes:new Ut,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:t.parent&&t.parent.isNode()?t.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(null==i.position.x&&(i.position.x=0),null==i.position.y&&(i.position.y=0),t.renderedPosition){var a=t.renderedPosition,o=e.pan(),s=e.zoom();i.position={x:(a.x-o.x)/s,y:(a.y-o.y)/s}}var l=[];w(t.classes)?l=t.classes:b(t.classes)&&(l=t.classes.split(/\s+/));for(var u=0,c=l.length;ut?1:0},u=function(e,t,i,a,o){var s;if(null==i&&(i=0),null==o&&(o=n),i<0)throw new Error("lo must be non-negative");for(null==a&&(a=e.length);in;0<=n?t++:t--)u.push(t);return u}.apply(this).reverse()).length;af;0<=f?++d:--d)v.push(a(e,r));return v},g=function(e,t,r,i){var a,o,s;for(null==i&&(i=n),a=e[r];r>t&&i(a,o=e[s=r-1>>1])<0;)e[r]=o,r=s;return e[r]=a},f=function(e,t,r){var i,a,o,s,l;for(null==r&&(r=n),a=e.length,l=t,o=e[t],i=2*t+1;i0;){var T=y.pop(),_=f(T),D=T.id();if(h[D]=_,_!==1/0)for(var C=T.neighborhood().intersect(p),N=0;N0)for(n.unshift(t);c[i];){var a=c[i];n.unshift(a.edge),n.unshift(a.node),i=(r=a.node).id()}return o.spawn(n)}}}},Qt={kruskal:function(e){e=e||function(e){return 1};for(var t=this.byGroup(),n=t.nodes,r=t.edges,i=n.length,a=new Array(i),o=n,s=function(e){for(var t=0;t0;){if(x(),E++,u===h){for(var T=[],_=i,D=h,C=m[D];T.unshift(_),null!=C&&T.unshift(C),null!=(_=y[D]);)C=m[D=_.id()];return{found:!0,distance:d[u],path:this.spawn(T),steps:E}}g[u]=!0;for(var N=l._private.edges,A=0;AN&&(p[C]=N,y[C]=D,m[C]=w),!i){var A=D*u+_;!i&&p[A]>N&&(p[A]=N,y[A]=_,m[A]=w)}}}for(var L=0;L1&&void 0!==arguments[1]?arguments[1]:a,r=[],i=m(e);;){if(null==i)return t.spawn();var o=y(i),l=o.edge,u=o.pred;if(r.unshift(i[0]),i.same(n)&&r.length>0)break;null!=l&&r.unshift(l),i=u}return s.spawn(r)},E=0;E=0;u--){var c=l[u],h=c[1],d=c[2];(t[h]===o&&t[d]===s||t[h]===s&&t[d]===o)&&l.splice(u,1)}for(var p=0;pr;){var i=Math.floor(Math.random()*t.length);t=sn(i,e,t),n--}return t},un={kargerStein:function(){var e=this,t=this.byGroup(),n=t.nodes,r=t.edges;r.unmergeBy((function(e){return e.isLoop()}));var i=n.length,a=r.length,o=Math.ceil(Math.pow(Math.log(i)/Math.LN2,2)),s=Math.floor(i/on);if(!(i<2)){for(var l=[],u=0;u1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=1/0,i=t;i1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=-1/0,i=t;i1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=0,i=0,a=t;a1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];arguments.length>3&&void 0!==arguments[3]&&!arguments[3]?(n0&&e.splice(0,t)):e=e.slice(t,n);for(var a=0,o=e.length-1;o>=0;o--){var s=e[o];i?isFinite(s)||(e[o]=-1/0,a++):e.splice(o,1)}r&&e.sort((function(e,t){return e-t}));var l=e.length,u=Math.floor(l/2);return l%2!=0?e[u+1+a]:(e[u-1+a]+e[u+a])/2},mn=function(e){return Math.PI*e/180},bn=function(e,t){return Math.atan2(t,e)-Math.PI/2},xn=Math.log2||function(e){return Math.log(e)/Math.log(2)},wn=function(e){return e>0?1:e<0?-1:0},En=function(e,t){return Math.sqrt(Tn(e,t))},Tn=function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},_n=function(e){for(var t=e.length,n=0,r=0;r=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},Sn=function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},On=function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},In=function(e,t){e.x1=Math.min(e.x1,t.x1),e.x2=Math.max(e.x2,t.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,t.y1),e.y2=Math.max(e.y2,t.y2),e.h=e.y2-e.y1},kn=function(e,t,n){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},Mn=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},Pn=function(e){var t,n,r,i,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0];if(1===a.length)t=n=r=i=a[0];else if(2===a.length)t=r=a[0],i=n=a[1];else if(4===a.length){var s=o(a,4);t=s[0],n=s[1],r=s[2],i=s[3]}return e.x1-=i,e.x2+=n,e.y1-=t,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},Rn=function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},Bn=function(e,t){return!(e.x1>t.x2||t.x1>e.x2||e.x2t.y2||t.y1>e.y2)},Fn=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},zn=function(e,t){return Fn(e,t.x,t.y)},Gn=function(e,t){return Fn(e,t.x1,t.y1)&&Fn(e,t.x2,t.y2)},Yn=function(e,t,n,r,i,a,o){var s,l=cr(i,a),u=i/2,c=a/2,h=r-c-o;if((s=rr(e,t,n,r,n-u+l-o,h,n+u-l+o,h,!1)).length>0)return s;var d=n+u+o;if((s=rr(e,t,n,r,d,r-c+l-o,d,r+c-l+o,!1)).length>0)return s;var p=r+c+o;if((s=rr(e,t,n,r,n-u+l-o,p,n+u-l+o,p,!1)).length>0)return s;var g,f=n-u-o;if((s=rr(e,t,n,r,f,r-c+l-o,f,r+c-l+o,!1)).length>0)return s;var v=n-u+l,y=r-c+l;if((g=tr(e,t,n,r,v,y,l+o)).length>0&&g[0]<=v&&g[1]<=y)return[g[0],g[1]];var m=n+u-l,b=r-c+l;if((g=tr(e,t,n,r,m,b,l+o)).length>0&&g[0]>=m&&g[1]<=b)return[g[0],g[1]];var x=n+u-l,w=r+c-l;if((g=tr(e,t,n,r,x,w,l+o)).length>0&&g[0]>=x&&g[1]>=w)return[g[0],g[1]];var E=n-u+l,T=r+c-l;return(g=tr(e,t,n,r,E,T,l+o)).length>0&&g[0]<=E&&g[1]>=T?[g[0],g[1]]:[]},Xn=function(e,t,n,r,i,a,o){var s=o,l=Math.min(n,i),u=Math.max(n,i),c=Math.min(r,a),h=Math.max(r,a);return l-s<=e&&e<=u+s&&c-s<=t&&t<=h+s},Vn=function(e,t,n,r,i,a,o,s,l){var u={x1:Math.min(n,o,i)-l,x2:Math.max(n,o,i)+l,y1:Math.min(r,s,a)-l,y2:Math.max(r,s,a)+l};return!(eu.x2||tu.y2)},Un=function(e,t,n,r){var i=t*t-4*e*(n-=r);if(i<0)return[];var a=Math.sqrt(i),o=2*e;return[(-t+a)/o,(-t-a)/o]},jn=function(e,t,n,r,i){var a,o,s,l,u,c,h,d;return 0===e&&(e=1e-5),s=-27*(r/=e)+(t/=e)*(9*(n/=e)-t*t*2),a=(o=(3*n-t*t)/9)*o*o+(s/=54)*s,i[1]=0,h=t/3,a>0?(u=(u=s+Math.sqrt(a))<0?-Math.pow(-u,1/3):Math.pow(u,1/3),c=(c=s-Math.sqrt(a))<0?-Math.pow(-c,1/3):Math.pow(c,1/3),i[0]=-h+u+c,h+=(u+c)/2,i[4]=i[2]=-h,h=Math.sqrt(3)*(-c+u)/2,i[3]=h,void(i[5]=-h)):(i[5]=i[3]=0,0===a?(d=s<0?-Math.pow(-s,1/3):Math.pow(s,1/3),i[0]=2*d-h,void(i[4]=i[2]=-(d+h))):(l=(o=-o)*o*o,l=Math.acos(s/Math.sqrt(l)),d=2*Math.sqrt(o),i[0]=-h+d*Math.cos(l/3),i[2]=-h+d*Math.cos((l+2*Math.PI)/3),void(i[4]=-h+d*Math.cos((l+4*Math.PI)/3))))},Hn=function(e,t,n,r,i,a,o,s){var l=[];jn(1*n*n-4*n*i+2*n*o+4*i*i-4*i*o+o*o+r*r-4*r*a+2*r*s+4*a*a-4*a*s+s*s,9*n*i-3*n*n-3*n*o-6*i*i+3*i*o+9*r*a-3*r*r-3*r*s-6*a*a+3*a*s,3*n*n-6*n*i+n*o-n*e+2*i*i+2*i*e-o*e+3*r*r-6*r*a+r*s-r*t+2*a*a+2*a*t-s*t,1*n*i-n*n+n*e-i*e+r*a-r*r+r*t-a*t,l);for(var u=1e-7,c=[],h=0;h<6;h+=2)Math.abs(l[h+1])=0&&l[h]<=1&&c.push(l[h]);c.push(1),c.push(0);for(var d,p,g,f=-1,v=0;v=0?gl?(e-i)*(e-i)+(t-a)*(t-a):u-h},Wn=function(e,t,n){for(var r,i,a,o,s=0,l=0;l=e&&e>=a||r<=e&&e<=a))continue;(e-r)/(a-r)*(o-i)+i>t&&s++}return s%2!=0},$n=function(e,t,n,r,i,a,o,s,l){var u,c=new Array(n.length);null!=s[0]?(u=Math.atan(s[1]/s[0]),s[0]<0?u+=Math.PI/2:u=-u-Math.PI/2):u=s;for(var h,d=Math.cos(-u),p=Math.sin(-u),g=0;g0){var f=Qn(c,-l);h=Zn(f)}else h=c;return Wn(e,t,h)},Kn=function(e,t,n,r,i,a,o){for(var s=new Array(n.length),l=a/2,u=o/2,c=hr(a,o),h=c*c,d=0;d=0&&g<=1&&v.push(g),f>=0&&f<=1&&v.push(f),0===v.length)return[];var y=v[0]*s[0]+e,m=v[0]*s[1]+t;return v.length>1?v[0]==v[1]?[y,m]:[y,m,v[1]*s[0]+e,v[1]*s[1]+t]:[y,m]},nr=function(e,t,n){return t<=e&&e<=n||n<=e&&e<=t?e:e<=t&&t<=n||n<=t&&t<=e?t:n},rr=function(e,t,n,r,i,a,o,s,l){var u=e-i,c=n-e,h=o-i,d=t-a,p=r-t,g=s-a,f=h*d-g*u,v=c*d-p*u,y=g*c-h*p;if(0!==y){var m=f/y,b=v/y,x=.001,w=0-x,E=1+x;return w<=m&&m<=E&&w<=b&&b<=E||l?[e+m*c,t+m*p]:[]}return 0===f||0===v?nr(e,n,o)===o?[o,s]:nr(e,n,i)===i?[i,a]:nr(i,o,n)===n?[n,r]:[]:[]},ir=function(e,t,n,r,i,a,o,s){var l,u,c,h,d,p,g=[],f=new Array(n.length),v=!0;if(null==a&&(v=!1),v){for(var y=0;y0){var m=Qn(f,-s);u=Zn(m)}else u=f}else u=n;for(var b=0;b2){for(var A=[u[0],u[1]],L=Math.pow(A[0]-e,2)+Math.pow(A[1]-t,2),S=1;Su&&(u=t)},get:function(e){return l[e]}},h=0;h0?m.edgesTo(y)[0]:y.edgesTo(m)[0];var x=r(b);y=y.id(),h[y]>h[f]+x&&(h[y]=h[f]+x,d.nodes.indexOf(y)<0?d.push(y):d.updateItem(y),u[y]=0,l[y]=[]),h[y]==h[f]+x&&(u[y]=u[y]+u[f],l[y].push(f))}else for(var w=0;w0;){for(var D=n.pop(),C=0;C0&&o.push(n[s]);0!==o.length&&i.push(r.collection(o))}return i},kr=function(e,t){for(var n=0;n5&&void 0!==arguments[5]?arguments[5]:Br,o=r,s=0;s=2?Vr(e,t,n,0,Gr,Yr):Vr(e,t,n,0,zr)},squaredEuclidean:function(e,t,n){return Vr(e,t,n,0,Gr)},manhattan:function(e,t,n){return Vr(e,t,n,0,zr)},max:function(e,t,n){return Vr(e,t,n,-1/0,Xr)}};function jr(e,t,n,r,i,a){var o;return o=x(e)?e:Ur[e]||Ur.euclidean,0===t&&x(e)?o(i,a):o(t,n,r,i,a)}Ur["squared-euclidean"]=Ur.squaredEuclidean,Ur.squaredeuclidean=Ur.squaredEuclidean;var Hr=Mt({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),qr=function(e){return Hr(e)},Wr=function(e,t,n,r,i){var a="kMedoids"!==i?function(e){return n[e]}:function(e){return r[e](n)},o=function(e){return r[e](t)},s=n,l=t;return jr(e,r.length,a,o,s,l)},$r=function(e,t,n){for(var r=n.length,i=new Array(r),a=new Array(r),o=new Array(t),s=null,l=0;ln)return!1;return!0},ei=function(e,t,n){for(var r=0;ri&&(i=t[l][u],a=u);o[a].push(e[l])}for(var c=0;c=i.threshold||"dendrogram"===i.mode&&1===e.length)return!1;var p,g=t[o],f=t[r[o]];p="dendrogram"===i.mode?{left:g,right:f,key:g.key}:{value:g.value.concat(f.value),key:g.key},e[g.index]=p,e.splice(f.index,1),t[g.key]=p;for(var v=0;vn[f.key][y.key]&&(a=n[f.key][y.key])):"max"===i.linkage?(a=n[g.key][y.key],n[g.key][y.key]0&&r.push(i);return r},Ei=function(e,t,n){for(var r=[],i=0;io&&(a=l,o=t[i*e+l])}a>0&&r.push(a)}for(var u=0;ul&&(s=u,l=c)}n[i]=a[s]}return r=Ei(e,t,n)},_i=function(e){for(var t,n,r,i,a,o,s=this.cy(),l=this.nodes(),u=mi(e),c={},h=0;h=C?(N=C,C=L,A=S):L>N&&(N=L);for(var O=0;O0?1:0;T[E%u.minIterations*t+B]=F,R+=F}if(R>0&&(E>=u.minIterations-1||E==u.maxIterations-1)){for(var z=0,G=0;G1||o>1)&&(u=!0),c[t]=[],e.outgoers().forEach((function(e){e.isEdge()&&c[t].push(e.id())}))}else h[t]=[void 0,e.target().id()]})):l.forEach((function(e){var t=e.id();e.isNode()?(e.degree(!0)%2&&(n?r?u=!0:r=t:n=t),c[t]=[],e.connectedEdges().forEach((function(e){return c[t].push(e.id())}))):h[t]=[e.source().id(),e.target().id()]}));var d={found:!1,trail:void 0};if(u)return d;if(r&&n)if(s){if(i&&r!=i)return d;i=r}else{if(i&&r!=i&&n!=i)return d;i||(i=r)}else i||(i=l[0].id());var p=function(e){for(var t,n,r,i=e,a=[e];c[i].length;)t=c[i].shift(),n=h[t][0],i!=(r=h[t][1])?(c[r]=c[r].filter((function(e){return e!=t})),i=r):s||i==n||(c[n]=c[n].filter((function(e){return e!=t})),i=n),a.unshift(t),a.unshift(i);return a},g=[],f=[];for(f=p(i);1!=f.length;)0==c[f[0]].length?(g.unshift(l.getElementById(f.shift())),g.unshift(l.getElementById(f.shift()))):f=p(f.shift()).concat(f);for(var v in g.unshift(l.getElementById(f.shift())),c)if(c[v].length)return d;return d.found=!0,d.trail=this.spawn(g,!0),d}},Ai=function(){var e=this,t={},n=0,r=0,i=[],a=[],o={},s=function(n,r){for(var o=a.length-1,s=[],l=e.spawn();a[o].x!=n||a[o].y!=r;)s.push(a.pop().edge),o--;s.push(a.pop().edge),s.forEach((function(n){var r=n.connectedNodes().intersection(e);l.merge(n),r.forEach((function(n){var r=n.id(),i=n.connectedEdges().intersection(e);l.merge(n),t[r].cutVertex?l.merge(i.filter((function(e){return e.isLoop()}))):l.merge(i)}))})),i.push(l)},l=function l(u,c,h){u===h&&(r+=1),t[c]={id:n,low:n++,cutVertex:!1};var d,p,g,f,v=e.getElementById(c).connectedEdges().intersection(e);0===v.size()?i.push(e.spawn(e.getElementById(c))):v.forEach((function(e){d=e.source().id(),p=e.target().id(),(g=d===c?p:d)!==h&&(f=e.id(),o[f]||(o[f]=!0,a.push({x:c,y:g,edge:e})),g in t?t[c].low=Math.min(t[c].low,t[g].id):(l(u,g,c),t[c].low=Math.min(t[c].low,t[g].low),t[c].id<=t[g].low&&(t[c].cutVertex=!0,s(c,g))))}))};e.forEach((function(e){if(e.isNode()){var n=e.id();n in t||(r=0,l(n,n),t[n].cutVertex=r>1)}}));var u=Object.keys(t).filter((function(e){return t[e].cutVertex})).map((function(t){return e.getElementById(t)}));return{cut:e.spawn(u),components:i}},Li=function(){var e=this,t={},n=0,r=[],i=[],a=e.spawn(e),o=function o(s){if(i.push(s),t[s]={index:n,low:n++,explored:!1},e.getElementById(s).connectedEdges().intersection(e).forEach((function(e){var n=e.target().id();n!==s&&(n in t||o(n),t[n].explored||(t[s].low=Math.min(t[s].low,t[n].low)))})),t[s].index===t[s].low){for(var l=e.spawn();;){var u=i.pop();if(l.merge(e.getElementById(u)),t[u].low=t[s].index,t[u].explored=!0,u===s)break}var c=l.edgesWith(l),h=l.merge(c);r.push(h),a=a.difference(h)}};return e.forEach((function(e){if(e.isNode()){var n=e.id();n in t||o(n)}})),{cut:a,components:r}},Si={};[qt,Zt,Qt,en,nn,an,un,vr,mr,xr,Er,Rr,si,vi,Di,Ni,{hopcroftTarjanBiconnected:Ai,htbc:Ai,htb:Ai,hopcroftTarjanBiconnectedComponents:Ai},{tarjanStronglyConnected:Li,tsc:Li,tscc:Li,tarjanStronglyConnectedComponents:Li}].forEach((function(e){Q(Si,e)}));var Oi=0,Ii=1,ki=2,Mi=function e(t){if(!(this instanceof e))return new e(t);this.id="Thenable/1.0.7",this.state=Oi,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},"function"==typeof t&&t.call(this,this.fulfill.bind(this),this.reject.bind(this))};Mi.prototype={fulfill:function(e){return Pi(this,Ii,"fulfillValue",e)},reject:function(e){return Pi(this,ki,"rejectReason",e)},then:function(e,t){var n=this,r=new Mi;return n.onFulfilled.push(Fi(e,r,"fulfill")),n.onRejected.push(Fi(t,r,"reject")),Ri(n),r.proxy}};var Pi=function(e,t,n,r){return e.state===Oi&&(e.state=t,e[n]=r,Ri(e)),e},Ri=function(e){e.state===Ii?Bi(e,"onFulfilled",e.fulfillValue):e.state===ki&&Bi(e,"onRejected",e.rejectReason)},Bi=function(e,t,n){if(0!==e[t].length){var r=e[t];e[t]=[];var i=function(){for(var e=0;e0:void 0}},clearQueue:function(){return function(){var e=this,t=void 0!==e.length?e:[e];if(!(this._private.cy||this).styleEnabled())return this;for(var n=0;n-1}var Za=Ka;function Qa(e,t){var n=this.__data__,r=Ua(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}var Ja=Qa;function eo(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e0&&this.spawn(r).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes.has(e)},toggleClass:function(e,t){w(e)||(e=e.match(/\S+/g)||[]);for(var n=this,r=void 0===t,i=[],a=0,o=n.length;a0&&this.spawn(i).updateStyle().emit("class"),n},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var n=this;if(null==t)t=250;else if(0===t)return n;return n.addClass(e),setTimeout((function(){n.removeClass(e)}),t),n}};ps.className=ps.classNames=ps.classes;var gs={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:"\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'",number:V,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};gs.variable="(?:[\\w-.]|(?:\\\\"+gs.metaChar+"))+",gs.className="(?:[\\w-]|(?:\\\\"+gs.metaChar+"))+",gs.value=gs.string+"|"+gs.number,gs.id=gs.variable,function(){var e,t,n;for(e=gs.comparatorOp.split("|"),n=0;n=0||"="!==t&&(gs.comparatorOp+="|\\!"+t)}();var fs=function(){return{checks:[]}},vs={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},ys=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort((function(e,t){return Z(e.selector,t.selector)})),ms=function(){for(var e,t={},n=0;n0&&u.edgeCount>0)return Nt("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(u.edgeCount>1)return Nt("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;1===u.edgeCount&&Nt("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},toString:function(){if(null!=this.toStringCache)return this.toStringCache;for(var e=function(e){return null==e?"":e},t=function(t){return b(t)?'"'+t+'"':e(t)},n=function(e){return" "+e+" "},r=function(r,a){var o=r.type,s=r.value;switch(o){case vs.GROUP:var l=e(s);return l.substring(0,l.length-1);case vs.DATA_COMPARE:var u=r.field,c=r.operator;return"["+u+n(e(c))+t(s)+"]";case vs.DATA_BOOL:var h=r.operator,d=r.field;return"["+e(h)+d+"]";case vs.DATA_EXIST:return"["+r.field+"]";case vs.META_COMPARE:var p=r.operator;return"[["+r.field+n(e(p))+t(s)+"]]";case vs.STATE:return s;case vs.ID:return"#"+s;case vs.CLASS:return"."+s;case vs.PARENT:case vs.CHILD:return i(r.parent,a)+n(">")+i(r.child,a);case vs.ANCESTOR:case vs.DESCENDANT:return i(r.ancestor,a)+" "+i(r.descendant,a);case vs.COMPOUND_SPLIT:var g=i(r.left,a),f=i(r.subject,a),v=i(r.right,a);return g+(g.length>0?" ":"")+f+v;case vs.TRUE:return""}},i=function(e,t){return e.checks.reduce((function(n,i,a){return n+(t===e&&0===a?"$":"")+r(i,t)}),"")},a="",o=0;o1&&o=0&&(t=t.replace("!",""),c=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),u=!0),(o||l||u)&&(i=o||s?""+e:"",a=""+n),u&&(e=i=i.toLowerCase(),n=a=a.toLowerCase()),t){case"*=":r=i.indexOf(a)>=0;break;case"$=":r=i.indexOf(a,i.length-a.length)>=0;break;case"^=":r=0===i.indexOf(a);break;case"=":r=e===n;break;case">":h=!0,r=e>n;break;case">=":h=!0,r=e>=n;break;case"<":h=!0,r=e0;){var u=i.shift();t(u),a.add(u.id()),o&&r(i,a,u)}return e}function Vs(e,t,n){if(n.isParent())for(var r=n._private.children,i=0;i1&&void 0!==arguments[1])||arguments[1],Vs)},Ys.forEachUp=function(e){return Xs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],Us)},Ys.forEachUpAndDown=function(e){return Xs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],js)},Ys.ancestors=Ys.parents,(Fs=zs={data:hs.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:hs.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:hs.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:hs.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:hs.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:hs.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}}).attr=Fs.data,Fs.removeAttr=Fs.removeData;var Hs,qs,Ws=zs,$s={};function Ks(e){return function(t){var n=this;if(void 0===t&&(t=!0),0!==n.length&&n.isNode()&&!n.removed()){for(var r=0,i=n[0],a=i._private.edges,o=0;ot})),minIndegree:Zs("indegree",(function(e,t){return et})),minOutdegree:Zs("outdegree",(function(e,t){return et}))}),Q($s,{totalDegree:function(e){for(var t=0,n=this.nodes(),r=0;r0,c=u;u&&(l=l[0]);var h=c?l.position():{x:0,y:0};return i={x:s.x-h.x,y:s.y-h.y},void 0===e?i:i[e]}for(var d=0;d0,v=f;f&&(g=g[0]);var y=v?g.position():{x:0,y:0};void 0!==t?p.position(e,t+y[e]):void 0!==i&&p.position({x:i.x+y.x,y:i.y+y.y})}}else if(!a)return;return this}}).modelPosition=Hs.point=Hs.position,Hs.modelPositions=Hs.points=Hs.positions,Hs.renderedPoint=Hs.renderedPosition,Hs.relativePoint=Hs.relativePosition;var el,tl,nl=qs;el=tl={},tl.renderedBoundingBox=function(e){var t=this.boundingBox(e),n=this.cy(),r=n.zoom(),i=n.pan(),a=t.x1*r+i.x,o=t.x2*r+i.x,s=t.y1*r+i.y,l=t.y2*r+i.y;return{x1:a,x2:o,y1:s,y2:l,w:o-a,h:l-s}},tl.dirtyCompoundBoundsCache=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();return t.styleEnabled()&&t.hasCompoundNodes()?(this.forEachUp((function(t){if(t.isParent()){var n=t._private;n.compoundBoundsClean=!1,n.bbCache=null,e||t.emitAndNotify("bounds")}})),this):this},tl.updateCompoundBounds=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();if(!t.styleEnabled()||!t.hasCompoundNodes())return this;if(!e&&t.batching())return this;function n(e){if(e.isParent()){var t=e._private,n=e.children(),r="include"===e.pstyle("compound-sizing-wrt-labels").value,i={width:{val:e.pstyle("min-width").pfValue,left:e.pstyle("min-width-bias-left"),right:e.pstyle("min-width-bias-right")},height:{val:e.pstyle("min-height").pfValue,top:e.pstyle("min-height-bias-top"),bottom:e.pstyle("min-height-bias-bottom")}},a=n.boundingBox({includeLabels:r,includeOverlays:!1,useCache:!1}),o=t.position;0!==a.w&&0!==a.h||((a={w:e.pstyle("width").pfValue,h:e.pstyle("height").pfValue}).x1=o.x-a.w/2,a.x2=o.x+a.w/2,a.y1=o.y-a.h/2,a.y2=o.y+a.h/2);var s=i.width.left.value;"px"===i.width.left.units&&i.width.val>0&&(s=100*s/i.width.val);var l=i.width.right.value;"px"===i.width.right.units&&i.width.val>0&&(l=100*l/i.width.val);var u=i.height.top.value;"px"===i.height.top.units&&i.height.val>0&&(u=100*u/i.height.val);var c=i.height.bottom.value;"px"===i.height.bottom.units&&i.height.val>0&&(c=100*c/i.height.val);var h=y(i.width.val-a.w,s,l),d=h.biasDiff,p=h.biasComplementDiff,g=y(i.height.val-a.h,u,c),f=g.biasDiff,v=g.biasComplementDiff;t.autoPadding=m(a.w,a.h,e.pstyle("padding"),e.pstyle("padding-relative-to").value),t.autoWidth=Math.max(a.w,i.width.val),o.x=(-d+a.x1+a.x2+p)/2,t.autoHeight=Math.max(a.h,i.height.val),o.y=(-f+a.y1+a.y2+v)/2}function y(e,t,n){var r=0,i=0,a=t+n;return e>0&&a>0&&(r=t/a*e,i=n/a*e),{biasDiff:r,biasComplementDiff:i}}function m(e,t,n,r){if("%"!==n.units)return"px"===n.units?n.pfValue:0;switch(r){case"width":return e>0?n.pfValue*e:0;case"height":return t>0?n.pfValue*t:0;case"average":return e>0&&t>0?n.pfValue*(e+t)/2:0;case"min":return e>0&&t>0?e>t?n.pfValue*t:n.pfValue*e:0;case"max":return e>0&&t>0?e>t?n.pfValue*e:n.pfValue*t:0;default:return 0}}}for(var r=0;re.x2?r:e.x2,e.y1=ne.y2?i:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},al=function(e,t){return null==t?e:il(e,t.x1,t.y1,t.x2,t.y2)},ol=function(e,t,n){return Ft(e,t,n)},sl=function(e,t,n){if(!t.cy().headless()){var r,i,a=t._private,o=a.rstyle,s=o.arrowWidth/2;if("none"!==t.pstyle(n+"-arrow-shape").value){"source"===n?(r=o.srcX,i=o.srcY):"target"===n?(r=o.tgtX,i=o.tgtY):(r=o.midX,i=o.midY);var l=a.arrowBounds=a.arrowBounds||{},u=l[n]=l[n]||{};u.x1=r-s,u.y1=i-s,u.x2=r+s,u.y2=i+s,u.w=u.x2-u.x1,u.h=u.y2-u.y1,Mn(u,1),il(e,u.x1,u.y1,u.x2,u.y2)}}},ll=function(e,t,n){if(!t.cy().headless()){var r;r=n?n+"-":"";var i=t._private,a=i.rstyle;if(t.pstyle(r+"label").strValue){var o,s,l,u,c=t.pstyle("text-halign"),h=t.pstyle("text-valign"),d=ol(a,"labelWidth",n),p=ol(a,"labelHeight",n),g=ol(a,"labelX",n),f=ol(a,"labelY",n),v=t.pstyle(r+"text-margin-x").pfValue,y=t.pstyle(r+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle(r+"text-rotation"),x=t.pstyle("text-outline-width").pfValue,w=t.pstyle("text-border-width").pfValue/2,E=t.pstyle("text-background-padding").pfValue,T=2,_=p,D=d,C=D/2,N=_/2;if(m)o=g-C,s=g+C,l=f-N,u=f+N;else{switch(c.value){case"left":o=g-D,s=g;break;case"center":o=g-C,s=g+C;break;case"right":o=g,s=g+D}switch(h.value){case"top":l=f-_,u=f;break;case"center":l=f-N,u=f+N;break;case"bottom":l=f,u=f+_}}o+=v-Math.max(x,w)-E-T,s+=v+Math.max(x,w)+E+T,l+=y-Math.max(x,w)-E-T,u+=y+Math.max(x,w)+E+T;var A=n||"main",L=i.labelBounds,S=L[A]=L[A]||{};S.x1=o,S.y1=l,S.x2=s,S.y2=u,S.w=s-o,S.h=u-l;var O=m&&"autorotate"===b.strValue,I=null!=b.pfValue&&0!==b.pfValue;if(O||I){var k=O?ol(i.rstyle,"labelAngle",n):b.pfValue,M=Math.cos(k),P=Math.sin(k),R=(o+s)/2,B=(l+u)/2;if(!m){switch(c.value){case"left":R=s;break;case"right":R=o}switch(h.value){case"top":B=u;break;case"bottom":B=l}}var F=function(e,t){return{x:(e-=R)*M-(t-=B)*P+R,y:e*P+t*M+B}},z=F(o,l),G=F(o,u),Y=F(s,l),X=F(s,u);o=Math.min(z.x,G.x,Y.x,X.x),s=Math.max(z.x,G.x,Y.x,X.x),l=Math.min(z.y,G.y,Y.y,X.y),u=Math.max(z.y,G.y,Y.y,X.y)}var V=A+"Rot",U=L[V]=L[V]||{};U.x1=o,U.y1=l,U.x2=s,U.y2=u,U.w=s-o,U.h=u-l,il(e,o,l,s,u),il(i.labelBounds.all,o,l,s,u)}return e}},ul=function(e,t){var n,r,i,a,o,s,l=e._private.cy,u=l.styleEnabled(),c=l.headless(),h=Ln(),d=e._private,p=e.isNode(),g=e.isEdge(),f=d.rstyle,v=p&&u?e.pstyle("bounds-expansion").pfValue:[0],y=function(e){return"none"!==e.pstyle("display").value},m=!u||y(e)&&(!g||y(e.source())&&y(e.target()));if(m){var b=0;u&&t.includeOverlays&&0!==e.pstyle("overlay-opacity").value&&(b=e.pstyle("overlay-padding").value);var x=0;u&&t.includeUnderlays&&0!==e.pstyle("underlay-opacity").value&&(x=e.pstyle("underlay-padding").value);var w=Math.max(b,x),E=0;if(u&&(E=e.pstyle("width").pfValue/2),p&&t.includeNodes){var T=e.position();o=T.x,s=T.y;var _=e.outerWidth()/2,D=e.outerHeight()/2;il(h,n=o-_,i=s-D,r=o+_,a=s+D)}else if(g&&t.includeEdges)if(u&&!c){var C=e.pstyle("curve-style").strValue;if(n=Math.min(f.srcX,f.midX,f.tgtX),r=Math.max(f.srcX,f.midX,f.tgtX),i=Math.min(f.srcY,f.midY,f.tgtY),a=Math.max(f.srcY,f.midY,f.tgtY),il(h,n-=E,i-=E,r+=E,a+=E),"haystack"===C){var N=f.haystackPts;if(N&&2===N.length){if(n=N[0].x,i=N[0].y,n>(r=N[1].x)){var A=n;n=r,r=A}if(i>(a=N[1].y)){var L=i;i=a,a=L}il(h,n-E,i-E,r+E,a+E)}}else if("bezier"===C||"unbundled-bezier"===C||"segments"===C||"taxi"===C){var S;switch(C){case"bezier":case"unbundled-bezier":S=f.bezierPts;break;case"segments":case"taxi":S=f.linePts}if(null!=S)for(var O=0;O(r=M.x)){var P=n;n=r,r=P}if((i=k.y)>(a=M.y)){var R=i;i=a,a=R}il(h,n-=E,i-=E,r+=E,a+=E)}if(u&&t.includeEdges&&g&&(sl(h,e,"mid-source"),sl(h,e,"mid-target"),sl(h,e,"source"),sl(h,e,"target")),u&&"yes"===e.pstyle("ghost").value){var B=e.pstyle("ghost-offset-x").pfValue,F=e.pstyle("ghost-offset-y").pfValue;il(h,h.x1+B,h.y1+F,h.x2+B,h.y2+F)}var z=d.bodyBounds=d.bodyBounds||{};Rn(z,h),Pn(z,v),Mn(z,1),u&&(n=h.x1,r=h.x2,i=h.y1,a=h.y2,il(h,n-w,i-w,r+w,a+w));var G=d.overlayBounds=d.overlayBounds||{};Rn(G,h),Pn(G,v),Mn(G,1);var Y=d.labelBounds=d.labelBounds||{};null!=Y.all?On(Y.all):Y.all=Ln(),u&&t.includeLabels&&(t.includeMainLabels&&ll(h,e,null),g&&(t.includeSourceLabels&&ll(h,e,"source"),t.includeTargetLabels&&ll(h,e,"target")))}return h.x1=rl(h.x1),h.y1=rl(h.y1),h.x2=rl(h.x2),h.y2=rl(h.y2),h.w=rl(h.x2-h.x1),h.h=rl(h.y2-h.y1),h.w>0&&h.h>0&&m&&(Pn(h,v),Mn(h,1)),h},cl=function(e){var t=0,n=function(e){return(e?1:0)<0&&void 0!==arguments[0]?arguments[0]:Pl,t=arguments.length>1?arguments[1]:void 0,n=0;n=0;s--)o(s);return this},Bl.removeAllListeners=function(){return this.removeListener("*")},Bl.emit=Bl.trigger=function(e,t,n){var r=this.listeners,i=r.length;return this.emitting++,w(t)||(t=[t]),Gl(this,(function(e,a){null!=n&&(r=[{event:a.event,type:a.type,namespace:a.namespace,callback:n}],i=r.length);for(var o=function(n){var i=r[n];if(i.type===a.type&&(!i.namespace||i.namespace===a.namespace||i.namespace===Il)&&e.eventMatches(e.context,i,a)){var o=[a];null!=t&&Bt(o,t),e.beforeEmit(e.context,i,a),i.conf&&i.conf.one&&(e.listeners=e.listeners.filter((function(e){return e!==i})));var s=e.callbackContext(e.context,i,a),l=i.callback.apply(s,o);e.afterEmit(e.context,i,a),!1===l&&(a.stopPropagation(),a.preventDefault())}},s=0;s1&&!r){var i=this.length-1,a=this[i],o=a._private.data.id;this[i]=void 0,this[e]=a,n.set(o,{ele:a,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var t=this._private,n=e._private.data.id,r=t.map.get(n);if(!r)return this;var i=r.index;return this.unmergeAt(i),this},unmerge:function(e){var t=this._private.cy;if(!e)return this;if(e&&b(e)){var n=e;e=t.mutableElements().filter(n)}for(var r=0;r=0;t--)e(this[t])&&this.unmergeAt(t);return this},map:function(e,t){for(var n=[],r=this,i=0;ir&&(r=s,n=o)}return{value:r,ele:n}},min:function(e,t){for(var n,r=1/0,i=this,a=0;a=0&&i1&&void 0!==arguments[1])||arguments[1],n=this[0],r=n.cy();if(r.styleEnabled()&&n){this.cleanStyle();var i=n._private.style[e];return null!=i?i:t?r.style().getDefaultProperty(e):null}},numericStyle:function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var n=t.pstyle(e);return void 0!==n.pfValue?n.pfValue:n.value}},numericStyleUnits:function(e){var t=this[0];if(t.cy().styleEnabled())return t?t.pstyle(e).units:void 0},renderedStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=this[0];return n?t.style().getRenderedStyle(n,e):void 0},style:function(e,t){var n=this.cy();if(!n.styleEnabled())return this;var r=!1,i=n.style();if(E(e)){var a=e;i.applyBypass(this,a,r),this.emitAndNotify("style")}else if(b(e)){if(void 0===t){var o=this[0];return o?i.getStylePropertyValue(o,e):void 0}i.applyBypass(this,e,t,r),this.emitAndNotify("style")}else if(void 0===e){var s=this[0];return s?i.getRawStyle(s):void 0}return this},removeStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=!1,r=t.style(),i=this;if(void 0===e)for(var a=0;a0&&t.push(c[0]),t.push(s[0])}return this.spawn(t,!0).filter(e)}),"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),du.neighbourhood=du.neighborhood,du.closedNeighbourhood=du.closedNeighborhood,du.openNeighbourhood=du.openNeighborhood,Q(du,{source:Gs((function(e){var t,n=this[0];return n&&(t=n._private.source||n.cy().collection()),t&&e?t.filter(e):t}),"source"),target:Gs((function(e){var t,n=this[0];return n&&(t=n._private.target||n.cy().collection()),t&&e?t.filter(e):t}),"target"),sources:vu({attr:"source"}),targets:vu({attr:"target"})}),Q(du,{edgesWith:Gs(yu(),"edgesWith"),edgesTo:Gs(yu({thisIsSrc:!0}),"edgesTo")}),Q(du,{connectedEdges:Gs((function(e){for(var t=[],n=this,r=0;r0);return a},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}}),du.componentsOf=du.components;var bu=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(void 0!==e){var i=new Yt,a=!1;if(t){if(t.length>0&&E(t[0])&&!A(t[0])){a=!0;for(var o=[],s=new Ut,l=0,u=t.length;l0&&void 0!==arguments[0])||arguments[0],r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this,a=i.cy(),o=a._private,s=[],l=[],u=0,c=i.length;u0){for(var B=e.length===i.length?i:new bu(a,e),F=0;F0&&void 0!==arguments[0])||arguments[0],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this,r=[],i={},a=n._private.cy;function o(e){for(var t=e._private.edges,n=0;n0&&(e?D.emitAndNotify("remove"):t&&D.emit("remove"));for(var C=0;C0?i=l:r=l}while(Math.abs(a)>o&&++u=a?m(t,s):0===c?s:x(t,r,r+u)}var E=!1;function T(){E=!0,e===t&&n===r||b()}var _=function(i){return E||T(),e===t&&n===r?i:0===i?0:1===i?1:v(w(i),t,r)};_.getControlPoints=function(){return[{x:e,y:t},{x:n,y:r}]};var D="generateBezier("+[e,t,n,r]+")";return _.toString=function(){return D},_}var Tu=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,n,r){var i={x:t.x+r.dx*n,v:t.v+r.dv*n,tension:t.tension,friction:t.friction};return{dx:i.v,dv:e(i)}}function n(n,r){var i={dx:n.v,dv:e(n)},a=t(n,.5*r,i),o=t(n,.5*r,a),s=t(n,r,o),l=1/6*(i.dx+2*(a.dx+o.dx)+s.dx),u=1/6*(i.dv+2*(a.dv+o.dv)+s.dv);return n.x=n.x+l*r,n.v=n.v+u*r,n}return function e(t,r,i){var a,o,s,l={x:-1,v:0,tension:null,friction:null},u=[0],c=0,h=1e-4,d=.016;for(t=parseFloat(t)||500,r=parseFloat(r)||20,i=i||null,l.tension=t,l.friction=r,o=(a=null!==i)?(c=e(t,r))/i*d:d;s=n(s||l,o),u.push(1+s.x),c+=16,Math.abs(s.x)>h&&Math.abs(s.v)>h;);return a?function(e){return u[e*(u.length-1)|0]}:c}}(),_u=function(e,t,n,r){var i=Eu(e,t,n,r);return function(e,t,n){return e+(t-e)*i(n)}},Du={linear:function(e,t,n){return e+(t-e)*n},ease:_u(.25,.1,.25,1),"ease-in":_u(.42,0,1,1),"ease-out":_u(0,0,.58,1),"ease-in-out":_u(.42,0,.58,1),"ease-in-sine":_u(.47,0,.745,.715),"ease-out-sine":_u(.39,.575,.565,1),"ease-in-out-sine":_u(.445,.05,.55,.95),"ease-in-quad":_u(.55,.085,.68,.53),"ease-out-quad":_u(.25,.46,.45,.94),"ease-in-out-quad":_u(.455,.03,.515,.955),"ease-in-cubic":_u(.55,.055,.675,.19),"ease-out-cubic":_u(.215,.61,.355,1),"ease-in-out-cubic":_u(.645,.045,.355,1),"ease-in-quart":_u(.895,.03,.685,.22),"ease-out-quart":_u(.165,.84,.44,1),"ease-in-out-quart":_u(.77,0,.175,1),"ease-in-quint":_u(.755,.05,.855,.06),"ease-out-quint":_u(.23,1,.32,1),"ease-in-out-quint":_u(.86,0,.07,1),"ease-in-expo":_u(.95,.05,.795,.035),"ease-out-expo":_u(.19,1,.22,1),"ease-in-out-expo":_u(1,0,0,1),"ease-in-circ":_u(.6,.04,.98,.335),"ease-out-circ":_u(.075,.82,.165,1),"ease-in-out-circ":_u(.785,.135,.15,.86),spring:function(e,t,n){if(0===n)return Du.linear;var r=Tu(e,t,n);return function(e,t,n){return e+(t-e)*r(n)}},"cubic-bezier":_u};function Cu(e,t,n,r,i){if(1===r)return n;if(t===n)return n;var a=i(t,n,r);return null==e||((e.roundValue||e.color)&&(a=Math.round(a)),void 0!==e.min&&(a=Math.max(a,e.min)),void 0!==e.max&&(a=Math.min(a,e.max))),a}function Nu(e,t){return null!=e.pfValue||null!=e.value?null==e.pfValue||null!=t&&"%"===t.type.units?e.value:e.pfValue:e}function Au(e,t,n,r,i){var a=null!=i?i.type:null;n<0?n=0:n>1&&(n=1);var o=Nu(e,i),s=Nu(t,i);if(_(o)&&_(s))return Cu(a,o,s,n,r);if(w(o)&&w(s)){for(var l=[],u=0;u0?("spring"===h&&d.push(o.duration),o.easingImpl=Du[h].apply(null,d)):o.easingImpl=Du[h]}var p,g=o.easingImpl;if(p=0===o.duration?1:(n-l)/o.duration,o.applying&&(p=o.progress),p<0?p=0:p>1&&(p=1),null==o.delay){var f=o.startPosition,v=o.position;if(v&&i&&!e.locked()){var y={};Su(f.x,v.x)&&(y.x=Au(f.x,v.x,p,g)),Su(f.y,v.y)&&(y.y=Au(f.y,v.y,p,g)),e.position(y)}var m=o.startPan,x=o.pan,w=a.pan,E=null!=x&&r;E&&(Su(m.x,x.x)&&(w.x=Au(m.x,x.x,p,g)),Su(m.y,x.y)&&(w.y=Au(m.y,x.y,p,g)),e.emit("pan"));var T=o.startZoom,_=o.zoom,D=null!=_&&r;D&&(Su(T,_)&&(a.zoom=An(a.minZoom,Au(T,_,p,g),a.maxZoom)),e.emit("zoom")),(E||D)&&e.emit("viewport");var C=o.style;if(C&&C.length>0&&i){for(var N=0;N=0;t--)(0,e[t])();e.splice(0,e.length)},c=a.length-1;c>=0;c--){var h=a[c],d=h._private;d.stopped?(a.splice(c,1),d.hooked=!1,d.playing=!1,d.started=!1,u(d.frames)):(d.playing||d.applying)&&(d.playing&&d.applying&&(d.applying=!1),d.started||Ou(t,h,e),Lu(t,h,e,n),d.applying&&(d.applying=!1),u(d.frames),null!=d.step&&d.step(e),h.completed()&&(a.splice(c,1),d.hooked=!1,d.playing=!1,d.started=!1,u(d.completes)),s=!0)}return n||0!==a.length||0!==o.length||r.push(t),s}for(var a=!1,o=0;o0?t.notify("draw",n):t.notify("draw")),n.unmerge(r),t.emit("step")}var ku={animate:hs.animate(),animation:hs.animation(),animated:hs.animated(),clearQueue:hs.clearQueue(),delay:hs.delay(),delayAnimation:hs.delayAnimation(),stop:hs.stop(),addToAnimationPool:function(e){var t=this;t.styleEnabled()&&t._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,e.styleEnabled()){var t=e.renderer();t&&t.beforeRender?t.beforeRender((function(t,n){Iu(n,e)}),t.beforeRenderPriorities.animations):n()}function n(){e._private.animationsRunning&&nt((function(t){Iu(t,e),n()}))}}},Mu={qualifierCompare:function(e,t){return null==e||null==t?null==e&&null==t:e.sameText(t)},eventMatches:function(e,t,n){var r=t.qualifier;return null==r||e!==n.target&&A(n.target)&&r.matches(n.target)},addEventFields:function(e,t){t.cy=e,t.target=e},callbackContext:function(e,t,n){return null!=t.qualifier?n.target:e}},Pu=function(e){return b(e)?new Ps(e):e},Ru={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new Rl(Mu,this)),this},emitter:function(){return this._private.emitter},on:function(e,t,n){return this.emitter().on(e,Pu(t),n),this},removeListener:function(e,t,n){return this.emitter().removeListener(e,Pu(t),n),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,t,n){return this.emitter().one(e,Pu(t),n),this},once:function(e,t,n){return this.emitter().one(e,Pu(t),n),this},emit:function(e,t){return this.emitter().emit(e,t),this},emitAndNotify:function(e,t){return this.emit(e),this.notify(e,t),this}};hs.eventAliasesOn(Ru);var Bu={png:function(e){return e=e||{},this._private.renderer.png(e)},jpg:function(e){var t=this._private.renderer;return(e=e||{}).bg=e.bg||"#fff",t.jpg(e)}};Bu.jpeg=Bu.jpg;var Fu={layout:function(e){var t=this;if(null!=e)if(null!=e.name){var n=e.name,r=t.extension("layout",n);if(null!=r){var i;i=b(e.eles)?t.$(e.eles):null!=e.eles?e.eles:t.$();var a=new r(Q({},e,{cy:t,eles:i}));return a}Dt("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?")}else Dt("A `name` must be specified to make a layout");else Dt("Layout options must be specified to make a layout")}};Fu.createLayout=Fu.makeLayout=Fu.layout;var zu={notify:function(e,t){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var r=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();null!=t&&r.merge(t)}else if(n.notificationsEnabled){var i=this.renderer();!this.destroyed()&&i&&i.notify(e,t)}},notifications:function(e){var t=this._private;return void 0===e?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return null==e.batchCount&&(e.batchCount=0),0===e.batchCount&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(0===e.batchCount)return this;if(e.batchCount--,0===e.batchCount){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach((function(n){var r=e.batchNotifications[n];r.empty()?t.notify(n):t.notify(n,r)}))}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var t=this;return this.batch((function(){for(var n=Object.keys(e),r=0;r0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach((function(e){var t=e._private;t.rscratch={},t.rstyle={},t.animation.current=[],t.animation.queue=[]}))},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};Yu.invalidateDimensions=Yu.resize;var Xu={collection:function(e,t){return b(e)?this.$(e):N(e)?e.collection():w(e)?(t||(t={}),new bu(this,e,t.unique,t.removed)):new bu(this)},nodes:function(e){var t=this.$((function(e){return e.isNode()}));return e?t.filter(e):t},edges:function(e){var t=this.$((function(e){return e.isEdge()}));return e?t.filter(e):t},$:function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},mutableElements:function(){return this._private.elements}};Xu.elements=Xu.filter=Xu.$;var Vu={},Uu="t",ju="f";Vu.apply=function(e){for(var t=this,n=t._private.cy.collection(),r=0;r0;if(d||h&&p){var g=void 0;d&&p||d?g=u.properties:p&&(g=u.mappedProperties);for(var f=0;f1&&(v=1),s.color){var w=i.valueMin[0],E=i.valueMax[0],T=i.valueMin[1],D=i.valueMax[1],C=i.valueMin[2],N=i.valueMax[2],A=null==i.valueMin[3]?1:i.valueMin[3],L=null==i.valueMax[3]?1:i.valueMax[3],S=[Math.round(w+(E-w)*v),Math.round(T+(D-T)*v),Math.round(C+(N-C)*v),Math.round(A+(L-A)*v)];n={bypass:i.bypass,name:i.name,value:S,strValue:"rgb("+S[0]+", "+S[1]+", "+S[2]+")"}}else{if(!s.number)return!1;var O=i.valueMin+(i.valueMax-i.valueMin)*v;n=this.parse(i.name,O,i.bypass,d)}if(!n)return f(),!1;n.mapping=i,i=n;break;case o.data:for(var I=i.field.split("."),k=h.data,M=0;M0&&a>0){for(var s={},l=!1,u=0;u0?e.delayAnimation(o).play().promise().then(t):t()})).then((function(){return e.animation({style:s,duration:a,easing:e.pstyle("transition-timing-function").value,queue:!1}).play().promise()})).then((function(){n.removeBypasses(e,i),e.emitAndNotify("style"),r.transitioning=!1}))}else r.transitioning&&(this.removeBypasses(e,i),e.emitAndNotify("style"),r.transitioning=!1)},Vu.checkTrigger=function(e,t,n,r,i,a){var o=this.properties[t],s=i(o);null!=s&&s(n,r)&&a(o)},Vu.checkZOrderTrigger=function(e,t,n,r){var i=this;this.checkTrigger(e,t,n,r,(function(e){return e.triggersZOrder}),(function(){i._private.cy.notify("zorder",e)}))},Vu.checkBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBounds}),(function(i){e.dirtyCompoundBoundsCache(),e.dirtyBoundingBoxCache(),!i.triggersBoundsOfParallelBeziers||("curve-style"!==t||"bezier"!==n&&"bezier"!==r)&&("display"!==t||"none"!==n&&"none"!==r)||e.parallelEdges().forEach((function(e){e.isBundledBezier()&&e.dirtyBoundingBoxCache()}))}))},Vu.checkTriggers=function(e,t,n,r){e.dirtyStyleCache(),this.checkZOrderTrigger(e,t,n,r),this.checkBoundsTrigger(e,t,n,r)};var Hu={applyBypass:function(e,t,n,r){var i=this,a=[],o=!0;if("*"===t||"**"===t){if(void 0!==n)for(var s=0;st.length?o.substr(t.length):""}function l(){n=n.length>r.length?n.substr(r.length):""}for(o=o.replace(/[/][*](\s|.)+?[*][/]/g,"");!o.match(/^\s*$/);){var u=o.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!u){Nt("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+o);break}t=u[0];var c=u[1];if("core"!==c&&new Ps(c).invalid)Nt("Skipping parsing of block: Invalid selector found in string stylesheet: "+c),s();else{var h=u[2],d=!1;n=h;for(var p=[];!n.match(/^\s*$/);){var g=n.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!g){Nt("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+h),d=!0;break}r=g[0];var f=g[1],v=g[2];i.properties[f]?a.parse(f,v)?(p.push({name:f,val:v}),l()):(Nt("Skipping property: Invalid property definition in: "+r),l()):(Nt("Skipping property: Invalid property name in: "+r),l())}if(d){s();break}a.selector(c);for(var y=0;y=7&&"d"===t[0]&&(u=new RegExp(s.data.regex).exec(t))){if(n)return!1;var d=s.data;return{name:e,value:u,strValue:""+t,mapped:d,field:u[1],bypass:n}}if(t.length>=10&&"m"===t[0]&&(c=new RegExp(s.mapData.regex).exec(t))){if(n)return!1;if(h.multiple)return!1;var p=s.mapData;if(!h.color&&!h.number)return!1;var g=this.parse(e,c[4]);if(!g||g.mapped)return!1;var f=this.parse(e,c[5]);if(!f||f.mapped)return!1;if(g.pfValue===f.pfValue||g.strValue===f.strValue)return Nt("`"+e+": "+t+"` is not a valid mapper because the output range is zero; converting to `"+e+": "+g.strValue+"`"),this.parse(e,g.strValue);if(h.color){var v=g.value,y=f.value;if(!(v[0]!==y[0]||v[1]!==y[1]||v[2]!==y[2]||v[3]!==y[3]&&(null!=v[3]&&1!==v[3]||null!=y[3]&&1!==y[3])))return!1}return{name:e,value:c,strValue:""+t,mapped:p,field:c[1],fieldMin:parseFloat(c[2]),fieldMax:parseFloat(c[3]),valueMin:g.value,valueMax:f.value,bypass:n}}}if(h.multiple&&"multiple"!==r){var m;if(m=l?t.split(/\s+/):w(t)?t:[t],h.evenMultiple&&m.length%2!=0)return null;for(var E=[],T=[],_=[],C="",N=!1,A=0;A0?" ":"")+L.strValue}return h.validate&&!h.validate(E,T)?null:h.singleEnum&&N?1===E.length&&b(E[0])?{name:e,value:E[0],strValue:E[0],bypass:n}:null:{name:e,value:E,pfValue:_,strValue:C,bypass:n,units:T}}var S=function(){for(var r=0;rh.max||h.strictMax&&t===h.max))return null;var P={name:e,value:t,strValue:""+t+(O||""),units:O,bypass:n};return h.unitless||"px"!==O&&"em"!==O?P.pfValue=t:P.pfValue="px"!==O&&O?this.getEmSizeInPixels()*t:t,"ms"!==O&&"s"!==O||(P.pfValue="ms"===O?t:1e3*t),"deg"!==O&&"rad"!==O||(P.pfValue="rad"===O?t:mn(t)),"%"===O&&(P.pfValue=t/100),P}if(h.propList){var R=[],B=""+t;if("none"===B);else{for(var F=B.split(/\s*,\s*|\s+/),G=0;G0&&s>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0)return{zoom:a=(a=(a=Math.min((o-2*t)/n.w,(s-2*t)/n.h))>this._private.maxZoom?this._private.maxZoom:a)=n.minZoom&&(n.maxZoom=t),this},minZoom:function(e){return void 0===e?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return void 0===e?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t,n,r=this._private,i=r.pan,a=r.zoom,o=!1;if(r.zoomingEnabled||(o=!0),_(e)?n=e:E(e)&&(n=e.level,null!=e.position?t=hn(e.position,a,i):null!=e.renderedPosition&&(t=e.renderedPosition),null==t||r.panningEnabled||(o=!0)),n=(n=n>r.maxZoom?r.maxZoom:n)t.maxZoom||!t.zoomingEnabled?a=!0:(t.zoom=s,i.push("zoom"))}if(r&&(!a||!e.cancelOnFailedZoom)&&t.panningEnabled){var l=e.pan;_(l.x)&&(t.pan.x=l.x,o=!1),_(l.y)&&(t.pan.y=l.y,o=!1),o||i.push("pan")}return i.length>0&&(i.push("viewport"),this.emit(i.join(" ")),this.notify("viewport")),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,t){if(this._private.panningEnabled){if(b(e)){var n=e;e=this.mutableElements().filter(n)}else N(e)||(e=this.mutableElements());if(0!==e.length){var r=e.boundingBox(),i=this.width(),a=this.height();return{x:(i-(t=void 0===t?this._private.zoom:t)*(r.x1+r.x2))/2,y:(a-t*(r.y1+r.y2))/2}}}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e,t,n=this._private,r=n.container,i=this;return n.sizeCache=n.sizeCache||(r?(e=i.window().getComputedStyle(r),t=function(t){return parseFloat(e.getPropertyValue(t))},{width:r.clientWidth-t("padding-left")-t("padding-right"),height:r.clientHeight-t("padding-top")-t("padding-bottom")}):{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,t=this._private.zoom,n=this.renderedExtent(),r={x1:(n.x1-e.x)/t,x2:(n.x2-e.x)/t,y1:(n.y1-e.y)/t,y2:(n.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},multiClickDebounceTime:function(e){return e?(this._private.multiClickDebounceTime=e,this):this._private.multiClickDebounceTime}};rc.centre=rc.center,rc.autolockNodes=rc.autolock,rc.autoungrabifyNodes=rc.autoungrabify;var ic={data:hs.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:hs.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:hs.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:hs.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};ic.attr=ic.data,ic.removeAttr=ic.removeData;var ac=function(e){var t=this,n=(e=Q({},e)).container;n&&!C(n)&&C(n[0])&&(n=n[0]);var r=n?n._cyreg:null;(r=r||{})&&r.cy&&(r.cy.destroy(),r={});var i=r.readies=r.readies||[];n&&(n._cyreg=r),r.cy=t;var a=void 0!==d&&void 0!==n&&!e.headless,o=e;o.layout=Q({name:a?"grid":"null"},o.layout),o.renderer=Q({name:a?"canvas":"null"},o.renderer);var s=function(e,t,n){return void 0!==t?t:void 0!==n?n:e},l=this._private={container:n,ready:!1,options:o,elements:new bu(this),listeners:[],aniEles:new bu(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:s(!0,o.zoomingEnabled),userZoomingEnabled:s(!0,o.userZoomingEnabled),panningEnabled:s(!0,o.panningEnabled),userPanningEnabled:s(!0,o.userPanningEnabled),boxSelectionEnabled:s(!0,o.boxSelectionEnabled),autolock:s(!1,o.autolock,o.autolockNodes),autoungrabify:s(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:s(!1,o.autounselectify),styleEnabled:void 0===o.styleEnabled?a:o.styleEnabled,zoom:_(o.zoom)?o.zoom:1,pan:{x:E(o.pan)&&_(o.pan.x)?o.pan.x:0,y:E(o.pan)&&_(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:s(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});var u=function(e,t){if(e.some(R))return Gi.all(e).then(t);t(e)};l.styleEnabled&&t.setStyle([]);var c=Q({},o,o.renderer);t.initRenderer(c);var h=function(e,n,r){t.notifications(!1);var i=t.mutableElements();i.length>0&&i.remove(),null!=e&&(E(e)||w(e))&&t.add(e),t.one("layoutready",(function(e){t.notifications(!0),t.emit(e),t.one("load",n),t.emitAndNotify("load")})).one("layoutstop",(function(){t.one("done",r),t.emit("done")}));var a=Q({},t._private.options.layout);a.eles=t.elements(),t.layout(a).run()};u([o.style,o.elements],(function(e){var n=e[0],a=e[1];l.styleEnabled&&t.style().append(n),h(a,(function(){t.startAnimationLoop(),l.ready=!0,x(o.ready)&&t.on("ready",o.ready);for(var e=0;e0,u=Ln(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(N(n.roots))e=n.roots;else if(w(n.roots)){for(var c=[],h=0;h0;){var M=k(),P=L(M,O);if(P)M.outgoers().filter((function(e){return e.isNode()&&i.has(e)})).forEach(I);else if(null===P){Nt("Detected double maximal shift for node `"+M.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}A();var R=0;if(n.avoidOverlap)for(var B=0;B0&&y[0].length<=3?l/2:0),h=2*Math.PI/y[r].length*i;return 0===r&&1===y[0].length&&(c=1),{x:$.x+c*Math.cos(h),y:$.y+c*Math.sin(h)}}return{x:$.x+(i+1-(a+1)/2)*o,y:(r+1)*s}};return i.nodes().layoutPositions(this,n,Q),this};var dc={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function pc(e){this.options=Q({},dc,e)}pc.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,i=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,a=r.nodes().not(":parent");t.sort&&(a=a.sort(t.sort));for(var o,s=Ln(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=(void 0===t.sweep?2*Math.PI-2*Math.PI/a.length:t.sweep)/Math.max(1,a.length-1),c=0,h=0;h1&&t.avoidOverlap){c*=1.75;var f=Math.cos(u)-Math.cos(0),v=Math.sin(u)-Math.sin(0),y=Math.sqrt(c*c/(f*f+v*v));o=Math.max(y,o)}var m=function(e,n){var r=t.startAngle+n*u*(i?1:-1),a=o*Math.cos(r),s=o*Math.sin(r);return{x:l.x+a,y:l.y+s}};return r.nodes().layoutPositions(this,t,m),this};var gc,fc={fit:!0,padding:30,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function vc(e){this.options=Q({},fc,e)}vc.prototype.run=function(){for(var e=this.options,t=e,n=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,r=e.cy,i=t.eles,a=i.nodes().not(":parent"),o=Ln(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),s={x:o.x1+o.w/2,y:o.y1+o.h/2},l=[],u=0,c=0;c0&&Math.abs(y[0].value-b.value)>=f&&(y=[],v.push(y)),y.push(b)}var x=u+t.minNodeSpacing;if(!t.avoidOverlap){var w=v.length>0&&v[0].length>1,E=(Math.min(o.w,o.h)/2-x)/(v.length+w?1:0);x=Math.min(x,E)}for(var T=0,_=0;_1&&t.avoidOverlap){var A=Math.cos(N)-Math.cos(0),L=Math.sin(N)-Math.sin(0),S=Math.sqrt(x*x/(A*A+L*L));T=Math.max(S,T)}D.r=T,T+=x}if(t.equidistant){for(var O=0,I=0,k=0;k=e.numIter||(Cc(r,e),r.temperature=r.temperature*e.coolingFactor,r.temperature=e.animationThreshold&&a(),nt(t)):(Fc(r,e),s())}();else{for(;u;)u=o(l),l++;Fc(r,e),s()}return this},mc.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this},mc.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var bc,xc=function(e,t,n){for(var r=n.eles.edges(),i=n.eles.nodes(),a=Ln(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:i.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:r.size(),temperature:n.initialTemp,clientWidth:a.w,clientHeight:a.h,boundingBox:a},s=n.eles.components(),l={},u=0;u0)for(o.graphSet.push(E),u=0;ur.count?0:r.graph},Ec=function e(t,n,r,i){var a=i.graphSet[r];if(-10)var l=(c=r.nodeOverlap*s)*i/(v=Math.sqrt(i*i+a*a)),u=c*a/v;else{var c,h=Oc(e,i,a),d=Oc(t,-1*i,-1*a),p=d.x-h.x,g=d.y-h.y,f=p*p+g*g,v=Math.sqrt(f);l=(c=(e.nodeRepulsion+t.nodeRepulsion)/f)*p/v,u=c*g/v}e.isLocked||(e.offsetX-=l,e.offsetY-=u),t.isLocked||(t.offsetX+=l,t.offsetY+=u)}},Sc=function(e,t,n,r){if(n>0)var i=e.maxX-t.minX;else i=t.maxX-e.minX;if(r>0)var a=e.maxY-t.minY;else a=t.maxY-e.minY;return i>=0&&a>=0?Math.sqrt(i*i+a*a):0},Oc=function(e,t,n){var r=e.positionX,i=e.positionY,a=e.height||1,o=e.width||1,s=n/t,l=a/o,u={};return 0===t&&0n?(u.x=r,u.y=i+a/2,u):0t&&-1*l<=s&&s<=l?(u.x=r-o/2,u.y=i-o*n/2/t,u):0=l)?(u.x=r+a*t/2/n,u.y=i+a/2,u):0>n&&(s<=-1*l||s>=l)?(u.x=r-a*t/2/n,u.y=i-a/2,u):u},Ic=function(e,t){for(var n=0;nn){var f=t.gravity*d/g,v=t.gravity*p/g;h.offsetX+=f,h.offsetY+=v}}}}},Mc=function(e,t){var n=[],r=0,i=-1;for(n.push.apply(n,e.graphSet[0]),i+=e.graphSet[0].length;r<=i;){var a=n[r++],o=e.idToIndex[a],s=e.layoutNodes[o],l=s.children;if(0n)var i={x:n*e/r,y:n*t/r};else i={x:e,y:t};return i},Bc=function e(t,n){var r=t.parentId;if(null!=r){var i=n.layoutNodes[n.idToIndex[r]],a=!1;return(null==i.maxX||t.maxX+i.padRight>i.maxX)&&(i.maxX=t.maxX+i.padRight,a=!0),(null==i.minX||t.minX-i.padLefti.maxY)&&(i.maxY=t.maxY+i.padBottom,a=!0),(null==i.minY||t.minY-i.padTopg&&(h+=p+t.componentSpacing,c=0,d=0,p=0)}}},zc={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function Gc(e){this.options=Q({},zc,e)}Gc.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,i=r.nodes().not(":parent");t.sort&&(i=i.sort(t.sort));var a=Ln(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(0===a.h||0===a.w)r.nodes().layoutPositions(this,t,(function(e){return{x:a.x1,y:a.y1}}));else{var o=i.size(),s=Math.sqrt(o*a.h/a.w),l=Math.round(s),u=Math.round(a.w/a.h*s),c=function(e){if(null==e)return Math.min(l,u);Math.min(l,u)==l?l=e:u=e},h=function(e){if(null==e)return Math.max(l,u);Math.max(l,u)==l?l=e:u=e},d=t.rows,p=null!=t.cols?t.cols:t.columns;if(null!=d&&null!=p)l=d,u=p;else if(null!=d&&null==p)l=d,u=Math.ceil(o/l);else if(null==d&&null!=p)u=p,l=Math.ceil(o/u);else if(u*l>o){var g=c(),f=h();(g-1)*f>=o?c(g-1):(f-1)*g>=o&&h(f-1)}else for(;u*l=o?h(y+1):c(v+1)}var m=a.w/u,b=a.h/l;if(t.condense&&(m=0,b=0),t.avoidOverlap)for(var x=0;x=u&&(O=0,S++)},k={},M=0;M(r=qn(e,t,x[w],x[w+1],x[w+2],x[w+3])))return v(n,r),!0}else if("bezier"===a.edgeType||"multibezier"===a.edgeType||"self"===a.edgeType||"compound"===a.edgeType)for(x=a.allpts,w=0;w+5(r=Hn(e,t,x[w],x[w+1],x[w+2],x[w+3],x[w+4],x[w+5])))return v(n,r),!0;m=m||i.source,b=b||i.target;var E=o.getArrowWidth(l,c),T=[{name:"source",x:a.arrowStartX,y:a.arrowStartY,angle:a.srcArrowAngle},{name:"target",x:a.arrowEndX,y:a.arrowEndY,angle:a.tgtArrowAngle},{name:"mid-source",x:a.midX,y:a.midY,angle:a.midsrcArrowAngle},{name:"mid-target",x:a.midX,y:a.midY,angle:a.midtgtArrowAngle}];for(w=0;w0&&(y(m),y(b))}function b(e,t,n){return Ft(e,t,n)}function x(n,r){var i,a=n._private,o=g;i=r?r+"-":"",n.boundingBox();var s=a.labelBounds[r||"main"],l=n.pstyle(i+"label").value;if("yes"===n.pstyle("text-events").strValue&&l){var u=b(a.rscratch,"labelX",r),c=b(a.rscratch,"labelY",r),h=b(a.rscratch,"labelAngle",r),d=n.pstyle(i+"text-margin-x").pfValue,p=n.pstyle(i+"text-margin-y").pfValue,f=s.x1-o-d,y=s.x2+o-d,m=s.y1-o-p,x=s.y2+o-p;if(h){var w=Math.cos(h),E=Math.sin(h),T=function(e,t){return{x:(e-=u)*w-(t-=c)*E+u,y:e*E+t*w+c}},_=T(f,m),D=T(f,x),C=T(y,m),N=T(y,x),A=[_.x+d,_.y+p,C.x+d,C.y+p,N.x+d,N.y+p,D.x+d,D.y+p];if(Wn(e,t,A))return v(n),!0}else if(Fn(s,e,t))return v(n),!0}}n&&(l=l.interactive);for(var w=l.length-1;w>=0;w--){var E=l[w];E.isNode()?y(E)||x(E):m(E)||x(E)||x(E,"source")||x(E,"target")}return u},getAllInBox:function(e,t,n,r){for(var i=this.getCachedZSortedEles().interactive,a=[],o=Math.min(e,n),s=Math.max(e,n),l=Math.min(t,r),u=Math.max(t,r),c=Ln({x1:e=o,y1:t=l,x2:n=s,y2:r=u}),h=0;h0?Math.max(e-t,0):Math.min(e+t,0)},A=N(D,T),L=N(C,_),S=!1;y===u?v=Math.abs(A)>Math.abs(L)?i:r:y===l||y===s?(v=r,S=!0):y!==a&&y!==o||(v=i,S=!0);var O,I=v===r,k=I?L:A,M=I?C:D,P=wn(M),R=!1;S&&(b||w)||!(y===s&&M<0||y===l&&M>0||y===a&&M>0||y===o&&M<0)||(k=(P*=-1)*Math.abs(k),R=!0);var B=function(e){return Math.abs(e)=Math.abs(k)},F=B(O=b?(x<0?1+x:x)*k:(x<0?k:0)+x*P),z=B(Math.abs(k)-Math.abs(O));if(!F&&!z||R)if(I){var G=c.y1+O+(f?d/2*P:0),Y=c.x1,X=c.x2;n.segpts=[Y,G,X,G]}else{var V=c.x1+O+(f?h/2*P:0),U=c.y1,j=c.y2;n.segpts=[V,U,V,j]}else if(I){var H=Math.abs(M)<=d/2,q=Math.abs(D)<=p/2;if(H){var W=(c.x1+c.x2)/2,$=c.y1,K=c.y2;n.segpts=[W,$,W,K]}else if(q){var Z=(c.y1+c.y2)/2,Q=c.x1,J=c.x2;n.segpts=[Q,Z,J,Z]}else n.segpts=[c.x1,c.y2]}else{var ee=Math.abs(M)<=h/2,te=Math.abs(C)<=g/2;if(ee){var ne=(c.y1+c.y2)/2,re=c.x1,ie=c.x2;n.segpts=[re,ne,ie,ne]}else if(te){var ae=(c.x1+c.x2)/2,oe=c.y1,se=c.y2;n.segpts=[ae,oe,ae,se]}else n.segpts=[c.x2,c.y1]}},eh.tryToCorrectInvalidPoints=function(e,t){var n=e._private.rscratch;if("bezier"===n.edgeType){var r=t.srcPos,i=t.tgtPos,a=t.srcW,o=t.srcH,s=t.tgtW,l=t.tgtH,u=t.srcShape,c=t.tgtShape,h=!_(n.startX)||!_(n.startY),d=!_(n.arrowStartX)||!_(n.arrowStartY),p=!_(n.endX)||!_(n.endY),g=!_(n.arrowEndX)||!_(n.arrowEndY),f=this.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.arrowShapeWidth*3,v=En({x:n.ctrlpts[0],y:n.ctrlpts[1]},{x:n.startX,y:n.startY}),y=vd.poolIndex()){var p=h;h=d,d=p}var g=s.srcPos=h.position(),f=s.tgtPos=d.position(),v=s.srcW=h.outerWidth(),y=s.srcH=h.outerHeight(),m=s.tgtW=d.outerWidth(),b=s.tgtH=d.outerHeight(),x=s.srcShape=n.nodeShapes[t.getNodeShape(h)],w=s.tgtShape=n.nodeShapes[t.getNodeShape(d)];s.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var E=0;E0){var X=u,V=Tn(X,pn(t)),U=Tn(X,pn(Y)),j=V;U2&&Tn(X,{x:Y[2],y:Y[3]})0){var ie=c,ae=Tn(ie,pn(t)),oe=Tn(ie,pn(re)),se=ae;oe2&&Tn(ie,{x:re[2],y:re[3]})=u||m){c={cp:f,segment:y};break}}if(c)break}var b=c.cp,x=c.segment,w=(u-d)/x.length,E=x.t1-x.t0,T=s?x.t0+E*w:x.t1-E*w;T=An(0,T,1),t=Cn(b.p0,b.p1,b.p2,T),i=lh(b.p0,b.p1,b.p2,T);break;case"straight":case"segments":case"haystack":for(var _,D,C,N,A=0,L=r.allpts.length,S=0;S+3=u));S+=2);var O=(u-D)/_;O=An(0,O,1),t=Nn(C,N,O),i=sh(C,N)}o("labelX",n,t.x),o("labelY",n,t.y),o("labelAutoAngle",n,i)}};u("source"),u("target"),this.applyLabelDimensions(e)}},ah.applyLabelDimensions=function(e){this.applyPrefixedLabelDimensions(e),e.isEdge()&&(this.applyPrefixedLabelDimensions(e,"source"),this.applyPrefixedLabelDimensions(e,"target"))},ah.applyPrefixedLabelDimensions=function(e,t){var n=e._private,r=this.getLabelText(e,t),i=this.calculateLabelDimensions(e,r),a=e.pstyle("line-height").pfValue,o=e.pstyle("text-wrap").strValue,s=Ft(n.rscratch,"labelWrapCachedLines",t)||[],l="wrap"!==o?1:Math.max(s.length,1),u=i.height/l,c=u*a,h=i.width,d=i.height+(l-1)*(a-1)*u;zt(n.rstyle,"labelWidth",t,h),zt(n.rscratch,"labelWidth",t,h),zt(n.rstyle,"labelHeight",t,d),zt(n.rscratch,"labelHeight",t,d),zt(n.rscratch,"labelLineHeight",t,c)},ah.getLabelText=function(e,t){var n=e._private,r=t?t+"-":"",i=e.pstyle(r+"label").strValue,a=e.pstyle("text-transform").value,o=function(e,r){return r?(zt(n.rscratch,e,t,r),r):Ft(n.rscratch,e,t)};if(!i)return"";"none"==a||("uppercase"==a?i=i.toUpperCase():"lowercase"==a&&(i=i.toLowerCase()));var s=e.pstyle("text-wrap").value;if("wrap"===s){var l=o("labelKey");if(null!=l&&o("labelWrapKey")===l)return o("labelWrapCachedText");for(var u="\u200b",c=i.split("\n"),h=e.pstyle("text-max-width").pfValue,d="anywhere"===e.pstyle("text-overflow-wrap").value,p=[],g=/[\s\u200b]+/,f=d?"":" ",v=0;vh){for(var x=y.split(g),w="",E=0;ED);L++)C+=i[L],L===i.length-1&&(A=!0);return A||(C+=N),C}return i},ah.getLabelJustification=function(e){var t=e.pstyle("text-justification").strValue,n=e.pstyle("text-halign").strValue;if("auto"!==t)return t;if(!e.isNode())return"center";switch(n){case"left":return"right";case"right":return"left";default:return"center"}},ah.calculateLabelDimensions=function(e,t){var n=this,r=gt(t,e._private.labelDimsKey),i=n.labelDimCache||(n.labelDimCache=[]),a=i[r];if(null!=a)return a;var o=0,s=e.pstyle("font-style").strValue,l=e.pstyle("font-size").pfValue,u=e.pstyle("font-family").strValue,c=e.pstyle("font-weight").strValue,h=this.labelCalcCanvas,d=this.labelCalcCanvasContext;if(!h){h=this.labelCalcCanvas=document.createElement("canvas"),d=this.labelCalcCanvasContext=h.getContext("2d");var p=h.style;p.position="absolute",p.left="-9999px",p.top="-9999px",p.zIndex="-1",p.visibility="hidden",p.pointerEvents="none"}d.font="".concat(s," ").concat(c," ").concat(l,"px ").concat(u);for(var g=0,f=0,v=t.split("\n"),y=0;y1&&void 0!==arguments[1])||arguments[1];if(t.merge(e),n)for(var r=0;r=e.desktopTapThreshold2}var C=i(t);f&&(e.hoverData.tapholdCancelled=!0);var N=function(){var t=e.hoverData.dragDelta=e.hoverData.dragDelta||[];0===t.length?(t.push(b[0]),t.push(b[1])):(t[0]+=b[0],t[1]+=b[1])};n=!0,r(p,["mousemove","vmousemove","tapdrag"],t,{x:u[0],y:u[1]});var A=function(){e.data.bgActivePosistion=void 0,e.hoverData.selecting||o.emit({originalEvent:t,type:"boxstart",position:{x:u[0],y:u[1]}}),d[4]=1,e.hoverData.selecting=!0,e.redrawHint("select",!0),e.redraw()};if(3===e.hoverData.which){if(f){var S={originalEvent:t,type:"cxtdrag",position:{x:u[0],y:u[1]}};m?m.emit(S):o.emit(S),e.hoverData.cxtDragged=!0,e.hoverData.cxtOver&&p===e.hoverData.cxtOver||(e.hoverData.cxtOver&&e.hoverData.cxtOver.emit({originalEvent:t,type:"cxtdragout",position:{x:u[0],y:u[1]}}),e.hoverData.cxtOver=p,p&&p.emit({originalEvent:t,type:"cxtdragover",position:{x:u[0],y:u[1]}}))}}else if(e.hoverData.dragging){if(n=!0,o.panningEnabled()&&o.userPanningEnabled()){var O;if(e.hoverData.justStartedPan){var I=e.hoverData.mdownPos;O={x:(u[0]-I[0])*s,y:(u[1]-I[1])*s},e.hoverData.justStartedPan=!1}else O={x:b[0]*s,y:b[1]*s};o.panBy(O),o.emit("dragpan"),e.hoverData.dragged=!0}u=e.projectIntoViewport(t.clientX,t.clientY)}else if(1!=d[4]||null!=m&&!m.pannable()){if(m&&m.pannable()&&m.active()&&m.unactivate(),m&&m.grabbed()||p==y||(y&&r(y,["mouseout","tapdragout"],t,{x:u[0],y:u[1]}),p&&r(p,["mouseover","tapdragover"],t,{x:u[0],y:u[1]}),e.hoverData.last=p),m)if(f){if(o.boxSelectionEnabled()&&C)m&&m.grabbed()&&(v(x),m.emit("freeon"),x.emit("free"),e.dragData.didDrag&&(m.emit("dragfreeon"),x.emit("dragfree"))),A();else if(m&&m.grabbed()&&e.nodeIsDraggable(m)){var k=!e.dragData.didDrag;k&&e.redrawHint("eles",!0),e.dragData.didDrag=!0,e.hoverData.draggingEles||g(x,{inDragLayer:!0});var M={x:0,y:0};if(_(b[0])&&_(b[1])&&(M.x+=b[0],M.y+=b[1],k)){var P=e.hoverData.dragDelta;P&&_(P[0])&&_(P[1])&&(M.x+=P[0],M.y+=P[1])}e.hoverData.draggingEles=!0,x.silentShift(M).emit("position drag"),e.redrawHint("drag",!0),e.redraw()}}else N();n=!0}else f&&(e.hoverData.dragging||!o.boxSelectionEnabled()||!C&&o.panningEnabled()&&o.userPanningEnabled()?!e.hoverData.selecting&&o.panningEnabled()&&o.userPanningEnabled()&&a(m,e.hoverData.downs)&&(e.hoverData.dragging=!0,e.hoverData.justStartedPan=!0,d[4]=0,e.data.bgActivePosistion=pn(c),e.redrawHint("select",!0),e.redraw()):A(),m&&m.pannable()&&m.active()&&m.unactivate());return d[2]=u[0],d[3]=u[1],n?(t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),!1):void 0}}),!1),e.registerBinding(t,"mouseup",(function(t){if(e.hoverData.capture){e.hoverData.capture=!1;var a=e.cy,o=e.projectIntoViewport(t.clientX,t.clientY),s=e.selection,l=e.findNearestElement(o[0],o[1],!0,!1),u=e.dragData.possibleDragElements,c=e.hoverData.down,h=i(t);if(e.data.bgActivePosistion&&(e.redrawHint("select",!0),e.redraw()),e.hoverData.tapholdCancelled=!0,e.data.bgActivePosistion=void 0,c&&c.unactivate(),3===e.hoverData.which){var d={originalEvent:t,type:"cxttapend",position:{x:o[0],y:o[1]}};if(c?c.emit(d):a.emit(d),!e.hoverData.cxtDragged){var p={originalEvent:t,type:"cxttap",position:{x:o[0],y:o[1]}};c?c.emit(p):a.emit(p)}e.hoverData.cxtDragged=!1,e.hoverData.which=null}else if(1===e.hoverData.which){if(r(l,["mouseup","tapend","vmouseup"],t,{x:o[0],y:o[1]}),e.dragData.didDrag||e.hoverData.dragged||e.hoverData.selecting||e.hoverData.isOverThresholdDrag||(r(c,["click","tap","vclick"],t,{x:o[0],y:o[1]}),C=!1,t.timeStamp-N<=a.multiClickDebounceTime()?(D&&clearTimeout(D),C=!0,N=null,r(c,["dblclick","dbltap","vdblclick"],t,{x:o[0],y:o[1]})):(D=setTimeout((function(){C||r(c,["oneclick","onetap","voneclick"],t,{x:o[0],y:o[1]})}),a.multiClickDebounceTime()),N=t.timeStamp)),null!=c||e.dragData.didDrag||e.hoverData.selecting||e.hoverData.dragged||i(t)||(a.$(n).unselect(["tapunselect"]),u.length>0&&e.redrawHint("eles",!0),e.dragData.possibleDragElements=u=a.collection()),l!=c||e.dragData.didDrag||e.hoverData.selecting||null!=l&&l._private.selectable&&(e.hoverData.dragging||("additive"===a.selectionType()||h?l.selected()?l.unselect(["tapunselect"]):l.select(["tapselect"]):h||(a.$(n).unmerge(l).unselect(["tapunselect"]),l.select(["tapselect"]))),e.redrawHint("eles",!0)),e.hoverData.selecting){var g=a.collection(e.getAllInBox(s[0],s[1],s[2],s[3]));e.redrawHint("select",!0),g.length>0&&e.redrawHint("eles",!0),a.emit({type:"boxend",originalEvent:t,position:{x:o[0],y:o[1]}});var f=function(e){return e.selectable()&&!e.selected()};"additive"===a.selectionType()||h||a.$(n).unmerge(g).unselect(),g.emit("box").stdFilter(f).select().emit("boxselect"),e.redraw()}if(e.hoverData.dragging&&(e.hoverData.dragging=!1,e.redrawHint("select",!0),e.redrawHint("eles",!0),e.redraw()),!s[4]){e.redrawHint("drag",!0),e.redrawHint("eles",!0);var y=c&&c.grabbed();v(u),y&&(c.emit("freeon"),u.emit("free"),e.dragData.didDrag&&(c.emit("dragfreeon"),u.emit("dragfree")))}}s[4]=0,e.hoverData.down=null,e.hoverData.cxtStarted=!1,e.hoverData.draggingEles=!1,e.hoverData.selecting=!1,e.hoverData.isOverThresholdDrag=!1,e.dragData.didDrag=!1,e.hoverData.dragged=!1,e.hoverData.dragDelta=[],e.hoverData.mdownPos=null,e.hoverData.mdownGPos=null}}),!1);var S,O,I,k,M,P,R,B,F,z,G,Y,X,V=function(t){if(!e.scrollingPage){var n=e.cy,r=n.zoom(),i=n.pan(),a=e.projectIntoViewport(t.clientX,t.clientY),o=[a[0]*r+i.x,a[1]*r+i.y];if(e.hoverData.draggingEles||e.hoverData.dragging||e.hoverData.cxtStarted||A())t.preventDefault();else if(n.panningEnabled()&&n.userPanningEnabled()&&n.zoomingEnabled()&&n.userZoomingEnabled()){var s;t.preventDefault(),e.data.wheelZooming=!0,clearTimeout(e.data.wheelTimeout),e.data.wheelTimeout=setTimeout((function(){e.data.wheelZooming=!1,e.redrawHint("eles",!0),e.redraw()}),150),s=null!=t.deltaY?t.deltaY/-250:null!=t.wheelDeltaY?t.wheelDeltaY/1e3:t.wheelDelta/1e3,s*=e.wheelSensitivity,1===t.deltaMode&&(s*=33);var l=n.zoom()*Math.pow(10,s);"gesturechange"===t.type&&(l=e.gestureStartZoom*t.scale),n.zoom({level:l,renderedPosition:{x:o[0],y:o[1]}}),n.emit("gesturechange"===t.type?"pinchzoom":"scrollzoom")}}};e.registerBinding(e.container,"wheel",V,!0),e.registerBinding(t,"scroll",(function(t){e.scrollingPage=!0,clearTimeout(e.scrollingPageTimeout),e.scrollingPageTimeout=setTimeout((function(){e.scrollingPage=!1}),250)}),!0),e.registerBinding(e.container,"gesturestart",(function(t){e.gestureStartZoom=e.cy.zoom(),e.hasTouchStarted||t.preventDefault()}),!0),e.registerBinding(e.container,"gesturechange",(function(t){e.hasTouchStarted||V(t)}),!0),e.registerBinding(e.container,"mouseout",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseout",position:{x:n[0],y:n[1]}})}),!1),e.registerBinding(e.container,"mouseover",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseover",position:{x:n[0],y:n[1]}})}),!1);var U,j,H,q,W,$,K,Z=function(e,t,n,r){return Math.sqrt((n-e)*(n-e)+(r-t)*(r-t))},Q=function(e,t,n,r){return(n-e)*(n-e)+(r-t)*(r-t)};if(e.registerBinding(e.container,"touchstart",U=function(t){if(e.hasTouchStarted=!0,L(t)){m(),e.touchData.capture=!0,e.data.bgActivePosistion=void 0;var n=e.cy,i=e.touchData.now,a=e.touchData.earlier;if(t.touches[0]){var o=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);i[0]=o[0],i[1]=o[1]}if(t.touches[1]&&(o=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY),i[2]=o[0],i[3]=o[1]),t.touches[2]&&(o=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY),i[4]=o[0],i[5]=o[1]),t.touches[1]){e.touchData.singleTouchMoved=!0,v(e.dragData.touchDragEles);var s=e.findContainerClientCoords();F=s[0],z=s[1],G=s[2],Y=s[3],S=t.touches[0].clientX-F,O=t.touches[0].clientY-z,I=t.touches[1].clientX-F,k=t.touches[1].clientY-z,X=0<=S&&S<=G&&0<=I&&I<=G&&0<=O&&O<=Y&&0<=k&&k<=Y;var l=n.pan(),u=n.zoom();M=Z(S,O,I,k),P=Q(S,O,I,k),B=[((R=[(S+I)/2,(O+k)/2])[0]-l.x)/u,(R[1]-l.y)/u];var h=200;if(P=1){for(var T=e.touchData.startPosition=[null,null,null,null,null,null],_=0;_=e.touchTapThreshold2}if(n&&e.touchData.cxt){t.preventDefault();var x=t.touches[0].clientX-F,w=t.touches[0].clientY-z,E=t.touches[1].clientX-F,T=t.touches[1].clientY-z,D=Q(x,w,E,T),C=150,N=1.5;if(D/P>=N*N||D>=C*C){e.touchData.cxt=!1,e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var A={originalEvent:t,type:"cxttapend",position:{x:s[0],y:s[1]}};e.touchData.start?(e.touchData.start.unactivate().emit(A),e.touchData.start=null):o.emit(A)}}if(n&&e.touchData.cxt){A={originalEvent:t,type:"cxtdrag",position:{x:s[0],y:s[1]}},e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.touchData.start?e.touchData.start.emit(A):o.emit(A),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxtDragged=!0;var R=e.findNearestElement(s[0],s[1],!0,!0);e.touchData.cxtOver&&R===e.touchData.cxtOver||(e.touchData.cxtOver&&e.touchData.cxtOver.emit({originalEvent:t,type:"cxtdragout",position:{x:s[0],y:s[1]}}),e.touchData.cxtOver=R,R&&R.emit({originalEvent:t,type:"cxtdragover",position:{x:s[0],y:s[1]}}))}else if(n&&t.touches[2]&&o.boxSelectionEnabled())t.preventDefault(),e.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,e.touchData.selecting||o.emit({originalEvent:t,type:"boxstart",position:{x:s[0],y:s[1]}}),e.touchData.selecting=!0,e.touchData.didSelect=!0,i[4]=1,i&&0!==i.length&&void 0!==i[0]?(i[2]=(s[0]+s[2]+s[4])/3,i[3]=(s[1]+s[3]+s[5])/3):(i[0]=(s[0]+s[2]+s[4])/3,i[1]=(s[1]+s[3]+s[5])/3,i[2]=(s[0]+s[2]+s[4])/3+1,i[3]=(s[1]+s[3]+s[5])/3+1),e.redrawHint("select",!0),e.redraw();else if(n&&t.touches[1]&&!e.touchData.didSelect&&o.zoomingEnabled()&&o.panningEnabled()&&o.userZoomingEnabled()&&o.userPanningEnabled()){if(t.preventDefault(),e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),ne=e.dragData.touchDragEles){e.redrawHint("drag",!0);for(var G=0;G0&&!e.hoverData.draggingEles&&!e.swipePanning&&null!=e.data.bgActivePosistion&&(e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.redraw())}},!1),e.registerBinding(t,"touchcancel",H=function(t){var n=e.touchData.start;e.touchData.capture=!1,n&&n.unactivate()}),e.registerBinding(t,"touchend",q=function(t){var i=e.touchData.start;if(e.touchData.capture){0===t.touches.length&&(e.touchData.capture=!1),t.preventDefault();var a=e.selection;e.swipePanning=!1,e.hoverData.draggingEles=!1;var o,s=e.cy,l=s.zoom(),u=e.touchData.now,c=e.touchData.earlier;if(t.touches[0]){var h=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);u[0]=h[0],u[1]=h[1]}if(t.touches[1]&&(h=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY),u[2]=h[0],u[3]=h[1]),t.touches[2]&&(h=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY),u[4]=h[0],u[5]=h[1]),i&&i.unactivate(),e.touchData.cxt){if(o={originalEvent:t,type:"cxttapend",position:{x:u[0],y:u[1]}},i?i.emit(o):s.emit(o),!e.touchData.cxtDragged){var d={originalEvent:t,type:"cxttap",position:{x:u[0],y:u[1]}};i?i.emit(d):s.emit(d)}return e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!1,e.touchData.start=null,void e.redraw()}if(!t.touches[2]&&s.boxSelectionEnabled()&&e.touchData.selecting){e.touchData.selecting=!1;var p=s.collection(e.getAllInBox(a[0],a[1],a[2],a[3]));a[0]=void 0,a[1]=void 0,a[2]=void 0,a[3]=void 0,a[4]=0,e.redrawHint("select",!0),s.emit({type:"boxend",originalEvent:t,position:{x:u[0],y:u[1]}});var g=function(e){return e.selectable()&&!e.selected()};p.emit("box").stdFilter(g).select().emit("boxselect"),p.nonempty()&&e.redrawHint("eles",!0),e.redraw()}if(null!=i&&i.unactivate(),t.touches[2])e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);else if(t.touches[1]);else if(t.touches[0]);else if(!t.touches[0]){e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var f=e.dragData.touchDragEles;if(null!=i){var y=i._private.grabbed;v(f),e.redrawHint("drag",!0),e.redrawHint("eles",!0),y&&(i.emit("freeon"),f.emit("free"),e.dragData.didDrag&&(i.emit("dragfreeon"),f.emit("dragfree"))),r(i,["touchend","tapend","vmouseup","tapdragout"],t,{x:u[0],y:u[1]}),i.unactivate(),e.touchData.start=null}else{var m=e.findNearestElement(u[0],u[1],!0,!0);r(m,["touchend","tapend","vmouseup","tapdragout"],t,{x:u[0],y:u[1]})}var b=e.touchData.startPosition[0]-u[0],x=b*b,w=e.touchData.startPosition[1]-u[1],E=(x+w*w)*l*l;e.touchData.singleTouchMoved||(i||s.$(":selected").unselect(["tapunselect"]),r(i,["tap","vclick"],t,{x:u[0],y:u[1]}),W=!1,t.timeStamp-K<=s.multiClickDebounceTime()?($&&clearTimeout($),W=!0,K=null,r(i,["dbltap","vdblclick"],t,{x:u[0],y:u[1]})):($=setTimeout((function(){W||r(i,["onetap","voneclick"],t,{x:u[0],y:u[1]})}),s.multiClickDebounceTime()),K=t.timeStamp)),null!=i&&!e.dragData.didDrag&&i._private.selectable&&E0)return p[0]}return null},d=Object.keys(c),p=0;p0?l:Yn(i,a,e,t,n,r,o)},checkPoint:function(e,t,n,r,i,a,o){var s=cr(r,i),l=2*s;if($n(e,t,this.points,a,o,r,i-l,[0,-1],n))return!0;if($n(e,t,this.points,a,o,r-l,i,[0,-1],n))return!0;var u=r/2+2*n,c=i/2+2*n;return!!Wn(e,t,[a-u,o-c,a-u,o,a+u,o,a+u,o-c])||!!er(e,t,l,l,a+r/2-s,o+i/2-s,n)||!!er(e,t,l,l,a-r/2+s,o+i/2-s,n)}}},registerNodeShapes:function(){var e=this.nodeShapes={},t=this;this.generateEllipse(),this.generatePolygon("triangle",sr(3,0)),this.generateRoundPolygon("round-triangle",sr(3,0)),this.generatePolygon("rectangle",sr(4,0)),e.square=e.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();var n=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",n),this.generateRoundPolygon("round-diamond",n),this.generatePolygon("pentagon",sr(5,0)),this.generateRoundPolygon("round-pentagon",sr(5,0)),this.generatePolygon("hexagon",sr(6,0)),this.generateRoundPolygon("round-hexagon",sr(6,0)),this.generatePolygon("heptagon",sr(7,0)),this.generateRoundPolygon("round-heptagon",sr(7,0)),this.generatePolygon("octagon",sr(8,0)),this.generateRoundPolygon("round-octagon",sr(8,0));var r=new Array(20),i=ur(5,0),a=ur(5,Math.PI/5),o=.5*(3-Math.sqrt(5));o*=1.57;for(var s=0;s=e.deqFastCost*f)break}else if(i){if(p>=e.deqCost*l||p>=e.deqAvgCost*s)break}else if(g>=e.deqNoDrawCost*Eh)break;var v=e.deq(t,h,c);if(!(v.length>0))break;for(var y=0;y0&&(e.onDeqd(t,u),!i&&e.shouldRedraw(t,u,h,c)&&r())},a=e.priority||_t;n.beforeRender(i,a(t))}}}},_h=function(){function e(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Et;t(this,e),this.idsByKey=new Yt,this.keyForId=new Yt,this.cachesByLvl=new Yt,this.lvls=[],this.getKey=n,this.doesEleInvalidateKey=r}return i(e,[{key:"getIdsFor",value:function(e){null==e&&Dt("Can not get id list for null key");var t=this.idsByKey,n=this.idsByKey.get(e);return n||(n=new Ut,t.set(e,n)),n}},{key:"addIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).add(t)}},{key:"deleteIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).delete(t)}},{key:"getNumberOfIdsForKey",value:function(e){return null==e?0:this.getIdsFor(e).size}},{key:"updateKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t),r=this.getKey(e);this.deleteIdForKey(n,t),this.addIdForKey(r,t),this.keyForId.set(t,r)}},{key:"deleteKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteIdForKey(n,t),this.keyForId.delete(t)}},{key:"keyHasChangedFor",value:function(e){var t=e.id();return this.keyForId.get(t)!==this.getKey(e)}},{key:"isInvalid",value:function(e){return this.keyHasChangedFor(e)||this.doesEleInvalidateKey(e)}},{key:"getCachesAt",value:function(e){var t=this.cachesByLvl,n=this.lvls,r=t.get(e);return r||(r=new Yt,t.set(e,r),n.push(e)),r}},{key:"getCache",value:function(e,t){return this.getCachesAt(t).get(e)}},{key:"get",value:function(e,t){var n=this.getKey(e),r=this.getCache(n,t);return null!=r&&this.updateKeyMappingFor(e),r}},{key:"getForCachedKey",value:function(e,t){var n=this.keyForId.get(e.id());return this.getCache(n,t)}},{key:"hasCache",value:function(e,t){return this.getCachesAt(t).has(e)}},{key:"has",value:function(e,t){var n=this.getKey(e);return this.hasCache(n,t)}},{key:"setCache",value:function(e,t,n){n.key=e,this.getCachesAt(t).set(e,n)}},{key:"set",value:function(e,t,n){var r=this.getKey(e);this.setCache(r,t,n),this.updateKeyMappingFor(e)}},{key:"deleteCache",value:function(e,t){this.getCachesAt(t).delete(e)}},{key:"delete",value:function(e,t){var n=this.getKey(e);this.deleteCache(n,t)}},{key:"invalidateKey",value:function(e){var t=this;this.lvls.forEach((function(n){return t.deleteCache(e,n)}))}},{key:"invalidate",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteKeyMappingFor(e);var r=this.doesEleInvalidateKey(e);return r&&this.invalidateKey(n),r||0===this.getNumberOfIdsForKey(n)}}]),e}(),Dh=25,Ch=50,Nh=-4,Ah=3,Lh=7.99,Sh=8,Oh=1024,Ih=1024,kh=1024,Mh=.2,Ph=.8,Rh=10,Bh=.15,Fh=.1,zh=.9,Gh=.9,Yh=100,Xh=1,Vh={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},Uh=Mt({getKey:null,doesEleInvalidateKey:Et,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:wt,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),jh=function(e,t){var n=this;n.renderer=e,n.onDequeues=[];var r=Uh(t);Q(n,r),n.lookup=new _h(r.getKey,r.doesEleInvalidateKey),n.setupDequeueing()},Hh=jh.prototype;Hh.reasons=Vh,Hh.getTextureQueue=function(e){var t=this;return t.eleImgCaches=t.eleImgCaches||{},t.eleImgCaches[e]=t.eleImgCaches[e]||[]},Hh.getRetiredTextureQueue=function(e){var t=this,n=t.eleImgCaches.retired=t.eleImgCaches.retired||{};return n[e]=n[e]||[]},Hh.getElementQueue=function(){var e=this;return e.eleCacheQueue=e.eleCacheQueue||new $t((function(e,t){return t.reqs-e.reqs}))},Hh.getElementKeyToQueue=function(){var e=this;return e.eleKeyToCacheQueue=e.eleKeyToCacheQueue||{}},Hh.getElement=function(e,t,n,r,i){var a=this,o=this.renderer,s=o.cy.zoom(),l=this.lookup;if(!t||0===t.w||0===t.h||isNaN(t.w)||isNaN(t.h)||!e.visible()||e.removed())return null;if(!a.allowEdgeTxrCaching&&e.isEdge()||!a.allowParentTxrCaching&&e.isParent())return null;if(null==r&&(r=Math.ceil(xn(s*n))),r=Lh||r>Ah)return null;var u=Math.pow(2,r),c=t.h*u,h=t.w*u,d=o.eleTextBiggerThanMin(e,u);if(!this.isVisible(e,d))return null;var p,g=l.get(e,r);if(g&&g.invalidated&&(g.invalidated=!1,g.texture.invalidatedWidth-=g.width),g)return g;if(p=c<=Dh?Dh:c<=Ch?Ch:Math.ceil(c/Ch)*Ch,c>kh||h>Ih)return null;var f=a.getTextureQueue(p),v=f[f.length-2],y=function(){return a.recycleTexture(p,h)||a.addTexture(p,h)};v||(v=f[f.length-1]),v||(v=y()),v.width-v.usedWidthr;N--)D=a.getElement(e,t,n,N,Vh.downscale);C()}else{var A;if(!x&&!w&&!E)for(var L=r-1;L>=Nh;L--){var S=l.get(e,L);if(S){A=S;break}}if(b(A))return a.queueElement(e,r),A;v.context.translate(v.usedWidth,0),v.context.scale(u,u),this.drawElement(v.context,e,t,d,!1),v.context.scale(1/u,1/u),v.context.translate(-v.usedWidth,0)}return g={x:v.usedWidth,texture:v,level:r,scale:u,width:h,height:c,scaledLabelShown:d},v.usedWidth+=Math.ceil(h+Sh),v.eleCaches.push(g),l.set(e,r,g),a.checkTextureFullness(v),g},Hh.invalidateElements=function(e){for(var t=0;t=Mh*e.width&&this.retireTexture(e)},Hh.checkTextureFullness=function(e){var t=this.getTextureQueue(e.height);e.usedWidth/e.width>Ph&&e.fullnessChecks>=Rh?Pt(t,e):e.fullnessChecks++},Hh.retireTexture=function(e){var t=this,n=e.height,r=t.getTextureQueue(n),i=this.lookup;Pt(r,e),e.retired=!0;for(var a=e.eleCaches,o=0;o=t)return o.retired=!1,o.usedWidth=0,o.invalidatedWidth=0,o.fullnessChecks=0,Rt(o.eleCaches),o.context.setTransform(1,0,0,1,0,0),o.context.clearRect(0,0,o.width,o.height),Pt(i,o),r.push(o),o}},Hh.queueElement=function(e,t){var n=this,r=n.getElementQueue(),i=n.getElementKeyToQueue(),a=this.getKey(e),o=i[a];if(o)o.level=Math.max(o.level,t),o.eles.merge(e),o.reqs++,r.updateItem(o);else{var s={eles:e.spawn().merge(e),level:t,reqs:1,key:a};r.push(s),i[a]=s}},Hh.dequeue=function(e){for(var t=this,n=t.getElementQueue(),r=t.getElementKeyToQueue(),i=[],a=t.lookup,o=0;o0;o++){var s=n.pop(),l=s.key,u=s.eles[0],c=a.hasCache(u,s.level);if(r[l]=null,!c){i.push(s);var h=t.getBoundingBox(u);t.getElement(u,h,e,s.level,Vh.dequeue)}}return i},Hh.removeFromQueue=function(e){var t=this,n=t.getElementQueue(),r=t.getElementKeyToQueue(),i=this.getKey(e),a=r[i];null!=a&&(1===a.eles.length?(a.reqs=xt,n.updateItem(a),n.pop(),r[i]=null):a.eles.unmerge(e))},Hh.onDequeue=function(e){this.onDequeues.push(e)},Hh.offDequeue=function(e){Pt(this.onDequeues,e)},Hh.setupDequeueing=Th.setupDequeueing({deqRedrawThreshold:Yh,deqCost:Bh,deqAvgCost:Fh,deqNoDrawCost:zh,deqFastCost:Gh,deq:function(e,t,n){return e.dequeue(t,n)},onDeqd:function(e,t){for(var n=0;n=Kh||n>$h)return null;r.validateLayersElesOrdering(n,e);var o,s,l=r.layersByLevel,u=Math.pow(2,n),c=l[n]=l[n]||[],h=function(){var t=function(t){if(r.validateLayersElesOrdering(t,e),r.levelIsComplete(t,e))return s=l[t],!0},i=function(e){if(!s)for(var r=n+e;Wh<=r&&r<=$h&&!t(r);r+=e);};i(1),i(-1);for(var a=c.length-1;a>=0;a--){var o=c[a];o.invalid&&Pt(c,o)}};if(r.levelIsComplete(n,e))return c;h();var d=function(){if(!o){o=Ln();for(var t=0;tad)return null;var i=r.makeLayer(o,n);if(null!=t){var a=c.indexOf(t)+1;c.splice(a,0,i)}else(void 0===e.insert||e.insert)&&c.unshift(i);return i};if(r.skipping&&!a)return null;for(var g=null,f=e.length/qh,v=!a,y=0;y=f||!Gn(g.bb,m.boundingBox()))&&!(g=p({insert:!0,after:g})))return null;s||v?r.queueLayer(g,m):r.drawEleInLayer(g,m,n,t),g.eles.push(m),x[n]=g}}return s||(v?null:c)},ld.getEleLevelForLayerLevel=function(e,t){return e},ld.drawEleInLayer=function(e,t,n,r){var i=this,a=this.renderer,o=e.context,s=t.boundingBox();0!==s.w&&0!==s.h&&t.visible()&&(n=i.getEleLevelForLayerLevel(n,r),a.setImgSmoothing(o,!1),a.drawCachedElement(o,t,null,null,n,od),a.setImgSmoothing(o,!0))},ld.levelIsComplete=function(e,t){var n=this.layersByLevel[e];if(!n||0===n.length)return!1;for(var r=0,i=0;i0)return!1;if(a.invalid)return!1;r+=a.eles.length}return r===t.length},ld.validateLayersElesOrdering=function(e,t){var n=this.layersByLevel[e];if(n)for(var r=0;r0){t=!0;break}}return t},ld.invalidateElements=function(e){var t=this;0!==e.length&&(t.lastInvalidationTime=rt(),0!==e.length&&t.haveLayers()&&t.updateElementsInLayers(e,(function(e,n,r){t.invalidateLayer(e)})))},ld.invalidateLayer=function(e){if(this.lastInvalidationTime=rt(),!e.invalid){var t=e.level,n=e.eles,r=this.layersByLevel[t];Pt(r,e),e.elesQueue=[],e.invalid=!0,e.replacement&&(e.replacement.invalid=!0);for(var i=0;i3&&void 0!==arguments[3])||arguments[3],i=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],o=this,s=t._private.rscratch;if((!a||t.visible())&&!s.badLine&&null!=s.allpts&&!isNaN(s.allpts[0])){var l;n&&(l=n,e.translate(-l.x1,-l.y1));var u=a?t.pstyle("opacity").value:1,c=a?t.pstyle("line-opacity").value:1,h=t.pstyle("curve-style").value,d=t.pstyle("line-style").value,p=t.pstyle("width").pfValue,g=t.pstyle("line-cap").value,f=u*c,v=u*c,y=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f;"straight-triangle"===h?(o.eleStrokeStyle(e,t,n),o.drawEdgeTrianglePath(t,e,s.allpts)):(e.lineWidth=p,e.lineCap=g,o.eleStrokeStyle(e,t,n),o.drawEdgePath(t,e,s.allpts,d),e.lineCap="butt")},m=function(){i&&o.drawEdgeOverlay(e,t)},b=function(){i&&o.drawEdgeUnderlay(e,t)},x=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v;o.drawArrowheads(e,t,n)},w=function(){o.drawElementText(e,t,null,r)};if(e.lineJoin="round","yes"===t.pstyle("ghost").value){var E=t.pstyle("ghost-offset-x").pfValue,T=t.pstyle("ghost-offset-y").pfValue,_=t.pstyle("ghost-opacity").value,D=f*_;e.translate(E,T),y(D),x(D),e.translate(-E,-T)}b(),y(),x(),m(),w(),n&&e.translate(l.x1,l.y1)}}},Cd=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n){if(n.visible()){var r=n.pstyle("".concat(e,"-opacity")).value;if(0!==r){var i=this,a=i.usePaths(),o=n._private.rscratch,s=2*n.pstyle("".concat(e,"-padding")).pfValue,l=n.pstyle("".concat(e,"-color")).value;t.lineWidth=s,"self"!==o.edgeType||a?t.lineCap="round":t.lineCap="butt",i.colorStrokeStyle(t,l[0],l[1],l[2],r),i.drawEdgePath(n,t,o.allpts,"solid")}}}};Dd.drawEdgeOverlay=Cd("overlay"),Dd.drawEdgeUnderlay=Cd("underlay"),Dd.drawEdgePath=function(e,t,n,r){var i,a=e._private.rscratch,o=t,s=!1,l=this.usePaths(),u=e.pstyle("line-dash-pattern").pfValue,c=e.pstyle("line-dash-offset").pfValue;if(l){var h=n.join("$");a.pathCacheKey&&a.pathCacheKey===h?(i=t=a.pathCache,s=!0):(i=t=new Path2D,a.pathCacheKey=h,a.pathCache=i)}if(o.setLineDash)switch(r){case"dotted":o.setLineDash([1,1]);break;case"dashed":o.setLineDash(u),o.lineDashOffset=c;break;case"solid":o.setLineDash([])}if(!s&&!a.badLine)switch(t.beginPath&&t.beginPath(),t.moveTo(n[0],n[1]),a.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var d=2;d+35&&void 0!==arguments[5]?arguments[5]:5;e.beginPath(),e.moveTo(t+a,n),e.lineTo(t+r-a,n),e.quadraticCurveTo(t+r,n,t+r,n+a),e.lineTo(t+r,n+i-a),e.quadraticCurveTo(t+r,n+i,t+r-a,n+i),e.lineTo(t+a,n+i),e.quadraticCurveTo(t,n+i,t,n+i-a),e.lineTo(t,n+a),e.quadraticCurveTo(t,n,t+a,n),e.closePath(),e.fill()}Ad.eleTextBiggerThanMin=function(e,t){if(!t){var n=e.cy().zoom(),r=this.getPixelRatio(),i=Math.ceil(xn(n*r));t=Math.pow(2,i)}return!(e.pstyle("font-size").pfValue*t5&&void 0!==arguments[5])||arguments[5],o=this;if(null==r){if(a&&!o.eleTextBiggerThanMin(t))return}else if(!1===r)return;if(t.isNode()){var s=t.pstyle("label");if(!s||!s.value)return;var l=o.getLabelJustification(t);e.textAlign=l,e.textBaseline="bottom"}else{var u=t.element()._private.rscratch.badLine,c=t.pstyle("label"),h=t.pstyle("source-label"),d=t.pstyle("target-label");if(u||(!c||!c.value)&&(!h||!h.value)&&(!d||!d.value))return;e.textAlign="center",e.textBaseline="bottom"}var p,g=!n;n&&(p=n,e.translate(-p.x1,-p.y1)),null==i?(o.drawText(e,t,null,g,a),t.isEdge()&&(o.drawText(e,t,"source",g,a),o.drawText(e,t,"target",g,a))):o.drawText(e,t,i,g,a),n&&e.translate(p.x1,p.y1)},Ad.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var n=0;n2&&void 0!==arguments[2])||arguments[2],r=t.pstyle("font-style").strValue,i=t.pstyle("font-size").pfValue+"px",a=t.pstyle("font-family").strValue,o=t.pstyle("font-weight").strValue,s=n?t.effectiveOpacity()*t.pstyle("text-opacity").value:1,l=t.pstyle("text-outline-opacity").value*s,u=t.pstyle("color").value,c=t.pstyle("text-outline-color").value;e.font=r+" "+o+" "+i+" "+a,e.lineJoin="round",this.colorFillStyle(e,u[0],u[1],u[2],s),this.colorStrokeStyle(e,c[0],c[1],c[2],l)},Ad.getTextAngle=function(e,t){var n=e._private.rscratch,r=t?t+"-":"",i=e.pstyle(r+"text-rotation"),a=Ft(n,"labelAngle",t);return"autorotate"===i.strValue?e.isEdge()?a:0:"none"===i.strValue?0:i.pfValue},Ad.drawText=function(e,t,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=t._private.rscratch,o=i?t.effectiveOpacity():1;if(!i||0!==o&&0!==t.pstyle("text-opacity").value){"main"===n&&(n=null);var s,l,u=Ft(a,"labelX",n),c=Ft(a,"labelY",n),h=this.getLabelText(t,n);if(null!=h&&""!==h&&!isNaN(u)&&!isNaN(c)){this.setupTextStyle(e,t,i);var d,p=n?n+"-":"",g=Ft(a,"labelWidth",n),f=Ft(a,"labelHeight",n),v=t.pstyle(p+"text-margin-x").pfValue,y=t.pstyle(p+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle("text-halign").value,x=t.pstyle("text-valign").value;switch(m&&(b="center",x="center"),u+=v,c+=y,0!==(d=r?this.getTextAngle(t,n):0)&&(s=u,l=c,e.translate(s,l),e.rotate(d),u=0,c=0),x){case"top":break;case"center":c+=f/2;break;case"bottom":c+=f}var w=t.pstyle("text-background-opacity").value,E=t.pstyle("text-border-opacity").value,T=t.pstyle("text-border-width").pfValue,_=t.pstyle("text-background-padding").pfValue;if(w>0||T>0&&E>0){var D=u-_;switch(b){case"left":D-=g;break;case"center":D-=g/2}var C=c-f-_,N=g+2*_,A=f+2*_;if(w>0){var L=e.fillStyle,S=t.pstyle("text-background-color").value;e.fillStyle="rgba("+S[0]+","+S[1]+","+S[2]+","+w*o+")",0===t.pstyle("text-background-shape").strValue.indexOf("round")?Ld(e,D,C,N,A,2):e.fillRect(D,C,N,A),e.fillStyle=L}if(T>0&&E>0){var O=e.strokeStyle,I=e.lineWidth,k=t.pstyle("text-border-color").value,M=t.pstyle("text-border-style").value;if(e.strokeStyle="rgba("+k[0]+","+k[1]+","+k[2]+","+E*o+")",e.lineWidth=T,e.setLineDash)switch(M){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"double":e.lineWidth=T/4,e.setLineDash([]);break;case"solid":e.setLineDash([])}if(e.strokeRect(D,C,N,A),"double"===M){var P=T/2;e.strokeRect(D+P,C+P,N-2*P,A-2*P)}e.setLineDash&&e.setLineDash([]),e.lineWidth=I,e.strokeStyle=O}}var R=2*t.pstyle("text-outline-width").pfValue;if(R>0&&(e.lineWidth=R),"wrap"===t.pstyle("text-wrap").value){var B=Ft(a,"labelWrapCachedLines",n),F=Ft(a,"labelLineHeight",n),z=g/2,G=this.getLabelJustification(t);switch("auto"===G||("left"===b?"left"===G?u+=-g:"center"===G&&(u+=-z):"center"===b?"left"===G?u+=-z:"right"===G&&(u+=z):"right"===b&&("center"===G?u+=z:"right"===G&&(u+=g))),x){case"top":case"center":case"bottom":c-=(B.length-1)*F}for(var Y=0;Y0&&e.strokeText(B[Y],u,c),e.fillText(B[Y],u,c),c+=F}else R>0&&e.strokeText(h,u,c),e.fillText(h,u,c);0!==d&&(e.rotate(-d),e.translate(-s,-l))}}};var Sd={drawNode:function(e,t,n){var r,i,a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],l=this,u=t._private,c=u.rscratch,h=t.position();if(_(h.x)&&_(h.y)&&(!s||t.visible())){var d,p,g=s?t.effectiveOpacity():1,f=l.usePaths(),v=!1,y=t.padding();r=t.width()+2*y,i=t.height()+2*y,n&&(p=n,e.translate(-p.x1,-p.y1));for(var m=t.pstyle("background-image").value,b=new Array(m.length),x=new Array(m.length),w=0,E=0;E0&&void 0!==arguments[0]?arguments[0]:A;l.eleFillStyle(e,t,n)},k=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:O;l.colorStrokeStyle(e,L[0],L[1],L[2],t)},M=t.pstyle("shape").strValue,P=t.pstyle("shape-polygon-points").pfValue;if(f){e.translate(h.x,h.y);var R=l.nodePathCache=l.nodePathCache||[],B=ft("polygon"===M?M+","+P.join(","):M,""+i,""+r),F=R[B];null!=F?(d=F,v=!0,c.pathCache=d):(d=new Path2D,R[B]=c.pathCache=d)}var z=function(){if(!v){var n=h;f&&(n={x:0,y:0}),l.nodeShapes[l.getNodeShape(t)].draw(d||e,n.x,n.y,r,i)}f?e.fill(d):e.fill()},G=function(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:g,r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=u.backgrounding,a=0,o=0;o0&&void 0!==arguments[0]&&arguments[0],a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g;l.hasPie(t)&&(l.drawPie(e,t,a),n&&(f||l.nodeShapes[l.getNodeShape(t)].draw(e,h.x,h.y,r,i)))},X=function(){var t=(C>0?C:-C)*(arguments.length>0&&void 0!==arguments[0]?arguments[0]:g),n=C>0?0:255;0!==C&&(l.colorFillStyle(e,n,n,n,t),f?e.fill(d):e.fill())},V=function(){if(N>0){if(e.lineWidth=N,e.lineCap="butt",e.setLineDash)switch(S){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}if(f?e.stroke(d):e.stroke(),"double"===S){e.lineWidth=N/3;var t=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",f?e.stroke(d):e.stroke(),e.globalCompositeOperation=t}e.setLineDash&&e.setLineDash([])}},U=function(){o&&l.drawNodeOverlay(e,t,h,r,i)},j=function(){o&&l.drawNodeUnderlay(e,t,h,r,i)},H=function(){l.drawElementText(e,t,null,a)};if("yes"===t.pstyle("ghost").value){var q=t.pstyle("ghost-offset-x").pfValue,W=t.pstyle("ghost-offset-y").pfValue,$=t.pstyle("ghost-opacity").value,K=$*g;e.translate(q,W),I($*A),z(),G(K,!0),k($*O),V(),Y(0!==C||0!==N),G(K,!1),X(K),e.translate(-q,-W)}f&&e.translate(-h.x,-h.y),j(),f&&e.translate(h.x,h.y),I(),z(),G(g,!0),k(),V(),Y(0!==C||0!==N),G(g,!1),X(),f&&e.translate(-h.x,-h.y),H(),U(),n&&e.translate(p.x1,p.y1)}}},Od=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n,r,i,a){var o=this;if(n.visible()){var s=n.pstyle("".concat(e,"-padding")).pfValue,l=n.pstyle("".concat(e,"-opacity")).value,u=n.pstyle("".concat(e,"-color")).value,c=n.pstyle("".concat(e,"-shape")).value;if(l>0){if(r=r||n.position(),null==i||null==a){var h=n.padding();i=n.width()+2*h,a=n.height()+2*h}o.colorFillStyle(t,u[0],u[1],u[2],l),o.nodeShapes[c].draw(t,r.x,r.y,i+2*s,a+2*s),t.fill()}}}};Sd.drawNodeOverlay=Od("overlay"),Sd.drawNodeUnderlay=Od("underlay"),Sd.hasPie=function(e){return(e=e[0])._private.hasPie},Sd.drawPie=function(e,t,n,r){t=t[0],r=r||t.position();var i=t.cy().style(),a=t.pstyle("pie-size"),o=r.x,s=r.y,l=t.width(),u=t.height(),c=Math.min(l,u)/2,h=0;this.usePaths()&&(o=0,s=0),"%"===a.units?c*=a.pfValue:void 0!==a.pfValue&&(c=a.pfValue/2);for(var d=1;d<=i.pieBackgroundN;d++){var p=t.pstyle("pie-"+d+"-background-size").value,g=t.pstyle("pie-"+d+"-background-color").value,f=t.pstyle("pie-"+d+"-background-opacity").value*n,v=p/100;v+h>1&&(v=1-h);var y=1.5*Math.PI+2*Math.PI*h,m=y+2*Math.PI*v;0===p||h>=1||h+v>1||(e.beginPath(),e.moveTo(o,s),e.arc(o,s,c,y,m),e.closePath(),this.colorFillStyle(e,g[0],g[1],g[2],f),e.fill(),h+=v)}};var Id={},kd=100;Id.getPixelRatio=function(){var e=this.data.contexts[0];if(null!=this.forcedPixelRatio)return this.forcedPixelRatio;var t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t},Id.paintCache=function(e){for(var t,n=this.paintCaches=this.paintCaches||[],r=!0,i=0;io.minMbLowQualFrames&&(o.motionBlurPxRatio=o.mbPxRBlurry)),o.clearingMotionBlur&&(o.motionBlurPxRatio=1),o.textureDrawLastFrame&&!h&&(c[o.NODE]=!0,c[o.SELECT_BOX]=!0);var m=l.style(),b=l.zoom(),x=void 0!==i?i:b,w=l.pan(),E={x:w.x,y:w.y},T={zoom:b,pan:{x:w.x,y:w.y}},_=o.prevViewport;void 0===_||T.zoom!==_.zoom||T.pan.x!==_.pan.x||T.pan.y!==_.pan.y||f&&!g||(o.motionBlurPxRatio=1),a&&(E=a),x*=s,E.x*=s,E.y*=s;var D=o.getCachedZSortedEles();function C(e,t,n,r,i){var a=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",o.colorFillStyle(e,255,255,255,o.motionBlurTransparency),e.fillRect(t,n,r,i),e.globalCompositeOperation=a}function N(e,r){var s,l,c,h;o.clearingMotionBlur||e!==u.bufferContexts[o.MOTIONBLUR_BUFFER_NODE]&&e!==u.bufferContexts[o.MOTIONBLUR_BUFFER_DRAG]?(s=E,l=x,c=o.canvasWidth,h=o.canvasHeight):(s={x:w.x*p,y:w.y*p},l=b*p,c=o.canvasWidth*p,h=o.canvasHeight*p),e.setTransform(1,0,0,1,0,0),"motionBlur"===r?C(e,0,0,c,h):t||void 0!==r&&!r||e.clearRect(0,0,c,h),n||(e.translate(s.x,s.y),e.scale(l,l)),a&&e.translate(a.x,a.y),i&&e.scale(i,i)}if(h||(o.textureDrawLastFrame=!1),h){if(o.textureDrawLastFrame=!0,!o.textureCache){o.textureCache={},o.textureCache.bb=l.mutableElements().boundingBox(),o.textureCache.texture=o.data.bufferCanvases[o.TEXTURE_BUFFER];var A=o.data.bufferContexts[o.TEXTURE_BUFFER];A.setTransform(1,0,0,1,0,0),A.clearRect(0,0,o.canvasWidth*o.textureMult,o.canvasHeight*o.textureMult),o.render({forcedContext:A,drawOnlyNodeLayer:!0,forcedPxRatio:s*o.textureMult}),(T=o.textureCache.viewport={zoom:l.zoom(),pan:l.pan(),width:o.canvasWidth,height:o.canvasHeight}).mpan={x:(0-T.pan.x)/T.zoom,y:(0-T.pan.y)/T.zoom}}c[o.DRAG]=!1,c[o.NODE]=!1;var L=u.contexts[o.NODE],S=o.textureCache.texture;T=o.textureCache.viewport,L.setTransform(1,0,0,1,0,0),d?C(L,0,0,T.width,T.height):L.clearRect(0,0,T.width,T.height);var O=m.core("outside-texture-bg-color").value,I=m.core("outside-texture-bg-opacity").value;o.colorFillStyle(L,O[0],O[1],O[2],I),L.fillRect(0,0,T.width,T.height),b=l.zoom(),N(L,!1),L.clearRect(T.mpan.x,T.mpan.y,T.width/T.zoom/s,T.height/T.zoom/s),L.drawImage(S,T.mpan.x,T.mpan.y,T.width/T.zoom/s,T.height/T.zoom/s)}else o.textureOnViewport&&!t&&(o.textureCache=null);var k=l.extent(),M=o.pinching||o.hoverData.dragging||o.swipePanning||o.data.wheelZooming||o.hoverData.draggingEles||o.cy.animated(),P=o.hideEdgesOnViewport&&M,R=[];if(R[o.NODE]=!c[o.NODE]&&d&&!o.clearedForMotionBlur[o.NODE]||o.clearingMotionBlur,R[o.NODE]&&(o.clearedForMotionBlur[o.NODE]=!0),R[o.DRAG]=!c[o.DRAG]&&d&&!o.clearedForMotionBlur[o.DRAG]||o.clearingMotionBlur,R[o.DRAG]&&(o.clearedForMotionBlur[o.DRAG]=!0),c[o.NODE]||n||r||R[o.NODE]){var B=d&&!R[o.NODE]&&1!==p;N(L=t||(B?o.data.bufferContexts[o.MOTIONBLUR_BUFFER_NODE]:u.contexts[o.NODE]),d&&!B?"motionBlur":void 0),P?o.drawCachedNodes(L,D.nondrag,s,k):o.drawLayeredElements(L,D.nondrag,s,k),o.debug&&o.drawDebugPoints(L,D.nondrag),n||d||(c[o.NODE]=!1)}if(!r&&(c[o.DRAG]||n||R[o.DRAG])&&(B=d&&!R[o.DRAG]&&1!==p,N(L=t||(B?o.data.bufferContexts[o.MOTIONBLUR_BUFFER_DRAG]:u.contexts[o.DRAG]),d&&!B?"motionBlur":void 0),P?o.drawCachedNodes(L,D.drag,s,k):o.drawCachedElements(L,D.drag,s,k),o.debug&&o.drawDebugPoints(L,D.drag),n||d||(c[o.DRAG]=!1)),o.showFps||!r&&c[o.SELECT_BOX]&&!n){if(N(L=t||u.contexts[o.SELECT_BOX]),1==o.selection[4]&&(o.hoverData.selecting||o.touchData.selecting)){b=o.cy.zoom();var F=m.core("selection-box-border-width").value/b;L.lineWidth=F,L.fillStyle="rgba("+m.core("selection-box-color").value[0]+","+m.core("selection-box-color").value[1]+","+m.core("selection-box-color").value[2]+","+m.core("selection-box-opacity").value+")",L.fillRect(o.selection[0],o.selection[1],o.selection[2]-o.selection[0],o.selection[3]-o.selection[1]),F>0&&(L.strokeStyle="rgba("+m.core("selection-box-border-color").value[0]+","+m.core("selection-box-border-color").value[1]+","+m.core("selection-box-border-color").value[2]+","+m.core("selection-box-opacity").value+")",L.strokeRect(o.selection[0],o.selection[1],o.selection[2]-o.selection[0],o.selection[3]-o.selection[1]))}if(u.bgActivePosistion&&!o.hoverData.selecting){b=o.cy.zoom();var z=u.bgActivePosistion;L.fillStyle="rgba("+m.core("active-bg-color").value[0]+","+m.core("active-bg-color").value[1]+","+m.core("active-bg-color").value[2]+","+m.core("active-bg-opacity").value+")",L.beginPath(),L.arc(z.x,z.y,m.core("active-bg-size").pfValue/b,0,2*Math.PI),L.fill()}var G=o.lastRedrawTime;if(o.showFps&&G){G=Math.round(G);var Y=Math.round(1e3/G);L.setTransform(1,0,0,1,0,0),L.fillStyle="rgba(255, 0, 0, 0.75)",L.strokeStyle="rgba(255, 0, 0, 0.75)",L.lineWidth=1,L.fillText("1 frame = "+G+" ms = "+Y+" fps",0,20);var X=60;L.strokeRect(0,30,250,20),L.fillRect(0,30,250*Math.min(Y/X,1),20)}n||(c[o.SELECT_BOX]=!1)}if(d&&1!==p){var V=u.contexts[o.NODE],U=o.data.bufferCanvases[o.MOTIONBLUR_BUFFER_NODE],j=u.contexts[o.DRAG],H=o.data.bufferCanvases[o.MOTIONBLUR_BUFFER_DRAG],q=function(e,t,n){e.setTransform(1,0,0,1,0,0),n||!y?e.clearRect(0,0,o.canvasWidth,o.canvasHeight):C(e,0,0,o.canvasWidth,o.canvasHeight);var r=p;e.drawImage(t,0,0,o.canvasWidth*r,o.canvasHeight*r,0,0,o.canvasWidth,o.canvasHeight)};(c[o.NODE]||R[o.NODE])&&(q(V,U,R[o.NODE]),c[o.NODE]=!1),(c[o.DRAG]||R[o.DRAG])&&(q(j,H,R[o.DRAG]),c[o.DRAG]=!1)}o.prevViewport=T,o.clearingMotionBlur&&(o.clearingMotionBlur=!1,o.motionBlurCleared=!0,o.motionBlur=!0),d&&(o.motionBlurTimeout=setTimeout((function(){o.motionBlurTimeout=null,o.clearedForMotionBlur[o.NODE]=!1,o.clearedForMotionBlur[o.DRAG]=!1,o.motionBlur=!1,o.clearingMotionBlur=!h,o.mbFrames=0,c[o.NODE]=!0,c[o.DRAG]=!0,o.redraw()}),kd)),t||l.emit("render")};for(var Md={drawPolygonPath:function(e,t,n,r,i,a){var o=r/2,s=i/2;e.beginPath&&e.beginPath(),e.moveTo(t+o*a[0],n+s*a[1]);for(var l=1;l0&&a>0){d.clearRect(0,0,i,a),d.globalCompositeOperation="source-over";var p=this.getCachedZSortedEles();if(e.full)d.translate(-n.x1*l,-n.y1*l),d.scale(l,l),this.drawElements(d,p),d.scale(1/l,1/l),d.translate(n.x1*l,n.y1*l);else{var g=t.pan(),f={x:g.x*l,y:g.y*l};l*=t.zoom(),d.translate(f.x,f.y),d.scale(l,l),this.drawElements(d,p),d.scale(1/l,1/l),d.translate(-f.x,-f.y)}e.bg&&(d.globalCompositeOperation="destination-over",d.fillStyle=e.bg,d.rect(0,0,i,a),d.fill())}return h},Yd.png=function(e){return Ud(e,this.bufferCanvasImage(e),"image/png")},Yd.jpg=function(e){return Ud(e,this.bufferCanvasImage(e),"image/jpeg")};var jd={nodeShapeImpl:function(e,t,n,r,i,a,o){switch(e){case"ellipse":return this.drawEllipsePath(t,n,r,i,a);case"polygon":return this.drawPolygonPath(t,n,r,i,a,o);case"round-polygon":return this.drawRoundPolygonPath(t,n,r,i,a,o);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(t,n,r,i,a);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(t,n,r,i,a);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(t,n,r,i,a);case"barrel":return this.drawBarrelPath(t,n,r,i,a)}}},Hd=Wd,qd=Wd.prototype;function Wd(e){var t=this;t.data={canvases:new Array(qd.CANVAS_LAYERS),contexts:new Array(qd.CANVAS_LAYERS),canvasNeedsRedraw:new Array(qd.CANVAS_LAYERS),bufferCanvases:new Array(qd.BUFFER_COUNT),bufferContexts:new Array(qd.CANVAS_LAYERS)};var n="-webkit-tap-highlight-color",r="rgba(0,0,0,0)";t.data.canvasContainer=document.createElement("div");var i=t.data.canvasContainer.style;t.data.canvasContainer.style[n]=r,i.position="relative",i.zIndex="0",i.overflow="hidden";var a=e.cy.container();a.appendChild(t.data.canvasContainer),a.style[n]=r;var o={"-webkit-user-select":"none","-moz-user-select":"-moz-none","user-select":"none","-webkit-tap-highlight-color":"rgba(0,0,0,0)","outline-style":"none"};B()&&(o["-ms-touch-action"]="none",o["touch-action"]="none");for(var s=0;st&&(this.rect.x-=(this.labelWidth-t)/2,this.setWidth(this.labelWidth)),this.labelHeight>n&&("center"==this.labelPos?this.rect.y-=(this.labelHeight-n)/2:"top"==this.labelPos&&(this.rect.y-=this.labelHeight-n),this.setHeight(this.labelHeight))}}},u.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},u.prototype.transform=function(e){var t=this.rect.x;t>o.WORLD_BOUNDARY?t=o.WORLD_BOUNDARY:t<-o.WORLD_BOUNDARY&&(t=-o.WORLD_BOUNDARY);var n=this.rect.y;n>o.WORLD_BOUNDARY?n=o.WORLD_BOUNDARY:n<-o.WORLD_BOUNDARY&&(n=-o.WORLD_BOUNDARY);var r=new l(t,n),i=e.inverseTransformPoint(r);this.setLocation(i.x,i.y)},u.prototype.getLeft=function(){return this.rect.x},u.prototype.getRight=function(){return this.rect.x+this.rect.width},u.prototype.getTop=function(){return this.rect.y},u.prototype.getBottom=function(){return this.rect.y+this.rect.height},u.prototype.getParent=function(){return null==this.owner?null:this.owner.getParent()},e.exports=u},function(e,t,n){"use strict";function r(e,t){null==e&&null==t?(this.x=0,this.y=0):(this.x=e,this.y=t)}r.prototype.getX=function(){return this.x},r.prototype.getY=function(){return this.y},r.prototype.setX=function(e){this.x=e},r.prototype.setY=function(e){this.y=e},r.prototype.getDifference=function(e){return new DimensionD(this.x-e.x,this.y-e.y)},r.prototype.getCopy=function(){return new r(this.x,this.y)},r.prototype.translate=function(e){return this.x+=e.width,this.y+=e.height,this},e.exports=r},function(e,t,n){"use strict";var r=n(2),i=n(10),a=n(0),o=n(6),s=n(3),l=n(1),u=n(13),c=n(12),h=n(11);function d(e,t,n){r.call(this,n),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=e,null!=t&&t instanceof o?this.graphManager=t:null!=t&&t instanceof Layout&&(this.graphManager=t.graphManager)}for(var p in d.prototype=Object.create(r.prototype),r)d[p]=r[p];d.prototype.getNodes=function(){return this.nodes},d.prototype.getEdges=function(){return this.edges},d.prototype.getGraphManager=function(){return this.graphManager},d.prototype.getParent=function(){return this.parent},d.prototype.getLeft=function(){return this.left},d.prototype.getRight=function(){return this.right},d.prototype.getTop=function(){return this.top},d.prototype.getBottom=function(){return this.bottom},d.prototype.isConnected=function(){return this.isConnected},d.prototype.add=function(e,t,n){if(null==t&&null==n){var r=e;if(null==this.graphManager)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(r)>-1)throw"Node already in graph!";return r.owner=this,this.getNodes().push(r),r}var i=e;if(!(this.getNodes().indexOf(t)>-1&&this.getNodes().indexOf(n)>-1))throw"Source or target not in graph!";if(t.owner!=n.owner||t.owner!=this)throw"Both owners must be this graph!";return t.owner!=n.owner?null:(i.source=t,i.target=n,i.isInterGraph=!1,this.getEdges().push(i),t.edges.push(i),n!=t&&n.edges.push(i),i)},d.prototype.remove=function(e){var t=e;if(e instanceof s){if(null==t)throw"Node is null!";if(null==t.owner||t.owner!=this)throw"Owner graph is invalid!";if(null==this.graphManager)throw"Owner graph manager is invalid!";for(var n=t.edges.slice(),r=n.length,i=0;i-1&&c>-1))throw"Source and/or target doesn't know this edge!";if(a.source.edges.splice(u,1),a.target!=a.source&&a.target.edges.splice(c,1),-1==(o=a.source.owner.getEdges().indexOf(a)))throw"Not in owner's edge list!";a.source.owner.getEdges().splice(o,1)}},d.prototype.updateLeftTop=function(){for(var e,t,n,r=i.MAX_VALUE,a=i.MAX_VALUE,o=this.getNodes(),s=o.length,l=0;l(e=u.getTop())&&(r=e),a>(t=u.getLeft())&&(a=t)}return r==i.MAX_VALUE?null:(n=null!=o[0].getParent().paddingLeft?o[0].getParent().paddingLeft:this.margin,this.left=a-n,this.top=r-n,new c(this.left,this.top))},d.prototype.updateBounds=function(e){for(var t,n,r,a,o,s=i.MAX_VALUE,l=-i.MAX_VALUE,c=i.MAX_VALUE,h=-i.MAX_VALUE,d=this.nodes,p=d.length,g=0;g(t=f.getLeft())&&(s=t),l<(n=f.getRight())&&(l=n),c>(r=f.getTop())&&(c=r),h<(a=f.getBottom())&&(h=a)}var v=new u(s,c,l-s,h-c);s==i.MAX_VALUE&&(this.left=this.parent.getLeft(),this.right=this.parent.getRight(),this.top=this.parent.getTop(),this.bottom=this.parent.getBottom()),o=null!=d[0].getParent().paddingLeft?d[0].getParent().paddingLeft:this.margin,this.left=v.x-o,this.right=v.x+v.width+o,this.top=v.y-o,this.bottom=v.y+v.height+o},d.calculateBounds=function(e){for(var t,n,r,a,o=i.MAX_VALUE,s=-i.MAX_VALUE,l=i.MAX_VALUE,c=-i.MAX_VALUE,h=e.length,d=0;d(t=p.getLeft())&&(o=t),s<(n=p.getRight())&&(s=n),l>(r=p.getTop())&&(l=r),c<(a=p.getBottom())&&(c=a)}return new u(o,l,s-o,c-l)},d.prototype.getInclusionTreeDepth=function(){return this==this.graphManager.getRoot()?1:this.parent.getInclusionTreeDepth()},d.prototype.getEstimatedSize=function(){if(this.estimatedSize==i.MIN_VALUE)throw"assert failed";return this.estimatedSize},d.prototype.calcEstimatedSize=function(){for(var e=0,t=this.nodes,n=t.length,r=0;r=this.nodes.length){var l=0;i.forEach((function(t){t.owner==e&&l++})),l==this.nodes.length&&(this.isConnected=!0)}}else this.isConnected=!0},e.exports=d},function(e,t,n){"use strict";var r,i=n(1);function a(e){r=n(5),this.layout=e,this.graphs=[],this.edges=[]}a.prototype.addRoot=function(){var e=this.layout.newGraph(),t=this.layout.newNode(null),n=this.add(e,t);return this.setRootGraph(n),this.rootGraph},a.prototype.add=function(e,t,n,r,i){if(null==n&&null==r&&null==i){if(null==e)throw"Graph is null!";if(null==t)throw"Parent node is null!";if(this.graphs.indexOf(e)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(e),null!=e.parent)throw"Already has a parent!";if(null!=t.child)throw"Already has a child!";return e.parent=t,t.child=e,e}i=n,n=e;var a=(r=t).getOwner(),o=i.getOwner();if(null==a||a.getGraphManager()!=this)throw"Source not in this graph mgr!";if(null==o||o.getGraphManager()!=this)throw"Target not in this graph mgr!";if(a==o)return n.isInterGraph=!1,a.add(n,r,i);if(n.isInterGraph=!0,n.source=r,n.target=i,this.edges.indexOf(n)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(n),null==n.source||null==n.target)throw"Edge source and/or target is null!";if(-1!=n.source.edges.indexOf(n)||-1!=n.target.edges.indexOf(n))throw"Edge already in source and/or target incidency list!";return n.source.edges.push(n),n.target.edges.push(n),n},a.prototype.remove=function(e){if(e instanceof r){var t=e;if(t.getGraphManager()!=this)throw"Graph not in this graph mgr";if(t!=this.rootGraph&&(null==t.parent||t.parent.graphManager!=this))throw"Invalid parent node!";for(var n,a=[],o=(a=a.concat(t.getEdges())).length,s=0;s=t.getRight()?n[0]+=Math.min(t.getX()-e.getX(),e.getRight()-t.getRight()):t.getX()<=e.getX()&&t.getRight()>=e.getRight()&&(n[0]+=Math.min(e.getX()-t.getX(),t.getRight()-e.getRight())),e.getY()<=t.getY()&&e.getBottom()>=t.getBottom()?n[1]+=Math.min(t.getY()-e.getY(),e.getBottom()-t.getBottom()):t.getY()<=e.getY()&&t.getBottom()>=e.getBottom()&&(n[1]+=Math.min(e.getY()-t.getY(),t.getBottom()-e.getBottom()));var a=Math.abs((t.getCenterY()-e.getCenterY())/(t.getCenterX()-e.getCenterX()));t.getCenterY()===e.getCenterY()&&t.getCenterX()===e.getCenterX()&&(a=1);var o=a*n[0],s=n[1]/a;n[0]o)return n[0]=r,n[1]=l,n[2]=a,n[3]=b,!1;if(ia)return n[0]=s,n[1]=i,n[2]=y,n[3]=o,!1;if(ra?(n[0]=c,n[1]=h,T=!0):(n[0]=u,n[1]=l,T=!0):D===N&&(r>a?(n[0]=s,n[1]=l,T=!0):(n[0]=d,n[1]=h,T=!0)),-C===N?a>r?(n[2]=m,n[3]=b,_=!0):(n[2]=y,n[3]=v,_=!0):C===N&&(a>r?(n[2]=f,n[3]=v,_=!0):(n[2]=x,n[3]=b,_=!0)),T&&_)return!1;if(r>a?i>o?(A=this.getCardinalDirection(D,N,4),L=this.getCardinalDirection(C,N,2)):(A=this.getCardinalDirection(-D,N,3),L=this.getCardinalDirection(-C,N,1)):i>o?(A=this.getCardinalDirection(-D,N,1),L=this.getCardinalDirection(-C,N,3)):(A=this.getCardinalDirection(D,N,2),L=this.getCardinalDirection(C,N,4)),!T)switch(A){case 1:O=l,S=r+-g/N,n[0]=S,n[1]=O;break;case 2:S=d,O=i+p*N,n[0]=S,n[1]=O;break;case 3:O=h,S=r+g/N,n[0]=S,n[1]=O;break;case 4:S=c,O=i+-p*N,n[0]=S,n[1]=O}if(!_)switch(L){case 1:k=v,I=a+-E/N,n[2]=I,n[3]=k;break;case 2:I=x,k=o+w*N,n[2]=I,n[3]=k;break;case 3:k=b,I=a+E/N,n[2]=I,n[3]=k;break;case 4:I=m,k=o+-w*N,n[2]=I,n[3]=k}}return!1},i.getCardinalDirection=function(e,t,n){return e>t?n:1+n%4},i.getIntersection=function(e,t,n,i){if(null==i)return this.getIntersection2(e,t,n);var a,o,s,l,u,c,h,d=e.x,p=e.y,g=t.x,f=t.y,v=n.x,y=n.y,m=i.x,b=i.y;return 0==(h=(a=f-p)*(l=v-m)-(o=b-y)*(s=d-g))?null:new r((s*(c=m*y-v*b)-l*(u=g*p-d*f))/h,(o*u-a*c)/h)},i.angleOfVector=function(e,t,n,r){var i=void 0;return e!==n?(i=Math.atan((r-t)/(n-e)),n0?1:e<0?-1:0},r.floor=function(e){return e<0?Math.ceil(e):Math.floor(e)},r.ceil=function(e){return e<0?Math.floor(e):Math.ceil(e)},e.exports=r},function(e,t,n){"use strict";function r(){}r.MAX_VALUE=2147483647,r.MIN_VALUE=-2147483648,e.exports=r},function(e,t,n){"use strict";var r=function(){function e(e,t){for(var n=0;n0&&t;){for(s.push(u[0]);s.length>0&&t;){var c=s[0];s.splice(0,1),o.add(c);var h=c.getEdges();for(a=0;a-1&&u.splice(f,1)}o=new Set,l=new Map}else e=[]}return e},d.prototype.createDummyNodesForBendpoints=function(e){for(var t=[],n=e.source,r=this.graphManager.calcLowestCommonAncestor(e.source,e.target),i=0;i0){for(var i=this.edgeToDummyNodes.get(n),a=0;a=0&&t.splice(h,1),c.getNeighborsList().forEach((function(e){if(n.indexOf(e)<0){var t=r.get(e)-1;1==t&&l.push(e),r.set(e,t)}}))}n=n.concat(l),1!=t.length&&2!=t.length||(i=!0,a=t[0])}return a},d.prototype.setGraphManager=function(e){this.graphManager=e},e.exports=d},function(e,t,n){"use strict";function r(){}r.seed=1,r.x=0,r.nextDouble=function(){return r.x=1e4*Math.sin(r.seed++),r.x-Math.floor(r.x)},e.exports=r},function(e,t,n){"use strict";var r=n(4);function i(e,t){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(e){this.lworldOrgX=e},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(e){this.lworldOrgY=e},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(e){this.lworldExtX=e},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(e){this.lworldExtY=e},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(e){this.ldeviceOrgX=e},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(e){this.ldeviceOrgY=e},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(e){this.ldeviceExtX=e},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(e){this.ldeviceExtY=e},i.prototype.transformX=function(e){var t=0,n=this.lworldExtX;return 0!=n&&(t=this.ldeviceOrgX+(e-this.lworldOrgX)*this.ldeviceExtX/n),t},i.prototype.transformY=function(e){var t=0,n=this.lworldExtY;return 0!=n&&(t=this.ldeviceOrgY+(e-this.lworldOrgY)*this.ldeviceExtY/n),t},i.prototype.inverseTransformX=function(e){var t=0,n=this.ldeviceExtX;return 0!=n&&(t=this.lworldOrgX+(e-this.ldeviceOrgX)*this.lworldExtX/n),t},i.prototype.inverseTransformY=function(e){var t=0,n=this.ldeviceExtY;return 0!=n&&(t=this.lworldOrgY+(e-this.ldeviceOrgY)*this.lworldExtY/n),t},i.prototype.inverseTransformPoint=function(e){return new r(this.inverseTransformX(e.x),this.inverseTransformY(e.y))},e.exports=i},function(e,t,n){"use strict";var r=n(15),i=n(7),a=n(0),o=n(8),s=n(9);function l(){r.call(this),this.useSmartIdealEdgeLengthCalculation=i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.idealEdgeLength=i.DEFAULT_EDGE_LENGTH,this.springConstant=i.DEFAULT_SPRING_STRENGTH,this.repulsionConstant=i.DEFAULT_REPULSION_STRENGTH,this.gravityConstant=i.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=i.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=i.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.displacementThresholdPerNode=3*i.DEFAULT_EDGE_LENGTH/100,this.coolingFactor=i.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.initialCoolingFactor=i.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.totalDisplacement=0,this.oldTotalDisplacement=0,this.maxIterations=i.MAX_ITERATIONS}for(var u in l.prototype=Object.create(r.prototype),r)l[u]=r[u];l.prototype.initParameters=function(){r.prototype.initParameters.call(this,arguments),this.totalIterations=0,this.notAnimatedIterations=0,this.useFRGridVariant=i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION,this.grid=[]},l.prototype.calcIdealEdgeLengths=function(){for(var e,t,n,r,o,s,l=this.getGraphManager().getAllEdges(),u=0;ui.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*i.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(e-i.ADAPTATION_LOWER_NODE_LIMIT)/(i.ADAPTATION_UPPER_NODE_LIMIT-i.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-i.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=i.MAX_NODE_DISPLACEMENT_INCREMENTAL):(e>i.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(i.COOLING_ADAPTATION_FACTOR,1-(e-i.ADAPTATION_LOWER_NODE_LIMIT)/(i.ADAPTATION_UPPER_NODE_LIMIT-i.ADAPTATION_LOWER_NODE_LIMIT)*(1-i.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=i.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(5*this.getAllNodes().length,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},l.prototype.calcSpringForces=function(){for(var e,t=this.getAllEdges(),n=0;n0&&void 0!==arguments[0])||arguments[0],s=arguments.length>1&&void 0!==arguments[1]&&arguments[1],l=this.getAllNodes();if(this.useFRGridVariant)for(this.totalIterations%i.GRID_CALCULATION_CHECK_PERIOD==1&&o&&this.updateGrid(),a=new Set,e=0;e(l=t.getEstimatedSize()*this.gravityRangeFactor)||s>l)&&(e.gravitationForceX=-this.gravityConstant*i,e.gravitationForceY=-this.gravityConstant*a):(o>(l=t.getEstimatedSize()*this.compoundGravityRangeFactor)||s>l)&&(e.gravitationForceX=-this.gravityConstant*i*this.compoundGravityConstant,e.gravitationForceY=-this.gravityConstant*a*this.compoundGravityConstant)},l.prototype.isConverged=function(){var e,t=!1;return this.totalIterations>this.maxIterations/3&&(t=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),e=this.totalDisplacement=s.length||u>=s[0].length))for(var c=0;ce}}]),e}();e.exports=a},function(e,t,n){"use strict";var r=function(){function e(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:1,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:-1,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.sequence1=t,this.sequence2=n,this.match_score=r,this.mismatch_penalty=i,this.gap_penalty=a,this.iMax=t.length+1,this.jMax=n.length+1,this.grid=new Array(this.iMax);for(var o=0;o=0;n--){var r=this.listeners[n];r.event===e&&r.callback===t&&this.listeners.splice(n,1)}},i.emit=function(e,t){for(var n=0;n{"use strict";n.d(t,{diagram:()=>S});var r=n(6432),i=n(9373),a=n(1377),o=n.n(a),s=n(4607),l=n.n(s),u=n(1619),c=n(5920),h=n(7201),d=(n(7484),n(7967),n(7856),n(277),n(5625),n(9354),n(1518),n(9542),n(285),n(8734),function(){var e=function(e,t,n,r){for(n=n||{},r=e.length;r--;n[e[r]]=t);return n},t=[1,4],n=[1,13],r=[1,12],i=[1,15],a=[1,16],o=[1,20],s=[1,19],l=[6,7,8],u=[1,26],c=[1,24],h=[1,25],d=[6,7,11],p=[1,6,13,15,16,19,22],g=[1,33],f=[1,34],v=[1,6,7,11,13,15,16,19,22],y={trace:function(){},yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:function(e,t,n,r,i,a,o){var s=a.length-1;switch(i){case 6:case 7:return r;case 8:r.getLogger().trace("Stop NL ");break;case 9:r.getLogger().trace("Stop EOF ");break;case 11:r.getLogger().trace("Stop NL2 ");break;case 12:r.getLogger().trace("Stop EOF2 ");break;case 15:r.getLogger().info("Node: ",a[s].id),r.addNode(a[s-1].length,a[s].id,a[s].descr,a[s].type);break;case 16:r.getLogger().trace("Icon: ",a[s]),r.decorateNode({icon:a[s]});break;case 17:case 21:r.decorateNode({class:a[s]});break;case 18:r.getLogger().trace("SPACELIST");break;case 19:r.getLogger().trace("Node: ",a[s].id),r.addNode(0,a[s].id,a[s].descr,a[s].type);break;case 20:r.decorateNode({icon:a[s]});break;case 25:r.getLogger().trace("node found ..",a[s-2]),this.$={id:a[s-1],descr:a[s-1],type:r.getType(a[s-2],a[s])};break;case 26:this.$={id:a[s],descr:a[s],type:r.nodeType.DEFAULT};break;case 27:r.getLogger().trace("node found ..",a[s-3]),this.$={id:a[s-3],descr:a[s-1],type:r.getType(a[s-2],a[s])}}},table:[{3:1,4:2,5:3,6:[1,5],8:t},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:t},{6:n,7:[1,10],9:9,12:11,13:r,14:14,15:i,16:a,17:17,18:18,19:o,22:s},e(l,[2,3]),{1:[2,2]},e(l,[2,4]),e(l,[2,5]),{1:[2,6],6:n,12:21,13:r,14:14,15:i,16:a,17:17,18:18,19:o,22:s},{6:n,9:22,12:11,13:r,14:14,15:i,16:a,17:17,18:18,19:o,22:s},{6:u,7:c,10:23,11:h},e(d,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:o,22:s}),e(d,[2,18]),e(d,[2,19]),e(d,[2,20]),e(d,[2,21]),e(d,[2,23]),e(d,[2,24]),e(d,[2,26],{19:[1,30]}),{20:[1,31]},{6:u,7:c,10:32,11:h},{1:[2,7],6:n,12:21,13:r,14:14,15:i,16:a,17:17,18:18,19:o,22:s},e(p,[2,14],{7:g,11:f}),e(v,[2,8]),e(v,[2,9]),e(v,[2,10]),e(d,[2,15]),e(d,[2,16]),e(d,[2,17]),{20:[1,35]},{21:[1,36]},e(p,[2,13],{7:g,11:f}),e(v,[2,11]),e(v,[2,12]),{21:[1,37]},e(d,[2,25]),e(d,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:function(e,t){if(!t.recoverable){var n=new Error(e);throw n.hash=t,n}this.trace(e)},parse:function(e){var t=this,n=[0],r=[],i=[null],a=[],o=this.table,s="",l=0,u=0,c=a.slice.call(arguments,1),h=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);h.setInput(e,d.yy),d.yy.lexer=h,d.yy.parser=this,void 0===h.yylloc&&(h.yylloc={});var g=h.yylloc;a.push(g);var f=h.options&&h.options.ranges;"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var v,y,m,b,x,w,E,T,_,D={};;){if(y=n[n.length-1],this.defaultActions[y]?m=this.defaultActions[y]:(null==v&&(_=void 0,"number"!=typeof(_=r.pop()||h.lex()||1)&&(_ instanceof Array&&(_=(r=_).pop()),_=t.symbols_[_]||_),v=_),m=o[y]&&o[y][v]),void 0===m||!m.length||!m[0]){var C="";for(x in T=[],o[y])this.terminals_[x]&&x>2&&T.push("'"+this.terminals_[x]+"'");C=h.showPosition?"Parse error on line "+(l+1)+":\n"+h.showPosition()+"\nExpecting "+T.join(", ")+", got '"+(this.terminals_[v]||v)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==v?"end of input":"'"+(this.terminals_[v]||v)+"'"),this.parseError(C,{text:h.match,token:this.terminals_[v]||v,line:h.yylineno,loc:g,expected:T})}if(m[0]instanceof Array&&m.length>1)throw new Error("Parse Error: multiple actions possible at state: "+y+", token: "+v);switch(m[0]){case 1:n.push(v),i.push(h.yytext),a.push(h.yylloc),n.push(m[1]),v=null,u=h.yyleng,s=h.yytext,l=h.yylineno,g=h.yylloc;break;case 2:if(w=this.productions_[m[1]][1],D.$=i[i.length-w],D._$={first_line:a[a.length-(w||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(w||1)].first_column,last_column:a[a.length-1].last_column},f&&(D._$.range=[a[a.length-(w||1)].range[0],a[a.length-1].range[1]]),void 0!==(b=this.performAction.apply(D,[s,u,l,d.yy,m[1],i,a].concat(c))))return b;w&&(n=n.slice(0,-1*w*2),i=i.slice(0,-1*w),a=a.slice(0,-1*w)),n.push(this.productions_[m[1]][0]),i.push(D.$),a.push(D._$),E=o[n[n.length-2]][n[n.length-1]],n.push(E);break;case 3:return!0}}return!0}},m={EOF:1,parseError:function(e,t){if(!this.yy.parser)throw new Error(e);this.yy.parser.parseError(e,t)},setInput:function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},unput:function(e){var t=e.length,n=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(e){this.unput(this.match.slice(e))},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},test_match:function(e,t){var n,r,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(r=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],n=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in i)this[a]=i[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var e,t,n,r;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),a=0;at[0].length)){if(t=n,r=a,this.options.backtrack_lexer){if(!1!==(e=this.test_match(n,i[a])))return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?!1!==(e=this.test_match(t,i[r]))&&e:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var e=this.next();return e||this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(e){return(e=this.conditionStack.length-1-Math.abs(e||0))>=0?this.conditionStack[e]:"INITIAL"},pushState:function(e){this.begin(e)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(e,t,n,r){switch(n){case 0:e.getLogger().trace("Found comment",t.yytext);break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;case 4:case 23:this.popState();break;case 5:e.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return e.getLogger().trace("SPACELINE"),6;case 7:return 7;case 8:return 15;case 9:e.getLogger().trace("end icon"),this.popState();break;case 10:return e.getLogger().trace("Exploding node"),this.begin("NODE"),19;case 11:return e.getLogger().trace("Cloud"),this.begin("NODE"),19;case 12:return e.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;case 13:return e.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;case 14:case 15:case 16:case 17:return this.begin("NODE"),19;case 18:return 13;case 19:return 22;case 20:return 11;case 21:e.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 22:return e.getLogger().trace("description:",t.yytext),"NODE_DESCR";case 24:return this.popState(),e.getLogger().trace("node end ))"),"NODE_DEND";case 25:return this.popState(),e.getLogger().trace("node end )"),"NODE_DEND";case 26:return this.popState(),e.getLogger().trace("node end ...",t.yytext),"NODE_DEND";case 27:case 30:case 31:return this.popState(),e.getLogger().trace("node end (("),"NODE_DEND";case 28:case 29:return this.popState(),e.getLogger().trace("node end (-"),"NODE_DEND";case 32:case 33:return e.getLogger().trace("Long description:",t.yytext),20}},rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\-\)\{\}]+)/i,/^(?:$)/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR:{rules:[22,23],inclusive:!1},NODE:{rules:[21,24,25,26,27,28,29,30,31,32,33],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};function b(){this.yy={}}return y.lexer=m,b.prototype=y,y.Parser=b,new b}());d.parser=d;const p=d,g=e=>(0,r.n)(e,(0,r.g)());let f=[],v=0,y={};const m={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},b=(e,t)=>{y[e]=t},x=e=>{switch(e){case m.DEFAULT:return"no-border";case m.RECT:return"rect";case m.ROUNDED_RECT:return"rounded-rect";case m.CIRCLE:return"circle";case m.CLOUD:return"cloud";case m.BANG:return"bang";case m.HEXAGON:return"hexgon";default:return"no-border"}};let w;const E=e=>y[e],T=Object.freeze(Object.defineProperty({__proto__:null,addNode:(e,t,n,i)=>{r.l.info("addNode",e,t,n,i);const a=(0,r.g)(),o={id:v++,nodeId:g(t),level:e,descr:g(n),type:i,children:[],width:(0,r.g)().mindmap.maxNodeWidth};switch(o.type){case m.ROUNDED_RECT:case m.RECT:case m.HEXAGON:o.padding=2*a.mindmap.padding;break;default:o.padding=a.mindmap.padding}const s=function(e){for(let t=f.length-1;t>=0;t--)if(f[t].level{f=[],v=0,y={}},decorateNode:e=>{const t=f[f.length-1];e&&e.icon&&(t.icon=g(e.icon)),e&&e.class&&(t.class=g(e.class))},getElementById:E,getLogger:()=>r.l,getMindmap:()=>f.length>0?f[0]:null,getNodeById:e=>f[e],getType:(e,t)=>{switch(r.l.debug("In get type",e,t),e){case"[":return m.RECT;case"(":return")"===t?m.ROUNDED_RECT:m.CLOUD;case"((":return m.CIRCLE;case")":return m.CLOUD;case"))":return m.BANG;case"{{":return m.HEXAGON;default:return m.DEFAULT}},nodeType:m,get parseError(){return w},sanitizeText:g,setElementForId:b,setErrorHandler:e=>{w=e},type2Str:x},Symbol.toStringTag,{value:"Module"}));function _(e,t){e.each((function(){var e,n=(0,i.Ys)(this),r=n.text().split(/(\s+|
)/).reverse(),a=[],o=n.attr("y"),s=parseFloat(n.attr("dy")),l=n.text(null).append("tspan").attr("x",0).attr("y",o).attr("dy",s+"em");for(let i=0;it||"
"===e)&&(a.pop(),l.text(a.join(" ").trim()),a="
"===e?[""]:[e],l=n.append("tspan").attr("x",0).attr("y",o).attr("dy","1.1em").text(e))}))}const D=function(e,t,n,r){const i=n%11,a=e.append("g");t.section=i;let o="section-"+i;i<0&&(o+=" section-root"),a.attr("class",(t.class?t.class+" ":"")+"mindmap-node "+o);const s=a.append("g"),l=a.append("g"),u=l.append("text").text(t.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(_,t.width).node().getBBox(),c=r.fontSize.replace?r.fontSize.replace("px",""):r.fontSize;if(t.height=u.height+1.1*c*.5+t.padding,t.width=u.width+2*t.padding,t.icon)if(t.type===m.CIRCLE){t.height+=50,t.width+=50;a.append("foreignObject").attr("height","50px").attr("width",t.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+i+" "+t.icon),l.attr("transform","translate("+t.width/2+", "+(t.height/2-1.5*t.padding)+")")}else{t.width+=50;const e=t.height;t.height=Math.max(e,60);const n=Math.abs(t.height-e);a.append("foreignObject").attr("width","60px").attr("height",t.height).attr("style","text-align: center;margin-top:"+n/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+i+" "+t.icon),l.attr("transform","translate("+(25+t.width/2)+", "+(n/2+t.padding/2)+")")}else l.attr("transform","translate("+t.width/2+", "+t.padding/2+")");switch(t.type){case m.DEFAULT:!function(e,t,n){e.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("d",`M0 ${t.height-5} v${10-t.height} q0,-5 5,-5 h${t.width-10} q5,0 5,5 v${t.height-5} H0 Z`),e.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",t.height).attr("x2",t.width).attr("y2",t.height)}(s,t,i);break;case m.ROUNDED_RECT:!function(e,t){e.append("rect").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("height",t.height).attr("rx",t.padding).attr("ry",t.padding).attr("width",t.width)}(s,t);break;case m.RECT:!function(e,t){e.append("rect").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("height",t.height).attr("width",t.width)}(s,t);break;case m.CIRCLE:s.attr("transform","translate("+t.width/2+", "+ +t.height/2+")"),function(e,t){e.append("circle").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("r",t.width/2)}(s,t);break;case m.CLOUD:!function(e,t){const n=t.width,r=t.height,i=.15*n,a=.25*n,o=.35*n,s=.2*n;e.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("d",`M0 0 a${i},${i} 0 0,1 ${.25*n},${-1*n*.1}\n a${o},${o} 1 0,1 ${.4*n},${-1*n*.1}\n a${a},${a} 1 0,1 ${.35*n},${1*n*.2}\n\n a${i},${i} 1 0,1 ${.15*n},${1*r*.35}\n a${s},${s} 1 0,1 ${-1*n*.15},${1*r*.65}\n\n a${a},${i} 1 0,1 ${-1*n*.25},${.15*n}\n a${o},${o} 1 0,1 ${-1*n*.5},0\n a${i},${i} 1 0,1 ${-1*n*.25},${-1*n*.15}\n\n a${i},${i} 1 0,1 ${-1*n*.1},${-1*r*.35}\n a${s},${s} 1 0,1 ${.1*n},${-1*r*.65}\n\n H0 V0 Z`)}(s,t);break;case m.BANG:!function(e,t){const n=t.width,r=t.height,i=.15*n;e.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+x(t.type)).attr("d",`M0 0 a${i},${i} 1 0,0 ${.25*n},${-1*r*.1}\n a${i},${i} 1 0,0 ${.25*n},0\n a${i},${i} 1 0,0 ${.25*n},0\n a${i},${i} 1 0,0 ${.25*n},${1*r*.1}\n\n a${i},${i} 1 0,0 ${.15*n},${1*r*.33}\n a${.8*i},${.8*i} 1 0,0 0,${1*r*.34}\n a${i},${i} 1 0,0 ${-1*n*.15},${1*r*.33}\n\n a${i},${i} 1 0,0 ${-1*n*.25},${.15*r}\n a${i},${i} 1 0,0 ${-1*n*.25},0\n a${i},${i} 1 0,0 ${-1*n*.25},0\n a${i},${i} 1 0,0 ${-1*n*.25},${-1*r*.15}\n\n a${i},${i} 1 0,0 ${-1*n*.1},${-1*r*.33}\n a${.8*i},${.8*i} 1 0,0 0,${-1*r*.34}\n a${i},${i} 1 0,0 ${.1*n},${-1*r*.33}\n\n H0 V0 Z`)}(s,t);break;case m.HEXAGON:!function(e,t){const n=t.height,r=n/4,i=t.width-t.padding+2*r;!function(e,t,n,r,i){e.insert("polygon",":first-child").attr("points",r.map((function(e){return e.x+","+e.y})).join(" ")).attr("transform","translate("+(i.width-t)/2+", "+n+")")}(e,i,n,[{x:r,y:0},{x:i-r,y:0},{x:i,y:-n/2},{x:i-r,y:-n},{x:r,y:-n},{x:0,y:-n/2}],t)}(s,t)}return b(t.id,a),t.height},C=function(e){const t=E(e.id),n=e.x||0,r=e.y||0;t.attr("transform","translate("+n+","+r+")")};function N(e,t,n,r){D(e,t,n,r),t.children&&t.children.forEach(((t,i)=>{N(e,t,n<0?i:n,r)}))}function A(e,t,n,r){t.add({group:"nodes",data:{id:e.id,labelText:e.descr,height:e.height,width:e.width,level:r,nodeId:e.id,padding:e.padding,type:e.type},position:{x:e.x,y:e.y}}),e.children&&e.children.forEach((i=>{A(i,t,n,r+1),t.add({group:"edges",data:{id:`${e.id}_${i.id}`,source:e.id,target:i.id,depth:r,section:i.section}})}))}function L(e,t){return new Promise((n=>{const a=(0,i.Ys)("body").append("div").attr("id","cy").attr("style","display:none"),s=o()({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});a.remove(),A(e,s,t,0),s.nodes().forEach((function(e){e.layoutDimensions=()=>{const t=e.data();return{w:t.width,h:t.height}}})),s.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),s.ready((e=>{r.l.info("Ready",e),n(s)}))}))}o().use(l());const S={db:T,renderer:{draw:async(e,t,n,a)=>{const o=(0,r.g)();a.db.clear(),a.parser.parse(e),r.l.debug("Renering info diagram\n"+e);const s=(0,r.g)().securityLevel;let l;"sandbox"===s&&(l=(0,i.Ys)("#i"+t));const u=("sandbox"===s?(0,i.Ys)(l.nodes()[0].contentDocument.body):(0,i.Ys)("body")).select("#"+t);u.append("g");const c=a.db.getMindmap(),h=u.append("g");h.attr("class","mindmap-edges");const d=u.append("g");d.attr("class","mindmap-nodes"),N(d,c,-1,o);const p=await L(c,o);!function(e,t){t.edges().map(((t,n)=>{const i=t.data();if(t[0]._private.bodyBounds){const a=t[0]._private.rscratch;r.l.trace("Edge: ",n,i),e.insert("path").attr("d",`M ${a.startX},${a.startY} L ${a.midX},${a.midY} L${a.endX},${a.endY} `).attr("class","edge section-edge-"+i.section+" edge-depth-"+i.depth)}}))}(h,p),function(e){e.nodes().map(((e,t)=>{const n=e.data();n.x=e.position().x,n.y=e.position().y,C(n);const i=E(n.nodeId);r.l.info("Id:",t,"Position: (",e.position().x,", ",e.position().y,")",n),i.attr("transform",`translate(${e.position().x-n.width/2}, ${e.position().y-n.height/2})`),i.attr("attr",`apa-${t})`)}))}(p),(0,r.s)(void 0,u,o.mindmap.padding,o.mindmap.useMaxWidth)}},parser:p,styles:e=>`\n .edge {\n stroke-width: 3;\n }\n ${(e=>{let t="";for(let n=0;n{"use strict";n.d(t,{Z:()=>s});var r=n(1691),i=n(1610);const a=e=>{const{r:t,g:n,b:a}=i.Z.parse(e),o=.2126*r.Z.channel.toLinear(t)+.7152*r.Z.channel.toLinear(n)+.0722*r.Z.channel.toLinear(a);return r.Z.lang.round(o)},o=e=>a(e)>=.5,s=e=>!o(e)}}]); \ No newline at end of file diff --git a/assets/js/7724.0fff5da7.js.LICENSE.txt b/assets/js/7724.0fff5da7.js.LICENSE.txt new file mode 100644 index 0000000..a58daed --- /dev/null +++ b/assets/js/7724.0fff5da7.js.LICENSE.txt @@ -0,0 +1,9 @@ +/*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + */ + +/*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */ + +/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */ diff --git a/assets/js/788cc978.4f78c34d.js b/assets/js/788cc978.4f78c34d.js new file mode 100644 index 0000000..56b6c68 --- /dev/null +++ b/assets/js/788cc978.4f78c34d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9157],{3905:(e,a,t)=>{t.d(a,{Zo:()=>o,kt:()=>h});var n=t(7294);function m(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function s(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function r(e){for(var a=1;a=0||(m[t]=e[t]);return m}(e,a);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(m[t]=e[t])}return m}var i=n.createContext({}),l=function(e){var a=n.useContext(i),t=a;return e&&(t="function"==typeof e?e(a):r(r({},a),e)),t},o=function(e){var a=l(e.components);return n.createElement(i.Provider,{value:a},e.children)},c="mdxType",N={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},k=n.forwardRef((function(e,a){var t=e.components,m=e.mdxType,s=e.originalType,i=e.parentName,o=p(e,["components","mdxType","originalType","parentName"]),c=l(t),k=m,h=c["".concat(i,".").concat(k)]||c[k]||N[k]||s;return t?n.createElement(h,r(r({ref:a},o),{},{components:t})):n.createElement(h,r({ref:a},o))}));function h(e,a){var t=arguments,m=a&&a.mdxType;if("string"==typeof e||m){var s=t.length,r=new Array(s);r[0]=k;var p={};for(var i in a)hasOwnProperty.call(a,i)&&(p[i]=a[i]);p.originalType=e,p[c]="string"==typeof e?e:m,r[1]=p;for(var l=2;l{t.r(a),t.d(a,{assets:()=>i,contentTitle:()=>r,default:()=>N,frontMatter:()=>s,metadata:()=>p,toc:()=>l});var n=t(7462),m=(t(7294),t(3905));const s={id:"extend",title:"Time complexity of \u2039extend\u203a",description:"How to make inefficient algorithm unknowingly.\n",tags:["c","python","dynamic array","time complexity","recursion"],last_update:{date:new Date("2021-03-31T00:00:00.000Z")}},r=void 0,p={unversionedId:"time-complexity/extend",id:"time-complexity/extend",title:"Time complexity of \u2039extend\u203a",description:"How to make inefficient algorithm unknowingly.\n",source:"@site/ib002/03-time-complexity/2021-03-31-extend.md",sourceDirName:"03-time-complexity",slug:"/time-complexity/extend",permalink:"/ib002/time-complexity/extend",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/03-time-complexity/2021-03-31-extend.md",tags:[{label:"c",permalink:"/ib002/tags/c"},{label:"python",permalink:"/ib002/tags/python"},{label:"dynamic array",permalink:"/ib002/tags/dynamic-array"},{label:"time complexity",permalink:"/ib002/tags/time-complexity"},{label:"recursion",permalink:"/ib002/tags/recursion"}],version:"current",lastUpdatedAt:1617148800,formattedLastUpdatedAt:"Mar 31, 2021",frontMatter:{id:"extend",title:"Time complexity of \u2039extend\u203a",description:"How to make inefficient algorithm unknowingly.\n",tags:["c","python","dynamic array","time complexity","recursion"],last_update:{date:"2021-03-31T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Asymptotic Notation and Time Complexity",permalink:"/ib002/category/asymptotic-notation-and-time-complexity"},next:{title:"Recursion",permalink:"/ib002/category/recursion"}},i={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Technicalities",id:"technicalities",level:2},{value:"Example #1",id:"example-1",level:2},{value:"Example #2",id:"example-2",level:2},{value:"Implementation of extend",id:"implementation-of-extend",level:2}],o={toc:l},c="wrapper";function N(e){let{components:a,...s}=e;return(0,m.kt)(c,(0,n.Z)({},o,s,{components:a,mdxType:"MDXLayout"}),(0,m.kt)("h2",{id:"introduction"},"Introduction"),(0,m.kt)("p",null,"Each year there is a lot of confusion regarding time complexity of the ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," operation on the lists in Python. I will introduce two specific examples from previous year and also will try to explain it on one of the possible implementations of ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," operation."),(0,m.kt)("h2",{id:"technicalities"},"Technicalities"),(0,m.kt)("p",null,"At the beginning we should clear some of the \u201cmyths\u201d regarding extending of the lists. There is a common misunderstanding regarding differences between ",(0,m.kt)("inlineCode",{parentName:"p"},"a += b"),", ",(0,m.kt)("inlineCode",{parentName:"p"},"a.extend(b)")," and ",(0,m.kt)("inlineCode",{parentName:"p"},"a + b"),"."),(0,m.kt)("ul",null,(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("p",{parentName:"li"},(0,m.kt)("inlineCode",{parentName:"p"},"a.extend(b)")," - adds all elements from ",(0,m.kt)("inlineCode",{parentName:"p"},"b")," to ",(0,m.kt)("inlineCode",{parentName:"p"},"a"),"."),(0,m.kt)("p",{parentName:"li"},"Time complexity: ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mi",{parentName:"mrow"},"n"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(n)")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,m.kt)("span",{parentName:"span",className:"mclose"},")"))))),", where ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow"},"n")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"n")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))," denotes the length of ",(0,m.kt)("inlineCode",{parentName:"p"},"b"),".")),(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("p",{parentName:"li"},(0,m.kt)("inlineCode",{parentName:"p"},"a += b")," - equivalent to ",(0,m.kt)("inlineCode",{parentName:"p"},"a.extend(b)"))),(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("p",{parentName:"li"},(0,m.kt)("inlineCode",{parentName:"p"},"a + b")," - constructs a new list that contains elements from ",(0,m.kt)("inlineCode",{parentName:"p"},"a")," followed by\nelements from ",(0,m.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,m.kt)("p",{parentName:"li"},"Time complexity: ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mi",{parentName:"mrow"},"m"),(0,m.kt)("mo",{parentName:"mrow"},"+"),(0,m.kt)("mi",{parentName:"mrow"},"n"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(m + n)")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"m"),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,m.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,m.kt)("span",{parentName:"span",className:"mclose"},")"))))),", where ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow"},"m"),(0,m.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,m.kt)("mi",{parentName:"mrow"},"n")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"m, n")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"m"),(0,m.kt)("span",{parentName:"span",className:"mpunct"},","),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))," denote the length of\n",(0,m.kt)("inlineCode",{parentName:"p"},"a")," and ",(0,m.kt)("inlineCode",{parentName:"p"},"b")," respectively."),(0,m.kt)("p",{parentName:"li"},"Space complexity: ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mi",{parentName:"mrow"},"m"),(0,m.kt)("mo",{parentName:"mrow"},"+"),(0,m.kt)("mi",{parentName:"mrow"},"n"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(m + n)")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"m"),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,m.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,m.kt)("span",{parentName:"span",className:"mclose"},")"))))),", where ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow"},"m"),(0,m.kt)("mo",{parentName:"mrow",separator:"true"},","),(0,m.kt)("mi",{parentName:"mrow"},"n")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"m, n")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"0.625em",verticalAlign:"-0.1944em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"m"),(0,m.kt)("span",{parentName:"span",className:"mpunct"},","),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))," denote the length of\n",(0,m.kt)("inlineCode",{parentName:"p"},"a")," and ",(0,m.kt)("inlineCode",{parentName:"p"},"b")," respectively, since we construct new list."))),(0,m.kt)("h2",{id:"example-1"},"Example #1"),(0,m.kt)("p",null,"Let us assume function that uses divide & conquer strategy to return indices at which we can find specific element in any list."),(0,m.kt)("pre",null,(0,m.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},"def recursive_find_in_list(\n values: List[Any], key: Any, lower: int, upper: int\n) -> List[int]:\n if lower == upper:\n return [lower] if values[lower] == key else []\n\n indices = []\n mid = (lower + upper) // 2\n\n indices.extend(recursive_find_in_list(values, key, lower, mid))\n indices.extend(recursive_find_in_list(values, key, mid + 1, upper))\n\n return indices\n\n\ndef find_in_list(values: List[Any], key: Any) -> List[int]:\n return recursive_find_in_list(values, key, 0, len(values) - 1)\n")),(0,m.kt)("p",null,"This implementation works nicely, ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," is linear (with the respect to the length of the list that is being appended)."),(0,m.kt)("p",null,"Let us try to dissect the way this function works on some specific input (that will be pushed to the extreme, ",(0,m.kt)("em",{parentName:"p"},"just in case")," ;)"),(0,m.kt)("p",null,(0,m.kt)("inlineCode",{parentName:"p"},"find_in_list([1] * 5000, 1)"),". What shall be the result of this? Since we have ",(0,m.kt)("inlineCode",{parentName:"p"},"key = 1")," and the list contains only ",(0,m.kt)("inlineCode",{parentName:"p"},"1"),"s, we should get list of ",(0,m.kt)("strong",{parentName:"p"},"all")," indices."),(0,m.kt)("p",null,"If we were to draw a tree of call hierarchy of ",(0,m.kt)("inlineCode",{parentName:"p"},"recursive_find_in_list"),", we would notice that in sum it is still linear to the length. ",(0,m.kt)("strong",{parentName:"p"},"However we use ",(0,m.kt)("inlineCode",{parentName:"strong"},"extend"),"!")),(0,m.kt)("p",null,"In the leaves of the tree we return lists of length 1. In this case it means calling ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," 5000-times at the second-to-last level of the tree on the 1-element long lists, next level 2500 calls on 2-elements long lists, next one 1250 on 4-elements long lists, etc. At the top-level we get 2 calls on 5000/2-element long lists."),(0,m.kt)("p",null,"A lot of ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," calls, right? And the lengths of the lists are growing (in this example, second call happens on 2500-elements long lists)."),(0,m.kt)("p",null,"Because of the ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," in each level of the tree (call hierarchy) we traverse all of the elements. That means:"),(0,m.kt)("div",{className:"math math-display"},(0,m.kt)("span",{parentName:"div",className:"katex-display"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mi",{parentName:"mrow"},"n"),(0,m.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,m.kt)("mi",{parentName:"mrow"},"log"),(0,m.kt)("mo",{parentName:"mrow"},"\u2061"),(0,m.kt)("mi",{parentName:"mrow"},"n"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(n \\cdot \\log n)")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,m.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mop"},"lo",(0,m.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,m.kt)("span",{parentName:"span",className:"mclose"},")")))))),(0,m.kt)("p",null,"because we have ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow"},"log"),(0,m.kt)("mo",{parentName:"mrow"},"\u2061"),(0,m.kt)("mi",{parentName:"mrow"},"n")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\log n")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,m.kt)("span",{parentName:"span",className:"mop"},"lo",(0,m.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))," levels in the tree and ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow"},"n")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"n")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))," elements at each level."),(0,m.kt)("h2",{id:"example-2"},"Example #2"),(0,m.kt)("p",null,"As we could observe in the example above, ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," iterates over all of the elements that it adds. In case of recursive calls, it results in iterating over the same elements multiple times."),(0,m.kt)("p",null,"Consider constructing of this list:"),(0,m.kt)("p",null,(0,m.kt)("img",{alt:"Rendered construction of the list",src:t(5304).Z+"#gh-light-mode-only",width:"851",height:"276"}),"\n",(0,m.kt)("img",{alt:"Rendered construction of the list",src:t(5890).Z+"#gh-dark-mode-only",width:"851",height:"276"})),(0,m.kt)("p",null,"Let us assume that you extend the result with the list that you get from the recursive call."),(0,m.kt)("ul",null,(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("p",{parentName:"li"},"B iterates through 1, 2 and 3; returns ",(0,m.kt)("inlineCode",{parentName:"p"},"[1, 2, 3]"))),(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("p",{parentName:"li"},"C iterates through 4, 5 and 6; returns ",(0,m.kt)("inlineCode",{parentName:"p"},"[4, 5, 6]"))),(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("p",{parentName:"li"},"D iterates through 7, 8 and 9; returns ",(0,m.kt)("inlineCode",{parentName:"p"},"[7, 8, 9]"))),(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("p",{parentName:"li"},"now we return those lists to the calls from A), so each of the ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," calls iterates through:"),(0,m.kt)("ul",{parentName:"li"},(0,m.kt)("li",{parentName:"ul"},"1, 2, 3 that was returned from B"),(0,m.kt)("li",{parentName:"ul"},"4, 5, 6 that was returned from C"),(0,m.kt)("li",{parentName:"ul"},"7, 8, 9 that was returned from D")),(0,m.kt)("p",{parentName:"li"},"and returns ",(0,m.kt)("inlineCode",{parentName:"p"},"[1, 2, 3, 4, 5, 6, 7, 8, 9]")))),(0,m.kt)("p",null,"If the recursion had bigger depth and/or more elements, it would iterate through them more than twice, therefore it does not take constant time to do nor some constant multiple of the input, since it traverses all of the elements in each of the levels."),(0,m.kt)("h2",{id:"implementation-of-extend"},"Implementation of ",(0,m.kt)("inlineCode",{parentName:"h2"},"extend")),(0,m.kt)("p",null,"There is an example of dynamic array:"),(0,m.kt)("ul",null,(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("a",{parentName:"li",href:"pathname:///files/ib002/time-complexity/extend/dynlist.h"},"interface (",(0,m.kt)("inlineCode",{parentName:"a"},"dynlist.h"),")")),(0,m.kt)("li",{parentName:"ul"},(0,m.kt)("a",{parentName:"li",href:"pathname:///files/ib002/time-complexity/extend/dynlist.c"},"implementation (",(0,m.kt)("inlineCode",{parentName:"a"},"dynlist.c"),")"))),(0,m.kt)("p",null,"For the sake of ",(0,m.kt)("em",{parentName:"p"},"Algorithms and Data Structures I")," we consider ",(0,m.kt)("inlineCode",{parentName:"p"},"APPEND")," operation, i.e. adding the element to the end of the list, to have time complexity ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mn",{parentName:"mrow"},"1"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(1)")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord"},"1"),(0,m.kt)("span",{parentName:"span",className:"mclose"},")")))))," (",(0,m.kt)("strong",{parentName:"p"},"amortized"),"; which is out of the scope of IB002)."),(0,m.kt)("p",null,"If we have a look at the ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," implementation in this dynamic array example:"),(0,m.kt)("pre",null,(0,m.kt)("code",{parentName:"pre",className:"language-c",metastring:"showLineNumbers",showLineNumbers:!0},"void dynamic_array_extend(struct dynamic_array_t *arr, struct dynamic_array_t *src)\n{\n if (arr == NULL || src == NULL)\n {\n return;\n }\n\n for (size_t i = 0; i < src->count; i++)\n {\n dynamic_array_push_back(arr, dynamic_array_at(src, i));\n }\n}\n")),(0,m.kt)("p",null,"Apart from checking edge cases, we can notice that we run ",(0,m.kt)("inlineCode",{parentName:"p"},"for"),"-loop over the elements from the other array and add them one-by-one to the ",(0,m.kt)("inlineCode",{parentName:"p"},"arr"),". Time complexity of this operation is time dependant on the ",(0,m.kt)("inlineCode",{parentName:"p"},"src")," array."),(0,m.kt)("p",null,"In this specific implementation, you could also resize the memory allocated for the array in one go and copy ",(0,m.kt)("em",{parentName:"p"},"whole")," ",(0,m.kt)("inlineCode",{parentName:"p"},"src")," array in one go. However even if you did so, it would be still dependant on the size of the ",(0,m.kt)("inlineCode",{parentName:"p"},"src")," array. Cause you still need to copy ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mtext",{parentName:"mrow",mathvariant:"monospace"},"count"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mi",{parentName:"mrow"},"s"),(0,m.kt)("mi",{parentName:"mrow"},"r"),(0,m.kt)("mi",{parentName:"mrow"},"c"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")"),(0,m.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,m.kt)("mtext",{parentName:"mrow",mathvariant:"monospace"},"elementSize"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mi",{parentName:"mrow"},"s"),(0,m.kt)("mi",{parentName:"mrow"},"r"),(0,m.kt)("mi",{parentName:"mrow"},"c"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\texttt{count}(src) \\cdot \\texttt{elementSize}(src)")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord text"},(0,m.kt)("span",{parentName:"span",className:"mord texttt"},"count")),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"src"),(0,m.kt)("span",{parentName:"span",className:"mclose"},")"),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,m.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,m.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord text"},(0,m.kt)("span",{parentName:"span",className:"mord texttt"},"elementSize")),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"src"),(0,m.kt)("span",{parentName:"span",className:"mclose"},")")))))," bytes. From that we can assume that for specific instance of array the ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mtext",{parentName:"mrow",mathvariant:"monospace"},"elementSize"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mi",{parentName:"mrow"},"s"),(0,m.kt)("mi",{parentName:"mrow"},"r"),(0,m.kt)("mi",{parentName:"mrow"},"c"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\texttt{elementSize}(src)")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord text"},(0,m.kt)("span",{parentName:"span",className:"mord texttt"},"elementSize")),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"src"),(0,m.kt)("span",{parentName:"span",className:"mclose"},")")))))," is fixed, therefore we consider it a constant. That way we are getting ",(0,m.kt)("span",{parentName:"p",className:"math math-inline"},(0,m.kt)("span",{parentName:"span",className:"katex"},(0,m.kt)("span",{parentName:"span",className:"katex-mathml"},(0,m.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,m.kt)("semantics",{parentName:"math"},(0,m.kt)("mrow",{parentName:"semantics"},(0,m.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mtext",{parentName:"mrow",mathvariant:"monospace"},"count"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,m.kt)("mi",{parentName:"mrow"},"s"),(0,m.kt)("mi",{parentName:"mrow"},"r"),(0,m.kt)("mi",{parentName:"mrow"},"c"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")"),(0,m.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,m.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(\\texttt{count}(src))")))),(0,m.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,m.kt)("span",{parentName:"span",className:"base"},(0,m.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,m.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord text"},(0,m.kt)("span",{parentName:"span",className:"mord texttt"},"count")),(0,m.kt)("span",{parentName:"span",className:"mopen"},"("),(0,m.kt)("span",{parentName:"span",className:"mord mathnormal"},"src"),(0,m.kt)("span",{parentName:"span",className:"mclose"},"))")))))," as a time complexity of our ",(0,m.kt)("inlineCode",{parentName:"p"},"extend")," operation."))}N.isMDXComponent=!0},5890:(e,a,t)=>{t.d(a,{Z:()=>n});const n=t.p+"assets/images/construction_dark-fcb91acb746c787329bf9bd3cb54c5b7.png"},5304:(e,a,t)=>{t.d(a,{Z:()=>n});const n=t.p+"assets/images/construction_light-dda6c5aa625d6e6c14c01589117281c2.png"}}]); \ No newline at end of file diff --git a/assets/js/7cf94373.f790d5a8.js b/assets/js/7cf94373.f790d5a8.js new file mode 100644 index 0000000..8d919bc --- /dev/null +++ b/assets/js/7cf94373.f790d5a8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3095],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});var a=n(7294);function r(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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=p(n),d=r,k=m["".concat(l,".").concat(d)]||m[d]||c[d]||i;return n?a.createElement(k,o(o({ref:t},u),{},{components:n})):a.createElement(k,o({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:r,o[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const i={id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},o=void 0,s={unversionedId:"bonuses/seminar-10",id:"bonuses/seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n",source:"@site/pb071/bonuses/10.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-10",permalink:"/pb071/bonuses/seminar-10",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/bonuses/10.md",tags:[],version:"current",lastUpdatedAt:1694108971,formattedLastUpdatedAt:"Sep 7, 2023",frontMatter:{id:"seminar-10",title:"10th seminar",description:"Finding bugs in a hangman.\n"},sidebar:"autogeneratedBar",previous:{title:"8th seminar",permalink:"/pb071/bonuses/seminar-08"},next:{title:"Practice Exams",permalink:"/pb071/category/practice-exams"}},l={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Project",id:"project",level:2},{value:"Summary of the gameplay",id:"summary-of-the-gameplay",level:3},{value:"Suggested workflow",id:"suggested-workflow",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Dictionary",id:"dictionary",level:2},{value:"Submitting",id:"submitting",level:2}],u={toc:p},m="wrapper";function c(e){let{components:t,...i}=e;return(0,r.kt)(m,(0,a.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"pathname:///files/pb071/bonuses/10.tar.gz"},"Source")),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"For this bonus you are given almost finished project - The Hangman Game. Your\ntask is to try the game, in case you find any bugs point them out and cover as\nmuch of the game as possible with tests."),(0,r.kt)("p",null,"For this bonus you can get at maximum 2 K\u20a1."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Item"),(0,r.kt)("th",{parentName:"tr",align:null},"Bonus"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Fixing bugs from failing tests"),(0,r.kt)("td",{parentName:"tr",align:null},"0.25")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"word_guessed")),(0,r.kt)("td",{parentName:"tr",align:null},"0.50")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Hidden bug"),(0,r.kt)("td",{parentName:"tr",align:null},"0.50")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Extending tests, undetectable bugs or evil bug"),(0,r.kt)("td",{parentName:"tr",align:null},"0.37")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Refactor"),(0,r.kt)("td",{parentName:"tr",align:null},"0.38")))),(0,r.kt)("h2",{id:"project"},"Project"),(0,r.kt)("p",null,"Project consists of 2 source files - ",(0,r.kt)("inlineCode",{parentName:"p"},"hangman.c")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"main.c"),"."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"main.c")," is quite short and concise, there is nothing for you to do."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"hangman.c")," contains implementation of the game. In case you feel lost, consult\nthe documentation in ",(0,r.kt)("inlineCode",{parentName:"p"},"hangman.h")," that represents an interface that can be used\nfor implementing the game."),(0,r.kt)("p",null,"Apart from those sources this project is a bit more complicated. ",(0,r.kt)("em",{parentName:"p"},"Game loop")," is\nrealised via single encapsulated function that complicates the testing. Because\nof that, there are 2 kinds of tests:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("em",{parentName:"p"},"Unit tests")," - that are present in ",(0,r.kt)("inlineCode",{parentName:"p"},"test_hangman.c")," and can be run via:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"$ make check-unit\n")),(0,r.kt)("p",{parentName:"li"},"They cover majorly functions that can be tested easily via testing framework.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("em",{parentName:"p"},"Functional tests")," - same as in ",(0,r.kt)("inlineCode",{parentName:"p"},"seminar-08")," and are focused on testing the\nprogram as whole. Basic smoke test is already included in ",(0,r.kt)("inlineCode",{parentName:"p"},"usage")," test case."),(0,r.kt)("p",{parentName:"li"},"They can be run via:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},"$ make check-functional\n")),(0,r.kt)("p",{parentName:"li"},"When testing ",(0,r.kt)("inlineCode",{parentName:"p"},"hangman")," function (the game loop), it is suggested to create\nfunctional tests."),(0,r.kt)("p",{parentName:"li"},"When submitting the files for review, please leave out functional tests that\nwere given as a part of the assignment, so that it is easier to navigate, I\nwill drag the common files myself. :)"))),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Whole test suite can be run via:"),(0,r.kt)("pre",{parentName:"blockquote"},(0,r.kt)("code",{parentName:"pre"},"$ make check\n"))),(0,r.kt)("h3",{id:"summary-of-the-gameplay"},"Summary of the gameplay"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Secret word gets chosen from the file that's path is given as an argument."),(0,r.kt)("li",{parentName:"ol"},"You get 8 guesses."),(0,r.kt)("li",{parentName:"ol"},"Invalid characters don't count."),(0,r.kt)("li",{parentName:"ol"},"Already guessed characters don't count, even if not included in the secret."),(0,r.kt)("li",{parentName:"ol"},"You can guess the whole word at once",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"If you get it right, you won, game ends."),(0,r.kt)("li",{parentName:"ul"},"If you don't get it right, you get to see the secret, game ends."))),(0,r.kt)("li",{parentName:"ol"},"In case of end of input, game finishes via force."),(0,r.kt)("li",{parentName:"ol"},"In case of invalid input, no guesses are subtracted, game carries on."),(0,r.kt)("li",{parentName:"ol"},"Letters and words are not case sensitive.")),(0,r.kt)("h2",{id:"suggested-workflow"},"Suggested workflow"),(0,r.kt)("p",null,"As we have talked about on the seminar, I suggest you to follow\n",(0,r.kt)("em",{parentName:"p"},"Test-Driven Development"),"\nin this case."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"TDD workflow",src:n(1530).Z,width:"2814",height:"1652"})),(0,r.kt)("p",null,"In our current scenario we are already in the stage of refactoring and fixing the\nbugs. Therefore try to follow this succession of steps:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Try to reproduce the bug."),(0,r.kt)("li",{parentName:"ol"},"Create a test that proves the presence of the bug."),(0,r.kt)("li",{parentName:"ol"},"Fix the bug.")),(0,r.kt)("p",null,"In case you are submitting the bonus via GitLab, it is helpful to commit tests\nbefore commiting the fixes, so that it is apparent that the bug is manifested.\nExample of ",(0,r.kt)("inlineCode",{parentName:"p"},"git log")," (notice that the first line represents latest commit):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"feat: Implement fizz_buzzer\ntest: Add tests for fizz_buzzer\nfix: Fix NULL-check in print_name\ntest: Add test for NULL in print_name\n")),(0,r.kt)("h2",{id:"tasks"},"Tasks"),(0,r.kt)("p",null,"As to your tasks, there are multiple things wrong in this project."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'There are 2 "bugs" that cannot be detected via tests, i.e. they are not bugs\nthat affect functionality of the game.')),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"There is one evil bug in ",(0,r.kt)("inlineCode",{parentName:"p"},"get_word"),". It is not required to be fixed ;) Assign\nit the lowest priority.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"There are some tests failing. Please try to figure it out, so you have green\ntests for the rest :)")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We have gotten a bug report for ",(0,r.kt)("inlineCode",{parentName:"p"},"word_guessed"),", all we got is"),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},"doesn't work when there are too many ",(0,r.kt)("inlineCode",{parentName:"p"},"a"),"s")),(0,r.kt)("p",{parentName:"li"},"Please try to replicate the bug and create a tests, so we don't get any\nregression later on.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"One hidden bug :) Closely non-specified, we cannot reproduce it and we were\ndrunk while playing the game, so we don't remember a thing. :/")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Try to cover as much code via the tests as possible. We are not going to look\nat the metrics, but DRY is violated a lot, so as a last task try to remove as\nmuch of the duplicit code as possible."),(0,r.kt)("p",{parentName:"li"},"Tests should help you a lot in case there are some regressions."))),(0,r.kt)("hr",null),(0,r.kt)("p",null,"In case you wonder why there are always 3 same words in the file with words, it\nis because of the ",(0,r.kt)("inlineCode",{parentName:"p"},"get_word")," bug. It is not a bug that can be easily fixed, so\nit is a not requirement at all and you can still get all points for the bonus ;)"),(0,r.kt)("h2",{id:"dictionary"},"Dictionary"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Functional_testing"},"Functional tests")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Smoke_testing_%28software%29"},"Smoke test")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"},"DRY"))),(0,r.kt)("h2",{id:"submitting"},"Submitting"),(0,r.kt)("p",null,"In case you have any questions, feel free to reach out to me."),(0,r.kt)("hr",null),(0,r.kt)("p",null,"Ideally submit the assignment through the merge request. Step-by-step tutorial\nis present ",(0,r.kt)("a",{parentName:"p",href:"../mr"},"here"),". For setting assignee my xlogin is ",(0,r.kt)("inlineCode",{parentName:"p"},"xfocko"),"."),(0,r.kt)("p",null,"In case you do not want to experiment on GitLab, send me the source code via\nemail, but please prefix subject with: ",(0,r.kt)("inlineCode",{parentName:"p"},"[PB071/14][seminar-10]")),(0,r.kt)("p",null,"Deadline for the submission of the bonus is ",(0,r.kt)("strong",{parentName:"p"},"May 17 24:00"),"."))}c.isMDXComponent=!0},1530:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tdd_lifecycle-327ad9ee0ed8318ed11e19a28e02b2cc.png"}}]); \ No newline at end of file diff --git a/assets/js/7d580cdb.71718a61.js b/assets/js/7d580cdb.71718a61.js new file mode 100644 index 0000000..1a660e5 --- /dev/null +++ b/assets/js/7d580cdb.71718a61.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8442],{3905:(a,e,t)=>{t.d(e,{Zo:()=>o,kt:()=>h});var n=t(7294);function s(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function m(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function p(a){for(var e=1;e=0||(s[t]=a[t]);return s}(a,e);if(Object.getOwnPropertySymbols){var m=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(s[t]=a[t])}return s}var l=n.createContext({}),i=function(a){var e=n.useContext(l),t=e;return a&&(t="function"==typeof a?a(e):p(p({},e),a)),t},o=function(a){var e=i(a.components);return n.createElement(l.Provider,{value:e},a.children)},N="mdxType",c={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(a,e){var t=a.components,s=a.mdxType,m=a.originalType,l=a.parentName,o=r(a,["components","mdxType","originalType","parentName"]),N=i(t),k=s,h=N["".concat(l,".").concat(k)]||N[k]||c[k]||m;return t?n.createElement(h,p(p({ref:e},o),{},{components:t})):n.createElement(h,p({ref:e},o))}));function h(a,e){var t=arguments,s=e&&e.mdxType;if("string"==typeof a||s){var m=t.length,p=new Array(m);p[0]=k;var r={};for(var l in e)hasOwnProperty.call(e,l)&&(r[l]=e[l]);r.originalType=a,r[N]="string"==typeof a?a:s,p[1]=r;for(var i=2;i{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>p,default:()=>c,frontMatter:()=>m,metadata:()=>r,toc:()=>i});var n=t(7462),s=(t(7294),t(3905));const m={id:"pyramid-slide-down",title:"Introduction to dynamic programming",description:"Solving a problem in different ways.\n",tags:["java","recursion","exponential","greedy","dynamic-programming","top-down-dp","bottom-up-dp"],last_updated:{date:new Date("2023-08-17T00:00:00.000Z")}},p=void 0,r={unversionedId:"recursion/pyramid-slide-down",id:"recursion/pyramid-slide-down",title:"Introduction to dynamic programming",description:"Solving a problem in different ways.\n",source:"@site/ib002/04-recursion/2023-08-17-pyramid-slide-down.md",sourceDirName:"04-recursion",slug:"/recursion/pyramid-slide-down",permalink:"/ib002/recursion/pyramid-slide-down",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/04-recursion/2023-08-17-pyramid-slide-down.md",tags:[{label:"java",permalink:"/ib002/tags/java"},{label:"recursion",permalink:"/ib002/tags/recursion"},{label:"exponential",permalink:"/ib002/tags/exponential"},{label:"greedy",permalink:"/ib002/tags/greedy"},{label:"dynamic-programming",permalink:"/ib002/tags/dynamic-programming"},{label:"top-down-dp",permalink:"/ib002/tags/top-down-dp"},{label:"bottom-up-dp",permalink:"/ib002/tags/bottom-up-dp"}],version:"current",lastUpdatedAt:1694108971,formattedLastUpdatedAt:"Sep 7, 2023",frontMatter:{id:"pyramid-slide-down",title:"Introduction to dynamic programming",description:"Solving a problem in different ways.\n",tags:["java","recursion","exponential","greedy","dynamic-programming","top-down-dp","bottom-up-dp"],last_updated:{date:"2023-08-17T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Recursion and backtracking with Robot Karel",permalink:"/ib002/recursion/karel-1"},next:{title:"Red-Black Trees",permalink:"/ib002/category/red-black-trees"}},l={},i=[{value:"Problem",id:"problem",level:2},{value:"Solving the problem",id:"solving-the-problem",level:2},{value:"Na\xefve solution",id:"na\xefve-solution",level:2},{value:"Time complexity",id:"time-complexity",level:3},{value:"Greedy solution",id:"greedy-solution",level:2},{value:"Time complexity",id:"time-complexity-1",level:3},{value:"Running the tests",id:"running-the-tests",level:3},{value:"Top-down DP",id:"top-down-dp",level:2},{value:"Time complexity",id:"time-complexity-2",level:3},{value:"Memory complexity",id:"memory-complexity",level:3},{value:"Bottom-up DP",id:"bottom-up-dp",level:2},{value:"Time complexity",id:"time-complexity-3",level:3},{value:"Memory complexity",id:"memory-complexity-1",level:3},{value:"Summary",id:"summary",level:2}],o={toc:i},N="wrapper";function c(a){let{components:e,...t}=a;return(0,s.kt)(N,(0,n.Z)({},o,t,{components:e,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"In this post we will try to solve one problem in different ways."),(0,s.kt)("h2",{id:"problem"},"Problem"),(0,s.kt)("p",null,"The problem we are going to solve is one of ",(0,s.kt)("em",{parentName:"p"},"CodeWars")," katas and is called\n",(0,s.kt)("a",{parentName:"p",href:"https://www.codewars.com/kata/551f23362ff852e2ab000037"},"Pyramid Slide Down"),"."),(0,s.kt)("p",null,"We are given a 2D array of integers and we are to find the ",(0,s.kt)("em",{parentName:"p"},"slide down"),".\n",(0,s.kt)("em",{parentName:"p"},"Slide down")," is a maximum sum of consecutive numbers from the top to the bottom."),(0,s.kt)("p",null,"Let's have a look at few examples. Consider the following pyramid:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"}," 3\n 7 4\n 2 4 6\n8 5 9 3\n")),(0,s.kt)("p",null,"This pyramid has following slide down:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"}," *3\n *7 4\n 2 *4 6\n8 5 *9 3\n")),(0,s.kt)("p",null,"And its value is ",(0,s.kt)("inlineCode",{parentName:"p"},"23"),"."),(0,s.kt)("p",null,"We can also have a look at a ",(0,s.kt)("em",{parentName:"p"},"bigger")," example:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"}," 75\n 95 64\n 17 47 82\n 18 35 87 10\n 20 4 82 47 65\n 19 1 23 3 34\n 88 2 77 73 7 63 67\n 99 65 4 28 6 16 70 92\n 41 41 26 56 83 40 80 70 33\n 41 48 72 33 47 32 37 16 94 29\n 53 71 44 65 25 43 91 52 97 51 14\n 70 11 33 28 77 73 17 78 39 68 17 57\n 91 71 52 38 17 14 91 43 58 50 27 29 48\n 63 66 4 68 89 53 67 30 73 16 69 87 40 31\n 4 62 98 27 23 9 70 98 73 93 38 53 60 4 23\n")),(0,s.kt)("p",null,"Slide down in this case is equal to ",(0,s.kt)("inlineCode",{parentName:"p"},"1074"),"."),(0,s.kt)("h2",{id:"solving-the-problem"},"Solving the problem"),(0,s.kt)("admonition",{type:"caution"},(0,s.kt)("p",{parentName:"admonition"},"I will describe the following ways you can approach this problem and implement\nthem in ",(0,s.kt)("em",{parentName:"p"},"Java"),(0,s.kt)("sup",{parentName:"p",id:"fnref-1"},(0,s.kt)("a",{parentName:"sup",href:"#fn-1",className:"footnote-ref"},"1")),".")),(0,s.kt)("p",null,"For all of the following solutions I will be using basic ",(0,s.kt)("inlineCode",{parentName:"p"},"main")," function that\nwill output ",(0,s.kt)("inlineCode",{parentName:"p"},"true"),"/",(0,s.kt)("inlineCode",{parentName:"p"},"false")," based on the expected output of our algorithm. Any\nother differences will lie only in the solutions of the problem. You can see the\n",(0,s.kt)("inlineCode",{parentName:"p"},"main")," here:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-java"},'public static void main(String[] args) {\n System.out.print("Test #1: ");\n System.out.println(longestSlideDown(new int[][] {\n { 3 },\n { 7, 4 },\n { 2, 4, 6 },\n { 8, 5, 9, 3 }\n }) == 23 ? "passed" : "failed");\n\n System.out.print("Test #2: ");\n System.out.println(longestSlideDown(new int[][] {\n { 75 },\n { 95, 64 },\n { 17, 47, 82 },\n { 18, 35, 87, 10 },\n { 20, 4, 82, 47, 65 },\n { 19, 1, 23, 75, 3, 34 },\n { 88, 2, 77, 73, 7, 63, 67 },\n { 99, 65, 4, 28, 6, 16, 70, 92 },\n { 41, 41, 26, 56, 83, 40, 80, 70, 33 },\n { 41, 48, 72, 33, 47, 32, 37, 16, 94, 29 },\n { 53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14 },\n { 70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57 },\n { 91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48 },\n { 63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31 },\n { 4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23 },\n }) == 1074 ? "passed" : "failed");\n}\n')),(0,s.kt)("h2",{id:"na\xefve-solution"},"Na\xefve solution"),(0,s.kt)("p",null,"Our na\xefve solution consists of trying out all the possible slides and finding\nthe one with maximum sum."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-java"},"public static int longestSlideDown(int[][] pyramid, int row, int col) {\n if (row >= pyramid.length || col < 0 || col >= pyramid[row].length) {\n // BASE: We have gotten out of bounds, there's no reasonable value to\n // return, so we just return the \u2039MIN_VALUE\u203a to ensure that it cannot\n // be maximum.\n return Integer.MIN_VALUE;\n }\n\n if (row == pyramid.length - 1) {\n // BASE: Bottom of the pyramid, we just return the value, there's\n // nowhere to slide anymore.\n return pyramid[row][col];\n }\n\n // Otherwise we account for the current position and return maximum of the\n // available \u201cslides\u201d.\n return pyramid[row][col] + Math.max(\n longestSlideDown(pyramid, row + 1, col),\n longestSlideDown(pyramid, row + 1, col + 1));\n}\n\npublic static int longestSlideDown(int[][] pyramid) {\n // We start the slide in the top cell of the pyramid.\n return longestSlideDown(pyramid, 0, 0);\n}\n")),(0,s.kt)("p",null,"As you can see, we have 2 overloads:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-java"},"int longestSlideDown(int[][] pyramid);\nint longestSlideDown(int[][] pyramid, int row, int col);\n")),(0,s.kt)("p",null,"First one is used as a ",(0,s.kt)("em",{parentName:"p"},"public interface")," to the solution, you just pass in the\npyramid itself. Second one is the recursive \u201calgorithm\u201d that finds the slide\ndown."),(0,s.kt)("p",null,"It is a relatively simple solution\u2026 There's nothing to do at the bottom of the\npyramid, so we just return the value in the ",(0,s.kt)("em",{parentName:"p"},"cell"),". Otherwise we add it and try\nto slide down the available cells below the current row."),(0,s.kt)("h3",{id:"time-complexity"},"Time complexity"),(0,s.kt)("p",null,"If you get the source code and run it yourself, it runs rather fine\u2026 I hope you\nare wondering about the time complexity of the proposed solution and, since it\nreally is a na\xefve solution, the time complexity is pretty bad. Let's find the\nworst case scenario."),(0,s.kt)("p",null,"Let's start with the first overload:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-java"},"public static int longestSlideDown(int[][] pyramid) {\n return longestSlideDown(pyramid, 0, 0);\n}\n")),(0,s.kt)("p",null,"There's not much to do here, so we can safely say that the time complexity of\nthis function is bounded by ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"T"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"T(n)")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.13889em"}},"T"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")"))))),", where ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"T")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"T")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6833em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.13889em"}},"T")))))," is our second overload. This\ndoesn't tell us anything, so let's move on to the second overload where we are\ngoing to define the ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"T"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"T(n)")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.13889em"}},"T"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))))," function."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-java"},"public static int longestSlideDown(int[][] pyramid, int row, int col) {\n if (row >= pyramid.length || col < 0 || col >= pyramid[row].length) {\n // BASE: We have gotten out of bounds, there's no reasonable value to\n // return, so we just return the \u2039MIN_VALUE\u203a to ensure that it cannot\n // be maximum.\n return Integer.MIN_VALUE;\n }\n\n if (row == pyramid.length - 1) {\n // BASE: Bottom of the pyramid, we just return the value, there's\n // nowhere to slide anymore.\n return pyramid[row][col];\n }\n\n // Otherwise we account for the current position and return maximum of the\n // available \u201cslides\u201d.\n return pyramid[row][col] + Math.max(\n longestSlideDown(pyramid, row + 1, col),\n longestSlideDown(pyramid, row + 1, col + 1));\n}\n")),(0,s.kt)("p",null,"Fun fact is that the whole \u201calgorithm\u201d consists of just 2 ",(0,s.kt)("inlineCode",{parentName:"p"},"return")," statements\nand nothing else. Let's dissect them!"),(0,s.kt)("p",null,"First ",(0,s.kt)("inlineCode",{parentName:"p"},"return")," statement is the base case, so it has a constant time complexity."),(0,s.kt)("p",null,"Second one a bit tricky. We add two numbers together, which we'll consider as\nconstant, but for the right part of the expression we take maximum from the left\nand right paths. OK\u2026 So what happens? We evaluate the ",(0,s.kt)("inlineCode",{parentName:"p"},"longestSlideDown")," while\nchoosing the under and right both. They are separate computations though, so we\nare branching from each call of ",(0,s.kt)("inlineCode",{parentName:"p"},"longestSlideDown"),", unless it's a base case."),(0,s.kt)("p",null,"What does that mean for us then? We basically get"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"T"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")"),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mrow",{parentName:"mrow"},(0,s.kt)("mo",{parentName:"mrow",fence:"true"},"{"),(0,s.kt)("mtable",{parentName:"mrow",rowspacing:"0.36em",columnalign:"left left",columnspacing:"1em"},(0,s.kt)("mtr",{parentName:"mtable"},(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"false"},(0,s.kt)("mn",{parentName:"mstyle"},"1"))),(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"false"},(0,s.kt)("mrow",{parentName:"mstyle"},(0,s.kt)("mtext",{parentName:"mrow"},",\xa0if\xa0"),(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mi",{parentName:"mrow"},"r"),(0,s.kt)("mi",{parentName:"mrow"},"o"),(0,s.kt)("mi",{parentName:"mrow"},"w"),(0,s.kt)("mi",{parentName:"mrow"},"s"))))),(0,s.kt)("mtr",{parentName:"mtable"},(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"false"},(0,s.kt)("mrow",{parentName:"mstyle"},(0,s.kt)("mn",{parentName:"mrow"},"1"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mn",{parentName:"mrow"},"2"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"T"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mn",{parentName:"mrow"},"1"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")))),(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"false"},(0,s.kt)("mtext",{parentName:"mstyle"},",\xa0otherwise"))))))),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"T(y) = \\begin{cases} 1 & \\text{, if } y = rows \\\\ 1 + 2 \\cdot T(y + 1) & \\text{, otherwise} \\end{cases}")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.13889em"}},"T"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"3em",verticalAlign:"-1.25em"}}),(0,s.kt)("span",{parentName:"span",className:"minner"},(0,s.kt)("span",{parentName:"span",className:"mopen delimcenter",style:{top:"0em"}},(0,s.kt)("span",{parentName:"span",className:"delimsizing size4"},"{")),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mtable"},(0,s.kt)("span",{parentName:"span",className:"col-align-l"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.69em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.69em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3.008em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord"},"1"))),(0,s.kt)("span",{parentName:"span",style:{top:"-2.25em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3.008em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord"},"1"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.13889em"}},"T"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"1"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.19em"}},(0,s.kt)("span",{parentName:"span"}))))),(0,s.kt)("span",{parentName:"span",className:"arraycolsep",style:{width:"1em"}}),(0,s.kt)("span",{parentName:"span",className:"col-align-l"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.69em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.69em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3.008em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord text"},(0,s.kt)("span",{parentName:"span",className:"mord"},",\xa0if\xa0")),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"ro"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02691em"}},"w"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s"))),(0,s.kt)("span",{parentName:"span",style:{top:"-2.25em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3.008em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord text"},(0,s.kt)("span",{parentName:"span",className:"mord"},",\xa0otherwise"))))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.19em"}},(0,s.kt)("span",{parentName:"span"}))))))),(0,s.kt)("span",{parentName:"span",className:"mclose nulldelimiter"}))))))),(0,s.kt)("p",null,"That looks rather easy to compute, isn't it? If you sum it up, you'll get:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"T"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"r"),(0,s.kt)("mi",{parentName:"mrow"},"o"),(0,s.kt)("mi",{parentName:"mrow"},"w"),(0,s.kt)("mi",{parentName:"mrow"},"s"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")"),(0,s.kt)("mo",{parentName:"mrow"},"\u2208"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("msup",{parentName:"mrow"},(0,s.kt)("mn",{parentName:"msup"},"2"),(0,s.kt)("mrow",{parentName:"msup"},(0,s.kt)("mi",{parentName:"mrow"},"r"),(0,s.kt)("mi",{parentName:"mrow"},"o"),(0,s.kt)("mi",{parentName:"mrow"},"w"),(0,s.kt)("mi",{parentName:"mrow"},"s"))),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"T(rows) \\in \\mathcal{O}(2^{rows})")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.13889em"}},"T"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"ro"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02691em"}},"w"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"\u2208"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord"},"2"),(0,s.kt)("span",{parentName:"span",className:"msupsub"},(0,s.kt)("span",{parentName:"span",className:"vlist-t"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.7144em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.113em",marginRight:"0.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal mtight"},"ro"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal mtight",style:{marginRight:"0.02691em"}},"w"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal mtight"},"s"))))))))),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))))),(0,s.kt)("p",null,"If you wonder why, I'll try to describe it intuitively:"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"In each call to ",(0,s.kt)("inlineCode",{parentName:"li"},"longestSlideDown")," we do some work in constant time,\nregardless of being in the base case. Those are the ",(0,s.kt)("inlineCode",{parentName:"li"},"1"),"s in both cases."),(0,s.kt)("li",{parentName:"ol"},"If we are not in the base case, we move one row down ",(0,s.kt)("strong",{parentName:"li"},"twice"),". That's how we\nobtained ",(0,s.kt)("inlineCode",{parentName:"li"},"2 *")," and ",(0,s.kt)("inlineCode",{parentName:"li"},"y + 1")," in the ",(0,s.kt)("em",{parentName:"li"},"otherwise")," case."),(0,s.kt)("li",{parentName:"ol"},"We move row-by-row, so we move down ",(0,s.kt)("inlineCode",{parentName:"li"},"y"),"-times and each call splits to two\nsubtrees."),(0,s.kt)("li",{parentName:"ol"},"Overall, if we were to represent the calls as a tree, we would get a full\nbinary tree of height ",(0,s.kt)("inlineCode",{parentName:"li"},"y"),", in each node we do some work in constant time,\ntherefore we can just sum the ones.")),(0,s.kt)("admonition",{type:"warning"},(0,s.kt)("p",{parentName:"admonition"},"It would've been more complicated to get an exact result. In the equation above\nwe are assuming that the width of the pyramid is bound by the height.")),(0,s.kt)("p",null,"Hopefully we can agree that this is not the best we can do. \ud83d\ude09"),(0,s.kt)("h2",{id:"greedy-solution"},"Greedy solution"),(0,s.kt)("p",null,"We will try to optimize it a bit. Let's start with a relatively simple ",(0,s.kt)("em",{parentName:"p"},"greedy"),"\napproach."),(0,s.kt)("admonition",{title:"Greedy algorithms",type:"info"},(0,s.kt)("p",{parentName:"admonition"},(0,s.kt)("em",{parentName:"p"},"Greedy algorithms")," can be described as algorithms that decide the action on the\noptimal option at the moment.")),(0,s.kt)("p",null,"We can try to adjust the na\xefve solution. The most problematic part are the\nrecursive calls. Let's apply the greedy approach there:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-java"},"public static int longestSlideDown(int[][] pyramid, int row, int col) {\n if (row == pyramid.length - 1) {\n // BASE: We're at the bottom\n return pyramid[row][col];\n }\n\n if (col + 1 >= pyramid[row + 1].length\n || pyramid[row + 1][col] > pyramid[row + 1][col + 1]) {\n // If we cannot go right or it's not feasible, we continue to the left.\n return pyramid[row][col] + longestSlideDown(pyramid, row + 1, col);\n }\n\n // Otherwise we just move to the right.\n return pyramid[row][col] + longestSlideDown(pyramid, row + 1, col + 1);\n}\n")),(0,s.kt)("p",null,"OK, if we cannot go right ",(0,s.kt)("strong",{parentName:"p"},"or")," the right path adds smaller value to the sum,\nwe simply go left."),(0,s.kt)("h3",{id:"time-complexity-1"},"Time complexity"),(0,s.kt)("p",null,"We have switched from ",(0,s.kt)("em",{parentName:"p"},"adding the maximum")," to ",(0,s.kt)("em",{parentName:"p"},"following the \u201cbigger\u201d path"),", so\nwe improved the time complexity tremendously. We just go down the pyramid all\nthe way to the bottom. Therefore we are getting:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"r"),(0,s.kt)("mi",{parentName:"mrow"},"o"),(0,s.kt)("mi",{parentName:"mrow"},"w"),(0,s.kt)("mi",{parentName:"mrow"},"s"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(rows)")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"ro"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02691em"}},"w"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))))),(0,s.kt)("p",null,"We have managed to convert our exponential solution into a linear one."),(0,s.kt)("h3",{id:"running-the-tests"},"Running the tests"),(0,s.kt)("p",null,"However, if we run the tests, we notice that the second test failed:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"},"Test #1: passed\nTest #2: failed\n")),(0,s.kt)("p",null,"What's going on? Well, we have improved the time complexity, but greedy\nalgorithms are not the ideal solution to ",(0,s.kt)("strong",{parentName:"p"},"all")," problems. In this case there\nmay be a solution that is bigger than the one found using the greedy algorithm."),(0,s.kt)("p",null,"Imagine the following pyramid:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"}," 1\n 2 3\n 5 6 7\n 8 9 10 11\n99 13 14 15 16\n")),(0,s.kt)("p",null,"We start at the top:"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"Current cell: ",(0,s.kt)("inlineCode",{parentName:"li"},"1"),", we can choose from ",(0,s.kt)("inlineCode",{parentName:"li"},"2")," and ",(0,s.kt)("inlineCode",{parentName:"li"},"3"),", ",(0,s.kt)("inlineCode",{parentName:"li"},"3")," looks better, so we\nchoose it."),(0,s.kt)("li",{parentName:"ol"},"Current cell: ",(0,s.kt)("inlineCode",{parentName:"li"},"3"),", we can choose from ",(0,s.kt)("inlineCode",{parentName:"li"},"6")," and ",(0,s.kt)("inlineCode",{parentName:"li"},"7"),", ",(0,s.kt)("inlineCode",{parentName:"li"},"7")," looks better, so we\nchoose it."),(0,s.kt)("li",{parentName:"ol"},"Current cell: ",(0,s.kt)("inlineCode",{parentName:"li"},"7"),", we can choose from ",(0,s.kt)("inlineCode",{parentName:"li"},"10")," and ",(0,s.kt)("inlineCode",{parentName:"li"},"11"),", ",(0,s.kt)("inlineCode",{parentName:"li"},"11")," looks better, so we\nchoose it."),(0,s.kt)("li",{parentName:"ol"},"Current cell: ",(0,s.kt)("inlineCode",{parentName:"li"},"11"),", we can choose from ",(0,s.kt)("inlineCode",{parentName:"li"},"15")," and ",(0,s.kt)("inlineCode",{parentName:"li"},"16"),", ",(0,s.kt)("inlineCode",{parentName:"li"},"16")," looks better, so\nwe choose it.")),(0,s.kt)("p",null,"Our final sum is: ",(0,s.kt)("inlineCode",{parentName:"p"},"1 + 3 + 7 + 11 + 16 = 38"),", but in the bottom left cell we\nhave a ",(0,s.kt)("inlineCode",{parentName:"p"},"99")," that is bigger than our whole sum."),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"Dijkstra's algorithm is a greedy algorithm too, try to think why it is correct.")),(0,s.kt)("h2",{id:"top-down-dp"},"Top-down DP"),(0,s.kt)("p",null,(0,s.kt)("em",{parentName:"p"},"Top-down dynamic programming")," is probably the most common approach, since (at\nleast looks like) is the easiest to implement. The whole point is avoiding the\nunnecessary computations that we have already done."),(0,s.kt)("p",null,"In our case, we can use our na\xefve solution and put a ",(0,s.kt)("em",{parentName:"p"},"cache")," on top of it that\nwill make sure, we don't do unnecessary calculations."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-java"},"// This \u201cstructure\u201d is required, since I have decided to use \u2039TreeMap\u203a which\n// requires the ordering on the keys. It represents one position in the pyramid.\nrecord Position(int row, int col) implements Comparable {\n public int compareTo(Position r) {\n if (row != r.row) {\n return Integer.valueOf(row).compareTo(r.row);\n }\n\n if (col != r.col) {\n return Integer.valueOf(col).compareTo(r.col);\n }\n\n return 0;\n }\n}\n\npublic static int longestSlideDown(\n int[][] pyramid,\n TreeMap cache,\n Position position) {\n int row = position.row;\n int col = position.col;\n\n if (row >= pyramid.length || col < 0 || col >= pyramid[row].length) {\n // BASE: out of bounds\n return Integer.MIN_VALUE;\n }\n\n if (row == pyramid.length - 1) {\n // BASE: bottom of the pyramid\n return pyramid[position.row][position.col];\n }\n\n if (!cache.containsKey(position)) {\n // We haven't computed the position yet, so we run the same \u201cformula\u201d as\n // in the na\xefve version \xbband\xab we put calculated slide into the cache.\n // Next time we want the slide down from given position, it will be just\n // retrieved from the cache.\n int slideDown = Math.max(\n longestSlideDown(pyramid, cache, new Position(row + 1, col)),\n longestSlideDown(pyramid, cache, new Position(row + 1, col + 1)));\n cache.put(position, pyramid[row][col] + slideDown);\n }\n\n return cache.get(position);\n}\n\npublic static int longestSlideDown(int[][] pyramid) {\n // At the beginning we need to create a cache and share it across the calls.\n TreeMap cache = new TreeMap<>();\n return longestSlideDown(pyramid, cache, new Position(0, 0));\n}\n")),(0,s.kt)("p",null,"You have probably noticed that ",(0,s.kt)("inlineCode",{parentName:"p"},"record Position")," have appeared. Since we are\ncaching the already computed values, we need a \u201creasonable\u201d key. In this case we\nshare the cache only for one ",(0,s.kt)("em",{parentName:"p"},"run")," (i.e. pyramid) of the ",(0,s.kt)("inlineCode",{parentName:"p"},"longestSlideDown"),", so\nwe can cache just with the indices within the pyramid, i.e. the ",(0,s.kt)("inlineCode",{parentName:"p"},"Position"),"."),(0,s.kt)("admonition",{title:"Record",type:"tip"},(0,s.kt)("p",{parentName:"admonition"},(0,s.kt)("em",{parentName:"p"},"Record")," is relatively new addition to the Java language. It is basically an\nimmutable structure with implicitly defined ",(0,s.kt)("inlineCode",{parentName:"p"},".equals()"),", ",(0,s.kt)("inlineCode",{parentName:"p"},".hashCode()"),",\n",(0,s.kt)("inlineCode",{parentName:"p"},".toString()")," and getters for the attributes.")),(0,s.kt)("p",null,"Because of the choice of ",(0,s.kt)("inlineCode",{parentName:"p"},"TreeMap"),", we had to additionally define the ordering\non it."),(0,s.kt)("p",null,"In the ",(0,s.kt)("inlineCode",{parentName:"p"},"longestSlideDown")," you can notice that the computation which used to be\nat the end of the na\xefve version above, is now wrapped in an ",(0,s.kt)("inlineCode",{parentName:"p"},"if")," statement that\nchecks for the presence of the position in the cache and computes the slide down\njust when it's needed."),(0,s.kt)("h3",{id:"time-complexity-2"},"Time complexity"),(0,s.kt)("p",null,"If you think that evaluating time complexity for this approach is a bit more\ntricky, you are right. Keeping the cache in mind, it is not the easiest thing\nto do. However there are some observations that might help us figure this out:"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},"Slide down from each position is calculated only once."),(0,s.kt)("li",{parentName:"ol"},"Once calculated, we use the result from the cache.")),(0,s.kt)("p",null,"Knowing this, we still cannot, at least easily, describe the time complexity of\nfinding the best slide down from a specific position, ",(0,s.kt)("strong",{parentName:"p"},"but")," we can bound it\nfrom above for the ",(0,s.kt)("strong",{parentName:"p"},"whole")," run from the top. Now the question is how we can do\nthat!"),(0,s.kt)("p",null,"Overall we are doing the same things for almost",(0,s.kt)("sup",{parentName:"p",id:"fnref-2"},(0,s.kt)("a",{parentName:"sup",href:"#fn-2",className:"footnote-ref"},"2"))," all of the positions within\nthe pyramid:"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("p",{parentName:"li"},"We calculate and store it (using the partial results stored in cache). This\nis done only once."),(0,s.kt)("p",{parentName:"li"},"For each calculation we take 2 values from the cache and insert one value.\nBecause we have chosen ",(0,s.kt)("inlineCode",{parentName:"p"},"TreeMap"),", these 3 operations have logarithmic time\ncomplexity and therefore this step is equivalent to ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"3"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("msub",{parentName:"mrow"},(0,s.kt)("mrow",{parentName:"msub"},(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061")),(0,s.kt)("mn",{parentName:"msub"},"2")),(0,s.kt)("mi",{parentName:"mrow"},"n")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"3 \\cdot \\log_2{n}")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.9386em",verticalAlign:"-0.2441em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"msupsub"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.207em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-2.4559em",marginRight:"0.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.2441em"}},(0,s.kt)("span",{parentName:"span"})))))),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))),"."),(0,s.kt)("p",{parentName:"li"},"However for the sake of simplicity, we are going to account only for the\ninsertion, the reason is rather simple, if we include the 2 retrievals here,\nit will be interleaved with the next step, therefore it is easier to keep the\nretrievals in the following point."),(0,s.kt)("admonition",{parentName:"li",type:"caution"},(0,s.kt)("p",{parentName:"admonition"},"You might have noticed it's still not that easy, cause we're not having full\ncache right from the beginning, but the sum of those logarithms cannot be\nexpressed in a nice way, so taking the upper bound, i.e. expecting the cache\nto be full at all times, is the best option for nice and readable complexity\nof the whole approach.")),(0,s.kt)("p",{parentName:"li"},"Our final upper bound of this work is therefore ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("msub",{parentName:"mrow"},(0,s.kt)("mrow",{parentName:"msub"},(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061")),(0,s.kt)("mn",{parentName:"msub"},"2")),(0,s.kt)("mi",{parentName:"mrow"},"n")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\log_2{n}")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.9386em",verticalAlign:"-0.2441em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"msupsub"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.207em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-2.4559em",marginRight:"0.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.2441em"}},(0,s.kt)("span",{parentName:"span"})))))),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))),".")),(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("p",{parentName:"li"},"We retrieve it from the cache. Same as in first point, but only twice, so we\nget ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mn",{parentName:"mrow"},"2"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("msub",{parentName:"mrow"},(0,s.kt)("mrow",{parentName:"msub"},(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061")),(0,s.kt)("mn",{parentName:"msub"},"2")),(0,s.kt)("mi",{parentName:"mrow"},"n")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"2 \\cdot \\log_2{n}")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.9386em",verticalAlign:"-0.2441em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"msupsub"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.207em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-2.4559em",marginRight:"0.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"2.7em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"2")))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.2441em"}},(0,s.kt)("span",{parentName:"span"})))))),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))),". "),(0,s.kt)("admonition",{parentName:"li",type:"caution"},(0,s.kt)("p",{parentName:"admonition"},"It's done twice because of the ",(0,s.kt)("inlineCode",{parentName:"p"},".containsKey()")," in the ",(0,s.kt)("inlineCode",{parentName:"p"},"if")," condition.")))),(0,s.kt)("p",null,"Okay, we have evaluated work done for each of the cells in the pyramid and now\nwe need to put it together."),(0,s.kt)("p",null,"Let's split the time complexity of our solution into two operands:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"r"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mi",{parentName:"mrow"},"s"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(r + s)")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02778em"}},"r"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))))),(0,s.kt)("p",null,(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"r")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"r")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02778em"}},"r")))))," will represent the ",(0,s.kt)("em",{parentName:"p"},"actual")," calculation of the cells and ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"s")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"s")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s")))))," will represent\nthe additional retrievals on top of the calculation."),(0,s.kt)("p",null,"We calculate the values only ",(0,s.kt)("strong",{parentName:"p"},"once"),", therefore we can safely agree on:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mtable",{parentName:"semantics",rowspacing:"0.25em",columnalign:"right left",columnspacing:"0em"},(0,s.kt)("mtr",{parentName:"mtable"},(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mi",{parentName:"mstyle"},"r"))),(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mrow",{parentName:"mstyle"},(0,s.kt)("mrow",{parentName:"mrow"}),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n")))))),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\begin{align*} r &= n \\cdot \\log{n} \\\\ \\end{align*}")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1.5em",verticalAlign:"-0.5em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mtable"},(0,s.kt)("span",{parentName:"span",className:"col-align-r"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.16em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02778em"}},"r")))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.5em"}},(0,s.kt)("span",{parentName:"span"}))))),(0,s.kt)("span",{parentName:"span",className:"col-align-l"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.16em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord"}),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"))))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"0.5em"}},(0,s.kt)("span",{parentName:"span"})))))))))))),(0,s.kt)("p",null,"What about the ",(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"s")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"s")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s")))))," though? Key observation here is the fact that we have 2\nlookups on the tree in each of them ",(0,s.kt)("strong",{parentName:"p"},"and")," we do it twice, cause each cell has\nat most 2 parents:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mtable",{parentName:"semantics",rowspacing:"0.25em",columnalign:"right left",columnspacing:"0em"},(0,s.kt)("mtr",{parentName:"mtable"},(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mi",{parentName:"mstyle"},"s"))),(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mrow",{parentName:"mstyle"},(0,s.kt)("mrow",{parentName:"mrow"}),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mn",{parentName:"mrow"},"2"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mrow",{parentName:"mrow"},(0,s.kt)("mo",{parentName:"mrow",fence:"true"},"("),(0,s.kt)("mn",{parentName:"mrow"},"2"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",fence:"true"},")")))))),(0,s.kt)("mtr",{parentName:"mtable"},(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mi",{parentName:"mstyle"},"s"))),(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mrow",{parentName:"mstyle"},(0,s.kt)("mrow",{parentName:"mrow"}),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mn",{parentName:"mrow"},"4"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n")))))),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\begin{align*} s &= n \\cdot 2 \\cdot \\left( 2 \\cdot \\log{n} \\right) \\\\ s &= 4 \\cdot n \\cdot \\log{n} \\end{align*}")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"3em",verticalAlign:"-1.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mtable"},(0,s.kt)("span",{parentName:"span",className:"col-align-r"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.75em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.91em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s"))),(0,s.kt)("span",{parentName:"span",style:{top:"-2.41em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s")))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.25em"}},(0,s.kt)("span",{parentName:"span"}))))),(0,s.kt)("span",{parentName:"span",className:"col-align-l"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.75em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.91em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord"}),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"minner"},(0,s.kt)("span",{parentName:"span",className:"mopen delimcenter",style:{top:"0em"}},"("),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")),(0,s.kt)("span",{parentName:"span",className:"mclose delimcenter",style:{top:"0em"}},")")))),(0,s.kt)("span",{parentName:"span",style:{top:"-2.41em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord"}),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"))))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.25em"}},(0,s.kt)("span",{parentName:"span"})))))))))))),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"You might've noticed that lookups actually take more time than the construction\nof the results. This is not entirely true, since we have included the\n",(0,s.kt)("inlineCode",{parentName:"p"},".containsKey()")," and ",(0,s.kt)("inlineCode",{parentName:"p"},".get()")," from the ",(0,s.kt)("inlineCode",{parentName:"p"},"return")," statement in the second part."),(0,s.kt)("p",{parentName:"admonition"},"If we were to represent this more precisely, we could've gone with:"),(0,s.kt)("div",{parentName:"admonition",className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mtable",{parentName:"semantics",rowspacing:"0.25em",columnalign:"right left",columnspacing:"0em"},(0,s.kt)("mtr",{parentName:"mtable"},(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mi",{parentName:"mstyle"},"r"))),(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mrow",{parentName:"mstyle"},(0,s.kt)("mrow",{parentName:"mrow"}),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mn",{parentName:"mrow"},"3"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n"))))),(0,s.kt)("mtr",{parentName:"mtable"},(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mi",{parentName:"mstyle"},"s"))),(0,s.kt)("mtd",{parentName:"mtr"},(0,s.kt)("mstyle",{parentName:"mtd",scriptlevel:"0",displaystyle:"true"},(0,s.kt)("mrow",{parentName:"mstyle"},(0,s.kt)("mrow",{parentName:"mrow"}),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mn",{parentName:"mrow"},"2"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n")))))),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\begin{align*} r &= 3 \\cdot n \\cdot \\log{n} \\\\ s &= 2 \\cdot n \\cdot \\log{n} \\end{align*}")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"3em",verticalAlign:"-1.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mtable"},(0,s.kt)("span",{parentName:"span",className:"col-align-r"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.75em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.91em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02778em"}},"r"))),(0,s.kt)("span",{parentName:"span",style:{top:"-2.41em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s")))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.25em"}},(0,s.kt)("span",{parentName:"span"}))))),(0,s.kt)("span",{parentName:"span",className:"col-align-l"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.75em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-3.91em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord"}),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"3"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))),(0,s.kt)("span",{parentName:"span",style:{top:"-2.41em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord"}),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mrel"},"="),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"))))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.25em"}},(0,s.kt)("span",{parentName:"span"})))))))))))),(0,s.kt)("p",{parentName:"admonition"},"On the other hand we are summing both numbers together, therefore in the end it\ndoesn't really matter."),(0,s.kt)("p",{parentName:"admonition"},"(",(0,s.kt)("em",{parentName:"p"},"Feel free to compare the sums of both \u201csplits\u201d."),")")),(0,s.kt)("p",null,"And so our final time complexity for the whole ",(0,s.kt)("em",{parentName:"p"},"top-down dynamic programming"),"\napproach is:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"r"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mi",{parentName:"mrow"},"s"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")"),(0,s.kt)("mspace",{parentName:"mrow",linebreak:"newline"}),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mn",{parentName:"mrow"},"4"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")"),(0,s.kt)("mspace",{parentName:"mrow",linebreak:"newline"}),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mn",{parentName:"mrow"},"5"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")"),(0,s.kt)("mspace",{parentName:"mrow",linebreak:"newline"}),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow"},"\u22c5"),(0,s.kt)("mi",{parentName:"mrow"},"log"),(0,s.kt)("mo",{parentName:"mrow"},"\u2061"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(r + s) \\\\ \\mathcal{O}(n \\cdot \\log{n} + 4 \\cdot n \\cdot \\log{n}) \\\\ \\mathcal{O}(5 \\cdot n \\cdot \\log{n}) \\\\ \\mathcal{O}(n \\cdot \\log{n})")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02778em"}},"r"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")),(0,s.kt)("span",{parentName:"span",className:"mspace newline"}),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.8889em",verticalAlign:"-0.1944em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6444em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"4"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4445em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")),(0,s.kt)("span",{parentName:"span",className:"mspace newline"}),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord"},"5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4445em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")),(0,s.kt)("span",{parentName:"span",className:"mspace newline"}),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"\u22c5"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mop"},"lo",(0,s.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))))),(0,s.kt)("p",null,"As you can see, this is worse than our ",(0,s.kt)("em",{parentName:"p"},"greedy")," solution that was incorrect, but\nit's better than the ",(0,s.kt)("em",{parentName:"p"},"na\xefve")," one."),(0,s.kt)("h3",{id:"memory-complexity"},"Memory complexity"),(0,s.kt)("p",null,"With this approach we need to talk about the memory complexity too, because we\nhave introduced cache. If you think that the memory complexity is linear to the\ninput, you are right. We start at the top and try to find each and every slide\ndown. At the end we get the final result for ",(0,s.kt)("inlineCode",{parentName:"p"},"new Position(0, 0)"),", so we need to\ncompute everything below."),(0,s.kt)("p",null,"That's how we obtain:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(n)")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))))),(0,s.kt)("p",null,(0,s.kt)("span",{parentName:"p",className:"math math-inline"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow"},"n")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"n")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))," represents the total amount of cells in the pyramid, i.e."),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("munderover",{parentName:"mrow"},(0,s.kt)("mo",{parentName:"munderover"},"\u2211"),(0,s.kt)("mrow",{parentName:"munderover"},(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow"},"="),(0,s.kt)("mn",{parentName:"mrow"},"0")),(0,s.kt)("mrow",{parentName:"munderover"},(0,s.kt)("mrow",{parentName:"mrow"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"p"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"y"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"r"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"a"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"m"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"i"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"d"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"."),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"l"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"e"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"n"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"g"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"t"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"h")),(0,s.kt)("mo",{parentName:"mrow"},"\u2212"),(0,s.kt)("mn",{parentName:"mrow"},"1"))),(0,s.kt)("mrow",{parentName:"mrow"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"p"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"y"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"r"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"a"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"m"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"i"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"d")),(0,s.kt)("mrow",{parentName:"mrow"},(0,s.kt)("mo",{parentName:"mrow",fence:"true"},"["),(0,s.kt)("mi",{parentName:"mrow"},"y"),(0,s.kt)("mo",{parentName:"mrow",fence:"true"},"]")),(0,s.kt)("mrow",{parentName:"mrow"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"."),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"l"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"e"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"n"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"g"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"t"),(0,s.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"h"))),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\sum_{y=0}^{\\mathtt{pyramid.length} - 1} \\mathtt{pyramid}\\left[y\\right]\\mathtt{.length}")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"3.2709em",verticalAlign:"-1.4032em"}}),(0,s.kt)("span",{parentName:"span",className:"mop op-limits"},(0,s.kt)("span",{parentName:"span",className:"vlist-t vlist-t2"},(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.8677em"}},(0,s.kt)("span",{parentName:"span",style:{top:"-1.8829em",marginLeft:"0em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3.05em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mathnormal mtight",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mrel mtight"},"="),(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"0")))),(0,s.kt)("span",{parentName:"span",style:{top:"-3.05em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3.05em"}}),(0,s.kt)("span",{parentName:"span"},(0,s.kt)("span",{parentName:"span",className:"mop op-symbol large-op"},"\u2211"))),(0,s.kt)("span",{parentName:"span",style:{top:"-4.3666em",marginLeft:"0em"}},(0,s.kt)("span",{parentName:"span",className:"pstrut",style:{height:"3.05em"}}),(0,s.kt)("span",{parentName:"span",className:"sizing reset-size6 size3 mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mtight"},(0,s.kt)("span",{parentName:"span",className:"mord mathtt mtight"},"pyramid.length")),(0,s.kt)("span",{parentName:"span",className:"mbin mtight"},"\u2212"),(0,s.kt)("span",{parentName:"span",className:"mord mtight"},"1"))))),(0,s.kt)("span",{parentName:"span",className:"vlist-s"},"\u200b")),(0,s.kt)("span",{parentName:"span",className:"vlist-r"},(0,s.kt)("span",{parentName:"span",className:"vlist",style:{height:"1.4032em"}},(0,s.kt)("span",{parentName:"span"}))))),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathtt"},"pyramid")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"minner"},(0,s.kt)("span",{parentName:"span",className:"mopen delimcenter",style:{top:"0em"}},"["),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.03588em"}},"y"),(0,s.kt)("span",{parentName:"span",className:"mclose delimcenter",style:{top:"0em"}},"]")),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},(0,s.kt)("span",{parentName:"span",className:"mord mathtt"},".length"))))))),(0,s.kt)("admonition",{type:"caution"},(0,s.kt)("p",{parentName:"admonition"},"If you're wondering whether it's correct because of the second ",(0,s.kt)("inlineCode",{parentName:"p"},"if")," in our\nfunction, your guess is right. However we are expressing the complexity in the\nBachmann-Landau notation, so we care about the ",(0,s.kt)("strong",{parentName:"p"},"upper bound"),", not the exact\nnumber.")),(0,s.kt)("admonition",{title:"Can this be optimized?",type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"Yes, it can! Try to think about a way, how can you minimize the memory\ncomplexity of this approach. I'll give you a hint:"),(0,s.kt)("div",{parentName:"admonition",className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"r"),(0,s.kt)("mi",{parentName:"mrow"},"o"),(0,s.kt)("mi",{parentName:"mrow"},"w"),(0,s.kt)("mi",{parentName:"mrow"},"s"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(rows)")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"ro"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02691em"}},"w"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")"))))))),(0,s.kt)("h2",{id:"bottom-up-dp"},"Bottom-up DP"),(0,s.kt)("p",null,"If you try to think in depth about the top-down DP solution, you might notice\nthat the ",(0,s.kt)("em",{parentName:"p"},"core")," of it stands on caching the calculations that have been already\ndone on the lower \u201clevels\u201d of the pyramid. Our bottom-up implementation will be\nusing this fact!"),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"As I have said in the ",(0,s.kt)("em",{parentName:"p"},"top-down DP")," section, it is the easiest way to implement\nDP (unless the cached function has complicated parameters, in that case it might\nget messy)."),(0,s.kt)("p",{parentName:"admonition"},"Bottom-up dynamic programming can be more effective, but may be more complicated\nto implement right from the beginning.")),(0,s.kt)("p",null,"Let's see how we can implement it:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-java"},"public static int longestSlideDown(int[][] pyramid) {\n // In the beginning we declare new array. At this point it is easier to just\n // work with the one dimension, i.e. just allocating the space for the rows.\n int[][] slideDowns = new int[pyramid.length][];\n\n // Bottom row gets just copied, there's nothing else to do\u2026 It's the base\n // case.\n slideDowns[pyramid.length - 1] = Arrays.copyOf(pyramid[pyramid.length - 1],\n pyramid[pyramid.length - 1].length);\n\n // Then we need to propagate the found slide downs for each of the levels\n // above.\n for (int y = pyramid.length - 2; y >= 0; --y) {\n // We start by copying the values lying in the row we're processing.\n // They get included in the final sum and we need to allocate the space\n // for the precalculated slide downs anyways.\n int[] row = Arrays.copyOf(pyramid[y], pyramid[y].length);\n\n // At this we just need to \u201cfetch\u201d the partial results from \u201cneighbours\u201d\n for (int x = 0; x < row.length; ++x) {\n // We look under our position, since we expect the rows to get\n // shorter, we can safely assume such position exists.\n int under = slideDowns[y + 1][x];\n\n // Then we have a look to the right, such position doesn't have to\n // exist, e.g. on the right edge, so we validate the index, and if\n // it doesn't exist, we just assign minimum of the \u2039int\u203a which makes\n // sure that it doesn't get picked in the \u2039Math.max()\u203a call.\n int toRight = x + 1 < slideDowns[y + 1].length\n ? slideDowns[y + 1][x + 1]\n : Integer.MIN_VALUE;\n\n // Finally we add the best choice at this point.\n row[x] += Math.max(under, toRight);\n }\n\n // And save the row we've just calculated partial results for to the\n // \u201ctable\u201d.\n slideDowns[y] = row;\n }\n\n // At the end we can find our seeked slide down at the top cell.\n return slideDowns[0][0];\n}\n")),(0,s.kt)("p",null,"I've tried to explain the code as much as possible within the comments, since it\nmight be more beneficial to see right next to the \u201coffending\u201d lines."),(0,s.kt)("p",null,"As you can see, in this approach we go from the other side",(0,s.kt)("sup",{parentName:"p",id:"fnref-3"},(0,s.kt)("a",{parentName:"sup",href:"#fn-3",className:"footnote-ref"},"3")),", the bottom of\nthe pyramid and propagate the partial results up."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"How is this different from the ",(0,s.kt)("em",{parentName:"mdxAdmonitionTitle"},"greedy")," solution???"),(0,s.kt)("p",{parentName:"admonition"},"If you try to compare them, you might find a very noticable difference. The\ngreedy approach is going from the top to the bottom without ",(0,s.kt)("strong",{parentName:"p"},"any")," knowledge of\nwhat's going on below. On the other hand, bottom-up DP is going from the bottom\n(",(0,s.kt)("em",{parentName:"p"},"DUH\u2026"),") and ",(0,s.kt)("strong",{parentName:"p"},"propagates")," the partial results to the top. The propagation is\nwhat makes sure that at the top I don't choose the best ",(0,s.kt)("strong",{parentName:"p"},"local")," choice, but\nthe best ",(0,s.kt)("strong",{parentName:"p"},"overall")," result I can achieve.")),(0,s.kt)("h3",{id:"time-complexity-3"},"Time complexity"),(0,s.kt)("p",null,"Time complexity of this solution is rather simple. We allocate an array for the\nrows and then for each row, we copy it and adjust the partial results. Doing\nthis we get:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"r"),(0,s.kt)("mi",{parentName:"mrow"},"o"),(0,s.kt)("mi",{parentName:"mrow"},"w"),(0,s.kt)("mi",{parentName:"mrow"},"s"),(0,s.kt)("mo",{parentName:"mrow"},"+"),(0,s.kt)("mn",{parentName:"mrow"},"2"),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(rows + 2n)")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"ro"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.02691em"}},"w"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"s"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,s.kt)("span",{parentName:"span",className:"mbin"},"+"),(0,s.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord"},"2"),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))))),(0,s.kt)("p",null,"Of course, this is an upper bound, since we iterate through the bottom row only\nonce."),(0,s.kt)("h3",{id:"memory-complexity-1"},"Memory complexity"),(0,s.kt)("p",null,"We're allocating an array for the pyramid ",(0,s.kt)("strong",{parentName:"p"},"again")," for our partial results, so\nwe get:"),(0,s.kt)("div",{className:"math math-display"},(0,s.kt)("span",{parentName:"div",className:"katex-display"},(0,s.kt)("span",{parentName:"span",className:"katex"},(0,s.kt)("span",{parentName:"span",className:"katex-mathml"},(0,s.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,s.kt)("semantics",{parentName:"math"},(0,s.kt)("mrow",{parentName:"semantics"},(0,s.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,s.kt)("mi",{parentName:"mrow"},"n"),(0,s.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,s.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(n)")))),(0,s.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,s.kt)("span",{parentName:"span",className:"base"},(0,s.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,s.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,s.kt)("span",{parentName:"span",className:"mopen"},"("),(0,s.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,s.kt)("span",{parentName:"span",className:"mclose"},")")))))),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"If we were writing this in C++ or Rust, we could've avoided that, but not\nreally."),(0,s.kt)("p",{parentName:"admonition"},"C++ would allow us to ",(0,s.kt)("strong",{parentName:"p"},"copy")," the pyramid rightaway into the parameter, so we\nwould be able to directly change it. However it's still a copy, even though we\ndon't need to allocate anything ourselves. It's just implicitly done for us."),(0,s.kt)("p",{parentName:"admonition"},"Rust is more funny in this case. If the pyramids weren't used after the call of\n",(0,s.kt)("inlineCode",{parentName:"p"},"longest_slide_down"),", it would simply ",(0,s.kt)("strong",{parentName:"p"},"move")," them into the functions. If they\nwere used afterwards, the compiler would force you to either borrow it, or\n",(0,s.kt)("em",{parentName:"p"},"clone-and-move")," for the function."),(0,s.kt)("hr",{parentName:"admonition"}),(0,s.kt)("p",{parentName:"admonition"},"Since we're doing it in Java, we get a reference to the ",(0,s.kt)("em",{parentName:"p"},"original")," array and we\ncan't do whatever we want with it.")),(0,s.kt)("h2",{id:"summary"},"Summary"),(0,s.kt)("p",null,"And we've finally reached the end. We have seen 4 different \u201csolutions\u201d",(0,s.kt)("sup",{parentName:"p",id:"fnref-4"},(0,s.kt)("a",{parentName:"sup",href:"#fn-4",className:"footnote-ref"},"4"))," of\nthe same problem using different approaches. Different approaches follow the\norder in which you might come up with them, each approach influences its\nsuccessor and represents the way we can enhance the existing implementation."),(0,s.kt)("hr",null),(0,s.kt)("admonition",{title:"source",type:"info"},(0,s.kt)("p",{parentName:"admonition"},"You can find source code referenced in the text\n",(0,s.kt)("a",{parentName:"p",href:"pathname:///files/ib002/recursion/pyramid-slide-down.tar.gz"},"here"),".")),(0,s.kt)("div",{className:"footnotes"},(0,s.kt)("hr",{parentName:"div"}),(0,s.kt)("ol",{parentName:"div"},(0,s.kt)("li",{parentName:"ol",id:"fn-1"},"cause why not, right!?",(0,s.kt)("a",{parentName:"li",href:"#fnref-1",className:"footnote-backref"},"\u21a9")),(0,s.kt)("li",{parentName:"ol",id:"fn-2"},"except the bottom row",(0,s.kt)("a",{parentName:"li",href:"#fnref-2",className:"footnote-backref"},"\u21a9")),(0,s.kt)("li",{parentName:"ol",id:"fn-3"},"definitely not an RHCP reference \ud83d\ude09",(0,s.kt)("a",{parentName:"li",href:"#fnref-3",className:"footnote-backref"},"\u21a9")),(0,s.kt)("li",{parentName:"ol",id:"fn-4"},"one was not correct, thus the quotes",(0,s.kt)("a",{parentName:"li",href:"#fnref-4",className:"footnote-backref"},"\u21a9")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/82b3b723.fdccb1de.js b/assets/js/82b3b723.fdccb1de.js new file mode 100644 index 0000000..7c8c23d --- /dev/null +++ b/assets/js/82b3b723.fdccb1de.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5787],{6564:i=>{i.exports=JSON.parse('{"label":"dynamic-programming","permalink":"/ib002/tags/dynamic-programming","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"recursion/pyramid-slide-down","title":"Introduction to dynamic programming","description":"Solving a problem in different ways.\\n","permalink":"/ib002/recursion/pyramid-slide-down"}]}')}}]); \ No newline at end of file diff --git a/assets/js/834ed470.690ec9f0.js b/assets/js/834ed470.690ec9f0.js new file mode 100644 index 0000000..8e5c00a --- /dev/null +++ b/assets/js/834ed470.690ec9f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3223],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(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 i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(r),d=o,m=p["".concat(c,".").concat(d)]||p[d]||f[d]||a;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>f,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={id:"ib002-intro",title:"Introduction",slug:"/"},i=void 0,s={unversionedId:"ib002-intro",id:"ib002-intro",title:"Introduction",description:"In this part you can find \u201crandom\u201d additional materials I have written over the",source:"@site/ib002/00-intro-ib002.md",sourceDirName:".",slug:"/",permalink:"/ib002/",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/00-intro-ib002.md",tags:[],version:"current",lastUpdatedAt:1694108971,formattedLastUpdatedAt:"Sep 7, 2023",sidebarPosition:0,frontMatter:{id:"ib002-intro",title:"Introduction",slug:"/"},sidebar:"autogeneratedBar",next:{title:"Algorithms and Correctness",permalink:"/ib002/category/algorithms-and-correctness"}},c={},l=[],u={toc:l},p="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"In this part you can find \u201crandom\u201d additional materials I have written over the\ncourse of teaching ",(0,o.kt)("em",{parentName:"p"},"Algorithms and data structures I"),"."),(0,o.kt)("p",null,"It is a various mix of stuff that may have been produced as a follow-up on some\nquestion asked at the seminar or spontanously."),(0,o.kt)("p",null,"If you have some ideas for posts, please do not hesitate to submit them as issues\nin the linked ",(0,o.kt)("a",{parentName:"p",href:"https://gitlab.fi.muni.cz/xfocko/kb/issues"},"GitLab"),"."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/83bf91d3.21975b05.js b/assets/js/83bf91d3.21975b05.js new file mode 100644 index 0000000..ef97441 --- /dev/null +++ b/assets/js/83bf91d3.21975b05.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7823],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=n(7294);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 o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},h=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),m=p(n),h=a,d=m["".concat(l,".").concat(h)]||m[h]||c[h]||o;return n?r.createElement(d,i(i({ref:t},u),{},{components:n})):r.createElement(d,i({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:a,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const o={title:"Submitting merge requests"},i="Submitting merge requests for review",s={unversionedId:"mr",id:"mr",title:"Submitting merge requests",description:"This tutorial aims to show you how to follow basic git workflow and submit changes",source:"@site/pb071/mr.md",sourceDirName:".",slug:"/mr",permalink:"/pb071/mr",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/mr.md",tags:[],version:"current",lastUpdatedAt:1694108971,formattedLastUpdatedAt:"Sep 7, 2023",frontMatter:{title:"Submitting merge requests"},sidebar:"autogeneratedBar",previous:{title:"Practice exam C",permalink:"/pb071/pexam/cams"}},l={},p=[{value:"Tutorial",id:"tutorial",level:2},{value:"Step #1 - Starting from the clean repository",id:"step-1---starting-from-the-clean-repository",level:3},{value:"Step #2 - Create new branch",id:"step-2---create-new-branch",level:3},{value:"Step #3 - Do the assignment",id:"step-3---do-the-assignment",level:3},{value:"Step #4 - Commit and upload the changes to GitLab",id:"step-4---commit-and-upload-the-changes-to-gitlab",level:3},{value:"Step #5 - Creating a merge request manually",id:"step-5---creating-a-merge-request-manually",level:3},{value:"Step #6 - Set assignees",id:"step-6---set-assignees",level:3},{value:"Step #7 - Return to default branch",id:"step-7---return-to-default-branch",level:3}],u={toc:p},m="wrapper";function c(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"submitting-merge-requests-for-review"},"Submitting merge requests for review"),(0,a.kt)("p",null,"This tutorial aims to show you how to follow basic git workflow and submit changes\nthrough ",(0,a.kt)("em",{parentName:"p"},"Merge Requests")," for review."),(0,a.kt)("p",null,"The rudimentary idea behind aims for changes to be present on a separate branch\nthat is supposedly ",(0,a.kt)("em",{parentName:"p"},"merged")," into the default branch. Till then changes can be reviewed\non ",(0,a.kt)("em",{parentName:"p"},"Merge Request")," and additional changes may be made based on the reviews. Once\nthe changes satisfy requirements, the merge request is merged."),(0,a.kt)("h2",{id:"tutorial"},"Tutorial"),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"Use this tutorial only for bonus assignments ",(0,a.kt)("strong",{parentName:"p"},"made by your tutors")," or in case\nyou need to make up for the absence.")),(0,a.kt)("h3",{id:"step-1---starting-from-the-clean-repository"},"Step #1 - Starting from the clean repository"),(0,a.kt)("p",null,"In your repository (either locally or on aisa) type ",(0,a.kt)("inlineCode",{parentName:"p"},"git status")," and check if your\nrepository is clean and you are present on the main branch (",(0,a.kt)("inlineCode",{parentName:"p"},"master"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"main")," or\n",(0,a.kt)("inlineCode",{parentName:"p"},"trunk"),"). If you do not know what your default branch is, it is probably ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),"\nand you should not be on any other branch."),(0,a.kt)("p",null,"Output of the command should look like this:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"aisa$ git status\nOn branch master # Or main or trunk.\nYour branch is up to date with 'origin/master'.\n\nnothing to commit, working tree clean\n")),(0,a.kt)("blockquote",null,(0,a.kt)("p",{parentName:"blockquote"},"In case you are on different branch or there are uncommitted changes,\n",(0,a.kt)("strong",{parentName:"p"},"do not continue!!!")," Clean your repository (commit the changes or discard\nthem), before you continue.")),(0,a.kt)("h3",{id:"step-2---create-new-branch"},"Step #2 - Create new branch"),(0,a.kt)("p",null,"In your repository write command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"aisa$ git checkout -b BRANCH\nSwitched to a new branch 'BRANCH'\n")),(0,a.kt)("p",null,"Instead of ",(0,a.kt)("inlineCode",{parentName:"p"},"BRANCH")," use some reasonable name for the branch. For example if you\nare working on the seminar from 3rd week, name the branch ",(0,a.kt)("inlineCode",{parentName:"p"},"seminar-03"),"."),(0,a.kt)("h3",{id:"step-3---do-the-assignment"},"Step #3 - Do the assignment"),(0,a.kt)("p",null,"Download the skeleton for the seminar assignment, extract and program. For example\nif you are working on 3rd seminar, you can do so by:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"aisa$ wget https://www.fi.muni.cz/pb071/seminars/seminar-03/pb071-seminar-03.zip\naisa$ unzip pb071-seminar-03.zip\n# Now you should have directory 'seminar-03'.\naisa$ rm pb071-seminar-03.zip\naisa$ cd seminar-03\n# You can work on the assignment.\n")),(0,a.kt)("h3",{id:"step-4---commit-and-upload-the-changes-to-gitlab"},"Step #4 - Commit and upload the changes to GitLab"),(0,a.kt)("p",null,"The same way you ",(0,a.kt)("em",{parentName:"p"},"add")," and ",(0,a.kt)("em",{parentName:"p"},"commit")," files for the homework assignments, you do for\nthe seminar."),(0,a.kt)("p",null,"Now you can upload the changes to GitLab. ",(0,a.kt)("inlineCode",{parentName:"p"},"git push")," is not enough, since repository\non GitLab does not know your new branch. You can solve this by adding arguments:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"aisa$ git push origin BRANCH\n...\nremote: To create a merge request for BRANCH, visit:\nremote: https://gitlab.fi.muni.cz/login/pb071/merge_requests/new?merge_request%5Bsource_branch%5D=BRANCH\n...\n")),(0,a.kt)("p",null,"In the output you should have a link for creating a merge request. If you see this\nlink, open it and skip next step."),(0,a.kt)("h3",{id:"step-5---creating-a-merge-request-manually"},"Step #5 - Creating a merge request manually"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Open your repository on GitLab."),(0,a.kt)("li",{parentName:"ol"},"On the left panel click on ",(0,a.kt)("em",{parentName:"li"},"Merge Requests"),"."),(0,a.kt)("li",{parentName:"ol"},"Click on ",(0,a.kt)("em",{parentName:"li"},"New Merge Request"),"."),(0,a.kt)("li",{parentName:"ol"},"In ",(0,a.kt)("em",{parentName:"li"},"Source branch")," select ",(0,a.kt)("inlineCode",{parentName:"li"},"login/pb071")," and ",(0,a.kt)("inlineCode",{parentName:"li"},"BRANCH"),", which you created."),(0,a.kt)("li",{parentName:"ol"},"In ",(0,a.kt)("em",{parentName:"li"},"Target branch")," select ",(0,a.kt)("inlineCode",{parentName:"li"},"login/pb071")," and your default branch you have seen\nin the output of the first command. (most likely ",(0,a.kt)("inlineCode",{parentName:"li"},"master"),")"),(0,a.kt)("li",{parentName:"ol"},"Click on ",(0,a.kt)("em",{parentName:"li"},"Compare branches and continue"),".")),(0,a.kt)("h3",{id:"step-6---set-assignees"},"Step #6 - Set assignees"),(0,a.kt)("p",null,"On the page that is opened, please check at the top that you are creating merge\nrequest ",(0,a.kt)("strong",{parentName:"p"},"from")," your new branch ",(0,a.kt)("strong",{parentName:"p"},"to")," your default branch (one of ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),", ",(0,a.kt)("inlineCode",{parentName:"p"},"main"),"\nor ",(0,a.kt)("inlineCode",{parentName:"p"},"trunk"),")."),(0,a.kt)("p",null,"Then in the field ",(0,a.kt)("em",{parentName:"p"},"Assignees")," set your tutors based on the seminar group. You can\nuse login for a quick look up."),(0,a.kt)("p",null,"In the end click on ",(0,a.kt)("em",{parentName:"p"},"Submit merge request"),"."),(0,a.kt)("h3",{id:"step-7---return-to-default-branch"},"Step #7 - Return to default branch"),(0,a.kt)("p",null,"Homework assignments can be submitted only from branches specified in the rules\nfor the course. Because of that, before you do anything else, you should switch\nback to your default branch."),(0,a.kt)("p",null,"First of all, same as in step #1, check that your repository is clean with ",(0,a.kt)("inlineCode",{parentName:"p"},"git status"),".\nFor the sake of safety, do not continue without clean repository. Then with command\n",(0,a.kt)("inlineCode",{parentName:"p"},"git checkout BRANCH")," switch to your default branch ",(0,a.kt)("inlineCode",{parentName:"p"},"BRANCH"),"."),(0,a.kt)("p",null,"If you do not know which branch is your default, try ",(0,a.kt)("inlineCode",{parentName:"p"},"git branch")," that outputs all branches in your repository. Default branch is typically ",(0,a.kt)("inlineCode",{parentName:"p"},"master"),", but can\nbe ",(0,a.kt)("inlineCode",{parentName:"p"},"main")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"trunk"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"aisa$ git status\n# Check if repository is clean\n\n# If you know, what is your default branch, you can skip next command.\naisa$ git branch\n# Find the default branch in the list; should be one of the `master`, `main` or\n# `trunk` and you should not have more than one of those.\n# In case the list clears the terminal and you cannot see shell prompt, you can\n# press `q` to quit the pager.\n\naisa$ git checkout master\n")),(0,a.kt)("hr",null),(0,a.kt)("p",null,"Adapted from: ",(0,a.kt)("a",{parentName:"p",href:"https://www.fi.muni.cz/~xlacko1/pb071/mr.html"},"https://www.fi.muni.cz/~xlacko1/pb071/mr.html")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8418981c.3eb99a51.js b/assets/js/8418981c.3eb99a51.js new file mode 100644 index 0000000..6855762 --- /dev/null +++ b/assets/js/8418981c.3eb99a51.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5383],{1930:i=>{i.exports=JSON.parse('{"label":"recursion","permalink":"/ib002/tags/recursion","allTagsPath":"/ib002/tags","count":3,"items":[{"id":"recursion/pyramid-slide-down","title":"Introduction to dynamic programming","description":"Solving a problem in different ways.\\n","permalink":"/ib002/recursion/pyramid-slide-down"},{"id":"recursion/karel-1","title":"Recursion and backtracking with Robot Karel","description":"A problem with too many restrictions.\\n","permalink":"/ib002/recursion/karel-1"},{"id":"time-complexity/extend","title":"Time complexity of \u2039extend\u203a","description":"How to make inefficient algorithm unknowingly.\\n","permalink":"/ib002/time-complexity/extend"}]}')}}]); \ No newline at end of file diff --git a/assets/js/86cd1460.733128af.js b/assets/js/86cd1460.733128af.js new file mode 100644 index 0000000..e267839 --- /dev/null +++ b/assets/js/86cd1460.733128af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1235],{8968:e=>{e.exports=JSON.parse('{"label":"leetcode","permalink":"/blog/tags/leetcode","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/8894.de4803df.js b/assets/js/8894.de4803df.js new file mode 100644 index 0000000..981fb12 --- /dev/null +++ b/assets/js/8894.de4803df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8894],{8894:(e,s,f)=>{f.r(s)}}]); \ No newline at end of file diff --git a/assets/js/8954.296edd99.js b/assets/js/8954.296edd99.js new file mode 100644 index 0000000..64d4492 --- /dev/null +++ b/assets/js/8954.296edd99.js @@ -0,0 +1,2 @@ +/*! For license information please see 8954.296edd99.js.LICENSE.txt */ +(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8954],{7967:(t,e)=>{"use strict";e.Nm=e.Rq=void 0;var n=/^([^\w]*)(javascript|data|vbscript)/im,i=/&#(\w+)(^\w|;)?/g,r=/&(newline|tab);/gi,a=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,s=/^.+(:|:)/gim,o=[".","/"];e.Rq="about:blank",e.Nm=function(t){if(!t)return e.Rq;var c,l=(c=t,c.replace(a,"").replace(i,(function(t,e){return String.fromCharCode(e)}))).replace(r,"").replace(a,"").trim();if(!l)return e.Rq;if(function(t){return o.indexOf(t[0])>-1}(l))return l;var h=l.match(s);if(!h)return l;var u=h[0];return n.test(u)?e.Rq:l}},3905:(t,e,n)=>{"use strict";n.d(e,{Zo:()=>h,kt:()=>f});var i=n(7294);function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function s(t){for(var e=1;e=0||(r[n]=t[n]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(r[n]=t[n])}return r}var c=i.createContext({}),l=function(t){var e=i.useContext(c),n=e;return t&&(n="function"==typeof t?t(e):s(s({},e),t)),n},h=function(t){var e=l(t.components);return i.createElement(c.Provider,{value:e},t.children)},u="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return i.createElement(i.Fragment,{},e)}},p=i.forwardRef((function(t,e){var n=t.components,r=t.mdxType,a=t.originalType,c=t.parentName,h=o(t,["components","mdxType","originalType","parentName"]),u=l(n),p=r,f=u["".concat(c,".").concat(p)]||u[p]||d[p]||a;return n?i.createElement(f,s(s({ref:e},h),{},{components:n})):i.createElement(f,s({ref:e},h))}));function f(t,e){var n=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var a=n.length,s=new Array(a);s[0]=p;var o={};for(var c in e)hasOwnProperty.call(e,c)&&(o[c]=e[c]);o.originalType=t,o[u]="string"==typeof t?t:r,s[1]=o;for(var l=2;l{"use strict";n.d(e,{Z:()=>h});var i=n(7294),r=n(5999),a=n(5281),s=n(7462),o=n(6010);const c={iconEdit:"iconEdit_Z9Sw"};function l(t){let{className:e,...n}=t;return i.createElement("svg",(0,s.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,o.Z)(c.iconEdit,e),"aria-hidden":"true"},n),i.createElement("g",null,i.createElement("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 h(t){let{editUrl:e}=t;return i.createElement("a",{href:e,target:"_blank",rel:"noreferrer noopener",className:a.k.common.editThisPage},i.createElement(l,null),i.createElement(r.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},7955:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(7462),r=n(7294),a=n(6010),s=n(5999),o=n(6668),c=n(9960);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function h(t){let{as:e,id:n,...h}=t;const{navbar:{hideOnScroll:u}}=(0,o.L)();if("h1"===e||!n)return r.createElement(e,(0,i.Z)({},h,{id:void 0}));const d=(0,s.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof h.children?h.children:n});return r.createElement(e,(0,i.Z)({},h,{className:(0,a.Z)("anchor",u?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,h.className),id:n}),h.children,r.createElement(c.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d},"\u200b"))}},1098:(t,e,n)=>{"use strict";n.d(e,{Z:()=>kt});var i=n(7294),r=n(3905),a=n(7462),s=n(5742);var o=n(2389),c=n(6010),l=n(2949),h=n(6668);function u(){const{prism:t}=(0,h.L)(),{colorMode:e}=(0,l.I)(),n=t.theme,i=t.darkTheme||n;return"dark"===e?i:n}var d=n(5281),p=n(7594),f=n.n(p);const g=/title=(?["'])(?.*?)\1/,y=/\{(?<range>[\d,-]+)\}/,m={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function b(t,e){const n=t.map((t=>{const{start:n,end:i}=m[t];return`(?:${n}\\s*(${e.flatMap((t=>[t.line,t.block?.start,t.block?.end].filter(Boolean))).join("|")})\\s*${i})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function _(t,e){let n=t.replace(/\n$/,"");const{language:i,magicComments:r,metastring:a}=e;if(a&&y.test(a)){const t=a.match(y).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const e=r[0].className,i=f()(t).filter((t=>t>0)).map((t=>[t-1,[e]]));return{lineClassNames:Object.fromEntries(i),code:n}}if(void 0===i)return{lineClassNames:{},code:n};const s=function(t,e){switch(t){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],e);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],e);case"html":return b(["js","jsBlock","html"],e);case"python":case"py":case"bash":return b(["bash"],e);case"markdown":case"md":return b(["html","jsx","bash"],e);default:return b(Object.keys(m),e)}}(i,r),o=n.split("\n"),c=Object.fromEntries(r.map((t=>[t.className,{start:0,range:""}]))),l=Object.fromEntries(r.filter((t=>t.line)).map((t=>{let{className:e,line:n}=t;return[n,e]}))),h=Object.fromEntries(r.filter((t=>t.block)).map((t=>{let{className:e,block:n}=t;return[n.start,e]}))),u=Object.fromEntries(r.filter((t=>t.block)).map((t=>{let{className:e,block:n}=t;return[n.end,e]})));for(let p=0;p<o.length;){const t=o[p].match(s);if(!t){p+=1;continue}const e=t.slice(1).find((t=>void 0!==t));l[e]?c[l[e]].range+=`${p},`:h[e]?c[h[e]].start=p:u[e]&&(c[u[e]].range+=`${c[u[e]].start}-${p-1},`),o.splice(p,1)}n=o.join("\n");const d={};return Object.entries(c).forEach((t=>{let[e,{range:n}]=t;f()(n).forEach((t=>{d[t]??=[],d[t].push(e)}))})),{lineClassNames:d,code:n}}const x={codeBlockContainer:"codeBlockContainer_Ckt0"};function v(t){let{as:e,...n}=t;const r=function(t){const e={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(t.plain).forEach((t=>{let[i,r]=t;const a=e[i];a&&"string"==typeof r&&(n[a]=r)})),n}(u());return i.createElement(e,(0,a.Z)({},n,{style:r,className:(0,c.Z)(n.className,x.codeBlockContainer,d.k.common.codeBlock)}))}const k={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function w(t){let{children:e,className:n}=t;return i.createElement(v,{as:"pre",tabIndex:0,className:(0,c.Z)(k.codeBlockStandalone,"thin-scrollbar",n)},i.createElement("code",{className:k.codeBlockLines},e))}var C=n(902);const T={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(t,e){const[n,r]=(0,i.useState)(),a=(0,i.useCallback)((()=>{r(t.current?.closest("[role=tabpanel][hidden]"))}),[t,r]);(0,i.useEffect)((()=>{a()}),[a]),function(t,e,n){void 0===n&&(n=T);const r=(0,C.zX)(e),a=(0,C.Ql)(n);(0,i.useEffect)((()=>{const e=new MutationObserver(r);return t&&e.observe(t,a),()=>e.disconnect()}),[t,r,a])}(n,(t=>{t.forEach((t=>{"attributes"===t.type&&"hidden"===t.attributeName&&(e(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const S={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"}}]};var A={Prism:n(7410).Z,theme:S};function L(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function B(){return B=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},B.apply(this,arguments)}var N=/\r\n|\r|\n/,D=function(t){0===t.length?t.push({types:["plain"],content:"\n",empty:!0}):1===t.length&&""===t[0].content&&(t[0].content="\n",t[0].empty=!0)},O=function(t,e){var n=t.length;return n>0&&t[n-1]===e?t:t.concat(e)};function M(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&-1===e.indexOf(i)&&(n[i]=t[i]);return n}var I=function(t){function e(){for(var e=this,n=[],i=arguments.length;i--;)n[i]=arguments[i];t.apply(this,n),L(this,"getThemeDict",(function(t){if(void 0!==e.themeDict&&t.theme===e.prevTheme&&t.language===e.prevLanguage)return e.themeDict;e.prevTheme=t.theme,e.prevLanguage=t.language;var n=t.theme?function(t,e){var n=t.plain,i=Object.create(null),r=t.styles.reduce((function(t,n){var i=n.languages,r=n.style;return i&&!i.includes(e)||n.types.forEach((function(e){var n=B({},t[e],r);t[e]=n})),t}),i);return r.root=n,r.plain=B({},n,{backgroundColor:null}),r}(t.theme,t.language):void 0;return e.themeDict=n})),L(this,"getLineProps",(function(t){var n=t.key,i=t.className,r=t.style,a=B({},M(t,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),s=e.getThemeDict(e.props);return void 0!==s&&(a.style=s.plain),void 0!==r&&(a.style=void 0!==a.style?B({},a.style,r):r),void 0!==n&&(a.key=n),i&&(a.className+=" "+i),a})),L(this,"getStyleForToken",(function(t){var n=t.types,i=t.empty,r=n.length,a=e.getThemeDict(e.props);if(void 0!==a){if(1===r&&"plain"===n[0])return i?{display:"inline-block"}:void 0;if(1===r&&!i)return a[n[0]];var s=i?{display:"inline-block"}:{},o=n.map((function(t){return a[t]}));return Object.assign.apply(Object,[s].concat(o))}})),L(this,"getTokenProps",(function(t){var n=t.key,i=t.className,r=t.style,a=t.token,s=B({},M(t,["key","className","style","token"]),{className:"token "+a.types.join(" "),children:a.content,style:e.getStyleForToken(a),key:void 0});return void 0!==r&&(s.style=void 0!==s.style?B({},s.style,r):r),void 0!==n&&(s.key=n),i&&(s.className+=" "+i),s})),L(this,"tokenize",(function(t,e,n,i){var r={code:e,grammar:n,language:i,tokens:[]};t.hooks.run("before-tokenize",r);var a=r.tokens=t.tokenize(r.code,r.grammar,r.language);return t.hooks.run("after-tokenize",r),a}))}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.render=function(){var t=this.props,e=t.Prism,n=t.language,i=t.code,r=t.children,a=this.getThemeDict(this.props),s=e.languages[n];return r({tokens:function(t){for(var e=[[]],n=[t],i=[0],r=[t.length],a=0,s=0,o=[],c=[o];s>-1;){for(;(a=i[s]++)<r[s];){var l=void 0,h=e[s],u=n[s][a];if("string"==typeof u?(h=s>0?h:["plain"],l=u):(h=O(h,u.type),u.alias&&(h=O(h,u.alias)),l=u.content),"string"==typeof l){var d=l.split(N),p=d.length;o.push({types:h,content:d[0]});for(var f=1;f<p;f++)D(o),c.push(o=[]),o.push({types:h,content:d[f]})}else s++,e.push(h),n.push(l),i.push(0),r.push(l.length)}s--,e.pop(),n.pop(),i.pop(),r.pop()}return D(o),c}(void 0!==s?this.tokenize(e,i,s,n):[i]),className:"prism-code language-"+n,style:void 0!==a?a.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},e}(i.Component);const F=I,$={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function R(t){let{line:e,classNames:n,showLineNumbers:r,getLineProps:s,getTokenProps:o}=t;1===e.length&&"\n"===e[0].content&&(e[0].content="");const l=s({line:e,className:(0,c.Z)(n,r&&$.codeLine)}),h=e.map(((t,e)=>i.createElement("span",(0,a.Z)({key:e},o({token:t,key:e})))));return i.createElement("span",l,r?i.createElement(i.Fragment,null,i.createElement("span",{className:$.codeLineNumber}),i.createElement("span",{className:$.codeLineContent},h)):h,i.createElement("br",null))}var Z=n(5999);function P(t){return i.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},t),i.createElement("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 j(t){return i.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},t),i.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const Y={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function z(t){let{code:e,className:n}=t;const[r,a]=(0,i.useState)(!1),s=(0,i.useRef)(void 0),o=(0,i.useCallback)((()=>{!function(t,e){let{target:n=document.body}=void 0===e?{}:e;if("string"!=typeof t)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof t}\`.`);const i=document.createElement("textarea"),r=document.activeElement;i.value=t,i.setAttribute("readonly",""),i.style.contain="strict",i.style.position="absolute",i.style.left="-9999px",i.style.fontSize="12pt";const a=document.getSelection(),s=a.rangeCount>0&&a.getRangeAt(0);n.append(i),i.select(),i.selectionStart=0,i.selectionEnd=t.length;let o=!1;try{o=document.execCommand("copy")}catch{}i.remove(),s&&(a.removeAllRanges(),a.addRange(s)),r&&r.focus()}(e),a(!0),s.current=window.setTimeout((()=>{a(!1)}),1e3)}),[e]);return(0,i.useEffect)((()=>()=>window.clearTimeout(s.current)),[]),i.createElement("button",{type:"button","aria-label":r?(0,Z.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,Z.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,Z.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,c.Z)("clean-btn",n,Y.copyButton,r&&Y.copyButtonCopied),onClick:o},i.createElement("span",{className:Y.copyButtonIcons,"aria-hidden":"true"},i.createElement(P,{className:Y.copyButtonIcon}),i.createElement(j,{className:Y.copyButtonSuccessIcon})))}function U(t){return i.createElement("svg",(0,a.Z)({viewBox:"0 0 24 24"},t),i.createElement("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 W={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function q(t){let{className:e,onClick:n,isEnabled:r}=t;const a=(0,Z.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return i.createElement("button",{type:"button",onClick:n,className:(0,c.Z)("clean-btn",e,r&&W.wordWrapButtonEnabled),"aria-label":a,title:a},i.createElement(U,{className:W.wordWrapButtonIcon,"aria-hidden":"true"}))}function H(t){let{children:e,className:n="",metastring:r,title:s,showLineNumbers:o,language:l}=t;const{prism:{defaultLanguage:d,magicComments:p}}=(0,h.L)(),f=l??function(t){const e=t.split(" ").find((t=>t.startsWith("language-")));return e?.replace(/language-/,"")}(n)??d,y=u(),m=function(){const[t,e]=(0,i.useState)(!1),[n,r]=(0,i.useState)(!1),a=(0,i.useRef)(null),s=(0,i.useCallback)((()=>{const n=a.current.querySelector("code");t?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),e((t=>!t))}),[a,t]),o=(0,i.useCallback)((()=>{const{scrollWidth:t,clientWidth:e}=a.current,n=t>e||a.current.querySelector("code").hasAttribute("style");r(n)}),[a]);return E(a,o),(0,i.useEffect)((()=>{o()}),[t,o]),(0,i.useEffect)((()=>(window.addEventListener("resize",o,{passive:!0}),()=>{window.removeEventListener("resize",o)})),[o]),{codeBlockRef:a,isEnabled:t,isCodeScrollable:n,toggle:s}}(),b=function(t){return t?.match(g)?.groups.title??""}(r)||s,{lineClassNames:x,code:w}=_(e,{metastring:r,language:f,magicComments:p}),C=o??function(t){return Boolean(t?.includes("showLineNumbers"))}(r);return i.createElement(v,{as:"div",className:(0,c.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},b&&i.createElement("div",{className:k.codeBlockTitle},b),i.createElement("div",{className:k.codeBlockContent},i.createElement(F,(0,a.Z)({},A,{theme:y,code:w,language:f??"text"}),(t=>{let{className:e,tokens:n,getLineProps:r,getTokenProps:a}=t;return i.createElement("pre",{tabIndex:0,ref:m.codeBlockRef,className:(0,c.Z)(e,k.codeBlock,"thin-scrollbar")},i.createElement("code",{className:(0,c.Z)(k.codeBlockLines,C&&k.codeBlockLinesWithNumbering)},n.map(((t,e)=>i.createElement(R,{key:e,line:t,getLineProps:r,getTokenProps:a,classNames:x[e],showLineNumbers:C})))))})),i.createElement("div",{className:k.buttonGroup},(m.isEnabled||m.isCodeScrollable)&&i.createElement(q,{className:k.codeButton,onClick:()=>m.toggle(),isEnabled:m.isEnabled}),i.createElement(z,{className:k.codeButton,code:w}))))}function V(t){let{children:e,...n}=t;const r=(0,o.Z)(),s=function(t){return i.Children.toArray(t).some((t=>(0,i.isValidElement)(t)))?t:Array.isArray(t)?t.join(""):t}(e),c="string"==typeof s?H:w;return i.createElement(c,(0,a.Z)({key:String(r)},n),s)}var G=n(9960);var X=n(6043);const Q={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function K(t){return!!t&&("SUMMARY"===t.tagName||K(t.parentElement))}function J(t,e){return!!t&&(t===e||J(t.parentElement,e))}function tt(t){let{summary:e,children:n,...r}=t;const s=(0,o.Z)(),l=(0,i.useRef)(null),{collapsed:h,setCollapsed:u}=(0,X.u)({initialState:!r.open}),[d,p]=(0,i.useState)(r.open),f=i.isValidElement(e)?e:i.createElement("summary",null,e??"Details");return i.createElement("details",(0,a.Z)({},r,{ref:l,open:d,"data-collapsed":h,className:(0,c.Z)(Q.details,s&&Q.isBrowser,r.className),onMouseDown:t=>{K(t.target)&&t.detail>1&&t.preventDefault()},onClick:t=>{t.stopPropagation();const e=t.target;K(e)&&J(e,l.current)&&(t.preventDefault(),h?(u(!1),p(!0)):u(!0))}}),f,i.createElement(X.z,{lazy:!1,collapsed:h,disableSSRStyle:!0,onCollapseTransitionEnd:t=>{u(t),p(!t)}},i.createElement("div",{className:Q.collapsibleContent},n)))}const et={details:"details_b_Ee"},nt="alert alert--info";function it(t){let{...e}=t;return i.createElement(tt,(0,a.Z)({},e,{className:(0,c.Z)(nt,et.details,e.className)}))}var rt=n(7955);function at(t){return i.createElement(rt.Z,t)}const st={containsTaskList:"containsTaskList_mC6p"};const ot={img:"img_ev3q"};const ct="admonition_LlT9",lt="admonitionHeading_tbUL",ht="admonitionIcon_kALy",ut="admonitionContent_S0QG";const dt={note:{infimaClassName:"secondary",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 14 16"},i.createElement("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"}))},label:i.createElement(Z.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 12 16"},i.createElement("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"}))},label:i.createElement(Z.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 12 16"},i.createElement("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"}))},label:i.createElement(Z.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 14 16"},i.createElement("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"}))},label:i.createElement(Z.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return i.createElement("svg",{viewBox:"0 0 16 16"},i.createElement("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"}))},label:i.createElement(Z.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},pt={secondary:"note",important:"info",success:"tip",warning:"danger"};function ft(t){const{mdxAdmonitionTitle:e,rest:n}=function(t){const e=i.Children.toArray(t),n=e.find((t=>i.isValidElement(t)&&"mdxAdmonitionTitle"===t.props?.mdxType)),r=i.createElement(i.Fragment,null,e.filter((t=>t!==n)));return{mdxAdmonitionTitle:n,rest:r}}(t.children);return{...t,title:t.title??e,children:n}}function gt(t){let{children:e,fallback:n}=t;return(0,o.Z)()?i.createElement(i.Fragment,null,e?.()):n??null}var yt=n(6432);const mt="docusaurus-mermaid-container";function bt(){const{colorMode:t}=(0,l.I)(),e=(0,h.L)().mermaid,n=e.theme[t],{options:r}=e;return(0,i.useMemo)((()=>({startOnLoad:!1,...r,theme:n})),[n,r])}const _t={container:"container_lyt7"};function xt(t){let{value:e}=t;const n=function(t,e){const n=bt(),r=e??n;return(0,i.useMemo)((()=>{yt.o.mermaidAPI.initialize(r);const e=`mermaid-svg-${Math.round(1e7*Math.random())}`;return yt.o.render(e,t)}),[t,r])}(e);return i.createElement("div",{className:`${mt} ${_t.container}`,dangerouslySetInnerHTML:{__html:n}})}const vt={head:function(t){const e=i.Children.map(t.children,(t=>i.isValidElement(t)?function(t){if(t.props?.mdxType&&t.props.originalType){const{mdxType:e,originalType:n,...r}=t.props;return i.createElement(t.props.originalType,r)}return t}(t):t));return i.createElement(s.Z,t,e)},code:function(t){const e=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return i.Children.toArray(t.children).every((t=>"string"==typeof t&&!t.includes("\n")||(0,i.isValidElement)(t)&&e.includes(t.props?.mdxType)))?i.createElement("code",t):i.createElement(V,t)},a:function(t){return i.createElement(G.Z,t)},pre:function(t){return i.createElement(V,(0,i.isValidElement)(t.children)&&"code"===t.children.props?.originalType?t.children.props:{...t})},details:function(t){const e=i.Children.toArray(t.children),n=e.find((t=>i.isValidElement(t)&&"summary"===t.props?.mdxType)),r=i.createElement(i.Fragment,null,e.filter((t=>t!==n)));return i.createElement(it,(0,a.Z)({},t,{summary:n}),r)},ul:function(t){return i.createElement("ul",(0,a.Z)({},t,{className:(e=t.className,(0,c.Z)(e,e?.includes("contains-task-list")&&st.containsTaskList))}));var e},img:function(t){return i.createElement("img",(0,a.Z)({loading:"lazy"},t,{className:(e=t.className,(0,c.Z)(e,ot.img))}));var e},h1:t=>i.createElement(at,(0,a.Z)({as:"h1"},t)),h2:t=>i.createElement(at,(0,a.Z)({as:"h2"},t)),h3:t=>i.createElement(at,(0,a.Z)({as:"h3"},t)),h4:t=>i.createElement(at,(0,a.Z)({as:"h4"},t)),h5:t=>i.createElement(at,(0,a.Z)({as:"h5"},t)),h6:t=>i.createElement(at,(0,a.Z)({as:"h6"},t)),admonition:function(t){const{children:e,type:n,title:r,icon:a}=ft(t),s=function(t){const e=pt[t]??t,n=dt[e];return n||(console.warn(`No admonition config found for admonition type "${e}". Using Info as fallback.`),dt.info)}(n),o=r??s.label,{iconComponent:l}=s,h=a??i.createElement(l,null);return i.createElement("div",{className:(0,c.Z)(d.k.common.admonition,d.k.common.admonitionType(t.type),"alert",`alert--${s.infimaClassName}`,ct)},i.createElement("div",{className:lt},i.createElement("span",{className:ht},h),o),i.createElement("div",{className:ut},e))},mermaid:function(t){return i.createElement(gt,null,(()=>i.createElement(xt,t)))}};function kt(t){let{children:e}=t;return i.createElement(r.Zo,{components:vt},e)}},2244:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(7294),r=n(6010),a=n(9960);function s(t){const{permalink:e,title:n,subLabel:s,isNext:o}=t;return i.createElement(a.Z,{className:(0,r.Z)("pagination-nav__link",o?"pagination-nav__link--next":"pagination-nav__link--prev"),to:e},s&&i.createElement("div",{className:"pagination-nav__sublabel"},s),i.createElement("div",{className:"pagination-nav__label"},n))}},3008:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(7294),r=n(6010),a=n(9960);const s={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function o(t){let{permalink:e,label:n,count:o}=t;return i.createElement(a.Z,{href:e,className:(0,r.Z)(s.tag,o?s.tagWithCount:s.tagRegular)},n,o&&i.createElement("span",null,o))}},1526:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(7294),r=n(6010),a=n(5999),s=n(3008);const o={tags:"tags_jXut",tag:"tag_QGVx"};function c(t){let{tags:e}=t;return i.createElement(i.Fragment,null,i.createElement("b",null,i.createElement(a.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),i.createElement("ul",{className:(0,r.Z)(o.tags,"padding--none","margin-left--sm")},e.map((t=>{let{label:e,permalink:n}=t;return i.createElement("li",{key:n,className:o.tag},i.createElement(s.Z,{label:e,permalink:n}))}))))}},7484:function(t){t.exports=function(){"use strict";var t=1e3,e=6e4,n=36e5,i="millisecond",r="second",a="minute",s="hour",o="day",c="week",l="month",h="quarter",u="year",d="date",p="Invalid Date",f=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,g=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,y={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var i=String(t);return!i||i.length>=e?t:""+Array(e+1-i.length).join(n)+t},b={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),i=Math.floor(n/60),r=n%60;return(e<=0?"+":"-")+m(i,2,"0")+":"+m(r,2,"0")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var i=12*(n.year()-e.year())+(n.month()-e.month()),r=e.clone().add(i,l),a=n-r<0,s=e.clone().add(i+(a?-1:1),l);return+(-(i+(n-r)/(a?r-s:s-r))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:l,y:u,w:c,d:o,D:d,h:s,m:a,s:r,ms:i,Q:h}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},_="en",x={};x[_]=y;var v=function(t){return t instanceof T},k=function t(e,n,i){var r;if(!e)return _;if("string"==typeof e){var a=e.toLowerCase();x[a]&&(r=a),n&&(x[a]=n,r=a);var s=e.split("-");if(!r&&s.length>1)return t(s[0])}else{var o=e.name;x[o]=e,r=o}return!i&&r&&(_=r),r||!i&&_},w=function(t,e){if(v(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new T(n)},C=b;C.l=k,C.i=v,C.w=function(t,e){return w(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var T=function(){function y(t){this.$L=k(t.locale,null,!0),this.parse(t)}var m=y.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(C.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var i=e.match(f);if(i){var r=i[2]-1||0,a=(i[7]||"0").substring(0,3);return n?new Date(Date.UTC(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,a)):new Date(i[1],r,i[3]||1,i[4]||0,i[5]||0,i[6]||0,a)}}return new Date(e)}(t),this.$x=t.x||{},this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return C},m.isValid=function(){return!(this.$d.toString()===p)},m.isSame=function(t,e){var n=w(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return w(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<w(t)},m.$g=function(t,e,n){return C.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,i=!!C.u(e)||e,h=C.p(t),p=function(t,e){var r=C.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return i?r:r.endOf(o)},f=function(t,e){return C.w(n.toDate()[t].apply(n.toDate("s"),(i?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},g=this.$W,y=this.$M,m=this.$D,b="set"+(this.$u?"UTC":"");switch(h){case u:return i?p(1,0):p(31,11);case l:return i?p(1,y):p(0,y+1);case c:var _=this.$locale().weekStart||0,x=(g<_?g+7:g)-_;return p(i?m-x:m+(6-x),y);case o:case d:return f(b+"Hours",0);case s:return f(b+"Minutes",1);case a:return f(b+"Seconds",2);case r:return f(b+"Milliseconds",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,c=C.p(t),h="set"+(this.$u?"UTC":""),p=(n={},n[o]=h+"Date",n[d]=h+"Date",n[l]=h+"Month",n[u]=h+"FullYear",n[s]=h+"Hours",n[a]=h+"Minutes",n[r]=h+"Seconds",n[i]=h+"Milliseconds",n)[c],f=c===o?this.$D+(e-this.$W):e;if(c===l||c===u){var g=this.clone().set(d,1);g.$d[p](f),g.init(),this.$d=g.set(d,Math.min(this.$D,g.daysInMonth())).$d}else p&&this.$d[p](f);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[C.p(t)]()},m.add=function(i,h){var d,p=this;i=Number(i);var f=C.p(h),g=function(t){var e=w(p);return C.w(e.date(e.date()+Math.round(t*i)),p)};if(f===l)return this.set(l,this.$M+i);if(f===u)return this.set(u,this.$y+i);if(f===o)return g(1);if(f===c)return g(7);var y=(d={},d[a]=e,d[s]=n,d[r]=t,d)[f]||1,m=this.$d.getTime()+i*y;return C.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||p;var i=t||"YYYY-MM-DDTHH:mm:ssZ",r=C.z(this),a=this.$H,s=this.$m,o=this.$M,c=n.weekdays,l=n.months,h=n.meridiem,u=function(t,n,r,a){return t&&(t[n]||t(e,i))||r[n].slice(0,a)},d=function(t){return C.s(a%12||12,t,"0")},f=h||function(t,e,n){var i=t<12?"AM":"PM";return n?i.toLowerCase():i};return i.replace(g,(function(t,i){return i||function(t){switch(t){case"YY":return String(e.$y).slice(-2);case"YYYY":return C.s(e.$y,4,"0");case"M":return o+1;case"MM":return C.s(o+1,2,"0");case"MMM":return u(n.monthsShort,o,l,3);case"MMMM":return u(l,o);case"D":return e.$D;case"DD":return C.s(e.$D,2,"0");case"d":return String(e.$W);case"dd":return u(n.weekdaysMin,e.$W,c,2);case"ddd":return u(n.weekdaysShort,e.$W,c,3);case"dddd":return c[e.$W];case"H":return String(a);case"HH":return C.s(a,2,"0");case"h":return d(1);case"hh":return d(2);case"a":return f(a,s,!0);case"A":return f(a,s,!1);case"m":return String(s);case"mm":return C.s(s,2,"0");case"s":return String(e.$s);case"ss":return C.s(e.$s,2,"0");case"SSS":return C.s(e.$ms,3,"0");case"Z":return r}return null}(t)||r.replace(":","")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(i,d,p){var f,g=this,y=C.p(d),m=w(i),b=(m.utcOffset()-this.utcOffset())*e,_=this-m,x=function(){return C.m(g,m)};switch(y){case u:f=x()/12;break;case l:f=x();break;case h:f=x()/3;break;case c:f=(_-b)/6048e5;break;case o:f=(_-b)/864e5;break;case s:f=_/n;break;case a:f=_/e;break;case r:f=_/t;break;default:f=_}return p?f:C.a(f)},m.daysInMonth=function(){return this.endOf(l).$D},m.$locale=function(){return x[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),i=k(t,e,!0);return i&&(n.$L=i),n},m.clone=function(){return C.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},y}(),E=T.prototype;return w.prototype=E,[["$ms",i],["$s",r],["$m",a],["$H",s],["$W",o],["$M",l],["$y",u],["$D",d]].forEach((function(t){E[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),w.extend=function(t,e){return t.$i||(t(e,T,w),t.$i=!0),w},w.locale=k,w.isDayjs=v,w.unix=function(t){return w(1e3*t)},w.en=x[_],w.Ls=x,w.p={},w}()},8734:function(t){t.exports=function(){"use strict";return function(t,e){var n=e.prototype,i=n.format;n.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return i.bind(this)(t);var r=this.$utils(),a=(t||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(t){switch(t){case"Q":return Math.ceil((e.$M+1)/3);case"Do":return n.ordinal(e.$D);case"gggg":return e.weekYear();case"GGGG":return e.isoWeekYear();case"wo":return n.ordinal(e.week(),"W");case"w":case"ww":return r.s(e.week(),"w"===t?1:2,"0");case"W":case"WW":return r.s(e.isoWeek(),"W"===t?1:2,"0");case"k":case"kk":return r.s(String(0===e.$H?24:e.$H),"k"===t?1:2,"0");case"X":return Math.floor(e.$d.getTime()/1e3);case"x":return e.$d.getTime();case"z":return"["+e.offsetName()+"]";case"zzz":return"["+e.offsetName("long")+"]";default:return t}}));return i.bind(this)(a)}}}()},285:function(t){t.exports=function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d\d/,i=/\d\d?/,r=/\d*[^-_:/,()\s\d]+/,a={},s=function(t){return(t=+t)+(t>68?1900:2e3)},o=function(t){return function(e){this[t]=+e}},c=[/[+-]\d\d:?(\d\d)?|Z/,function(t){(this.zone||(this.zone={})).offset=function(t){if(!t)return 0;if("Z"===t)return 0;var e=t.match(/([+-]|\d\d)/g),n=60*e[1]+(+e[2]||0);return 0===n?0:"+"===e[0]?-n:n}(t)}],l=function(t){var e=a[t];return e&&(e.indexOf?e:e.s.concat(e.f))},h=function(t,e){var n,i=a.meridiem;if(i){for(var r=1;r<=24;r+=1)if(t.indexOf(i(r,0,e))>-1){n=r>12;break}}else n=t===(e?"pm":"PM");return n},u={A:[r,function(t){this.afternoon=h(t,!1)}],a:[r,function(t){this.afternoon=h(t,!0)}],S:[/\d/,function(t){this.milliseconds=100*+t}],SS:[n,function(t){this.milliseconds=10*+t}],SSS:[/\d{3}/,function(t){this.milliseconds=+t}],s:[i,o("seconds")],ss:[i,o("seconds")],m:[i,o("minutes")],mm:[i,o("minutes")],H:[i,o("hours")],h:[i,o("hours")],HH:[i,o("hours")],hh:[i,o("hours")],D:[i,o("day")],DD:[n,o("day")],Do:[r,function(t){var e=a.ordinal,n=t.match(/\d+/);if(this.day=n[0],e)for(var i=1;i<=31;i+=1)e(i).replace(/\[|\]/g,"")===t&&(this.day=i)}],M:[i,o("month")],MM:[n,o("month")],MMM:[r,function(t){var e=l("months"),n=(l("monthsShort")||e.map((function(t){return t.slice(0,3)}))).indexOf(t)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[r,function(t){var e=l("months").indexOf(t)+1;if(e<1)throw new Error;this.month=e%12||e}],Y:[/[+-]?\d+/,o("year")],YY:[n,function(t){this.year=s(t)}],YYYY:[/\d{4}/,o("year")],Z:c,ZZ:c};function d(n){var i,r;i=n,r=a&&a.formats;for(var s=(n=i.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(e,n,i){var a=i&&i.toUpperCase();return n||r[i]||t[i]||r[a].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(t,e,n){return e||n.slice(1)}))}))).match(e),o=s.length,c=0;c<o;c+=1){var l=s[c],h=u[l],d=h&&h[0],p=h&&h[1];s[c]=p?{regex:d,parser:p}:l.replace(/^\[|\]$/g,"")}return function(t){for(var e={},n=0,i=0;n<o;n+=1){var r=s[n];if("string"==typeof r)i+=r.length;else{var a=r.regex,c=r.parser,l=t.slice(i),h=a.exec(l)[0];c.call(e,h),t=t.replace(h,"")}}return function(t){var e=t.afternoon;if(void 0!==e){var n=t.hours;e?n<12&&(t.hours+=12):12===n&&(t.hours=0),delete t.afternoon}}(e),e}}return function(t,e,n){n.p.customParseFormat=!0,t&&t.parseTwoDigitYear&&(s=t.parseTwoDigitYear);var i=e.prototype,r=i.parse;i.parse=function(t){var e=t.date,i=t.utc,s=t.args;this.$u=i;var o=s[1];if("string"==typeof o){var c=!0===s[2],l=!0===s[3],h=c||l,u=s[2];l&&(u=s[2]),a=this.$locale(),!c&&u&&(a=n.Ls[u]),this.$d=function(t,e,n){try{if(["x","X"].indexOf(e)>-1)return new Date(("X"===e?1e3:1)*t);var i=d(e)(t),r=i.year,a=i.month,s=i.day,o=i.hours,c=i.minutes,l=i.seconds,h=i.milliseconds,u=i.zone,p=new Date,f=s||(r||a?1:p.getDate()),g=r||p.getFullYear(),y=0;r&&!a||(y=a>0?a-1:p.getMonth());var m=o||0,b=c||0,_=l||0,x=h||0;return u?new Date(Date.UTC(g,y,f,m,b,_,x+60*u.offset*1e3)):n?new Date(Date.UTC(g,y,f,m,b,_,x)):new Date(g,y,f,m,b,_,x)}catch(t){return new Date("")}}(e,o,i),this.init(),u&&!0!==u&&(this.$L=this.locale(u).$L),h&&e!=this.format(o)&&(this.$d=new Date("")),a={}}else if(o instanceof Array)for(var p=o.length,f=1;f<=p;f+=1){s[1]=o[f-1];var g=n.apply(this,s);if(g.isValid()){this.$d=g.$d,this.$L=g.$L,this.init();break}f===p&&(this.$d=new Date(""))}else r.call(this,t)}}}()},9542:function(t){t.exports=function(){"use strict";var t="day";return function(e,n,i){var r=function(e){return e.add(4-e.isoWeekday(),t)},a=n.prototype;a.isoWeekYear=function(){return r(this).year()},a.isoWeek=function(e){if(!this.$utils().u(e))return this.add(7*(e-this.isoWeek()),t);var n,a,s,o=r(this),c=(n=this.isoWeekYear(),s=4-(a=(this.$u?i.utc:i)().year(n).startOf("year")).isoWeekday(),a.isoWeekday()>4&&(s+=7),a.add(s,t));return o.diff(c,"week")+1},a.isoWeekday=function(t){return this.$utils().u(t)?this.day()||7:this.day(this.day()%7?t:t-7)};var s=a.startOf;a.startOf=function(t,e){var n=this.$utils(),i=!!n.u(e)||e;return"isoweek"===n.p(t)?i?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(t,e)}}}()},7856:function(t){t.exports=function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,n){return e=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},e(t,n)}function n(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function i(t,r,a){return i=n()?Reflect.construct:function(t,n,i){var r=[null];r.push.apply(r,n);var a=new(Function.bind.apply(t,r));return i&&e(a,i.prototype),a},i.apply(null,arguments)}function r(t){return a(t)||s(t)||o(t)||l()}function a(t){if(Array.isArray(t))return c(t)}function s(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}function o(t,e){if(t){if("string"==typeof t)return c(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n<e;n++)i[n]=t[n];return i}function l(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var h=Object.hasOwnProperty,u=Object.setPrototypeOf,d=Object.isFrozen,p=Object.getPrototypeOf,f=Object.getOwnPropertyDescriptor,g=Object.freeze,y=Object.seal,m=Object.create,b="undefined"!=typeof Reflect&&Reflect,_=b.apply,x=b.construct;_||(_=function(t,e,n){return t.apply(e,n)}),g||(g=function(t){return t}),y||(y=function(t){return t}),x||(x=function(t,e){return i(t,r(e))});var v=D(Array.prototype.forEach),k=D(Array.prototype.pop),w=D(Array.prototype.push),C=D(String.prototype.toLowerCase),T=D(String.prototype.toString),E=D(String.prototype.match),S=D(String.prototype.replace),A=D(String.prototype.indexOf),L=D(String.prototype.trim),B=D(RegExp.prototype.test),N=O(TypeError);function D(t){return function(e){for(var n=arguments.length,i=new Array(n>1?n-1:0),r=1;r<n;r++)i[r-1]=arguments[r];return _(t,e,i)}}function O(t){return function(){for(var e=arguments.length,n=new Array(e),i=0;i<e;i++)n[i]=arguments[i];return x(t,n)}}function M(t,e,n){n=n||C,u&&u(t,null);for(var i=e.length;i--;){var r=e[i];if("string"==typeof r){var a=n(r);a!==r&&(d(e)||(e[i]=a),r=a)}t[r]=!0}return t}function I(t){var e,n=m(null);for(e in t)!0===_(h,t,[e])&&(n[e]=t[e]);return n}function F(t,e){for(;null!==t;){var n=f(t,e);if(n){if(n.get)return D(n.get);if("function"==typeof n.value)return D(n.value)}t=p(t)}function i(t){return console.warn("fallback value for",t),null}return i}var $=g(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),R=g(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Z=g(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),P=g(["animate","color-profile","cursor","discard","fedropshadow","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),j=g(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),Y=g(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),z=g(["#text"]),U=g(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),W=g(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),q=g(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),H=g(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),V=y(/\{\{[\w\W]*|[\w\W]*\}\}/gm),G=y(/<%[\w\W]*|[\w\W]*%>/gm),X=y(/\${[\w\W]*}/gm),Q=y(/^data-[\-\w.\u00B7-\uFFFF]/),K=y(/^aria-[\-\w]+$/),J=y(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),tt=y(/^(?:\w+script|data):/i),et=y(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),nt=y(/^html$/i),it=function(){return"undefined"==typeof window?null:window},rt=function(e,n){if("object"!==t(e)||"function"!=typeof e.createPolicy)return null;var i=null,r="data-tt-policy-suffix";n.currentScript&&n.currentScript.hasAttribute(r)&&(i=n.currentScript.getAttribute(r));var a="dompurify"+(i?"#"+i:"");try{return e.createPolicy(a,{createHTML:function(t){return t},createScriptURL:function(t){return t}})}catch(s){return console.warn("TrustedTypes policy "+a+" could not be created."),null}};function at(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:it(),n=function(t){return at(t)};if(n.version="2.4.3",n.removed=[],!e||!e.document||9!==e.document.nodeType)return n.isSupported=!1,n;var i=e.document,a=e.document,s=e.DocumentFragment,o=e.HTMLTemplateElement,c=e.Node,l=e.Element,h=e.NodeFilter,u=e.NamedNodeMap,d=void 0===u?e.NamedNodeMap||e.MozNamedAttrMap:u,p=e.HTMLFormElement,f=e.DOMParser,y=e.trustedTypes,m=l.prototype,b=F(m,"cloneNode"),_=F(m,"nextSibling"),x=F(m,"childNodes"),D=F(m,"parentNode");if("function"==typeof o){var O=a.createElement("template");O.content&&O.content.ownerDocument&&(a=O.content.ownerDocument)}var st=rt(y,i),ot=st?st.createHTML(""):"",ct=a,lt=ct.implementation,ht=ct.createNodeIterator,ut=ct.createDocumentFragment,dt=ct.getElementsByTagName,pt=i.importNode,ft={};try{ft=I(a).documentMode?a.documentMode:{}}catch(De){}var gt={};n.isSupported="function"==typeof D&<&&void 0!==lt.createHTMLDocument&&9!==ft;var yt,mt,bt=V,_t=G,xt=X,vt=Q,kt=K,wt=tt,Ct=et,Tt=J,Et=null,St=M({},[].concat(r($),r(R),r(Z),r(j),r(z))),At=null,Lt=M({},[].concat(r(U),r(W),r(q),r(H))),Bt=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Nt=null,Dt=null,Ot=!0,Mt=!0,It=!1,Ft=!1,$t=!1,Rt=!1,Zt=!1,Pt=!1,jt=!1,Yt=!1,zt=!0,Ut=!1,Wt="user-content-",qt=!0,Ht=!1,Vt={},Gt=null,Xt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Qt=null,Kt=M({},["audio","video","img","source","image","track"]),Jt=null,te=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ee="http://www.w3.org/1998/Math/MathML",ne="http://www.w3.org/2000/svg",ie="http://www.w3.org/1999/xhtml",re=ie,ae=!1,se=null,oe=M({},[ee,ne,ie],T),ce=["application/xhtml+xml","text/html"],le="text/html",he=null,ue=a.createElement("form"),de=function(t){return t instanceof RegExp||t instanceof Function},pe=function(e){he&&he===e||(e&&"object"===t(e)||(e={}),e=I(e),yt=yt=-1===ce.indexOf(e.PARSER_MEDIA_TYPE)?le:e.PARSER_MEDIA_TYPE,mt="application/xhtml+xml"===yt?T:C,Et="ALLOWED_TAGS"in e?M({},e.ALLOWED_TAGS,mt):St,At="ALLOWED_ATTR"in e?M({},e.ALLOWED_ATTR,mt):Lt,se="ALLOWED_NAMESPACES"in e?M({},e.ALLOWED_NAMESPACES,T):oe,Jt="ADD_URI_SAFE_ATTR"in e?M(I(te),e.ADD_URI_SAFE_ATTR,mt):te,Qt="ADD_DATA_URI_TAGS"in e?M(I(Kt),e.ADD_DATA_URI_TAGS,mt):Kt,Gt="FORBID_CONTENTS"in e?M({},e.FORBID_CONTENTS,mt):Xt,Nt="FORBID_TAGS"in e?M({},e.FORBID_TAGS,mt):{},Dt="FORBID_ATTR"in e?M({},e.FORBID_ATTR,mt):{},Vt="USE_PROFILES"in e&&e.USE_PROFILES,Ot=!1!==e.ALLOW_ARIA_ATTR,Mt=!1!==e.ALLOW_DATA_ATTR,It=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Ft=e.SAFE_FOR_TEMPLATES||!1,$t=e.WHOLE_DOCUMENT||!1,Pt=e.RETURN_DOM||!1,jt=e.RETURN_DOM_FRAGMENT||!1,Yt=e.RETURN_TRUSTED_TYPE||!1,Zt=e.FORCE_BODY||!1,zt=!1!==e.SANITIZE_DOM,Ut=e.SANITIZE_NAMED_PROPS||!1,qt=!1!==e.KEEP_CONTENT,Ht=e.IN_PLACE||!1,Tt=e.ALLOWED_URI_REGEXP||Tt,re=e.NAMESPACE||ie,e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Bt.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&de(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Bt.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Bt.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ft&&(Mt=!1),jt&&(Pt=!0),Vt&&(Et=M({},r(z)),At=[],!0===Vt.html&&(M(Et,$),M(At,U)),!0===Vt.svg&&(M(Et,R),M(At,W),M(At,H)),!0===Vt.svgFilters&&(M(Et,Z),M(At,W),M(At,H)),!0===Vt.mathMl&&(M(Et,j),M(At,q),M(At,H))),e.ADD_TAGS&&(Et===St&&(Et=I(Et)),M(Et,e.ADD_TAGS,mt)),e.ADD_ATTR&&(At===Lt&&(At=I(At)),M(At,e.ADD_ATTR,mt)),e.ADD_URI_SAFE_ATTR&&M(Jt,e.ADD_URI_SAFE_ATTR,mt),e.FORBID_CONTENTS&&(Gt===Xt&&(Gt=I(Gt)),M(Gt,e.FORBID_CONTENTS,mt)),qt&&(Et["#text"]=!0),$t&&M(Et,["html","head","body"]),Et.table&&(M(Et,["tbody"]),delete Nt.tbody),g&&g(e),he=e)},fe=M({},["mi","mo","mn","ms","mtext"]),ge=M({},["foreignobject","desc","title","annotation-xml"]),ye=M({},["title","style","font","a","script"]),me=M({},R);M(me,Z),M(me,P);var be=M({},j);M(be,Y);var _e=function(t){var e=D(t);e&&e.tagName||(e={namespaceURI:re,tagName:"template"});var n=C(t.tagName),i=C(e.tagName);return!!se[t.namespaceURI]&&(t.namespaceURI===ne?e.namespaceURI===ie?"svg"===n:e.namespaceURI===ee?"svg"===n&&("annotation-xml"===i||fe[i]):Boolean(me[n]):t.namespaceURI===ee?e.namespaceURI===ie?"math"===n:e.namespaceURI===ne?"math"===n&&ge[i]:Boolean(be[n]):t.namespaceURI===ie?!(e.namespaceURI===ne&&!ge[i])&&!(e.namespaceURI===ee&&!fe[i])&&!be[n]&&(ye[n]||!me[n]):!("application/xhtml+xml"!==yt||!se[t.namespaceURI]))},xe=function(t){w(n.removed,{element:t});try{t.parentNode.removeChild(t)}catch(De){try{t.outerHTML=ot}catch(De){t.remove()}}},ve=function(t,e){try{w(n.removed,{attribute:e.getAttributeNode(t),from:e})}catch(De){w(n.removed,{attribute:null,from:e})}if(e.removeAttribute(t),"is"===t&&!At[t])if(Pt||jt)try{xe(e)}catch(De){}else try{e.setAttribute(t,"")}catch(De){}},ke=function(t){var e,n;if(Zt)t="<remove></remove>"+t;else{var i=E(t,/^[\r\n\t ]+/);n=i&&i[0]}"application/xhtml+xml"===yt&&re===ie&&(t='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+t+"</body></html>");var r=st?st.createHTML(t):t;if(re===ie)try{e=(new f).parseFromString(r,yt)}catch(De){}if(!e||!e.documentElement){e=lt.createDocument(re,"template",null);try{e.documentElement.innerHTML=ae?ot:r}catch(De){}}var s=e.body||e.documentElement;return t&&n&&s.insertBefore(a.createTextNode(n),s.childNodes[0]||null),re===ie?dt.call(e,$t?"html":"body")[0]:$t?e.documentElement:s},we=function(t){return ht.call(t.ownerDocument||t,t,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT,null,!1)},Ce=function(t){return t instanceof p&&("string"!=typeof t.nodeName||"string"!=typeof t.textContent||"function"!=typeof t.removeChild||!(t.attributes instanceof d)||"function"!=typeof t.removeAttribute||"function"!=typeof t.setAttribute||"string"!=typeof t.namespaceURI||"function"!=typeof t.insertBefore||"function"!=typeof t.hasChildNodes)},Te=function(e){return"object"===t(c)?e instanceof c:e&&"object"===t(e)&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},Ee=function(t,e,i){gt[t]&&v(gt[t],(function(t){t.call(n,e,i,he)}))},Se=function(t){var e;if(Ee("beforeSanitizeElements",t,null),Ce(t))return xe(t),!0;if(B(/[\u0080-\uFFFF]/,t.nodeName))return xe(t),!0;var i=mt(t.nodeName);if(Ee("uponSanitizeElement",t,{tagName:i,allowedTags:Et}),t.hasChildNodes()&&!Te(t.firstElementChild)&&(!Te(t.content)||!Te(t.content.firstElementChild))&&B(/<[/\w]/g,t.innerHTML)&&B(/<[/\w]/g,t.textContent))return xe(t),!0;if("select"===i&&B(/<template/i,t.innerHTML))return xe(t),!0;if(!Et[i]||Nt[i]){if(!Nt[i]&&Le(i)){if(Bt.tagNameCheck instanceof RegExp&&B(Bt.tagNameCheck,i))return!1;if(Bt.tagNameCheck instanceof Function&&Bt.tagNameCheck(i))return!1}if(qt&&!Gt[i]){var r=D(t)||t.parentNode,a=x(t)||t.childNodes;if(a&&r)for(var s=a.length-1;s>=0;--s)r.insertBefore(b(a[s],!0),_(t))}return xe(t),!0}return t instanceof l&&!_e(t)?(xe(t),!0):"noscript"!==i&&"noembed"!==i||!B(/<\/no(script|embed)/i,t.innerHTML)?(Ft&&3===t.nodeType&&(e=t.textContent,e=S(e,bt," "),e=S(e,_t," "),e=S(e,xt," "),t.textContent!==e&&(w(n.removed,{element:t.cloneNode()}),t.textContent=e)),Ee("afterSanitizeElements",t,null),!1):(xe(t),!0)},Ae=function(t,e,n){if(zt&&("id"===e||"name"===e)&&(n in a||n in ue))return!1;if(Mt&&!Dt[e]&&B(vt,e));else if(Ot&&B(kt,e));else if(!At[e]||Dt[e]){if(!(Le(t)&&(Bt.tagNameCheck instanceof RegExp&&B(Bt.tagNameCheck,t)||Bt.tagNameCheck instanceof Function&&Bt.tagNameCheck(t))&&(Bt.attributeNameCheck instanceof RegExp&&B(Bt.attributeNameCheck,e)||Bt.attributeNameCheck instanceof Function&&Bt.attributeNameCheck(e))||"is"===e&&Bt.allowCustomizedBuiltInElements&&(Bt.tagNameCheck instanceof RegExp&&B(Bt.tagNameCheck,n)||Bt.tagNameCheck instanceof Function&&Bt.tagNameCheck(n))))return!1}else if(Jt[e]);else if(B(Tt,S(n,Ct,"")));else if("src"!==e&&"xlink:href"!==e&&"href"!==e||"script"===t||0!==A(n,"data:")||!Qt[t])if(It&&!B(wt,S(n,Ct,"")));else if(n)return!1;return!0},Le=function(t){return t.indexOf("-")>0},Be=function(e){var i,r,a,s;Ee("beforeSanitizeAttributes",e,null);var o=e.attributes;if(o){var c={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:At};for(s=o.length;s--;){var l=i=o[s],h=l.name,u=l.namespaceURI;if(r="value"===h?i.value:L(i.value),a=mt(h),c.attrName=a,c.attrValue=r,c.keepAttr=!0,c.forceKeepAttr=void 0,Ee("uponSanitizeAttribute",e,c),r=c.attrValue,!c.forceKeepAttr&&(ve(h,e),c.keepAttr))if(B(/\/>/i,r))ve(h,e);else{Ft&&(r=S(r,bt," "),r=S(r,_t," "),r=S(r,xt," "));var d=mt(e.nodeName);if(Ae(d,a,r)){if(!Ut||"id"!==a&&"name"!==a||(ve(h,e),r=Wt+r),st&&"object"===t(y)&&"function"==typeof y.getAttributeType)if(u);else switch(y.getAttributeType(d,a)){case"TrustedHTML":r=st.createHTML(r);break;case"TrustedScriptURL":r=st.createScriptURL(r)}try{u?e.setAttributeNS(u,h,r):e.setAttribute(h,r),k(n.removed)}catch(De){}}}}Ee("afterSanitizeAttributes",e,null)}},Ne=function t(e){var n,i=we(e);for(Ee("beforeSanitizeShadowDOM",e,null);n=i.nextNode();)Ee("uponSanitizeShadowNode",n,null),Se(n)||(n.content instanceof s&&t(n.content),Be(n));Ee("afterSanitizeShadowDOM",e,null)};return n.sanitize=function(r){var a,o,l,h,u,d=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((ae=!r)&&(r="\x3c!--\x3e"),"string"!=typeof r&&!Te(r)){if("function"!=typeof r.toString)throw N("toString is not a function");if("string"!=typeof(r=r.toString()))throw N("dirty is not a string, aborting")}if(!n.isSupported){if("object"===t(e.toStaticHTML)||"function"==typeof e.toStaticHTML){if("string"==typeof r)return e.toStaticHTML(r);if(Te(r))return e.toStaticHTML(r.outerHTML)}return r}if(Rt||pe(d),n.removed=[],"string"==typeof r&&(Ht=!1),Ht){if(r.nodeName){var p=mt(r.nodeName);if(!Et[p]||Nt[p])throw N("root node is forbidden and cannot be sanitized in-place")}}else if(r instanceof c)1===(o=(a=ke("\x3c!----\x3e")).ownerDocument.importNode(r,!0)).nodeType&&"BODY"===o.nodeName||"HTML"===o.nodeName?a=o:a.appendChild(o);else{if(!Pt&&!Ft&&!$t&&-1===r.indexOf("<"))return st&&Yt?st.createHTML(r):r;if(!(a=ke(r)))return Pt?null:Yt?ot:""}a&&Zt&&xe(a.firstChild);for(var f=we(Ht?r:a);l=f.nextNode();)3===l.nodeType&&l===h||Se(l)||(l.content instanceof s&&Ne(l.content),Be(l),h=l);if(h=null,Ht)return r;if(Pt){if(jt)for(u=ut.call(a.ownerDocument);a.firstChild;)u.appendChild(a.firstChild);else u=a;return At.shadowroot&&(u=pt.call(i,u,!0)),u}var g=$t?a.outerHTML:a.innerHTML;return $t&&Et["!doctype"]&&a.ownerDocument&&a.ownerDocument.doctype&&a.ownerDocument.doctype.name&&B(nt,a.ownerDocument.doctype.name)&&(g="<!DOCTYPE "+a.ownerDocument.doctype.name+">\n"+g),Ft&&(g=S(g,bt," "),g=S(g,_t," "),g=S(g,xt," ")),st&&Yt?st.createHTML(g):g},n.setConfig=function(t){pe(t),Rt=!0},n.clearConfig=function(){he=null,Rt=!1},n.isValidAttribute=function(t,e,n){he||pe({});var i=mt(t),r=mt(e);return Ae(i,r,n)},n.addHook=function(t,e){"function"==typeof e&&(gt[t]=gt[t]||[],w(gt[t],e))},n.removeHook=function(t){if(gt[t])return k(gt[t])},n.removeHooks=function(t){gt[t]&&(gt[t]=[])},n.removeAllHooks=function(){gt={}},n}return at()}()},6432:(t,e,n)=>{"use strict";n.d(e,{a:()=>Un,b:()=>qs,c:()=>jt,d:()=>Yn,e:()=>Zt,f:()=>Ks,g:()=>gi,h:()=>Sc,i:()=>xs,j:()=>Xi,k:()=>Ki,l:()=>Bt,m:()=>Yi,n:()=>It,o:()=>Np,p:()=>Ao,s:()=>wi});const i=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];var i=Array.from("string"==typeof t?[t]:t);i[i.length-1]=i[i.length-1].replace(/\r?\n([\t ]*)$/,"");var r=i.reduce((function(t,e){var n=e.match(/\n([\t ]+|(?!\s).)/g);return n?t.concat(n.map((function(t){var e,n;return null!==(n=null===(e=t.match(/[\t ]/g))||void 0===e?void 0:e.length)&&void 0!==n?n:0}))):t}),[]);if(r.length){var a=new RegExp("\n[\t ]{"+Math.min.apply(Math,r)+"}","g");i=i.map((function(t){return t.replace(a,"\n")}))}i[0]=i[0].replace(/^\r?\n/,"");var s=i[0];return e.forEach((function(t,e){var n=s.match(/(?:^|\n)( *)$/),r=n?n[1]:"",a=t;"string"==typeof t&&t.includes("\n")&&(a=String(t).split("\n").map((function(t,e){return 0===e?t:""+r+t})).join("\n")),s+=a+i[e+1]})),s};var r=n(7484),a=n.n(r),s=n(7967),o=n(9373),l=n(7856),h=n.n(l),u=n(1610),d=n(1691);const p=(t,e)=>{const n=u.Z.parse(t);for(const i in e)n[i]=d.Z.channel.clamp[i](e[i]);return u.Z.stringify(n)},f=(t,e)=>{const n=u.Z.parse(t),i={};for(const r in e)e[r]&&(i[r]=n[r]+e[r]);return p(t,i)};var g=n(1883);const y=(t,e,n=0,i=1)=>{if("number"!=typeof t)return p(t,{a:e});const r=g.Z.set({r:d.Z.channel.clamp.r(t),g:d.Z.channel.clamp.g(e),b:d.Z.channel.clamp.b(n),a:d.Z.channel.clamp.a(i)});return u.Z.stringify(r)},m=(t,e,n=50)=>{const{r:i,g:r,b:a,a:s}=u.Z.parse(t),{r:o,g:c,b:l,a:h}=u.Z.parse(e),d=n/100,p=2*d-1,f=s-h,g=((p*f==-1?p:(p+f)/(1+p*f))+1)/2,m=1-g;return y(i*g+o*m,r*g+c*m,a*g+l*m,s*d+h*(1-d))},b=(t,e=100)=>{const n=u.Z.parse(t);return n.r=255-n.r,n.g=255-n.g,n.b=255-n.b,m(n,t,e)};var _=n(7201),x=n(5920),v=n(2454),k="comm",w="rule",C="decl",T=Math.abs,E=String.fromCharCode;Object.assign;function S(t){return t.trim()}function A(t,e,n){return t.replace(e,n)}function L(t,e){return t.indexOf(e)}function B(t,e){return 0|t.charCodeAt(e)}function N(t,e,n){return t.slice(e,n)}function D(t){return t.length}function O(t,e){return e.push(t),t}function M(t,e){for(var n="",i=0;i<t.length;i++)n+=e(t[i],i,t,e)||"";return n}function I(t,e,n,i){switch(t.type){case"@layer":if(t.children.length)break;case"@import":case C:return t.return=t.return||t.value;case k:return"";case"@keyframes":return t.return=t.value+"{"+M(t.children,i)+"}";case w:if(!D(t.value=t.props.join(",")))return""}return D(n=M(t.children,i))?t.return=t.value+"{"+n+"}":""}var F=1,$=1,R=0,Z=0,P=0,j="";function Y(t,e,n,i,r,a,s,o){return{value:t,root:e,parent:n,type:i,props:r,children:a,line:F,column:$,length:s,return:"",siblings:o}}function z(){return P=Z>0?B(j,--Z):0,$--,10===P&&($=1,F--),P}function U(){return P=Z<R?B(j,Z++):0,$++,10===P&&($=1,F++),P}function W(){return B(j,Z)}function q(){return Z}function H(t,e){return N(j,t,e)}function V(t){switch(t){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function G(t){return F=$=1,R=D(j=t),Z=0,[]}function X(t){return j="",t}function Q(t){return S(H(Z-1,tt(91===t?t+2:40===t?t+1:t)))}function K(t){for(;(P=W())&&P<33;)U();return V(t)>2||V(P)>3?"":" "}function J(t,e){for(;--e&&U()&&!(P<48||P>102||P>57&&P<65||P>70&&P<97););return H(t,q()+(e<6&&32==W()&&32==U()))}function tt(t){for(;U();)switch(P){case t:return Z;case 34:case 39:34!==t&&39!==t&&tt(P);break;case 40:41===t&&tt(t);break;case 92:U()}return Z}function et(t,e){for(;U()&&t+P!==57&&(t+P!==84||47!==W()););return"/*"+H(e,Z-1)+"*"+E(47===t?t:U())}function nt(t){for(;!V(W());)U();return H(t,Z)}function it(t){return X(rt("",null,null,null,[""],t=G(t),0,[0],t))}function rt(t,e,n,i,r,a,s,o,c){for(var l=0,h=0,u=s,d=0,p=0,f=0,g=1,y=1,m=1,b=0,_="",x=r,v=a,k=i,w=_;y;)switch(f=b,b=U()){case 40:if(108!=f&&58==B(w,u-1)){-1!=L(w+=A(Q(b),"&","&\f"),"&\f")&&(m=-1);break}case 34:case 39:case 91:w+=Q(b);break;case 9:case 10:case 13:case 32:w+=K(f);break;case 92:w+=J(q()-1,7);continue;case 47:switch(W()){case 42:case 47:O(st(et(U(),q()),e,n,c),c);break;default:w+="/"}break;case 123*g:o[l++]=D(w)*m;case 125*g:case 59:case 0:switch(b){case 0:case 125:y=0;case 59+h:-1==m&&(w=A(w,/\f/g,"")),p>0&&D(w)-u&&O(p>32?ot(w+";",i,n,u-1,c):ot(A(w," ","")+";",i,n,u-2,c),c);break;case 59:w+=";";default:if(O(k=at(w,e,n,l,h,r,o,_,x=[],v=[],u,a),a),123===b)if(0===h)rt(w,e,k,k,x,a,u,o,v);else switch(99===d&&110===B(w,3)?100:d){case 100:case 108:case 109:case 115:rt(t,k,k,i&&O(at(t,k,k,0,0,r,o,_,r,x=[],u,v),v),r,v,u,o,i?x:v);break;default:rt(w,k,k,k,[""],v,0,o,v)}}l=h=p=0,g=m=1,_=w="",u=s;break;case 58:u=1+D(w),p=f;default:if(g<1)if(123==b)--g;else if(125==b&&0==g++&&125==z())continue;switch(w+=E(b),b*g){case 38:m=h>0?1:(w+="\f",-1);break;case 44:o[l++]=(D(w)-1)*m,m=1;break;case 64:45===W()&&(w+=Q(U())),d=W(),h=u=D(_=w+=nt(q())),b++;break;case 45:45===f&&2==D(w)&&(g=0)}}return a}function at(t,e,n,i,r,a,s,o,c,l,h,u){for(var d=r-1,p=0===r?a:[""],f=function(t){return t.length}(p),g=0,y=0,m=0;g<i;++g)for(var b=0,_=N(t,d+1,d=T(y=s[g])),x=t;b<f;++b)(x=S(y>0?p[b]+" "+_:A(_,/&\f/g,p[b])))&&(c[m++]=x);return Y(t,e,n,0===r?w:o,c,l,h,u)}function st(t,e,n,i){return Y(t,e,n,k,E(P),N(t,2,-2),0,i)}function ot(t,e,n,i,r){return Y(t,e,n,C,N(t,0,i),N(t,i+1,-1),i,r)}var ct=n(277),lt=n(5625),ht=n(9354);const ut=[];for(let c=0;c<256;++c)ut.push((c+256).toString(16).slice(1));function dt(t,e=0){return(ut[t[e+0]]+ut[t[e+1]]+ut[t[e+2]]+ut[t[e+3]]+"-"+ut[t[e+4]]+ut[t[e+5]]+"-"+ut[t[e+6]]+ut[t[e+7]]+"-"+ut[t[e+8]]+ut[t[e+9]]+"-"+ut[t[e+10]]+ut[t[e+11]]+ut[t[e+12]]+ut[t[e+13]]+ut[t[e+14]]+ut[t[e+15]]).toLowerCase()}const pt=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;const ft=function(t){return"string"==typeof t&&pt.test(t)};const gt=function(t){if(!ft(t))throw TypeError("Invalid UUID");let e;const n=new Uint8Array(16);return n[0]=(e=parseInt(t.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(t.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(t.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(t.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(t.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n};function yt(t,e,n,i){switch(t){case 0:return e&n^~e&i;case 1:case 3:return e^n^i;case 2:return e&n^e&i^n&i}}function mt(t,e){return t<<e|t>>>32-e}const bt=function(t){const e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof t){const e=unescape(encodeURIComponent(t));t=[];for(let n=0;n<e.length;++n)t.push(e.charCodeAt(n))}else Array.isArray(t)||(t=Array.prototype.slice.call(t));t.push(128);const i=t.length/4+2,r=Math.ceil(i/16),a=new Array(r);for(let s=0;s<r;++s){const e=new Uint32Array(16);for(let n=0;n<16;++n)e[n]=t[64*s+4*n]<<24|t[64*s+4*n+1]<<16|t[64*s+4*n+2]<<8|t[64*s+4*n+3];a[s]=e}a[r-1][14]=8*(t.length-1)/Math.pow(2,32),a[r-1][14]=Math.floor(a[r-1][14]),a[r-1][15]=8*(t.length-1)&4294967295;for(let s=0;s<r;++s){const t=new Uint32Array(80);for(let e=0;e<16;++e)t[e]=a[s][e];for(let e=16;e<80;++e)t[e]=mt(t[e-3]^t[e-8]^t[e-14]^t[e-16],1);let i=n[0],r=n[1],o=n[2],c=n[3],l=n[4];for(let n=0;n<80;++n){const a=Math.floor(n/20),s=mt(i,5)+yt(a,r,o,c)+l+e[a]+t[n]>>>0;l=c,c=o,o=mt(r,30)>>>0,r=i,i=s}n[0]=n[0]+i>>>0,n[1]=n[1]+r>>>0,n[2]=n[2]+o>>>0,n[3]=n[3]+c>>>0,n[4]=n[4]+l>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]},_t=function(t,e,n){function i(t,i,r,a){var s;if("string"==typeof t&&(t=function(t){t=unescape(encodeURIComponent(t));const e=[];for(let n=0;n<t.length;++n)e.push(t.charCodeAt(n));return e}(t)),"string"==typeof i&&(i=gt(i)),16!==(null===(s=i)||void 0===s?void 0:s.length))throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");let o=new Uint8Array(16+t.length);if(o.set(i),o.set(t,i.length),o=n(o),o[6]=15&o[6]|e,o[8]=63&o[8]|128,r){a=a||0;for(let t=0;t<16;++t)r[a+t]=o[t];return r}return dt(o)}try{i.name=t}catch(r){}return i.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",i.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",i}("v5",80,bt),xt=_t;n(1518),n(6225);var vt=n(3349),kt=(n(3352),n(2930),n(9542)),wt=n.n(kt),Ct=n(285),Tt=n.n(Ct),Et=n(8734),St=n.n(Et),At=n(9697);const Lt={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},Bt={trace:(...t)=>{},debug:(...t)=>{},info:(...t)=>{},warn:(...t)=>{},error:(...t)=>{},fatal:(...t)=>{}},Nt=function(t="fatal"){let e=Lt.fatal;"string"==typeof t?(t=t.toLowerCase())in Lt&&(e=Lt[t]):"number"==typeof t&&(e=t),Bt.trace=()=>{},Bt.debug=()=>{},Bt.info=()=>{},Bt.warn=()=>{},Bt.error=()=>{},Bt.fatal=()=>{},e<=Lt.fatal&&(Bt.fatal=console.error?console.error.bind(console,Dt("FATAL"),"color: orange"):console.log.bind(console,"\x1b[35m",Dt("FATAL"))),e<=Lt.error&&(Bt.error=console.error?console.error.bind(console,Dt("ERROR"),"color: orange"):console.log.bind(console,"\x1b[31m",Dt("ERROR"))),e<=Lt.warn&&(Bt.warn=console.warn?console.warn.bind(console,Dt("WARN"),"color: orange"):console.log.bind(console,"\x1b[33m",Dt("WARN"))),e<=Lt.info&&(Bt.info=console.info?console.info.bind(console,Dt("INFO"),"color: lightblue"):console.log.bind(console,"\x1b[34m",Dt("INFO"))),e<=Lt.debug&&(Bt.debug=console.debug?console.debug.bind(console,Dt("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",Dt("DEBUG"))),e<=Lt.trace&&(Bt.trace=console.debug?console.debug.bind(console,Dt("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",Dt("TRACE")))},Dt=t=>`%c${a()().format("ss.SSS")} : ${t} : `,Ot=t=>h().sanitize(t),Mt=(t,e)=>{var n;if(!1!==(null==(n=e.flowchart)?void 0:n.htmlLabels)){const n=e.securityLevel;"antiscript"===n||"strict"===n?t=Ot(t):"loose"!==n&&(t=(t=(t=Rt(t)).replace(/</g,"<").replace(/>/g,">")).replace(/=/g,"="),t=$t(t))}return t},It=(t,e)=>t?t=e.dompurifyConfig?h().sanitize(Mt(t,e),e.dompurifyConfig).toString():h().sanitize(Mt(t,e),{FORBID_TAGS:["style"]}).toString():t,Ft=/<br\s*\/?>/gi,$t=t=>t.replace(/#br#/g,"<br/>"),Rt=t=>t.replace(Ft,"#br#"),Zt=t=>!1!==t&&!["false","null","0"].includes(String(t).trim().toLowerCase()),Pt=function(t){let e=t;if(t.split("~").length-1>=2){let t=e;do{e=t,t=e.replace(/~([^\s,:;]+)~/,"<$1>")}while(t!=e);return Pt(t)}return e},jt={getRows:t=>{if(!t)return[""];return Rt(t).replace(/\\n/g,"#br#").split("#br#")},sanitizeText:It,sanitizeTextOrArray:(t,e)=>"string"==typeof t?It(t,e):t.flat().map((t=>It(t,e))),hasBreaks:t=>Ft.test(t),splitBreaks:t=>t.split(Ft),lineBreakRegex:Ft,removeScript:Ot,getUrl:t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=e.replaceAll(/\(/g,"\\("),e=e.replaceAll(/\)/g,"\\)")),e},evaluate:Zt},Yt=(t,e)=>f(t,e?{s:-40,l:10}:{s:-40,l:-10}),zt="#ffffff",Ut="#f2f2f2";let Wt=class{constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||f(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||f(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Yt(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Yt(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Yt(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||b(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||b(this.tertiaryColor),this.lineColor=this.lineColor||b(this.background),this.textColor=this.textColor||this.primaryTextColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?(0,_.Z)(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||"grey",this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||(0,_.Z)(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||b(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||(0,x.Z)(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||f(this.primaryColor,{h:30}),this.cScale4=this.cScale4||f(this.primaryColor,{h:60}),this.cScale5=this.cScale5||f(this.primaryColor,{h:90}),this.cScale6=this.cScale6||f(this.primaryColor,{h:120}),this.cScale7=this.cScale7||f(this.primaryColor,{h:150}),this.cScale8=this.cScale8||f(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||f(this.primaryColor,{h:270}),this.cScale10=this.cScale10||f(this.primaryColor,{h:300}),this.cScale11=this.cScale11||f(this.primaryColor,{h:330}),this.darkMode)for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScale"+e]=(0,_.Z)(this["cScale"+e],75);else for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScale"+e]=(0,_.Z)(this["cScale"+e],25);for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScaleInv"+e]=this["cScaleInv"+e]||b(this["cScale"+e]);for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this.darkMode?this["cScalePeer"+e]=this["cScalePeer"+e]||(0,x.Z)(this["cScale"+e],10):this["cScalePeer"+e]=this["cScalePeer"+e]||(0,_.Z)(this["cScale"+e],10);this.scaleLabelColor=this.scaleLabelColor||this.labelTextColor;for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScaleLabel"+e]=this["cScaleLabel"+e]||this.scaleLabelColor;const t=this.darkMode?-4:-1;for(let e=0;e<5;e++)this["surface"+e]=this["surface"+e]||f(this.mainBkg,{h:180,s:-15,l:t*(5+3*e)}),this["surfacePeer"+e]=this["surfacePeer"+e]||f(this.mainBkg,{h:180,s:-15,l:t*(8+3*e)});this.classText=this.classText||this.textColor,this.fillType0=this.fillType0||this.primaryColor,this.fillType1=this.fillType1||this.secondaryColor,this.fillType2=this.fillType2||f(this.primaryColor,{h:64}),this.fillType3=this.fillType3||f(this.secondaryColor,{h:64}),this.fillType4=this.fillType4||f(this.primaryColor,{h:-64}),this.fillType5=this.fillType5||f(this.secondaryColor,{h:-64}),this.fillType6=this.fillType6||f(this.primaryColor,{h:128}),this.fillType7=this.fillType7||f(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||f(this.primaryColor,{l:-10}),this.pie5=this.pie5||f(this.secondaryColor,{l:-10}),this.pie6=this.pie6||f(this.tertiaryColor,{l:-10}),this.pie7=this.pie7||f(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||f(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||f(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||f(this.primaryColor,{h:60,l:-20}),this.pie11=this.pie11||f(this.primaryColor,{h:-60,l:-20}),this.pie12=this.pie12||f(this.primaryColor,{h:120,l:-10}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?(0,_.Z)(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||f(this.primaryColor,{h:-30}),this.git4=this.git4||f(this.primaryColor,{h:-60}),this.git5=this.git5||f(this.primaryColor,{h:-90}),this.git6=this.git6||f(this.primaryColor,{h:60}),this.git7=this.git7||f(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,x.Z)(this.git0,25),this.git1=(0,x.Z)(this.git1,25),this.git2=(0,x.Z)(this.git2,25),this.git3=(0,x.Z)(this.git3,25),this.git4=(0,x.Z)(this.git4,25),this.git5=(0,x.Z)(this.git5,25),this.git6=(0,x.Z)(this.git6,25),this.git7=(0,x.Z)(this.git7,25)):(this.git0=(0,_.Z)(this.git0,25),this.git1=(0,_.Z)(this.git1,25),this.git2=(0,_.Z)(this.git2,25),this.git3=(0,_.Z)(this.git3,25),this.git4=(0,_.Z)(this.git4,25),this.git5=(0,_.Z)(this.git5,25),this.git6=(0,_.Z)(this.git6,25),this.git7=(0,_.Z)(this.git7,25)),this.gitInv0=this.gitInv0||b(this.git0),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.branchLabelColor=this.branchLabelColor||(this.darkMode?"black":this.labelTextColor),this.gitBranchLabel0=this.gitBranchLabel0||this.branchLabelColor,this.gitBranchLabel1=this.gitBranchLabel1||this.branchLabelColor,this.gitBranchLabel2=this.gitBranchLabel2||this.branchLabelColor,this.gitBranchLabel3=this.gitBranchLabel3||this.branchLabelColor,this.gitBranchLabel4=this.gitBranchLabel4||this.branchLabelColor,this.gitBranchLabel5=this.gitBranchLabel5||this.branchLabelColor,this.gitBranchLabel6=this.gitBranchLabel6||this.branchLabelColor,this.gitBranchLabel7=this.gitBranchLabel7||this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zt,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ut}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}};let qt=class{constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=(0,x.Z)(this.primaryColor,16),this.tertiaryColor=f(this.primaryColor,{h:-160}),this.primaryBorderColor=b(this.background),this.secondaryBorderColor=Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yt(this.tertiaryColor,this.darkMode),this.primaryTextColor=b(this.primaryColor),this.secondaryTextColor=b(this.secondaryColor),this.tertiaryTextColor=b(this.tertiaryColor),this.lineColor=b(this.background),this.textColor=b(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=(0,x.Z)(b("#323D47"),10),this.lineColor="calculated",this.border1="#81B1DB",this.border2=y(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=(0,_.Z)("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.taskBorderColor=y(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=y(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=(0,x.Z)(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=(0,x.Z)(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.mainContrastColor,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=(0,x.Z)(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=f(this.primaryColor,{h:64}),this.fillType3=f(this.secondaryColor,{h:64}),this.fillType4=f(this.primaryColor,{h:-64}),this.fillType5=f(this.secondaryColor,{h:-64}),this.fillType6=f(this.primaryColor,{h:128}),this.fillType7=f(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||f(this.primaryColor,{h:30}),this.cScale4=this.cScale4||f(this.primaryColor,{h:60}),this.cScale5=this.cScale5||f(this.primaryColor,{h:90}),this.cScale6=this.cScale6||f(this.primaryColor,{h:120}),this.cScale7=this.cScale7||f(this.primaryColor,{h:150}),this.cScale8=this.cScale8||f(this.primaryColor,{h:210}),this.cScale9=this.cScale9||f(this.primaryColor,{h:270}),this.cScale10=this.cScale10||f(this.primaryColor,{h:300}),this.cScale11=this.cScale11||f(this.primaryColor,{h:330});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||b(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScalePeer"+t]=this["cScalePeer"+t]||(0,x.Z)(this["cScale"+t],10);for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||f(this.mainBkg,{h:30,s:-30,l:-(4*t-10)}),this["surfacePeer"+t]=this["surfacePeer"+t]||f(this.mainBkg,{h:30,s:-30,l:-(4*t-7)});this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.classText=this.primaryTextColor,this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?(0,_.Z)(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=(0,x.Z)(this.secondaryColor,20),this.git1=(0,x.Z)(this.pie2||this.secondaryColor,20),this.git2=(0,x.Z)(this.pie3||this.tertiaryColor,20),this.git3=(0,x.Z)(this.pie4||f(this.primaryColor,{h:-30}),20),this.git4=(0,x.Z)(this.pie5||f(this.primaryColor,{h:-60}),20),this.git5=(0,x.Z)(this.pie6||f(this.primaryColor,{h:-90}),10),this.git6=(0,x.Z)(this.pie7||f(this.primaryColor,{h:60}),10),this.git7=(0,x.Z)(this.pie8||f(this.primaryColor,{h:120}),20),this.gitInv0=this.gitInv0||b(this.git0),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||(0,x.Z)(this.background,12),this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||(0,x.Z)(this.background,2)}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}};let Ht=class{constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=f(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=f(this.primaryColor,{h:-160}),this.primaryBorderColor=Yt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yt(this.tertiaryColor,this.darkMode),this.primaryTextColor=b(this.primaryColor),this.secondaryTextColor=b(this.secondaryColor),this.tertiaryTextColor=b(this.tertiaryColor),this.lineColor=b(this.background),this.textColor=b(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#e8e8e8",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.sectionBkgColor=y(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||f(this.primaryColor,{h:30}),this.cScale4=this.cScale4||f(this.primaryColor,{h:60}),this.cScale5=this.cScale5||f(this.primaryColor,{h:90}),this.cScale6=this.cScale6||f(this.primaryColor,{h:120}),this.cScale7=this.cScale7||f(this.primaryColor,{h:150}),this.cScale8=this.cScale8||f(this.primaryColor,{h:210}),this.cScale9=this.cScale9||f(this.primaryColor,{h:270}),this.cScale10=this.cScale10||f(this.primaryColor,{h:300}),this.cScale11=this.cScale11||f(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||(0,_.Z)(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||(0,_.Z)(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=(0,_.Z)(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||(0,_.Z)(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||f(this["cScale"+t],{h:180});for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||f(this.mainBkg,{h:30,l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||f(this.mainBkg,{h:30,l:-(7+5*t)});if(this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor,"calculated"!==this.labelTextColor){this.cScaleLabel0=this.cScaleLabel0||b(this.labelTextColor),this.cScaleLabel3=this.cScaleLabel3||b(this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.labelTextColor}this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.textColor,this.edgeLabelBackground=this.labelBackground,this.actorBorder=(0,x.Z)(this.border1,23),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.signalColor=this.textColor,this.signalTextColor=this.textColor,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=f(this.primaryColor,{h:64}),this.fillType3=f(this.secondaryColor,{h:64}),this.fillType4=f(this.primaryColor,{h:-64}),this.fillType5=f(this.secondaryColor,{h:-64}),this.fillType6=f(this.primaryColor,{h:128}),this.fillType7=f(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||f(this.tertiaryColor,{l:-40}),this.pie4=this.pie4||f(this.primaryColor,{l:-10}),this.pie5=this.pie5||f(this.secondaryColor,{l:-30}),this.pie6=this.pie6||f(this.tertiaryColor,{l:-20}),this.pie7=this.pie7||f(this.primaryColor,{h:60,l:-20}),this.pie8=this.pie8||f(this.primaryColor,{h:-60,l:-40}),this.pie9=this.pie9||f(this.primaryColor,{h:120,l:-40}),this.pie10=this.pie10||f(this.primaryColor,{h:60,l:-40}),this.pie11=this.pie11||f(this.primaryColor,{h:-90,l:-40}),this.pie12=this.pie12||f(this.primaryColor,{h:120,l:-30}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.labelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||f(this.primaryColor,{h:-30}),this.git4=this.git4||f(this.primaryColor,{h:-60}),this.git5=this.git5||f(this.primaryColor,{h:-90}),this.git6=this.git6||f(this.primaryColor,{h:60}),this.git7=this.git7||f(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,x.Z)(this.git0,25),this.git1=(0,x.Z)(this.git1,25),this.git2=(0,x.Z)(this.git2,25),this.git3=(0,x.Z)(this.git3,25),this.git4=(0,x.Z)(this.git4,25),this.git5=(0,x.Z)(this.git5,25),this.git6=(0,x.Z)(this.git6,25),this.git7=(0,x.Z)(this.git7,25)):(this.git0=(0,_.Z)(this.git0,25),this.git1=(0,_.Z)(this.git1,25),this.git2=(0,_.Z)(this.git2,25),this.git3=(0,_.Z)(this.git3,25),this.git4=(0,_.Z)(this.git4,25),this.git5=(0,_.Z)(this.git5,25),this.git6=(0,_.Z)(this.git6,25),this.git7=(0,_.Z)(this.git7,25)),this.gitInv0=this.gitInv0||(0,_.Z)(b(this.git0),25),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.gitBranchLabel0=this.gitBranchLabel0||b(this.labelTextColor),this.gitBranchLabel1=this.gitBranchLabel1||this.labelTextColor,this.gitBranchLabel2=this.gitBranchLabel2||this.labelTextColor,this.gitBranchLabel3=this.gitBranchLabel3||b(this.labelTextColor),this.gitBranchLabel4=this.gitBranchLabel4||this.labelTextColor,this.gitBranchLabel5=this.gitBranchLabel5||this.labelTextColor,this.gitBranchLabel6=this.gitBranchLabel6||this.labelTextColor,this.gitBranchLabel7=this.gitBranchLabel7||this.labelTextColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zt,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ut}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}};let Vt=class{constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=(0,x.Z)("#cde498",10),this.primaryBorderColor=Yt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yt(this.tertiaryColor,this.darkMode),this.primaryTextColor=b(this.primaryColor),this.secondaryTextColor=b(this.secondaryColor),this.tertiaryTextColor=b(this.primaryColor),this.lineColor=b(this.background),this.textColor=b(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||f(this.primaryColor,{h:30}),this.cScale4=this.cScale4||f(this.primaryColor,{h:60}),this.cScale5=this.cScale5||f(this.primaryColor,{h:90}),this.cScale6=this.cScale6||f(this.primaryColor,{h:120}),this.cScale7=this.cScale7||f(this.primaryColor,{h:150}),this.cScale8=this.cScale8||f(this.primaryColor,{h:210}),this.cScale9=this.cScale9||f(this.primaryColor,{h:270}),this.cScale10=this.cScale10||f(this.primaryColor,{h:300}),this.cScale11=this.cScale11||f(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||(0,_.Z)(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||(0,_.Z)(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=(0,_.Z)(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||(0,_.Z)(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||f(this["cScale"+t],{h:180});this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||f(this.mainBkg,{h:30,s:-30,l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||f(this.mainBkg,{h:30,s:-30,l:-(8+5*t)});this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.actorBorder=(0,_.Z)(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.taskBorderColor=this.border1,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=f(this.primaryColor,{h:64}),this.fillType3=f(this.secondaryColor,{h:64}),this.fillType4=f(this.primaryColor,{h:-64}),this.fillType5=f(this.secondaryColor,{h:-64}),this.fillType6=f(this.primaryColor,{h:128}),this.fillType7=f(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||f(this.primaryColor,{l:-30}),this.pie5=this.pie5||f(this.secondaryColor,{l:-30}),this.pie6=this.pie6||f(this.tertiaryColor,{h:40,l:-40}),this.pie7=this.pie7||f(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||f(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||f(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||f(this.primaryColor,{h:60,l:-50}),this.pie11=this.pie11||f(this.primaryColor,{h:-60,l:-50}),this.pie12=this.pie12||f(this.primaryColor,{h:120,l:-50}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||f(this.primaryColor,{h:-30}),this.git4=this.git4||f(this.primaryColor,{h:-60}),this.git5=this.git5||f(this.primaryColor,{h:-90}),this.git6=this.git6||f(this.primaryColor,{h:60}),this.git7=this.git7||f(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,x.Z)(this.git0,25),this.git1=(0,x.Z)(this.git1,25),this.git2=(0,x.Z)(this.git2,25),this.git3=(0,x.Z)(this.git3,25),this.git4=(0,x.Z)(this.git4,25),this.git5=(0,x.Z)(this.git5,25),this.git6=(0,x.Z)(this.git6,25),this.git7=(0,x.Z)(this.git7,25)):(this.git0=(0,_.Z)(this.git0,25),this.git1=(0,_.Z)(this.git1,25),this.git2=(0,_.Z)(this.git2,25),this.git3=(0,_.Z)(this.git3,25),this.git4=(0,_.Z)(this.git4,25),this.git5=(0,_.Z)(this.git5,25),this.git6=(0,_.Z)(this.git6,25),this.git7=(0,_.Z)(this.git7,25)),this.gitInv0=this.gitInv0||b(this.git0),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zt,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ut}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}};class Gt{constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=(0,x.Z)(this.contrast,55),this.background="#ffffff",this.tertiaryColor=f(this.primaryColor,{h:-160}),this.primaryBorderColor=Yt(this.primaryColor,this.darkMode),this.secondaryBorderColor=Yt(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Yt(this.tertiaryColor,this.darkMode),this.primaryTextColor=b(this.primaryColor),this.secondaryTextColor=b(this.secondaryColor),this.tertiaryTextColor=b(this.tertiaryColor),this.lineColor=b(this.background),this.textColor=b(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.personBorder="calculated",this.personBkg="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=(0,x.Z)(this.contrast,55),this.border2=this.contrast,this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||b(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this.darkMode?this["cScalePeer"+t]=this["cScalePeer"+t]||(0,x.Z)(this["cScale"+t],10):this["cScalePeer"+t]=this["cScalePeer"+t]||(0,_.Z)(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor),this.cScaleLabel0=this.cScaleLabel0||this.cScale1,this.cScaleLabel2=this.cScaleLabel2||this.cScale1;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||f(this.mainBkg,{l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||f(this.mainBkg,{l:-(8+5*t)});this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.text,this.actorBorder=(0,x.Z)(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.lineColor,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.sectionBkgColor=(0,x.Z)(this.contrast,30),this.sectionBkgColor2=(0,x.Z)(this.contrast,30),this.taskBorderColor=(0,_.Z)(this.contrast,10),this.taskBkgColor=this.contrast,this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor=this.text,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.gridColor=(0,x.Z)(this.border1,30),this.doneTaskBkgColor=this.done,this.doneTaskBorderColor=this.lineColor,this.critBkgColor=this.critical,this.critBorderColor=(0,_.Z)(this.critBkgColor,10),this.todayLineColor=this.critBkgColor,this.transitionColor=this.transitionColor||"#000",this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f4f4f4",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.stateBorder=this.stateBorder||"#000",this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#222",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=f(this.primaryColor,{h:64}),this.fillType3=f(this.secondaryColor,{h:64}),this.fillType4=f(this.primaryColor,{h:-64}),this.fillType5=f(this.secondaryColor,{h:-64}),this.fillType6=f(this.primaryColor,{h:128}),this.fillType7=f(this.secondaryColor,{h:128});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pie12=this.pie0,this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOpacity=this.pieOpacity||"0.7",this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||this.primaryBorderColor,this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=(0,_.Z)(this.pie1,25)||this.primaryColor,this.git1=this.pie2||this.secondaryColor,this.git2=this.pie3||this.tertiaryColor,this.git3=this.pie4||f(this.primaryColor,{h:-30}),this.git4=this.pie5||f(this.primaryColor,{h:-60}),this.git5=this.pie6||f(this.primaryColor,{h:-90}),this.git6=this.pie7||f(this.primaryColor,{h:60}),this.git7=this.pie8||f(this.primaryColor,{h:120}),this.gitInv0=this.gitInv0||b(this.git0),this.gitInv1=this.gitInv1||b(this.git1),this.gitInv2=this.gitInv2||b(this.git2),this.gitInv3=this.gitInv3||b(this.git3),this.gitInv4=this.gitInv4||b(this.git4),this.gitInv5=this.gitInv5||b(this.git5),this.gitInv6=this.gitInv6||b(this.git6),this.gitInv7=this.gitInv7||b(this.git7),this.branchLabelColor=this.branchLabelColor||this.labelTextColor,this.gitBranchLabel0=this.branchLabelColor,this.gitBranchLabel1="white",this.gitBranchLabel2=this.branchLabelColor,this.gitBranchLabel3="white",this.gitBranchLabel4=this.branchLabelColor,this.gitBranchLabel5=this.branchLabelColor,this.gitBranchLabel6=this.branchLabelColor,this.gitBranchLabel7=this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||zt,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||Ut}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach((e=>{this[e]=t[e]})),this.updateColors(),e.forEach((e=>{this[e]=t[e]}))}}const Xt={base:{getThemeVariables:t=>{const e=new Wt;return e.calculate(t),e}},dark:{getThemeVariables:t=>{const e=new qt;return e.calculate(t),e}},default:{getThemeVariables:t=>{const e=new Ht;return e.calculate(t),e}},forest:{getThemeVariables:t=>{const e=new Vt;return e.calculate(t),e}},neutral:{getThemeVariables:t=>{const e=new Gt;return e.calculate(t),e}}},Qt={theme:"default",themeVariables:Xt.default.getThemeVariables(),themeCSS:void 0,maxTextSize:5e4,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize"],deterministicIds:!1,deterministicIDSeed:void 0,flowchart:{titleTopMargin:25,diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},sequence:{hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20,messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},noteFont:function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},actorFont:function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}}},gantt:{titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",tickInterval:void 0,useMaxWidth:!0,topAxis:!1,useWidth:void 0},journey:{diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},timeline:{diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,useMaxWidth:!0,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},class:{titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},state:{titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,useMaxWidth:!0,defaultRenderer:"dagre-wrapper"},er:{titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,stroke:"gray",fill:"honeydew",fontSize:12,useMaxWidth:!0},pie:{useWidth:void 0,useMaxWidth:!0},requirement:{useWidth:void 0,useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},gitGraph:{titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0},c4:{useWidth:void 0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,useMaxWidth:!0,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,personFont:function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},external_personFont:function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},systemFont:function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},external_systemFont:function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},system_dbFont:function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},external_system_dbFont:function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},system_queueFont:function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},external_system_queueFont:function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},containerFont:function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},external_containerFont:function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},container_dbFont:function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},external_container_dbFont:function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},container_queueFont:function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},external_container_queueFont:function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},componentFont:function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},external_componentFont:function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},component_dbFont:function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},external_component_dbFont:function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},component_queueFont:function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},external_component_queueFont:function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},boundaryFont:function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},fontSize:16};Qt.class&&(Qt.class.arrowMarkerAbsolute=Qt.arrowMarkerAbsolute),Qt.gitGraph&&(Qt.gitGraph.arrowMarkerAbsolute=Qt.arrowMarkerAbsolute);const Kt=(t,e="")=>Object.keys(t).reduce(((n,i)=>Array.isArray(t[i])?n:"object"==typeof t[i]&&null!==t[i]?[...n,e+i,...Kt(t[i],"")]:[...n,e+i]),[]),Jt=Kt(Qt,""),te=Qt;function ee(t){return null==t}var ne={isNothing:ee,isObject:function(t){return"object"==typeof t&&null!==t},toArray:function(t){return Array.isArray(t)?t:ee(t)?[]:[t]},repeat:function(t,e){var n,i="";for(n=0;n<e;n+=1)i+=t;return i},isNegativeZero:function(t){return 0===t&&Number.NEGATIVE_INFINITY===1/t},extend:function(t,e){var n,i,r,a;if(e)for(n=0,i=(a=Object.keys(e)).length;n<i;n+=1)t[r=a[n]]=e[r];return t}};function ie(t,e){var n="",i=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(n+='in "'+t.mark.name+'" '),n+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!e&&t.mark.snippet&&(n+="\n\n"+t.mark.snippet),i+" "+n):i}function re(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=ie(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}re.prototype=Object.create(Error.prototype),re.prototype.constructor=re,re.prototype.toString=function(t){return this.name+": "+ie(this,t)};var ae=re;function se(t,e,n,i,r){var a="",s="",o=Math.floor(r/2)-1;return i-e>o&&(e=i-o+(a=" ... ").length),n-i>o&&(n=i+o-(s=" ...").length),{str:a+t.slice(e,n).replace(/\t/g,"\u2192")+s,pos:i-e+a.length}}function oe(t,e){return ne.repeat(" ",e-t.length)+t}var ce=function(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),"number"!=typeof e.indent&&(e.indent=1),"number"!=typeof e.linesBefore&&(e.linesBefore=3),"number"!=typeof e.linesAfter&&(e.linesAfter=2);for(var n,i=/\r?\n|\r|\0/g,r=[0],a=[],s=-1;n=i.exec(t.buffer);)a.push(n.index),r.push(n.index+n[0].length),t.position<=n.index&&s<0&&(s=r.length-2);s<0&&(s=r.length-1);var o,c,l="",h=Math.min(t.line+e.linesAfter,a.length).toString().length,u=e.maxLength-(e.indent+h+3);for(o=1;o<=e.linesBefore&&!(s-o<0);o++)c=se(t.buffer,r[s-o],a[s-o],t.position-(r[s]-r[s-o]),u),l=ne.repeat(" ",e.indent)+oe((t.line-o+1).toString(),h)+" | "+c.str+"\n"+l;for(c=se(t.buffer,r[s],a[s],t.position,u),l+=ne.repeat(" ",e.indent)+oe((t.line+1).toString(),h)+" | "+c.str+"\n",l+=ne.repeat("-",e.indent+h+3+c.pos)+"^\n",o=1;o<=e.linesAfter&&!(s+o>=a.length);o++)c=se(t.buffer,r[s+o],a[s+o],t.position-(r[s]-r[s+o]),u),l+=ne.repeat(" ",e.indent)+oe((t.line+o+1).toString(),h)+" | "+c.str+"\n";return l.replace(/\n$/,"")},le=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],he=["scalar","sequence","mapping"];var ue=function(t,e){var n,i;if(e=e||{},Object.keys(e).forEach((function(e){if(-1===le.indexOf(e))throw new ae('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')})),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=(n=e.styleAliases||null,i={},null!==n&&Object.keys(n).forEach((function(t){n[t].forEach((function(e){i[String(e)]=t}))})),i),-1===he.indexOf(this.kind))throw new ae('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')};function de(t,e){var n=[];return t[e].forEach((function(t){var e=n.length;n.forEach((function(n,i){n.tag===t.tag&&n.kind===t.kind&&n.multi===t.multi&&(e=i)})),n[e]=t})),n}function pe(t){return this.extend(t)}pe.prototype.extend=function(t){var e=[],n=[];if(t instanceof ue)n.push(t);else if(Array.isArray(t))n=n.concat(t);else{if(!t||!Array.isArray(t.implicit)&&!Array.isArray(t.explicit))throw new ae("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");t.implicit&&(e=e.concat(t.implicit)),t.explicit&&(n=n.concat(t.explicit))}e.forEach((function(t){if(!(t instanceof ue))throw new ae("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(t.loadKind&&"scalar"!==t.loadKind)throw new ae("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(t.multi)throw new ae("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(t){if(!(t instanceof ue))throw new ae("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var i=Object.create(pe.prototype);return i.implicit=(this.implicit||[]).concat(e),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=de(i,"implicit"),i.compiledExplicit=de(i,"explicit"),i.compiledTypeMap=function(){var t,e,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function i(t){t.multi?(n.multi[t.kind].push(t),n.multi.fallback.push(t)):n[t.kind][t.tag]=n.fallback[t.tag]=t}for(t=0,e=arguments.length;t<e;t+=1)arguments[t].forEach(i);return n}(i.compiledImplicit,i.compiledExplicit),i};var fe=new pe({explicit:[new ue("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return null!==t?t:""}}),new ue("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return null!==t?t:[]}}),new ue("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return null!==t?t:{}}})]});var ge=new ue("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(t){if(null===t)return!0;var e=t.length;return 1===e&&"~"===t||4===e&&("null"===t||"Null"===t||"NULL"===t)},construct:function(){return null},predicate:function(t){return null===t},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});var ye=new ue("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e=t.length;return 4===e&&("true"===t||"True"===t||"TRUE"===t)||5===e&&("false"===t||"False"===t||"FALSE"===t)},construct:function(t){return"true"===t||"True"===t||"TRUE"===t},predicate:function(t){return"[object Boolean]"===Object.prototype.toString.call(t)},represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"});function me(t){return 48<=t&&t<=55}function be(t){return 48<=t&&t<=57}var _e=new ue("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e,n,i=t.length,r=0,a=!1;if(!i)return!1;if("-"!==(e=t[r])&&"+"!==e||(e=t[++r]),"0"===e){if(r+1===i)return!0;if("b"===(e=t[++r])){for(r++;r<i;r++)if("_"!==(e=t[r])){if("0"!==e&&"1"!==e)return!1;a=!0}return a&&"_"!==e}if("x"===e){for(r++;r<i;r++)if("_"!==(e=t[r])){if(!(48<=(n=t.charCodeAt(r))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;a=!0}return a&&"_"!==e}if("o"===e){for(r++;r<i;r++)if("_"!==(e=t[r])){if(!me(t.charCodeAt(r)))return!1;a=!0}return a&&"_"!==e}}if("_"===e)return!1;for(;r<i;r++)if("_"!==(e=t[r])){if(!be(t.charCodeAt(r)))return!1;a=!0}return!(!a||"_"===e)},construct:function(t){var e,n=t,i=1;if(-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),"-"!==(e=n[0])&&"+"!==e||("-"===e&&(i=-1),e=(n=n.slice(1))[0]),"0"===n)return 0;if("0"===e){if("b"===n[1])return i*parseInt(n.slice(2),2);if("x"===n[1])return i*parseInt(n.slice(2),16);if("o"===n[1])return i*parseInt(n.slice(2),8)}return i*parseInt(n,10)},predicate:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&t%1==0&&!ne.isNegativeZero(t)},represent:{binary:function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),xe=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var ve=/^[-+]?[0-9]+e/;var ke=new ue("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(t){return null!==t&&!(!xe.test(t)||"_"===t[t.length-1])},construct:function(t){var e,n;return n="-"===(e=t.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(e[0])>=0&&(e=e.slice(1)),".inf"===e?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===e?NaN:n*parseFloat(e,10)},predicate:function(t){return"[object Number]"===Object.prototype.toString.call(t)&&(t%1!=0||ne.isNegativeZero(t))},represent:function(t,e){var n;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(ne.isNegativeZero(t))return"-0.0";return n=t.toString(10),ve.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"}),we=fe.extend({implicit:[ge,ye,_e,ke]}),Ce=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Te=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var Ee=new ue("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(t){return null!==t&&(null!==Ce.exec(t)||null!==Te.exec(t))},construct:function(t){var e,n,i,r,a,s,o,c,l=0,h=null;if(null===(e=Ce.exec(t))&&(e=Te.exec(t)),null===e)throw new Error("Date resolve error");if(n=+e[1],i=+e[2]-1,r=+e[3],!e[4])return new Date(Date.UTC(n,i,r));if(a=+e[4],s=+e[5],o=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(h=6e4*(60*+e[10]+ +(e[11]||0)),"-"===e[9]&&(h=-h)),c=new Date(Date.UTC(n,i,r,a,s,o,l)),h&&c.setTime(c.getTime()-h),c},instanceOf:Date,represent:function(t){return t.toISOString()}});var Se=new ue("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(t){return"<<"===t||null===t}}),Ae="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var Le=new ue("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(t){if(null===t)return!1;var e,n,i=0,r=t.length,a=Ae;for(n=0;n<r;n++)if(!((e=a.indexOf(t.charAt(n)))>64)){if(e<0)return!1;i+=6}return i%8==0},construct:function(t){var e,n,i=t.replace(/[\r\n=]/g,""),r=i.length,a=Ae,s=0,o=[];for(e=0;e<r;e++)e%4==0&&e&&(o.push(s>>16&255),o.push(s>>8&255),o.push(255&s)),s=s<<6|a.indexOf(i.charAt(e));return 0===(n=r%4*6)?(o.push(s>>16&255),o.push(s>>8&255),o.push(255&s)):18===n?(o.push(s>>10&255),o.push(s>>2&255)):12===n&&o.push(s>>4&255),new Uint8Array(o)},predicate:function(t){return"[object Uint8Array]"===Object.prototype.toString.call(t)},represent:function(t){var e,n,i="",r=0,a=t.length,s=Ae;for(e=0;e<a;e++)e%3==0&&e&&(i+=s[r>>18&63],i+=s[r>>12&63],i+=s[r>>6&63],i+=s[63&r]),r=(r<<8)+t[e];return 0===(n=a%3)?(i+=s[r>>18&63],i+=s[r>>12&63],i+=s[r>>6&63],i+=s[63&r]):2===n?(i+=s[r>>10&63],i+=s[r>>4&63],i+=s[r<<2&63],i+=s[64]):1===n&&(i+=s[r>>2&63],i+=s[r<<4&63],i+=s[64],i+=s[64]),i}}),Be=Object.prototype.hasOwnProperty,Ne=Object.prototype.toString;var De=new ue("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(t){if(null===t)return!0;var e,n,i,r,a,s=[],o=t;for(e=0,n=o.length;e<n;e+=1){if(i=o[e],a=!1,"[object Object]"!==Ne.call(i))return!1;for(r in i)if(Be.call(i,r)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==s.indexOf(r))return!1;s.push(r)}return!0},construct:function(t){return null!==t?t:[]}}),Oe=Object.prototype.toString;var Me=new ue("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(t){if(null===t)return!0;var e,n,i,r,a,s=t;for(a=new Array(s.length),e=0,n=s.length;e<n;e+=1){if(i=s[e],"[object Object]"!==Oe.call(i))return!1;if(1!==(r=Object.keys(i)).length)return!1;a[e]=[r[0],i[r[0]]]}return!0},construct:function(t){if(null===t)return[];var e,n,i,r,a,s=t;for(a=new Array(s.length),e=0,n=s.length;e<n;e+=1)i=s[e],r=Object.keys(i),a[e]=[r[0],i[r[0]]];return a}}),Ie=Object.prototype.hasOwnProperty;var Fe=new ue("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(t){if(null===t)return!0;var e,n=t;for(e in n)if(Ie.call(n,e)&&null!==n[e])return!1;return!0},construct:function(t){return null!==t?t:{}}}),$e=we.extend({implicit:[Ee,Se],explicit:[Le,De,Me,Fe]}),Re=Object.prototype.hasOwnProperty,Ze=1,Pe=2,je=3,Ye=4,ze=1,Ue=2,We=3,qe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,He=/[\x85\u2028\u2029]/,Ve=/[,\[\]\{\}]/,Ge=/^(?:!|!!|![a-z\-]+!)$/i,Xe=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Qe(t){return Object.prototype.toString.call(t)}function Ke(t){return 10===t||13===t}function Je(t){return 9===t||32===t}function tn(t){return 9===t||32===t||10===t||13===t}function en(t){return 44===t||91===t||93===t||123===t||125===t}function nn(t){var e;return 48<=t&&t<=57?t-48:97<=(e=32|t)&&e<=102?e-97+10:-1}function rn(t){return 48===t?"\0":97===t?"\x07":98===t?"\b":116===t||9===t?"\t":110===t?"\n":118===t?"\v":102===t?"\f":114===t?"\r":101===t?"\x1b":32===t?" ":34===t?'"':47===t?"/":92===t?"\\":78===t?"\x85":95===t?"\xa0":76===t?"\u2028":80===t?"\u2029":""}function an(t){return t<=65535?String.fromCharCode(t):String.fromCharCode(55296+(t-65536>>10),56320+(t-65536&1023))}for(var sn=new Array(256),on=new Array(256),cn=0;cn<256;cn++)sn[cn]=rn(cn)?1:0,on[cn]=rn(cn);function ln(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||$e,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function hn(t,e){var n={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return n.snippet=ce(n),new ae(e,n)}function un(t,e){throw hn(t,e)}function dn(t,e){t.onWarning&&t.onWarning.call(null,hn(t,e))}var pn={YAML:function(t,e,n){var i,r,a;null!==t.version&&un(t,"duplication of %YAML directive"),1!==n.length&&un(t,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&un(t,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),a=parseInt(i[2],10),1!==r&&un(t,"unacceptable YAML version of the document"),t.version=n[0],t.checkLineBreaks=a<2,1!==a&&2!==a&&dn(t,"unsupported YAML version of the document")},TAG:function(t,e,n){var i,r;2!==n.length&&un(t,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],Ge.test(i)||un(t,"ill-formed tag handle (first argument) of the TAG directive"),Re.call(t.tagMap,i)&&un(t,'there is a previously declared suffix for "'+i+'" tag handle'),Xe.test(r)||un(t,"ill-formed tag prefix (second argument) of the TAG directive");try{r=decodeURIComponent(r)}catch(a){un(t,"tag prefix is malformed: "+r)}t.tagMap[i]=r}};function fn(t,e,n,i){var r,a,s,o;if(e<n){if(o=t.input.slice(e,n),i)for(r=0,a=o.length;r<a;r+=1)9===(s=o.charCodeAt(r))||32<=s&&s<=1114111||un(t,"expected valid JSON character");else qe.test(o)&&un(t,"the stream contains non-printable characters");t.result+=o}}function gn(t,e,n,i){var r,a,s,o;for(ne.isObject(n)||un(t,"cannot merge mappings; the provided source object is unacceptable"),s=0,o=(r=Object.keys(n)).length;s<o;s+=1)a=r[s],Re.call(e,a)||(e[a]=n[a],i[a]=!0)}function yn(t,e,n,i,r,a,s,o,c){var l,h;if(Array.isArray(r))for(l=0,h=(r=Array.prototype.slice.call(r)).length;l<h;l+=1)Array.isArray(r[l])&&un(t,"nested arrays are not supported inside keys"),"object"==typeof r&&"[object Object]"===Qe(r[l])&&(r[l]="[object Object]");if("object"==typeof r&&"[object Object]"===Qe(r)&&(r="[object Object]"),r=String(r),null===e&&(e={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(a))for(l=0,h=a.length;l<h;l+=1)gn(t,e,a[l],n);else gn(t,e,a,n);else t.json||Re.call(n,r)||!Re.call(e,r)||(t.line=s||t.line,t.lineStart=o||t.lineStart,t.position=c||t.position,un(t,"duplicated mapping key")),"__proto__"===r?Object.defineProperty(e,r,{configurable:!0,enumerable:!0,writable:!0,value:a}):e[r]=a,delete n[r];return e}function mn(t){var e;10===(e=t.input.charCodeAt(t.position))?t.position++:13===e?(t.position++,10===t.input.charCodeAt(t.position)&&t.position++):un(t,"a line break is expected"),t.line+=1,t.lineStart=t.position,t.firstTabInLine=-1}function bn(t,e,n){for(var i=0,r=t.input.charCodeAt(t.position);0!==r;){for(;Je(r);)9===r&&-1===t.firstTabInLine&&(t.firstTabInLine=t.position),r=t.input.charCodeAt(++t.position);if(e&&35===r)do{r=t.input.charCodeAt(++t.position)}while(10!==r&&13!==r&&0!==r);if(!Ke(r))break;for(mn(t),r=t.input.charCodeAt(t.position),i++,t.lineIndent=0;32===r;)t.lineIndent++,r=t.input.charCodeAt(++t.position)}return-1!==n&&0!==i&&t.lineIndent<n&&dn(t,"deficient indentation"),i}function _n(t){var e,n=t.position;return!(45!==(e=t.input.charCodeAt(n))&&46!==e||e!==t.input.charCodeAt(n+1)||e!==t.input.charCodeAt(n+2)||(n+=3,0!==(e=t.input.charCodeAt(n))&&!tn(e)))}function xn(t,e){1===e?t.result+=" ":e>1&&(t.result+=ne.repeat("\n",e-1))}function vn(t,e){var n,i,r=t.tag,a=t.anchor,s=[],o=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=s),i=t.input.charCodeAt(t.position);0!==i&&(-1!==t.firstTabInLine&&(t.position=t.firstTabInLine,un(t,"tab characters must not be used in indentation")),45===i)&&tn(t.input.charCodeAt(t.position+1));)if(o=!0,t.position++,bn(t,!0,-1)&&t.lineIndent<=e)s.push(null),i=t.input.charCodeAt(t.position);else if(n=t.line,Cn(t,e,je,!1,!0),s.push(t.result),bn(t,!0,-1),i=t.input.charCodeAt(t.position),(t.line===n||t.lineIndent>e)&&0!==i)un(t,"bad indentation of a sequence entry");else if(t.lineIndent<e)break;return!!o&&(t.tag=r,t.anchor=a,t.kind="sequence",t.result=s,!0)}function kn(t){var e,n,i,r,a=!1,s=!1;if(33!==(r=t.input.charCodeAt(t.position)))return!1;if(null!==t.tag&&un(t,"duplication of a tag property"),60===(r=t.input.charCodeAt(++t.position))?(a=!0,r=t.input.charCodeAt(++t.position)):33===r?(s=!0,n="!!",r=t.input.charCodeAt(++t.position)):n="!",e=t.position,a){do{r=t.input.charCodeAt(++t.position)}while(0!==r&&62!==r);t.position<t.length?(i=t.input.slice(e,t.position),r=t.input.charCodeAt(++t.position)):un(t,"unexpected end of the stream within a verbatim tag")}else{for(;0!==r&&!tn(r);)33===r&&(s?un(t,"tag suffix cannot contain exclamation marks"):(n=t.input.slice(e-1,t.position+1),Ge.test(n)||un(t,"named tag handle cannot contain such characters"),s=!0,e=t.position+1)),r=t.input.charCodeAt(++t.position);i=t.input.slice(e,t.position),Ve.test(i)&&un(t,"tag suffix cannot contain flow indicator characters")}i&&!Xe.test(i)&&un(t,"tag name cannot contain such characters: "+i);try{i=decodeURIComponent(i)}catch(o){un(t,"tag name is malformed: "+i)}return a?t.tag=i:Re.call(t.tagMap,n)?t.tag=t.tagMap[n]+i:"!"===n?t.tag="!"+i:"!!"===n?t.tag="tag:yaml.org,2002:"+i:un(t,'undeclared tag handle "'+n+'"'),!0}function wn(t){var e,n;if(38!==(n=t.input.charCodeAt(t.position)))return!1;for(null!==t.anchor&&un(t,"duplication of an anchor property"),n=t.input.charCodeAt(++t.position),e=t.position;0!==n&&!tn(n)&&!en(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&un(t,"name of an anchor node must contain at least one character"),t.anchor=t.input.slice(e,t.position),!0}function Cn(t,e,n,i,r){var a,s,o,c,l,h,u,d,p,f=1,g=!1,y=!1;if(null!==t.listener&&t.listener("open",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,a=s=o=Ye===n||je===n,i&&bn(t,!0,-1)&&(g=!0,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)),1===f)for(;kn(t)||wn(t);)bn(t,!0,-1)?(g=!0,o=a,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)):o=!1;if(o&&(o=g||r),1!==f&&Ye!==n||(d=Ze===n||Pe===n?e:e+1,p=t.position-t.lineStart,1===f?o&&(vn(t,p)||function(t,e,n){var i,r,a,s,o,c,l,h=t.tag,u=t.anchor,d={},p=Object.create(null),f=null,g=null,y=null,m=!1,b=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=d),l=t.input.charCodeAt(t.position);0!==l;){if(m||-1===t.firstTabInLine||(t.position=t.firstTabInLine,un(t,"tab characters must not be used in indentation")),i=t.input.charCodeAt(t.position+1),a=t.line,63!==l&&58!==l||!tn(i)){if(s=t.line,o=t.lineStart,c=t.position,!Cn(t,n,Pe,!1,!0))break;if(t.line===a){for(l=t.input.charCodeAt(t.position);Je(l);)l=t.input.charCodeAt(++t.position);if(58===l)tn(l=t.input.charCodeAt(++t.position))||un(t,"a whitespace character is expected after the key-value separator within a block mapping"),m&&(yn(t,d,p,f,g,null,s,o,c),f=g=y=null),b=!0,m=!1,r=!1,f=t.tag,g=t.result;else{if(!b)return t.tag=h,t.anchor=u,!0;un(t,"can not read an implicit mapping pair; a colon is missed")}}else{if(!b)return t.tag=h,t.anchor=u,!0;un(t,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===l?(m&&(yn(t,d,p,f,g,null,s,o,c),f=g=y=null),b=!0,m=!0,r=!0):m?(m=!1,r=!0):un(t,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),t.position+=1,l=i;if((t.line===a||t.lineIndent>e)&&(m&&(s=t.line,o=t.lineStart,c=t.position),Cn(t,e,Ye,!0,r)&&(m?g=t.result:y=t.result),m||(yn(t,d,p,f,g,y,s,o,c),f=g=y=null),bn(t,!0,-1),l=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&0!==l)un(t,"bad indentation of a mapping entry");else if(t.lineIndent<e)break}return m&&yn(t,d,p,f,g,null,s,o,c),b&&(t.tag=h,t.anchor=u,t.kind="mapping",t.result=d),b}(t,p,d))||function(t,e){var n,i,r,a,s,o,c,l,h,u,d,p,f=!0,g=t.tag,y=t.anchor,m=Object.create(null);if(91===(p=t.input.charCodeAt(t.position)))s=93,l=!1,a=[];else{if(123!==p)return!1;s=125,l=!0,a={}}for(null!==t.anchor&&(t.anchorMap[t.anchor]=a),p=t.input.charCodeAt(++t.position);0!==p;){if(bn(t,!0,e),(p=t.input.charCodeAt(t.position))===s)return t.position++,t.tag=g,t.anchor=y,t.kind=l?"mapping":"sequence",t.result=a,!0;f?44===p&&un(t,"expected the node content, but found ','"):un(t,"missed comma between flow collection entries"),d=null,o=c=!1,63===p&&tn(t.input.charCodeAt(t.position+1))&&(o=c=!0,t.position++,bn(t,!0,e)),n=t.line,i=t.lineStart,r=t.position,Cn(t,e,Ze,!1,!0),u=t.tag,h=t.result,bn(t,!0,e),p=t.input.charCodeAt(t.position),!c&&t.line!==n||58!==p||(o=!0,p=t.input.charCodeAt(++t.position),bn(t,!0,e),Cn(t,e,Ze,!1,!0),d=t.result),l?yn(t,a,m,u,h,d,n,i,r):o?a.push(yn(t,null,m,u,h,d,n,i,r)):a.push(h),bn(t,!0,e),44===(p=t.input.charCodeAt(t.position))?(f=!0,p=t.input.charCodeAt(++t.position)):f=!1}un(t,"unexpected end of the stream within a flow collection")}(t,d)?y=!0:(s&&function(t,e){var n,i,r,a,s,o=ze,c=!1,l=!1,h=e,u=0,d=!1;if(124===(a=t.input.charCodeAt(t.position)))i=!1;else{if(62!==a)return!1;i=!0}for(t.kind="scalar",t.result="";0!==a;)if(43===(a=t.input.charCodeAt(++t.position))||45===a)ze===o?o=43===a?We:Ue:un(t,"repeat of a chomping mode identifier");else{if(!((r=48<=(s=a)&&s<=57?s-48:-1)>=0))break;0===r?un(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?un(t,"repeat of an indentation width identifier"):(h=e+r-1,l=!0)}if(Je(a)){do{a=t.input.charCodeAt(++t.position)}while(Je(a));if(35===a)do{a=t.input.charCodeAt(++t.position)}while(!Ke(a)&&0!==a)}for(;0!==a;){for(mn(t),t.lineIndent=0,a=t.input.charCodeAt(t.position);(!l||t.lineIndent<h)&&32===a;)t.lineIndent++,a=t.input.charCodeAt(++t.position);if(!l&&t.lineIndent>h&&(h=t.lineIndent),Ke(a))u++;else{if(t.lineIndent<h){o===We?t.result+=ne.repeat("\n",c?1+u:u):o===ze&&c&&(t.result+="\n");break}for(i?Je(a)?(d=!0,t.result+=ne.repeat("\n",c?1+u:u)):d?(d=!1,t.result+=ne.repeat("\n",u+1)):0===u?c&&(t.result+=" "):t.result+=ne.repeat("\n",u):t.result+=ne.repeat("\n",c?1+u:u),c=!0,l=!0,u=0,n=t.position;!Ke(a)&&0!==a;)a=t.input.charCodeAt(++t.position);fn(t,n,t.position,!1)}}return!0}(t,d)||function(t,e){var n,i,r;if(39!==(n=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,i=r=t.position;0!==(n=t.input.charCodeAt(t.position));)if(39===n){if(fn(t,i,t.position,!0),39!==(n=t.input.charCodeAt(++t.position)))return!0;i=t.position,t.position++,r=t.position}else Ke(n)?(fn(t,i,r,!0),xn(t,bn(t,!1,e)),i=r=t.position):t.position===t.lineStart&&_n(t)?un(t,"unexpected end of the document within a single quoted scalar"):(t.position++,r=t.position);un(t,"unexpected end of the stream within a single quoted scalar")}(t,d)||function(t,e){var n,i,r,a,s,o,c;if(34!==(o=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;0!==(o=t.input.charCodeAt(t.position));){if(34===o)return fn(t,n,t.position,!0),t.position++,!0;if(92===o){if(fn(t,n,t.position,!0),Ke(o=t.input.charCodeAt(++t.position)))bn(t,!1,e);else if(o<256&&sn[o])t.result+=on[o],t.position++;else if((s=120===(c=o)?2:117===c?4:85===c?8:0)>0){for(r=s,a=0;r>0;r--)(s=nn(o=t.input.charCodeAt(++t.position)))>=0?a=(a<<4)+s:un(t,"expected hexadecimal character");t.result+=an(a),t.position++}else un(t,"unknown escape sequence");n=i=t.position}else Ke(o)?(fn(t,n,i,!0),xn(t,bn(t,!1,e)),n=i=t.position):t.position===t.lineStart&&_n(t)?un(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}un(t,"unexpected end of the stream within a double quoted scalar")}(t,d)?y=!0:!function(t){var e,n,i;if(42!==(i=t.input.charCodeAt(t.position)))return!1;for(i=t.input.charCodeAt(++t.position),e=t.position;0!==i&&!tn(i)&&!en(i);)i=t.input.charCodeAt(++t.position);return t.position===e&&un(t,"name of an alias node must contain at least one character"),n=t.input.slice(e,t.position),Re.call(t.anchorMap,n)||un(t,'unidentified alias "'+n+'"'),t.result=t.anchorMap[n],bn(t,!0,-1),!0}(t)?function(t,e,n){var i,r,a,s,o,c,l,h,u=t.kind,d=t.result;if(tn(h=t.input.charCodeAt(t.position))||en(h)||35===h||38===h||42===h||33===h||124===h||62===h||39===h||34===h||37===h||64===h||96===h)return!1;if((63===h||45===h)&&(tn(i=t.input.charCodeAt(t.position+1))||n&&en(i)))return!1;for(t.kind="scalar",t.result="",r=a=t.position,s=!1;0!==h;){if(58===h){if(tn(i=t.input.charCodeAt(t.position+1))||n&&en(i))break}else if(35===h){if(tn(t.input.charCodeAt(t.position-1)))break}else{if(t.position===t.lineStart&&_n(t)||n&&en(h))break;if(Ke(h)){if(o=t.line,c=t.lineStart,l=t.lineIndent,bn(t,!1,-1),t.lineIndent>=e){s=!0,h=t.input.charCodeAt(t.position);continue}t.position=a,t.line=o,t.lineStart=c,t.lineIndent=l;break}}s&&(fn(t,r,a,!1),xn(t,t.line-o),r=a=t.position,s=!1),Je(h)||(a=t.position+1),h=t.input.charCodeAt(++t.position)}return fn(t,r,a,!1),!!t.result||(t.kind=u,t.result=d,!1)}(t,d,Ze===n)&&(y=!0,null===t.tag&&(t.tag="?")):(y=!0,null===t.tag&&null===t.anchor||un(t,"alias node should not have any properties")),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):0===f&&(y=o&&vn(t,p))),null===t.tag)null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);else if("?"===t.tag){for(null!==t.result&&"scalar"!==t.kind&&un(t,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+t.kind+'"'),c=0,l=t.implicitTypes.length;c<l;c+=1)if((u=t.implicitTypes[c]).resolve(t.result)){t.result=u.construct(t.result),t.tag=u.tag,null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);break}}else if("!"!==t.tag){if(Re.call(t.typeMap[t.kind||"fallback"],t.tag))u=t.typeMap[t.kind||"fallback"][t.tag];else for(u=null,c=0,l=(h=t.typeMap.multi[t.kind||"fallback"]).length;c<l;c+=1)if(t.tag.slice(0,h[c].tag.length)===h[c].tag){u=h[c];break}u||un(t,"unknown tag !<"+t.tag+">"),null!==t.result&&u.kind!==t.kind&&un(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+u.kind+'", not "'+t.kind+'"'),u.resolve(t.result,t.tag)?(t.result=u.construct(t.result,t.tag),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):un(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return null!==t.listener&&t.listener("close",t),null!==t.tag||null!==t.anchor||y}function Tn(t){var e,n,i,r,a=t.position,s=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);0!==(r=t.input.charCodeAt(t.position))&&(bn(t,!0,-1),r=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==r));){for(s=!0,r=t.input.charCodeAt(++t.position),e=t.position;0!==r&&!tn(r);)r=t.input.charCodeAt(++t.position);for(i=[],(n=t.input.slice(e,t.position)).length<1&&un(t,"directive name must not be less than one character in length");0!==r;){for(;Je(r);)r=t.input.charCodeAt(++t.position);if(35===r){do{r=t.input.charCodeAt(++t.position)}while(0!==r&&!Ke(r));break}if(Ke(r))break;for(e=t.position;0!==r&&!tn(r);)r=t.input.charCodeAt(++t.position);i.push(t.input.slice(e,t.position))}0!==r&&mn(t),Re.call(pn,n)?pn[n](t,n,i):dn(t,'unknown document directive "'+n+'"')}bn(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,bn(t,!0,-1)):s&&un(t,"directives end mark is expected"),Cn(t,t.lineIndent-1,Ye,!1,!0),bn(t,!0,-1),t.checkLineBreaks&&He.test(t.input.slice(a,t.position))&&dn(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&_n(t)?46===t.input.charCodeAt(t.position)&&(t.position+=3,bn(t,!0,-1)):t.position<t.length-1&&un(t,"end of the stream or a document separator is expected")}function En(t,e){e=e||{},0!==(t=String(t)).length&&(10!==t.charCodeAt(t.length-1)&&13!==t.charCodeAt(t.length-1)&&(t+="\n"),65279===t.charCodeAt(0)&&(t=t.slice(1)));var n=new ln(t,e),i=t.indexOf("\0");for(-1!==i&&(n.position=i,un(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)Tn(n);return n.documents}var Sn=fe,An={loadAll:function(t,e,n){null!==e&&"object"==typeof e&&void 0===n&&(n=e,e=null);var i=En(t,n);if("function"!=typeof e)return i;for(var r=0,a=i.length;r<a;r+=1)e(i[r])},load:function(t,e){var n=En(t,e);if(0!==n.length){if(1===n.length)return n[0];throw new ae("expected a single document in the stream, but found more")}}}.load;const Ln=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s;const Bn=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Nn=/\s*%%.*\n/gm,Dn={},On=function(t,e){t=t.replace(Ln,"").replace(Bn,"").replace(Nn,"\n");for(const[n,{detector:i}]of Object.entries(Dn)){if(i(t,e))return n}throw new Error(`No diagram type detected for text: ${t}`)},Mn=(...t)=>{for(const{id:e,detector:n,loader:i}of t)In(e,n,i)},In=(t,e,n)=>{Dn[t]?Bt.error(`Detector with key ${t} already exists`):Dn[t]={detector:e,loader:n},Bt.debug(`Detector with key ${t} added${n?" with loader":""}`)},Fn=function(t,e,n){const{depth:i,clobber:r}=Object.assign({depth:2,clobber:!1},n);return Array.isArray(e)&&!Array.isArray(t)?(e.forEach((e=>Fn(t,e,n))),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach((e=>{t.includes(e)||t.push(e)})),t):void 0===t||i<=0?null!=t&&"object"==typeof t&&"object"==typeof e?Object.assign(t,e):e:(void 0!==e&&"object"==typeof t&&"object"==typeof e&&Object.keys(e).forEach((n=>{"object"!=typeof e[n]||void 0!==t[n]&&"object"!=typeof t[n]?(r||"object"!=typeof t[n]&&"object"!=typeof e[n])&&(t[n]=e[n]):(void 0===t[n]&&(t[n]=Array.isArray(e[n])?[]:{}),t[n]=Fn(t[n],e[n],{depth:i-1,clobber:r}))})),t)},$n=Fn,Rn={curveBasis:o.$0Z,curveBasisClosed:o.Dts,curveBasisOpen:o.WQY,curveBumpX:o.qpX,curveBumpY:o.u93,curveBundle:o.tFB,curveCardinalClosed:o.OvA,curveCardinalOpen:o.dCK,curveCardinal:o.YY7,curveCatmullRomClosed:o.fGX,curveCatmullRomOpen:o.$m7,curveCatmullRom:o.zgE,curveLinear:o.c_6,curveLinearClosed:o.fxm,curveMonotoneX:o.FdL,curveMonotoneY:o.ak_,curveNatural:o.SxZ,curveStep:o.eA_,curveStepAfter:o.jsv,curveStepBefore:o.iJ},Zn=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Pn=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,jn=function(t,e=null){try{const n=new RegExp(`[%]{2}(?![{]${Pn.source})(?=[}][%]{2}).*\n`,"ig");let i;t=t.trim().replace(n,"").replace(/'/gm,'"'),Bt.debug(`Detecting diagram directive${null!==e?" type:"+e:""} based on the text:${t}`);const r=[];for(;null!==(i=Zn.exec(t));)if(i.index===Zn.lastIndex&&Zn.lastIndex++,i&&!e||e&&i[1]&&i[1].match(e)||e&&i[2]&&i[2].match(e)){const t=i[1]?i[1]:i[2],e=i[3]?i[3].trim():i[4]?JSON.parse(i[4].trim()):null;r.push({type:t,args:e})}return 0===r.length&&r.push({type:t,args:null}),1===r.length?r[0]:r}catch(n){return Bt.error(`ERROR: ${n.message} - Unable to parse directive\n ${null!==e?" type:"+e:""} based on the text:${t}`),{type:null,args:null}}};function Yn(t,e){if(!t)return e;const n=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return Rn[n]||e}function zn(t,e){return t&&e?Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)):0}function Un(t){let e="",n="";for(const i of t)void 0!==i&&(i.startsWith("color:")||i.startsWith("text-align:")?n=n+i+";":e=e+i+";");return{style:e,labelStyle:n}}let Wn=0;const qn=()=>(Wn++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Wn);const Hn=t=>function(t){let e="";const n="0123456789abcdef";for(let i=0;i<t;i++)e+=n.charAt(Math.floor(16*Math.random()));return e}(t.length),Vn=function(t,e){const n=e.text.replace(jt.lineBreakRegex," "),[,i]=ri(e.fontSize),r=t.append("text");r.attr("x",e.x),r.attr("y",e.y),r.style("text-anchor",e.anchor),r.style("font-family",e.fontFamily),r.style("font-size",i),r.style("font-weight",e.fontWeight),r.attr("fill",e.fill),void 0!==e.class&&r.attr("class",e.class);const a=r.append("tspan");return a.attr("x",e.x+2*e.textMargin),a.attr("fill",e.fill),a.text(n),r},Gn=(0,v.Z)(((t,e,n)=>{if(!t)return t;if(n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"<br/>"},n),jt.lineBreakRegex.test(t))return t;const i=t.split(" "),r=[];let a="";return i.forEach(((t,s)=>{const o=Kn(`${t} `,n),c=Kn(a,n);if(o>e){const{hyphenatedStrings:i,remainingWord:s}=Xn(t,e,"-",n);r.push(a,...i),a=s}else c+o>=e?(r.push(a),a=t):a=[a,t].filter(Boolean).join(" ");s+1===i.length&&r.push(a)})),r.filter((t=>""!==t)).join(n.joinWith)}),((t,e,n)=>`${t}${e}${n.fontSize}${n.fontWeight}${n.fontFamily}${n.joinWith}`)),Xn=(0,v.Z)(((t,e,n="-",i)=>{i=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},i);const r=[...t],a=[];let s="";return r.forEach(((t,o)=>{const c=`${s}${t}`;if(Kn(c,i)>=e){const t=o+1,e=r.length===t,i=`${c}${n}`;a.push(e?c:i),s=""}else s=c})),{hyphenatedStrings:a,remainingWord:s}}),((t,e,n="-",i)=>`${t}${e}${n}${i.fontSize}${i.fontWeight}${i.fontFamily}`));function Qn(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:15},e),Jn(t,e).height}function Kn(t,e){return e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e),Jn(t,e).width}const Jn=(0,v.Z)(((t,e)=>{e=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial"},e);const{fontSize:n,fontFamily:i,fontWeight:r}=e;if(!t)return{width:0,height:0};const[,a]=ri(n),s=["sans-serif",i],c=t.split(jt.lineBreakRegex),l=[],h=(0,o.Ys)("body");if(!h.remove)return{width:0,height:0,lineHeight:0};const u=h.append("svg");for(const o of s){let t=0;const e={width:0,height:0,lineHeight:0};for(const n of c){const i={x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0};i.text=n;const s=Vn(u,i).style("font-size",a).style("font-weight",r).style("font-family",o),c=(s._groups||s)[0][0].getBBox();e.width=Math.round(Math.max(e.width,c.width)),t=Math.round(c.height),e.height+=t,e.lineHeight=Math.round(Math.max(e.lineHeight,t))}l.push(e)}u.remove();return l[isNaN(l[1].height)||isNaN(l[1].width)||isNaN(l[1].lineHeight)||l[0].height>l[1].height&&l[0].width>l[1].width&&l[0].lineHeight>l[1].lineHeight?0:1]}),((t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`));let ti;const ei=t=>{if(Bt.debug("directiveSanitizer called with",t),"object"==typeof t&&(t.length?t.forEach((t=>ei(t))):Object.keys(t).forEach((e=>{Bt.debug("Checking key",e),e.startsWith("__")&&(Bt.debug("sanitize deleting __ option",e),delete t[e]),e.includes("proto")&&(Bt.debug("sanitize deleting proto option",e),delete t[e]),e.includes("constr")&&(Bt.debug("sanitize deleting constr option",e),delete t[e]),e.includes("themeCSS")&&(Bt.debug("sanitizing themeCss option"),t[e]=ni(t[e])),e.includes("fontFamily")&&(Bt.debug("sanitizing fontFamily option"),t[e]=ni(t[e])),e.includes("altFontFamily")&&(Bt.debug("sanitizing altFontFamily option"),t[e]=ni(t[e])),Jt.includes(e)?"object"==typeof t[e]&&(Bt.debug("sanitize deleting object",e),ei(t[e])):(Bt.debug("sanitize deleting option",e),delete t[e])}))),t.themeVariables){const e=Object.keys(t.themeVariables);for(const n of e){const e=t.themeVariables[n];e&&e.match&&!e.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[n]="")}}Bt.debug("After sanitization",t)},ni=t=>{let e=0,n=0;for(const i of t){if(e<n)return"{ /* ERROR: Unbalanced CSS */ }";"{"===i?e++:"}"===i&&n++}return e!==n?"{ /* ERROR: Unbalanced CSS */ }":t};function ii(t){return"str"in t}const ri=t=>{if("number"==typeof t)return[t,t+"px"];const e=parseInt(t,10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},ai={assignWithDepth:$n,wrapLabel:Gn,calculateTextHeight:Qn,calculateTextWidth:Kn,calculateTextDimensions:Jn,detectInit:function(t,e){const n=jn(t,/(?:init\b)|(?:initialize\b)/);let i={};if(Array.isArray(n)){const t=n.map((t=>t.args));ei(t),i=$n(i,[...t])}else i=n.args;if(i){let n=On(t,e);["config"].forEach((t=>{void 0!==i[t]&&("flowchart-v2"===n&&(n="flowchart"),i[n]=i[t],delete i[t])}))}return i},detectDirective:jn,isSubstringInArray:function(t,e){for(const[n,i]of e.entries())if(i.match(t))return n;return-1},interpolateToCurve:Yn,calcLabelPosition:function(t){return 1===t.length?t[0]:function(t){let e,n=0;t.forEach((t=>{n+=zn(t,e),e=t}));let i,r=n/2;return e=void 0,t.forEach((t=>{if(e&&!i){const n=zn(t,e);if(n<r)r-=n;else{const a=r/n;a<=0&&(i=e),a>=1&&(i={x:t.x,y:t.y}),a>0&&a<1&&(i={x:(1-a)*e.x+a*t.x,y:(1-a)*e.y+a*t.y})}}e=t})),i}(t)},calcCardinalityPosition:(t,e,n)=>{let i;Bt.info(`our points ${JSON.stringify(e)}`),e[0]!==n&&(e=e.reverse());let r,a=25;i=void 0,e.forEach((t=>{if(i&&!r){const e=zn(t,i);if(e<a)a-=e;else{const n=a/e;n<=0&&(r=i),n>=1&&(r={x:t.x,y:t.y}),n>0&&n<1&&(r={x:(1-n)*i.x+n*t.x,y:(1-n)*i.y+n*t.y})}}i=t}));const s=t?10:5,o=Math.atan2(e[0].y-r.y,e[0].x-r.x),c={x:0,y:0};return c.x=Math.sin(o)*s+(e[0].x+r.x)/2,c.y=-Math.cos(o)*s+(e[0].y+r.y)/2,c},calcTerminalLabelPosition:function(t,e,n){let i,r=JSON.parse(JSON.stringify(n));Bt.info("our points",r),"start_left"!==e&&"start_right"!==e&&(r=r.reverse()),r.forEach((t=>{i=t}));let a,s=25+t;i=void 0,r.forEach((t=>{if(i&&!a){const e=zn(t,i);if(e<s)s-=e;else{const n=s/e;n<=0&&(a=i),n>=1&&(a={x:t.x,y:t.y}),n>0&&n<1&&(a={x:(1-n)*i.x+n*t.x,y:(1-n)*i.y+n*t.y})}}i=t}));const o=10+.5*t,c=Math.atan2(r[0].y-a.y,r[0].x-a.x),l={x:0,y:0};return l.x=Math.sin(c)*o+(r[0].x+a.x)/2,l.y=-Math.cos(c)*o+(r[0].y+a.y)/2,"start_left"===e&&(l.x=Math.sin(c+Math.PI)*o+(r[0].x+a.x)/2,l.y=-Math.cos(c+Math.PI)*o+(r[0].y+a.y)/2),"end_right"===e&&(l.x=Math.sin(c-Math.PI)*o+(r[0].x+a.x)/2-5,l.y=-Math.cos(c-Math.PI)*o+(r[0].y+a.y)/2-5),"end_left"===e&&(l.x=Math.sin(c)*o+(r[0].x+a.x)/2-5,l.y=-Math.cos(c)*o+(r[0].y+a.y)/2-5),l},formatUrl:function(t,e){const n=t.trim();if(n)return"loose"!==e.securityLevel?(0,s.Nm)(n):n},getStylesFromArray:Un,generateId:qn,random:Hn,runFunc:(t,...e)=>{const n=t.split("."),i=n.length-1,r=n[i];let a=window;for(let s=0;s<i;s++)if(a=a[n[s]],!a)return;a[r](...e)},entityDecode:function(t){return ti=ti||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),ti.innerHTML=t,unescape(ti.textContent)},initIdGenerator:class{constructor(t,e){this.deterministic=t,this.seed=e,this.count=e?e.length:0}next(){return this.deterministic?this.count++:Date.now()}},directiveSanitizer:ei,sanitizeCss:ni,insertTitle:(t,e,n,i)=>{if(!i)return;const r=t.node().getBBox();t.append("text").text(i).attr("x",r.x+r.width/2).attr("y",-n).attr("class",e)},parseFontSize:ri},si="9.4.3",oi=Object.freeze(te);let ci,li=$n({},oi),hi=[],ui=$n({},oi);const di=(t,e)=>{let n=$n({},t),i={};for(const r of e)yi(r),i=$n(i,r);if(n=$n(n,i),i.theme&&i.theme in Xt){const t=$n({},ci),e=$n(t.themeVariables||{},i.themeVariables);n.theme&&n.theme in Xt&&(n.themeVariables=Xt[n.theme].getThemeVariables(e))}return ui=n,vi(ui),ui},pi=()=>$n({},li),fi=t=>(vi(t),$n(ui,t),gi()),gi=()=>$n({},ui),yi=t=>{["secure",...li.secure??[]].forEach((e=>{void 0!==t[e]&&(Bt.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])})),Object.keys(t).forEach((e=>{0===e.indexOf("__")&&delete t[e]})),Object.keys(t).forEach((e=>{"string"==typeof t[e]&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],"object"==typeof t[e]&&yi(t[e])}))},mi=t=>{t.fontFamily&&(t.themeVariables&&t.themeVariables.fontFamily||(t.themeVariables={fontFamily:t.fontFamily})),hi.push(t),di(li,hi)},bi=(t=li)=>{hi=[],di(t,hi)};var _i=(t=>(t.LAZY_LOAD_DEPRECATED="The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead.",t))(_i||{});const xi={},vi=t=>{var e;t&&((t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&(xi[e="LAZY_LOAD_DEPRECATED"]||(Bt.warn(_i[e]),xi[e]=!0)))},ki=function(t,e,n,i){const r=function(t,e,n){let i=new Map;return n?(i.set("width","100%"),i.set("style",`max-width: ${e}px;`)):(i.set("height",t),i.set("width",e)),i}(e,n,i);!function(t,e){for(let n of e)t.attr(n[0],n[1])}(t,r)},wi=function(t,e,n,i){const r=e.node().getBBox(),a=r.width,s=r.height;Bt.info(`SVG bounds: ${a}x${s}`,r);let o=0,c=0;Bt.info(`Graph bounds: ${o}x${c}`,t),o=a+2*n,c=s+2*n,Bt.info(`Calculated bounds: ${o}x${c}`),ki(e,c,o,i);const l=`${r.x-n} ${r.y-n} ${r.width+2*n} ${r.height+2*n}`;e.attr("viewBox",l)},Ci=t=>`g.classGroup text {\n fill: ${t.nodeBorder};\n fill: ${t.classText};\n stroke: none;\n font-family: ${t.fontFamily};\n font-size: 10px;\n\n .title {\n font-weight: bolder;\n }\n\n}\n\n.nodeLabel, .edgeLabel {\n color: ${t.classText};\n}\n.edgeLabel .label rect {\n fill: ${t.mainBkg};\n}\n.label text {\n fill: ${t.classText};\n}\n.edgeLabel .label span {\n background: ${t.mainBkg};\n}\n\n.classTitle {\n font-weight: bolder;\n}\n.node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n\n.divider {\n stroke: ${t.nodeBorder};\n stroke: 1;\n}\n\ng.clickable {\n cursor: pointer;\n}\n\ng.classGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.classGroup line {\n stroke: ${t.nodeBorder};\n stroke-width: 1;\n}\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.classLabel .label {\n fill: ${t.nodeBorder};\n font-size: 10px;\n}\n\n.relation {\n stroke: ${t.lineColor};\n stroke-width: 1;\n fill: none;\n}\n\n.dashed-line{\n stroke-dasharray: 3;\n}\n\n.dotted-line{\n stroke-dasharray: 1 2;\n}\n\n#compositionStart, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionStart, .extension {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopStart, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopEnd, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n.edgeTerminals {\n font-size: 11px;\n}\n\n.classTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,Ti=t=>`\n .entityBox {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n }\n\n .attributeBoxOdd {\n fill: ${t.attributeBackgroundColorOdd};\n stroke: ${t.nodeBorder};\n }\n\n .attributeBoxEven {\n fill: ${t.attributeBackgroundColorEven};\n stroke: ${t.nodeBorder};\n }\n\n .relationshipLabelBox {\n fill: ${t.tertiaryColor};\n opacity: 0.7;\n background-color: ${t.tertiaryColor};\n rect {\n opacity: 0.5;\n }\n }\n\n .relationshipLine {\n stroke: ${t.lineColor};\n }\n\n .entityTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n } \n`,Ei=()=>"",Si=t=>`.label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n .cluster-label text {\n fill: ${t.titleColor};\n }\n .cluster-label span {\n color: ${t.titleColor};\n }\n\n .label text,span {\n fill: ${t.nodeTextColor||t.textColor};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n\n .cluster rect {\n fill: ${t.clusterBkg};\n stroke: ${t.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n .cluster span {\n color: ${t.titleColor};\n }\n /* .cluster div {\n color: ${t.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${t.fontFamily};\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n`,Ai=t=>`\n .mermaid-main-font {\n font-family: "trebuchet ms", verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n .exclude-range {\n fill: ${t.excludeBkgColor};\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: ${t.sectionBkgColor};\n }\n\n .section2 {\n fill: ${t.sectionBkgColor2};\n }\n\n .section1,\n .section3 {\n fill: ${t.altSectionBkgColor};\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle1 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle2 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle3 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle {\n text-anchor: start;\n // font-size: ${t.ganttFontSize};\n // text-height: 14px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ${t.gridColor};\n opacity: 0.8;\n shape-rendering: crispEdges;\n text {\n font-family: ${t.fontFamily};\n fill: ${t.textColor};\n }\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ${t.todayLineColor};\n stroke-width: 2px;\n }\n\n\n /* Task styling */\n\n /* Default task */\n\n .task {\n stroke-width: 2;\n }\n\n .taskText {\n text-anchor: middle;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n\n // .taskText:not([font-size]) {\n // font-size: ${t.ganttFontSize};\n // }\n\n .taskTextOutsideRight {\n fill: ${t.taskTextDarkColor};\n text-anchor: start;\n // font-size: ${t.ganttFontSize};\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n\n }\n\n .taskTextOutsideLeft {\n fill: ${t.taskTextDarkColor};\n text-anchor: end;\n // font-size: ${t.ganttFontSize};\n }\n\n /* Special case clickable */\n .task.clickable {\n cursor: pointer;\n }\n .taskText.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n /* Specific task settings for the sections*/\n\n .taskText0,\n .taskText1,\n .taskText2,\n .taskText3 {\n fill: ${t.taskTextColor};\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ${t.taskBkgColor};\n stroke: ${t.taskBorderColor};\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ${t.taskTextOutsideColor};\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ${t.taskTextOutsideColor};\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ${t.activeTaskBkgColor};\n stroke: ${t.activeTaskBorderColor};\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ${t.doneTaskBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.critBkgColor};\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.activeTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges;\n }\n\n .milestone {\n transform: rotate(45deg) scale(0.8,0.8);\n }\n\n .milestoneText {\n font-style: italic;\n }\n .doneCritText0,\n .doneCritText1,\n .doneCritText2,\n .doneCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor} ;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n`,Li=()=>"",Bi=t=>`\n .pieCircle{\n stroke: ${t.pieStrokeColor};\n stroke-width : ${t.pieStrokeWidth};\n opacity : ${t.pieOpacity};\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${t.pieTitleTextSize};\n fill: ${t.pieTitleTextColor};\n font-family: ${t.fontFamily};\n }\n .slice {\n font-family: ${t.fontFamily};\n fill: ${t.pieSectionTextColor};\n font-size:${t.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${t.pieLegendTextColor};\n font-family: ${t.fontFamily};\n font-size: ${t.pieLegendTextSize};\n }\n`,Ni=t=>`\n\n marker {\n fill: ${t.relationColor};\n stroke: ${t.relationColor};\n }\n\n marker.cross {\n stroke: ${t.lineColor};\n }\n\n svg {\n font-family: ${t.fontFamily};\n font-size: ${t.fontSize};\n }\n\n .reqBox {\n fill: ${t.requirementBackground};\n fill-opacity: 100%;\n stroke: ${t.requirementBorderColor};\n stroke-width: ${t.requirementBorderSize};\n }\n \n .reqTitle, .reqLabel{\n fill: ${t.requirementTextColor};\n }\n .reqLabelBox {\n fill: ${t.relationLabelBackground};\n fill-opacity: 100%;\n }\n\n .req-title-line {\n stroke: ${t.requirementBorderColor};\n stroke-width: ${t.requirementBorderSize};\n }\n .relationshipLine {\n stroke: ${t.relationColor};\n stroke-width: 1;\n }\n .relationshipLabel {\n fill: ${t.relationLabelColor};\n }\n\n`,Di=t=>`.actor {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n\n text.actor > tspan {\n fill: ${t.actorTextColor};\n stroke: none;\n }\n\n .actor-line {\n stroke: ${t.actorLineColor};\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ${t.signalColor};\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ${t.signalColor};\n }\n\n #arrowhead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .sequenceNumber {\n fill: ${t.sequenceNumberColor};\n }\n\n #sequencenumber {\n fill: ${t.signalColor};\n }\n\n #crosshead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .messageText {\n fill: ${t.signalTextColor};\n stroke: none;\n }\n\n .labelBox {\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBkgColor};\n }\n\n .labelText, .labelText > tspan {\n fill: ${t.labelTextColor};\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ${t.loopTextColor};\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBorderColor};\n }\n\n .note {\n //stroke: #decc93;\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n }\n\n .noteText, .noteText > tspan {\n fill: ${t.noteTextColor};\n stroke: none;\n }\n\n .activation0 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation1 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation2 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .actorPopupMenu {\n position: absolute;\n }\n\n .actorPopupMenuPanel {\n position: absolute;\n fill: ${t.actorBkg};\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));\n}\n .actor-man line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n .actor-man circle, line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n stroke-width: 2px;\n }\n`,Oi=t=>`\ndefs #statediagram-barbEnd {\n fill: ${t.transitionColor};\n stroke: ${t.transitionColor};\n }\ng.stateGroup text {\n fill: ${t.nodeBorder};\n stroke: none;\n font-size: 10px;\n}\ng.stateGroup text {\n fill: ${t.textColor};\n stroke: none;\n font-size: 10px;\n\n}\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: ${t.stateLabelColor};\n}\n\ng.stateGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.stateGroup line {\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.transition {\n stroke: ${t.transitionColor};\n stroke-width: 1;\n fill: none;\n}\n\n.stateGroup .composit {\n fill: ${t.background};\n border-bottom: 1px\n}\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px\n}\n\n.state-note {\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n\n text {\n fill: ${t.noteTextColor};\n stroke: none;\n font-size: 10px;\n }\n}\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n fill: ${t.labelBackgroundColor};\n opacity: 0.5;\n}\n.edgeLabel .label text {\n fill: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n.label div .edgeLabel {\n color: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n\n.stateLabel text {\n fill: ${t.stateLabelColor};\n font-size: 10px;\n font-weight: bold;\n}\n\n.node circle.state-start {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node .fork-join {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node circle.state-end {\n fill: ${t.innerEndBackground};\n stroke: ${t.background};\n stroke-width: 1.5\n}\n.end-state-inner {\n fill: ${t.compositeBackground||t.background};\n // stroke: ${t.background};\n stroke-width: 1.5\n}\n\n.node rect {\n fill: ${t.stateBkg||t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n.node polygon {\n fill: ${t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};;\n stroke-width: 1px;\n}\n#statediagram-barbEnd {\n fill: ${t.lineColor};\n}\n\n.statediagram-cluster rect {\n fill: ${t.compositeTitleBackground};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n color: ${t.stateLabelColor};\n}\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state .divider {\n stroke: ${t.stateBorder||t.nodeBorder};\n}\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n fill: ${t.compositeBackground||t.background};\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.statediagram-cluster .inner {\n rx:0;\n ry:0;\n}\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.note-edge {\n stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n\n.statediagram-note text {\n fill: ${t.noteTextColor};\n}\n\n.statediagram-note .nodeLabel {\n color: ${t.noteTextColor};\n}\n.statediagram .edgeLabel {\n color: red; // ${t.noteTextColor};\n}\n\n#dependencyStart, #dependencyEnd {\n fill: ${t.lineColor};\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.statediagramTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,Mi=t=>`.label {\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n color: ${t.textColor};\n }\n .mouth {\n stroke: #666;\n }\n\n line {\n stroke: ${t.textColor}\n }\n\n .legend {\n fill: ${t.textColor};\n }\n\n .label text {\n fill: #333;\n }\n .label {\n color: ${t.textColor}\n }\n\n .face {\n ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"};\n stroke: #999;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n }\n text-align: center;\n }\n\n .cluster rect {\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .task-type-0, .section-type-0 {\n ${t.fillType0?`fill: ${t.fillType0}`:""};\n }\n .task-type-1, .section-type-1 {\n ${t.fillType0?`fill: ${t.fillType1}`:""};\n }\n .task-type-2, .section-type-2 {\n ${t.fillType0?`fill: ${t.fillType2}`:""};\n }\n .task-type-3, .section-type-3 {\n ${t.fillType0?`fill: ${t.fillType3}`:""};\n }\n .task-type-4, .section-type-4 {\n ${t.fillType0?`fill: ${t.fillType4}`:""};\n }\n .task-type-5, .section-type-5 {\n ${t.fillType0?`fill: ${t.fillType5}`:""};\n }\n .task-type-6, .section-type-6 {\n ${t.fillType0?`fill: ${t.fillType6}`:""};\n }\n .task-type-7, .section-type-7 {\n ${t.fillType0?`fill: ${t.fillType7}`:""};\n }\n\n .actor-0 {\n ${t.actor0?`fill: ${t.actor0}`:""};\n }\n .actor-1 {\n ${t.actor1?`fill: ${t.actor1}`:""};\n }\n .actor-2 {\n ${t.actor2?`fill: ${t.actor2}`:""};\n }\n .actor-3 {\n ${t.actor3?`fill: ${t.actor3}`:""};\n }\n .actor-4 {\n ${t.actor4?`fill: ${t.actor4}`:""};\n }\n .actor-5 {\n ${t.actor5?`fill: ${t.actor5}`:""};\n }\n`,Ii=t=>`.person {\n stroke: ${t.personBorder};\n fill: ${t.personBkg};\n }\n`,Fi={flowchart:Si,"flowchart-v2":Si,sequence:Di,gantt:Ai,classDiagram:Ci,"classDiagram-v2":Ci,class:Ci,stateDiagram:Oi,state:Oi,info:Li,pie:Bi,er:Ti,error:Ei,journey:Mi,requirement:Ni,c4:Ii},$i=(t,e,n)=>{let i="";return t in Fi&&Fi[t]?i=Fi[t](n):Bt.warn(`No theme found for ${t}`),` & {\n font-family: ${n.fontFamily};\n font-size: ${n.fontSize};\n fill: ${n.textColor}\n }\n\n /* Classes common for multiple diagrams */\n\n & .error-icon {\n fill: ${n.errorBkgColor};\n }\n & .error-text {\n fill: ${n.errorTextColor};\n stroke: ${n.errorTextColor};\n }\n\n & .edge-thickness-normal {\n stroke-width: 2px;\n }\n & .edge-thickness-thick {\n stroke-width: 3.5px\n }\n & .edge-pattern-solid {\n stroke-dasharray: 0;\n }\n\n & .edge-pattern-dashed{\n stroke-dasharray: 3;\n }\n .edge-pattern-dotted {\n stroke-dasharray: 2;\n }\n\n & .marker {\n fill: ${n.lineColor};\n stroke: ${n.lineColor};\n }\n & .marker.cross {\n stroke: ${n.lineColor};\n }\n\n & svg {\n font-family: ${n.fontFamily};\n font-size: ${n.fontSize};\n }\n\n ${i}\n\n ${e}\n`};let Ri="",Zi="",Pi="";const ji=t=>It(t,gi()),Yi=function(){Ri="",Pi="",Zi=""},zi=function(t){Ri=ji(t).replace(/^\s+/g,"")},Ui=function(){return Ri||Zi},Wi=function(t){Pi=ji(t).replace(/\n\s+/g,"\n")},qi=function(){return Pi},Hi=function(t){Zi=ji(t)},Vi=function(){return Zi},Gi={setAccTitle:zi,getAccTitle:Ui,setDiagramTitle:Hi,getDiagramTitle:Vi,getAccDescription:qi,setAccDescription:Wi,clear:Yi},Xi=Object.freeze(Object.defineProperty({__proto__:null,clear:Yi,default:Gi,getAccDescription:qi,getAccTitle:Ui,getDiagramTitle:Vi,setAccDescription:Wi,setAccTitle:zi,setDiagramTitle:Hi},Symbol.toStringTag,{value:"Module"}));let Qi={};const Ki=function(t,e,n,i){Bt.debug("parseDirective is being called",e,n,i);try{if(void 0!==e)switch(e=e.trim(),n){case"open_directive":Qi={};break;case"type_directive":if(!Qi)throw new Error("currentDirective is undefined");Qi.type=e.toLowerCase();break;case"arg_directive":if(!Qi)throw new Error("currentDirective is undefined");Qi.args=JSON.parse(e);break;case"close_directive":Ji(t,Qi,i),Qi=void 0}}catch(r){Bt.error(`Error while rendering sequenceDiagram directive: ${e} jison context: ${n}`),Bt.error(r.message)}},Ji=function(t,e,n){switch(Bt.info(`Directive type=${e.type} with args:`,e.args),e.type){case"init":case"initialize":["config"].forEach((t=>{void 0!==e.args[t]&&("flowchart-v2"===n&&(n="flowchart"),e.args[n]=e.args[t],delete e.args[t])})),Bt.info("sanitize in handleDirective",e.args),ei(e.args),Bt.info("sanitize in handleDirective (done)",e.args),mi(e.args);break;case"wrap":case"nowrap":t&&t.setWrap&&t.setWrap("wrap"===e.type);break;case"themeCss":Bt.warn("themeCss encountered");break;default:Bt.warn(`Unhandled directive: source: '%%{${e.type}: ${JSON.stringify(e.args?e.args:{})}}%%`,e)}},tr=Bt,er=Nt,nr=gi,ir=t=>It(t,nr()),rr=wi,ar=(t,e,n,i)=>Ki(t,e,n,i),sr={},or=(t,e,n)=>{if(sr[t])throw new Error(`Diagram ${t} already registered.`);var i,r;sr[t]=e,n&&In(t,n),i=t,r=e.styles,Fi[i]=r,e.injectUtils&&e.injectUtils(tr,er,nr,ir,rr,Xi,ar)},cr=t=>{if(t in sr)return sr[t];throw new Error(`Diagram ${t} not found.`)};var lr=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,4],i=[1,7],r=[1,5],a=[1,9],s=[1,6],o=[2,6],c=[1,16],l=[6,8,14,20,22,24,25,27,29,32,37,40,50,55],h=[8,14,20,22,24,25,27,29,32,37,40],u=[8,13,14,20,22,24,25,27,29,32,37,40],d=[1,26],p=[6,8,14,50,55],f=[8,14,55],g=[1,53],y=[1,52],m=[8,14,30,33,35,38,55],b=[1,67],_=[1,68],x=[1,69],v=[8,14,33,35,42,55],k={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,GG:6,document:7,EOF:8,":":9,DIR:10,options:11,body:12,OPT:13,NL:14,line:15,statement:16,commitStatement:17,mergeStatement:18,cherryPickStatement:19,acc_title:20,acc_title_value:21,acc_descr:22,acc_descr_value:23,acc_descr_multiline_value:24,section:25,branchStatement:26,CHECKOUT:27,ref:28,BRANCH:29,ORDER:30,NUM:31,CHERRY_PICK:32,COMMIT_ID:33,STR:34,COMMIT_TAG:35,EMPTYSTR:36,MERGE:37,COMMIT_TYPE:38,commitType:39,COMMIT:40,commit_arg:41,COMMIT_MSG:42,NORMAL:43,REVERSE:44,HIGHLIGHT:45,openDirective:46,typeDirective:47,closeDirective:48,argDirective:49,open_directive:50,type_directive:51,arg_directive:52,close_directive:53,ID:54,";":55,$accept:0,$end:1},terminals_:{2:"error",6:"GG",8:"EOF",9:":",10:"DIR",13:"OPT",14:"NL",20:"acc_title",21:"acc_title_value",22:"acc_descr",23:"acc_descr_value",24:"acc_descr_multiline_value",25:"section",27:"CHECKOUT",29:"BRANCH",30:"ORDER",31:"NUM",32:"CHERRY_PICK",33:"COMMIT_ID",34:"STR",35:"COMMIT_TAG",36:"EMPTYSTR",37:"MERGE",38:"COMMIT_TYPE",40:"COMMIT",42:"COMMIT_MSG",43:"NORMAL",44:"REVERSE",45:"HIGHLIGHT",50:"open_directive",51:"type_directive",52:"arg_directive",53:"close_directive",54:"ID",55:";"},productions_:[0,[3,2],[3,2],[3,3],[3,4],[3,5],[7,0],[7,2],[11,2],[11,1],[12,0],[12,2],[15,2],[15,1],[16,1],[16,1],[16,1],[16,2],[16,2],[16,1],[16,1],[16,1],[16,2],[26,2],[26,4],[19,3],[19,5],[19,5],[19,5],[19,5],[18,2],[18,4],[18,4],[18,4],[18,6],[18,6],[18,6],[18,6],[18,6],[18,6],[18,8],[18,8],[18,8],[18,8],[18,8],[18,8],[17,2],[17,3],[17,3],[17,5],[17,5],[17,3],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,3],[17,5],[17,5],[17,5],[17,5],[17,5],[17,5],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,7],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[17,9],[41,0],[41,1],[39,1],[39,1],[39,1],[5,3],[5,5],[46,1],[47,1],[49,1],[48,1],[28,1],[28,1],[4,1],[4,1],[4,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 3:return a[o];case 4:return a[o-1];case 5:return i.setDirection(a[o-3]),a[o-1];case 7:i.setOptions(a[o-1]),this.$=a[o];break;case 8:a[o-1]+=a[o],this.$=a[o-1];break;case 10:this.$=[];break;case 11:a[o-1].push(a[o]),this.$=a[o-1];break;case 12:this.$=a[o-1];break;case 17:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 18:case 19:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 20:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 22:i.checkout(a[o]);break;case 23:i.branch(a[o]);break;case 24:i.branch(a[o-2],a[o]);break;case 25:i.cherryPick(a[o],"",void 0);break;case 26:i.cherryPick(a[o-2],"",a[o]);break;case 27:case 29:i.cherryPick(a[o-2],"","");break;case 28:i.cherryPick(a[o],"",a[o-2]);break;case 30:i.merge(a[o],"","","");break;case 31:i.merge(a[o-2],a[o],"","");break;case 32:i.merge(a[o-2],"",a[o],"");break;case 33:i.merge(a[o-2],"","",a[o]);break;case 34:i.merge(a[o-4],a[o],"",a[o-2]);break;case 35:i.merge(a[o-4],"",a[o],a[o-2]);break;case 36:i.merge(a[o-4],"",a[o-2],a[o]);break;case 37:i.merge(a[o-4],a[o-2],a[o],"");break;case 38:i.merge(a[o-4],a[o-2],"",a[o]);break;case 39:i.merge(a[o-4],a[o],a[o-2],"");break;case 40:i.merge(a[o-6],a[o-4],a[o-2],a[o]);break;case 41:i.merge(a[o-6],a[o],a[o-4],a[o-2]);break;case 42:i.merge(a[o-6],a[o-4],a[o],a[o-2]);break;case 43:i.merge(a[o-6],a[o-2],a[o-4],a[o]);break;case 44:i.merge(a[o-6],a[o],a[o-2],a[o-4]);break;case 45:i.merge(a[o-6],a[o-2],a[o],a[o-4]);break;case 46:i.commit(a[o]);break;case 47:i.commit("","",i.commitType.NORMAL,a[o]);break;case 48:i.commit("","",a[o],"");break;case 49:i.commit("","",a[o],a[o-2]);break;case 50:i.commit("","",a[o-2],a[o]);break;case 51:i.commit("",a[o],i.commitType.NORMAL,"");break;case 52:i.commit("",a[o-2],i.commitType.NORMAL,a[o]);break;case 53:i.commit("",a[o],i.commitType.NORMAL,a[o-2]);break;case 54:i.commit("",a[o-2],a[o],"");break;case 55:i.commit("",a[o],a[o-2],"");break;case 56:i.commit("",a[o-4],a[o-2],a[o]);break;case 57:i.commit("",a[o-4],a[o],a[o-2]);break;case 58:i.commit("",a[o-2],a[o-4],a[o]);break;case 59:i.commit("",a[o],a[o-4],a[o-2]);break;case 60:i.commit("",a[o],a[o-2],a[o-4]);break;case 61:i.commit("",a[o-2],a[o],a[o-4]);break;case 62:i.commit(a[o],"",i.commitType.NORMAL,"");break;case 63:i.commit(a[o],"",i.commitType.NORMAL,a[o-2]);break;case 64:i.commit(a[o-2],"",i.commitType.NORMAL,a[o]);break;case 65:i.commit(a[o-2],"",a[o],"");break;case 66:i.commit(a[o],"",a[o-2],"");break;case 67:i.commit(a[o],a[o-2],i.commitType.NORMAL,"");break;case 68:i.commit(a[o-2],a[o],i.commitType.NORMAL,"");break;case 69:i.commit(a[o-4],"",a[o-2],a[o]);break;case 70:i.commit(a[o-4],"",a[o],a[o-2]);break;case 71:i.commit(a[o-2],"",a[o-4],a[o]);break;case 72:i.commit(a[o],"",a[o-4],a[o-2]);break;case 73:i.commit(a[o],"",a[o-2],a[o-4]);break;case 74:i.commit(a[o-2],"",a[o],a[o-4]);break;case 75:i.commit(a[o-4],a[o],a[o-2],"");break;case 76:i.commit(a[o-4],a[o-2],a[o],"");break;case 77:i.commit(a[o-2],a[o],a[o-4],"");break;case 78:i.commit(a[o],a[o-2],a[o-4],"");break;case 79:i.commit(a[o],a[o-4],a[o-2],"");break;case 80:i.commit(a[o-2],a[o-4],a[o],"");break;case 81:i.commit(a[o-4],a[o],i.commitType.NORMAL,a[o-2]);break;case 82:i.commit(a[o-4],a[o-2],i.commitType.NORMAL,a[o]);break;case 83:i.commit(a[o-2],a[o],i.commitType.NORMAL,a[o-4]);break;case 84:i.commit(a[o],a[o-2],i.commitType.NORMAL,a[o-4]);break;case 85:i.commit(a[o],a[o-4],i.commitType.NORMAL,a[o-2]);break;case 86:i.commit(a[o-2],a[o-4],i.commitType.NORMAL,a[o]);break;case 87:i.commit(a[o-6],a[o-4],a[o-2],a[o]);break;case 88:i.commit(a[o-6],a[o-4],a[o],a[o-2]);break;case 89:i.commit(a[o-6],a[o-2],a[o-4],a[o]);break;case 90:i.commit(a[o-6],a[o],a[o-4],a[o-2]);break;case 91:i.commit(a[o-6],a[o-2],a[o],a[o-4]);break;case 92:i.commit(a[o-6],a[o],a[o-2],a[o-4]);break;case 93:i.commit(a[o-4],a[o-6],a[o-2],a[o]);break;case 94:i.commit(a[o-4],a[o-6],a[o],a[o-2]);break;case 95:i.commit(a[o-2],a[o-6],a[o-4],a[o]);break;case 96:i.commit(a[o],a[o-6],a[o-4],a[o-2]);break;case 97:i.commit(a[o-2],a[o-6],a[o],a[o-4]);break;case 98:i.commit(a[o],a[o-6],a[o-2],a[o-4]);break;case 99:i.commit(a[o],a[o-4],a[o-2],a[o-6]);break;case 100:i.commit(a[o-2],a[o-4],a[o],a[o-6]);break;case 101:i.commit(a[o],a[o-2],a[o-4],a[o-6]);break;case 102:i.commit(a[o-2],a[o],a[o-4],a[o-6]);break;case 103:i.commit(a[o-4],a[o-2],a[o],a[o-6]);break;case 104:i.commit(a[o-4],a[o],a[o-2],a[o-6]);break;case 105:i.commit(a[o-2],a[o-4],a[o-6],a[o]);break;case 106:i.commit(a[o],a[o-4],a[o-6],a[o-2]);break;case 107:i.commit(a[o-2],a[o],a[o-6],a[o-4]);break;case 108:i.commit(a[o],a[o-2],a[o-6],a[o-4]);break;case 109:i.commit(a[o-4],a[o-2],a[o-6],a[o]);break;case 110:i.commit(a[o-4],a[o],a[o-6],a[o-2]);break;case 111:this.$="";break;case 112:this.$=a[o];break;case 113:this.$=i.commitType.NORMAL;break;case 114:this.$=i.commitType.REVERSE;break;case 115:this.$=i.commitType.HIGHLIGHT;break;case 118:i.parseDirective("%%{","open_directive");break;case 119:i.parseDirective(a[o],"type_directive");break;case 120:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 121:i.parseDirective("}%%","close_directive","gitGraph")}},table:[{3:1,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{1:[3]},{3:10,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{3:11,4:2,5:3,6:n,8:i,14:r,46:8,50:a,55:s},{7:12,8:o,9:[1,13],10:[1,14],11:15,14:c},e(l,[2,124]),e(l,[2,125]),e(l,[2,126]),{47:17,51:[1,18]},{51:[2,118]},{1:[2,1]},{1:[2,2]},{8:[1,19]},{7:20,8:o,11:15,14:c},{9:[1,21]},e(h,[2,10],{12:22,13:[1,23]}),e(u,[2,9]),{9:[1,25],48:24,53:d},e([9,53],[2,119]),{1:[2,3]},{8:[1,27]},{7:28,8:o,11:15,14:c},{8:[2,7],14:[1,31],15:29,16:30,17:32,18:33,19:34,20:[1,35],22:[1,36],24:[1,37],25:[1,38],26:39,27:[1,40],29:[1,44],32:[1,43],37:[1,42],40:[1,41]},e(u,[2,8]),e(p,[2,116]),{49:45,52:[1,46]},e(p,[2,121]),{1:[2,4]},{8:[1,47]},e(h,[2,11]),{4:48,8:i,14:r,55:s},e(h,[2,13]),e(f,[2,14]),e(f,[2,15]),e(f,[2,16]),{21:[1,49]},{23:[1,50]},e(f,[2,19]),e(f,[2,20]),e(f,[2,21]),{28:51,34:g,54:y},e(f,[2,111],{41:54,33:[1,57],34:[1,59],35:[1,55],38:[1,56],42:[1,58]}),{28:60,34:g,54:y},{33:[1,61],35:[1,62]},{28:63,34:g,54:y},{48:64,53:d},{53:[2,120]},{1:[2,5]},e(h,[2,12]),e(f,[2,17]),e(f,[2,18]),e(f,[2,22]),e(m,[2,122]),e(m,[2,123]),e(f,[2,46]),{34:[1,65]},{39:66,43:b,44:_,45:x},{34:[1,70]},{34:[1,71]},e(f,[2,112]),e(f,[2,30],{33:[1,72],35:[1,74],38:[1,73]}),{34:[1,75]},{34:[1,76],36:[1,77]},e(f,[2,23],{30:[1,78]}),e(p,[2,117]),e(f,[2,47],{33:[1,80],38:[1,79],42:[1,81]}),e(f,[2,48],{33:[1,83],35:[1,82],42:[1,84]}),e(v,[2,113]),e(v,[2,114]),e(v,[2,115]),e(f,[2,51],{35:[1,85],38:[1,86],42:[1,87]}),e(f,[2,62],{33:[1,90],35:[1,88],38:[1,89]}),{34:[1,91]},{39:92,43:b,44:_,45:x},{34:[1,93]},e(f,[2,25],{35:[1,94]}),{33:[1,95]},{33:[1,96]},{31:[1,97]},{39:98,43:b,44:_,45:x},{34:[1,99]},{34:[1,100]},{34:[1,101]},{34:[1,102]},{34:[1,103]},{34:[1,104]},{39:105,43:b,44:_,45:x},{34:[1,106]},{34:[1,107]},{39:108,43:b,44:_,45:x},{34:[1,109]},e(f,[2,31],{35:[1,111],38:[1,110]}),e(f,[2,32],{33:[1,113],35:[1,112]}),e(f,[2,33],{33:[1,114],38:[1,115]}),{34:[1,116],36:[1,117]},{34:[1,118]},{34:[1,119]},e(f,[2,24]),e(f,[2,49],{33:[1,120],42:[1,121]}),e(f,[2,53],{38:[1,122],42:[1,123]}),e(f,[2,63],{33:[1,125],38:[1,124]}),e(f,[2,50],{33:[1,126],42:[1,127]}),e(f,[2,55],{35:[1,128],42:[1,129]}),e(f,[2,66],{33:[1,131],35:[1,130]}),e(f,[2,52],{38:[1,132],42:[1,133]}),e(f,[2,54],{35:[1,134],42:[1,135]}),e(f,[2,67],{35:[1,137],38:[1,136]}),e(f,[2,64],{33:[1,139],38:[1,138]}),e(f,[2,65],{33:[1,141],35:[1,140]}),e(f,[2,68],{35:[1,143],38:[1,142]}),{39:144,43:b,44:_,45:x},{34:[1,145]},{34:[1,146]},{34:[1,147]},{34:[1,148]},{39:149,43:b,44:_,45:x},e(f,[2,26]),e(f,[2,27]),e(f,[2,28]),e(f,[2,29]),{34:[1,150]},{34:[1,151]},{39:152,43:b,44:_,45:x},{34:[1,153]},{39:154,43:b,44:_,45:x},{34:[1,155]},{34:[1,156]},{34:[1,157]},{34:[1,158]},{34:[1,159]},{34:[1,160]},{34:[1,161]},{39:162,43:b,44:_,45:x},{34:[1,163]},{34:[1,164]},{34:[1,165]},{39:166,43:b,44:_,45:x},{34:[1,167]},{39:168,43:b,44:_,45:x},{34:[1,169]},{34:[1,170]},{34:[1,171]},{39:172,43:b,44:_,45:x},{34:[1,173]},e(f,[2,37],{35:[1,174]}),e(f,[2,38],{38:[1,175]}),e(f,[2,36],{33:[1,176]}),e(f,[2,39],{35:[1,177]}),e(f,[2,34],{38:[1,178]}),e(f,[2,35],{33:[1,179]}),e(f,[2,60],{42:[1,180]}),e(f,[2,73],{33:[1,181]}),e(f,[2,61],{42:[1,182]}),e(f,[2,84],{38:[1,183]}),e(f,[2,74],{33:[1,184]}),e(f,[2,83],{38:[1,185]}),e(f,[2,59],{42:[1,186]}),e(f,[2,72],{33:[1,187]}),e(f,[2,58],{42:[1,188]}),e(f,[2,78],{35:[1,189]}),e(f,[2,71],{33:[1,190]}),e(f,[2,77],{35:[1,191]}),e(f,[2,57],{42:[1,192]}),e(f,[2,85],{38:[1,193]}),e(f,[2,56],{42:[1,194]}),e(f,[2,79],{35:[1,195]}),e(f,[2,80],{35:[1,196]}),e(f,[2,86],{38:[1,197]}),e(f,[2,70],{33:[1,198]}),e(f,[2,81],{38:[1,199]}),e(f,[2,69],{33:[1,200]}),e(f,[2,75],{35:[1,201]}),e(f,[2,76],{35:[1,202]}),e(f,[2,82],{38:[1,203]}),{34:[1,204]},{39:205,43:b,44:_,45:x},{34:[1,206]},{34:[1,207]},{39:208,43:b,44:_,45:x},{34:[1,209]},{34:[1,210]},{34:[1,211]},{34:[1,212]},{39:213,43:b,44:_,45:x},{34:[1,214]},{39:215,43:b,44:_,45:x},{34:[1,216]},{34:[1,217]},{34:[1,218]},{34:[1,219]},{34:[1,220]},{34:[1,221]},{34:[1,222]},{39:223,43:b,44:_,45:x},{34:[1,224]},{34:[1,225]},{34:[1,226]},{39:227,43:b,44:_,45:x},{34:[1,228]},{39:229,43:b,44:_,45:x},{34:[1,230]},{34:[1,231]},{34:[1,232]},{39:233,43:b,44:_,45:x},e(f,[2,40]),e(f,[2,42]),e(f,[2,41]),e(f,[2,43]),e(f,[2,45]),e(f,[2,44]),e(f,[2,101]),e(f,[2,102]),e(f,[2,99]),e(f,[2,100]),e(f,[2,104]),e(f,[2,103]),e(f,[2,108]),e(f,[2,107]),e(f,[2,106]),e(f,[2,105]),e(f,[2,110]),e(f,[2,109]),e(f,[2,98]),e(f,[2,97]),e(f,[2,96]),e(f,[2,95]),e(f,[2,93]),e(f,[2,94]),e(f,[2,92]),e(f,[2,91]),e(f,[2,90]),e(f,[2,89]),e(f,[2,87]),e(f,[2,88])],defaultActions:{9:[2,118],10:[2,1],11:[2,2],19:[2,3],27:[2,4],46:[2,120],47:[2,5]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},w=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),50;case 1:return this.begin("type_directive"),51;case 2:return this.popState(),this.begin("arg_directive"),9;case 3:return this.popState(),this.popState(),53;case 4:return 52;case 5:return this.begin("acc_title"),20;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),22;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 34:case 38:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:return 14;case 13:case 14:break;case 15:return 6;case 16:return 40;case 17:return 33;case 18:return 38;case 19:return 42;case 20:return 43;case 21:return 44;case 22:return 45;case 23:return 35;case 24:return 29;case 25:return 30;case 26:return 37;case 27:return 32;case 28:return 27;case 29:case 30:return 10;case 31:return 9;case 32:return"CARET";case 33:this.begin("options");break;case 35:return 13;case 36:return 36;case 37:this.begin("string");break;case 39:return 34;case 40:return 31;case 41:return 54;case 42:return 8}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit(?=\s|$))/i,/^(?:id:)/i,/^(?:type:)/i,/^(?:msg:)/i,/^(?:NORMAL\b)/i,/^(?:REVERSE\b)/i,/^(?:HIGHLIGHT\b)/i,/^(?:tag:)/i,/^(?:branch(?=\s|$))/i,/^(?:order:)/i,/^(?:merge(?=\s|$))/i,/^(?:cherry-pick(?=\s|$))/i,/^(?:checkout(?=\s|$))/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:[ \r\n\t]+end\b)/i,/^(?:[\s\S]+(?=[ \r\n\t]+end))/i,/^(?:["]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[0-9]+(?=\s|$))/i,/^(?:\w([-\./\w]*[-\w])?)/i,/^(?:$)/i,/^(?:\s+)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},options:{rules:[34,35],inclusive:!1},string:{rules:[38,39],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,36,37,40,41,42,43],inclusive:!0}}},t);function C(){this.yy={}}return k.lexer=w,C.prototype=k,k.Parser=C,new C}();lr.parser=lr;const hr=lr,ur=t=>null!==t.match(/^\s*gitGraph/);let dr=gi().gitGraph.mainBranchName,pr=gi().gitGraph.mainBranchOrder,fr={},gr=null,yr={};yr[dr]={name:dr,order:pr};let mr={};mr[dr]=gr;let br=dr,_r="LR",xr=0;function vr(){return Hn({length:7})}let kr={};const wr=function(t){if(t=jt.sanitizeText(t,gi()),void 0===mr[t]){let e=new Error('Trying to checkout branch which is not yet created. (Help try using "branch '+t+'")');throw e.hash={text:"checkout "+t,token:"checkout "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"branch '+t+'"']},e}{br=t;const e=mr[br];gr=fr[e]}};function Cr(t,e,n){const i=t.indexOf(e);-1===i?t.push(n):t.splice(i,1,n)}function Tr(t){const e=t.reduce(((t,e)=>t.seq>e.seq?t:e),t[0]);let n="";t.forEach((function(t){n+=t===e?"\t*":"\t|"}));const i=[n,e.id,e.seq];for(let r in mr)mr[r]===e.id&&i.push(r);if(Bt.debug(i.join(" ")),e.parents&&2==e.parents.length){const n=fr[e.parents[0]];Cr(t,e,n),t.push(fr[e.parents[1]])}else{if(0==e.parents.length)return;{const n=fr[e.parents];Cr(t,e,n)}}Tr(t=function(t,e){const n=Object.create(null);return t.reduce(((t,i)=>{const r=e(i);return n[r]||(n[r]=!0,t.push(i)),t}),[])}(t,(t=>t.id)))}const Er=function(){const t=Object.keys(fr).map((function(t){return fr[t]}));return t.forEach((function(t){Bt.debug(t.id)})),t.sort(((t,e)=>t.seq-e.seq)),t},Sr={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},Ar={parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().gitGraph,setDirection:function(t){_r=t},setOptions:function(t){Bt.debug("options str",t),t=(t=t&&t.trim())||"{}";try{kr=JSON.parse(t)}catch(e){Bt.error("error while parsing gitGraph options",e.message)}},getOptions:function(){return kr},commit:function(t,e,n,i){Bt.debug("Entering commit:",t,e,n,i),e=jt.sanitizeText(e,gi()),t=jt.sanitizeText(t,gi()),i=jt.sanitizeText(i,gi());const r={id:e||xr+"-"+vr(),message:t,seq:xr++,type:n||Sr.NORMAL,tag:i||"",parents:null==gr?[]:[gr.id],branch:br};gr=r,fr[r.id]=r,mr[br]=r.id,Bt.debug("in pushCommit "+r.id)},branch:function(t,e){if(t=jt.sanitizeText(t,gi()),void 0!==mr[t]){let e=new Error('Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout '+t+'")');throw e.hash={text:"branch "+t,token:"branch "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"checkout '+t+'"']},e}mr[t]=null!=gr?gr.id:null,yr[t]={name:t,order:e?parseInt(e,10):null},wr(t),Bt.debug("in createBranch")},merge:function(t,e,n,i){t=jt.sanitizeText(t,gi()),e=jt.sanitizeText(e,gi());const r=fr[mr[br]],a=fr[mr[t]];if(br===t){let e=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},e}if(void 0===r||!r){let e=new Error('Incorrect usage of "merge". Current branch ('+br+")has no commits");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["commit"]},e}if(void 0===mr[t]){let e=new Error('Incorrect usage of "merge". Branch to be merged ('+t+") does not exist");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch "+t]},e}if(void 0===a||!a){let e=new Error('Incorrect usage of "merge". Branch to be merged ('+t+") has no commits");throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"commit"']},e}if(r===a){let e=new Error('Incorrect usage of "merge". Both branches have same head');throw e.hash={text:"merge "+t,token:"merge "+t,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},e}if(e&&void 0!==fr[e]){let r=new Error('Incorrect usage of "merge". Commit with id:'+e+" already exists, use different custom Id");throw r.hash={text:"merge "+t+e+n+i,token:"merge "+t+e+n+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["merge "+t+" "+e+"_UNIQUE "+n+" "+i]},r}const s={id:e||xr+"-"+vr(),message:"merged branch "+t+" into "+br,seq:xr++,parents:[null==gr?null:gr.id,mr[t]],branch:br,type:Sr.MERGE,customType:n,customId:!!e,tag:i||""};gr=s,fr[s.id]=s,mr[br]=s.id,Bt.debug(mr),Bt.debug("in mergeBranch")},cherryPick:function(t,e,n){if(Bt.debug("Entering cherryPick:",t,e,n),t=jt.sanitizeText(t,gi()),e=jt.sanitizeText(e,gi()),n=jt.sanitizeText(n,gi()),!t||void 0===fr[t]){let n=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}let i=fr[t],r=i.branch;if(i.type===Sr.MERGE){let n=new Error('Incorrect usage of "cherryPick". Source commit should not be a merge commit');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}if(!e||void 0===fr[e]){if(r===br){let n=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}const a=fr[mr[br]];if(void 0===a||!a){let n=new Error('Incorrect usage of "cherry-pick". Current branch ('+br+")has no commits");throw n.hash={text:"cherryPick "+t+" "+e,token:"cherryPick "+t+" "+e,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},n}const s={id:xr+"-"+vr(),message:"cherry-picked "+i+" into "+br,seq:xr++,parents:[null==gr?null:gr.id,i.id],branch:br,type:Sr.CHERRY_PICK,tag:n??"cherry-pick:"+i.id};gr=s,fr[s.id]=s,mr[br]=s.id,Bt.debug(mr),Bt.debug("in cherryPick")}},checkout:wr,prettyPrint:function(){Bt.debug(fr);Tr([Er()[0]])},clear:function(){fr={},gr=null;let t=gi().gitGraph.mainBranchName,e=gi().gitGraph.mainBranchOrder;mr={},mr[t]=null,yr={},yr[t]={name:t,order:e},br=t,xr=0,Yi()},getBranchesAsObjArray:function(){const t=Object.values(yr).map(((t,e)=>null!==t.order?t:{...t,order:parseFloat(`0.${e}`,10)})).sort(((t,e)=>t.order-e.order)).map((({name:t})=>({name:t})));return t},getBranches:function(){return mr},getCommits:function(){return fr},getCommitsArray:Er,getCurrentBranch:function(){return br},getDirection:function(){return _r},getHead:function(){return gr},setAccTitle:zi,getAccTitle:Ui,getAccDescription:qi,setAccDescription:Wi,setDiagramTitle:Hi,getDiagramTitle:Vi,commitType:Sr};let Lr={};const Br=0,Nr=1,Dr=2,Or=3,Mr=4;let Ir={},Fr={},$r=[],Rr=0;const Zr=(t,e,n)=>{const i=nr().gitGraph,r=t.append("g").attr("class","commit-bullets"),a=t.append("g").attr("class","commit-labels");let s=0;Object.keys(e).sort(((t,n)=>e[t].seq-e[n].seq)).forEach((t=>{const o=e[t],c=Ir[o.branch].pos,l=s+10;if(n){let t,e=void 0!==o.customType&&""!==o.customType?o.customType:o.type;switch(e){case Br:t="commit-normal";break;case Nr:t="commit-reverse";break;case Dr:t="commit-highlight";break;case Or:t="commit-merge";break;case Mr:t="commit-cherry-pick";break;default:t="commit-normal"}if(e===Dr){const e=r.append("rect");e.attr("x",l-10),e.attr("y",c-10),e.attr("height",20),e.attr("width",20),e.attr("class",`commit ${o.id} commit-highlight${Ir[o.branch].index%8} ${t}-outer`),r.append("rect").attr("x",l-6).attr("y",c-6).attr("height",12).attr("width",12).attr("class",`commit ${o.id} commit${Ir[o.branch].index%8} ${t}-inner`)}else if(e===Mr)r.append("circle").attr("cx",l).attr("cy",c).attr("r",10).attr("class",`commit ${o.id} ${t}`),r.append("circle").attr("cx",l-3).attr("cy",c+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${o.id} ${t}`),r.append("circle").attr("cx",l+3).attr("cy",c+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${o.id} ${t}`),r.append("line").attr("x1",l+3).attr("y1",c+1).attr("x2",l).attr("y2",c-5).attr("stroke","#fff").attr("class",`commit ${o.id} ${t}`),r.append("line").attr("x1",l-3).attr("y1",c+1).attr("x2",l).attr("y2",c-5).attr("stroke","#fff").attr("class",`commit ${o.id} ${t}`);else{const n=r.append("circle");if(n.attr("cx",l),n.attr("cy",c),n.attr("r",o.type===Or?9:10),n.attr("class",`commit ${o.id} commit${Ir[o.branch].index%8}`),e===Or){const e=r.append("circle");e.attr("cx",l),e.attr("cy",c),e.attr("r",6),e.attr("class",`commit ${t} ${o.id} commit${Ir[o.branch].index%8}`)}if(e===Nr){r.append("path").attr("d",`M ${l-5},${c-5}L${l+5},${c+5}M${l-5},${c+5}L${l+5},${c-5}`).attr("class",`commit ${t} ${o.id} commit${Ir[o.branch].index%8}`)}}}if(Fr[o.id]={x:s+10,y:c},n){const t=4,e=2;if(o.type!==Mr&&(o.customId&&o.type===Or||o.type!==Or)&&i.showCommitLabel){const t=a.append("g"),n=t.insert("rect").attr("class","commit-label-bkg"),r=t.append("text").attr("x",s).attr("y",c+25).attr("class","commit-label").text(o.id);let l=r.node().getBBox();if(n.attr("x",s+10-l.width/2-e).attr("y",c+13.5).attr("width",l.width+2*e).attr("height",l.height+2*e),r.attr("x",s+10-l.width/2),i.rotateCommitLabel){let e=-7.5-(l.width+10)/25*9.5,n=10+l.width/25*8.5;t.attr("transform","translate("+e+", "+n+") rotate("+"-45, "+s+", "+c+")")}}if(o.tag){const n=a.insert("polygon"),i=a.append("circle"),r=a.append("text").attr("y",c-16).attr("class","tag-label").text(o.tag);let l=r.node().getBBox();r.attr("x",s+10-l.width/2);const h=l.height/2,u=c-19.2;n.attr("class","tag-label-bkg").attr("points",`\n ${s-l.width/2-t/2},${u+e}\n ${s-l.width/2-t/2},${u-e}\n ${s+10-l.width/2-t},${u-h-e}\n ${s+10+l.width/2+t},${u-h-e}\n ${s+10+l.width/2+t},${u+h+e}\n ${s+10-l.width/2-t},${u+h+e}`),i.attr("cx",s-l.width/2+t/2).attr("cy",u).attr("r",1.5).attr("class","tag-hole")}}s+=50,s>Rr&&(Rr=s)}))},Pr=(t,e,n=0)=>{const i=t+Math.abs(t-e)/2;if(n>5)return i;if($r.every((t=>Math.abs(t-i)>=10)))return $r.push(i),i;const r=Math.abs(t-e);return Pr(t,e-r/5,n+1)},jr=(t,e,n,i)=>{const r=Fr[e.id],a=Fr[n.id],s=((t,e,n)=>Object.keys(n).filter((i=>n[i].branch===e.branch&&n[i].seq>t.seq&&n[i].seq<e.seq)).length>0)(e,n,i);let o,c="",l="",h=0,u=0,d=Ir[n.branch].index;if(s){c="A 10 10, 0, 0, 0,",l="A 10 10, 0, 0, 1,",h=10,u=10,d=Ir[n.branch].index;const t=r.y<a.y?Pr(r.y,a.y):Pr(a.y,r.y);o=r.y<a.y?`M ${r.x} ${r.y} L ${r.x} ${t-h} ${c} ${r.x+u} ${t} L ${a.x-h} ${t} ${l} ${a.x} ${t+u} L ${a.x} ${a.y}`:`M ${r.x} ${r.y} L ${r.x} ${t+h} ${l} ${r.x+u} ${t} L ${a.x-h} ${t} ${c} ${a.x} ${t-u} L ${a.x} ${a.y}`}else r.y<a.y&&(c="A 20 20, 0, 0, 0,",h=20,u=20,d=Ir[n.branch].index,o=`M ${r.x} ${r.y} L ${r.x} ${a.y-h} ${c} ${r.x+u} ${a.y} L ${a.x} ${a.y}`),r.y>a.y&&(c="A 20 20, 0, 0, 0,",h=20,u=20,d=Ir[e.branch].index,o=`M ${r.x} ${r.y} L ${a.x-h} ${r.y} ${c} ${a.x} ${r.y-u} L ${a.x} ${a.y}`),r.y===a.y&&(d=Ir[e.branch].index,o=`M ${r.x} ${r.y} L ${r.x} ${a.y-h} ${c} ${r.x+u} ${a.y} L ${a.x} ${a.y}`);t.append("path").attr("d",o).attr("class","arrow arrow"+d%8)},Yr=(t,e)=>{const n=nr().gitGraph,i=t.append("g");e.forEach(((t,e)=>{const r=e%8,a=Ir[t.name].pos,s=i.append("line");s.attr("x1",0),s.attr("y1",a),s.attr("x2",Rr),s.attr("y2",a),s.attr("class","branch branch"+r),$r.push(a);const o=(t=>{const e=document.createElementNS("http://www.w3.org/2000/svg","text");let n=[];n="string"==typeof t?t.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(t)?t:[];for(const i of n){const t=document.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","0"),t.setAttribute("class","row"),t.textContent=i.trim(),e.appendChild(t)}return e})(t.name),c=i.insert("rect"),l=i.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+r);l.node().appendChild(o);let h=o.getBBox();c.attr("class","branchLabelBkg label"+r).attr("rx",4).attr("ry",4).attr("x",-h.width-4-(!0===n.rotateCommitLabel?30:0)).attr("y",-h.height/2+8).attr("width",h.width+18).attr("height",h.height+4),l.attr("transform","translate("+(-h.width-14-(!0===n.rotateCommitLabel?30:0))+", "+(a-h.height/2-1)+")"),c.attr("transform","translate(-19, "+(a-h.height/2)+")")}))},zr={draw:function(t,e,n,i){Ir={},Fr={},Lr={},Rr=0,$r=[];const r=nr(),a=r.gitGraph;Bt.debug("in gitgraph renderer",t+"\n","id:",e,n),Lr=i.db.getCommits();const s=i.db.getBranchesAsObjArray();let c=0;s.forEach(((t,e)=>{Ir[t.name]={pos:c,index:e},c+=50+(a.rotateCommitLabel?40:0)}));const l=(0,o.Ys)(`[id="${e}"]`);Zr(l,Lr,!1),a.showBranches&&Yr(l,s),((t,e)=>{const n=t.append("g").attr("class","commit-arrows");Object.keys(e).forEach((t=>{const i=e[t];i.parents&&i.parents.length>0&&i.parents.forEach((t=>{jr(n,e[t],i,e)}))}))})(l,Lr),Zr(l,Lr,!0),ai.insertTitle(l,"gitTitleText",a.titleTopMargin,i.db.getDiagramTitle()),rr(void 0,l,a.diagramPadding,a.useMaxWidth??r.useMaxWidth)}},Ur=t=>`\n .commit-id,\n .commit-msg,\n .branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n ${[0,1,2,3,4,5,6,7].map((e=>`\n .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; }\n .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; }\n .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; }\n .label${e} { fill: ${t["git"+e]}; }\n .arrow${e} { stroke: ${t["git"+e]}; }\n `)).join("\n")}\n\n .branch {\n stroke-width: 1;\n stroke: ${t.lineColor};\n stroke-dasharray: 2;\n }\n .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};}\n .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; }\n .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};}\n .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; }\n .tag-hole { fill: ${t.textColor}; }\n\n .commit-merge {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n .commit-reverse {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n stroke-width: 3;\n }\n .commit-highlight-outer {\n }\n .commit-highlight-inner {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n\n .arrow { stroke-width: 8; stroke-linecap: round; fill: none}\n .gitTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n }\n`;var Wr=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,6],i=[1,7],r=[1,8],a=[1,9],s=[1,16],o=[1,11],l=[1,12],h=[1,13],u=[1,14],d=[1,15],p=[1,27],f=[1,33],g=[1,34],y=[1,35],m=[1,36],b=[1,37],_=[1,72],x=[1,73],v=[1,74],k=[1,75],w=[1,76],C=[1,77],T=[1,78],E=[1,38],S=[1,39],A=[1,40],L=[1,41],B=[1,42],N=[1,43],D=[1,44],O=[1,45],M=[1,46],I=[1,47],F=[1,48],$=[1,49],R=[1,50],Z=[1,51],P=[1,52],j=[1,53],Y=[1,54],z=[1,55],U=[1,56],W=[1,57],q=[1,59],H=[1,60],V=[1,61],G=[1,62],X=[1,63],Q=[1,64],K=[1,65],J=[1,66],tt=[1,67],et=[1,68],nt=[1,69],it=[24,52],rt=[24,44,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],at=[15,24,44,46,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],st=[1,94],ot=[1,95],ct=[1,96],lt=[1,97],ht=[15,24,52],ut=[7,8,9,10,18,22,25,26,27,28],dt=[15,24,43,52],pt=[15,24,43,52,86,87,89,90],ft=[15,43],gt=[44,46,47,48,49,50,51,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],yt={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,directive:6,direction_tb:7,direction_bt:8,direction_rl:9,direction_lr:10,graphConfig:11,openDirective:12,typeDirective:13,closeDirective:14,NEWLINE:15,":":16,argDirective:17,open_directive:18,type_directive:19,arg_directive:20,close_directive:21,C4_CONTEXT:22,statements:23,EOF:24,C4_CONTAINER:25,C4_COMPONENT:26,C4_DYNAMIC:27,C4_DEPLOYMENT:28,otherStatements:29,diagramStatements:30,otherStatement:31,title:32,accDescription:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,boundaryStatement:39,boundaryStartStatement:40,boundaryStopStatement:41,boundaryStart:42,LBRACE:43,ENTERPRISE_BOUNDARY:44,attributes:45,SYSTEM_BOUNDARY:46,BOUNDARY:47,CONTAINER_BOUNDARY:48,NODE:49,NODE_L:50,NODE_R:51,RBRACE:52,diagramStatement:53,PERSON:54,PERSON_EXT:55,SYSTEM:56,SYSTEM_DB:57,SYSTEM_QUEUE:58,SYSTEM_EXT:59,SYSTEM_EXT_DB:60,SYSTEM_EXT_QUEUE:61,CONTAINER:62,CONTAINER_DB:63,CONTAINER_QUEUE:64,CONTAINER_EXT:65,CONTAINER_EXT_DB:66,CONTAINER_EXT_QUEUE:67,COMPONENT:68,COMPONENT_DB:69,COMPONENT_QUEUE:70,COMPONENT_EXT:71,COMPONENT_EXT_DB:72,COMPONENT_EXT_QUEUE:73,REL:74,BIREL:75,REL_U:76,REL_D:77,REL_L:78,REL_R:79,REL_B:80,REL_INDEX:81,UPDATE_EL_STYLE:82,UPDATE_REL_STYLE:83,UPDATE_LAYOUT_CONFIG:84,attribute:85,STR:86,STR_KEY:87,STR_VALUE:88,ATTRIBUTE:89,ATTRIBUTE_EMPTY:90,$accept:0,$end:1},terminals_:{2:"error",7:"direction_tb",8:"direction_bt",9:"direction_rl",10:"direction_lr",15:"NEWLINE",16:":",18:"open_directive",19:"type_directive",20:"arg_directive",21:"close_directive",22:"C4_CONTEXT",24:"EOF",25:"C4_CONTAINER",26:"C4_COMPONENT",27:"C4_DYNAMIC",28:"C4_DEPLOYMENT",32:"title",33:"accDescription",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",43:"LBRACE",44:"ENTERPRISE_BOUNDARY",46:"SYSTEM_BOUNDARY",47:"BOUNDARY",48:"CONTAINER_BOUNDARY",49:"NODE",50:"NODE_L",51:"NODE_R",52:"RBRACE",54:"PERSON",55:"PERSON_EXT",56:"SYSTEM",57:"SYSTEM_DB",58:"SYSTEM_QUEUE",59:"SYSTEM_EXT",60:"SYSTEM_EXT_DB",61:"SYSTEM_EXT_QUEUE",62:"CONTAINER",63:"CONTAINER_DB",64:"CONTAINER_QUEUE",65:"CONTAINER_EXT",66:"CONTAINER_EXT_DB",67:"CONTAINER_EXT_QUEUE",68:"COMPONENT",69:"COMPONENT_DB",70:"COMPONENT_QUEUE",71:"COMPONENT_EXT",72:"COMPONENT_EXT_DB",73:"COMPONENT_EXT_QUEUE",74:"REL",75:"BIREL",76:"REL_U",77:"REL_D",78:"REL_L",79:"REL_R",80:"REL_B",81:"REL_INDEX",82:"UPDATE_EL_STYLE",83:"UPDATE_REL_STYLE",84:"UPDATE_LAYOUT_CONFIG",86:"STR",87:"STR_KEY",88:"STR_VALUE",89:"ATTRIBUTE",90:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[3,2],[5,1],[5,1],[5,1],[5,1],[4,1],[6,4],[6,6],[12,1],[13,1],[17,1],[14,1],[11,4],[11,4],[11,4],[11,4],[11,4],[23,1],[23,1],[23,2],[29,1],[29,2],[29,3],[31,1],[31,1],[31,2],[31,2],[31,1],[39,3],[40,3],[40,3],[40,4],[42,2],[42,2],[42,2],[42,2],[42,2],[42,2],[42,2],[41,1],[30,1],[30,2],[30,3],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,1],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[53,2],[45,1],[45,2],[85,1],[85,2],[85,1],[85,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:i.setDirection("TB");break;case 5:i.setDirection("BT");break;case 6:i.setDirection("RL");break;case 7:i.setDirection("LR");break;case 11:i.parseDirective("%%{","open_directive");break;case 12:break;case 13:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 14:i.parseDirective("}%%","close_directive","c4Context");break;case 15:case 16:case 17:case 18:case 19:i.setC4Type(a[o-3]);break;case 26:i.setTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 27:i.setAccDescription(a[o].substring(15)),this.$=a[o].substring(15);break;case 28:this.$=a[o].trim(),i.setTitle(this.$);break;case 29:case 30:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 35:case 36:a[o].splice(2,0,"ENTERPRISE"),i.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 37:i.addPersonOrSystemBoundary(...a[o]),this.$=a[o];break;case 38:a[o].splice(2,0,"CONTAINER"),i.addContainerBoundary(...a[o]),this.$=a[o];break;case 39:i.addDeploymentNode("node",...a[o]),this.$=a[o];break;case 40:i.addDeploymentNode("nodeL",...a[o]),this.$=a[o];break;case 41:i.addDeploymentNode("nodeR",...a[o]),this.$=a[o];break;case 42:i.popBoundaryParseStack();break;case 46:i.addPersonOrSystem("person",...a[o]),this.$=a[o];break;case 47:i.addPersonOrSystem("external_person",...a[o]),this.$=a[o];break;case 48:i.addPersonOrSystem("system",...a[o]),this.$=a[o];break;case 49:i.addPersonOrSystem("system_db",...a[o]),this.$=a[o];break;case 50:i.addPersonOrSystem("system_queue",...a[o]),this.$=a[o];break;case 51:i.addPersonOrSystem("external_system",...a[o]),this.$=a[o];break;case 52:i.addPersonOrSystem("external_system_db",...a[o]),this.$=a[o];break;case 53:i.addPersonOrSystem("external_system_queue",...a[o]),this.$=a[o];break;case 54:i.addContainer("container",...a[o]),this.$=a[o];break;case 55:i.addContainer("container_db",...a[o]),this.$=a[o];break;case 56:i.addContainer("container_queue",...a[o]),this.$=a[o];break;case 57:i.addContainer("external_container",...a[o]),this.$=a[o];break;case 58:i.addContainer("external_container_db",...a[o]),this.$=a[o];break;case 59:i.addContainer("external_container_queue",...a[o]),this.$=a[o];break;case 60:i.addComponent("component",...a[o]),this.$=a[o];break;case 61:i.addComponent("component_db",...a[o]),this.$=a[o];break;case 62:i.addComponent("component_queue",...a[o]),this.$=a[o];break;case 63:i.addComponent("external_component",...a[o]),this.$=a[o];break;case 64:i.addComponent("external_component_db",...a[o]),this.$=a[o];break;case 65:i.addComponent("external_component_queue",...a[o]),this.$=a[o];break;case 67:i.addRel("rel",...a[o]),this.$=a[o];break;case 68:i.addRel("birel",...a[o]),this.$=a[o];break;case 69:i.addRel("rel_u",...a[o]),this.$=a[o];break;case 70:i.addRel("rel_d",...a[o]),this.$=a[o];break;case 71:i.addRel("rel_l",...a[o]),this.$=a[o];break;case 72:i.addRel("rel_r",...a[o]),this.$=a[o];break;case 73:i.addRel("rel_b",...a[o]),this.$=a[o];break;case 74:a[o].splice(0,1),i.addRel("rel",...a[o]),this.$=a[o];break;case 75:i.updateElStyle("update_el_style",...a[o]),this.$=a[o];break;case 76:i.updateRelStyle("update_rel_style",...a[o]),this.$=a[o];break;case 77:i.updateLayoutConfig("update_layout_config",...a[o]),this.$=a[o];break;case 78:this.$=[a[o]];break;case 79:a[o].unshift(a[o-1]),this.$=a[o];break;case 80:case 82:this.$=a[o].trim();break;case 81:let t={};t[a[o-1].trim()]=a[o].trim(),this.$=t;break;case 83:this.$=""}},table:[{3:1,4:2,5:3,6:4,7:n,8:i,9:r,10:a,11:5,12:10,18:s,22:o,25:l,26:h,27:u,28:d},{1:[3]},{1:[2,1]},{1:[2,2]},{3:17,4:2,5:3,6:4,7:n,8:i,9:r,10:a,11:5,12:10,18:s,22:o,25:l,26:h,27:u,28:d},{1:[2,8]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{1:[2,7]},{13:18,19:[1,19]},{15:[1,20]},{15:[1,21]},{15:[1,22]},{15:[1,23]},{15:[1,24]},{19:[2,11]},{1:[2,3]},{14:25,16:[1,26],21:p},e([16,21],[2,12]),{23:28,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:79,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:80,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:81,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{23:82,29:29,30:30,31:31,32:f,33:g,34:y,36:m,38:b,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{15:[1,83]},{17:84,20:[1,85]},{15:[2,14]},{24:[1,86]},e(it,[2,20],{53:32,39:58,40:70,42:71,30:87,44:_,46:x,47:v,48:k,49:w,50:C,51:T,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt}),e(it,[2,21]),e(rt,[2,23],{15:[1,88]}),e(it,[2,43],{15:[1,89]}),e(at,[2,26]),e(at,[2,27]),{35:[1,90]},{37:[1,91]},e(at,[2,30]),{45:92,85:93,86:st,87:ot,89:ct,90:lt},{45:98,85:93,86:st,87:ot,89:ct,90:lt},{45:99,85:93,86:st,87:ot,89:ct,90:lt},{45:100,85:93,86:st,87:ot,89:ct,90:lt},{45:101,85:93,86:st,87:ot,89:ct,90:lt},{45:102,85:93,86:st,87:ot,89:ct,90:lt},{45:103,85:93,86:st,87:ot,89:ct,90:lt},{45:104,85:93,86:st,87:ot,89:ct,90:lt},{45:105,85:93,86:st,87:ot,89:ct,90:lt},{45:106,85:93,86:st,87:ot,89:ct,90:lt},{45:107,85:93,86:st,87:ot,89:ct,90:lt},{45:108,85:93,86:st,87:ot,89:ct,90:lt},{45:109,85:93,86:st,87:ot,89:ct,90:lt},{45:110,85:93,86:st,87:ot,89:ct,90:lt},{45:111,85:93,86:st,87:ot,89:ct,90:lt},{45:112,85:93,86:st,87:ot,89:ct,90:lt},{45:113,85:93,86:st,87:ot,89:ct,90:lt},{45:114,85:93,86:st,87:ot,89:ct,90:lt},{45:115,85:93,86:st,87:ot,89:ct,90:lt},{45:116,85:93,86:st,87:ot,89:ct,90:lt},e(ht,[2,66]),{45:117,85:93,86:st,87:ot,89:ct,90:lt},{45:118,85:93,86:st,87:ot,89:ct,90:lt},{45:119,85:93,86:st,87:ot,89:ct,90:lt},{45:120,85:93,86:st,87:ot,89:ct,90:lt},{45:121,85:93,86:st,87:ot,89:ct,90:lt},{45:122,85:93,86:st,87:ot,89:ct,90:lt},{45:123,85:93,86:st,87:ot,89:ct,90:lt},{45:124,85:93,86:st,87:ot,89:ct,90:lt},{45:125,85:93,86:st,87:ot,89:ct,90:lt},{45:126,85:93,86:st,87:ot,89:ct,90:lt},{45:127,85:93,86:st,87:ot,89:ct,90:lt},{30:128,39:58,40:70,42:71,44:_,46:x,47:v,48:k,49:w,50:C,51:T,53:32,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt},{15:[1,130],43:[1,129]},{45:131,85:93,86:st,87:ot,89:ct,90:lt},{45:132,85:93,86:st,87:ot,89:ct,90:lt},{45:133,85:93,86:st,87:ot,89:ct,90:lt},{45:134,85:93,86:st,87:ot,89:ct,90:lt},{45:135,85:93,86:st,87:ot,89:ct,90:lt},{45:136,85:93,86:st,87:ot,89:ct,90:lt},{45:137,85:93,86:st,87:ot,89:ct,90:lt},{24:[1,138]},{24:[1,139]},{24:[1,140]},{24:[1,141]},e(ut,[2,9]),{14:142,21:p},{21:[2,13]},{1:[2,15]},e(it,[2,22]),e(rt,[2,24],{31:31,29:143,32:f,33:g,34:y,36:m,38:b}),e(it,[2,44],{29:29,30:30,31:31,53:32,39:58,40:70,42:71,23:144,32:f,33:g,34:y,36:m,38:b,44:_,46:x,47:v,48:k,49:w,50:C,51:T,54:E,55:S,56:A,57:L,58:B,59:N,60:D,61:O,62:M,63:I,64:F,65:$,66:R,67:Z,68:P,69:j,70:Y,71:z,72:U,73:W,74:q,75:H,76:V,77:G,78:X,79:Q,80:K,81:J,82:tt,83:et,84:nt}),e(at,[2,28]),e(at,[2,29]),e(ht,[2,46]),e(dt,[2,78],{85:93,45:145,86:st,87:ot,89:ct,90:lt}),e(pt,[2,80]),{88:[1,146]},e(pt,[2,82]),e(pt,[2,83]),e(ht,[2,47]),e(ht,[2,48]),e(ht,[2,49]),e(ht,[2,50]),e(ht,[2,51]),e(ht,[2,52]),e(ht,[2,53]),e(ht,[2,54]),e(ht,[2,55]),e(ht,[2,56]),e(ht,[2,57]),e(ht,[2,58]),e(ht,[2,59]),e(ht,[2,60]),e(ht,[2,61]),e(ht,[2,62]),e(ht,[2,63]),e(ht,[2,64]),e(ht,[2,65]),e(ht,[2,67]),e(ht,[2,68]),e(ht,[2,69]),e(ht,[2,70]),e(ht,[2,71]),e(ht,[2,72]),e(ht,[2,73]),e(ht,[2,74]),e(ht,[2,75]),e(ht,[2,76]),e(ht,[2,77]),{41:147,52:[1,148]},{15:[1,149]},{43:[1,150]},e(ft,[2,35]),e(ft,[2,36]),e(ft,[2,37]),e(ft,[2,38]),e(ft,[2,39]),e(ft,[2,40]),e(ft,[2,41]),{1:[2,16]},{1:[2,17]},{1:[2,18]},{1:[2,19]},{15:[1,151]},e(rt,[2,25]),e(it,[2,45]),e(dt,[2,79]),e(pt,[2,81]),e(ht,[2,31]),e(ht,[2,42]),e(gt,[2,32]),e(gt,[2,33],{15:[1,152]}),e(ut,[2,10]),e(gt,[2,34])],defaultActions:{2:[2,1],3:[2,2],5:[2,8],6:[2,4],7:[2,5],8:[2,6],9:[2,7],16:[2,11],17:[2,3],27:[2,14],85:[2,13],86:[2,15],138:[2,16],139:[2,17],140:[2,18],141:[2,19]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},mt=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),18;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 10;case 5:return this.begin("type_directive"),19;case 6:return this.popState(),this.begin("arg_directive"),16;case 7:return this.popState(),this.popState(),21;case 8:return 20;case 9:return 32;case 10:return 33;case 11:return this.begin("acc_title"),34;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),36;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 78:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:case 21:case 75:break;case 19:c;break;case 20:return 15;case 22:return 22;case 23:return 25;case 24:return 26;case 25:return 27;case 26:return 28;case 27:return this.begin("person_ext"),55;case 28:return this.begin("person"),54;case 29:return this.begin("system_ext_queue"),61;case 30:return this.begin("system_ext_db"),60;case 31:return this.begin("system_ext"),59;case 32:return this.begin("system_queue"),58;case 33:return this.begin("system_db"),57;case 34:return this.begin("system"),56;case 35:return this.begin("boundary"),47;case 36:return this.begin("enterprise_boundary"),44;case 37:return this.begin("system_boundary"),46;case 38:return this.begin("container_ext_queue"),67;case 39:return this.begin("container_ext_db"),66;case 40:return this.begin("container_ext"),65;case 41:return this.begin("container_queue"),64;case 42:return this.begin("container_db"),63;case 43:return this.begin("container"),62;case 44:return this.begin("container_boundary"),48;case 45:return this.begin("component_ext_queue"),73;case 46:return this.begin("component_ext_db"),72;case 47:return this.begin("component_ext"),71;case 48:return this.begin("component_queue"),70;case 49:return this.begin("component_db"),69;case 50:return this.begin("component"),68;case 51:case 52:return this.begin("node"),49;case 53:return this.begin("node_l"),50;case 54:return this.begin("node_r"),51;case 55:return this.begin("rel"),74;case 56:return this.begin("birel"),75;case 57:case 58:return this.begin("rel_u"),76;case 59:case 60:return this.begin("rel_d"),77;case 61:case 62:return this.begin("rel_l"),78;case 63:case 64:return this.begin("rel_r"),79;case 65:return this.begin("rel_b"),80;case 66:return this.begin("rel_index"),81;case 67:return this.begin("update_el_style"),82;case 68:return this.begin("update_rel_style"),83;case 69:return this.begin("update_layout_config"),84;case 70:return"EOF_IN_STRUCT";case 71:return this.begin("attribute"),"ATTRIBUTE_EMPTY";case 72:this.begin("attribute");break;case 73:case 84:this.popState(),this.popState();break;case 74:case 76:return 90;case 77:this.begin("string");break;case 79:case 85:return"STR";case 80:this.begin("string_kv");break;case 81:return this.begin("string_kv_key"),"STR_KEY";case 82:this.popState(),this.begin("string_kv_value");break;case 83:return"STR_VALUE";case 86:return"LBRACE";case 87:return"RBRACE";case 88:return"SPACE";case 89:return"EOL";case 90:return 24}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},string_kv_value:{rules:[83,84],inclusive:!1},string_kv_key:{rules:[82],inclusive:!1},string_kv:{rules:[81],inclusive:!1},string:{rules:[78,79],inclusive:!1},attribute:{rules:[73,74,75,76,77,80,85],inclusive:!1},update_layout_config:{rules:[70,71,72,73],inclusive:!1},update_rel_style:{rules:[70,71,72,73],inclusive:!1},update_el_style:{rules:[70,71,72,73],inclusive:!1},rel_b:{rules:[70,71,72,73],inclusive:!1},rel_r:{rules:[70,71,72,73],inclusive:!1},rel_l:{rules:[70,71,72,73],inclusive:!1},rel_d:{rules:[70,71,72,73],inclusive:!1},rel_u:{rules:[70,71,72,73],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[70,71,72,73],inclusive:!1},node_r:{rules:[70,71,72,73],inclusive:!1},node_l:{rules:[70,71,72,73],inclusive:!1},node:{rules:[70,71,72,73],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[70,71,72,73],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[70,71,72,73],inclusive:!1},component_ext:{rules:[70,71,72,73],inclusive:!1},component_queue:{rules:[70,71,72,73],inclusive:!1},component_db:{rules:[70,71,72,73],inclusive:!1},component:{rules:[70,71,72,73],inclusive:!1},container_boundary:{rules:[70,71,72,73],inclusive:!1},container_ext_queue:{rules:[],inclusive:!1},container_ext_db:{rules:[70,71,72,73],inclusive:!1},container_ext:{rules:[70,71,72,73],inclusive:!1},container_queue:{rules:[70,71,72,73],inclusive:!1},container_db:{rules:[70,71,72,73],inclusive:!1},container:{rules:[70,71,72,73],inclusive:!1},birel:{rules:[70,71,72,73],inclusive:!1},system_boundary:{rules:[70,71,72,73],inclusive:!1},enterprise_boundary:{rules:[70,71,72,73],inclusive:!1},boundary:{rules:[70,71,72,73],inclusive:!1},system_ext_queue:{rules:[70,71,72,73],inclusive:!1},system_ext_db:{rules:[70,71,72,73],inclusive:!1},system_ext:{rules:[70,71,72,73],inclusive:!1},system_queue:{rules:[70,71,72,73],inclusive:!1},system_db:{rules:[70,71,72,73],inclusive:!1},system:{rules:[70,71,72,73],inclusive:!1},person_ext:{rules:[70,71,72,73],inclusive:!1},person:{rules:[70,71,72,73],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,86,87,88,89,90],inclusive:!0}}},t);function bt(){this.yy={}}return yt.lexer=mt,bt.prototype=yt,yt.Parser=bt,new bt}();Wr.parser=Wr;const qr=Wr,Hr=t=>null!==t.match(/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/);let Vr=[],Gr=[""],Xr="global",Qr="",Kr=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Jr=[],ta="",ea=!1,na=4,ia=2;var ra;const aa=function(t){return null==t?Vr:Vr.filter((e=>e.parentBoundary===t))},sa=function(){return ea},oa={addPersonOrSystem:function(t,e,n,i,r,a,s){if(null===e||null===n)return;let o={};const c=Vr.find((t=>t.alias===e));if(c&&e===c.alias?o=c:(o.alias=e,Vr.push(o)),o.label=null==n?{text:""}:{text:n},null==i)o.descr={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]={text:e}}else o.descr={text:i};if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.sprite=r;if("object"==typeof a){let[t,e]=Object.entries(a)[0];o[t]=e}else o.tags=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=e}else o.link=s;o.typeC4Shape={text:t},o.parentBoundary=Xr,o.wrap=sa()},addPersonOrSystemBoundary:function(t,e,n,i,r){if(null===t||null===e)return;let a={};const s=Kr.find((e=>e.alias===t));if(s&&t===s.alias?a=s:(a.alias=t,Kr.push(a)),a.label=null==e?{text:""}:{text:e},null==n)a.type={text:"system"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];a[t]={text:e}}else a.type={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];a[t]=e}else a.tags=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];a[t]=e}else a.link=r;a.parentBoundary=Xr,a.wrap=sa(),Qr=Xr,Xr=t,Gr.push(Qr)},addContainer:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Vr.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Vr.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof a){let[t,e]=Object.entries(a)[0];c[t]=e}else c.sprite=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=sa(),c.typeC4Shape={text:t},c.parentBoundary=Xr},addContainerBoundary:function(t,e,n,i,r){if(null===t||null===e)return;let a={};const s=Kr.find((e=>e.alias===t));if(s&&t===s.alias?a=s:(a.alias=t,Kr.push(a)),a.label=null==e?{text:""}:{text:e},null==n)a.type={text:"container"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];a[t]={text:e}}else a.type={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];a[t]=e}else a.tags=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];a[t]=e}else a.link=r;a.parentBoundary=Xr,a.wrap=sa(),Qr=Xr,Xr=t,Gr.push(Qr)},addComponent:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Vr.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Vr.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof a){let[t,e]=Object.entries(a)[0];c[t]=e}else c.sprite=a;if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=sa(),c.typeC4Shape={text:t},c.parentBoundary=Xr},addDeploymentNode:function(t,e,n,i,r,a,s,o){if(null===e||null===n)return;let c={};const l=Kr.find((t=>t.alias===e));if(l&&e===l.alias?c=l:(c.alias=e,Kr.push(c)),c.label=null==n?{text:""}:{text:n},null==i)c.type={text:"node"};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.type={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.tags=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.nodeType=t,c.parentBoundary=Xr,c.wrap=sa(),Qr=Xr,Xr=e,Gr.push(Qr)},popBoundaryParseStack:function(){Xr=Qr,Gr.pop(),Qr=Gr.pop(),Gr.push(Qr)},addRel:function(t,e,n,i,r,a,s,o,c){if(null==t||null==e||null==n||null==i)return;let l={};const h=Jr.find((t=>t.from===e&&t.to===n));if(h?l=h:Jr.push(l),l.type=t,l.from=e,l.to=n,l.label={text:i},null==r)l.techn={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];l[t]={text:e}}else l.techn={text:r};if(null==a)l.descr={text:""};else if("object"==typeof a){let[t,e]=Object.entries(a)[0];l[t]={text:e}}else l.descr={text:a};if("object"==typeof s){let[t,e]=Object.entries(s)[0];l[t]=e}else l.sprite=s;if("object"==typeof o){let[t,e]=Object.entries(o)[0];l[t]=e}else l.tags=o;if("object"==typeof c){let[t,e]=Object.entries(c)[0];l[t]=e}else l.link=c;l.wrap=sa()},updateElStyle:function(t,e,n,i,r,a,s,o,c,l,h){let u=Vr.find((t=>t.alias===e));if(void 0!==u||(u=Kr.find((t=>t.alias===e)),void 0!==u)){if(null!=n)if("object"==typeof n){let[t,e]=Object.entries(n)[0];u[t]=e}else u.bgColor=n;if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];u[t]=e}else u.fontColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];u[t]=e}else u.borderColor=r;if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];u[t]=e}else u.shadowing=a;if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];u[t]=e}else u.shape=s;if(null!=o)if("object"==typeof o){let[t,e]=Object.entries(o)[0];u[t]=e}else u.sprite=o;if(null!=c)if("object"==typeof c){let[t,e]=Object.entries(c)[0];u[t]=e}else u.techn=c;if(null!=l)if("object"==typeof l){let[t,e]=Object.entries(l)[0];u[t]=e}else u.legendText=l;if(null!=h)if("object"==typeof h){let[t,e]=Object.entries(h)[0];u[t]=e}else u.legendSprite=h}},updateRelStyle:function(t,e,n,i,r,a,s){const o=Jr.find((t=>t.from===e&&t.to===n));if(void 0!==o){if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]=e}else o.textColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.lineColor=r;if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];o[t]=parseInt(e)}else o.offsetX=parseInt(a);if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=parseInt(e)}else o.offsetY=parseInt(s)}},updateLayoutConfig:function(t,e,n){let i=na,r=ia;if("object"==typeof e){const t=Object.values(e)[0];i=parseInt(t)}else i=parseInt(e);if("object"==typeof n){const t=Object.values(n)[0];r=parseInt(t)}else r=parseInt(n);i>=1&&(na=i),r>=1&&(ia=r)},autoWrap:sa,setWrap:function(t){ea=t},getC4ShapeArray:aa,getC4Shape:function(t){return Vr.find((e=>e.alias===t))},getC4ShapeKeys:function(t){return Object.keys(aa(t))},getBoundarys:function(t){return null==t?Kr:Kr.filter((e=>e.parentBoundary===t))},getCurrentBoundaryParse:function(){return Xr},getParentBoundaryParse:function(){return Qr},getRels:function(){return Jr},getTitle:function(){return ta},getC4Type:function(){return ra},getC4ShapeInRow:function(){return na},getC4BoundaryInRow:function(){return ia},setAccTitle:zi,getAccTitle:Ui,getAccDescription:qi,setAccDescription:Wi,parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().c4,clear:function(){Vr=[],Kr=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Qr="",Xr="global",Gr=[""],Jr=[],Gr=[""],ta="",ea=!1,na=4,ia=2},LINETYPE:{SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},setTitle:function(t){let e=It(t,gi());ta=e},setC4Type:function(t){let e=It(t,gi());ra=e}},ca=function(t,e){const n=t.append("rect");if(n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),"undefined"!==e.attrs&&null!==e.attrs)for(let i in e.attrs)n.attr(i,e.attrs[i]);return"undefined"!==e.class&&n.attr("class",e.class),n},la=function(t,e,n,i,r,a){const o=t.append("image");o.attr("width",e),o.attr("height",n),o.attr("x",i),o.attr("y",r);let c=a.startsWith("data:image/png;base64")?a:(0,s.Nm)(a);o.attr("xlink:href",c)},ha=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},ua=(t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),da=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c){const{fontSize:l,fontFamily:h,fontWeight:u}=c,d=t.split(jt.lineBreakRegex);for(let p=0;p<d.length;p++){const t=p*l-l*(d.length-1)/2,s=e.append("text").attr("x",n+a/2).attr("y",r).style("text-anchor","middle").attr("dominant-baseline","middle").style("font-size",l).style("font-weight",u).style("font-family",h);s.append("tspan").attr("dy",t).text(d[p]).attr("alignment-baseline","mathematical"),i(s,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,0,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),pa=function(t,e,n){const i=t.append("g");let r=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",o={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(o={"stroke-width":1});let c={x:e.x,y:e.y,fill:r,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:o};ca(i,c);let l=n.boundaryFont();l.fontWeight="bold",l.fontSize=l.fontSize+2,l.fontColor=s,da(n)(e.label.text,i,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},l),e.type&&""!==e.type.text&&(l=n.boundaryFont(),l.fontColor=s,da(n)(e.type.text,i,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},l)),e.descr&&""!==e.descr.text&&(l=n.boundaryFont(),l.fontSize=l.fontSize-2,l.fontColor=s,da(n)(e.descr.text,i,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},l))},fa=function(t,e,n){var i;let r=e.bgColor?e.bgColor:n[e.typeC4Shape.text+"_bg_color"],a=e.borderColor?e.borderColor:n[e.typeC4Shape.text+"_border_color"],s=e.fontColor?e.fontColor:"#FFFFFF",o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="}const c=t.append("g");c.attr("class","person-man");const l=ha();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":l.x=e.x,l.y=e.y,l.fill=r,l.width=e.width,l.height=e.height,l.stroke=a,l.rx=2.5,l.ry=2.5,l.attrs={"stroke-width":.5},ca(c,l);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":c.append("path").attr("fill",r).attr("stroke-width","0.5").attr("stroke",a).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),c.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",a).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":c.append("path").attr("fill",r).attr("stroke-width","0.5").attr("stroke",a).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),c.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",a).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2))}let h=ua(n,e.typeC4Shape.text);switch(c.append("text").attr("fill",s).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":la(c,48,48,e.x+e.width/2-24,e.y+e.image.Y,o)}let u=n[e.typeC4Shape.text+"Font"]();return u.fontWeight="bold",u.fontSize=u.fontSize+2,u.fontColor=s,da(n)(e.label.text,c,e.x,e.y+e.label.Y,e.width,e.height,{fill:s},u),u=n[e.typeC4Shape.text+"Font"](),u.fontColor=s,e.techn&&""!==(null==(i=e.techn)?void 0:i.text)?da(n)(e.techn.text,c,e.x,e.y+e.techn.Y,e.width,e.height,{fill:s,"font-style":"italic"},u):e.type&&""!==e.type.text&&da(n)(e.type.text,c,e.x,e.y+e.type.Y,e.width,e.height,{fill:s,"font-style":"italic"},u),e.descr&&""!==e.descr.text&&(u=n.personFont(),u.fontColor=s,da(n)(e.descr.text,c,e.x,e.y+e.descr.Y,e.width,e.height,{fill:s},u)),e.height},ga=(t,e,n)=>{const i=t.append("g");let r=0;for(let a of e){let t=a.textColor?a.textColor:"#444444",e=a.lineColor?a.lineColor:"#444444",s=a.offsetX?parseInt(a.offsetX):0,o=a.offsetY?parseInt(a.offsetY):0,c="";if(0===r){let t=i.append("line");t.attr("x1",a.startPoint.x),t.attr("y1",a.startPoint.y),t.attr("x2",a.endPoint.x),t.attr("y2",a.endPoint.y),t.attr("stroke-width","1"),t.attr("stroke",e),t.style("fill","none"),"rel_b"!==a.type&&t.attr("marker-end","url("+c+"#arrowhead)"),"birel"!==a.type&&"rel_b"!==a.type||t.attr("marker-start","url("+c+"#arrowend)"),r=-1}else{let t=i.append("path");t.attr("fill","none").attr("stroke-width","1").attr("stroke",e).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),"rel_b"!==a.type&&t.attr("marker-end","url("+c+"#arrowhead)"),"birel"!==a.type&&"rel_b"!==a.type||t.attr("marker-start","url("+c+"#arrowend)")}let l=n.messageFont();da(n)(a.label.text,i,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+s,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+o,a.label.width,a.label.height,{fill:t},l),a.techn&&""!==a.techn.text&&(l=n.messageFont(),da(n)("["+a.techn.text+"]",i,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+s,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+n.messageFontSize+5+o,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:t,"font-style":"italic"},l))}},ya=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},ma=function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},ba=function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},_a=function(t){const e=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);e.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),e.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},xa=function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},va=function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},ka=function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")};s.Nm;let wa=0,Ca=0,Ta=4,Ea=2;Wr.yy=oa;let Sa={};class Aa{constructor(t){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,La(t.db.getConfig())}setData(t,e,n,i){this.nextData.startx=this.data.startx=t,this.nextData.stopx=this.data.stopx=e,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])}insert(t){this.nextData.cnt=this.nextData.cnt+1;let e=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+t.margin:this.nextData.stopx+2*t.margin,n=e+t.width,i=this.nextData.starty+2*t.margin,r=i+t.height;(e>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>Ta)&&(e=this.nextData.startx+t.margin+Sa.nextLinePaddingX,i=this.nextData.stopy+2*t.margin,this.nextData.stopx=n=e+t.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=r=i+t.height,this.nextData.cnt=1),t.x=e,t.y=i,this.updateVal(this.data,"startx",e,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",r,Math.max),this.updateVal(this.nextData,"startx",e,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",r,Math.max)}init(t){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},La(t.db.getConfig())}bumpLastMargin(t){this.data.stopx+=t,this.data.stopy+=t}}const La=function(t){$n(Sa,t),t.fontFamily&&(Sa.personFontFamily=Sa.systemFontFamily=Sa.messageFontFamily=t.fontFamily),t.fontSize&&(Sa.personFontSize=Sa.systemFontSize=Sa.messageFontSize=t.fontSize),t.fontWeight&&(Sa.personFontWeight=Sa.systemFontWeight=Sa.messageFontWeight=t.fontWeight)},Ba=(t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),Na=t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight});function Da(t,e,n,i,r){if(!e[t].width)if(n)e[t].text=Gn(e[t].text,r,i),e[t].textLines=e[t].text.split(jt.lineBreakRegex).length,e[t].width=r,e[t].height=Qn(e[t].text,i);else{let n=e[t].text.split(jt.lineBreakRegex);e[t].textLines=n.length;let r=0;e[t].height=0,e[t].width=0;for(const a of n)e[t].width=Math.max(Kn(a,i),e[t].width),r=Qn(a,i),e[t].height=e[t].height+r}}const Oa=function(t,e,n){e.x=n.data.startx,e.y=n.data.starty,e.width=n.data.stopx-n.data.startx,e.height=n.data.stopy-n.data.starty,e.label.y=Sa.c4ShapeMargin-35;let i=e.wrap&&Sa.wrap,r=Na(Sa);r.fontSize=r.fontSize+2,r.fontWeight="bold",Da("label",e,i,r,Kn(e.label.text,r)),pa(t,e,Sa)},Ma=function(t,e,n,i){let r=0;for(const a of i){r=0;const i=n[a];let s=Ba(Sa,i.typeC4Shape.text);switch(s.fontSize=s.fontSize-2,i.typeC4Shape.width=Kn("<<"+i.typeC4Shape.text+">>",s),i.typeC4Shape.height=s.fontSize+2,i.typeC4Shape.Y=Sa.c4ShapePadding,r=i.typeC4Shape.Y+i.typeC4Shape.height-4,i.image={width:0,height:0,Y:0},i.typeC4Shape.text){case"person":case"external_person":i.image.width=48,i.image.height=48,i.image.Y=r,r=i.image.Y+i.image.height}i.sprite&&(i.image.width=48,i.image.height=48,i.image.Y=r,r=i.image.Y+i.image.height);let o=i.wrap&&Sa.wrap,c=Sa.width-2*Sa.c4ShapePadding,l=Ba(Sa,i.typeC4Shape.text);if(l.fontSize=l.fontSize+2,l.fontWeight="bold",Da("label",i,o,l,c),i.label.Y=r+8,r=i.label.Y+i.label.height,i.type&&""!==i.type.text){i.type.text="["+i.type.text+"]",Da("type",i,o,Ba(Sa,i.typeC4Shape.text),c),i.type.Y=r+5,r=i.type.Y+i.type.height}else if(i.techn&&""!==i.techn.text){i.techn.text="["+i.techn.text+"]",Da("techn",i,o,Ba(Sa,i.techn.text),c),i.techn.Y=r+5,r=i.techn.Y+i.techn.height}let h=r,u=i.label.width;if(i.descr&&""!==i.descr.text){Da("descr",i,o,Ba(Sa,i.typeC4Shape.text),c),i.descr.Y=r+20,r=i.descr.Y+i.descr.height,u=Math.max(i.label.width,i.descr.width),h=r-5*i.descr.textLines}u+=Sa.c4ShapePadding,i.width=Math.max(i.width||Sa.width,u,Sa.width),i.height=Math.max(i.height||Sa.height,h,Sa.height),i.margin=i.margin||Sa.c4ShapeMargin,t.insert(i),fa(e,i,Sa)}t.bumpLastMargin(Sa.c4ShapeMargin)};class Ia{constructor(t,e){this.x=t,this.y=e}}let Fa=function(t,e){let n=t.x,i=t.y,r=e.x,a=e.y,s=n+t.width/2,o=i+t.height/2,c=Math.abs(n-r),l=Math.abs(i-a),h=l/c,u=t.height/t.width,d=null;return i==a&&n<r?d=new Ia(n+t.width,o):i==a&&n>r?d=new Ia(n,o):n==r&&i<a?d=new Ia(s,i+t.height):n==r&&i>a&&(d=new Ia(s,i)),n>r&&i<a?d=u>=h?new Ia(n,o+h*t.width/2):new Ia(s-c/l*t.height/2,i+t.height):n<r&&i<a?d=u>=h?new Ia(n+t.width,o+h*t.width/2):new Ia(s+c/l*t.height/2,i+t.height):n<r&&i>a?d=u>=h?new Ia(n+t.width,o-h*t.width/2):new Ia(s+t.height/2*c/l,i):n>r&&i>a&&(d=u>=h?new Ia(n,o-t.width/2*h):new Ia(s-t.height/2*c/l,i)),d},$a=function(t,e){let n={x:0,y:0};n.x=e.x+e.width/2,n.y=e.y+e.height/2;let i=Fa(t,n);return n.x=t.x+t.width/2,n.y=t.y+t.height/2,{startPoint:i,endPoint:Fa(e,n)}};function Ra(t,e,n,i,r){let a=new Aa(r);a.data.widthLimit=n.data.widthLimit/Math.min(Ea,i.length);for(let[s,o]of i.entries()){let i=0;o.image={width:0,height:0,Y:0},o.sprite&&(o.image.width=48,o.image.height=48,o.image.Y=i,i=o.image.Y+o.image.height);let c=o.wrap&&Sa.wrap,l=Na(Sa);if(l.fontSize=l.fontSize+2,l.fontWeight="bold",Da("label",o,c,l,a.data.widthLimit),o.label.Y=i+8,i=o.label.Y+o.label.height,o.type&&""!==o.type.text){o.type.text="["+o.type.text+"]",Da("type",o,c,Na(Sa),a.data.widthLimit),o.type.Y=i+5,i=o.type.Y+o.type.height}if(o.descr&&""!==o.descr.text){let t=Na(Sa);t.fontSize=t.fontSize-2,Da("descr",o,c,t,a.data.widthLimit),o.descr.Y=i+20,i=o.descr.Y+o.descr.height}if(0==s||s%Ea==0){let t=n.data.startx+Sa.diagramMarginX,e=n.data.stopy+Sa.diagramMarginY+i;a.setData(t,t,e,e)}else{let t=a.data.stopx!==a.data.startx?a.data.stopx+Sa.diagramMarginX:a.data.startx,e=a.data.starty;a.setData(t,t,e,e)}a.name=o.alias;let h=r.db.getC4ShapeArray(o.alias),u=r.db.getC4ShapeKeys(o.alias);u.length>0&&Ma(a,t,h,u),e=o.alias;let d=r.db.getBoundarys(e);d.length>0&&Ra(t,e,a,d,r),"global"!==o.alias&&Oa(t,o,a),n.data.stopy=Math.max(a.data.stopy+Sa.c4ShapeMargin,n.data.stopy),n.data.stopx=Math.max(a.data.stopx+Sa.c4ShapeMargin,n.data.stopx),wa=Math.max(wa,n.data.stopx),Ca=Math.max(Ca,n.data.stopy)}}const Za={drawPersonOrSystemArray:Ma,drawBoundary:Oa,setConf:La,draw:function(t,e,n,i){Sa=gi().c4;const r=gi().securityLevel;let a;"sandbox"===r&&(a=(0,o.Ys)("#i"+e));const s="sandbox"===r?(0,o.Ys)(a.nodes()[0].contentDocument.body):(0,o.Ys)("body");let c=i.db;i.db.setWrap(Sa.wrap),Ta=c.getC4ShapeInRow(),Ea=c.getC4BoundaryInRow(),Bt.debug(`C:${JSON.stringify(Sa,null,2)}`);const l="sandbox"===r?s.select(`[id="${e}"]`):(0,o.Ys)(`[id="${e}"]`);va(l),xa(l),ka(l);let h=new Aa(i);h.setData(Sa.diagramMarginX,Sa.diagramMarginX,Sa.diagramMarginY,Sa.diagramMarginY),h.data.widthLimit=screen.availWidth,wa=Sa.diagramMarginX,Ca=Sa.diagramMarginY;const u=i.db.getTitle();Ra(l,"",h,i.db.getBoundarys(""),i),ya(l),ma(l),_a(l),ba(l),function(t,e,n,i){let r=0;for(let s of e){r+=1;let t=s.wrap&&Sa.wrap,e={fontFamily:(a=Sa).messageFontFamily,fontSize:a.messageFontSize,fontWeight:a.messageFontWeight};"C4Dynamic"===i.db.getC4Type()&&(s.label.text=r+": "+s.label.text);let o=Kn(s.label.text,e);Da("label",s,t,e,o),s.techn&&""!==s.techn.text&&(o=Kn(s.techn.text,e),Da("techn",s,t,e,o)),s.descr&&""!==s.descr.text&&(o=Kn(s.descr.text,e),Da("descr",s,t,e,o));let c=n(s.from),l=n(s.to),h=$a(c,l);s.startPoint=h.startPoint,s.endPoint=h.endPoint}var a;ga(t,e,Sa)}(l,i.db.getRels(),i.db.getC4Shape,i),h.data.stopx=wa,h.data.stopy=Ca;const d=h.data;let p=d.stopy-d.starty+2*Sa.diagramMarginY;const f=d.stopx-d.startx+2*Sa.diagramMarginX;u&&l.append("text").text(u).attr("x",(d.stopx-d.startx)/2-4*Sa.diagramMarginX).attr("y",d.starty+Sa.diagramMarginY),ki(l,p,f,Sa.useMaxWidth);const g=u?60:0;l.attr("viewBox",d.startx-Sa.diagramMarginX+" -"+(Sa.diagramMarginY+g)+" "+f+" "+(p+g)),Bt.debug("models:",d)}};var Pa=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,7],r=[1,8],a=[1,9],s=[1,10],o=[1,13],c=[1,12],l=[1,16,25],h=[1,20],u=[1,32],d=[1,33],p=[1,34],f=[1,36],g=[1,39],y=[1,37],m=[1,38],b=[1,44],_=[1,45],x=[1,40],v=[1,41],k=[1,42],w=[1,43],C=[1,48],T=[1,49],E=[1,50],S=[1,51],A=[16,25],L=[1,65],B=[1,66],N=[1,67],D=[1,68],O=[1,69],M=[1,70],I=[1,71],F=[1,80],$=[16,25,32,45,46,54,60,61,62,63,64,65,66,71,73],R=[16,25,30,32,45,46,50,54,60,61,62,63,64,65,66,71,73,88,89,90,91],Z=[5,8,9,10,11,16,19,23,25],P=[54,88,89,90,91],j=[54,65,66,88,89,90,91],Y=[54,60,61,62,63,64,88,89,90,91],z=[16,25,32],U=[1,107],W={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statments:5,direction:6,directive:7,direction_tb:8,direction_bt:9,direction_rl:10,direction_lr:11,graphConfig:12,openDirective:13,typeDirective:14,closeDirective:15,NEWLINE:16,":":17,argDirective:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,CLASS_DIAGRAM:23,statements:24,EOF:25,statement:26,className:27,alphaNumToken:28,classLiteralName:29,GENERICTYPE:30,relationStatement:31,LABEL:32,classStatement:33,methodStatement:34,annotationStatement:35,clickStatement:36,cssClassStatement:37,noteStatement:38,acc_title:39,acc_title_value:40,acc_descr:41,acc_descr_value:42,acc_descr_multiline_value:43,CLASS:44,STYLE_SEPARATOR:45,STRUCT_START:46,members:47,STRUCT_STOP:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,STR:54,NOTE_FOR:55,noteText:56,NOTE:57,relationType:58,lineType:59,AGGREGATION:60,EXTENSION:61,COMPOSITION:62,DEPENDENCY:63,LOLLIPOP:64,LINE:65,DOTTED_LINE:66,CALLBACK:67,LINK:68,LINK_TARGET:69,CLICK:70,CALLBACK_NAME:71,CALLBACK_ARGS:72,HREF:73,CSSCLASS:74,commentToken:75,textToken:76,graphCodeTokens:77,textNoTagsToken:78,TAGSTART:79,TAGEND:80,"==":81,"--":82,PCT:83,DEFAULT:84,SPACE:85,MINUS:86,keywords:87,UNICODE_TEXT:88,NUM:89,ALPHA:90,BQUOTE_STR:91,$accept:0,$end:1},terminals_:{2:"error",5:"statments",8:"direction_tb",9:"direction_bt",10:"direction_rl",11:"direction_lr",16:"NEWLINE",17:":",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",23:"CLASS_DIAGRAM",25:"EOF",30:"GENERICTYPE",32:"LABEL",39:"acc_title",40:"acc_title_value",41:"acc_descr",42:"acc_descr_value",43:"acc_descr_multiline_value",44:"CLASS",45:"STYLE_SEPARATOR",46:"STRUCT_START",48:"STRUCT_STOP",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"STR",55:"NOTE_FOR",57:"NOTE",60:"AGGREGATION",61:"EXTENSION",62:"COMPOSITION",63:"DEPENDENCY",64:"LOLLIPOP",65:"LINE",66:"DOTTED_LINE",67:"CALLBACK",68:"LINK",69:"LINK_TARGET",70:"CLICK",71:"CALLBACK_NAME",72:"CALLBACK_ARGS",73:"HREF",74:"CSSCLASS",77:"graphCodeTokens",79:"TAGSTART",80:"TAGEND",81:"==",82:"--",83:"PCT",84:"DEFAULT",85:"SPACE",86:"MINUS",87:"keywords",88:"UNICODE_TEXT",89:"NUM",90:"ALPHA",91:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[3,1],[3,2],[6,1],[6,1],[6,1],[6,1],[4,1],[7,4],[7,6],[13,1],[14,1],[18,1],[15,1],[12,4],[24,1],[24,2],[24,3],[27,1],[27,1],[27,2],[27,2],[27,2],[26,1],[26,2],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,2],[26,2],[26,1],[33,2],[33,4],[33,5],[33,7],[35,4],[47,1],[47,2],[34,1],[34,2],[34,1],[34,1],[31,3],[31,4],[31,4],[31,5],[38,3],[38,2],[53,3],[53,2],[53,2],[53,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[36,3],[36,4],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[37,3],[75,1],[75,1],[76,1],[76,1],[76,1],[76,1],[76,1],[76,1],[76,1],[78,1],[78,1],[78,1],[78,1],[28,1],[28,1],[28,1],[29,1],[56,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 5:i.setDirection("TB");break;case 6:i.setDirection("BT");break;case 7:i.setDirection("RL");break;case 8:i.setDirection("LR");break;case 12:i.parseDirective("%%{","open_directive");break;case 13:i.parseDirective(a[o],"type_directive");break;case 14:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 15:i.parseDirective("}%%","close_directive","class");break;case 20:case 21:this.$=a[o];break;case 22:this.$=a[o-1]+a[o];break;case 23:case 24:this.$=a[o-1]+"~"+a[o];break;case 25:i.addRelation(a[o]);break;case 26:a[o-1].title=i.cleanupLabel(a[o]),i.addRelation(a[o-1]);break;case 35:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 36:case 37:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 38:i.addClass(a[o]);break;case 39:i.addClass(a[o-2]),i.setCssClass(a[o-2],a[o]);break;case 40:i.addClass(a[o-3]),i.addMembers(a[o-3],a[o-1]);break;case 41:i.addClass(a[o-5]),i.setCssClass(a[o-5],a[o-3]),i.addMembers(a[o-5],a[o-1]);break;case 42:i.addAnnotation(a[o],a[o-2]);break;case 43:this.$=[a[o]];break;case 44:a[o].push(a[o-1]),this.$=a[o];break;case 45:case 47:case 48:break;case 46:i.addMember(a[o-1],i.cleanupLabel(a[o]));break;case 49:this.$={id1:a[o-2],id2:a[o],relation:a[o-1],relationTitle1:"none",relationTitle2:"none"};break;case 50:this.$={id1:a[o-3],id2:a[o],relation:a[o-1],relationTitle1:a[o-2],relationTitle2:"none"};break;case 51:this.$={id1:a[o-3],id2:a[o],relation:a[o-2],relationTitle1:"none",relationTitle2:a[o-1]};break;case 52:this.$={id1:a[o-4],id2:a[o],relation:a[o-2],relationTitle1:a[o-3],relationTitle2:a[o-1]};break;case 53:i.addNote(a[o],a[o-1]);break;case 54:i.addNote(a[o]);break;case 55:this.$={type1:a[o-2],type2:a[o],lineType:a[o-1]};break;case 56:this.$={type1:"none",type2:a[o],lineType:a[o-1]};break;case 57:this.$={type1:a[o-1],type2:"none",lineType:a[o]};break;case 58:this.$={type1:"none",type2:"none",lineType:a[o]};break;case 59:this.$=i.relationType.AGGREGATION;break;case 60:this.$=i.relationType.EXTENSION;break;case 61:this.$=i.relationType.COMPOSITION;break;case 62:this.$=i.relationType.DEPENDENCY;break;case 63:this.$=i.relationType.LOLLIPOP;break;case 64:this.$=i.lineType.LINE;break;case 65:this.$=i.lineType.DOTTED_LINE;break;case 66:case 72:this.$=a[o-2],i.setClickEvent(a[o-1],a[o]);break;case 67:case 73:this.$=a[o-3],i.setClickEvent(a[o-2],a[o-1]),i.setTooltip(a[o-2],a[o]);break;case 68:case 76:this.$=a[o-2],i.setLink(a[o-1],a[o]);break;case 69:case 77:this.$=a[o-3],i.setLink(a[o-2],a[o-1],a[o]);break;case 70:case 78:this.$=a[o-3],i.setLink(a[o-2],a[o-1]),i.setTooltip(a[o-2],a[o]);break;case 71:case 79:this.$=a[o-4],i.setLink(a[o-3],a[o-2],a[o]),i.setTooltip(a[o-3],a[o-1]);break;case 74:this.$=a[o-3],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 75:this.$=a[o-4],i.setClickEvent(a[o-3],a[o-2],a[o-1]),i.setTooltip(a[o-3],a[o]);break;case 80:i.setCssClass(a[o-1],a[o])}},table:[{3:1,4:2,5:n,6:4,7:5,8:i,9:r,10:a,11:s,12:6,13:11,19:o,23:c},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{3:14,4:2,5:n,6:4,7:5,8:i,9:r,10:a,11:s,12:6,13:11,19:o,23:c},{1:[2,9]},e(l,[2,5]),e(l,[2,6]),e(l,[2,7]),e(l,[2,8]),{14:15,20:[1,16]},{16:[1,17]},{20:[2,12]},{1:[2,4]},{15:18,17:[1,19],22:h},e([17,22],[2,13]),{6:31,7:30,8:i,9:r,10:a,11:s,13:11,19:o,24:21,26:22,27:35,28:46,29:47,31:23,33:24,34:25,35:26,36:27,37:28,38:29,39:u,41:d,43:p,44:f,49:g,51:y,52:m,55:b,57:_,67:x,68:v,70:k,74:w,88:C,89:T,90:E,91:S},{16:[1,52]},{18:53,21:[1,54]},{16:[2,15]},{25:[1,55]},{16:[1,56],25:[2,17]},e(A,[2,25],{32:[1,57]}),e(A,[2,27]),e(A,[2,28]),e(A,[2,29]),e(A,[2,30]),e(A,[2,31]),e(A,[2,32]),e(A,[2,33]),e(A,[2,34]),{40:[1,58]},{42:[1,59]},e(A,[2,37]),e(A,[2,45],{53:60,58:63,59:64,32:[1,62],54:[1,61],60:L,61:B,62:N,63:D,64:O,65:M,66:I}),{27:72,28:46,29:47,88:C,89:T,90:E,91:S},e(A,[2,47]),e(A,[2,48]),{28:73,88:C,89:T,90:E},{27:74,28:46,29:47,88:C,89:T,90:E,91:S},{27:75,28:46,29:47,88:C,89:T,90:E,91:S},{27:76,28:46,29:47,88:C,89:T,90:E,91:S},{54:[1,77]},{27:78,28:46,29:47,88:C,89:T,90:E,91:S},{54:F,56:79},e($,[2,20],{28:46,29:47,27:81,30:[1,82],88:C,89:T,90:E,91:S}),e($,[2,21],{30:[1,83]}),e(R,[2,94]),e(R,[2,95]),e(R,[2,96]),e([16,25,30,32,45,46,54,60,61,62,63,64,65,66,71,73],[2,97]),e(Z,[2,10]),{15:84,22:h},{22:[2,14]},{1:[2,16]},{6:31,7:30,8:i,9:r,10:a,11:s,13:11,19:o,24:85,25:[2,18],26:22,27:35,28:46,29:47,31:23,33:24,34:25,35:26,36:27,37:28,38:29,39:u,41:d,43:p,44:f,49:g,51:y,52:m,55:b,57:_,67:x,68:v,70:k,74:w,88:C,89:T,90:E,91:S},e(A,[2,26]),e(A,[2,35]),e(A,[2,36]),{27:86,28:46,29:47,54:[1,87],88:C,89:T,90:E,91:S},{53:88,58:63,59:64,60:L,61:B,62:N,63:D,64:O,65:M,66:I},e(A,[2,46]),{59:89,65:M,66:I},e(P,[2,58],{58:90,60:L,61:B,62:N,63:D,64:O}),e(j,[2,59]),e(j,[2,60]),e(j,[2,61]),e(j,[2,62]),e(j,[2,63]),e(Y,[2,64]),e(Y,[2,65]),e(A,[2,38],{45:[1,91],46:[1,92]}),{50:[1,93]},{54:[1,94]},{54:[1,95]},{71:[1,96],73:[1,97]},{28:98,88:C,89:T,90:E},{54:F,56:99},e(A,[2,54]),e(A,[2,98]),e($,[2,22]),e($,[2,23]),e($,[2,24]),{16:[1,100]},{25:[2,19]},e(z,[2,49]),{27:101,28:46,29:47,88:C,89:T,90:E,91:S},{27:102,28:46,29:47,54:[1,103],88:C,89:T,90:E,91:S},e(P,[2,57],{58:104,60:L,61:B,62:N,63:D,64:O}),e(P,[2,56]),{28:105,88:C,89:T,90:E},{47:106,51:U},{27:108,28:46,29:47,88:C,89:T,90:E,91:S},e(A,[2,66],{54:[1,109]}),e(A,[2,68],{54:[1,111],69:[1,110]}),e(A,[2,72],{54:[1,112],72:[1,113]}),e(A,[2,76],{54:[1,115],69:[1,114]}),e(A,[2,80]),e(A,[2,53]),e(Z,[2,11]),e(z,[2,51]),e(z,[2,50]),{27:116,28:46,29:47,88:C,89:T,90:E,91:S},e(P,[2,55]),e(A,[2,39],{46:[1,117]}),{48:[1,118]},{47:119,48:[2,43],51:U},e(A,[2,42]),e(A,[2,67]),e(A,[2,69]),e(A,[2,70],{69:[1,120]}),e(A,[2,73]),e(A,[2,74],{54:[1,121]}),e(A,[2,77]),e(A,[2,78],{69:[1,122]}),e(z,[2,52]),{47:123,51:U},e(A,[2,40]),{48:[2,44]},e(A,[2,71]),e(A,[2,75]),e(A,[2,79]),{48:[1,124]},e(A,[2,41])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],6:[2,9],13:[2,12],14:[2,4],20:[2,15],54:[2,14],55:[2,16],85:[2,19],119:[2,44]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},q=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),19;case 1:return 8;case 2:return 9;case 3:return 10;case 4:return 11;case 5:return this.begin("type_directive"),20;case 6:return this.popState(),this.begin("arg_directive"),17;case 7:return this.popState(),this.popState(),22;case 8:return 21;case 9:case 10:case 19:case 27:break;case 11:return this.begin("acc_title"),39;case 12:return this.popState(),"acc_title_value";case 13:return this.begin("acc_descr"),41;case 14:return this.popState(),"acc_descr_value";case 15:this.begin("acc_descr_multiline");break;case 16:case 39:case 42:case 45:case 48:case 51:case 54:this.popState();break;case 17:return"acc_descr_multiline_value";case 18:return 16;case 20:case 21:return 23;case 22:return this.begin("struct"),46;case 23:return"EDGE_STATE";case 24:return"EOF_IN_STRUCT";case 25:return"OPEN_IN_STRUCT";case 26:return this.popState(),48;case 28:return"MEMBER";case 29:return 44;case 30:return 74;case 31:return 67;case 32:return 68;case 33:return 70;case 34:return 55;case 35:return 57;case 36:return 49;case 37:return 50;case 38:this.begin("generic");break;case 40:return"GENERICTYPE";case 41:this.begin("string");break;case 43:return"STR";case 44:this.begin("bqstring");break;case 46:return"BQUOTE_STR";case 47:this.begin("href");break;case 49:return 73;case 50:this.begin("callback_name");break;case 52:this.popState(),this.begin("callback_args");break;case 53:return 71;case 55:return 72;case 56:case 57:case 58:case 59:return 69;case 60:case 61:return 61;case 62:case 63:return 63;case 64:return 62;case 65:return 60;case 66:return 64;case 67:return 65;case 68:return 66;case 69:return 32;case 70:return 45;case 71:return 86;case 72:return"DOT";case 73:return"PLUS";case 74:return 83;case 75:case 76:return"EQUALS";case 77:return 90;case 78:return"PUNCTUATION";case 79:return 89;case 80:return 88;case 81:return 85;case 82:return 25}},rules:[/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:[{])/,/^(?:\[\*\])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:class\b)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[`])/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[16,17],inclusive:!1},acc_descr:{rules:[14],inclusive:!1},acc_title:{rules:[12],inclusive:!1},arg_directive:{rules:[7,8],inclusive:!1},type_directive:{rules:[6,7],inclusive:!1},open_directive:{rules:[5],inclusive:!1},callback_args:{rules:[54,55],inclusive:!1},callback_name:{rules:[51,52,53],inclusive:!1},href:{rules:[48,49],inclusive:!1},struct:{rules:[23,24,25,26,27,28],inclusive:!1},generic:{rules:[39,40],inclusive:!1},bqstring:{rules:[45,46],inclusive:!1},string:{rules:[42,43],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,23,29,30,31,32,33,34,35,36,37,38,41,44,47,50,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82],inclusive:!0}}},t);function H(){this.yy={}}return W.lexer=q,H.prototype=W,W.Parser=H,new H}();Pa.parser=Pa;const ja=Pa,Ya=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.class)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*classDiagram/)},za=(t,e)=>{var n;return null!==t.match(/^\s*classDiagram/)&&"dagre-wrapper"===(null==(n=null==e?void 0:e.class)?void 0:n.defaultRenderer)||null!==t.match(/^\s*classDiagram-v2/)},Ua="classid-";let Wa=[],qa={},Ha=[],Va=0,Ga=[];const Xa=t=>jt.sanitizeText(t,gi()),Qa=function(t){let e="",n=t;if(t.indexOf("~")>0){let i=t.split("~");n=i[0],e=jt.sanitizeText(i[1],gi())}return{className:n,type:e}},Ka=function(t){let e=Qa(t);void 0===qa[e.className]&&(qa[e.className]={id:e.className,type:e.type,cssClasses:[],methods:[],members:[],annotations:[],domId:Ua+e.className+"-"+Va},Va++)},Ja=function(t){const e=Object.keys(qa);for(const n of e)if(qa[n].id===t)return qa[n].domId},ts=function(t,e){const n=Qa(t).className,i=qa[n];if("string"==typeof e){const t=e.trim();t.startsWith("<<")&&t.endsWith(">>")?i.annotations.push(Xa(t.substring(2,t.length-2))):t.indexOf(")")>0?i.methods.push(Xa(t)):t&&i.members.push(Xa(t))}},es=function(t,e){t.split(",").forEach((function(t){let n=t;t[0].match(/\d/)&&(n=Ua+n),void 0!==qa[n]&&qa[n].cssClasses.push(e)}))},ns=function(t,e,n){const i=gi();let r=t,a=Ja(r);if("loose"===i.securityLevel&&void 0!==e&&void 0!==qa[r]){let t=[];if("string"==typeof n){t=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let e=0;e<t.length;e++){let n=t[e].trim();'"'===n.charAt(0)&&'"'===n.charAt(n.length-1)&&(n=n.substr(1,n.length-2)),t[e]=n}}0===t.length&&t.push(a),Ga.push((function(){const n=document.querySelector(`[id="${a}"]`);null!==n&&n.addEventListener("click",(function(){ai.runFunc(e,...t)}),!1)}))}},is=function(t){let e=(0,o.Ys)(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=(0,o.Ys)("body").append("div").attr("class","mermaidTooltip").style("opacity",0));(0,o.Ys)(t).select("svg").selectAll("g.node").on("mouseover",(function(){const t=(0,o.Ys)(this);if(null===t.attr("title"))return;const n=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(t.attr("title")).style("left",window.scrollX+n.left+(n.right-n.left)/2+"px").style("top",window.scrollY+n.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),t.classed("hover",!0)})).on("mouseout",(function(){e.transition().duration(500).style("opacity",0);(0,o.Ys)(this).classed("hover",!1)}))};Ga.push(is);let rs="TB";const as={parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},setAccTitle:zi,getAccTitle:Ui,getAccDescription:qi,setAccDescription:Wi,getConfig:()=>gi().class,addClass:Ka,bindFunctions:function(t){Ga.forEach((function(e){e(t)}))},clear:function(){Wa=[],qa={},Ha=[],Ga=[],Ga.push(is),Yi()},getClass:function(t){return qa[t]},getClasses:function(){return qa},getNotes:function(){return Ha},addAnnotation:function(t,e){const n=Qa(t).className;qa[n].annotations.push(e)},addNote:function(t,e){const n={id:`note${Ha.length}`,class:e,text:t};Ha.push(n)},getRelations:function(){return Wa},addRelation:function(t){Bt.debug("Adding relation: "+JSON.stringify(t)),Ka(t.id1),Ka(t.id2),t.id1=Qa(t.id1).className,t.id2=Qa(t.id2).className,t.relationTitle1=jt.sanitizeText(t.relationTitle1.trim(),gi()),t.relationTitle2=jt.sanitizeText(t.relationTitle2.trim(),gi()),Wa.push(t)},getDirection:()=>rs,setDirection:t=>{rs=t},addMember:ts,addMembers:function(t,e){Array.isArray(e)&&(e.reverse(),e.forEach((e=>ts(t,e))))},cleanupLabel:function(t){return":"===t.substring(0,1)?jt.sanitizeText(t.substr(1).trim(),gi()):Xa(t.trim())},lineType:{LINE:0,DOTTED_LINE:1},relationType:{AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){ns(t,e,n),qa[t].haveCallback=!0})),es(t,"clickable")},setCssClass:es,setLink:function(t,e,n){const i=gi();t.split(",").forEach((function(t){let r=t;t[0].match(/\d/)&&(r=Ua+r),void 0!==qa[r]&&(qa[r].link=ai.formatUrl(e,i),"sandbox"===i.securityLevel?qa[r].linkTarget="_top":qa[r].linkTarget="string"==typeof n?Xa(n):"_blank")})),es(t,"clickable")},getTooltip:function(t){return qa[t].tooltip},setTooltip:function(t,e){const n=gi();t.split(",").forEach((function(t){void 0!==e&&(qa[t].tooltip=jt.sanitizeText(e,n))}))},lookUpDomId:Ja,setDiagramTitle:Hi,getDiagramTitle:Vi};let ss=0;const os=function(t){let e=t.match(/^([#+~-])?(\w+)(~\w+~|\[])?\s+(\w+) *([$*])?$/),n=t.match(/^([#+|~-])?(\w+) *\( *(.*)\) *([$*])? *(\w*[[\]|~]*\s*\w*~?)$/);return e&&!n?cs(e):n?ls(n):hs(t)},cs=function(t){let e="",n="";try{let i=t[1]?t[1].trim():"",r=t[2]?t[2].trim():"",a=t[3]?Pt(t[3].trim()):"",s=t[4]?t[4].trim():"",o=t[5]?t[5].trim():"";n=i+r+a+" "+s,e=ds(o)}catch(i){n=t}return{displayText:n,cssStyle:e}},ls=function(t){let e="",n="";try{let i=t[1]?t[1].trim():"",r=t[2]?t[2].trim():"",a=t[3]?Pt(t[3].trim()):"",s=t[4]?t[4].trim():"";n=i+r+"("+a+")"+(t[5]?" : "+Pt(t[5]).trim():""),e=ds(s)}catch(i){n=t}return{displayText:n,cssStyle:e}},hs=function(t){let e="",n="",i="",r=t.indexOf("("),a=t.indexOf(")");if(r>1&&a>r&&a<=t.length){let s="",o="",c=t.substring(0,1);c.match(/\w/)?o=t.substring(0,r).trim():(c.match(/[#+~-]/)&&(s=c),o=t.substring(1,r).trim());const l=t.substring(r+1,a);t.substring(a+1,1),n=ds(t.substring(a+1,a+2)),e=s+o+"("+Pt(l.trim())+")",a<t.length&&(i=t.substring(a+2).trim(),""!==i&&(i=" : "+Pt(i),e+=i))}else e=Pt(t);return{displayText:e,cssStyle:n}},us=function(t,e,n,i){let r=os(e);const a=t.append("tspan").attr("x",i.padding).text(r.displayText);""!==r.cssStyle&&a.attr("style",r.cssStyle),n||a.attr("dy",i.textHeight)},ds=function(t){switch(t){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}},ps=function(t,e,n,i){Bt.debug("Rendering class ",e,n);const r=e.id,a={id:r,label:e.id,width:0,height:0},s=t.append("g").attr("id",i.db.lookUpDomId(r)).attr("class","classGroup");let o;o=e.link?s.append("svg:a").attr("xlink:href",e.link).attr("target",e.linkTarget).append("text").attr("y",n.textHeight+n.padding).attr("x",0):s.append("text").attr("y",n.textHeight+n.padding).attr("x",0);let c=!0;e.annotations.forEach((function(t){const e=o.append("tspan").text("\xab"+t+"\xbb");c||e.attr("dy",n.textHeight),c=!1}));let l=e.id;void 0!==e.type&&""!==e.type&&(l+="<"+e.type+">");const h=o.append("tspan").text(l).attr("class","title");c||h.attr("dy",n.textHeight);const u=o.node().getBBox().height,d=s.append("line").attr("x1",0).attr("y1",n.padding+u+n.dividerMargin/2).attr("y2",n.padding+u+n.dividerMargin/2),p=s.append("text").attr("x",n.padding).attr("y",u+n.dividerMargin+n.textHeight).attr("fill","white").attr("class","classText");c=!0,e.members.forEach((function(t){us(p,t,c,n),c=!1}));const f=p.node().getBBox(),g=s.append("line").attr("x1",0).attr("y1",n.padding+u+n.dividerMargin+f.height).attr("y2",n.padding+u+n.dividerMargin+f.height),y=s.append("text").attr("x",n.padding).attr("y",u+2*n.dividerMargin+f.height+n.textHeight).attr("fill","white").attr("class","classText");c=!0,e.methods.forEach((function(t){us(y,t,c,n),c=!1}));const m=s.node().getBBox();var b=" ";e.cssClasses.length>0&&(b+=e.cssClasses.join(" "));const _=s.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",m.width+2*n.padding).attr("height",m.height+n.padding+.5*n.dividerMargin).attr("class",b).node().getBBox().width;return o.node().childNodes.forEach((function(t){t.setAttribute("x",(_-t.getBBox().width)/2)})),e.tooltip&&o.insert("title").text(e.tooltip),d.attr("x2",_),g.attr("x2",_),a.width=_,a.height=m.height+n.padding+.5*n.dividerMargin,a},fs=function(t,e,n,i,r){const a=function(t){switch(t){case r.db.relationType.AGGREGATION:return"aggregation";case r.db.relationType.EXTENSION:return"extension";case r.db.relationType.COMPOSITION:return"composition";case r.db.relationType.DEPENDENCY:return"dependency";case r.db.relationType.LOLLIPOP:return"lollipop"}};e.points=e.points.filter((t=>!Number.isNaN(t.y)));const s=e.points,c=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})).curve(o.$0Z),l=t.append("path").attr("d",c(s)).attr("id","edge"+ss).attr("class","relation");let h,u,d="";i.arrowMarkerAbsolute&&(d=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,d=d.replace(/\(/g,"\\("),d=d.replace(/\)/g,"\\)")),1==n.relation.lineType&&l.attr("class","relation dashed-line"),10==n.relation.lineType&&l.attr("class","relation dotted-line"),"none"!==n.relation.type1&&l.attr("marker-start","url("+d+"#"+a(n.relation.type1)+"Start)"),"none"!==n.relation.type2&&l.attr("marker-end","url("+d+"#"+a(n.relation.type2)+"End)");const p=e.points.length;let f,g,y,m,b=ai.calcLabelPosition(e.points);if(h=b.x,u=b.y,p%2!=0&&p>1){let t=ai.calcCardinalityPosition("none"!==n.relation.type1,e.points,e.points[0]),i=ai.calcCardinalityPosition("none"!==n.relation.type2,e.points,e.points[p-1]);Bt.debug("cardinality_1_point "+JSON.stringify(t)),Bt.debug("cardinality_2_point "+JSON.stringify(i)),f=t.x,g=t.y,y=i.x,m=i.y}if(void 0!==n.title){const e=t.append("g").attr("class","classLabel"),r=e.append("text").attr("class","label").attr("x",h).attr("y",u).attr("fill","red").attr("text-anchor","middle").text(n.title);window.label=r;const a=r.node().getBBox();e.insert("rect",":first-child").attr("class","box").attr("x",a.x-i.padding/2).attr("y",a.y-i.padding/2).attr("width",a.width+i.padding).attr("height",a.height+i.padding)}if(Bt.info("Rendering relation "+JSON.stringify(n)),void 0!==n.relationTitle1&&"none"!==n.relationTitle1){t.append("g").attr("class","cardinality").append("text").attr("class","type1").attr("x",f).attr("y",g).attr("fill","black").attr("font-size","6").text(n.relationTitle1)}if(void 0!==n.relationTitle2&&"none"!==n.relationTitle2){t.append("g").attr("class","cardinality").append("text").attr("class","type2").attr("x",y).attr("y",m).attr("fill","black").attr("font-size","6").text(n.relationTitle2)}ss++},gs=function(t,e,n,i){Bt.debug("Rendering note ",e,n);const r=e.id,a={id:r,text:e.text,width:0,height:0},s=t.append("g").attr("id",r).attr("class","classGroup");let o=s.append("text").attr("y",n.textHeight+n.padding).attr("x",0);const c=JSON.parse(`"${e.text}"`).split("\n");c.forEach((function(t){Bt.debug(`Adding line: ${t}`),o.append("tspan").text(t).attr("class","title").attr("dy",n.textHeight)}));const l=s.node().getBBox(),h=s.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",l.width+2*n.padding).attr("height",l.height+c.length*n.textHeight+n.padding+.5*n.dividerMargin).node().getBBox().width;return o.node().childNodes.forEach((function(t){t.setAttribute("x",(h-t.getBBox().width)/2)})),a.width=h,a.height=l.height+c.length*n.textHeight+n.padding+.5*n.dividerMargin,a};let ys={};const ms=function(t){const e=Object.entries(ys).find((e=>e[1].label===t));if(e)return e[0]},bs={draw:function(t,e,n,i){const r=gi().class;ys={},Bt.info("Rendering diagram "+t);const a=gi().securityLevel;let s;"sandbox"===a&&(s=(0,o.Ys)("#i"+e));const c="sandbox"===a?(0,o.Ys)(s.nodes()[0].contentDocument.body):(0,o.Ys)("body"),l=c.select(`[id='${e}']`);var h;(h=l).append("defs").append("marker").attr("id","extensionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),h.append("defs").append("marker").attr("id","extensionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z"),h.append("defs").append("marker").attr("id","compositionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","compositionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","aggregationStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","aggregationEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","dependencyStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),h.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z");const u=new lt.k({multigraph:!0});u.setGraph({isMultiGraph:!0}),u.setDefaultEdgeLabel((function(){return{}}));const d=i.db.getClasses(),p=Object.keys(d);for(const o of p){const t=d[o],e=ps(l,t,r,i);ys[e.id]=e,u.setNode(e.id,e),Bt.info("Org height: "+e.height)}i.db.getRelations().forEach((function(t){Bt.info("tjoho"+ms(t.id1)+ms(t.id2)+JSON.stringify(t)),u.setEdge(ms(t.id1),ms(t.id2),{relation:t},t.title||"DEFAULT")}));i.db.getNotes().forEach((function(t){Bt.debug(`Adding note: ${JSON.stringify(t)}`);const e=gs(l,t,r,i);ys[e.id]=e,u.setNode(e.id,e),t.class&&t.class in d&&u.setEdge(t.id,ms(t.class),{relation:{id1:t.id,id2:t.class,relation:{type1:"none",type2:"none",lineType:10}}},"DEFAULT")})),(0,ct.bK)(u),u.nodes().forEach((function(t){void 0!==t&&void 0!==u.node(t)&&(Bt.debug("Node "+t+": "+JSON.stringify(u.node(t))),c.select("#"+(i.db.lookUpDomId(t)||t)).attr("transform","translate("+(u.node(t).x-u.node(t).width/2)+","+(u.node(t).y-u.node(t).height/2)+" )"))})),u.edges().forEach((function(t){void 0!==t&&void 0!==u.edge(t)&&(Bt.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(u.edge(t))),fs(l,u.edge(t),u.edge(t).relation,r,i))}));const f=l.node().getBBox(),g=f.width+40,y=f.height+40;ki(l,y,g,r.useMaxWidth);const m=`${f.x-20} ${f.y-20} ${g} ${y}`;Bt.debug(`viewBox ${m}`),l.attr("viewBox",m)}},_s={extension:(t,e,n)=>{Bt.trace("Making markers for ",n),t.append("defs").append("marker").attr("id",e+"-extensionStart").attr("class","marker extension "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},composition:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-compositionStart").attr("class","marker composition "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},aggregation:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},dependency:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},lollipop:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","white").attr("cx",6).attr("cy",7).attr("r",6)},point:(t,e)=>{t.append("marker").attr("id",e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 12 20").attr("refX",10).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",0).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},circle:(t,e)=>{t.append("marker").attr("id",e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},cross:(t,e)=>{t.append("marker").attr("id",e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},barb:(t,e)=>{t.append("defs").append("marker").attr("id",e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")}},xs=(t,e,n,i)=>{e.forEach((e=>{_s[e](t,n,i)}))};const vs=(t,e,n,i)=>{let r=t||"";if("object"==typeof r&&(r=r[0]),Zt(gi().flowchart.htmlLabels)){r=r.replace(/\\n|\n/g,"<br />"),Bt.info("vertexText"+r);let t=function(t){const e=(0,o.Ys)(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),n=e.append("xhtml:div"),i=t.label,r=t.isNode?"nodeLabel":"edgeLabel";var a,s;return n.html('<span class="'+r+'" '+(t.labelStyle?'style="'+t.labelStyle+'"':"")+">"+i+"</span>"),a=n,(s=t.labelStyle)&&a.attr("style",s),n.style("display","inline-block"),n.style("white-space","nowrap"),n.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}({isNode:i,label:gp(r).replace(/fa[blrs]?:fa-[\w-]+/g,(t=>`<i class='${t.replace(":"," ")}'></i>`)),labelStyle:e.replace("fill:","color:")});return t}{const t=document.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",e.replace("color:","fill:"));let i=[];i="string"==typeof r?r.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(r)?r:[];for(const e of i){const i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),n?i.setAttribute("class","title-row"):i.setAttribute("class","row"),i.textContent=e.trim(),t.appendChild(i)}return t}},ks=(t,e,n,i)=>{let r;r=n||"node default";const a=t.insert("g").attr("class",r).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",e.labelStyle);let c;c=void 0===e.labelText?"":"string"==typeof e.labelText?e.labelText:e.labelText[0];const l=s.node().appendChild(vs(It(gp(c),gi()),e.labelStyle,!1,i));let h=l.getBBox();if(Zt(gi().flowchart.htmlLabels)){const t=l.children[0],e=(0,o.Ys)(l);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}const u=e.padding/2;return s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),{shapeSvg:a,bbox:h,halfPadding:u,label:s}},ws=(t,e)=>{const n=e.node().getBBox();t.width=n.width,t.height=n.height};function Cs(t,e,n,i){return t.insert("polygon",":first-child").attr("points",i.map((function(t){return t.x+","+t.y})).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+n/2+")")}let Ts={},Es={},Ss={};const As=(t,e)=>(Bt.trace("In isDecendant",e," ",t," = ",Es[e].includes(t)),!!Es[e].includes(t)),Ls=(t,e,n,i)=>{Bt.warn("Copying children of ",t,"root",i,"data",e.node(t),i);const r=e.children(t)||[];t!==i&&r.push(t),Bt.warn("Copying (nodes) clusterId",t,"nodes",r),r.forEach((r=>{if(e.children(r).length>0)Ls(r,e,n,i);else{const a=e.node(r);Bt.info("cp ",r," to ",i," with parent ",t),n.setNode(r,a),i!==e.parent(r)&&(Bt.warn("Setting parent",r,e.parent(r)),n.setParent(r,e.parent(r))),t!==i&&r!==t?(Bt.debug("Setting parent",r,t),n.setParent(r,t)):(Bt.info("In copy ",t,"root",i,"data",e.node(t),i),Bt.debug("Not Setting parent for node=",r,"cluster!==rootId",t!==i,"node!==clusterId",r!==t));const s=e.edges(r);Bt.debug("Copying Edges",s),s.forEach((r=>{Bt.info("Edge",r);const a=e.edge(r.v,r.w,r.name);Bt.info("Edge data",a,i);try{((t,e)=>(Bt.info("Decendants of ",e," is ",Es[e]),Bt.info("Edge is ",t),t.v!==e&&t.w!==e&&(Es[e]?Es[e].includes(t.v)||As(t.v,e)||As(t.w,e)||Es[e].includes(t.w):(Bt.debug("Tilt, ",e,",not in decendants"),!1))))(r,i)?(Bt.info("Copying as ",r.v,r.w,a,r.name),n.setEdge(r.v,r.w,a,r.name),Bt.info("newGraph edges ",n.edges(),n.edge(n.edges()[0]))):Bt.info("Skipping copy of edge ",r.v,"--\x3e",r.w," rootId: ",i," clusterId:",t)}catch(s){Bt.error(s)}}))}Bt.debug("Removing node",r),e.removeNode(r)}))},Bs=(t,e)=>{const n=e.children(t);let i=[...n];for(const r of n)Ss[r]=t,i=[...i,...Bs(r,e)];return i},Ns=(t,e)=>{Bt.trace("Searching",t);const n=e.children(t);if(Bt.trace("Searching children of id ",t,n),n.length<1)return Bt.trace("This is a valid node",t),t;for(const i of n){const n=Ns(i,e);if(n)return Bt.trace("Found replacement for",t," => ",n),n}},Ds=t=>Ts[t]&&Ts[t].externalConnections&&Ts[t]?Ts[t].id:t,Os=(t,e)=>{if(Bt.warn("extractor - ",e,ht.c(t),t.children("D")),e>10)return void Bt.error("Bailing out");let n=t.nodes(),i=!1;for(const r of n){const e=t.children(r);i=i||e.length>0}if(i){Bt.debug("Nodes = ",n,e);for(const i of n)if(Bt.debug("Extracting node",i,Ts,Ts[i]&&!Ts[i].externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),Ts[i])if(!Ts[i].externalConnections&&t.children(i)&&t.children(i).length>0){Bt.warn("Cluster without external connections, without a parent and with children",i,e);let n="TB"===t.graph().rankdir?"LR":"TB";Ts[i]&&Ts[i].clusterData&&Ts[i].clusterData.dir&&(n=Ts[i].clusterData.dir,Bt.warn("Fixing dir",Ts[i].clusterData.dir,n));const r=new lt.k({multigraph:!0,compound:!0}).setGraph({rankdir:n,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));Bt.warn("Old graph before copy",ht.c(t)),Ls(i,t,r,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:Ts[i].clusterData,labelText:Ts[i].labelText,graph:r}),Bt.warn("New graph after copy node: (",i,")",ht.c(r)),Bt.debug("Old graph after copy",ht.c(t))}else Bt.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!Ts[i].externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),Bt.debug(Ts);else Bt.debug("Not a cluster",i,e);n=t.nodes(),Bt.warn("New list of nodes",n);for(const i of n){const n=t.node(i);Bt.warn(" Now next level",i,n),n.clusterNode&&Os(n.graph,e+1)}}else Bt.debug("Done, no node has children",t.nodes())},Ms=(t,e)=>{if(0===e.length)return[];let n=Object.assign(e);return e.forEach((e=>{const i=t.children(e),r=Ms(t,i);n=[...n,...r]})),n};function Is(t,e,n,i){var r=t.x,a=t.y,s=r-i.x,o=a-i.y,c=Math.sqrt(e*e*o*o+n*n*s*s),l=Math.abs(e*n*s/c);i.x<r&&(l=-l);var h=Math.abs(e*n*o/c);return i.y<a&&(h=-h),{x:r+l,y:a+h}}function Fs(t,e,n,i){var r,a,s,o,c,l,h,u,d,p,f,g,y;if(r=e.y-t.y,s=t.x-e.x,c=e.x*t.y-t.x*e.y,d=r*n.x+s*n.y+c,p=r*i.x+s*i.y+c,!(0!==d&&0!==p&&$s(d,p)||(a=i.y-n.y,o=n.x-i.x,l=i.x*n.y-n.x*i.y,h=a*t.x+o*t.y+l,u=a*e.x+o*e.y+l,0!==h&&0!==u&&$s(h,u)||0==(f=r*o-a*s))))return g=Math.abs(f/2),{x:(y=s*l-o*c)<0?(y-g)/f:(y+g)/f,y:(y=a*c-r*l)<0?(y-g)/f:(y+g)/f}}function $s(t,e){return t*e>0}const Rs=(t,e)=>{var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=0===o?0:l*s/o,i=l):(s<0&&(c=-c),n=c,i=0===s?0:c*o/s),{x:r+n,y:a+i}},Zs={node:function(t,e){return t.intersect(e)},circle:function(t,e,n){return Is(t,e,e,n)},ellipse:Is,polygon:function(t,e,n){var i=t.x,r=t.y,a=[],s=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY;"function"==typeof e.forEach?e.forEach((function(t){s=Math.min(s,t.x),o=Math.min(o,t.y)})):(s=Math.min(s,e.x),o=Math.min(o,e.y));for(var c=i-t.width/2-s,l=r-t.height/2-o,h=0;h<e.length;h++){var u=e[h],d=e[h<e.length-1?h+1:0],p=Fs(t,n,{x:c+u.x,y:l+u.y},{x:c+d.x,y:l+d.y});p&&a.push(p)}return a.length?(a.length>1&&a.sort((function(t,e){var i=t.x-n.x,r=t.y-n.y,a=Math.sqrt(i*i+r*r),s=e.x-n.x,o=e.y-n.y,c=Math.sqrt(s*s+o*o);return a<c?-1:a===c?0:1})),a[0]):t},rect:Rs},Ps=(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=ks(t,e,"node "+e.classes,!0);Bt.info("Classes = ",e.classes);const a=n.insert("rect",":first-child");return a.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-r).attr("y",-i.height/2-r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),ws(e,a),e.intersect=function(t){return Zs.rect(e,t)},n},js=(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding+(i.height+e.padding),a=[{x:r/2,y:0},{x:r,y:-r/2},{x:r/2,y:-r},{x:0,y:-r/2}];Bt.info("Question main (Circle)");const s=Cs(n,r,r,a);return s.attr("style",e.style),ws(e,s),e.intersect=function(t){return Bt.warn("Intersect called"),Zs.polygon(e,a,t)},n};function Ys(t,e,n,i){const r=[],a=t=>{r.push(t,0)},s=t=>{r.push(0,t)};e.includes("t")?(Bt.debug("add top border"),a(n)):s(n),e.includes("r")?(Bt.debug("add right border"),a(i)):s(i),e.includes("b")?(Bt.debug("add bottom border"),a(n)):s(n),e.includes("l")?(Bt.debug("add left border"),a(i)):s(i),t.attr("stroke-dasharray",r.join(" "))}const zs=(t,e,n)=>{const i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id);let r=70,a=10;"LR"===n&&(r=10,a=70);const s=i.append("rect").attr("x",-1*r/2).attr("y",-1*a/2).attr("width",r).attr("height",a).attr("class","fork-join");return ws(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(t){return Zs.rect(e,t)},i},Us={rhombus:js,question:js,rect:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=ks(t,e,"node "+e.classes,!0);Bt.trace("Classes = ",e.classes);const a=n.insert("rect",":first-child"),s=i.width+e.padding,o=i.height+e.padding;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-r).attr("y",-i.height/2-r).attr("width",s).attr("height",o),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(Ys(a,e.props.borders,s,o),t.delete("borders")),t.forEach((t=>{Bt.warn(`Unknown node property ${t}`)}))}return ws(e,a),e.intersect=function(t){return Zs.rect(e,t)},n},labelRect:(t,e)=>{const{shapeSvg:n}=ks(t,e,"label",!0);Bt.trace("Classes = ",e.classes);const i=n.insert("rect",":first-child");if(i.attr("width",0).attr("height",0),n.attr("class","label edgeLabel"),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(Ys(i,e.props.borders,0,0),t.delete("borders")),t.forEach((t=>{Bt.warn(`Unknown node property ${t}`)}))}return ws(e,i),e.intersect=function(t){return Zs.rect(e,t)},n},rectWithTitle:(t,e)=>{let n;n=e.classes?"node "+e.classes:"node default";const i=t.insert("g").attr("class",n).attr("id",e.domId||e.id),r=i.insert("rect",":first-child"),a=i.insert("line"),s=i.insert("g").attr("class","label"),c=e.labelText.flat?e.labelText.flat():e.labelText;let l="";l="object"==typeof c?c[0]:c,Bt.info("Label text abc79",l,c,"object"==typeof c);const h=s.node().appendChild(vs(l,e.labelStyle,!0,!0));let u={width:0,height:0};if(Zt(gi().flowchart.htmlLabels)){const t=h.children[0],e=(0,o.Ys)(h);u=t.getBoundingClientRect(),e.attr("width",u.width),e.attr("height",u.height)}Bt.info("Text 2",c);const d=c.slice(1,c.length);let p=h.getBBox();const f=s.node().appendChild(vs(d.join?d.join("<br/>"):d,e.labelStyle,!0,!0));if(Zt(gi().flowchart.htmlLabels)){const t=f.children[0],e=(0,o.Ys)(f);u=t.getBoundingClientRect(),e.attr("width",u.width),e.attr("height",u.height)}const g=e.padding/2;return(0,o.Ys)(f).attr("transform","translate( "+(u.width>p.width?0:(p.width-u.width)/2)+", "+(p.height+g+5)+")"),(0,o.Ys)(h).attr("transform","translate( "+(u.width<p.width?0:-(p.width-u.width)/2)+", 0)"),u=s.node().getBBox(),s.attr("transform","translate("+-u.width/2+", "+(-u.height/2-g+3)+")"),r.attr("class","outer title-state").attr("x",-u.width/2-g).attr("y",-u.height/2-g).attr("width",u.width+e.padding).attr("height",u.height+e.padding),a.attr("class","divider").attr("x1",-u.width/2-g).attr("x2",u.width/2+g).attr("y1",-u.height/2-g+p.height+g).attr("y2",-u.height/2-g+p.height+g),ws(e,r),e.intersect=function(t){return Zs.rect(e,t)},i},choice:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=[{x:0,y:14},{x:14,y:0},{x:0,y:-14},{x:-14,y:0}];return n.insert("polygon",":first-child").attr("points",i.map((function(t){return t.x+","+t.y})).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(t){return Zs.circle(e,14,t)},n},circle:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=ks(t,e,void 0,!0),a=n.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Bt.info("Circle main"),ws(e,a),e.intersect=function(t){return Bt.info("Circle intersect",e,i.width/2+r,t),Zs.circle(e,i.width/2+r,t)},n},doublecircle:(t,e)=>{const{shapeSvg:n,bbox:i,halfPadding:r}=ks(t,e,void 0,!0),a=n.insert("g",":first-child"),s=a.insert("circle"),o=a.insert("circle");return s.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r+5).attr("width",i.width+e.padding+10).attr("height",i.height+e.padding+10),o.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",i.width/2+r).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Bt.info("DoubleCircle main"),ws(e,s),e.intersect=function(t){return Bt.info("DoubleCircle intersect",e,i.width/2+r+5,t),Zs.circle(e,i.width/2+r+5,t)},n},stadium:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.height+e.padding,a=i.width+r/4+e.padding,s=n.insert("rect",":first-child").attr("style",e.style).attr("rx",r/2).attr("ry",r/2).attr("x",-a/2).attr("y",-r/2).attr("width",a).attr("height",r);return ws(e,s),e.intersect=function(t){return Zs.rect(e,t)},n},hexagon:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.height+e.padding,a=r/4,s=i.width+2*a+e.padding,o=[{x:a,y:0},{x:s-a,y:0},{x:s,y:-r/2},{x:s-a,y:-r},{x:a,y:-r},{x:0,y:-r/2}],c=Cs(n,s,r,o);return c.attr("style",e.style),ws(e,c),e.intersect=function(t){return Zs.polygon(e,o,t)},n},rect_left_inv_arrow:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-a/2,y:0},{x:r,y:0},{x:r,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return Cs(n,r,a,s).attr("style",e.style),e.width=r+a,e.height=a,e.intersect=function(t){return Zs.polygon(e,s,t)},n},lean_right:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-2*a/6,y:0},{x:r-a/6,y:0},{x:r+2*a/6,y:-a},{x:a/6,y:-a}],o=Cs(n,r,a,s);return o.attr("style",e.style),ws(e,o),e.intersect=function(t){return Zs.polygon(e,s,t)},n},lean_left:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:2*a/6,y:0},{x:r+a/6,y:0},{x:r-2*a/6,y:-a},{x:-a/6,y:-a}],o=Cs(n,r,a,s);return o.attr("style",e.style),ws(e,o),e.intersect=function(t){return Zs.polygon(e,s,t)},n},trapezoid:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:-2*a/6,y:0},{x:r+2*a/6,y:0},{x:r-a/6,y:-a},{x:a/6,y:-a}],o=Cs(n,r,a,s);return o.attr("style",e.style),ws(e,o),e.intersect=function(t){return Zs.polygon(e,s,t)},n},inv_trapezoid:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:a/6,y:0},{x:r-a/6,y:0},{x:r+2*a/6,y:-a},{x:-2*a/6,y:-a}],o=Cs(n,r,a,s);return o.attr("style",e.style),ws(e,o),e.intersect=function(t){return Zs.polygon(e,s,t)},n},rect_right_inv_arrow:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:0,y:0},{x:r+a/2,y:0},{x:r,y:-a/2},{x:r+a/2,y:-a},{x:0,y:-a}],o=Cs(n,r,a,s);return o.attr("style",e.style),ws(e,o),e.intersect=function(t){return Zs.polygon(e,s,t)},n},cylinder:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding,a=r/2,s=a/(2.5+r/50),o=i.height+s+e.padding,c="M 0,"+s+" a "+a+","+s+" 0,0,0 "+r+" 0 a "+a+","+s+" 0,0,0 "+-r+" 0 l 0,"+o+" a "+a+","+s+" 0,0,0 "+r+" 0 l 0,"+-o,l=n.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",c).attr("transform","translate("+-r/2+","+-(o/2+s)+")");return ws(e,l),e.intersect=function(t){const n=Zs.rect(e,t),i=n.x-e.x;if(0!=a&&(Math.abs(i)<e.width/2||Math.abs(i)==e.width/2&&Math.abs(n.y-e.y)>e.height/2-s)){let r=s*s*(1-i*i/(a*a));0!=r&&(r=Math.sqrt(r)),r=s-r,t.y-e.y>0&&(r=-r),n.y+=r}return n},n},start:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=n.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),ws(e,i),e.intersect=function(t){return Zs.circle(e,7,t)},n},end:(t,e)=>{const n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=n.insert("circle",":first-child"),r=n.insert("circle",":first-child");return r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),i.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),ws(e,r),e.intersect=function(t){return Zs.circle(e,7,t)},n},note:Ps,subroutine:(t,e)=>{const{shapeSvg:n,bbox:i}=ks(t,e,void 0,!0),r=i.width+e.padding,a=i.height+e.padding,s=[{x:0,y:0},{x:r,y:0},{x:r,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:r+8,y:0},{x:r+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],o=Cs(n,r,a,s);return o.attr("style",e.style),ws(e,o),e.intersect=function(t){return Zs.polygon(e,s,t)},n},fork:zs,join:zs,class_box:(t,e)=>{const n=e.padding/2;let i;i=e.classes?"node "+e.classes:"node default";const r=t.insert("g").attr("class",i).attr("id",e.domId||e.id),a=r.insert("rect",":first-child"),s=r.insert("line"),c=r.insert("line");let l=0,h=4;const u=r.insert("g").attr("class","label");let d=0;const p=e.classData.annotations&&e.classData.annotations[0],f=e.classData.annotations[0]?"\xab"+e.classData.annotations[0]+"\xbb":"",g=u.node().appendChild(vs(f,e.labelStyle,!0,!0));let y=g.getBBox();if(Zt(gi().flowchart.htmlLabels)){const t=g.children[0],e=(0,o.Ys)(g);y=t.getBoundingClientRect(),e.attr("width",y.width),e.attr("height",y.height)}e.classData.annotations[0]&&(h+=y.height+4,l+=y.width);let m=e.classData.id;void 0!==e.classData.type&&""!==e.classData.type&&(gi().flowchart.htmlLabels?m+="<"+e.classData.type+">":m+="<"+e.classData.type+">");const b=u.node().appendChild(vs(m,e.labelStyle,!0,!0));(0,o.Ys)(b).attr("class","classTitle");let _=b.getBBox();if(Zt(gi().flowchart.htmlLabels)){const t=b.children[0],e=(0,o.Ys)(b);_=t.getBoundingClientRect(),e.attr("width",_.width),e.attr("height",_.height)}h+=_.height+4,_.width>l&&(l=_.width);const x=[];e.classData.members.forEach((t=>{const n=os(t);let i=n.displayText;gi().flowchart.htmlLabels&&(i=i.replace(/</g,"<").replace(/>/g,">"));const r=u.node().appendChild(vs(i,n.cssStyle?n.cssStyle:e.labelStyle,!0,!0));let a=r.getBBox();if(Zt(gi().flowchart.htmlLabels)){const t=r.children[0],e=(0,o.Ys)(r);a=t.getBoundingClientRect(),e.attr("width",a.width),e.attr("height",a.height)}a.width>l&&(l=a.width),h+=a.height+4,x.push(r)})),h+=8;const v=[];if(e.classData.methods.forEach((t=>{const n=os(t);let i=n.displayText;gi().flowchart.htmlLabels&&(i=i.replace(/</g,"<").replace(/>/g,">"));const r=u.node().appendChild(vs(i,n.cssStyle?n.cssStyle:e.labelStyle,!0,!0));let a=r.getBBox();if(Zt(gi().flowchart.htmlLabels)){const t=r.children[0],e=(0,o.Ys)(r);a=t.getBoundingClientRect(),e.attr("width",a.width),e.attr("height",a.height)}a.width>l&&(l=a.width),h+=a.height+4,v.push(r)})),h+=8,p){let t=(l-y.width)/2;(0,o.Ys)(g).attr("transform","translate( "+(-1*l/2+t)+", "+-1*h/2+")"),d=y.height+4}let k=(l-_.width)/2;return(0,o.Ys)(b).attr("transform","translate( "+(-1*l/2+k)+", "+(-1*h/2+d)+")"),d+=_.height+4,s.attr("class","divider").attr("x1",-l/2-n).attr("x2",l/2+n).attr("y1",-h/2-n+8+d).attr("y2",-h/2-n+8+d),d+=8,x.forEach((t=>{(0,o.Ys)(t).attr("transform","translate( "+-l/2+", "+(-1*h/2+d+4)+")"),d+=_.height+4})),d+=8,c.attr("class","divider").attr("x1",-l/2-n).attr("x2",l/2+n).attr("y1",-h/2-n+8+d).attr("y2",-h/2-n+8+d),d+=8,v.forEach((t=>{(0,o.Ys)(t).attr("transform","translate( "+-l/2+", "+(-1*h/2+d)+")"),d+=_.height+4})),a.attr("class","outer title-state").attr("x",-l/2-n).attr("y",-h/2-n).attr("width",l+e.padding).attr("height",h+e.padding),ws(e,a),e.intersect=function(t){return Zs.rect(e,t)},r}};let Ws={};const qs=(t,e,n)=>{let i,r;if(e.link){let a;"sandbox"===gi().securityLevel?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),i=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),r=Us[e.shape](i,e,n)}else r=Us[e.shape](t,e,n),i=r;return e.tooltip&&r.attr("title",e.tooltip),e.class&&r.attr("class","node default "+e.class),Ws[e.id]=i,e.haveCallback&&Ws[e.id].attr("class",Ws[e.id].attr("class")+" clickable"),i},Hs=t=>{const e=Ws[t.id];Bt.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");const n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-8)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},Vs={rect:(t,e)=>{Bt.trace("Creating subgraph rect for ",e.id,e);const n=t.insert("g").attr("class","cluster"+(e.class?" "+e.class:"")).attr("id",e.id),i=n.insert("rect",":first-child"),r=n.insert("g").attr("class","cluster-label"),a=r.node().appendChild(vs(e.labelText,e.labelStyle,void 0,!0));let s=a.getBBox();if(Zt(gi().flowchart.htmlLabels)){const t=a.children[0],e=(0,o.Ys)(a);s=t.getBoundingClientRect(),e.attr("width",s.width),e.attr("height",s.height)}const c=0*e.padding,l=c/2,h=e.width<=s.width+c?s.width+c:e.width;e.width<=s.width+c?e.diff=(s.width-e.width)/2-e.padding/2:e.diff=-e.padding/2,Bt.trace("Data ",e,JSON.stringify(e)),i.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-h/2).attr("y",e.y-e.height/2-l).attr("width",h).attr("height",e.height+c),r.attr("transform","translate("+(e.x-s.width/2)+", "+(e.y-e.height/2)+")");const u=i.node().getBBox();return e.width=u.width,e.height=u.height,e.intersect=function(t){return Rs(e,t)},n},roundedWithTitle:(t,e)=>{const n=t.insert("g").attr("class",e.classes).attr("id",e.id),i=n.insert("rect",":first-child"),r=n.insert("g").attr("class","cluster-label"),a=n.append("rect"),s=r.node().appendChild(vs(e.labelText,e.labelStyle,void 0,!0));let c=s.getBBox();if(Zt(gi().flowchart.htmlLabels)){const t=s.children[0],e=(0,o.Ys)(s);c=t.getBoundingClientRect(),e.attr("width",c.width),e.attr("height",c.height)}c=s.getBBox();const l=0*e.padding,h=l/2,u=e.width<=c.width+e.padding?c.width+e.padding:e.width;e.width<=c.width+e.padding?e.diff=(c.width+0*e.padding-e.width)/2:e.diff=-e.padding/2,i.attr("class","outer").attr("x",e.x-u/2-h).attr("y",e.y-e.height/2-h).attr("width",u+l).attr("height",e.height+l),a.attr("class","inner").attr("x",e.x-u/2-h).attr("y",e.y-e.height/2-h+c.height-1).attr("width",u+l).attr("height",e.height+l-c.height-3),r.attr("transform","translate("+(e.x-c.width/2)+", "+(e.y-e.height/2-e.padding/3+(Zt(gi().flowchart.htmlLabels)?5:3))+")");const d=i.node().getBBox();return e.height=d.height,e.intersect=function(t){return Rs(e,t)},n},noteGroup:(t,e)=>{const n=t.insert("g").attr("class","note-cluster").attr("id",e.id),i=n.insert("rect",":first-child"),r=0*e.padding,a=r/2;i.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+r).attr("height",e.height+r).attr("fill","none");const s=i.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(t){return Rs(e,t)},n},divider:(t,e)=>{const n=t.insert("g").attr("class",e.classes).attr("id",e.id),i=n.insert("rect",":first-child"),r=0*e.padding,a=r/2;i.attr("class","divider").attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2).attr("width",e.width+r).attr("height",e.height+r);const s=i.node().getBBox();return e.width=s.width,e.height=s.height,e.diff=-e.padding/2,e.intersect=function(t){return Rs(e,t)},n}};let Gs={};let Xs={},Qs={};const Ks=(t,e)=>{const n=vs(e.label,e.labelStyle),i=t.insert("g").attr("class","edgeLabel"),r=i.insert("g").attr("class","label");r.node().appendChild(n);let a,s=n.getBBox();if(Zt(gi().flowchart.htmlLabels)){const t=n.children[0],e=(0,o.Ys)(n);s=t.getBoundingClientRect(),e.attr("width",s.width),e.attr("height",s.height)}if(r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),Xs[e.id]=i,e.width=s.width,e.height=s.height,e.startLabelLeft){const n=vs(e.startLabelLeft,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),Qs[e.id]||(Qs[e.id]={}),Qs[e.id].startLeft=i,Js(a,e.startLabelLeft)}if(e.startLabelRight){const n=vs(e.startLabelRight,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=i.node().appendChild(n),r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),Qs[e.id]||(Qs[e.id]={}),Qs[e.id].startRight=i,Js(a,e.startLabelRight)}if(e.endLabelLeft){const n=vs(e.endLabelLeft,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.node().appendChild(n),Qs[e.id]||(Qs[e.id]={}),Qs[e.id].endLeft=i,Js(a,e.endLabelLeft)}if(e.endLabelRight){const n=vs(e.endLabelRight,e.labelStyle),i=t.insert("g").attr("class","edgeTerminals"),r=i.insert("g").attr("class","inner");a=r.node().appendChild(n);const s=n.getBBox();r.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.node().appendChild(n),Qs[e.id]||(Qs[e.id]={}),Qs[e.id].endRight=i,Js(a,e.endLabelRight)}return n};function Js(t,e){gi().flowchart.htmlLabels&&t&&(t.style.width=9*e.length+"px",t.style.height="12px")}const to=(t,e)=>{Bt.warn("abc88 cutPathAtIntersect",t,e);let n=[],i=t[0],r=!1;return t.forEach((t=>{if(Bt.info("abc88 checking point",t,e),((t,e)=>{const n=t.x,i=t.y,r=Math.abs(e.x-n),a=Math.abs(e.y-i),s=t.width/2,o=t.height/2;return r>=s||a>=o})(e,t)||r)Bt.warn("abc88 outside",t,i),i=t,r||n.push(t);else{const a=((t,e,n)=>{Bt.warn(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(e)}\n insidePoint : ${JSON.stringify(n)}\n node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);const i=t.x,r=t.y,a=Math.abs(i-n.x),s=t.width/2;let o=n.x<e.x?s-a:s+a;const c=t.height/2,l=Math.abs(e.y-n.y),h=Math.abs(e.x-n.x);if(Math.abs(r-e.y)*s>Math.abs(i-e.x)*c){let t=n.y<e.y?e.y-c-r:r-c-e.y;o=h*t/l;const i={x:n.x<e.x?n.x+o:n.x-h+o,y:n.y<e.y?n.y+l-t:n.y-l+t};return 0===o&&(i.x=e.x,i.y=e.y),0===h&&(i.x=e.x),0===l&&(i.y=e.y),Bt.warn(`abc89 topp/bott calc, Q ${l}, q ${t}, R ${h}, r ${o}`,i),i}{o=n.x<e.x?e.x-s-i:i-s-e.x;let t=l*o/h,r=n.x<e.x?n.x+h-o:n.x-h+o,a=n.y<e.y?n.y+t:n.y-t;return Bt.warn(`sides calc abc89, Q ${l}, q ${t}, R ${h}, r ${o}`,{_x:r,_y:a}),0===o&&(r=e.x,a=e.y),0===h&&(r=e.x),0===l&&(a=e.y),{x:r,y:a}}})(e,i,t);Bt.warn("abc88 inside",t,i,a),Bt.warn("abc88 intersection",a);let s=!1;n.forEach((t=>{s=s||t.x===a.x&&t.y===a.y})),n.some((t=>t.x===a.x&&t.y===a.y))?Bt.warn("abc88 no intersect",a,n):n.push(a),r=!0}})),Bt.warn("abc88 returning points",n),n},eo=(t,e,n,i)=>{Bt.info("Graph in recursive render: XXX",ht.c(e),i);const r=e.graph().rankdir;Bt.trace("Dir in recursive render - dir:",r);const a=t.insert("g").attr("class","root");e.nodes()?Bt.info("Recursive render XXX",e.nodes()):Bt.info("No nodes found for",e),e.edges().length>0&&Bt.trace("Recursive edges",e.edge(e.edges()[0]));const s=a.insert("g").attr("class","clusters"),c=a.insert("g").attr("class","edgePaths"),l=a.insert("g").attr("class","edgeLabels"),h=a.insert("g").attr("class","nodes");e.nodes().forEach((function(t){const a=e.node(t);if(void 0!==i){const n=JSON.parse(JSON.stringify(i.clusterData));Bt.info("Setting data for cluster XXX (",t,") ",n,i),e.setNode(i.id,n),e.parent(t)||(Bt.trace("Setting parent",t,i.id),e.setParent(t,i.id,n))}if(Bt.info("(Insert) Node XXX"+t+": "+JSON.stringify(e.node(t))),a&&a.clusterNode){Bt.info("Cluster identified",t,a.width,e.node(t));const i=eo(h,a.graph,n,e.node(t)),r=i.elem;ws(a,r),a.diff=i.diff||0,Bt.info("Node bounds (abc123)",t,a,a.width,a.x,a.y),((t,e)=>{Ws[e.id]=t})(r,a),Bt.warn("Recursive render complete ",r,a)}else e.children(t).length>0?(Bt.info("Cluster - the non recursive path XXX",t,a.id,a,e),Bt.info(Ns(a.id,e)),Ts[a.id]={id:Ns(a.id,e),node:a}):(Bt.info("Node - the non recursive path",t,a.id,a),qs(h,e.node(t),r))})),e.edges().forEach((function(t){const n=e.edge(t.v,t.w,t.name);Bt.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t)),Bt.info("Edge "+t.v+" -> "+t.w+": ",t," ",JSON.stringify(e.edge(t))),Bt.info("Fix",Ts,"ids:",t.v,t.w,"Translateing: ",Ts[t.v],Ts[t.w]),Ks(l,n)})),e.edges().forEach((function(t){Bt.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(t))})),Bt.info("#############################################"),Bt.info("### Layout ###"),Bt.info("#############################################"),Bt.info(e),(0,ct.bK)(e),Bt.info("Graph after layout:",ht.c(e));let u=0;return(t=>Ms(t,t.children()))(e).forEach((function(t){const n=e.node(t);Bt.info("Position "+t+": "+JSON.stringify(e.node(t))),Bt.info("Position "+t+": ("+n.x,","+n.y,") width: ",n.width," height: ",n.height),n&&n.clusterNode?Hs(n):e.children(t).length>0?(((t,e)=>{Bt.trace("Inserting cluster");const n=e.shape||"rect";Gs[e.id]=Vs[n](t,e)})(s,n),Ts[n.id].node=n):Hs(n)})),e.edges().forEach((function(t){const i=e.edge(t);Bt.info("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(i),i);const r=function(t,e,n,i,r,a){let s=n.points,c=!1;const l=a.node(e.v);var h=a.node(e.w);Bt.info("abc88 InsertEdge: ",n),h.intersect&&l.intersect&&(s=s.slice(1,n.points.length-1),s.unshift(l.intersect(s[0])),Bt.info("Last point",s[s.length-1],h,h.intersect(s[s.length-1])),s.push(h.intersect(s[s.length-1]))),n.toCluster&&(Bt.info("to cluster abc88",i[n.toCluster]),s=to(n.points,i[n.toCluster].node),c=!0),n.fromCluster&&(Bt.info("from cluster abc88",i[n.fromCluster]),s=to(s.reverse(),i[n.fromCluster].node).reverse(),c=!0);const u=s.filter((t=>!Number.isNaN(t.y)));let d;d=("graph"===r||"flowchart"===r)&&n.curve||o.$0Z;const p=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})).curve(d);let f;switch(n.thickness){case"normal":f="edge-thickness-normal";break;case"thick":f="edge-thickness-thick";break;default:f=""}switch(n.pattern){case"solid":f+=" edge-pattern-solid";break;case"dotted":f+=" edge-pattern-dotted";break;case"dashed":f+=" edge-pattern-dashed"}const g=t.append("path").attr("d",p(u)).attr("id",n.id).attr("class"," "+f+(n.classes?" "+n.classes:"")).attr("style",n.style);let y="";switch((gi().flowchart.arrowMarkerAbsolute||gi().state.arrowMarkerAbsolute)&&(y=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,y=y.replace(/\(/g,"\\("),y=y.replace(/\)/g,"\\)")),Bt.info("arrowTypeStart",n.arrowTypeStart),Bt.info("arrowTypeEnd",n.arrowTypeEnd),n.arrowTypeStart){case"arrow_cross":g.attr("marker-start","url("+y+"#"+r+"-crossStart)");break;case"arrow_point":g.attr("marker-start","url("+y+"#"+r+"-pointStart)");break;case"arrow_barb":g.attr("marker-start","url("+y+"#"+r+"-barbStart)");break;case"arrow_circle":g.attr("marker-start","url("+y+"#"+r+"-circleStart)");break;case"aggregation":g.attr("marker-start","url("+y+"#"+r+"-aggregationStart)");break;case"extension":g.attr("marker-start","url("+y+"#"+r+"-extensionStart)");break;case"composition":g.attr("marker-start","url("+y+"#"+r+"-compositionStart)");break;case"dependency":g.attr("marker-start","url("+y+"#"+r+"-dependencyStart)");break;case"lollipop":g.attr("marker-start","url("+y+"#"+r+"-lollipopStart)")}switch(n.arrowTypeEnd){case"arrow_cross":g.attr("marker-end","url("+y+"#"+r+"-crossEnd)");break;case"arrow_point":g.attr("marker-end","url("+y+"#"+r+"-pointEnd)");break;case"arrow_barb":g.attr("marker-end","url("+y+"#"+r+"-barbEnd)");break;case"arrow_circle":g.attr("marker-end","url("+y+"#"+r+"-circleEnd)");break;case"aggregation":g.attr("marker-end","url("+y+"#"+r+"-aggregationEnd)");break;case"extension":g.attr("marker-end","url("+y+"#"+r+"-extensionEnd)");break;case"composition":g.attr("marker-end","url("+y+"#"+r+"-compositionEnd)");break;case"dependency":g.attr("marker-end","url("+y+"#"+r+"-dependencyEnd)");break;case"lollipop":g.attr("marker-end","url("+y+"#"+r+"-lollipopEnd)")}let m={};return c&&(m.updatedPath=s),m.originalPath=n.points,m}(c,t,i,Ts,n,e);((t,e)=>{Bt.info("Moving label abc78 ",t.id,t.label,Xs[t.id]);let n=e.updatedPath?e.updatedPath:e.originalPath;if(t.label){const i=Xs[t.id];let r=t.x,a=t.y;if(n){const i=ai.calcLabelPosition(n);Bt.info("Moving label "+t.label+" from (",r,",",a,") to (",i.x,",",i.y,") abc78"),e.updatedPath&&(r=i.x,a=i.y)}i.attr("transform","translate("+r+", "+a+")")}if(t.startLabelLeft){const e=Qs[t.id].startLeft;let i=t.x,r=t.y;if(n){const e=ai.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.startLabelRight){const e=Qs[t.id].startRight;let i=t.x,r=t.y;if(n){const e=ai.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.endLabelLeft){const e=Qs[t.id].endLeft;let i=t.x,r=t.y;if(n){const e=ai.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}if(t.endLabelRight){const e=Qs[t.id].endRight;let i=t.x,r=t.y;if(n){const e=ai.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",n);i=e.x,r=e.y}e.attr("transform","translate("+i+", "+r+")")}})(i,r)})),e.nodes().forEach((function(t){const n=e.node(t);Bt.info(t,n.type,n.diff),"group"===n.type&&(u=n.diff)})),{elem:a,diff:u}},no=(t,e,n,i,r)=>{xs(t,n,i,r),Ws={},Xs={},Qs={},Gs={},Es={},Ss={},Ts={},Bt.warn("Graph at first:",ht.c(e)),((t,e)=>{!t||e>10?Bt.debug("Opting out, no graph "):(Bt.debug("Opting in, graph "),t.nodes().forEach((function(e){t.children(e).length>0&&(Bt.warn("Cluster identified",e," Replacement id in edges: ",Ns(e,t)),Es[e]=Bs(e,t),Ts[e]={id:Ns(e,t),clusterData:t.node(e)})})),t.nodes().forEach((function(e){const n=t.children(e),i=t.edges();n.length>0?(Bt.debug("Cluster identified",e,Es),i.forEach((t=>{t.v!==e&&t.w!==e&&As(t.v,e)^As(t.w,e)&&(Bt.warn("Edge: ",t," leaves cluster ",e),Bt.warn("Decendants of XXX ",e,": ",Es[e]),Ts[e].externalConnections=!0)}))):Bt.debug("Not a cluster ",e,Es)})),t.edges().forEach((function(e){const n=t.edge(e);Bt.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(e)),Bt.warn("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(t.edge(e)));let i=e.v,r=e.w;if(Bt.warn("Fix XXX",Ts,"ids:",e.v,e.w,"Translating: ",Ts[e.v]," --- ",Ts[e.w]),Ts[e.v]&&Ts[e.w]&&Ts[e.v]===Ts[e.w]){Bt.warn("Fixing and trixing link to self - removing XXX",e.v,e.w,e.name),Bt.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),i=Ds(e.v),r=Ds(e.w),t.removeEdge(e.v,e.w,e.name);const a=e.w+"---"+e.v;t.setNode(a,{domId:a,id:a,labelStyle:"",labelText:n.label,padding:0,shape:"labelRect",style:""});const s=JSON.parse(JSON.stringify(n)),o=JSON.parse(JSON.stringify(n));s.label="",s.arrowTypeEnd="none",o.label="",s.fromCluster=e.v,o.toCluster=e.v,t.setEdge(i,a,s,e.name+"-cyclic-special"),t.setEdge(a,r,o,e.name+"-cyclic-special")}else(Ts[e.v]||Ts[e.w])&&(Bt.warn("Fixing and trixing - removing XXX",e.v,e.w,e.name),i=Ds(e.v),r=Ds(e.w),t.removeEdge(e.v,e.w,e.name),i!==e.v&&(n.fromCluster=e.v),r!==e.w&&(n.toCluster=e.w),Bt.warn("Fix Replacing with XXX",i,r,e.name),t.setEdge(i,r,n,e.name))})),Bt.warn("Adjusted Graph",ht.c(t)),Os(t,0),Bt.trace(Ts))})(e),Bt.warn("Graph after:",ht.c(e)),eo(t,e,i)},io=t=>jt.sanitizeText(t,gi());let ro={dividerMargin:10,padding:5,textHeight:10};function ao(t){let e;switch(t){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}const so={setConf:function(t){Object.keys(t).forEach((function(e){ro[e]=t[e]}))},draw:function(t,e,n,i){Bt.info("Drawing class - ",e);const r=gi().flowchart,a=gi().securityLevel;Bt.info("config:",r);const s=r.nodeSpacing||50,c=r.rankSpacing||50,l=new lt.k({multigraph:!0,compound:!0}).setGraph({rankdir:i.db.getDirection(),nodesep:s,ranksep:c,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}})),h=i.db.getClasses(),u=i.db.getRelations(),d=i.db.getNotes();let p;Bt.info(u),function(t,e,n,i){const r=Object.keys(t);Bt.info("keys:",r),Bt.info(t),r.forEach((function(n){const r=t[n];let a="";r.cssClasses.length>0&&(a=a+" "+r.cssClasses.join(" "));const s={labelStyle:""};let o=void 0!==r.text?r.text:r.id,c="";r.type,c="class_box",e.setNode(r.id,{labelStyle:s.labelStyle,shape:c,labelText:io(o),classData:r,rx:0,ry:0,class:a,style:s.style,id:r.id,domId:r.domId,tooltip:i.db.getTooltip(r.id)||"",haveCallback:r.haveCallback,link:r.link,width:"group"===r.type?500:void 0,type:r.type,padding:gi().flowchart.padding}),Bt.info("setNode",{labelStyle:s.labelStyle,shape:c,labelText:o,rx:0,ry:0,class:a,style:s.style,id:r.id,width:"group"===r.type?500:void 0,type:r.type,padding:gi().flowchart.padding})}))}(h,l,0,i),function(t,e){const n=gi().flowchart;let i=0;t.forEach((function(r){i++;const a={classes:"relation"};a.pattern=1==r.relation.lineType?"dashed":"solid",a.id="id"+i,"arrow_open"===r.type?a.arrowhead="none":a.arrowhead="normal",Bt.info(a,r),a.startLabelRight="none"===r.relationTitle1?"":r.relationTitle1,a.endLabelLeft="none"===r.relationTitle2?"":r.relationTitle2,a.arrowTypeStart=ao(r.relation.type1),a.arrowTypeEnd=ao(r.relation.type2);let s="",c="";if(void 0!==r.style){const t=Un(r.style);s=t.style,c=t.labelStyle}else s="fill:none";a.style=s,a.labelStyle=c,void 0!==r.interpolate?a.curve=Yn(r.interpolate,o.c_6):void 0!==t.defaultInterpolate?a.curve=Yn(t.defaultInterpolate,o.c_6):a.curve=Yn(n.curve,o.c_6),r.text=r.title,void 0===r.text?void 0!==r.style&&(a.arrowheadStyle="fill: #333"):(a.arrowheadStyle="fill: #333",a.labelpos="c",gi().flowchart.htmlLabels?(a.labelType="html",a.label='<span class="edgeLabel">'+r.text+"</span>"):(a.labelType="text",a.label=r.text.replace(jt.lineBreakRegex,"\n"),void 0===r.style&&(a.style=a.style||"stroke: #333; stroke-width: 1.5px;fill:none"),a.labelStyle=a.labelStyle.replace("color:","fill:"))),e.setEdge(r.id1,r.id2,a,i)}))}(u,l),function(t,e,n,i){Bt.info(t),t.forEach((function(t,r){const a=t,s="",c="";let l=a.text,h="note";if(e.setNode(a.id,{labelStyle:s,shape:h,labelText:io(l),noteData:a,rx:0,ry:0,class:"",style:c,id:a.id,domId:a.id,tooltip:"",type:"note",padding:gi().flowchart.padding}),Bt.info("setNode",{labelStyle:s,shape:h,labelText:l,rx:0,ry:0,style:c,id:a.id,type:"note",padding:gi().flowchart.padding}),!a.class||!(a.class in i))return;const u=n+r,d={classes:"relation",pattern:"dotted"};d.id=`edgeNote${u}`,d.arrowhead="none",Bt.info(`Note edge: ${JSON.stringify(d)}, ${JSON.stringify(a)}`),d.startLabelRight="",d.endLabelLeft="",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.style="fill:none",d.labelStyle="",d.curve=Yn(ro.curve,o.c_6),e.setEdge(a.id,a.class,d,u)}))}(d,l,u.length+1,h),"sandbox"===a&&(p=(0,o.Ys)("#i"+e));const f="sandbox"===a?(0,o.Ys)(p.nodes()[0].contentDocument.body):(0,o.Ys)("body"),g=f.select(`[id="${e}"]`),y=f.select("#"+e+" g");if(no(y,l,["aggregation","extension","composition","dependency","lollipop"],"classDiagram",e),ai.insertTitle(g,"classTitleText",r.titleTopMargin,i.db.getDiagramTitle()),wi(l,g,r.diagramPadding,r.useMaxWidth),!r.htmlLabels){const t="sandbox"===a?p.nodes()[0].contentDocument:document,n=t.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const e of n){const n=e.getBBox(),i=t.createElementNS("http://www.w3.org/2000/svg","rect");i.setAttribute("rx",0),i.setAttribute("ry",0),i.setAttribute("width",n.width),i.setAttribute("height",n.height),e.insertBefore(i,e.firstChild)}}}};var oo=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,5],r=[6,9,11,23,25,27,29,30,31,51],a=[1,17],s=[1,18],o=[1,19],c=[1,20],l=[1,21],h=[1,22],u=[1,25],d=[1,30],p=[1,31],f=[1,32],g=[1,33],y=[6,9,11,15,20,23,25,27,29,30,31,44,45,46,47,51],m=[1,45],b=[30,31,48,49],_=[4,6,9,11,23,25,27,29,30,31,51],x=[44,45,46,47],v=[22,37],k=[1,65],w=[1,64],C=[22,37,39,41],T={trace:function(){},yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,entityName:17,relSpec:18,role:19,BLOCK_START:20,attributes:21,BLOCK_STOP:22,title:23,title_value:24,acc_title:25,acc_title_value:26,acc_descr:27,acc_descr_value:28,acc_descr_multiline_value:29,ALPHANUM:30,ENTITY_NAME:31,attribute:32,attributeType:33,attributeName:34,attributeKeyTypeList:35,attributeComment:36,ATTRIBUTE_WORD:37,attributeKeyType:38,COMMA:39,ATTRIBUTE_KEY:40,COMMENT:41,cardinality:42,relType:43,ZERO_OR_ONE:44,ZERO_OR_MORE:45,ONE_OR_MORE:46,ONLY_ONE:47,NON_IDENTIFYING:48,IDENTIFYING:49,WORD:50,open_directive:51,type_directive:52,arg_directive:53,close_directive:54,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",20:"BLOCK_START",22:"BLOCK_STOP",23:"title",24:"title_value",25:"acc_title",26:"acc_title_value",27:"acc_descr",28:"acc_descr_value",29:"acc_descr_multiline_value",30:"ALPHANUM",31:"ENTITY_NAME",37:"ATTRIBUTE_WORD",39:"COMMA",40:"ATTRIBUTE_KEY",41:"COMMENT",44:"ZERO_OR_ONE",45:"ZERO_OR_MORE",46:"ONE_OR_MORE",47:"ONLY_ONE",48:"NON_IDENTIFYING",49:"IDENTIFYING",50:"WORD",51:"open_directive",52:"type_directive",53:"arg_directive",54:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,5],[10,4],[10,3],[10,1],[10,2],[10,2],[10,2],[10,1],[17,1],[17,1],[21,1],[21,2],[32,2],[32,3],[32,3],[32,4],[33,1],[34,1],[35,1],[35,3],[38,1],[36,1],[18,3],[42,1],[42,1],[42,1],[42,1],[43,1],[43,1],[19,1],[19,1],[19,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 1:break;case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:case 20:case 43:case 28:case 29:case 32:this.$=a[o];break;case 12:i.addEntity(a[o-4]),i.addEntity(a[o-2]),i.addRelationship(a[o-4],a[o],a[o-2],a[o-3]);break;case 13:i.addEntity(a[o-3]),i.addAttributes(a[o-3],a[o-1]);break;case 14:i.addEntity(a[o-2]);break;case 15:i.addEntity(a[o]);break;case 16:case 17:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 18:case 19:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 21:case 41:case 42:case 33:this.$=a[o].replace(/"/g,"");break;case 22:case 30:this.$=[a[o]];break;case 23:a[o].push(a[o-1]),this.$=a[o];break;case 24:this.$={attributeType:a[o-1],attributeName:a[o]};break;case 25:this.$={attributeType:a[o-2],attributeName:a[o-1],attributeKeyTypeList:a[o]};break;case 26:this.$={attributeType:a[o-2],attributeName:a[o-1],attributeComment:a[o]};break;case 27:this.$={attributeType:a[o-3],attributeName:a[o-2],attributeKeyTypeList:a[o-1],attributeComment:a[o]};break;case 31:a[o-2].push(a[o]),this.$=a[o-2];break;case 34:this.$={cardA:a[o],relType:a[o-1],cardB:a[o-2]};break;case 35:this.$=i.Cardinality.ZERO_OR_ONE;break;case 36:this.$=i.Cardinality.ZERO_OR_MORE;break;case 37:this.$=i.Cardinality.ONE_OR_MORE;break;case 38:this.$=i.Cardinality.ONLY_ONE;break;case 39:this.$=i.Identification.NON_IDENTIFYING;break;case 40:this.$=i.Identification.IDENTIFYING;break;case 44:i.parseDirective("%%{","open_directive");break;case 45:i.parseDirective(a[o],"type_directive");break;case 46:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 47:i.parseDirective("}%%","close_directive","er")}},table:[{3:1,4:n,7:3,12:4,51:i},{1:[3]},e(r,[2,3],{5:6}),{3:7,4:n,7:3,12:4,51:i},{13:8,52:[1,9]},{52:[2,44]},{6:[1,10],7:15,8:11,9:[1,12],10:13,11:[1,14],12:4,17:16,23:a,25:s,27:o,29:c,30:l,31:h,51:i},{1:[2,2]},{14:23,15:[1,24],54:u},e([15,54],[2,45]),e(r,[2,8],{1:[2,1]}),e(r,[2,4]),{7:15,10:26,12:4,17:16,23:a,25:s,27:o,29:c,30:l,31:h,51:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,11]),e(r,[2,15],{18:27,42:29,20:[1,28],44:d,45:p,46:f,47:g}),{24:[1,34]},{26:[1,35]},{28:[1,36]},e(r,[2,19]),e(y,[2,20]),e(y,[2,21]),{11:[1,37]},{16:38,53:[1,39]},{11:[2,47]},e(r,[2,5]),{17:40,30:l,31:h},{21:41,22:[1,42],32:43,33:44,37:m},{43:46,48:[1,47],49:[1,48]},e(b,[2,35]),e(b,[2,36]),e(b,[2,37]),e(b,[2,38]),e(r,[2,16]),e(r,[2,17]),e(r,[2,18]),e(_,[2,9]),{14:49,54:u},{54:[2,46]},{15:[1,50]},{22:[1,51]},e(r,[2,14]),{21:52,22:[2,22],32:43,33:44,37:m},{34:53,37:[1,54]},{37:[2,28]},{42:55,44:d,45:p,46:f,47:g},e(x,[2,39]),e(x,[2,40]),{11:[1,56]},{19:57,30:[1,60],31:[1,59],50:[1,58]},e(r,[2,13]),{22:[2,23]},e(v,[2,24],{35:61,36:62,38:63,40:k,41:w}),e([22,37,40,41],[2,29]),e([30,31],[2,34]),e(_,[2,10]),e(r,[2,12]),e(r,[2,41]),e(r,[2,42]),e(r,[2,43]),e(v,[2,25],{36:66,39:[1,67],41:w}),e(v,[2,26]),e(C,[2,30]),e(v,[2,33]),e(C,[2,32]),e(v,[2,27]),{38:68,40:k},e(C,[2,31])],defaultActions:{5:[2,44],7:[2,2],25:[2,47],39:[2,46],45:[2,28],52:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},E=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("acc_title"),25;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),27;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.begin("open_directive"),51;case 8:return this.begin("type_directive"),52;case 9:return this.popState(),this.begin("arg_directive"),15;case 10:return this.popState(),this.popState(),54;case 11:return 53;case 12:case 13:case 15:case 22:case 27:break;case 14:return 11;case 16:return 9;case 17:return 31;case 18:return 50;case 19:return 4;case 20:return this.begin("block"),20;case 21:return 39;case 23:return 40;case 24:case 25:return 37;case 26:return 41;case 28:return this.popState(),22;case 29:case 58:return e.yytext[0];case 30:case 34:case 35:case 48:return 44;case 31:case 32:case 33:case 41:case 43:case 50:return 46;case 36:case 37:case 38:case 39:case 40:case 42:case 49:return 45;case 44:case 45:case 46:case 47:return 47;case 51:case 54:case 55:case 56:return 48;case 52:case 53:return 49;case 57:return 30;case 59:return 6}},rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:,)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:(.*?)[~](.*?)*[~])/i,/^(?:[A-Za-z_][A-Za-z0-9\-_\[\]\(\)]*)/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},open_directive:{rules:[8],inclusive:!1},type_directive:{rules:[9,10],inclusive:!1},arg_directive:{rules:[10,11],inclusive:!1},block:{rules:[21,22,23,24,25,26,27,28,29],inclusive:!1},INITIAL:{rules:[0,2,4,7,12,13,14,15,16,17,18,19,20,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59],inclusive:!0}}},t);function S(){this.yy={}}return T.lexer=E,S.prototype=T,T.Parser=S,new S}();oo.parser=oo;const co=oo,lo=t=>null!==t.match(/^\s*erDiagram/);let ho={},uo=[];const po=function(t){return void 0===ho[t]&&(ho[t]={attributes:[]},Bt.info("Added new entity :",t)),ho[t]},fo={Cardinality:{ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE"},Identification:{NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().er,addEntity:po,addAttributes:function(t,e){let n,i=po(t);for(n=e.length-1;n>=0;n--)i.attributes.push(e[n]),Bt.debug("Added attribute ",e[n].attributeName)},getEntities:()=>ho,addRelationship:function(t,e,n,i){let r={entityA:t,roleA:e,entityB:n,relSpec:i};uo.push(r),Bt.debug("Added new relationship :",r)},getRelationships:()=>uo,clear:function(){ho={},uo=[],Yi()},setAccTitle:zi,getAccTitle:Ui,setAccDescription:Wi,getAccDescription:qi,setDiagramTitle:Hi,getDiagramTitle:Vi},go={ONLY_ONE_START:"ONLY_ONE_START",ONLY_ONE_END:"ONLY_ONE_END",ZERO_OR_ONE_START:"ZERO_OR_ONE_START",ZERO_OR_ONE_END:"ZERO_OR_ONE_END",ONE_OR_MORE_START:"ONE_OR_MORE_START",ONE_OR_MORE_END:"ONE_OR_MORE_END",ZERO_OR_MORE_START:"ZERO_OR_MORE_START",ZERO_OR_MORE_END:"ZERO_OR_MORE_END"},yo=go,mo=function(t,e){let n;t.append("defs").append("marker").attr("id",go.ONLY_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",go.ONLY_ONE_END).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,0 L3,18 M9,0 L9,18"),n=t.append("defs").append("marker").attr("id",go.ZERO_OR_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M9,0 L9,18"),n=t.append("defs").append("marker").attr("id",go.ZERO_OR_ONE_END).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,0 L21,18"),t.append("defs").append("marker").attr("id",go.ONE_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",go.ONE_OR_MORE_END).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"),n=t.append("defs").append("marker").attr("id",go.ZERO_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18"),n=t.append("defs").append("marker").attr("id",go.ZERO_OR_MORE_END).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),n.append("circle").attr("stroke",e.stroke).attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),n.append("path").attr("stroke",e.stroke).attr("fill","none").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},bo=/[^\dA-Za-z](\W)*/g;let _o={},xo=new Map;const vo=function(t,e,n){let i;return Object.keys(e).forEach((function(r){const a=function(t="",e=""){const n=t.replace(bo,"");return`${To(e)}${To(n)}${xt(t,Co)}`}(r,"entity");xo.set(r,a);const s=t.append("g").attr("id",a);i=void 0===i?a:i;const o="text-"+a,c=s.append("text").classed("er entityLabel",!0).attr("id",o).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","middle").style("font-family",gi().fontFamily).style("font-size",_o.fontSize+"px").text(r),{width:l,height:h}=((t,e,n)=>{const i=_o.entityPadding/3,r=_o.entityPadding/3,a=.85*_o.fontSize,s=e.node().getBBox(),o=[];let c=!1,l=!1,h=0,u=0,d=0,p=0,f=s.height+2*i,g=1;n.forEach((t=>{void 0!==t.attributeKeyTypeList&&t.attributeKeyTypeList.length>0&&(c=!0),void 0!==t.attributeComment&&(l=!0)})),n.forEach((n=>{const r=`${e.node().id}-attr-${g}`;let s=0;const y=Pt(n.attributeType),m=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-type`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",gi().fontFamily).style("font-size",a+"px").text(y),b=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-name`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",gi().fontFamily).style("font-size",a+"px").text(n.attributeName),_={};_.tn=m,_.nn=b;const x=m.node().getBBox(),v=b.node().getBBox();if(h=Math.max(h,x.width),u=Math.max(u,v.width),s=Math.max(x.height,v.height),c){const e=void 0!==n.attributeKeyTypeList?n.attributeKeyTypeList.join(","):"",i=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-key`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",gi().fontFamily).style("font-size",a+"px").text(e);_.kn=i;const o=i.node().getBBox();d=Math.max(d,o.width),s=Math.max(s,o.height)}if(l){const e=t.append("text").classed("er entityLabel",!0).attr("id",`${r}-comment`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",gi().fontFamily).style("font-size",a+"px").text(n.attributeComment||"");_.cn=e;const i=e.node().getBBox();p=Math.max(p,i.width),s=Math.max(s,i.height)}_.height=s,o.push(_),f+=s+2*i,g+=1}));let y=4;c&&(y+=2),l&&(y+=2);const m=h+u+d+p,b={width:Math.max(_o.minEntityWidth,Math.max(s.width+2*_o.entityPadding,m+r*y)),height:n.length>0?f:Math.max(_o.minEntityHeight,s.height+2*_o.entityPadding)};if(n.length>0){const n=Math.max(0,(b.width-m-r*y)/(y/2));e.attr("transform","translate("+b.width/2+","+(i+s.height/2)+")");let a=s.height+2*i,f="attributeBoxOdd";o.forEach((e=>{const s=a+i+e.height/2;e.tn.attr("transform","translate("+r+","+s+")");const o=t.insert("rect","#"+e.tn.node().id).classed(`er ${f}`,!0).attr("x",0).attr("y",a).attr("width",h+2*r+n).attr("height",e.height+2*i),g=parseFloat(o.attr("x"))+parseFloat(o.attr("width"));e.nn.attr("transform","translate("+(g+r)+","+s+")");const y=t.insert("rect","#"+e.nn.node().id).classed(`er ${f}`,!0).attr("x",g).attr("y",a).attr("width",u+2*r+n).attr("height",e.height+2*i);let m=parseFloat(y.attr("x"))+parseFloat(y.attr("width"));if(c){e.kn.attr("transform","translate("+(m+r)+","+s+")");const o=t.insert("rect","#"+e.kn.node().id).classed(`er ${f}`,!0).attr("x",m).attr("y",a).attr("width",d+2*r+n).attr("height",e.height+2*i);m=parseFloat(o.attr("x"))+parseFloat(o.attr("width"))}l&&(e.cn.attr("transform","translate("+(m+r)+","+s+")"),t.insert("rect","#"+e.cn.node().id).classed(`er ${f}`,"true").attr("x",m).attr("y",a).attr("width",p+2*r+n).attr("height",e.height+2*i)),a+=e.height+2*i,f="attributeBoxOdd"===f?"attributeBoxEven":"attributeBoxOdd"}))}else b.height=Math.max(_o.minEntityHeight,f),e.attr("transform","translate("+b.width/2+","+b.height/2+")");return b})(s,c,e[r].attributes),u=s.insert("rect","#"+o).classed("er entityBox",!0).attr("x",0).attr("y",0).attr("width",l).attr("height",h).node().getBBox();n.setNode(a,{width:u.width,height:u.height,shape:"rect",id:a})})),i},ko=function(t){return(t.entityA+t.roleA+t.entityB).replace(/\s/g,"")};let wo=0;const Co="28e9f9db-3c8d-5aa5-9faf-44286ae5937c";function To(t=""){return t.length>0?`${t}-`:""}const Eo={setConf:function(t){const e=Object.keys(t);for(const n of e)_o[n]=t[n]},draw:function(t,e,n,i){_o=gi().er,Bt.info("Drawing ER diagram");const r=gi().securityLevel;let a;"sandbox"===r&&(a=(0,o.Ys)("#i"+e));const s=("sandbox"===r?(0,o.Ys)(a.nodes()[0].contentDocument.body):(0,o.Ys)("body")).select(`[id='${e}']`);let c;mo(s,_o),c=new lt.k({multigraph:!0,directed:!0,compound:!1}).setGraph({rankdir:_o.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel((function(){return{}}));const l=vo(s,i.db.getEntities(),c),h=function(t,e){return t.forEach((function(t){e.setEdge(xo.get(t.entityA),xo.get(t.entityB),{relationship:t},ko(t))})),t}(i.db.getRelationships(),c);var u,d;(0,ct.bK)(c),u=s,(d=c).nodes().forEach((function(t){void 0!==t&&void 0!==d.node(t)&&u.select("#"+t).attr("transform","translate("+(d.node(t).x-d.node(t).width/2)+","+(d.node(t).y-d.node(t).height/2)+" )")})),h.forEach((function(t){!function(t,e,n,i,r){wo++;const a=n.edge(xo.get(e.entityA),xo.get(e.entityB),ko(e)),s=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})).curve(o.$0Z),c=t.insert("path","#"+i).classed("er relationshipLine",!0).attr("d",s(a.points)).style("stroke",_o.stroke).style("fill","none");e.relSpec.relType===r.db.Identification.NON_IDENTIFYING&&c.attr("stroke-dasharray","8,8");let l="";switch(_o.arrowMarkerAbsolute&&(l=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,l=l.replace(/\(/g,"\\("),l=l.replace(/\)/g,"\\)")),e.relSpec.cardA){case r.db.Cardinality.ZERO_OR_ONE:c.attr("marker-end","url("+l+"#"+yo.ZERO_OR_ONE_END+")");break;case r.db.Cardinality.ZERO_OR_MORE:c.attr("marker-end","url("+l+"#"+yo.ZERO_OR_MORE_END+")");break;case r.db.Cardinality.ONE_OR_MORE:c.attr("marker-end","url("+l+"#"+yo.ONE_OR_MORE_END+")");break;case r.db.Cardinality.ONLY_ONE:c.attr("marker-end","url("+l+"#"+yo.ONLY_ONE_END+")")}switch(e.relSpec.cardB){case r.db.Cardinality.ZERO_OR_ONE:c.attr("marker-start","url("+l+"#"+yo.ZERO_OR_ONE_START+")");break;case r.db.Cardinality.ZERO_OR_MORE:c.attr("marker-start","url("+l+"#"+yo.ZERO_OR_MORE_START+")");break;case r.db.Cardinality.ONE_OR_MORE:c.attr("marker-start","url("+l+"#"+yo.ONE_OR_MORE_START+")");break;case r.db.Cardinality.ONLY_ONE:c.attr("marker-start","url("+l+"#"+yo.ONLY_ONE_START+")")}const h=c.node().getTotalLength(),u=c.node().getPointAtLength(.5*h),d="rel"+wo,p=t.append("text").classed("er relationshipLabel",!0).attr("id",d).attr("x",u.x).attr("y",u.y).style("text-anchor","middle").style("dominant-baseline","middle").style("font-family",gi().fontFamily).style("font-size",_o.fontSize+"px").text(e.roleA).node().getBBox();t.insert("rect","#"+d).classed("er relationshipLabelBox",!0).attr("x",u.x-p.width/2).attr("y",u.y-p.height/2).attr("width",p.width).attr("height",p.height)}(s,t,c,l,i)}));const p=_o.diagramPadding;ai.insertTitle(s,"entityTitleText",_o.titleTopMargin,i.db.getDiagramTitle());const f=s.node().getBBox(),g=f.width+2*p,y=f.height+2*p;ki(s,y,g,_o.useMaxWidth),s.attr("viewBox",`${f.x-p} ${f.y-p} ${g} ${y}`)}};var So=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,9],i=[1,7],r=[1,6],a=[1,8],s=[1,20,21,22,23,38,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],o=[2,10],c=[1,20],l=[1,21],h=[1,22],u=[1,23],d=[1,30],p=[1,32],f=[1,33],g=[1,34],y=[1,62],m=[1,48],b=[1,52],_=[1,36],x=[1,37],v=[1,38],k=[1,39],w=[1,40],C=[1,56],T=[1,63],E=[1,51],S=[1,53],A=[1,55],L=[1,59],B=[1,60],N=[1,41],D=[1,42],O=[1,43],M=[1,44],I=[1,61],F=[1,50],$=[1,54],R=[1,57],Z=[1,58],P=[1,49],j=[1,66],Y=[1,71],z=[1,20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],U=[1,75],W=[1,74],q=[1,76],H=[20,21,23,81,82],V=[1,99],G=[1,104],X=[1,107],Q=[1,108],K=[1,101],J=[1,106],tt=[1,109],et=[1,102],nt=[1,114],it=[1,113],rt=[1,103],at=[1,105],st=[1,110],ot=[1,111],ct=[1,112],lt=[1,115],ht=[20,21,22,23,81,82],ut=[20,21,22,23,53,81,82],dt=[20,21,22,23,40,52,53,55,57,59,61,63,65,66,67,69,71,73,74,76,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],pt=[20,21,23],ft=[20,21,23,52,66,67,81,82,91,95,105,106,109,111,112,122,123,124,125,126,127],gt=[1,12,20,21,22,23,24,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],yt=[52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],mt=[1,149],bt=[1,157],_t=[1,158],xt=[1,159],vt=[1,160],kt=[1,144],wt=[1,145],Ct=[1,141],Tt=[1,152],Et=[1,153],St=[1,154],At=[1,155],Lt=[1,156],Bt=[1,161],Nt=[1,162],Dt=[1,147],Ot=[1,150],Mt=[1,146],It=[1,143],Ft=[20,21,22,23,38,42,44,46,48,52,66,67,86,87,88,89,90,91,95,105,106,109,111,112,118,119,120,121,122,123,124,125,126,127],$t=[1,165],Rt=[20,21,22,23,26,52,66,67,91,105,106,109,111,112,122,123,124,125,126,127],Zt=[20,21,22,23,24,26,38,40,41,42,52,56,58,60,62,64,66,67,68,70,72,73,75,77,81,82,86,87,88,89,90,91,92,95,105,106,109,111,112,113,114,122,123,124,125,126,127],Pt=[12,21,22,24],jt=[22,106],Yt=[1,250],zt=[1,245],Ut=[1,246],Wt=[1,254],qt=[1,251],Ht=[1,248],Vt=[1,247],Gt=[1,249],Xt=[1,252],Qt=[1,253],Kt=[1,255],Jt=[1,273],te=[20,21,23,106],ee=[20,21,22,23,66,67,86,102,105,106,109,110,111,112,113],ne={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,directive:5,openDirective:6,typeDirective:7,closeDirective:8,separator:9,":":10,argDirective:11,open_directive:12,type_directive:13,arg_directive:14,close_directive:15,graphConfig:16,document:17,line:18,statement:19,SEMI:20,NEWLINE:21,SPACE:22,EOF:23,GRAPH:24,NODIR:25,DIR:26,FirstStmtSeperator:27,ending:28,endToken:29,spaceList:30,spaceListNewline:31,verticeStatement:32,styleStatement:33,linkStyleStatement:34,classDefStatement:35,classStatement:36,clickStatement:37,subgraph:38,text:39,SQS:40,SQE:41,end:42,direction:43,acc_title:44,acc_title_value:45,acc_descr:46,acc_descr_value:47,acc_descr_multiline_value:48,link:49,node:50,vertex:51,AMP:52,STYLE_SEPARATOR:53,idString:54,DOUBLECIRCLESTART:55,DOUBLECIRCLEEND:56,PS:57,PE:58,"(-":59,"-)":60,STADIUMSTART:61,STADIUMEND:62,SUBROUTINESTART:63,SUBROUTINEEND:64,VERTEX_WITH_PROPS_START:65,ALPHA:66,COLON:67,PIPE:68,CYLINDERSTART:69,CYLINDEREND:70,DIAMOND_START:71,DIAMOND_STOP:72,TAGEND:73,TRAPSTART:74,TRAPEND:75,INVTRAPSTART:76,INVTRAPEND:77,linkStatement:78,arrowText:79,TESTSTR:80,START_LINK:81,LINK:82,textToken:83,STR:84,keywords:85,STYLE:86,LINKSTYLE:87,CLASSDEF:88,CLASS:89,CLICK:90,DOWN:91,UP:92,textNoTags:93,textNoTagsToken:94,DEFAULT:95,stylesOpt:96,alphaNum:97,CALLBACKNAME:98,CALLBACKARGS:99,HREF:100,LINK_TARGET:101,HEX:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,MINUS:109,UNIT:110,BRKT:111,DOT:112,PCT:113,TAGSTART:114,alphaNumToken:115,idStringToken:116,alphaNumStatement:117,direction_tb:118,direction_bt:119,direction_rl:120,direction_lr:121,PUNCTUATION:122,UNICODE_TEXT:123,PLUS:124,EQUALS:125,MULT:126,UNDERSCORE:127,graphCodeTokens:128,ARROW_CROSS:129,ARROW_POINT:130,ARROW_CIRCLE:131,ARROW_OPEN:132,QUOTE:133,$accept:0,$end:1},terminals_:{2:"error",10:":",12:"open_directive",13:"type_directive",14:"arg_directive",15:"close_directive",20:"SEMI",21:"NEWLINE",22:"SPACE",23:"EOF",24:"GRAPH",25:"NODIR",26:"DIR",38:"subgraph",40:"SQS",41:"SQE",42:"end",44:"acc_title",45:"acc_title_value",46:"acc_descr",47:"acc_descr_value",48:"acc_descr_multiline_value",52:"AMP",53:"STYLE_SEPARATOR",55:"DOUBLECIRCLESTART",56:"DOUBLECIRCLEEND",57:"PS",58:"PE",59:"(-",60:"-)",61:"STADIUMSTART",62:"STADIUMEND",63:"SUBROUTINESTART",64:"SUBROUTINEEND",65:"VERTEX_WITH_PROPS_START",66:"ALPHA",67:"COLON",68:"PIPE",69:"CYLINDERSTART",70:"CYLINDEREND",71:"DIAMOND_START",72:"DIAMOND_STOP",73:"TAGEND",74:"TRAPSTART",75:"TRAPEND",76:"INVTRAPSTART",77:"INVTRAPEND",80:"TESTSTR",81:"START_LINK",82:"LINK",84:"STR",86:"STYLE",87:"LINKSTYLE",88:"CLASSDEF",89:"CLASS",90:"CLICK",91:"DOWN",92:"UP",95:"DEFAULT",98:"CALLBACKNAME",99:"CALLBACKARGS",100:"HREF",101:"LINK_TARGET",102:"HEX",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"MINUS",110:"UNIT",111:"BRKT",112:"DOT",113:"PCT",114:"TAGSTART",118:"direction_tb",119:"direction_bt",120:"direction_rl",121:"direction_lr",122:"PUNCTUATION",123:"UNICODE_TEXT",124:"PLUS",125:"EQUALS",126:"MULT",127:"UNDERSCORE",129:"ARROW_CROSS",130:"ARROW_POINT",131:"ARROW_CIRCLE",132:"ARROW_OPEN",133:"QUOTE"},productions_:[0,[3,1],[3,2],[5,4],[5,6],[6,1],[7,1],[11,1],[8,1],[4,2],[17,0],[17,2],[18,1],[18,1],[18,1],[18,1],[18,1],[16,2],[16,2],[16,2],[16,3],[28,2],[28,1],[29,1],[29,1],[29,1],[27,1],[27,1],[27,2],[31,2],[31,2],[31,1],[31,1],[30,2],[30,1],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,9],[19,6],[19,4],[19,1],[19,2],[19,2],[19,1],[9,1],[9,1],[9,1],[32,3],[32,4],[32,2],[32,1],[50,1],[50,5],[50,3],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,8],[51,4],[51,4],[51,4],[51,6],[51,4],[51,4],[51,4],[51,4],[51,4],[51,1],[49,2],[49,3],[49,3],[49,1],[49,3],[78,1],[79,3],[39,1],[39,2],[39,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[93,1],[93,2],[35,5],[35,5],[36,5],[37,2],[37,4],[37,3],[37,5],[37,2],[37,4],[37,4],[37,6],[37,2],[37,4],[37,2],[37,4],[37,4],[37,6],[33,5],[33,5],[34,5],[34,5],[34,9],[34,9],[34,7],[34,7],[103,1],[103,3],[96,1],[96,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[94,1],[94,1],[94,1],[94,1],[54,1],[54,2],[97,1],[97,2],[117,1],[117,1],[117,1],[117,1],[43,1],[43,1],[43,1],[43,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[115,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[116,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1],[128,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 5:i.parseDirective("%%{","open_directive");break;case 6:i.parseDirective(a[o],"type_directive");break;case 7:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 8:i.parseDirective("}%%","close_directive","flowchart");break;case 10:case 36:case 37:case 38:case 39:case 40:this.$=[];break;case 11:(!Array.isArray(a[o])||a[o].length>0)&&a[o-1].push(a[o]),this.$=a[o-1];break;case 12:case 82:case 84:case 96:case 152:case 154:case 155:case 78:case 150:this.$=a[o];break;case 19:i.setDirection("TB"),this.$="TB";break;case 20:i.setDirection(a[o-1]),this.$=a[o-1];break;case 35:this.$=a[o-1].nodes;break;case 41:this.$=i.addSubGraph(a[o-6],a[o-1],a[o-4]);break;case 42:this.$=i.addSubGraph(a[o-3],a[o-1],a[o-3]);break;case 43:this.$=i.addSubGraph(void 0,a[o-1],void 0);break;case 45:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 46:case 47:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 51:i.addLink(a[o-2].stmt,a[o],a[o-1]),this.$={stmt:a[o],nodes:a[o].concat(a[o-2].nodes)};break;case 52:i.addLink(a[o-3].stmt,a[o-1],a[o-2]),this.$={stmt:a[o-1],nodes:a[o-1].concat(a[o-3].nodes)};break;case 53:this.$={stmt:a[o-1],nodes:a[o-1]};break;case 54:this.$={stmt:a[o],nodes:a[o]};break;case 55:case 123:case 125:this.$=[a[o]];break;case 56:this.$=a[o-4].concat(a[o]);break;case 57:this.$=[a[o-2]],i.setClass(a[o-2],a[o]);break;case 58:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"square");break;case 59:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"doublecircle");break;case 60:this.$=a[o-5],i.addVertex(a[o-5],a[o-2],"circle");break;case 61:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"ellipse");break;case 62:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"stadium");break;case 63:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"subroutine");break;case 64:this.$=a[o-7],i.addVertex(a[o-7],a[o-1],"rect",void 0,void 0,void 0,Object.fromEntries([[a[o-5],a[o-3]]]));break;case 65:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"cylinder");break;case 66:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"round");break;case 67:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"diamond");break;case 68:this.$=a[o-5],i.addVertex(a[o-5],a[o-2],"hexagon");break;case 69:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"odd");break;case 70:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"trapezoid");break;case 71:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"inv_trapezoid");break;case 72:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"lean_right");break;case 73:this.$=a[o-3],i.addVertex(a[o-3],a[o-1],"lean_left");break;case 74:this.$=a[o],i.addVertex(a[o]);break;case 75:a[o-1].text=a[o],this.$=a[o-1];break;case 76:case 77:a[o-2].text=a[o-1],this.$=a[o-2];break;case 79:var c=i.destructLink(a[o],a[o-2]);this.$={type:c.type,stroke:c.stroke,length:c.length,text:a[o-1]};break;case 80:c=i.destructLink(a[o]);this.$={type:c.type,stroke:c.stroke,length:c.length};break;case 81:this.$=a[o-1];break;case 83:case 97:case 153:case 151:this.$=a[o-1]+""+a[o];break;case 98:case 99:this.$=a[o-4],i.addClass(a[o-2],a[o]);break;case 100:this.$=a[o-4],i.setClass(a[o-2],a[o]);break;case 101:case 109:this.$=a[o-1],i.setClickEvent(a[o-1],a[o]);break;case 102:case 110:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-2]),i.setTooltip(a[o-3],a[o]);break;case 103:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 104:this.$=a[o-4],i.setClickEvent(a[o-4],a[o-3],a[o-2]),i.setTooltip(a[o-4],a[o]);break;case 105:case 111:this.$=a[o-1],i.setLink(a[o-1],a[o]);break;case 106:case 112:this.$=a[o-3],i.setLink(a[o-3],a[o-2]),i.setTooltip(a[o-3],a[o]);break;case 107:case 113:this.$=a[o-3],i.setLink(a[o-3],a[o-2],a[o]);break;case 108:case 114:this.$=a[o-5],i.setLink(a[o-5],a[o-4],a[o]),i.setTooltip(a[o-5],a[o-2]);break;case 115:this.$=a[o-4],i.addVertex(a[o-2],void 0,void 0,a[o]);break;case 116:case 118:this.$=a[o-4],i.updateLink(a[o-2],a[o]);break;case 117:this.$=a[o-4],i.updateLink([a[o-2]],a[o]);break;case 119:this.$=a[o-8],i.updateLinkInterpolate([a[o-6]],a[o-2]),i.updateLink([a[o-6]],a[o]);break;case 120:this.$=a[o-8],i.updateLinkInterpolate(a[o-6],a[o-2]),i.updateLink(a[o-6],a[o]);break;case 121:this.$=a[o-6],i.updateLinkInterpolate([a[o-4]],a[o]);break;case 122:this.$=a[o-6],i.updateLinkInterpolate(a[o-4],a[o]);break;case 124:case 126:a[o-2].push(a[o]),this.$=a[o-2];break;case 128:this.$=a[o-1]+a[o];break;case 156:this.$="v";break;case 157:this.$="-";break;case 158:this.$={stmt:"dir",value:"TB"};break;case 159:this.$={stmt:"dir",value:"BT"};break;case 160:this.$={stmt:"dir",value:"RL"};break;case 161:this.$={stmt:"dir",value:"LR"}}},table:[{3:1,4:2,5:3,6:5,12:n,16:4,21:i,22:r,24:a},{1:[3]},{1:[2,1]},{3:10,4:2,5:3,6:5,12:n,16:4,21:i,22:r,24:a},e(s,o,{17:11}),{7:12,13:[1,13]},{16:14,21:i,22:r,24:a},{16:15,21:i,22:r,24:a},{25:[1,16],26:[1,17]},{13:[2,5]},{1:[2,2]},{1:[2,9],18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,118:N,119:D,120:O,121:M,122:I,123:F,124:$,125:R,126:Z,127:P},{8:64,10:[1,65],15:j},e([10,15],[2,6]),e(s,[2,17]),e(s,[2,18]),e(s,[2,19]),{20:[1,68],21:[1,69],22:Y,27:67,30:70},e(z,[2,11]),e(z,[2,12]),e(z,[2,13]),e(z,[2,14]),e(z,[2,15]),e(z,[2,16]),{9:72,20:U,21:W,23:q,49:73,78:77,81:[1,78],82:[1,79]},{9:80,20:U,21:W,23:q},{9:81,20:U,21:W,23:q},{9:82,20:U,21:W,23:q},{9:83,20:U,21:W,23:q},{9:84,20:U,21:W,23:q},{9:86,20:U,21:W,22:[1,85],23:q},e(z,[2,44]),{45:[1,87]},{47:[1,88]},e(z,[2,47]),e(H,[2,54],{30:89,22:Y}),{22:[1,90]},{22:[1,91]},{22:[1,92]},{22:[1,93]},{26:V,52:G,66:X,67:Q,84:[1,97],91:K,97:96,98:[1,94],100:[1,95],105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(z,[2,158]),e(z,[2,159]),e(z,[2,160]),e(z,[2,161]),e(ht,[2,55],{53:[1,116]}),e(ut,[2,74],{116:129,40:[1,117],52:y,55:[1,118],57:[1,119],59:[1,120],61:[1,121],63:[1,122],65:[1,123],66:m,67:b,69:[1,124],71:[1,125],73:[1,126],74:[1,127],76:[1,128],91:C,95:T,105:E,106:S,109:A,111:L,112:B,122:I,123:F,124:$,125:R,126:Z,127:P}),e(dt,[2,150]),e(dt,[2,175]),e(dt,[2,176]),e(dt,[2,177]),e(dt,[2,178]),e(dt,[2,179]),e(dt,[2,180]),e(dt,[2,181]),e(dt,[2,182]),e(dt,[2,183]),e(dt,[2,184]),e(dt,[2,185]),e(dt,[2,186]),e(dt,[2,187]),e(dt,[2,188]),e(dt,[2,189]),e(dt,[2,190]),{9:130,20:U,21:W,23:q},{11:131,14:[1,132]},e(pt,[2,8]),e(s,[2,20]),e(s,[2,26]),e(s,[2,27]),{21:[1,133]},e(ft,[2,34],{30:134,22:Y}),e(z,[2,35]),{50:135,51:45,52:y,54:46,66:m,67:b,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,122:I,123:F,124:$,125:R,126:Z,127:P},e(gt,[2,48]),e(gt,[2,49]),e(gt,[2,50]),e(yt,[2,78],{79:136,68:[1,138],80:[1,137]}),{22:mt,24:bt,26:_t,38:xt,39:139,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e([52,66,67,68,80,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,80]),e(z,[2,36]),e(z,[2,37]),e(z,[2,38]),e(z,[2,39]),e(z,[2,40]),{22:mt,24:bt,26:_t,38:xt,39:163,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Ft,o,{17:164}),e(z,[2,45]),e(z,[2,46]),e(H,[2,53],{52:$t}),{26:V,52:G,66:X,67:Q,91:K,97:166,102:[1,167],105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{95:[1,168],103:169,105:[1,170]},{26:V,52:G,66:X,67:Q,91:K,95:[1,171],97:172,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{26:V,52:G,66:X,67:Q,91:K,97:173,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,101],{22:[1,174],99:[1,175]}),e(pt,[2,105],{22:[1,176]}),e(pt,[2,109],{115:100,117:178,22:[1,177],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,111],{22:[1,179]}),e(Rt,[2,152]),e(Rt,[2,154]),e(Rt,[2,155]),e(Rt,[2,156]),e(Rt,[2,157]),e(Zt,[2,162]),e(Zt,[2,163]),e(Zt,[2,164]),e(Zt,[2,165]),e(Zt,[2,166]),e(Zt,[2,167]),e(Zt,[2,168]),e(Zt,[2,169]),e(Zt,[2,170]),e(Zt,[2,171]),e(Zt,[2,172]),e(Zt,[2,173]),e(Zt,[2,174]),{52:y,54:180,66:m,67:b,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,122:I,123:F,124:$,125:R,126:Z,127:P},{22:mt,24:bt,26:_t,38:xt,39:181,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:182,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:184,42:vt,52:G,57:[1,183],66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:185,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:186,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:187,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{66:[1,188]},{22:mt,24:bt,26:_t,38:xt,39:189,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:190,42:vt,52:G,66:X,67:Q,71:[1,191],73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:192,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:193,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:194,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(dt,[2,151]),e(Pt,[2,3]),{8:195,15:j},{15:[2,7]},e(s,[2,28]),e(ft,[2,33]),e(H,[2,51],{30:196,22:Y}),e(yt,[2,75],{22:[1,197]}),{22:[1,198]},{22:mt,24:bt,26:_t,38:xt,39:199,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,73:kt,81:wt,82:[1,200],83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Zt,[2,82]),e(Zt,[2,84]),e(Zt,[2,140]),e(Zt,[2,141]),e(Zt,[2,142]),e(Zt,[2,143]),e(Zt,[2,144]),e(Zt,[2,145]),e(Zt,[2,146]),e(Zt,[2,147]),e(Zt,[2,148]),e(Zt,[2,149]),e(Zt,[2,85]),e(Zt,[2,86]),e(Zt,[2,87]),e(Zt,[2,88]),e(Zt,[2,89]),e(Zt,[2,90]),e(Zt,[2,91]),e(Zt,[2,92]),e(Zt,[2,93]),e(Zt,[2,94]),e(Zt,[2,95]),{9:203,20:U,21:W,22:mt,23:q,24:bt,26:_t,38:xt,40:[1,202],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,204],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,118:N,119:D,120:O,121:M,122:I,123:F,124:$,125:R,126:Z,127:P},{22:Y,30:205},{22:[1,206],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:[1,207]},{22:[1,208]},{22:[1,209],106:[1,210]},e(jt,[2,123]),{22:[1,211]},{22:[1,212],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:[1,213],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,115:100,117:178,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{84:[1,214]},e(pt,[2,103],{22:[1,215]}),{84:[1,216],101:[1,217]},{84:[1,218]},e(Rt,[2,153]),{84:[1,219],101:[1,220]},e(ht,[2,57],{116:129,52:y,66:m,67:b,91:C,95:T,105:E,106:S,109:A,111:L,112:B,122:I,123:F,124:$,125:R,126:Z,127:P}),{22:mt,24:bt,26:_t,38:xt,41:[1,221],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,56:[1,222],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:223,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,58:[1,224],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,60:[1,225],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,62:[1,226],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,64:[1,227],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{67:[1,228]},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,70:[1,229],73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,72:[1,230],73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,39:231,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,41:[1,232],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,73:kt,75:[1,233],77:[1,234],81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,73:kt,75:[1,236],77:[1,235],81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{9:237,20:U,21:W,23:q},e(H,[2,52],{52:$t}),e(yt,[2,77]),e(yt,[2,76]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,68:[1,238],73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(yt,[2,79]),e(Zt,[2,83]),{22:mt,24:bt,26:_t,38:xt,39:239,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(Ft,o,{17:240}),e(z,[2,43]),{51:241,52:y,54:46,66:m,67:b,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,122:I,123:F,124:$,125:R,126:Z,127:P},{22:Yt,66:zt,67:Ut,86:Wt,96:242,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:256,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:257,102:qt,104:[1,258],105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:259,102:qt,104:[1,260],105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{105:[1,261]},{22:Yt,66:zt,67:Ut,86:Wt,96:262,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:263,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{26:V,52:G,66:X,67:Q,91:K,97:264,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,102]),{84:[1,265]},e(pt,[2,106],{22:[1,266]}),e(pt,[2,107]),e(pt,[2,110]),e(pt,[2,112],{22:[1,267]}),e(pt,[2,113]),e(ut,[2,58]),e(ut,[2,59]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,58:[1,268],66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,66]),e(ut,[2,61]),e(ut,[2,62]),e(ut,[2,63]),{66:[1,269]},e(ut,[2,65]),e(ut,[2,67]),{22:mt,24:bt,26:_t,38:xt,42:vt,52:G,66:X,67:Q,72:[1,270],73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,69]),e(ut,[2,70]),e(ut,[2,72]),e(ut,[2,71]),e(ut,[2,73]),e(Pt,[2,4]),e([22,52,66,67,91,95,105,106,109,111,112,122,123,124,125,126,127],[2,81]),{22:mt,24:bt,26:_t,38:xt,41:[1,271],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,272],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,118:N,119:D,120:O,121:M,122:I,123:F,124:$,125:R,126:Z,127:P},e(ht,[2,56]),e(pt,[2,115],{106:Jt}),e(te,[2,125],{108:274,22:Yt,66:zt,67:Ut,86:Wt,102:qt,105:Ht,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt}),e(ee,[2,127]),e(ee,[2,129]),e(ee,[2,130]),e(ee,[2,131]),e(ee,[2,132]),e(ee,[2,133]),e(ee,[2,134]),e(ee,[2,135]),e(ee,[2,136]),e(ee,[2,137]),e(ee,[2,138]),e(ee,[2,139]),e(pt,[2,116],{106:Jt}),e(pt,[2,117],{106:Jt}),{22:[1,275]},e(pt,[2,118],{106:Jt}),{22:[1,276]},e(jt,[2,124]),e(pt,[2,98],{106:Jt}),e(pt,[2,99],{106:Jt}),e(pt,[2,100],{115:100,117:178,26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,104]),{101:[1,277]},{101:[1,278]},{58:[1,279]},{68:[1,280]},{72:[1,281]},{9:282,20:U,21:W,23:q},e(z,[2,42]),{22:Yt,66:zt,67:Ut,86:Wt,102:qt,105:Ht,107:283,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},e(ee,[2,128]),{26:V,52:G,66:X,67:Q,91:K,97:284,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{26:V,52:G,66:X,67:Q,91:K,97:285,105:J,106:tt,109:et,111:nt,112:it,115:100,117:98,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(pt,[2,108]),e(pt,[2,114]),e(ut,[2,60]),{22:mt,24:bt,26:_t,38:xt,39:286,42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:140,84:Ct,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},e(ut,[2,68]),e(Ft,o,{17:287}),e(te,[2,126],{108:274,22:Yt,66:zt,67:Ut,86:Wt,102:qt,105:Ht,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt}),e(pt,[2,121],{115:100,117:178,22:[1,288],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),e(pt,[2,122],{115:100,117:178,22:[1,289],26:V,52:G,66:X,67:Q,91:K,105:J,106:tt,109:et,111:nt,112:it,122:rt,123:at,124:st,125:ot,126:ct,127:lt}),{22:mt,24:bt,26:_t,38:xt,41:[1,290],42:vt,52:G,66:X,67:Q,73:kt,81:wt,83:201,85:151,86:Tt,87:Et,88:St,89:At,90:Lt,91:Bt,92:Nt,94:142,95:Dt,105:J,106:tt,109:Ot,111:nt,112:it,113:Mt,114:It,115:148,122:rt,123:at,124:st,125:ot,126:ct,127:lt},{18:18,19:19,20:c,21:l,22:h,23:u,32:24,33:25,34:26,35:27,36:28,37:29,38:d,42:[1,291],43:31,44:p,46:f,48:g,50:35,51:45,52:y,54:46,66:m,67:b,86:_,87:x,88:v,89:k,90:w,91:C,95:T,105:E,106:S,109:A,111:L,112:B,116:47,118:N,119:D,120:O,121:M,122:I,123:F,124:$,125:R,126:Z,127:P},{22:Yt,66:zt,67:Ut,86:Wt,96:292,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},{22:Yt,66:zt,67:Ut,86:Wt,96:293,102:qt,105:Ht,107:243,108:244,109:Vt,110:Gt,111:Xt,112:Qt,113:Kt},e(ut,[2,64]),e(z,[2,41]),e(pt,[2,119],{106:Jt}),e(pt,[2,120],{106:Jt})],defaultActions:{2:[2,1],9:[2,5],10:[2,2],132:[2,7]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},ie=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),12;case 1:return this.begin("type_directive"),13;case 2:return this.popState(),this.begin("arg_directive"),10;case 3:return this.popState(),this.popState(),15;case 4:return 14;case 5:case 6:break;case 7:return this.begin("acc_title"),44;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),46;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:case 15:case 24:case 27:case 30:case 33:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:this.begin("string");break;case 16:return"STR";case 17:return 86;case 18:return 95;case 19:return 87;case 20:return 104;case 21:return 88;case 22:return 89;case 23:this.begin("href");break;case 25:return 100;case 26:this.begin("callbackname");break;case 28:this.popState(),this.begin("callbackargs");break;case 29:return 98;case 31:return 99;case 32:this.begin("click");break;case 34:return 90;case 35:case 36:case 37:return t.lex.firstGraph()&&this.begin("dir"),24;case 38:return 38;case 39:return 42;case 40:case 41:case 42:case 43:return 101;case 44:return this.popState(),25;case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:return this.popState(),26;case 55:return 118;case 56:return 119;case 57:return 120;case 58:return 121;case 59:return 105;case 60:return 111;case 61:return 53;case 62:return 67;case 63:return 52;case 64:return 20;case 65:return 106;case 66:return 126;case 67:case 68:case 69:return 82;case 70:case 71:case 72:return 81;case 73:return 59;case 74:return 60;case 75:return 61;case 76:return 62;case 77:return 63;case 78:return 64;case 79:return 65;case 80:return 69;case 81:return 70;case 82:return 55;case 83:return 56;case 84:return 109;case 85:return 112;case 86:return 127;case 87:return 124;case 88:return 113;case 89:case 90:return 125;case 91:return 114;case 92:return 73;case 93:return 92;case 94:return"SEP";case 95:return 91;case 96:return 66;case 97:return 75;case 98:return 74;case 99:return 77;case 100:return 76;case 101:return 122;case 102:return 123;case 103:return 68;case 104:return 57;case 105:return 58;case 106:return 40;case 107:return 41;case 108:return 71;case 109:return 72;case 110:return 133;case 111:return 21;case 112:return 22;case 113:return 23}},rules:[/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)[^\n]*)/,/^(?:[^\}]%%[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\])/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[30,31],inclusive:!1},callbackname:{rules:[27,28,29],inclusive:!1},href:{rules:[24,25],inclusive:!1},click:{rules:[33,34],inclusive:!1},vertex:{rules:[],inclusive:!1},dir:{rules:[44,45,46,47,48,49,50,51,52,53,54],inclusive:!1},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},string:{rules:[15,16],inclusive:!1},INITIAL:{rules:[0,5,6,7,9,11,14,17,18,19,20,21,22,23,26,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113],inclusive:!0}}},t);function re(){this.yy={}}return ne.lexer=ie,re.prototype=ne,ne.Parser=re,new re}();So.parser=So;const Ao=So,Lo=(t,e)=>{var n,i;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer)&&("elk"!==(null==(i=null==e?void 0:e.flowchart)?void 0:i.defaultRenderer)&&null!==t.match(/^\s*graph/))},Bo=(t,e)=>{var n,i;return"dagre-d3"!==(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer)&&("elk"!==(null==(i=null==e?void 0:e.flowchart)?void 0:i.defaultRenderer)&&(null!==t.match(/^\s*graph/)||null!==t.match(/^\s*flowchart/)))};let No,Do,Oo=0,Mo=gi(),Io={},Fo=[],$o={},Ro=[],Zo={},Po={},jo=0,Yo=!0,zo=[];const Uo=t=>jt.sanitizeText(t,Mo),Wo=function(t,e,n){Cp.parseDirective(this,t,e,n)},qo=function(t){const e=Object.keys(Io);for(const n of e)if(Io[n].id===t)return Io[n].domId;return t},Ho=function(t,e,n,i,r,a,s={}){let o,c=t;void 0!==c&&0!==c.trim().length&&(void 0===Io[c]&&(Io[c]={id:c,domId:"flowchart-"+c+"-"+Oo,styles:[],classes:[]}),Oo++,void 0!==e?(Mo=gi(),o=Uo(e.trim()),'"'===o[0]&&'"'===o[o.length-1]&&(o=o.substring(1,o.length-1)),Io[c].text=o):void 0===Io[c].text&&(Io[c].text=t),void 0!==n&&(Io[c].type=n),null!=i&&i.forEach((function(t){Io[c].styles.push(t)})),null!=r&&r.forEach((function(t){Io[c].classes.push(t)})),void 0!==a&&(Io[c].dir=a),void 0===Io[c].props?Io[c].props=s:void 0!==s&&Object.assign(Io[c].props,s))},Vo=function(t,e,n,i){const r={start:t,end:e,type:void 0,text:""};void 0!==(i=n.text)&&(r.text=Uo(i.trim()),'"'===r.text[0]&&'"'===r.text[r.text.length-1]&&(r.text=r.text.substring(1,r.text.length-1))),void 0!==n&&(r.type=n.type,r.stroke=n.stroke,r.length=n.length),Fo.push(r)},Go=function(t,e,n,i){let r,a;for(r=0;r<t.length;r++)for(a=0;a<e.length;a++)Vo(t[r],e[a],n,i)},Xo=function(t,e){t.forEach((function(t){"default"===t?Fo.defaultInterpolate=e:Fo[t].interpolate=e}))},Qo=function(t,e){t.forEach((function(t){"default"===t?Fo.defaultStyle=e:(-1===ai.isSubstringInArray("fill",e)&&e.push("fill:none"),Fo[t].style=e)}))},Ko=function(t,e){void 0===$o[t]&&($o[t]={id:t,styles:[],textStyles:[]}),null!=e&&e.forEach((function(e){if(e.match("color")){const n=e.replace("fill","bgFill").replace("color","fill");$o[t].textStyles.push(n)}$o[t].styles.push(e)}))},Jo=function(t){No=t,No.match(/.*</)&&(No="RL"),No.match(/.*\^/)&&(No="BT"),No.match(/.*>/)&&(No="LR"),No.match(/.*v/)&&(No="TB"),"TD"===No&&(No="TB")},tc=function(t,e){t.split(",").forEach((function(t){let n=t;void 0!==Io[n]&&Io[n].classes.push(e),void 0!==Zo[n]&&Zo[n].classes.push(e)}))},ec=function(t,e,n){t.split(",").forEach((function(t){void 0!==Io[t]&&(Io[t].link=ai.formatUrl(e,Mo),Io[t].linkTarget=n)})),tc(t,"clickable")},nc=function(t){return Po[t]},ic=function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){let i=qo(t);if("loose"!==gi().securityLevel)return;if(void 0===e)return;let r=[];if("string"==typeof n){r=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<r.length;t++){let e=r[t].trim();'"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substr(1,e.length-2)),r[t]=e}}0===r.length&&r.push(t),void 0!==Io[t]&&(Io[t].haveCallback=!0,zo.push((function(){const t=document.querySelector(`[id="${i}"]`);null!==t&&t.addEventListener("click",(function(){ai.runFunc(e,...r)}),!1)})))}(t,e,n)})),tc(t,"clickable")},rc=function(t){zo.forEach((function(e){e(t)}))},ac=function(){return No.trim()},sc=function(){return Io},oc=function(){return Fo},cc=function(){return $o},lc=function(t){let e=(0,o.Ys)(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=(0,o.Ys)("body").append("div").attr("class","mermaidTooltip").style("opacity",0));(0,o.Ys)(t).select("svg").selectAll("g.node").on("mouseover",(function(){const t=(0,o.Ys)(this);if(null===t.attr("title"))return;const n=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(t.attr("title")).style("left",window.scrollX+n.left+(n.right-n.left)/2+"px").style("top",window.scrollY+n.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),t.classed("hover",!0)})).on("mouseout",(function(){e.transition().duration(500).style("opacity",0);(0,o.Ys)(this).classed("hover",!1)}))};zo.push(lc);const hc=function(t="gen-1"){Io={},$o={},Fo=[],zo=[lc],Ro=[],Zo={},jo=0,Po=[],Yo=!0,Do=t,Yi()},uc=t=>{Do=t||"gen-2"},dc=function(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"},pc=function(t,e,n){let i=t.trim(),r=n;t===n&&n.match(/\s/)&&(i=void 0);let a=[];const{nodeList:s,dir:o}=function(t){const e={boolean:{},number:{},string:{}},n=[];let i;return{nodeList:t.filter((function(t){const r=typeof t;return t.stmt&&"dir"===t.stmt?(i=t.value,!1):""!==t.trim()&&(r in e?!e[r].hasOwnProperty(t)&&(e[r][t]=!0):!n.includes(t)&&n.push(t))})),dir:i}}(a.concat.apply(a,e));if(a=s,"gen-1"===Do)for(let l=0;l<a.length;l++)a[l]=qo(a[l]);i=i||"subGraph"+jo,r=r||"",r=Uo(r),jo+=1;const c={id:i,nodes:a,title:r.trim(),classes:[],dir:o};return Bt.info("Adding",c.id,c.nodes,c.dir),c.nodes=Cc(c,Ro).nodes,Ro.push(c),Zo[i]=c,i},fc=function(t){for(const[e,n]of Ro.entries())if(n.id===t)return e;return-1};let gc=-1;const yc=[],mc=function(t,e){const n=Ro[e].nodes;if(gc+=1,gc>2e3)return;if(yc[gc]=e,Ro[e].id===t)return{result:!0,count:0};let i=0,r=1;for(;i<n.length;){const e=fc(n[i]);if(e>=0){const n=mc(t,e);if(n.result)return{result:!0,count:r+n.count};r+=n.count}i+=1}return{result:!1,count:r}},bc=function(t){return yc[t]},_c=function(){gc=-1,Ro.length>0&&mc("none",Ro.length-1)},xc=function(){return Ro},vc=()=>!!Yo&&(Yo=!1,!0),kc=(t,e)=>{const n=(t=>{const e=t.trim();let n=e.slice(0,-1),i="arrow_open";switch(e.slice(-1)){case"x":i="arrow_cross","x"===e[0]&&(i="double_"+i,n=n.slice(1));break;case">":i="arrow_point","<"===e[0]&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle","o"===e[0]&&(i="double_"+i,n=n.slice(1))}let r="normal",a=n.length-1;"="===n[0]&&(r="thick");let s=((t,e)=>{const n=e.length;let i=0;for(let r=0;r<n;++r)e[r]===t&&++i;return i})(".",n);return s&&(r="dotted",a=s),{type:i,stroke:r,length:a}})(t);let i;if(e){if(i=(t=>{let e=t.trim(),n="arrow_open";switch(e[0]){case"<":n="arrow_point",e=e.slice(1);break;case"x":n="arrow_cross",e=e.slice(1);break;case"o":n="arrow_circle",e=e.slice(1)}let i="normal";return e.includes("=")&&(i="thick"),e.includes(".")&&(i="dotted"),{type:n,stroke:i}})(e),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if("arrow_open"===i.type)i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return"double_arrow"===i.type&&(i.type="double_arrow_point"),i.length=n.length,i}return n},wc=(t,e)=>{let n=!1;return t.forEach((t=>{t.nodes.indexOf(e)>=0&&(n=!0)})),n},Cc=(t,e)=>{const n=[];return t.nodes.forEach(((i,r)=>{wc(e,i)||n.push(t.nodes[r])})),{nodes:n}},Tc={firstGraph:vc},Ec={parseDirective:Wo,defaultConfig:()=>oi.flowchart,setAccTitle:zi,getAccTitle:Ui,getAccDescription:qi,setAccDescription:Wi,addVertex:Ho,lookUpDomId:qo,addLink:Go,updateLinkInterpolate:Xo,updateLink:Qo,addClass:Ko,setDirection:Jo,setClass:tc,setTooltip:function(t,e){t.split(",").forEach((function(t){void 0!==e&&(Po["gen-1"===Do?qo(t):t]=Uo(e))}))},getTooltip:nc,setClickEvent:ic,setLink:ec,bindFunctions:rc,getDirection:ac,getVertices:sc,getEdges:oc,getClasses:cc,clear:hc,setGen:uc,defaultStyle:dc,addSubGraph:pc,getDepthFirstPos:bc,indexNodes:_c,getSubGraphs:xc,destructLink:kc,lex:Tc,exists:wc,makeUniq:Cc,setDiagramTitle:Hi,getDiagramTitle:Vi},Sc=Object.freeze(Object.defineProperty({__proto__:null,addClass:Ko,addLink:Go,addSingleLink:Vo,addSubGraph:pc,addVertex:Ho,bindFunctions:rc,clear:hc,default:Ec,defaultStyle:dc,destructLink:kc,firstGraph:vc,getClasses:cc,getDepthFirstPos:bc,getDirection:ac,getEdges:oc,getSubGraphs:xc,getTooltip:nc,getVertices:sc,indexNodes:_c,lex:Tc,lookUpDomId:qo,parseDirective:Wo,setClass:tc,setClickEvent:ic,setDirection:Jo,setGen:uc,setLink:ec,updateLink:Qo,updateLinkInterpolate:Xo},Symbol.toStringTag,{value:"Module"}));const Ac={},Lc=function(t){const e=Object.keys(t);for(const n of e)Ac[n]=t[n]},Bc={},Nc=function(t,e,n,i,r,a){const s=i.select(`[id="${n}"]`);Object.keys(t).forEach((function(n){const i=t[n];let o="default";i.classes.length>0&&(o=i.classes.join(" "));const c=Un(i.styles);let l,h=void 0!==i.text?i.text:i.id;if(Zt(gi().flowchart.htmlLabels)){const t={label:h.replace(/fa[blrs]?:fa-[\w-]+/g,(t=>`<i class='${t.replace(":"," ")}'></i>`))};l=(0,vt.a)(s,t).node(),l.parentNode.removeChild(l)}else{const t=r.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",c.labelStyle.replace("color:","fill:"));const e=h.split(jt.lineBreakRegex);for(const n of e){const e=r.createElementNS("http://www.w3.org/2000/svg","tspan");e.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),e.setAttribute("dy","1em"),e.setAttribute("x","1"),e.textContent=n,t.appendChild(e)}l=t}let u=0,d="";switch(i.type){case"round":u=5,d="rect";break;case"square":case"group":default:d="rect";break;case"diamond":d="question";break;case"hexagon":d="hexagon";break;case"odd":case"odd_right":d="rect_left_inv_arrow";break;case"lean_right":d="lean_right";break;case"lean_left":d="lean_left";break;case"trapezoid":d="trapezoid";break;case"inv_trapezoid":d="inv_trapezoid";break;case"circle":d="circle";break;case"ellipse":d="ellipse";break;case"stadium":d="stadium";break;case"subroutine":d="subroutine";break;case"cylinder":d="cylinder";break;case"doublecircle":d="doublecircle"}e.setNode(i.id,{labelStyle:c.labelStyle,shape:d,labelText:h,rx:u,ry:u,class:o,style:c.style,id:i.id,link:i.link,linkTarget:i.linkTarget,tooltip:a.db.getTooltip(i.id)||"",domId:a.db.lookUpDomId(i.id),haveCallback:i.haveCallback,width:"group"===i.type?500:void 0,dir:i.dir,type:i.type,props:i.props,padding:gi().flowchart.padding}),Bt.info("setNode",{labelStyle:c.labelStyle,shape:d,labelText:h,rx:u,ry:u,class:o,style:c.style,id:i.id,domId:a.db.lookUpDomId(i.id),width:"group"===i.type?500:void 0,type:i.type,dir:i.dir,props:i.props,padding:gi().flowchart.padding})}))},Dc=function(t,e,n){Bt.info("abc78 edges = ",t);let i,r,a=0,s={};if(void 0!==t.defaultStyle){const e=Un(t.defaultStyle);i=e.style,r=e.labelStyle}t.forEach((function(n){a++;var c="L-"+n.start+"-"+n.end;void 0===s[c]?(s[c]=0,Bt.info("abc78 new entry",c,s[c])):(s[c]++,Bt.info("abc78 new entry",c,s[c]));let l=c+"-"+s[c];Bt.info("abc78 new link id to be used is",c,l,s[c]);var h="LS-"+n.start,u="LE-"+n.end;const d={style:"",labelStyle:""};switch(d.minlen=n.length||1,"arrow_open"===n.type?d.arrowhead="none":d.arrowhead="normal",d.arrowTypeStart="arrow_open",d.arrowTypeEnd="arrow_open",n.type){case"double_arrow_cross":d.arrowTypeStart="arrow_cross";case"arrow_cross":d.arrowTypeEnd="arrow_cross";break;case"double_arrow_point":d.arrowTypeStart="arrow_point";case"arrow_point":d.arrowTypeEnd="arrow_point";break;case"double_arrow_circle":d.arrowTypeStart="arrow_circle";case"arrow_circle":d.arrowTypeEnd="arrow_circle"}let p="",f="";switch(n.stroke){case"normal":p="fill:none;",void 0!==i&&(p=i),void 0!==r&&(f=r),d.thickness="normal",d.pattern="solid";break;case"dotted":d.thickness="normal",d.pattern="dotted",d.style="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":d.thickness="thick",d.pattern="solid",d.style="stroke-width: 3.5px;fill:none;"}if(void 0!==n.style){const t=Un(n.style);p=t.style,f=t.labelStyle}d.style=d.style+=p,d.labelStyle=d.labelStyle+=f,void 0!==n.interpolate?d.curve=Yn(n.interpolate,o.c_6):void 0!==t.defaultInterpolate?d.curve=Yn(t.defaultInterpolate,o.c_6):d.curve=Yn(Bc.curve,o.c_6),void 0===n.text?void 0!==n.style&&(d.arrowheadStyle="fill: #333"):(d.arrowheadStyle="fill: #333",d.labelpos="c"),d.labelType="text",d.label=n.text.replace(jt.lineBreakRegex,"\n"),void 0===n.style&&(d.style=d.style||"stroke: #333; stroke-width: 1.5px;fill:none;"),d.labelStyle=d.labelStyle.replace("color:","fill:"),d.id=l,d.classes="flowchart-link "+h+" "+u,e.setEdge(n.start,n.end,d,a)}))},Oc={setConf:function(t){const e=Object.keys(t);for(const n of e)Bc[n]=t[n]},addVertices:Nc,addEdges:Dc,getClasses:function(t,e){Bt.info("Extracting classes"),e.db.clear();try{return e.parse(t),e.db.getClasses()}catch(n){return}},draw:function(t,e,n,i){Bt.info("Drawing flowchart"),i.db.clear(),Ec.setGen("gen-2"),i.parser.parse(t);let r=i.db.getDirection();void 0===r&&(r="TD");const{securityLevel:a,flowchart:s}=gi(),c=s.nodeSpacing||50,l=s.rankSpacing||50;let h;"sandbox"===a&&(h=(0,o.Ys)("#i"+e));const u="sandbox"===a?(0,o.Ys)(h.nodes()[0].contentDocument.body):(0,o.Ys)("body"),d="sandbox"===a?h.nodes()[0].contentDocument:document,p=new lt.k({multigraph:!0,compound:!0}).setGraph({rankdir:r,nodesep:c,ranksep:l,marginx:0,marginy:0}).setDefaultEdgeLabel((function(){return{}}));let f;const g=i.db.getSubGraphs();Bt.info("Subgraphs - ",g);for(let o=g.length-1;o>=0;o--)f=g[o],Bt.info("Subgraph - ",f),i.db.addVertex(f.id,f.title,"group",void 0,f.classes,f.dir);const y=i.db.getVertices(),m=i.db.getEdges();Bt.info("Edges",m);let b=0;for(b=g.length-1;b>=0;b--){f=g[b],(0,o.td_)("cluster").append("text");for(let t=0;t<f.nodes.length;t++)Bt.info("Setting up subgraphs",f.nodes[t],f.id),p.setParent(f.nodes[t],f.id)}Nc(y,p,e,u,d,i),Dc(m,p);const _=u.select(`[id="${e}"]`),x=u.select("#"+e+" g");if(no(x,p,["point","circle","cross"],"flowchart",e),ai.insertTitle(_,"flowchartTitleText",s.titleTopMargin,i.db.getDiagramTitle()),wi(p,_,s.diagramPadding,s.useMaxWidth),i.db.indexNodes("subGraph"+b),!s.htmlLabels){const t=d.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const e of t){const t=e.getBBox(),n=d.createElementNS("http://www.w3.org/2000/svg","rect");n.setAttribute("rx",0),n.setAttribute("ry",0),n.setAttribute("width",t.width),n.setAttribute("height",t.height),e.insertBefore(n,e.firstChild)}}Object.keys(y).forEach((function(t){const n=y[t];if(n.link){const i=(0,o.Ys)("#"+e+' [id="'+t+'"]');if(i){const t=d.createElementNS("http://www.w3.org/2000/svg","a");t.setAttributeNS("http://www.w3.org/2000/svg","class",n.classes.join(" ")),t.setAttributeNS("http://www.w3.org/2000/svg","href",n.link),t.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),"sandbox"===a?t.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):n.linkTarget&&t.setAttributeNS("http://www.w3.org/2000/svg","target",n.linkTarget);const e=i.insert((function(){return t}),":first-child"),r=i.select(".label-container");r&&e.append((function(){return r.node()}));const s=i.select(".label");s&&e.append((function(){return s.node()}))}}}))}};var Mc=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,5],r=[7,9,11,12,13,14,15,16,17,18,19,20,21,23,25,26,28,35,40],a=[1,15],s=[1,16],o=[1,17],c=[1,18],l=[1,19],h=[1,20],u=[1,21],d=[1,22],p=[1,23],f=[1,24],g=[1,25],y=[1,26],m=[1,27],b=[1,29],_=[1,31],x=[1,34],v=[5,7,9,11,12,13,14,15,16,17,18,19,20,21,23,25,26,28,35,40],k={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,gantt:5,document:6,EOF:7,line:8,SPACE:9,statement:10,NL:11,dateFormat:12,inclusiveEndDates:13,topAxis:14,axisFormat:15,tickInterval:16,excludes:17,includes:18,todayMarker:19,title:20,acc_title:21,acc_title_value:22,acc_descr:23,acc_descr_value:24,acc_descr_multiline_value:25,section:26,clickStatement:27,taskTxt:28,taskData:29,openDirective:30,typeDirective:31,closeDirective:32,":":33,argDirective:34,click:35,callbackname:36,callbackargs:37,href:38,clickStatementDebug:39,open_directive:40,type_directive:41,arg_directive:42,close_directive:43,$accept:0,$end:1},terminals_:{2:"error",5:"gantt",7:"EOF",9:"SPACE",11:"NL",12:"dateFormat",13:"inclusiveEndDates",14:"topAxis",15:"axisFormat",16:"tickInterval",17:"excludes",18:"includes",19:"todayMarker",20:"title",21:"acc_title",22:"acc_title_value",23:"acc_descr",24:"acc_descr_value",25:"acc_descr_multiline_value",26:"section",28:"taskTxt",29:"taskData",33:":",35:"click",36:"callbackname",37:"callbackargs",38:"href",40:"open_directive",41:"type_directive",42:"arg_directive",43:"close_directive"},productions_:[0,[3,2],[3,3],[6,0],[6,2],[8,2],[8,1],[8,1],[8,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[10,1],[10,1],[10,2],[10,1],[4,4],[4,6],[27,2],[27,3],[27,3],[27,4],[27,3],[27,4],[27,2],[39,2],[39,3],[39,3],[39,4],[39,3],[39,4],[39,2],[30,1],[31,1],[34,1],[32,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 2:return a[o-1];case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:this.$=a[o];break;case 9:i.setDateFormat(a[o].substr(11)),this.$=a[o].substr(11);break;case 10:i.enableInclusiveEndDates(),this.$=a[o].substr(18);break;case 11:i.TopAxis(),this.$=a[o].substr(8);break;case 12:i.setAxisFormat(a[o].substr(11)),this.$=a[o].substr(11);break;case 13:i.setTickInterval(a[o].substr(13)),this.$=a[o].substr(13);break;case 14:i.setExcludes(a[o].substr(9)),this.$=a[o].substr(9);break;case 15:i.setIncludes(a[o].substr(9)),this.$=a[o].substr(9);break;case 16:i.setTodayMarker(a[o].substr(12)),this.$=a[o].substr(12);break;case 17:i.setDiagramTitle(a[o].substr(6)),this.$=a[o].substr(6);break;case 18:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 19:case 20:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 21:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 23:i.addTask(a[o-1],a[o]),this.$="task";break;case 27:this.$=a[o-1],i.setClickEvent(a[o-1],a[o],null);break;case 28:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],a[o]);break;case 29:this.$=a[o-2],i.setClickEvent(a[o-2],a[o-1],null),i.setLink(a[o-2],a[o]);break;case 30:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-2],a[o-1]),i.setLink(a[o-3],a[o]);break;case 31:this.$=a[o-2],i.setClickEvent(a[o-2],a[o],null),i.setLink(a[o-2],a[o-1]);break;case 32:this.$=a[o-3],i.setClickEvent(a[o-3],a[o-1],a[o]),i.setLink(a[o-3],a[o-2]);break;case 33:this.$=a[o-1],i.setLink(a[o-1],a[o]);break;case 34:case 40:this.$=a[o-1]+" "+a[o];break;case 35:case 36:case 38:this.$=a[o-2]+" "+a[o-1]+" "+a[o];break;case 37:case 39:this.$=a[o-3]+" "+a[o-2]+" "+a[o-1]+" "+a[o];break;case 41:i.parseDirective("%%{","open_directive");break;case 42:i.parseDirective(a[o],"type_directive");break;case 43:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 44:i.parseDirective("}%%","close_directive","gantt")}},table:[{3:1,4:2,5:n,30:4,40:i},{1:[3]},{3:6,4:2,5:n,30:4,40:i},e(r,[2,3],{6:7}),{31:8,41:[1,9]},{41:[2,41]},{1:[2,1]},{4:30,7:[1,10],8:11,9:[1,12],10:13,11:[1,14],12:a,13:s,14:o,15:c,16:l,17:h,18:u,19:d,20:p,21:f,23:g,25:y,26:m,27:28,28:b,30:4,35:_,40:i},{32:32,33:[1,33],43:x},e([33,43],[2,42]),e(r,[2,8],{1:[2,2]}),e(r,[2,4]),{4:30,10:35,12:a,13:s,14:o,15:c,16:l,17:h,18:u,19:d,20:p,21:f,23:g,25:y,26:m,27:28,28:b,30:4,35:_,40:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,9]),e(r,[2,10]),e(r,[2,11]),e(r,[2,12]),e(r,[2,13]),e(r,[2,14]),e(r,[2,15]),e(r,[2,16]),e(r,[2,17]),{22:[1,36]},{24:[1,37]},e(r,[2,20]),e(r,[2,21]),e(r,[2,22]),{29:[1,38]},e(r,[2,24]),{36:[1,39],38:[1,40]},{11:[1,41]},{34:42,42:[1,43]},{11:[2,44]},e(r,[2,5]),e(r,[2,18]),e(r,[2,19]),e(r,[2,23]),e(r,[2,27],{37:[1,44],38:[1,45]}),e(r,[2,33],{36:[1,46]}),e(v,[2,25]),{32:47,43:x},{43:[2,43]},e(r,[2,28],{38:[1,48]}),e(r,[2,29]),e(r,[2,31],{37:[1,49]}),{11:[1,50]},e(r,[2,30]),e(r,[2,32]),e(v,[2,26])],defaultActions:{5:[2,41],6:[2,1],34:[2,44],43:[2,43]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},w=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),40;case 1:return this.begin("type_directive"),41;case 2:return this.popState(),this.begin("arg_directive"),33;case 3:return this.popState(),this.popState(),43;case 4:return 42;case 5:return this.begin("acc_title"),21;case 6:return this.popState(),"acc_title_value";case 7:return this.begin("acc_descr"),23;case 8:return this.popState(),"acc_descr_value";case 9:this.begin("acc_descr_multiline");break;case 10:case 20:case 23:case 26:case 29:this.popState();break;case 11:return"acc_descr_multiline_value";case 12:case 13:case 14:case 16:case 17:case 18:break;case 15:return 11;case 19:this.begin("href");break;case 21:return 38;case 22:this.begin("callbackname");break;case 24:this.popState(),this.begin("callbackargs");break;case 25:return 36;case 27:return 37;case 28:this.begin("click");break;case 30:return 35;case 31:return 5;case 32:return 12;case 33:return 13;case 34:return 14;case 35:return 15;case 36:return 16;case 37:return 18;case 38:return 17;case 39:return 19;case 40:return"date";case 41:return 20;case 42:return"accDescription";case 43:return 26;case 44:return 28;case 45:return 29;case 46:return 33;case 47:return 7;case 48:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[10,11],inclusive:!1},acc_descr:{rules:[8],inclusive:!1},acc_title:{rules:[6],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},callbackargs:{rules:[26,27],inclusive:!1},callbackname:{rules:[23,24,25],inclusive:!1},href:{rules:[20,21],inclusive:!1},click:{rules:[29,30],inclusive:!1},INITIAL:{rules:[0,5,7,9,12,13,14,15,16,17,18,19,22,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],inclusive:!0}}},t);function C(){this.yy={}}return k.lexer=w,C.prototype=k,k.Parser=C,new C}();Mc.parser=Mc;const Ic=Mc,Fc=t=>null!==t.match(/^\s*gantt/);a().extend(wt()),a().extend(Tt()),a().extend(St());let $c,Rc="",Zc="",Pc="",jc=[],Yc=[],zc={},Uc=[],Wc=[],qc="";const Hc=["active","done","crit","milestone"];let Vc=[],Gc=!1,Xc=!1,Qc=0;const Kc=function(t,e,n,i){return!i.includes(t.format(e.trim()))&&(!!(t.isoWeekday()>=6&&n.includes("weekends"))||(!!n.includes(t.format("dddd").toLowerCase())||n.includes(t.format(e.trim()))))},Jc=function(t,e,n,i){if(!n.length||t.manualEndTime)return;let r,s;r=t.startTime instanceof Date?a()(t.startTime):a()(t.startTime,e,!0),r=r.add(1,"d"),s=t.endTime instanceof Date?a()(t.endTime):a()(t.endTime,e,!0);const[o,c]=tl(r,s,e,n,i);t.endTime=o.toDate(),t.renderEndTime=c},tl=function(t,e,n,i,r){let a=!1,s=null;for(;t<=e;)a||(s=e.toDate()),a=Kc(t,n,i,r),a&&(e=e.add(1,"d")),t=t.add(1,"d");return[e,s]},el=function(t,e,n){n=n.trim();const i=/^after\s+([\d\w- ]+)/.exec(n.trim());if(null!==i){let t=null;if(i[1].split(" ").forEach((function(e){let n=hl(e);void 0!==n&&(t?n.endTime>t.endTime&&(t=n):t=n)})),t)return t.endTime;{const t=new Date;return t.setHours(0,0,0,0),t}}let r=a()(n,e.trim(),!0);if(r.isValid())return r.toDate();{Bt.debug("Invalid date:"+n),Bt.debug("With date format:"+e.trim());const t=new Date(n);if(void 0===t||isNaN(t.getTime()))throw new Error("Invalid date:"+n);return t}},nl=function(t){const e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return null!==e?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},il=function(t,e,n,i=!1){n=n.trim();let r=a()(n,e.trim(),!0);if(r.isValid())return i&&(r=r.add(1,"d")),r.toDate();let s=a()(t);const[o,c]=nl(n);if(!Number.isNaN(o)){const t=s.add(o,c);t.isValid()&&(s=t)}return s.toDate()};let rl=0;const al=function(t){return void 0===t?(rl+=1,"task"+rl):t};let sl,ol,cl=[];const ll={},hl=function(t){const e=ll[t];return cl[e]},ul=function(){const t=function(t){const e=cl[t];let n="";switch(cl[t].raw.startTime.type){case"prevTaskEnd":{const t=hl(e.prevTaskId);e.startTime=t.endTime;break}case"getStartDate":n=el(0,Rc,cl[t].raw.startTime.startData),n&&(cl[t].startTime=n)}return cl[t].startTime&&(cl[t].endTime=il(cl[t].startTime,Rc,cl[t].raw.endTime.data,Gc),cl[t].endTime&&(cl[t].processed=!0,cl[t].manualEndTime=a()(cl[t].raw.endTime.data,"YYYY-MM-DD",!0).isValid(),Jc(cl[t],Rc,Yc,jc))),cl[t].processed};let e=!0;for(const[n,i]of cl.entries())t(n),e=e&&i.processed;return e},dl=function(t,e){t.split(",").forEach((function(t){let n=hl(t);void 0!==n&&n.classes.push(e)}))},pl=function(t,e){Vc.push((function(){const n=document.querySelector(`[id="${t}"]`);null!==n&&n.addEventListener("click",(function(){e()}))}),(function(){const n=document.querySelector(`[id="${t}-text"]`);null!==n&&n.addEventListener("click",(function(){e()}))}))},fl={parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().gantt,clear:function(){Uc=[],Wc=[],qc="",Vc=[],rl=0,sl=void 0,ol=void 0,cl=[],Rc="",Zc="",$c=void 0,Pc="",jc=[],Yc=[],Gc=!1,Xc=!1,Qc=0,zc={},Yi()},setDateFormat:function(t){Rc=t},getDateFormat:function(){return Rc},enableInclusiveEndDates:function(){Gc=!0},endDatesAreInclusive:function(){return Gc},enableTopAxis:function(){Xc=!0},topAxisEnabled:function(){return Xc},setAxisFormat:function(t){Zc=t},getAxisFormat:function(){return Zc},setTickInterval:function(t){$c=t},getTickInterval:function(){return $c},setTodayMarker:function(t){Pc=t},getTodayMarker:function(){return Pc},setAccTitle:zi,getAccTitle:Ui,setDiagramTitle:Hi,getDiagramTitle:Vi,setAccDescription:Wi,getAccDescription:qi,addSection:function(t){qc=t,Uc.push(t)},getSections:function(){return Uc},getTasks:function(){let t=ul();let e=0;for(;!t&&e<10;)t=ul(),e++;return Wc=cl,Wc},addTask:function(t,e){const n={section:qc,type:qc,processed:!1,manualEndTime:!1,renderEndTime:null,raw:{data:e},task:t,classes:[]},i=function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),r={};gl(i,r,Hc);for(let a=0;a<i.length;a++)i[a]=i[a].trim();switch(i.length){case 1:r.id=al(),r.startTime={type:"prevTaskEnd",id:t},r.endTime={data:i[0]};break;case 2:r.id=al(),r.startTime={type:"getStartDate",startData:i[0]},r.endTime={data:i[1]};break;case 3:r.id=al(i[0]),r.startTime={type:"getStartDate",startData:i[1]},r.endTime={data:i[2]}}return r}(ol,e);n.raw.startTime=i.startTime,n.raw.endTime=i.endTime,n.id=i.id,n.prevTaskId=ol,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,n.order=Qc,Qc++;const r=cl.push(n);ol=n.id,ll[n.id]=r-1},findTaskById:hl,addTaskOrg:function(t,e){const n={section:qc,type:qc,description:t,task:t,classes:[]},i=function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),r={};gl(i,r,Hc);for(let a=0;a<i.length;a++)i[a]=i[a].trim();let s="";switch(i.length){case 1:r.id=al(),r.startTime=t.endTime,s=i[0];break;case 2:r.id=al(),r.startTime=el(0,Rc,i[0]),s=i[1];break;case 3:r.id=al(i[0]),r.startTime=el(0,Rc,i[1]),s=i[2]}return s&&(r.endTime=il(r.startTime,Rc,s,Gc),r.manualEndTime=a()(s,"YYYY-MM-DD",!0).isValid(),Jc(r,Rc,Yc,jc)),r}(sl,e);n.startTime=i.startTime,n.endTime=i.endTime,n.id=i.id,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,sl=n,Wc.push(n)},setIncludes:function(t){jc=t.toLowerCase().split(/[\s,]+/)},getIncludes:function(){return jc},setExcludes:function(t){Yc=t.toLowerCase().split(/[\s,]+/)},getExcludes:function(){return Yc},setClickEvent:function(t,e,n){t.split(",").forEach((function(t){!function(t,e,n){if("loose"!==gi().securityLevel)return;if(void 0===e)return;let i=[];if("string"==typeof n){i=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<i.length;t++){let e=i[t].trim();'"'===e.charAt(0)&&'"'===e.charAt(e.length-1)&&(e=e.substr(1,e.length-2)),i[t]=e}}0===i.length&&i.push(t),void 0!==hl(t)&&pl(t,(()=>{ai.runFunc(e,...i)}))}(t,e,n)})),dl(t,"clickable")},setLink:function(t,e){let n=e;"loose"!==gi().securityLevel&&(n=(0,s.Nm)(e)),t.split(",").forEach((function(t){void 0!==hl(t)&&(pl(t,(()=>{window.open(n,"_self")})),zc[t]=n)})),dl(t,"clickable")},getLinks:function(){return zc},bindFunctions:function(t){Vc.forEach((function(e){e(t)}))},parseDuration:nl,isInvalidDate:Kc};function gl(t,e,n){let i=!0;for(;i;)i=!1,n.forEach((function(n){const r=new RegExp("^\\s*"+n+"\\s*$");t[0].match(r)&&(e[n]=!0,t.shift(1),i=!0)}))}let yl;const ml={setConf:function(){Bt.debug("Something is calling, setConf, remove the call")},draw:function(t,e,n,i){const r=gi().gantt,s=gi().securityLevel;let c;"sandbox"===s&&(c=(0,o.Ys)("#i"+e));const l="sandbox"===s?(0,o.Ys)(c.nodes()[0].contentDocument.body):(0,o.Ys)("body"),h="sandbox"===s?c.nodes()[0].contentDocument:document,u=h.getElementById(e);yl=u.parentElement.offsetWidth,void 0===yl&&(yl=1200),void 0!==r.useWidth&&(yl=r.useWidth);const d=i.db.getTasks(),p=d.length*(r.barHeight+r.barGap)+2*r.topPadding;u.setAttribute("viewBox","0 0 "+yl+" "+p);const f=l.select(`[id="${e}"]`),g=(0,o.Xf)().domain([(0,o.VV$)(d,(function(t){return t.startTime})),(0,o.Fp7)(d,(function(t){return t.endTime}))]).rangeRound([0,yl-r.leftPadding-r.rightPadding]);let y=[];for(const a of d)y.push(a.type);const m=y;function b(t,e){return function(t){let e=t.length;const n={};for(;e;)n[t[--e]]=(n[t[e]]||0)+1;return n}(e)[t]||0}y=function(t){const e={},n=[];for(let i=0,r=t.length;i<r;++i)Object.prototype.hasOwnProperty.call(e,t[i])||(e[t[i]]=!0,n.push(t[i]));return n}(y),d.sort((function(t,e){const n=t.startTime,i=e.startTime;let r=0;return n>i?r=1:n<i&&(r=-1),r})),function(t,n,s){const c=r.barHeight,l=c+r.barGap,u=r.topPadding,d=r.leftPadding;(0,o.BYU)().domain([0,y.length]).range(["#00B9FA","#F95002"]).interpolate(o.JHv);(function(t,e,n,s,o,c,l,h){const u=c.reduce(((t,{startTime:e})=>t?Math.min(t,e):e),0),d=c.reduce(((t,{endTime:e})=>t?Math.max(t,e):e),0),p=i.db.getDateFormat();if(!u||!d)return;const y=[];let m=null,b=a()(u);for(;b.valueOf()<=d;)i.db.isInvalidDate(b,p,l,h)?m?m.end=b:m={start:b,end:b}:m&&(y.push(m),m=null),b=b.add(1,"d");f.append("g").selectAll("rect").data(y).enter().append("rect").attr("id",(function(t){return"exclude-"+t.start.format("YYYY-MM-DD")})).attr("x",(function(t){return g(t.start)+n})).attr("y",r.gridLineStartPadding).attr("width",(function(t){const e=t.end.add(1,"day");return g(e)-g(t.start)})).attr("height",o-e-r.gridLineStartPadding).attr("transform-origin",(function(e,i){return(g(e.start)+n+.5*(g(e.end)-g(e.start))).toString()+"px "+(i*t+.5*o).toString()+"px"})).attr("class","exclude-range")})(l,u,d,0,s,t,i.db.getExcludes(),i.db.getIncludes()),function(t,e,n,a){let s=(0,o.LLu)(g).tickSize(-a+e+r.gridLineStartPadding).tickFormat((0,o.i$Z)(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));const c=/^([1-9]\d*)(minute|hour|day|week|month)$/.exec(i.db.getTickInterval()||r.tickInterval);if(null!==c){const t=c[1];switch(c[2]){case"minute":s.ticks(o.Z_i.every(t));break;case"hour":s.ticks(o.WQD.every(t));break;case"day":s.ticks(o.rr1.every(t));break;case"week":s.ticks(o.NGh.every(t));break;case"month":s.ticks(o.F0B.every(t))}}if(f.append("g").attr("class","grid").attr("transform","translate("+t+", "+(a-50)+")").call(s).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),i.db.topAxisEnabled()||r.topAxis){let n=(0,o.F5q)(g).tickSize(-a+e+r.gridLineStartPadding).tickFormat((0,o.i$Z)(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));if(null!==c){const t=c[1];switch(c[2]){case"minute":n.ticks(o.Z_i.every(t));break;case"hour":n.ticks(o.WQD.every(t));break;case"day":n.ticks(o.rr1.every(t));break;case"week":n.ticks(o.NGh.every(t));break;case"month":n.ticks(o.F0B.every(t))}}f.append("g").attr("class","grid").attr("transform","translate("+t+", "+e+")").call(n).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}(d,u,0,s),function(t,n,a,s,c,l,h){f.append("g").selectAll("rect").data(t).enter().append("rect").attr("x",0).attr("y",(function(t,e){return t.order*n+a-2})).attr("width",(function(){return h-r.rightPadding/2})).attr("height",n).attr("class",(function(t){for(const[e,n]of y.entries())if(t.type===n)return"section section"+e%r.numberSectionStyles;return"section section0"}));const u=f.append("g").selectAll("rect").data(t).enter(),d=i.db.getLinks();u.append("rect").attr("id",(function(t){return t.id})).attr("rx",3).attr("ry",3).attr("x",(function(t){return t.milestone?g(t.startTime)+s+.5*(g(t.endTime)-g(t.startTime))-.5*c:g(t.startTime)+s})).attr("y",(function(t,e){return t.order*n+a})).attr("width",(function(t){return t.milestone?c:g(t.renderEndTime||t.endTime)-g(t.startTime)})).attr("height",c).attr("transform-origin",(function(t,e){return e=t.order,(g(t.startTime)+s+.5*(g(t.endTime)-g(t.startTime))).toString()+"px "+(e*n+a+.5*c).toString()+"px"})).attr("class",(function(t){const e="task";let n="";t.classes.length>0&&(n=t.classes.join(" "));let i=0;for(const[s,o]of y.entries())t.type===o&&(i=s%r.numberSectionStyles);let a="";return t.active?t.crit?a+=" activeCrit":a=" active":t.done?a=t.crit?" doneCrit":" done":t.crit&&(a+=" crit"),0===a.length&&(a=" task"),t.milestone&&(a=" milestone "+a),a+=i,a+=" "+n,e+a})),u.append("text").attr("id",(function(t){return t.id+"-text"})).text((function(t){return t.task})).attr("font-size",r.fontSize).attr("x",(function(t){let e=g(t.startTime),n=g(t.renderEndTime||t.endTime);t.milestone&&(e+=.5*(g(t.endTime)-g(t.startTime))-.5*c),t.milestone&&(n=e+c);const i=this.getBBox().width;return i>n-e?n+i+1.5*r.leftPadding>h?e+s-5:n+s+5:(n-e)/2+e+s})).attr("y",(function(t,e){return t.order*n+r.barHeight/2+(r.fontSize/2-2)+a})).attr("text-height",c).attr("class",(function(t){const e=g(t.startTime);let n=g(t.endTime);t.milestone&&(n=e+c);const i=this.getBBox().width;let a="";t.classes.length>0&&(a=t.classes.join(" "));let s=0;for(const[c,l]of y.entries())t.type===l&&(s=c%r.numberSectionStyles);let o="";return t.active&&(o=t.crit?"activeCritText"+s:"activeText"+s),t.done?o=t.crit?o+" doneCritText"+s:o+" doneText"+s:t.crit&&(o=o+" critText"+s),t.milestone&&(o+=" milestoneText"),i>n-e?n+i+1.5*r.leftPadding>h?a+" taskTextOutsideLeft taskTextOutside"+s+" "+o:a+" taskTextOutsideRight taskTextOutside"+s+" "+o+" width-"+i:a+" taskText taskText"+s+" "+o+" width-"+i}));if("sandbox"===gi().securityLevel){let t;t=(0,o.Ys)("#i"+e);const n=t.nodes()[0].contentDocument;u.filter((function(t){return void 0!==d[t.id]})).each((function(t){var e=n.querySelector("#"+t.id),i=n.querySelector("#"+t.id+"-text");const r=e.parentNode;var a=n.createElement("a");a.setAttribute("xlink:href",d[t.id]),a.setAttribute("target","_top"),r.appendChild(a),a.appendChild(e),a.appendChild(i)}))}}(t,l,u,d,c,0,n),function(t,e){const n=[];let i=0;for(const[r,a]of y.entries())n[r]=[a,b(a,m)];f.append("g").selectAll("text").data(n).enter().append((function(t){const e=t[0].split(jt.lineBreakRegex),n=-(e.length-1)/2,i=h.createElementNS("http://www.w3.org/2000/svg","text");i.setAttribute("dy",n+"em");for(const[r,a]of e.entries()){const t=h.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttribute("alignment-baseline","central"),t.setAttribute("x","10"),r>0&&t.setAttribute("dy","1em"),t.textContent=a,i.appendChild(t)}return i})).attr("x",10).attr("y",(function(r,a){if(!(a>0))return r[1]*t/2+e;for(let s=0;s<a;s++)return i+=n[a-1][1],r[1]*t/2+i*t+e})).attr("font-size",r.sectionFontSize).attr("font-size",r.sectionFontSize).attr("class",(function(t){for(const[e,n]of y.entries())if(t[0]===n)return"sectionTitle sectionTitle"+e%r.numberSectionStyles;return"sectionTitle"}))}(l,u),function(t,e,n,a){const s=i.db.getTodayMarker();if("off"===s)return;const o=f.append("g").attr("class","today"),c=new Date,l=o.append("line");l.attr("x1",g(c)+t).attr("x2",g(c)+t).attr("y1",r.titleTopMargin).attr("y2",a-r.titleTopMargin).attr("class","today"),""!==s&&l.attr("style",s.replace(/,/g,";"))}(d,0,0,s)}(d,yl,p),ki(f,p,yl,r.useMaxWidth),f.append("text").text(i.db.getDiagramTitle()).attr("x",yl/2).attr("y",r.titleTopMargin).attr("class","titleText")}};var bl=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[6,9,10],i={trace:function(){},yy:{},symbols_:{error:2,start:3,info:4,document:5,EOF:6,line:7,statement:8,NL:9,showInfo:10,$accept:0,$end:1},terminals_:{2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},productions_:[0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],performAction:function(t,e,n,i,r,a,s){switch(a.length,r){case 1:return i;case 4:break;case 6:i.setInfo(!0)}},table:[{3:1,4:[1,2]},{1:[3]},e(n,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},e(n,[2,3]),e(n,[2,4]),e(n,[2,5]),e(n,[2,6])],defaultActions:{4:[2,1]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},r=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return 4;case 1:return 9;case 2:return"space";case 3:return 10;case 4:return 6;case 5:return"TXT"}},rules:[/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5],inclusive:!0}}},t);function a(){this.yy={}}return i.lexer=r,a.prototype=i,i.Parser=a,new a}();bl.parser=bl;const _l=bl;var xl="",vl=!1;const kl={setMessage:t=>{Bt.debug("Setting message to: "+t),xl=t},getMessage:()=>xl,setInfo:t=>{vl=t},getInfo:()=>vl,clear:Yi},wl={draw:(t,e,n)=>{try{Bt.debug("Rendering info diagram\n"+t);const i=gi().securityLevel;let r;"sandbox"===i&&(r=(0,o.Ys)("#i"+e));const a=("sandbox"===i?(0,o.Ys)(r.nodes()[0].contentDocument.body):(0,o.Ys)("body")).select("#"+e);a.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size","32px").style("text-anchor","middle").text("v "+n),a.attr("height",100),a.attr("width",400)}catch(i){Bt.error("Error while rendering info diagram"),Bt.error(i.message)}}},Cl=t=>null!==t.match(/^\s*info/);var Tl=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,4],i=[1,5],r=[1,6],a=[1,7],s=[1,9],o=[1,11,13,15,17,19,20,26,27,28,29],c=[2,5],l=[1,6,11,13,15,17,19,20,26,27,28,29],h=[26,27,28],u=[2,8],d=[1,18],p=[1,19],f=[1,20],g=[1,21],y=[1,22],m=[1,23],b=[1,28],_=[6,26,27,28,29],x={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,directive:5,PIE:6,document:7,showData:8,line:9,statement:10,txt:11,value:12,title:13,title_value:14,acc_title:15,acc_title_value:16,acc_descr:17,acc_descr_value:18,acc_descr_multiline_value:19,section:20,openDirective:21,typeDirective:22,closeDirective:23,":":24,argDirective:25,NEWLINE:26,";":27,EOF:28,open_directive:29,type_directive:30,arg_directive:31,close_directive:32,$accept:0,$end:1},terminals_:{2:"error",6:"PIE",8:"showData",11:"txt",12:"value",13:"title",14:"title_value",15:"acc_title",16:"acc_title_value",17:"acc_descr",18:"acc_descr_value",19:"acc_descr_multiline_value",20:"section",24:":",26:"NEWLINE",27:";",28:"EOF",29:"open_directive",30:"type_directive",31:"arg_directive",32:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,3],[7,0],[7,2],[9,2],[10,0],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,1],[5,3],[5,5],[4,1],[4,1],[4,1],[21,1],[22,1],[25,1],[23,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:i.setShowData(!0);break;case 7:this.$=a[o-1];break;case 9:i.addSection(a[o-1],i.cleanupValue(a[o]));break;case 10:this.$=a[o].trim(),i.setDiagramTitle(this.$);break;case 11:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 12:case 13:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 14:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 21:i.parseDirective("%%{","open_directive");break;case 22:i.parseDirective(a[o],"type_directive");break;case 23:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 24:i.parseDirective("}%%","close_directive","pie")}},table:[{3:1,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},{1:[3]},{3:10,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},{3:11,4:2,5:3,6:n,21:8,26:i,27:r,28:a,29:s},e(o,c,{7:12,8:[1,13]}),e(l,[2,18]),e(l,[2,19]),e(l,[2,20]),{22:14,30:[1,15]},{30:[2,21]},{1:[2,1]},{1:[2,2]},e(h,u,{21:8,9:16,10:17,5:24,1:[2,3],11:d,13:p,15:f,17:g,19:y,20:m,29:s}),e(o,c,{7:25}),{23:26,24:[1,27],32:b},e([24,32],[2,22]),e(o,[2,6]),{4:29,26:i,27:r,28:a},{12:[1,30]},{14:[1,31]},{16:[1,32]},{18:[1,33]},e(h,[2,13]),e(h,[2,14]),e(h,[2,15]),e(h,u,{21:8,9:16,10:17,5:24,1:[2,4],11:d,13:p,15:f,17:g,19:y,20:m,29:s}),e(_,[2,16]),{25:34,31:[1,35]},e(_,[2,24]),e(o,[2,7]),e(h,[2,9]),e(h,[2,10]),e(h,[2,11]),e(h,[2,12]),{23:36,32:b},{32:[2,23]},e(_,[2,17])],defaultActions:{9:[2,21],10:[2,1],11:[2,2],35:[2,23]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},v=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),29;case 1:return this.begin("type_directive"),30;case 2:return this.popState(),this.begin("arg_directive"),24;case 3:return this.popState(),this.popState(),32;case 4:return 31;case 5:case 6:case 8:case 9:break;case 7:return 26;case 10:return this.begin("title"),13;case 11:return this.popState(),"title_value";case 12:return this.begin("acc_title"),15;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),17;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:case 20:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:this.begin("string");break;case 21:return"txt";case 22:return 6;case 23:return 8;case 24:return"value";case 25:return 28}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?:showData\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},title:{rules:[11],inclusive:!1},string:{rules:[20,21],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,12,14,16,19,22,23,24,25],inclusive:!0}}},t);function k(){this.yy={}}return x.lexer=v,k.prototype=x,x.Parser=k,new k}();Tl.parser=Tl;const El=Tl,Sl=t=>null!==t.match(/^\s*pie/)||null!==t.match(/^\s*bar/);let Al={},Ll=!1;const Bl={parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().pie,addSection:function(t,e){t=jt.sanitizeText(t,gi()),void 0===Al[t]&&(Al[t]=e,Bt.debug("Added new section :",t))},getSections:()=>Al,cleanupValue:function(t){return":"===t.substring(0,1)?(t=t.substring(1).trim(),Number(t.trim())):Number(t.trim())},clear:function(){Al={},Ll=!1,Yi()},setAccTitle:zi,getAccTitle:Ui,setDiagramTitle:Hi,getDiagramTitle:Vi,setShowData:function(t){Ll=t},getShowData:function(){return Ll},getAccDescription:qi,setAccDescription:Wi};let Nl,Dl=gi();const Ol=450,Ml={draw:(t,e,n,i)=>{try{Dl=gi(),Bt.debug("Rendering info diagram\n"+t);const n=gi().securityLevel;let y;"sandbox"===n&&(y=(0,o.Ys)("#i"+e));const m="sandbox"===n?(0,o.Ys)(y.nodes()[0].contentDocument.body):(0,o.Ys)("body"),b="sandbox"===n?y.nodes()[0].contentDocument:document;i.db.clear(),i.parser.parse(t),Bt.debug("Parsed info diagram");const _=b.getElementById(e);Nl=_.parentElement.offsetWidth,void 0===Nl&&(Nl=1200),void 0!==Dl.useWidth&&(Nl=Dl.useWidth),void 0!==Dl.pie.useWidth&&(Nl=Dl.pie.useWidth);const x=m.select("#"+e);ki(x,Ol,Nl,Dl.pie.useMaxWidth),_.setAttribute("viewBox","0 0 "+Nl+" "+Ol);var r=18,a=Math.min(Nl,Ol)/2-40,s=x.append("g").attr("transform","translate("+Nl/2+",225)"),c=i.db.getSections(),l=0;Object.keys(c).forEach((function(t){l+=c[t]}));const v=Dl.themeVariables;var h=[v.pie1,v.pie2,v.pie3,v.pie4,v.pie5,v.pie6,v.pie7,v.pie8,v.pie9,v.pie10,v.pie11,v.pie12],u=(0,o.PKp)().range(h),d=Object.entries(c).map((function(t,e){return{order:e,name:t[0],value:t[1]}})),p=(0,o.ve8)().value((function(t){return t.value})).sort((function(t,e){return t.order-e.order}))(d),f=(0,o.Nb1)().innerRadius(0).outerRadius(a);s.selectAll("mySlices").data(p).enter().append("path").attr("d",f).attr("fill",(function(t){return u(t.data.name)})).attr("class","pieCircle"),s.selectAll("mySlices").data(p).enter().append("text").text((function(t){return(t.data.value/l*100).toFixed(0)+"%"})).attr("transform",(function(t){return"translate("+f.centroid(t)+")"})).style("text-anchor","middle").attr("class","slice"),s.append("text").text(i.db.getDiagramTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");var g=s.selectAll(".legend").data(u.domain()).enter().append("g").attr("class","legend").attr("transform",(function(t,e){return"translate(216,"+(22*e-22*u.domain().length/2)+")"}));g.append("rect").attr("width",r).attr("height",r).style("fill",u).style("stroke",u),g.data(p).append("text").attr("x",22).attr("y",14).text((function(t){return i.db.getShowData()||Dl.showData||Dl.pie.showData?t.data.name+" ["+t.data.value+"]":t.data.name}))}catch(y){Bt.error("Error while rendering info diagram"),Bt.error(y)}}};var Il=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,3],i=[1,5],r=[1,6],a=[1,7],s=[1,8],o=[5,6,8,14,16,18,19,40,41,42,43,44,45,53,71,72],c=[1,22],l=[2,13],h=[1,26],u=[1,27],d=[1,28],p=[1,29],f=[1,30],g=[1,31],y=[1,24],m=[1,32],b=[1,33],_=[1,36],x=[71,72],v=[5,8,14,16,18,19,40,41,42,43,44,45,53,60,62,71,72],k=[1,56],w=[1,57],C=[1,58],T=[1,59],E=[1,60],S=[1,61],A=[1,62],L=[62,63],B=[1,74],N=[1,70],D=[1,71],O=[1,72],M=[1,73],I=[1,75],F=[1,79],$=[1,80],R=[1,77],Z=[1,78],P=[5,8,14,16,18,19,40,41,42,43,44,45,53,71,72],j={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,openDirective:9,typeDirective:10,closeDirective:11,":":12,argDirective:13,acc_title:14,acc_title_value:15,acc_descr:16,acc_descr_value:17,acc_descr_multiline_value:18,open_directive:19,type_directive:20,arg_directive:21,close_directive:22,requirementDef:23,elementDef:24,relationshipDef:25,requirementType:26,requirementName:27,STRUCT_START:28,requirementBody:29,ID:30,COLONSEP:31,id:32,TEXT:33,text:34,RISK:35,riskLevel:36,VERIFYMTHD:37,verifyType:38,STRUCT_STOP:39,REQUIREMENT:40,FUNCTIONAL_REQUIREMENT:41,INTERFACE_REQUIREMENT:42,PERFORMANCE_REQUIREMENT:43,PHYSICAL_REQUIREMENT:44,DESIGN_CONSTRAINT:45,LOW_RISK:46,MED_RISK:47,HIGH_RISK:48,VERIFY_ANALYSIS:49,VERIFY_DEMONSTRATION:50,VERIFY_INSPECTION:51,VERIFY_TEST:52,ELEMENT:53,elementName:54,elementBody:55,TYPE:56,type:57,DOCREF:58,ref:59,END_ARROW_L:60,relationship:61,LINE:62,END_ARROW_R:63,CONTAINS:64,COPIES:65,DERIVES:66,SATISFIES:67,VERIFIES:68,REFINES:69,TRACES:70,unqString:71,qString:72,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",12:":",14:"acc_title",15:"acc_title_value",16:"acc_descr",17:"acc_descr_value",18:"acc_descr_multiline_value",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",28:"STRUCT_START",30:"ID",31:"COLONSEP",33:"TEXT",35:"RISK",37:"VERIFYMTHD",39:"STRUCT_STOP",40:"REQUIREMENT",41:"FUNCTIONAL_REQUIREMENT",42:"INTERFACE_REQUIREMENT",43:"PERFORMANCE_REQUIREMENT",44:"PHYSICAL_REQUIREMENT",45:"DESIGN_CONSTRAINT",46:"LOW_RISK",47:"MED_RISK",48:"HIGH_RISK",49:"VERIFY_ANALYSIS",50:"VERIFY_DEMONSTRATION",51:"VERIFY_INSPECTION",52:"VERIFY_TEST",53:"ELEMENT",56:"TYPE",58:"DOCREF",60:"END_ARROW_L",62:"LINE",63:"END_ARROW_R",64:"CONTAINS",65:"COPIES",66:"DERIVES",67:"SATISFIES",68:"VERIFIES",69:"REFINES",70:"TRACES",71:"unqString",72:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,3],[4,5],[4,2],[4,2],[4,1],[9,1],[10,1],[13,1],[11,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[23,5],[29,5],[29,5],[29,5],[29,5],[29,2],[29,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[36,1],[36,1],[36,1],[38,1],[38,1],[38,1],[38,1],[24,5],[55,5],[55,5],[55,2],[55,1],[25,5],[25,5],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[61,1],[27,1],[27,1],[32,1],[32,1],[34,1],[34,1],[54,1],[54,1],[57,1],[57,1],[59,1],[59,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 6:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 7:case 8:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 9:i.parseDirective("%%{","open_directive");break;case 10:i.parseDirective(a[o],"type_directive");break;case 11:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 12:i.parseDirective("}%%","close_directive","pie");break;case 13:this.$=[];break;case 19:i.addRequirement(a[o-3],a[o-4]);break;case 20:i.setNewReqId(a[o-2]);break;case 21:i.setNewReqText(a[o-2]);break;case 22:i.setNewReqRisk(a[o-2]);break;case 23:i.setNewReqVerifyMethod(a[o-2]);break;case 26:this.$=i.RequirementType.REQUIREMENT;break;case 27:this.$=i.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 28:this.$=i.RequirementType.INTERFACE_REQUIREMENT;break;case 29:this.$=i.RequirementType.PERFORMANCE_REQUIREMENT;break;case 30:this.$=i.RequirementType.PHYSICAL_REQUIREMENT;break;case 31:this.$=i.RequirementType.DESIGN_CONSTRAINT;break;case 32:this.$=i.RiskLevel.LOW_RISK;break;case 33:this.$=i.RiskLevel.MED_RISK;break;case 34:this.$=i.RiskLevel.HIGH_RISK;break;case 35:this.$=i.VerifyType.VERIFY_ANALYSIS;break;case 36:this.$=i.VerifyType.VERIFY_DEMONSTRATION;break;case 37:this.$=i.VerifyType.VERIFY_INSPECTION;break;case 38:this.$=i.VerifyType.VERIFY_TEST;break;case 39:i.addElement(a[o-3]);break;case 40:i.setNewElementType(a[o-2]);break;case 41:i.setNewElementDocRef(a[o-2]);break;case 44:i.addRelationship(a[o-2],a[o],a[o-4]);break;case 45:i.addRelationship(a[o-2],a[o-4],a[o]);break;case 46:this.$=i.Relationships.CONTAINS;break;case 47:this.$=i.Relationships.COPIES;break;case 48:this.$=i.Relationships.DERIVES;break;case 49:this.$=i.Relationships.SATISFIES;break;case 50:this.$=i.Relationships.VERIFIES;break;case 51:this.$=i.Relationships.REFINES;break;case 52:this.$=i.Relationships.TRACES}},table:[{3:1,4:2,6:n,9:4,14:i,16:r,18:a,19:s},{1:[3]},{3:10,4:2,5:[1,9],6:n,9:4,14:i,16:r,18:a,19:s},{5:[1,11]},{10:12,20:[1,13]},{15:[1,14]},{17:[1,15]},e(o,[2,8]),{20:[2,9]},{3:16,4:2,6:n,9:4,14:i,16:r,18:a,19:s},{1:[2,2]},{4:21,5:c,7:17,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{11:34,12:[1,35],22:_},e([12,22],[2,10]),e(o,[2,6]),e(o,[2,7]),{1:[2,1]},{8:[1,37]},{4:21,5:c,7:38,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:39,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:40,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:41,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{4:21,5:c,7:42,8:l,9:4,14:i,16:r,18:a,19:s,23:18,24:19,25:20,26:23,32:25,40:h,41:u,42:d,43:p,44:f,45:g,53:y,71:m,72:b},{27:43,71:[1,44],72:[1,45]},{54:46,71:[1,47],72:[1,48]},{60:[1,49],62:[1,50]},e(x,[2,26]),e(x,[2,27]),e(x,[2,28]),e(x,[2,29]),e(x,[2,30]),e(x,[2,31]),e(v,[2,55]),e(v,[2,56]),e(o,[2,4]),{13:51,21:[1,52]},e(o,[2,12]),{1:[2,3]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{8:[2,17]},{8:[2,18]},{28:[1,53]},{28:[2,53]},{28:[2,54]},{28:[1,54]},{28:[2,59]},{28:[2,60]},{61:55,64:k,65:w,66:C,67:T,68:E,69:S,70:A},{61:63,64:k,65:w,66:C,67:T,68:E,69:S,70:A},{11:64,22:_},{22:[2,11]},{5:[1,65]},{5:[1,66]},{62:[1,67]},e(L,[2,46]),e(L,[2,47]),e(L,[2,48]),e(L,[2,49]),e(L,[2,50]),e(L,[2,51]),e(L,[2,52]),{63:[1,68]},e(o,[2,5]),{5:B,29:69,30:N,33:D,35:O,37:M,39:I},{5:F,39:$,55:76,56:R,58:Z},{32:81,71:m,72:b},{32:82,71:m,72:b},e(P,[2,19]),{31:[1,83]},{31:[1,84]},{31:[1,85]},{31:[1,86]},{5:B,29:87,30:N,33:D,35:O,37:M,39:I},e(P,[2,25]),e(P,[2,39]),{31:[1,88]},{31:[1,89]},{5:F,39:$,55:90,56:R,58:Z},e(P,[2,43]),e(P,[2,44]),e(P,[2,45]),{32:91,71:m,72:b},{34:92,71:[1,93],72:[1,94]},{36:95,46:[1,96],47:[1,97],48:[1,98]},{38:99,49:[1,100],50:[1,101],51:[1,102],52:[1,103]},e(P,[2,24]),{57:104,71:[1,105],72:[1,106]},{59:107,71:[1,108],72:[1,109]},e(P,[2,42]),{5:[1,110]},{5:[1,111]},{5:[2,57]},{5:[2,58]},{5:[1,112]},{5:[2,32]},{5:[2,33]},{5:[2,34]},{5:[1,113]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[2,38]},{5:[1,114]},{5:[2,61]},{5:[2,62]},{5:[1,115]},{5:[2,63]},{5:[2,64]},{5:B,29:116,30:N,33:D,35:O,37:M,39:I},{5:B,29:117,30:N,33:D,35:O,37:M,39:I},{5:B,29:118,30:N,33:D,35:O,37:M,39:I},{5:B,29:119,30:N,33:D,35:O,37:M,39:I},{5:F,39:$,55:120,56:R,58:Z},{5:F,39:$,55:121,56:R,58:Z},e(P,[2,20]),e(P,[2,21]),e(P,[2,22]),e(P,[2,23]),e(P,[2,40]),e(P,[2,41])],defaultActions:{8:[2,9],10:[2,2],16:[2,1],37:[2,3],38:[2,14],39:[2,15],40:[2,16],41:[2,17],42:[2,18],44:[2,53],45:[2,54],47:[2,59],48:[2,60],52:[2,11],93:[2,57],94:[2,58],96:[2,32],97:[2,33],98:[2,34],100:[2,35],101:[2,36],102:[2,37],103:[2,38],105:[2,61],106:[2,62],108:[2,63],109:[2,64]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},Y=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),19;case 1:return this.begin("type_directive"),20;case 2:return this.popState(),this.begin("arg_directive"),12;case 3:return this.popState(),this.popState(),22;case 4:return 21;case 5:return"title";case 6:return this.begin("acc_title"),14;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),16;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 53:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 5;case 14:case 15:case 16:break;case 17:return 8;case 18:return 6;case 19:return 28;case 20:return 39;case 21:return 31;case 22:return 30;case 23:return 33;case 24:return 35;case 25:return 37;case 26:return 40;case 27:return 41;case 28:return 42;case 29:return 43;case 30:return 44;case 31:return 45;case 32:return 46;case 33:return 47;case 34:return 48;case 35:return 49;case 36:return 50;case 37:return 51;case 38:return 52;case 39:return 53;case 40:return 64;case 41:return 65;case 42:return 66;case 43:return 67;case 44:return 68;case 45:return 69;case 46:return 70;case 47:return 56;case 48:return 58;case 49:return 60;case 50:return 63;case 51:return 62;case 52:this.begin("string");break;case 54:return"qString";case 55:return e.yytext=e.yytext.trim(),71}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^\r\n\{\<\>\-\=]*)/i],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},close_directive:{rules:[],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},open_directive:{rules:[1],inclusive:!1},unqString:{rules:[],inclusive:!1},token:{rules:[],inclusive:!1},string:{rules:[53,54],inclusive:!1},INITIAL:{rules:[0,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,55],inclusive:!0}}},t);function z(){this.yy={}}return j.lexer=Y,z.prototype=j,j.Parser=z,new z}();Il.parser=Il;const Fl=Il,$l=t=>null!==t.match(/^\s*requirement(Diagram)?/);let Rl=[],Zl={},Pl={},jl={},Yl={};const zl={RequirementType:{REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},RiskLevel:{LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},VerifyType:{VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},Relationships:{CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().req,addRequirement:(t,e)=>(void 0===Pl[t]&&(Pl[t]={name:t,type:e,id:Zl.id,text:Zl.text,risk:Zl.risk,verifyMethod:Zl.verifyMethod}),Zl={},Pl[t]),getRequirements:()=>Pl,setNewReqId:t=>{void 0!==Zl&&(Zl.id=t)},setNewReqText:t=>{void 0!==Zl&&(Zl.text=t)},setNewReqRisk:t=>{void 0!==Zl&&(Zl.risk=t)},setNewReqVerifyMethod:t=>{void 0!==Zl&&(Zl.verifyMethod=t)},setAccTitle:zi,getAccTitle:Ui,setAccDescription:Wi,getAccDescription:qi,addElement:t=>(void 0===Yl[t]&&(Yl[t]={name:t,type:jl.type,docRef:jl.docRef},Bt.info("Added new requirement: ",t)),jl={},Yl[t]),getElements:()=>Yl,setNewElementType:t=>{void 0!==jl&&(jl.type=t)},setNewElementDocRef:t=>{void 0!==jl&&(jl.docRef=t)},addRelationship:(t,e,n)=>{Rl.push({type:t,src:e,dst:n})},getRelationships:()=>Rl,clear:()=>{Rl=[],Zl={},Pl={},jl={},Yl={},Yi()}},Ul={CONTAINS:"contains",ARROW:"arrow"},Wl=Ul,ql=(t,e)=>{let n=t.append("defs").append("marker").attr("id",Ul.CONTAINS+"_line_ending").attr("refX",0).attr("refY",e.line_height/2).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("g");n.append("circle").attr("cx",e.line_height/2).attr("cy",e.line_height/2).attr("r",e.line_height/2).attr("fill","none"),n.append("line").attr("x1",0).attr("x2",e.line_height).attr("y1",e.line_height/2).attr("y2",e.line_height/2).attr("stroke-width",1),n.append("line").attr("y1",0).attr("y2",e.line_height).attr("x1",e.line_height/2).attr("x2",e.line_height/2).attr("stroke-width",1),t.append("defs").append("marker").attr("id",Ul.ARROW+"_line_ending").attr("refX",e.line_height).attr("refY",.5*e.line_height).attr("markerWidth",e.line_height).attr("markerHeight",e.line_height).attr("orient","auto").append("path").attr("d",`M0,0\n L${e.line_height},${e.line_height/2}\n M${e.line_height},${e.line_height/2}\n L0,${e.line_height}`).attr("stroke-width",1)};let Hl={},Vl=0;const Gl=(t,e)=>t.insert("rect","#"+e).attr("class","req reqBox").attr("x",0).attr("y",0).attr("width",Hl.rect_min_width+"px").attr("height",Hl.rect_min_height+"px"),Xl=(t,e,n)=>{let i=Hl.rect_min_width/2,r=t.append("text").attr("class","req reqLabel reqTitle").attr("id",e).attr("x",i).attr("y",Hl.rect_padding).attr("dominant-baseline","hanging"),a=0;n.forEach((t=>{0==a?r.append("tspan").attr("text-anchor","middle").attr("x",Hl.rect_min_width/2).attr("dy",0).text(t):r.append("tspan").attr("text-anchor","middle").attr("x",Hl.rect_min_width/2).attr("dy",.75*Hl.line_height).text(t),a++}));let s=1.5*Hl.rect_padding+a*Hl.line_height*.75;return t.append("line").attr("class","req-title-line").attr("x1","0").attr("x2",Hl.rect_min_width).attr("y1",s).attr("y2",s),{titleNode:r,y:s}},Ql=(t,e,n,i)=>{let r=t.append("text").attr("class","req reqLabel").attr("id",e).attr("x",Hl.rect_padding).attr("y",i).attr("dominant-baseline","hanging"),a=0;let s=[];return n.forEach((t=>{let e=t.length;for(;e>30&&a<3;){let n=t.substring(0,30);e=(t=t.substring(30,t.length)).length,s[s.length]=n,a++}if(3==a){let t=s[s.length-1];s[s.length-1]=t.substring(0,t.length-4)+"..."}else s[s.length]=t;a=0})),s.forEach((t=>{r.append("tspan").attr("x",Hl.rect_padding).attr("dy",Hl.line_height).text(t)})),r},Kl=function(t,e,n,i,r){const a=n.edge(Jl(e.src),Jl(e.dst)),s=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})),c=t.insert("path","#"+i).attr("class","er relationshipLine").attr("d",s(a.points)).attr("fill","none");e.type==r.db.Relationships.CONTAINS?c.attr("marker-start","url("+jt.getUrl(Hl.arrowMarkerAbsolute)+"#"+e.type+"_line_ending)"):(c.attr("stroke-dasharray","10,7"),c.attr("marker-end","url("+jt.getUrl(Hl.arrowMarkerAbsolute)+"#"+Wl.ARROW+"_line_ending)")),((t,e,n,i)=>{const r=e.node().getTotalLength(),a=e.node().getPointAtLength(.5*r),s="rel"+Vl;Vl++;const o=t.append("text").attr("class","req relationshipLabel").attr("id",s).attr("x",a.x).attr("y",a.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(i).node().getBBox();t.insert("rect","#"+s).attr("class","req reqLabelBox").attr("x",a.x-o.width/2).attr("y",a.y-o.height/2).attr("width",o.width).attr("height",o.height).attr("fill","white").attr("fill-opacity","85%")})(t,c,0,`<<${e.type}>>`)},Jl=t=>t.replace(/\s/g,"").replace(/\./g,"_"),th={draw:(t,e,n,i)=>{Hl=gi().requirement,i.db.clear(),i.parser.parse(t);const r=Hl.securityLevel;let a;"sandbox"===r&&(a=(0,o.Ys)("#i"+e));const s=("sandbox"===r?(0,o.Ys)(a.nodes()[0].contentDocument.body):(0,o.Ys)("body")).select(`[id='${e}']`);ql(s,Hl);const c=new lt.k({multigraph:!1,compound:!1,directed:!0}).setGraph({rankdir:Hl.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel((function(){return{}}));let l=i.db.getRequirements(),h=i.db.getElements(),u=i.db.getRelationships();var d,p,f;d=l,p=c,f=s,Object.keys(d).forEach((t=>{let e=d[t];t=Jl(t),Bt.info("Added new requirement: ",t);const n=f.append("g").attr("id",t),i=Gl(n,"req-"+t);let r=Xl(n,t+"_title",[`<<${e.type}>>`,`${e.name}`]);Ql(n,t+"_body",[`Id: ${e.id}`,`Text: ${e.text}`,`Risk: ${e.risk}`,`Verification: ${e.verifyMethod}`],r.y);const a=i.node().getBBox();p.setNode(t,{width:a.width,height:a.height,shape:"rect",id:t})})),((t,e,n)=>{Object.keys(t).forEach((i=>{let r=t[i];const a=Jl(i),s=n.append("g").attr("id",a),o="element-"+a,c=Gl(s,o);let l=Xl(s,o+"_title",["<<Element>>",`${i}`]);Ql(s,o+"_body",[`Type: ${r.type||"Not Specified"}`,`Doc Ref: ${r.docRef||"None"}`],l.y);const h=c.node().getBBox();e.setNode(a,{width:h.width,height:h.height,shape:"rect",id:a})}))})(h,c,s),((t,e)=>{t.forEach((function(t){let n=Jl(t.src),i=Jl(t.dst);e.setEdge(n,i,{relationship:t})}))})(u,c),(0,ct.bK)(c),function(t,e){e.nodes().forEach((function(n){void 0!==n&&void 0!==e.node(n)&&(t.select("#"+n),t.select("#"+n).attr("transform","translate("+(e.node(n).x-e.node(n).width/2)+","+(e.node(n).y-e.node(n).height/2)+" )"))}))}(s,c),u.forEach((function(t){Kl(s,t,c,e,i)}));const g=Hl.rect_padding,y=s.node().getBBox(),m=y.width+2*g,b=y.height+2*g;ki(s,b,m,Hl.useMaxWidth),s.attr("viewBox",`${y.x-g} ${y.y-g} ${m} ${b}`)}};var eh=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,3],r=[1,5],a=[1,7],s=[2,5],o=[1,15],c=[1,17],l=[1,19],h=[1,21],u=[1,22],d=[1,23],p=[1,29],f=[1,30],g=[1,31],y=[1,32],m=[1,33],b=[1,34],_=[1,35],x=[1,36],v=[1,37],k=[1,38],w=[1,39],C=[1,40],T=[1,42],E=[1,43],S=[1,45],A=[1,46],L=[1,47],B=[1,48],N=[1,49],D=[1,50],O=[1,53],M=[1,4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,51,52,53,54,56,57,62,63,64,65,73,83],I=[4,5,21,54,56],F=[4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,54,56,57,62,63,64,65,73,83],$=[4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,53,54,56,57,62,63,64,65,73,83],R=[4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,52,54,56,57,62,63,64,65,73,83],Z=[4,5,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,51,54,56,57,62,63,64,65,73,83],P=[71,72,73],j=[1,125],Y=[1,4,5,7,19,21,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,51,52,53,54,56,57,62,63,64,65,73,83],z={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,directive:6,SD:7,document:8,line:9,statement:10,box_section:11,box_line:12,participant_statement:13,openDirective:14,typeDirective:15,closeDirective:16,":":17,argDirective:18,box:19,restOfLine:20,end:21,signal:22,autonumber:23,NUM:24,off:25,activate:26,actor:27,deactivate:28,note_statement:29,links_statement:30,link_statement:31,properties_statement:32,details_statement:33,title:34,legacy_title:35,acc_title:36,acc_title_value:37,acc_descr:38,acc_descr_value:39,acc_descr_multiline_value:40,loop:41,rect:42,opt:43,alt:44,else_sections:45,par:46,par_sections:47,critical:48,option_sections:49,break:50,option:51,and:52,else:53,participant:54,AS:55,participant_actor:56,note:57,placement:58,text2:59,over:60,actor_pair:61,links:62,link:63,properties:64,details:65,spaceList:66,",":67,left_of:68,right_of:69,signaltype:70,"+":71,"-":72,ACTOR:73,SOLID_OPEN_ARROW:74,DOTTED_OPEN_ARROW:75,SOLID_ARROW:76,DOTTED_ARROW:77,SOLID_CROSS:78,DOTTED_CROSS:79,SOLID_POINT:80,DOTTED_POINT:81,TXT:82,open_directive:83,type_directive:84,arg_directive:85,close_directive:86,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",7:"SD",17:":",19:"box",20:"restOfLine",21:"end",23:"autonumber",24:"NUM",25:"off",26:"activate",28:"deactivate",34:"title",35:"legacy_title",36:"acc_title",37:"acc_title_value",38:"acc_descr",39:"acc_descr_value",40:"acc_descr_multiline_value",41:"loop",42:"rect",43:"opt",44:"alt",46:"par",48:"critical",50:"break",51:"option",52:"and",53:"else",54:"participant",55:"AS",56:"participant_actor",57:"note",60:"over",62:"links",63:"link",64:"properties",65:"details",67:",",68:"left_of",69:"right_of",71:"+",72:"-",73:"ACTOR",74:"SOLID_OPEN_ARROW",75:"DOTTED_OPEN_ARROW",76:"SOLID_ARROW",77:"DOTTED_ARROW",78:"SOLID_CROSS",79:"DOTTED_CROSS",80:"SOLID_POINT",81:"DOTTED_POINT",82:"TXT",83:"open_directive",84:"type_directive",85:"arg_directive",86:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[11,0],[11,2],[12,2],[12,1],[12,1],[6,4],[6,6],[10,1],[10,4],[10,2],[10,4],[10,3],[10,3],[10,2],[10,3],[10,3],[10,2],[10,2],[10,2],[10,2],[10,2],[10,1],[10,1],[10,2],[10,2],[10,1],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,4],[10,1],[49,1],[49,4],[47,1],[47,4],[45,1],[45,4],[13,5],[13,3],[13,5],[13,3],[29,4],[29,4],[30,3],[31,3],[32,3],[33,3],[66,2],[66,1],[61,3],[61,1],[58,1],[58,1],[22,5],[22,5],[22,4],[27,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[59,1],[14,1],[15,1],[18,1],[16,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:return i.apply(a[o]),a[o];case 5:case 10:case 9:case 14:this.$=[];break;case 6:case 11:a[o-1].push(a[o]),this.$=a[o-1];break;case 7:case 8:case 12:case 13:case 63:this.$=a[o];break;case 18:a[o-1].unshift({type:"boxStart",boxData:i.parseBoxData(a[o-2])}),a[o-1].push({type:"boxEnd",boxText:a[o-2]}),this.$=a[o-1];break;case 20:this.$={type:"sequenceIndex",sequenceIndex:Number(a[o-2]),sequenceIndexStep:Number(a[o-1]),sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceIndex:Number(a[o-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:i.LINETYPE.AUTONUMBER};break;case 23:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:i.LINETYPE.AUTONUMBER};break;case 24:this.$={type:"activeStart",signalType:i.LINETYPE.ACTIVE_START,actor:a[o-1]};break;case 25:this.$={type:"activeEnd",signalType:i.LINETYPE.ACTIVE_END,actor:a[o-1]};break;case 31:i.setDiagramTitle(a[o].substring(6)),this.$=a[o].substring(6);break;case 32:i.setDiagramTitle(a[o].substring(7)),this.$=a[o].substring(7);break;case 33:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 34:case 35:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 36:a[o-1].unshift({type:"loopStart",loopText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.LOOP_START}),a[o-1].push({type:"loopEnd",loopText:a[o-2],signalType:i.LINETYPE.LOOP_END}),this.$=a[o-1];break;case 37:a[o-1].unshift({type:"rectStart",color:i.parseMessage(a[o-2]),signalType:i.LINETYPE.RECT_START}),a[o-1].push({type:"rectEnd",color:i.parseMessage(a[o-2]),signalType:i.LINETYPE.RECT_END}),this.$=a[o-1];break;case 38:a[o-1].unshift({type:"optStart",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.OPT_START}),a[o-1].push({type:"optEnd",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.OPT_END}),this.$=a[o-1];break;case 39:a[o-1].unshift({type:"altStart",altText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.ALT_START}),a[o-1].push({type:"altEnd",signalType:i.LINETYPE.ALT_END}),this.$=a[o-1];break;case 40:a[o-1].unshift({type:"parStart",parText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.PAR_START}),a[o-1].push({type:"parEnd",signalType:i.LINETYPE.PAR_END}),this.$=a[o-1];break;case 41:a[o-1].unshift({type:"criticalStart",criticalText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.CRITICAL_START}),a[o-1].push({type:"criticalEnd",signalType:i.LINETYPE.CRITICAL_END}),this.$=a[o-1];break;case 42:a[o-1].unshift({type:"breakStart",breakText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.BREAK_START}),a[o-1].push({type:"breakEnd",optText:i.parseMessage(a[o-2]),signalType:i.LINETYPE.BREAK_END}),this.$=a[o-1];break;case 45:this.$=a[o-3].concat([{type:"option",optionText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.CRITICAL_OPTION},a[o]]);break;case 47:this.$=a[o-3].concat([{type:"and",parText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.PAR_AND},a[o]]);break;case 49:this.$=a[o-3].concat([{type:"else",altText:i.parseMessage(a[o-1]),signalType:i.LINETYPE.ALT_ELSE},a[o]]);break;case 50:a[o-3].type="addParticipant",a[o-3].description=i.parseMessage(a[o-1]),this.$=a[o-3];break;case 51:a[o-1].type="addParticipant",this.$=a[o-1];break;case 52:a[o-3].type="addActor",a[o-3].description=i.parseMessage(a[o-1]),this.$=a[o-3];break;case 53:a[o-1].type="addActor",this.$=a[o-1];break;case 54:this.$=[a[o-1],{type:"addNote",placement:a[o-2],actor:a[o-1].actor,text:a[o]}];break;case 55:a[o-2]=[].concat(a[o-1],a[o-1]).slice(0,2),a[o-2][0]=a[o-2][0].actor,a[o-2][1]=a[o-2][1].actor,this.$=[a[o-1],{type:"addNote",placement:i.PLACEMENT.OVER,actor:a[o-2].slice(0,2),text:a[o]}];break;case 56:this.$=[a[o-1],{type:"addLinks",actor:a[o-1].actor,text:a[o]}];break;case 57:this.$=[a[o-1],{type:"addALink",actor:a[o-1].actor,text:a[o]}];break;case 58:this.$=[a[o-1],{type:"addProperties",actor:a[o-1].actor,text:a[o]}];break;case 59:this.$=[a[o-1],{type:"addDetails",actor:a[o-1].actor,text:a[o]}];break;case 62:this.$=[a[o-2],a[o]];break;case 64:this.$=i.PLACEMENT.LEFTOF;break;case 65:this.$=i.PLACEMENT.RIGHTOF;break;case 66:this.$=[a[o-4],a[o-1],{type:"addMessage",from:a[o-4].actor,to:a[o-1].actor,signalType:a[o-3],msg:a[o]},{type:"activeStart",signalType:i.LINETYPE.ACTIVE_START,actor:a[o-1]}];break;case 67:this.$=[a[o-4],a[o-1],{type:"addMessage",from:a[o-4].actor,to:a[o-1].actor,signalType:a[o-3],msg:a[o]},{type:"activeEnd",signalType:i.LINETYPE.ACTIVE_END,actor:a[o-4]}];break;case 68:this.$=[a[o-3],a[o-1],{type:"addMessage",from:a[o-3].actor,to:a[o-1].actor,signalType:a[o-2],msg:a[o]}];break;case 69:this.$={type:"addParticipant",actor:a[o]};break;case 70:this.$=i.LINETYPE.SOLID_OPEN;break;case 71:this.$=i.LINETYPE.DOTTED_OPEN;break;case 72:this.$=i.LINETYPE.SOLID;break;case 73:this.$=i.LINETYPE.DOTTED;break;case 74:this.$=i.LINETYPE.SOLID_CROSS;break;case 75:this.$=i.LINETYPE.DOTTED_CROSS;break;case 76:this.$=i.LINETYPE.SOLID_POINT;break;case 77:this.$=i.LINETYPE.DOTTED_POINT;break;case 78:this.$=i.parseMessage(a[o].trim().substring(1));break;case 79:i.parseDirective("%%{","open_directive");break;case 80:i.parseDirective(a[o],"type_directive");break;case 81:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 82:i.parseDirective("}%%","close_directive","sequence")}},table:[{3:1,4:n,5:i,6:4,7:r,14:6,83:a},{1:[3]},{3:8,4:n,5:i,6:4,7:r,14:6,83:a},{3:9,4:n,5:i,6:4,7:r,14:6,83:a},{3:10,4:n,5:i,6:4,7:r,14:6,83:a},e([1,4,5,19,23,26,28,34,35,36,38,40,41,42,43,44,46,48,50,54,56,57,62,63,64,65,73,83],s,{8:11}),{15:12,84:[1,13]},{84:[2,79]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{16:51,17:[1,52],86:O},e([17,86],[2,80]),e(M,[2,6]),{6:41,10:54,13:18,14:6,19:l,22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},e(M,[2,8]),e(M,[2,9]),e(M,[2,17]),{20:[1,55]},{5:[1,56]},{5:[1,59],24:[1,57],25:[1,58]},{27:60,73:D},{27:61,73:D},{5:[1,62]},{5:[1,63]},{5:[1,64]},{5:[1,65]},{5:[1,66]},e(M,[2,31]),e(M,[2,32]),{37:[1,67]},{39:[1,68]},e(M,[2,35]),{20:[1,69]},{20:[1,70]},{20:[1,71]},{20:[1,72]},{20:[1,73]},{20:[1,74]},{20:[1,75]},e(M,[2,43]),{27:76,73:D},{27:77,73:D},{70:78,74:[1,79],75:[1,80],76:[1,81],77:[1,82],78:[1,83],79:[1,84],80:[1,85],81:[1,86]},{58:87,60:[1,88],68:[1,89],69:[1,90]},{27:91,73:D},{27:92,73:D},{27:93,73:D},{27:94,73:D},e([5,55,67,74,75,76,77,78,79,80,81,82],[2,69]),{5:[1,95]},{18:96,85:[1,97]},{5:[2,82]},e(M,[2,7]),e(I,[2,10],{11:98}),e(M,[2,19]),{5:[1,100],24:[1,99]},{5:[1,101]},e(M,[2,23]),{5:[1,102]},{5:[1,103]},e(M,[2,26]),e(M,[2,27]),e(M,[2,28]),e(M,[2,29]),e(M,[2,30]),e(M,[2,33]),e(M,[2,34]),e(F,s,{8:104}),e(F,s,{8:105}),e(F,s,{8:106}),e($,s,{45:107,8:108}),e(R,s,{47:109,8:110}),e(Z,s,{49:111,8:112}),e(F,s,{8:113}),{5:[1,115],55:[1,114]},{5:[1,117],55:[1,116]},{27:120,71:[1,118],72:[1,119],73:D},e(P,[2,70]),e(P,[2,71]),e(P,[2,72]),e(P,[2,73]),e(P,[2,74]),e(P,[2,75]),e(P,[2,76]),e(P,[2,77]),{27:121,73:D},{27:123,61:122,73:D},{73:[2,64]},{73:[2,65]},{59:124,82:j},{59:126,82:j},{59:127,82:j},{59:128,82:j},e(Y,[2,15]),{16:129,86:O},{86:[2,81]},{4:[1,132],5:[1,134],12:131,13:133,21:[1,130],54:T,56:E},{5:[1,135]},e(M,[2,21]),e(M,[2,22]),e(M,[2,24]),e(M,[2,25]),{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[1,136],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[1,137],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[1,138],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{21:[1,139]},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[2,48],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,53:[1,140],54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{21:[1,141]},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[2,46],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,52:[1,142],54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{21:[1,143]},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[2,44],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,51:[1,144],54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{4:o,5:c,6:41,9:14,10:16,13:18,14:6,19:l,21:[1,145],22:20,23:h,26:u,27:44,28:d,29:24,30:25,31:26,32:27,33:28,34:p,35:f,36:g,38:y,40:m,41:b,42:_,43:x,44:v,46:k,48:w,50:C,54:T,56:E,57:S,62:A,63:L,64:B,65:N,73:D,83:a},{20:[1,146]},e(M,[2,51]),{20:[1,147]},e(M,[2,53]),{27:148,73:D},{27:149,73:D},{59:150,82:j},{59:151,82:j},{59:152,82:j},{67:[1,153],82:[2,63]},{5:[2,56]},{5:[2,78]},{5:[2,57]},{5:[2,58]},{5:[2,59]},{5:[1,154]},e(M,[2,18]),e(I,[2,11]),{13:155,54:T,56:E},e(I,[2,13]),e(I,[2,14]),e(M,[2,20]),e(M,[2,36]),e(M,[2,37]),e(M,[2,38]),e(M,[2,39]),{20:[1,156]},e(M,[2,40]),{20:[1,157]},e(M,[2,41]),{20:[1,158]},e(M,[2,42]),{5:[1,159]},{5:[1,160]},{59:161,82:j},{59:162,82:j},{5:[2,68]},{5:[2,54]},{5:[2,55]},{27:163,73:D},e(Y,[2,16]),e(I,[2,12]),e($,s,{8:108,45:164}),e(R,s,{8:110,47:165}),e(Z,s,{8:112,49:166}),e(M,[2,50]),e(M,[2,52]),{5:[2,66]},{5:[2,67]},{82:[2,62]},{21:[2,49]},{21:[2,47]},{21:[2,45]}],defaultActions:{7:[2,79],8:[2,1],9:[2,2],10:[2,3],53:[2,82],89:[2,64],90:[2,65],97:[2,81],124:[2,56],125:[2,78],126:[2,57],127:[2,58],128:[2,59],150:[2,68],151:[2,54],152:[2,55],161:[2,66],162:[2,67],163:[2,62],164:[2,49],165:[2,47],166:[2,45]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},U=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),83;case 1:return this.begin("type_directive"),84;case 2:return this.popState(),this.begin("arg_directive"),17;case 3:return this.popState(),this.popState(),86;case 4:return 85;case 5:case 53:case 66:return 5;case 6:case 7:case 8:case 9:case 10:break;case 11:return 24;case 12:return this.begin("LINE"),19;case 13:return this.begin("ID"),54;case 14:return this.begin("ID"),56;case 15:return e.yytext=e.yytext.trim(),this.begin("ALIAS"),73;case 16:return this.popState(),this.popState(),this.begin("LINE"),55;case 17:return this.popState(),this.popState(),5;case 18:return this.begin("LINE"),41;case 19:return this.begin("LINE"),42;case 20:return this.begin("LINE"),43;case 21:return this.begin("LINE"),44;case 22:return this.begin("LINE"),53;case 23:return this.begin("LINE"),46;case 24:return this.begin("LINE"),52;case 25:return this.begin("LINE"),48;case 26:return this.begin("LINE"),51;case 27:return this.begin("LINE"),50;case 28:return this.popState(),20;case 29:return 21;case 30:return 68;case 31:return 69;case 32:return 62;case 33:return 63;case 34:return 64;case 35:return 65;case 36:return 60;case 37:return 57;case 38:return this.begin("ID"),26;case 39:return this.begin("ID"),28;case 40:return 34;case 41:return 35;case 42:return this.begin("acc_title"),36;case 43:return this.popState(),"acc_title_value";case 44:return this.begin("acc_descr"),38;case 45:return this.popState(),"acc_descr_value";case 46:this.begin("acc_descr_multiline");break;case 47:this.popState();break;case 48:return"acc_descr_multiline_value";case 49:return 7;case 50:return 23;case 51:return 25;case 52:return 67;case 54:return e.yytext=e.yytext.trim(),73;case 55:return 76;case 56:return 77;case 57:return 74;case 58:return 75;case 59:return 78;case 60:return 79;case 61:return 80;case 62:return 81;case 63:return 82;case 64:return 71;case 65:return 72;case 67:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:[^\->:\n,;]+?([\-]*[^\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[47,48],inclusive:!1},acc_descr:{rules:[45],inclusive:!1},acc_title:{rules:[43],inclusive:!1},open_directive:{rules:[1,8],inclusive:!1},type_directive:{rules:[2,3,8],inclusive:!1},arg_directive:{rules:[3,4,8],inclusive:!1},ID:{rules:[7,8,15],inclusive:!1},ALIAS:{rules:[7,8,16,17],inclusive:!1},LINE:{rules:[7,8,28],inclusive:!1},INITIAL:{rules:[0,5,6,8,9,10,11,12,13,14,18,19,20,21,22,23,24,25,26,27,29,30,31,32,33,34,35,36,37,38,39,40,41,42,44,46,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67],inclusive:!0}}},t);function W(){this.yy={}}return z.lexer=U,W.prototype=z,z.Parser=W,new W}();eh.parser=eh;const nh=eh,ih=t=>null!==t.match(/^\s*sequenceDiagram/);let rh,ah,sh,oh={},ch=[],lh=[],hh=!1;const uh=function(t,e,n,i){let r=sh;const a=oh[t];if(a){if(sh&&a.box&&sh!==a.box)throw new Error("A same participant should only be defined in one Box: "+a.name+" can't be in '"+a.box.name+"' and in '"+sh.name+"' at the same time.");if(r=a.box?a.box:sh,a.box=r,a&&e===a.name&&null==n)return}null!=n&&null!=n.text||(n={text:e,wrap:null,type:i}),null!=i&&null!=n.text||(n={text:e,wrap:null,type:i}),oh[t]={box:r,name:e,description:n.text,wrap:void 0===n.wrap&&fh()||!!n.wrap,prevActor:rh,links:{},properties:{},actorCnt:null,rectData:null,type:i||"participant"},rh&&oh[rh]&&(oh[rh].nextActor=t),sh&&sh.actorKeys.push(t),rh=t},dh=function(t,e,n={text:void 0,wrap:void 0},i){if(i===gh.ACTIVE_END){const e=(t=>{let e,n=0;for(e=0;e<lh.length;e++)lh[e].type===gh.ACTIVE_START&&lh[e].from.actor===t&&n++,lh[e].type===gh.ACTIVE_END&&lh[e].from.actor===t&&n--;return n})(t.actor);if(e<1){let e=new Error("Trying to inactivate an inactive participant ("+t.actor+")");throw e.hash={text:"->>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},e}}return lh.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&fh()||!!n.wrap,type:i}),!0},ph=function(t){return oh[t]},fh=()=>void 0!==ah?ah:gi().sequence.wrap,gh={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31},yh=function(t,e,n){n.text,void 0===n.wrap&&fh()||n.wrap;const i=[].concat(t,t);lh.push({from:i[0],to:i[1],message:n.text,wrap:void 0===n.wrap&&fh()||!!n.wrap,type:gh.NOTE,placement:e})},mh=function(t,e){const n=ph(t);try{let t=It(e.text,gi());t=t.replace(/&/g,"&"),t=t.replace(/=/g,"=");bh(n,JSON.parse(t))}catch(i){Bt.error("error while parsing actor link text",i)}};function bh(t,e){if(null==t.links)t.links=e;else for(let n in e)t.links[n]=e[n]}const _h=function(t,e){const n=ph(t);try{let t=It(e.text,gi());xh(n,JSON.parse(t))}catch(i){Bt.error("error while parsing actor properties text",i)}};function xh(t,e){if(null==t.properties)t.properties=e;else for(let n in e)t.properties[n]=e[n]}const vh=function(t,e){const n=ph(t),i=document.getElementById(e.text);try{const t=i.innerHTML,e=JSON.parse(t);e.properties&&xh(n,e.properties),e.links&&bh(n,e.links)}catch(r){Bt.error("error while parsing actor details text",r)}},kh=function(t){if(Array.isArray(t))t.forEach((function(t){kh(t)}));else switch(t.type){case"sequenceIndex":lh.push({from:void 0,to:void 0,message:{start:t.sequenceIndex,step:t.sequenceIndexStep,visible:t.sequenceVisible},wrap:!1,type:t.signalType});break;case"addParticipant":uh(t.actor,t.actor,t.description,"participant");break;case"addActor":uh(t.actor,t.actor,t.description,"actor");break;case"activeStart":case"activeEnd":dh(t.actor,void 0,void 0,t.signalType);break;case"addNote":yh(t.actor,t.placement,t.text);break;case"addLinks":mh(t.actor,t.text);break;case"addALink":!function(t,e){const n=ph(t);try{const t={};let s=It(e.text,gi());var i=s.indexOf("@");s=s.replace(/&/g,"&"),s=s.replace(/=/g,"=");var r=s.slice(0,i-1).trim(),a=s.slice(i+1).trim();t[r]=a,bh(n,t)}catch(s){Bt.error("error while parsing actor link text",s)}}(t.actor,t.text);break;case"addProperties":_h(t.actor,t.text);break;case"addDetails":vh(t.actor,t.text);break;case"addMessage":dh(t.from,t.to,t.msg,t.signalType);break;case"boxStart":e=t.boxData,ch.push({name:e.text,wrap:void 0===e.wrap&&fh()||!!e.wrap,fill:e.color,actorKeys:[]}),sh=ch.slice(-1)[0];break;case"boxEnd":sh=void 0;break;case"loopStart":dh(void 0,void 0,t.loopText,t.signalType);break;case"loopEnd":case"rectEnd":case"optEnd":case"altEnd":case"parEnd":case"criticalEnd":case"breakEnd":dh(void 0,void 0,void 0,t.signalType);break;case"rectStart":dh(void 0,void 0,t.color,t.signalType);break;case"optStart":dh(void 0,void 0,t.optText,t.signalType);break;case"altStart":case"else":dh(void 0,void 0,t.altText,t.signalType);break;case"setAccTitle":zi(t.text);break;case"parStart":case"and":dh(void 0,void 0,t.parText,t.signalType);break;case"criticalStart":dh(void 0,void 0,t.criticalText,t.signalType);break;case"option":dh(void 0,void 0,t.optionText,t.signalType);break;case"breakStart":dh(void 0,void 0,t.breakText,t.signalType)}var e},wh={addActor:uh,addMessage:function(t,e,n,i){lh.push({from:t,to:e,message:n.text,wrap:void 0===n.wrap&&fh()||!!n.wrap,answer:i})},addSignal:dh,addLinks:mh,addDetails:vh,addProperties:_h,autoWrap:fh,setWrap:function(t){ah=t},enableSequenceNumbers:function(){hh=!0},disableSequenceNumbers:function(){hh=!1},showSequenceNumbers:()=>hh,getMessages:function(){return lh},getActors:function(){return oh},getActor:ph,getActorKeys:function(){return Object.keys(oh)},getActorProperty:function(t,e){if(void 0!==t&&void 0!==t.properties)return t.properties[e]},getAccTitle:Ui,getBoxes:function(){return ch},getDiagramTitle:Vi,setDiagramTitle:Hi,parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().sequence,clear:function(){oh={},ch=[],lh=[],hh=!1,Yi()},parseMessage:function(t){const e=t.trim(),n={text:e.replace(/^:?(?:no)?wrap:/,"").trim(),wrap:null!==e.match(/^:?wrap:/)||null===e.match(/^:?nowrap:/)&&void 0};return Bt.debug("parseMessage:",n),n},parseBoxData:function(t){const e=t.match(/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/);let n=null!=e&&e[1]?e[1].trim():"transparent",i=null!=e&&e[2]?e[2].trim():void 0;if(window&&window.CSS)window.CSS.supports("color",n)||(n="transparent",i=t.trim());else{const e=(new Option).style;e.color=n,e.color!==n&&(n="transparent",i=t.trim())}return{color:n,text:void 0!==i?It(i.replace(/^:?(?:no)?wrap:/,""),gi()):void 0,wrap:void 0!==i?null!==i.match(/^:?wrap:/)||null===i.match(/^:?nowrap:/)&&void 0:void 0}},LINETYPE:gh,ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},addNote:yh,setAccTitle:zi,apply:kh,setAccDescription:Wi,getAccDescription:qi,hasAtLeastOneBox:function(){return ch.length>0},hasAtLeastOneBoxWithTitle:function(){return ch.some((t=>t.name))}};let Ch=[];const Th=()=>{Ch.forEach((t=>{t()})),Ch=[]},Eh=function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},Sh=(t,e)=>{var n;n=()=>{const n=document.querySelectorAll(t);0!==n.length&&(n[0].addEventListener("mouseover",(function(){Bh("actor"+e+"_popup")})),n[0].addEventListener("mouseout",(function(){Nh("actor"+e+"_popup")})))},Ch.push(n)},Ah=function(t,e,n,i){const r=t.append("image");r.attr("x",e),r.attr("y",n);var a=(0,s.Nm)(i);r.attr("xlink:href",a)},Lh=function(t,e,n,i){const r=t.append("use");r.attr("x",e),r.attr("y",n);var a=(0,s.Nm)(i);r.attr("xlink:href","#"+a)},Bh=function(t){var e=document.getElementById(t);null!=e&&(e.style.display="block")},Nh=function(t){var e=document.getElementById(t);null!=e&&(e.style.display="none")},Dh=function(t,e){let n=0,i=0;const r=e.text.split(jt.lineBreakRegex),[a,s]=ri(e.fontSize);let o=[],c=0,l=()=>e.y;if(void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0)switch(e.valign){case"top":case"start":l=()=>Math.round(e.y+e.textMargin);break;case"middle":case"center":l=()=>Math.round(e.y+(n+i+e.textMargin)/2);break;case"bottom":case"end":l=()=>Math.round(e.y+(n+i+2*e.textMargin)-e.textMargin)}if(void 0!==e.anchor&&void 0!==e.textMargin&&void 0!==e.width)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle"}for(let[h,u]of r.entries()){void 0!==e.textMargin&&0===e.textMargin&&void 0!==a&&(c=h*a);const r=t.append("text");if(r.attr("x",e.x),r.attr("y",l()),void 0!==e.anchor&&r.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),void 0!==e.fontFamily&&r.style("font-family",e.fontFamily),void 0!==s&&r.style("font-size",s),void 0!==e.fontWeight&&r.style("font-weight",e.fontWeight),void 0!==e.fill&&r.attr("fill",e.fill),void 0!==e.class&&r.attr("class",e.class),void 0!==e.dy?r.attr("dy",e.dy):0!==c&&r.attr("dy",c),e.tspan){const t=r.append("tspan");t.attr("x",e.x),void 0!==e.fill&&t.attr("fill",e.fill),t.text(u)}else r.text(u);void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0&&(i+=(r._groups||r)[0][0].getBBox().height,n=i),o.push(r)}return o},Oh=function(t,e){const n=t.append("polygon");var i,r,a,s,o;return n.attr("points",(i=e.x,r=e.y,a=e.width,s=e.height,i+","+r+" "+(i+a)+","+r+" "+(i+a)+","+(r+s-(o=7))+" "+(i+a-1.2*o)+","+(r+s)+" "+i+","+(r+s))),n.attr("class","labelBox"),e.y=e.y+e.height/2,Dh(t,e),n};let Mh=-1;const Ih=(t,e)=>{t.selectAll&&t.selectAll(".actor-line").attr("class","200").attr("y2",e-55)},Fh=function(t,e){Eh(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"}).lower()},$h=function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},Rh=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},Zh=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c){const{actorFontSize:l,actorFontFamily:h,actorFontWeight:u}=c,[d,p]=ri(l),f=t.split(jt.lineBreakRegex);for(let g=0;g<f.length;g++){const t=g*d-d*(f.length-1)/2,c=e.append("text").attr("x",n+a/2).attr("y",r).style("text-anchor","middle").style("font-size",p).style("font-weight",u).style("font-family",h);c.append("tspan").attr("x",n+a/2).attr("dy",t).text(f[g]),c.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(c,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,o,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),Ph=function(){function t(t,e,n,r,a,s,o){i(e.append("text").attr("x",n).attr("y",r).style("text-anchor","start").text(t),o)}function e(t,e,n,r,a,s,o,c){const{actorFontSize:l,actorFontFamily:h,actorFontWeight:u}=c,d=t.split(jt.lineBreakRegex);for(let p=0;p<d.length;p++){const t=p*l-l*(d.length-1)/2,a=e.append("text").attr("x",n).attr("y",r).style("text-anchor","start").style("font-size",l).style("font-weight",u).style("font-family",h);a.append("tspan").attr("x",n).attr("dy",t).text(d[p]),a.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(a,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,0,o,c,l),i(u,c)}function i(t,e){for(const n in e)e.hasOwnProperty(n)&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),jh={drawRect:Eh,drawText:Dh,drawLabel:Oh,drawActor:function(t,e,n,i){switch(e.type){case"actor":return function(t,e,n,i){const r=e.x+e.width/2,a=e.y+80;i||(Mh++,t.append("line").attr("id","actor"+Mh).attr("x1",r).attr("y1",a).attr("x2",r).attr("y2",2e3).attr("class","actor-line").attr("stroke-width","0.5px").attr("stroke","#999"));const s=t.append("g");s.attr("class","actor-man");const o=Rh();o.x=e.x,o.y=e.y,o.fill="#eaeaea",o.width=e.width,o.height=e.height,o.class="actor",o.rx=3,o.ry=3,s.append("line").attr("id","actor-man-torso"+Mh).attr("x1",r).attr("y1",e.y+25).attr("x2",r).attr("y2",e.y+45),s.append("line").attr("id","actor-man-arms"+Mh).attr("x1",r-18).attr("y1",e.y+33).attr("x2",r+18).attr("y2",e.y+33),s.append("line").attr("x1",r-18).attr("y1",e.y+60).attr("x2",r).attr("y2",e.y+45),s.append("line").attr("x1",r).attr("y1",e.y+45).attr("x2",r+16).attr("y2",e.y+60);const c=s.append("circle");c.attr("cx",e.x+e.width/2),c.attr("cy",e.y+10),c.attr("r",15),c.attr("width",e.width),c.attr("height",e.height);const l=s.node().getBBox();return e.height=l.height,Zh(n)(e.description,s,o.x,o.y+35,o.width,o.height,{class:"actor"},n),e.height}(t,e,n,i);case"participant":return function(t,e,n,i){const r=e.x+e.width/2,a=e.y+5,s=t.append("g");var o=s;i||(Mh++,o.append("line").attr("id","actor"+Mh).attr("x1",r).attr("y1",a).attr("x2",r).attr("y2",2e3).attr("class","actor-line").attr("stroke-width","0.5px").attr("stroke","#999"),o=s.append("g"),e.actorCnt=Mh,null!=e.links&&(o.attr("id","root-"+Mh),Sh("#root-"+Mh,Mh)));const c=Rh();var l="actor";null!=e.properties&&e.properties.class?l=e.properties.class:c.fill="#eaeaea",c.x=e.x,c.y=e.y,c.width=e.width,c.height=e.height,c.class=l,c.rx=3,c.ry=3;const h=Eh(o,c);if(e.rectData=c,null!=e.properties&&e.properties.icon){const t=e.properties.icon.trim();"@"===t.charAt(0)?Lh(o,c.x+c.width-20,c.y+10,t.substr(1)):Ah(o,c.x+c.width-20,c.y+10,t)}Zh(n)(e.description,o,c.x,c.y,c.width,c.height,{class:"actor"},n);let u=e.height;if(h.node){const t=h.node().getBBox();e.height=t.height,u=t.height}return u}(t,e,n,i)}},drawBox:function(t,e,n){const i=t.append("g");Fh(i,e),e.name&&Zh(n)(e.name,i,e.x,e.y+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},n),i.lower()},drawPopup:function(t,e,n,i,r){if(void 0===e.links||null===e.links||0===Object.keys(e.links).length)return{height:0,width:0};const a=e.links,o=e.actorCnt,c=e.rectData;var l="none";r&&(l="block !important");const h=t.append("g");h.attr("id","actor"+o+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",l),Sh("#actor"+o+"_popup",o);var u="";void 0!==c.class&&(u=" "+c.class);let d=c.width>n?c.width:n;const p=h.append("rect");if(p.attr("class","actorPopupMenuPanel"+u),p.attr("x",c.x),p.attr("y",c.height),p.attr("fill",c.fill),p.attr("stroke",c.stroke),p.attr("width",d),p.attr("height",c.height),p.attr("rx",c.rx),p.attr("ry",c.ry),null!=a){var f=20;for(let t in a){var g=h.append("a"),y=(0,s.Nm)(a[t]);g.attr("xlink:href",y),g.attr("target","_blank"),Ph(i)(t,g,c.x+10,c.height+f,d,20,{class:"actor"},i),f+=30}}return p.attr("height",f),{height:c.height+f,width:d}},drawImage:Ah,drawEmbeddedImage:Lh,anchorElement:function(t){return t.append("g")},drawActivation:function(t,e,n,i,r){const a=Rh(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+r%3,a.width=e.stopx-e.startx,a.height=n-e.starty,Eh(s,a)},drawLoop:function(t,e,n,i){const{boxMargin:r,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:o,messageFontFamily:c,messageFontSize:l,messageFontWeight:h}=i,u=t.append("g"),d=function(t,e,n,i){return u.append("line").attr("x1",t).attr("y1",e).attr("x2",n).attr("y2",i).attr("class","loopLine")};d(e.startx,e.starty,e.stopx,e.starty),d(e.stopx,e.starty,e.stopx,e.stopy),d(e.startx,e.stopy,e.stopx,e.stopy),d(e.startx,e.starty,e.startx,e.stopy),void 0!==e.sections&&e.sections.forEach((function(t){d(e.startx,t.y,e.stopx,t.y).style("stroke-dasharray","3, 3")}));let p=$h();p.text=n,p.x=e.startx,p.y=e.starty,p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.anchor="middle",p.valign="middle",p.tspan=!1,p.width=o||50,p.height=s||20,p.textMargin=a,p.class="labelText",Oh(u,p),p=$h(),p.text=e.title,p.x=e.startx+o/2+(e.stopx-e.startx)/2,p.y=e.starty+r+a,p.anchor="middle",p.valign="middle",p.textMargin=a,p.class="loopText",p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.wrap=!0;let f=Dh(u,p);return void 0!==e.sectionTitles&&e.sectionTitles.forEach((function(t,n){if(t.message){p.text=t.message,p.x=e.startx+(e.stopx-e.startx)/2,p.y=e.sections[n].y+r+a,p.class="loopText",p.anchor="middle",p.valign="middle",p.tspan=!1,p.fontFamily=c,p.fontSize=l,p.fontWeight=h,p.wrap=e.wrap,f=Dh(u,p);let i=Math.round(f.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));e.sections[n].height+=i-(r+a)}})),e.height=Math.round(e.stopy-e.starty),u},drawBackgroundRect:Fh,insertArrowHead:function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},insertArrowFilledHead:function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},insertSequenceNumber:function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},insertArrowCrossHead:function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},insertDatabaseIcon:function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},insertComputerIcon:function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},insertClockIcon:function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},getTextObj:$h,getNoteRect:Rh,popupMenu:function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = 'block'; }"},popdownMenu:function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = 'none'; }"},fixLifeLineHeights:Ih,sanitizeUrl:s.Nm};let Yh={};const zh={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:function(){return Math.max.apply(null,0===this.actors.length?[0]:this.actors.map((t=>t.height||0)))+(0===this.loops.length?0:this.loops.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.messages.length?0:this.messages.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.notes.length?0:this.notes.map((t=>t.height||0)).reduce(((t,e)=>t+e)))},clear:function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},addBox:function(t){this.boxes.push(t)},addActor:function(t){this.actors.push(t)},addLoop:function(t){this.loops.push(t)},addMessage:function(t){this.messages.push(t)},addNote:function(t){this.notes.push(t)},lastActor:function(){return this.actors[this.actors.length-1]},lastLoop:function(){return this.loops[this.loops.length-1]},lastMessage:function(){return this.messages[this.messages.length-1]},lastNote:function(){return this.notes[this.notes.length-1]},actors:[],boxes:[],loops:[],messages:[],notes:[]},init:function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,Gh(gi())},updateVal:function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},updateBounds:function(t,e,n,i){const r=this;let a=0;function s(s){return function(o){a++;const c=r.sequenceItems.length-a+1;r.updateVal(o,"starty",e-c*Yh.boxMargin,Math.min),r.updateVal(o,"stopy",i+c*Yh.boxMargin,Math.max),r.updateVal(zh.data,"startx",t-c*Yh.boxMargin,Math.min),r.updateVal(zh.data,"stopx",n+c*Yh.boxMargin,Math.max),"activation"!==s&&(r.updateVal(o,"startx",t-c*Yh.boxMargin,Math.min),r.updateVal(o,"stopx",n+c*Yh.boxMargin,Math.max),r.updateVal(zh.data,"starty",e-c*Yh.boxMargin,Math.min),r.updateVal(zh.data,"stopy",i+c*Yh.boxMargin,Math.max))}}this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},insert:function(t,e,n,i){const r=Math.min(t,n),a=Math.max(t,n),s=Math.min(e,i),o=Math.max(e,i);this.updateVal(zh.data,"startx",r,Math.min),this.updateVal(zh.data,"starty",s,Math.min),this.updateVal(zh.data,"stopx",a,Math.max),this.updateVal(zh.data,"stopy",o,Math.max),this.updateBounds(r,s,a,o)},newActivation:function(t,e,n){const i=n[t.from.actor],r=Xh(t.from.actor).length||0,a=i.x+i.width/2+(r-1)*Yh.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+Yh.activationWidth,stopy:void 0,actor:t.from.actor,anchored:jh.anchorElement(e)})},endActivation:function(t){const e=this.activations.map((function(t){return t.actor})).lastIndexOf(t.from.actor);return this.activations.splice(e,1)[0]},createLoop:function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},newLoop:function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},endLoop:function(){return this.sequenceItems.pop()},addSectionToLoop:function(t){const e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:zh.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return{bounds:this.data,models:this.models}}},Uh=t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),Wh=t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),qh=t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight});const Hh=function(t,e,n,i,r,a,s){if(!0===r.hideUnusedParticipants){const t=new Set;a.forEach((e=>{t.add(e.from),t.add(e.to)})),n=n.filter((e=>t.has(e)))}let o,c=0,l=0,h=0;for(const u of n){const n=e[u],r=n.box;o&&o!=r&&(s||zh.models.addBox(o),l+=Yh.boxMargin+o.margin),r&&r!=o&&(s||(r.x=c+l,r.y=i),l+=r.margin),n.width=n.width||Yh.width,n.height=Math.max(n.height||Yh.height,Yh.height),n.margin=n.margin||Yh.actorMargin,n.x=c+l,n.y=zh.getVerticalPos();const a=jh.drawActor(t,n,Yh,s);h=Math.max(h,a),zh.insert(n.x,i,n.x+n.width,n.height),c+=n.width+l,n.box&&(n.box.width=c+r.margin-n.box.x),l=n.margin,o=n.box,zh.models.addActor(n)}o&&!s&&zh.models.addBox(o),zh.bumpVerticalPos(h)},Vh=function(t,e,n,i){let r=0,a=0;for(const s of n){const n=e[s],o=Jh(n),c=jh.drawPopup(t,n,o,Yh,Yh.forceMenus,i);c.height>r&&(r=c.height),c.width+n.x>a&&(a=c.width+n.x)}return{maxHeight:r,maxWidth:a}},Gh=function(t){$n(Yh,t),t.fontFamily&&(Yh.actorFontFamily=Yh.noteFontFamily=Yh.messageFontFamily=t.fontFamily),t.fontSize&&(Yh.actorFontSize=Yh.noteFontSize=Yh.messageFontSize=t.fontSize),t.fontWeight&&(Yh.actorFontWeight=Yh.noteFontWeight=Yh.messageFontWeight=t.fontWeight)},Xh=function(t){return zh.activations.filter((function(e){return e.actor===t}))},Qh=function(t,e){const n=e[t],i=Xh(t);return[i.reduce((function(t,e){return Math.min(t,e.startx)}),n.x+n.width/2),i.reduce((function(t,e){return Math.max(t,e.stopx)}),n.x+n.width/2)]};function Kh(t,e,n,i,r){zh.bumpVerticalPos(n);let a=i;if(e.id&&e.message&&t[e.id]){const n=t[e.id].width,r=Uh(Yh);e.message=ai.wrapLabel(`[${e.message}]`,n-2*Yh.wrapPadding,r),e.width=n,e.wrap=!0;const s=ai.calculateTextDimensions(e.message,r),o=Math.max(s.height,Yh.labelBoxHeight);a=i+o,Bt.debug(`${o} - ${e.message}`)}r(e),zh.bumpVerticalPos(a)}const Jh=function(t){let e=0;const n=qh(Yh);for(const i in t.links){const t=ai.calculateTextDimensions(i,n).width+2*Yh.wrapPadding+2*Yh.boxMargin;e<t&&(e=t)}return e};const tu=function(t,e,n,i){const r={},a=[];let s,o,c;return t.forEach((function(t){switch(t.id=ai.random({length:10}),t.type){case i.db.LINETYPE.LOOP_START:case i.db.LINETYPE.ALT_START:case i.db.LINETYPE.OPT_START:case i.db.LINETYPE.PAR_START:case i.db.LINETYPE.CRITICAL_START:case i.db.LINETYPE.BREAK_START:a.push({id:t.id,msg:t.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case i.db.LINETYPE.ALT_ELSE:case i.db.LINETYPE.PAR_AND:case i.db.LINETYPE.CRITICAL_OPTION:t.message&&(s=a.pop(),r[s.id]=s,r[t.id]=s,a.push(s));break;case i.db.LINETYPE.LOOP_END:case i.db.LINETYPE.ALT_END:case i.db.LINETYPE.OPT_END:case i.db.LINETYPE.PAR_END:case i.db.LINETYPE.CRITICAL_END:case i.db.LINETYPE.BREAK_END:s=a.pop(),r[s.id]=s;break;case i.db.LINETYPE.ACTIVE_START:{const n=e[t.from?t.from.actor:t.to.actor],i=Xh(t.from?t.from.actor:t.to.actor).length,r=n.x+n.width/2+(i-1)*Yh.activationWidth/2,a={startx:r,stopx:r+Yh.activationWidth,actor:t.from.actor,enabled:!0};zh.activations.push(a)}break;case i.db.LINETYPE.ACTIVE_END:{const e=zh.activations.map((t=>t.actor)).lastIndexOf(t.from.actor);delete zh.activations.splice(e,1)[0]}}void 0!==t.placement?(o=function(t,e,n){const i=e[t.from].x,r=e[t.to].x,a=t.wrap&&t.message;let s=ai.calculateTextDimensions(a?ai.wrapLabel(t.message,Yh.width,Wh(Yh)):t.message,Wh(Yh));const o={width:a?Yh.width:Math.max(Yh.width,s.width+2*Yh.noteMargin),height:0,startx:e[t.from].x,stopx:0,starty:0,stopy:0,message:t.message};return t.placement===n.db.PLACEMENT.RIGHTOF?(o.width=a?Math.max(Yh.width,s.width):Math.max(e[t.from].width/2+e[t.to].width/2,s.width+2*Yh.noteMargin),o.startx=i+(e[t.from].width+Yh.actorMargin)/2):t.placement===n.db.PLACEMENT.LEFTOF?(o.width=a?Math.max(Yh.width,s.width+2*Yh.noteMargin):Math.max(e[t.from].width/2+e[t.to].width/2,s.width+2*Yh.noteMargin),o.startx=i-o.width+(e[t.from].width-Yh.actorMargin)/2):t.to===t.from?(s=ai.calculateTextDimensions(a?ai.wrapLabel(t.message,Math.max(Yh.width,e[t.from].width),Wh(Yh)):t.message,Wh(Yh)),o.width=a?Math.max(Yh.width,e[t.from].width):Math.max(e[t.from].width,Yh.width,s.width+2*Yh.noteMargin),o.startx=i+(e[t.from].width-o.width)/2):(o.width=Math.abs(i+e[t.from].width/2-(r+e[t.to].width/2))+Yh.actorMargin,o.startx=i<r?i+e[t.from].width/2-Yh.actorMargin/2:r+e[t.to].width/2-Yh.actorMargin/2),a&&(o.message=ai.wrapLabel(t.message,o.width-2*Yh.wrapPadding,Wh(Yh))),Bt.debug(`NM:[${o.startx},${o.stopx},${o.starty},${o.stopy}:${o.width},${o.height}=${t.message}]`),o}(t,e,i),t.noteModel=o,a.forEach((t=>{s=t,s.from=Math.min(s.from,o.startx),s.to=Math.max(s.to,o.startx+o.width),s.width=Math.max(s.width,Math.abs(s.from-s.to))-Yh.labelBoxWidth}))):(c=function(t,e,n){let i=!1;if([n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT].includes(t.type)&&(i=!0),!i)return{};const r=Qh(t.from,e),a=Qh(t.to,e),s=r[0]<=a[0]?1:0,o=r[0]<a[0]?0:1,c=[...r,...a],l=Math.abs(a[o]-r[s]);t.wrap&&t.message&&(t.message=ai.wrapLabel(t.message,Math.max(l+2*Yh.wrapPadding,Yh.width),Uh(Yh)));const h=ai.calculateTextDimensions(t.message,Uh(Yh));return{width:Math.max(t.wrap?0:h.width+2*Yh.wrapPadding,l+2*Yh.wrapPadding,Yh.width),height:0,startx:r[s],stopx:a[o],starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,c),toBounds:Math.max.apply(null,c)}}(t,e,i),t.msgModel=c,c.startx&&c.stopx&&a.length>0&&a.forEach((n=>{if(s=n,c.startx===c.stopx){const n=e[t.from],i=e[t.to];s.from=Math.min(n.x-c.width/2,n.x-n.width/2,s.from),s.to=Math.max(i.x+c.width/2,i.x+n.width/2,s.to),s.width=Math.max(s.width,Math.abs(s.to-s.from))-Yh.labelBoxWidth}else s.from=Math.min(c.startx,s.from),s.to=Math.max(c.stopx,s.to),s.width=Math.max(s.width,c.width)-Yh.labelBoxWidth})))})),zh.activations=[],Bt.debug("Loop type widths:",r),r},eu={bounds:zh,drawActors:Hh,drawActorsPopup:Vh,setConf:Gh,draw:function(t,e,n,i){const{securityLevel:r,sequence:a}=gi();let s;Yh=a,i.db.clear(),i.parser.parse(t),"sandbox"===r&&(s=(0,o.Ys)("#i"+e));const c="sandbox"===r?(0,o.Ys)(s.nodes()[0].contentDocument.body):(0,o.Ys)("body"),l="sandbox"===r?s.nodes()[0].contentDocument:document;zh.init(),Bt.debug(i.db);const h="sandbox"===r?c.select(`[id="${e}"]`):(0,o.Ys)(`[id="${e}"]`),u=i.db.getActors(),d=i.db.getBoxes(),p=i.db.getActorKeys(),f=i.db.getMessages(),g=i.db.getDiagramTitle(),y=i.db.hasAtLeastOneBox(),m=i.db.hasAtLeastOneBoxWithTitle(),b=function(t,e,n){const i={};return e.forEach((function(e){if(t[e.to]&&t[e.from]){const r=t[e.to];if(e.placement===n.db.PLACEMENT.LEFTOF&&!r.prevActor)return;if(e.placement===n.db.PLACEMENT.RIGHTOF&&!r.nextActor)return;const a=void 0!==e.placement,s=!a,o=a?Wh(Yh):Uh(Yh),c=e.wrap?ai.wrapLabel(e.message,Yh.width-2*Yh.wrapPadding,o):e.message,l=ai.calculateTextDimensions(c,o).width+2*Yh.wrapPadding;s&&e.from===r.nextActor?i[e.to]=Math.max(i[e.to]||0,l):s&&e.from===r.prevActor?i[e.from]=Math.max(i[e.from]||0,l):s&&e.from===e.to?(i[e.from]=Math.max(i[e.from]||0,l/2),i[e.to]=Math.max(i[e.to]||0,l/2)):e.placement===n.db.PLACEMENT.RIGHTOF?i[e.from]=Math.max(i[e.from]||0,l):e.placement===n.db.PLACEMENT.LEFTOF?i[r.prevActor]=Math.max(i[r.prevActor]||0,l):e.placement===n.db.PLACEMENT.OVER&&(r.prevActor&&(i[r.prevActor]=Math.max(i[r.prevActor]||0,l/2)),r.nextActor&&(i[e.from]=Math.max(i[e.from]||0,l/2)))}})),Bt.debug("maxMessageWidthPerActor:",i),i}(u,f,i);Yh.height=function(t,e,n){let i=0;Object.keys(t).forEach((e=>{const n=t[e];n.wrap&&(n.description=ai.wrapLabel(n.description,Yh.width-2*Yh.wrapPadding,qh(Yh)));const r=ai.calculateTextDimensions(n.description,qh(Yh));n.width=n.wrap?Yh.width:Math.max(Yh.width,r.width+2*Yh.wrapPadding),n.height=n.wrap?Math.max(r.height,Yh.height):Yh.height,i=Math.max(i,n.height)}));for(const a in e){const n=t[a];if(!n)continue;const i=t[n.nextActor];if(!i){const t=e[a]+Yh.actorMargin-n.width/2;n.margin=Math.max(t,Yh.actorMargin);continue}const r=e[a]+Yh.actorMargin-n.width/2-i.width/2;n.margin=Math.max(r,Yh.actorMargin)}let r=0;return n.forEach((e=>{const n=Uh(Yh);let i=e.actorKeys.reduce(((e,n)=>e+(t[n].width+(t[n].margin||0))),0);i-=2*Yh.boxTextMargin,e.wrap&&(e.name=ai.wrapLabel(e.name,i-2*Yh.wrapPadding,n));const a=ai.calculateTextDimensions(e.name,n);r=Math.max(a.height,r);const s=Math.max(i,a.width+2*Yh.wrapPadding);if(e.margin=Yh.boxTextMargin,i<s){const t=(s-i)/2;e.margin+=t}})),n.forEach((t=>t.textMaxHeight=r)),Math.max(i,Yh.height)}(u,b,d),jh.insertComputerIcon(h),jh.insertDatabaseIcon(h),jh.insertClockIcon(h),y&&(zh.bumpVerticalPos(Yh.boxMargin),m&&zh.bumpVerticalPos(d[0].textMaxHeight)),Hh(h,u,p,0,Yh,f,!1);const _=tu(f,u,b,i);jh.insertArrowHead(h),jh.insertArrowCrossHead(h),jh.insertArrowFilledHead(h),jh.insertSequenceNumber(h);let x=1,v=1;const k=[];f.forEach((function(t){let e,n,r;switch(t.type){case i.db.LINETYPE.NOTE:n=t.noteModel,function(t,e){zh.bumpVerticalPos(Yh.boxMargin),e.height=Yh.boxMargin,e.starty=zh.getVerticalPos();const n=jh.getNoteRect();n.x=e.startx,n.y=e.starty,n.width=e.width||Yh.width,n.class="note";const i=t.append("g"),r=jh.drawRect(i,n),a=jh.getTextObj();a.x=e.startx,a.y=e.starty,a.width=n.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=Yh.noteFontFamily,a.fontSize=Yh.noteFontSize,a.fontWeight=Yh.noteFontWeight,a.anchor=Yh.noteAlign,a.textMargin=Yh.noteMargin,a.valign="center";const s=Dh(i,a),o=Math.round(s.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));r.attr("height",o+2*Yh.noteMargin),e.height+=o+2*Yh.noteMargin,zh.bumpVerticalPos(o+2*Yh.noteMargin),e.stopy=e.starty+o+2*Yh.noteMargin,e.stopx=e.startx+n.width,zh.insert(e.startx,e.starty,e.stopx,e.stopy),zh.models.addNote(e)}(h,n);break;case i.db.LINETYPE.ACTIVE_START:zh.newActivation(t,h,u);break;case i.db.LINETYPE.ACTIVE_END:!function(t,e){const n=zh.endActivation(t);n.starty+18>e&&(n.starty=e-6,e+=12),jh.drawActivation(h,n,e,Yh,Xh(t.from.actor).length),zh.insert(n.startx,e-10,n.stopx,e)}(t,zh.getVerticalPos());break;case i.db.LINETYPE.LOOP_START:Kh(_,t,Yh.boxMargin,Yh.boxMargin+Yh.boxTextMargin,(t=>zh.newLoop(t)));break;case i.db.LINETYPE.LOOP_END:e=zh.endLoop(),jh.drawLoop(h,e,"loop",Yh),zh.bumpVerticalPos(e.stopy-zh.getVerticalPos()),zh.models.addLoop(e);break;case i.db.LINETYPE.RECT_START:Kh(_,t,Yh.boxMargin,Yh.boxMargin,(t=>zh.newLoop(void 0,t.message)));break;case i.db.LINETYPE.RECT_END:e=zh.endLoop(),jh.drawBackgroundRect(h,e),zh.models.addLoop(e),zh.bumpVerticalPos(e.stopy-zh.getVerticalPos());break;case i.db.LINETYPE.OPT_START:Kh(_,t,Yh.boxMargin,Yh.boxMargin+Yh.boxTextMargin,(t=>zh.newLoop(t)));break;case i.db.LINETYPE.OPT_END:e=zh.endLoop(),jh.drawLoop(h,e,"opt",Yh),zh.bumpVerticalPos(e.stopy-zh.getVerticalPos()),zh.models.addLoop(e);break;case i.db.LINETYPE.ALT_START:Kh(_,t,Yh.boxMargin,Yh.boxMargin+Yh.boxTextMargin,(t=>zh.newLoop(t)));break;case i.db.LINETYPE.ALT_ELSE:Kh(_,t,Yh.boxMargin+Yh.boxTextMargin,Yh.boxMargin,(t=>zh.addSectionToLoop(t)));break;case i.db.LINETYPE.ALT_END:e=zh.endLoop(),jh.drawLoop(h,e,"alt",Yh),zh.bumpVerticalPos(e.stopy-zh.getVerticalPos()),zh.models.addLoop(e);break;case i.db.LINETYPE.PAR_START:Kh(_,t,Yh.boxMargin,Yh.boxMargin+Yh.boxTextMargin,(t=>zh.newLoop(t)));break;case i.db.LINETYPE.PAR_AND:Kh(_,t,Yh.boxMargin+Yh.boxTextMargin,Yh.boxMargin,(t=>zh.addSectionToLoop(t)));break;case i.db.LINETYPE.PAR_END:e=zh.endLoop(),jh.drawLoop(h,e,"par",Yh),zh.bumpVerticalPos(e.stopy-zh.getVerticalPos()),zh.models.addLoop(e);break;case i.db.LINETYPE.AUTONUMBER:x=t.message.start||x,v=t.message.step||v,t.message.visible?i.db.enableSequenceNumbers():i.db.disableSequenceNumbers();break;case i.db.LINETYPE.CRITICAL_START:Kh(_,t,Yh.boxMargin,Yh.boxMargin+Yh.boxTextMargin,(t=>zh.newLoop(t)));break;case i.db.LINETYPE.CRITICAL_OPTION:Kh(_,t,Yh.boxMargin+Yh.boxTextMargin,Yh.boxMargin,(t=>zh.addSectionToLoop(t)));break;case i.db.LINETYPE.CRITICAL_END:e=zh.endLoop(),jh.drawLoop(h,e,"critical",Yh),zh.bumpVerticalPos(e.stopy-zh.getVerticalPos()),zh.models.addLoop(e);break;case i.db.LINETYPE.BREAK_START:Kh(_,t,Yh.boxMargin,Yh.boxMargin+Yh.boxTextMargin,(t=>zh.newLoop(t)));break;case i.db.LINETYPE.BREAK_END:e=zh.endLoop(),jh.drawLoop(h,e,"break",Yh),zh.bumpVerticalPos(e.stopy-zh.getVerticalPos()),zh.models.addLoop(e);break;default:try{r=t.msgModel,r.starty=zh.getVerticalPos(),r.sequenceIndex=x,r.sequenceVisible=i.db.showSequenceNumbers();const e=function(t,e){zh.bumpVerticalPos(10);const{startx:n,stopx:i,message:r}=e,a=jt.splitBreaks(r).length,s=ai.calculateTextDimensions(r,Uh(Yh)),o=s.height/a;let c;e.height+=o,zh.bumpVerticalPos(o);let l=s.height-10;const h=s.width;if(n===i){c=zh.getVerticalPos()+l,Yh.rightAngles||(l+=Yh.boxMargin,c=zh.getVerticalPos()+l),l+=30;const t=Math.max(h/2,Yh.width/2);zh.insert(n-t,zh.getVerticalPos()-10+l,i+t,zh.getVerticalPos()+30+l)}else l+=Yh.boxMargin,c=zh.getVerticalPos()+l,zh.insert(n,c-10,i,c);return zh.bumpVerticalPos(l),e.height+=l,e.stopy=e.starty+e.height,zh.insert(e.fromBounds,e.starty,e.toBounds,e.stopy),c}(0,r);k.push({messageModel:r,lineStartY:e}),zh.models.addMessage(r)}catch(a){Bt.error("error while drawing message",a)}}[i.db.LINETYPE.SOLID_OPEN,i.db.LINETYPE.DOTTED_OPEN,i.db.LINETYPE.SOLID,i.db.LINETYPE.DOTTED,i.db.LINETYPE.SOLID_CROSS,i.db.LINETYPE.DOTTED_CROSS,i.db.LINETYPE.SOLID_POINT,i.db.LINETYPE.DOTTED_POINT].includes(t.type)&&(x+=v)})),k.forEach((t=>function(t,e,n,i){const{startx:r,stopx:a,starty:s,message:o,type:c,sequenceIndex:l,sequenceVisible:h}=e,u=ai.calculateTextDimensions(o,Uh(Yh)),d=jh.getTextObj();d.x=r,d.y=s+10,d.width=a-r,d.class="messageText",d.dy="1em",d.text=o,d.fontFamily=Yh.messageFontFamily,d.fontSize=Yh.messageFontSize,d.fontWeight=Yh.messageFontWeight,d.anchor=Yh.messageAlign,d.valign="center",d.textMargin=Yh.wrapPadding,d.tspan=!1,Dh(t,d);const p=u.width;let f;r===a?f=Yh.rightAngles?t.append("path").attr("d",`M ${r},${n} H ${r+Math.max(Yh.width/2,p/2)} V ${n+25} H ${r}`):t.append("path").attr("d","M "+r+","+n+" C "+(r+60)+","+(n-10)+" "+(r+60)+","+(n+30)+" "+r+","+(n+20)):(f=t.append("line"),f.attr("x1",r),f.attr("y1",n),f.attr("x2",a),f.attr("y2",n)),c===i.db.LINETYPE.DOTTED||c===i.db.LINETYPE.DOTTED_CROSS||c===i.db.LINETYPE.DOTTED_POINT||c===i.db.LINETYPE.DOTTED_OPEN?(f.style("stroke-dasharray","3, 3"),f.attr("class","messageLine1")):f.attr("class","messageLine0");let g="";Yh.arrowMarkerAbsolute&&(g=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,g=g.replace(/\(/g,"\\("),g=g.replace(/\)/g,"\\)")),f.attr("stroke-width",2),f.attr("stroke","none"),f.style("fill","none"),c!==i.db.LINETYPE.SOLID&&c!==i.db.LINETYPE.DOTTED||f.attr("marker-end","url("+g+"#arrowhead)"),c!==i.db.LINETYPE.SOLID_POINT&&c!==i.db.LINETYPE.DOTTED_POINT||f.attr("marker-end","url("+g+"#filled-head)"),c!==i.db.LINETYPE.SOLID_CROSS&&c!==i.db.LINETYPE.DOTTED_CROSS||f.attr("marker-end","url("+g+"#crosshead)"),(h||Yh.showSequenceNumbers)&&(f.attr("marker-start","url("+g+"#sequencenumber)"),t.append("text").attr("x",r).attr("y",n+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(l))}(h,t.messageModel,t.lineStartY,i))),Yh.mirrorActors&&(zh.bumpVerticalPos(2*Yh.boxMargin),Hh(h,u,p,zh.getVerticalPos(),Yh,f,!0),zh.bumpVerticalPos(Yh.boxMargin),Ih(h,zh.getVerticalPos())),zh.models.boxes.forEach((function(t){t.height=zh.getVerticalPos()-t.y,zh.insert(t.x,t.y,t.x+t.width,t.height),t.startx=t.x,t.starty=t.y,t.stopx=t.startx+t.width,t.stopy=t.starty+t.height,t.stroke="rgb(0,0,0, 0.5)",jh.drawBox(h,t,Yh)})),y&&zh.bumpVerticalPos(Yh.boxMargin);const w=Vh(h,u,p,l),{bounds:C}=zh.getBounds();Bt.debug("For line height fix Querying: #"+e+" .actor-line");(0,o.td_)("#"+e+" .actor-line").attr("y2",C.stopy);let T=C.stopy-C.starty;T<w.maxHeight&&(T=w.maxHeight);let E=T+2*Yh.diagramMarginY;Yh.mirrorActors&&(E=E-Yh.boxMargin+Yh.bottomMarginAdj);let S=C.stopx-C.startx;S<w.maxWidth&&(S=w.maxWidth);const A=S+2*Yh.diagramMarginX;g&&h.append("text").text(g).attr("x",(C.stopx-C.startx)/2-2*Yh.diagramMarginX).attr("y",-25),ki(h,E,A,Yh.useMaxWidth);const L=g?40:0;h.attr("viewBox",C.startx-Yh.diagramMarginX+" -"+(Yh.diagramMarginY+L)+" "+A+" "+(E+L)),Bt.debug("models:",zh.models)}};var nu=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,3],r=[1,5],a=[1,7],s=[2,5],o=[1,15],c=[1,17],l=[1,21],h=[1,22],u=[1,23],d=[1,24],p=[1,37],f=[1,25],g=[1,26],y=[1,27],m=[1,28],b=[1,29],_=[1,32],x=[1,33],v=[1,34],k=[1,35],w=[1,36],C=[1,39],T=[1,40],E=[1,41],S=[1,42],A=[1,38],L=[1,45],B=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],N=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],D=[1,4,5,7,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],O=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],M={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,directive:6,SD:7,document:8,line:9,statement:10,classDefStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"--\x3e":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,classDef:38,CLASSDEF_ID:39,CLASSDEF_STYLEOPTS:40,DEFAULT:41,class:42,CLASSENTITY_IDS:43,STYLECLASS:44,openDirective:45,typeDirective:46,closeDirective:47,":":48,argDirective:49,direction_tb:50,direction_bt:51,direction_rl:52,direction_lr:53,eol:54,";":55,EDGE_STATE:56,STYLE_SEPARATOR:57,left_of:58,right_of:59,open_directive:60,type_directive:61,arg_directive:62,close_directive:63,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",7:"SD",14:"DESCR",15:"--\x3e",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"classDef",39:"CLASSDEF_ID",40:"CLASSDEF_STYLEOPTS",41:"DEFAULT",42:"class",43:"CLASSENTITY_IDS",44:"STYLECLASS",48:":",50:"direction_tb",51:"direction_bt",52:"direction_rl",53:"direction_lr",55:";",56:"EDGE_STATE",57:"STYLE_SEPARATOR",58:"left_of",59:"right_of",60:"open_directive",61:"type_directive",62:"arg_directive",63:"close_directive"},productions_:[0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[10,1],[10,1],[10,1],[10,2],[10,3],[10,4],[10,1],[10,2],[10,1],[10,4],[10,3],[10,6],[10,1],[10,1],[10,1],[10,1],[10,4],[10,4],[10,1],[10,1],[10,2],[10,2],[10,1],[11,3],[11,3],[12,3],[6,3],[6,5],[32,1],[32,1],[32,1],[32,1],[54,1],[54,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1],[45,1],[46,1],[49,1],[47,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 4:return i.setRootDoc(a[o]),a[o];case 5:this.$=[];break;case 6:"nl"!=a[o]&&(a[o-1].push(a[o]),this.$=a[o-1]);break;case 7:case 8:case 12:this.$=a[o];break;case 9:this.$="nl";break;case 13:const t=a[o-1];t.description=i.trimColon(a[o]),this.$=t;break;case 14:this.$={stmt:"relation",state1:a[o-2],state2:a[o]};break;case 15:const e=i.trimColon(a[o]);this.$={stmt:"relation",state1:a[o-3],state2:a[o-1],description:e};break;case 19:this.$={stmt:"state",id:a[o-3],type:"default",description:"",doc:a[o-1]};break;case 20:var c=a[o],l=a[o-2].trim();if(a[o].match(":")){var h=a[o].split(":");c=h[0],l=[l,h[1]]}this.$={stmt:"state",id:c,type:"default",description:l};break;case 21:this.$={stmt:"state",id:a[o-3],type:"default",description:a[o-5],doc:a[o-1]};break;case 22:this.$={stmt:"state",id:a[o],type:"fork"};break;case 23:this.$={stmt:"state",id:a[o],type:"join"};break;case 24:this.$={stmt:"state",id:a[o],type:"choice"};break;case 25:this.$={stmt:"state",id:i.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:a[o-1].trim(),note:{position:a[o-2].trim(),text:a[o].trim()}};break;case 30:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 31:case 32:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 33:case 34:this.$={stmt:"classDef",id:a[o-1].trim(),classes:a[o].trim()};break;case 35:this.$={stmt:"applyClass",id:a[o-1].trim(),styleClass:a[o].trim()};break;case 38:i.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:i.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:i.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:i.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:a[o].trim(),type:"default",description:""};break;case 46:case 47:this.$={stmt:"state",id:a[o-2].trim(),classes:[a[o].trim()],type:"default",description:""};break;case 50:i.parseDirective("%%{","open_directive");break;case 51:i.parseDirective(a[o],"type_directive");break;case 52:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 53:i.parseDirective("}%%","close_directive","state")}},table:[{3:1,4:n,5:i,6:4,7:r,45:6,60:a},{1:[3]},{3:8,4:n,5:i,6:4,7:r,45:6,60:a},{3:9,4:n,5:i,6:4,7:r,45:6,60:a},{3:10,4:n,5:i,6:4,7:r,45:6,60:a},e([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,42,50,51,52,53,56,60],s,{8:11}),{46:12,61:[1,13]},{61:[2,50]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:C,51:T,52:E,53:S,56:A,60:a},{47:43,48:[1,44],63:L},e([48,63],[2,51]),e(B,[2,6]),{6:30,10:46,11:18,12:19,13:20,16:l,17:h,19:u,22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:C,51:T,52:E,53:S,56:A,60:a},e(B,[2,8]),e(B,[2,9]),e(B,[2,10]),e(B,[2,11]),e(B,[2,12],{14:[1,47],15:[1,48]}),e(B,[2,16]),{18:[1,49]},e(B,[2,18],{20:[1,50]}),{23:[1,51]},e(B,[2,22]),e(B,[2,23]),e(B,[2,24]),e(B,[2,25]),{30:52,31:[1,53],58:[1,54],59:[1,55]},e(B,[2,28]),e(B,[2,29]),{34:[1,56]},{36:[1,57]},e(B,[2,32]),{39:[1,58],41:[1,59]},{43:[1,60]},e(N,[2,44],{57:[1,61]}),e(N,[2,45],{57:[1,62]}),e(B,[2,38]),e(B,[2,39]),e(B,[2,40]),e(B,[2,41]),e(D,[2,36]),{49:63,62:[1,64]},e(D,[2,53]),e(B,[2,7]),e(B,[2,13]),{13:65,24:p,56:A},e(B,[2,17]),e(O,s,{8:66}),{24:[1,67]},{24:[1,68]},{23:[1,69]},{24:[2,48]},{24:[2,49]},e(B,[2,30]),e(B,[2,31]),{40:[1,70]},{40:[1,71]},{44:[1,72]},{24:[1,73]},{24:[1,74]},{47:75,63:L},{63:[2,52]},e(B,[2,14],{14:[1,76]}),{4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,21:[1,77],22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:C,51:T,52:E,53:S,56:A,60:a},e(B,[2,20],{20:[1,78]}),{31:[1,79]},{24:[1,80]},e(B,[2,33]),e(B,[2,34]),e(B,[2,35]),e(N,[2,46]),e(N,[2,47]),e(D,[2,37]),e(B,[2,15]),e(B,[2,19]),e(O,s,{8:81}),e(B,[2,26]),e(B,[2,27]),{4:o,5:c,6:30,9:14,10:16,11:18,12:19,13:20,16:l,17:h,19:u,21:[1,82],22:d,24:p,25:f,26:g,27:y,28:m,29:b,32:31,33:_,35:x,37:v,38:k,42:w,45:6,50:C,51:T,52:E,53:S,56:A,60:a},e(B,[2,21])],defaultActions:{7:[2,50],8:[2,1],9:[2,2],10:[2,3],54:[2,48],55:[2,49],64:[2,52]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},I=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return 41;case 1:case 44:return 50;case 2:case 45:return 51;case 3:case 46:return 52;case 4:case 47:return 53;case 5:return this.begin("open_directive"),60;case 6:return this.begin("type_directive"),61;case 7:return this.popState(),this.begin("arg_directive"),48;case 8:return this.popState(),this.popState(),63;case 9:return 62;case 10:case 11:case 13:case 14:case 15:case 16:case 56:case 58:case 64:break;case 12:case 79:return 5;case 17:case 34:return this.pushState("SCALE"),17;case 18:case 35:return 18;case 19:case 25:case 36:case 51:case 54:this.popState();break;case 20:return this.begin("acc_title"),33;case 21:return this.popState(),"acc_title_value";case 22:return this.begin("acc_descr"),35;case 23:return this.popState(),"acc_descr_value";case 24:this.begin("acc_descr_multiline");break;case 26:return"acc_descr_multiline_value";case 27:return this.pushState("CLASSDEF"),38;case 28:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";case 29:return this.popState(),this.pushState("CLASSDEFID"),39;case 30:return this.popState(),40;case 31:return this.pushState("CLASS"),42;case 32:return this.popState(),this.pushState("CLASS_STYLE"),43;case 33:return this.popState(),44;case 37:this.pushState("STATE");break;case 38:case 41:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),25;case 39:case 42:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),26;case 40:case 43:return this.popState(),e.yytext=e.yytext.slice(0,-10).trim(),27;case 48:this.pushState("STATE_STRING");break;case 49:return this.pushState("STATE_ID"),"AS";case 50:case 66:return this.popState(),"ID";case 52:return"STATE_DESCR";case 53:return 19;case 55:return this.popState(),this.pushState("struct"),20;case 57:return this.popState(),21;case 59:return this.begin("NOTE"),29;case 60:return this.popState(),this.pushState("NOTE_ID"),58;case 61:return this.popState(),this.pushState("NOTE_ID"),59;case 62:this.popState(),this.pushState("FLOATING_NOTE");break;case 63:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 65:return"NOTE_TEXT";case 67:return this.popState(),this.pushState("NOTE_TEXT"),24;case 68:return this.popState(),e.yytext=e.yytext.substr(2).trim(),31;case 69:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),31;case 70:case 71:return 7;case 72:return 16;case 73:return 56;case 74:return 24;case 75:return e.yytext=e.yytext.trim(),14;case 76:return 15;case 77:return 28;case 78:return 57;case 80:return"INVALID"}},rules:[/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<<fork>>)/i,/^(?:.*<<join>>)/i,/^(?:.*<<choice>>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[14,15],inclusive:!1},close_directive:{rules:[14,15],inclusive:!1},arg_directive:{rules:[8,9,14,15],inclusive:!1},type_directive:{rules:[7,8,14,15],inclusive:!1},open_directive:{rules:[6,14,15],inclusive:!1},struct:{rules:[14,15,27,31,37,44,45,46,47,56,57,58,59,73,74,75,76,77],inclusive:!1},FLOATING_NOTE_ID:{rules:[66],inclusive:!1},FLOATING_NOTE:{rules:[63,64,65],inclusive:!1},NOTE_TEXT:{rules:[68,69],inclusive:!1},NOTE_ID:{rules:[67],inclusive:!1},NOTE:{rules:[60,61,62],inclusive:!1},CLASS_STYLE:{rules:[33],inclusive:!1},CLASS:{rules:[32],inclusive:!1},CLASSDEFID:{rules:[30],inclusive:!1},CLASSDEF:{rules:[28,29],inclusive:!1},acc_descr_multiline:{rules:[25,26],inclusive:!1},acc_descr:{rules:[23],inclusive:!1},acc_title:{rules:[21],inclusive:!1},SCALE:{rules:[18,19,35,36],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[50],inclusive:!1},STATE_STRING:{rules:[51,52],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[14,15,38,39,40,41,42,43,48,49,53,54,55],inclusive:!1},ID:{rules:[14,15],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,10,11,12,13,15,16,17,20,22,24,27,31,34,37,55,59,70,71,72,73,74,75,76,78,79,80],inclusive:!0}}},t);function F(){this.yy={}}return M.lexer=I,F.prototype=M,M.Parser=F,new F}();nu.parser=nu;const iu=nu,ru=(t,e)=>{var n;return"dagre-wrapper"!==(null==(n=null==e?void 0:e.state)?void 0:n.defaultRenderer)&&null!==t.match(/^\s*stateDiagram/)},au=(t,e)=>{var n;return null!==t.match(/^\s*stateDiagram-v2/)||!(!t.match(/^\s*stateDiagram/)||"dagre-wrapper"!==(null==(n=null==e?void 0:e.state)?void 0:n.defaultRenderer))},su="state",ou="relation",cu="default",lu="divider",hu="[*]",uu="start",du=hu,pu="color",fu="fill";let gu="LR",yu=[],mu={};let bu={root:{relations:[],states:{},documents:{}}},_u=bu.root,xu=0,vu=0;const ku=t=>JSON.parse(JSON.stringify(t)),wu=(t,e,n)=>{if(e.stmt===ou)wu(t,e.state1,!0),wu(t,e.state2,!1);else if(e.stmt===su&&("[*]"===e.id?(e.id=n?t.id+"_start":t.id+"_end",e.start=n):e.id=e.id.trim()),e.doc){const t=[];let n,i=[];for(n=0;n<e.doc.length;n++)if(e.doc[n].type===lu){const r=ku(e.doc[n]);r.doc=ku(i),t.push(r),i=[]}else i.push(e.doc[n]);if(t.length>0&&i.length>0){const n={stmt:su,id:qn(),type:"divider",doc:ku(i)};t.push(ku(n)),e.doc=t}e.doc.forEach((t=>wu(e,t,!0)))}},Cu=function(t,e=cu,n=null,i=null,r=null,a=null,s=null,o=null){const c=null==t?void 0:t.trim();if(void 0===_u.states[c]?(Bt.info("Adding state ",c,i),_u.states[c]={id:c,descriptions:[],type:e,doc:n,note:r,classes:[],styles:[],textStyles:[]}):(_u.states[c].doc||(_u.states[c].doc=n),_u.states[c].type||(_u.states[c].type=e)),i&&(Bt.info("Setting state description",c,i),"string"==typeof i&&Bu(c,i.trim()),"object"==typeof i&&i.forEach((t=>Bu(c,t.trim())))),r&&(_u.states[c].note=r,_u.states[c].note.text=jt.sanitizeText(_u.states[c].note.text,gi())),a){Bt.info("Setting state classes",c,a);("string"==typeof a?[a]:a).forEach((t=>Du(c,t.trim())))}if(s){Bt.info("Setting state styles",c,s);("string"==typeof s?[s]:s).forEach((t=>Ou(c,t.trim())))}if(o){Bt.info("Setting state styles",c,s);("string"==typeof o?[o]:o).forEach((t=>Mu(c,t.trim())))}},Tu=function(t){bu={root:{relations:[],states:{},documents:{}}},_u=bu.root,xu=0,mu={},t||Yi()},Eu=function(t){return _u.states[t]};function Su(t=""){let e=t;return t===hu&&(xu++,e=`${uu}${xu}`),e}function Au(t="",e=cu){return t===hu?uu:e}const Lu=function(t,e,n){if("object"==typeof t)!function(t,e,n){let i=Su(t.id.trim()),r=Au(t.id.trim(),t.type),a=Su(e.id.trim()),s=Au(e.id.trim(),e.type);Cu(i,r,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles),Cu(a,s,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),_u.relations.push({id1:i,id2:a,relationTitle:jt.sanitizeText(n,gi())})}(t,e,n);else{const i=Su(t.trim()),r=Au(t),a=function(t=""){let e=t;return t===du&&(xu++,e=`end${xu}`),e}(e.trim()),s=function(t="",e=cu){return t===du?"end":e}(e);Cu(i,r),Cu(a,s),_u.relations.push({id1:i,id2:a,title:jt.sanitizeText(n,gi())})}},Bu=function(t,e){const n=_u.states[t],i=e.startsWith(":")?e.replace(":","").trim():e;n.descriptions.push(jt.sanitizeText(i,gi()))},Nu=function(t,e=""){void 0===mu[t]&&(mu[t]={id:t,styles:[],textStyles:[]});const n=mu[t];null!=e&&e.split(",").forEach((t=>{const e=t.replace(/([^;]*);/,"$1").trim();if(t.match(pu)){const t=e.replace(fu,"bgFill").replace(pu,fu);n.textStyles.push(t)}n.styles.push(e)}))},Du=function(t,e){t.split(",").forEach((function(t){let n=Eu(t);if(void 0===n){const e=t.trim();Cu(e),n=Eu(e)}n.classes.push(e)}))},Ou=function(t,e){const n=Eu(t);void 0!==n&&n.textStyles.push(e)},Mu=function(t,e){const n=Eu(t);void 0!==n&&n.textStyles.push(e)},Iu={parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().state,addState:Cu,clear:Tu,getState:Eu,getStates:function(){return _u.states},getRelations:function(){return _u.relations},getClasses:function(){return mu},getDirection:()=>gu,addRelation:Lu,getDividerId:()=>(vu++,"divider-id-"+vu),setDirection:t=>{gu=t},cleanupLabel:function(t){return":"===t.substring(0,1)?t.substr(2).trim():t.trim()},lineType:{LINE:0,DOTTED_LINE:1},relationType:{AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3},logDocuments:function(){Bt.info("Documents = ",bu)},getRootDoc:()=>yu,setRootDoc:t=>{Bt.info("Setting root doc",t),yu=t},getRootDocV2:()=>(wu({id:"root"},{id:"root",doc:yu},!0),{id:"root",doc:yu}),extract:t=>{let e;e=t.doc?t.doc:t,Bt.info(e),Tu(!0),Bt.info("Extract",e),e.forEach((t=>{switch(t.stmt){case su:Cu(t.id.trim(),t.type,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles);break;case ou:Lu(t.state1,t.state2,t.description);break;case"classDef":Nu(t.id.trim(),t.classes);break;case"applyClass":Du(t.id.trim(),t.styleClass)}}))},trimColon:t=>t&&":"===t[0]?t.substr(1).trim():t.trim(),getAccTitle:Ui,setAccTitle:zi,getAccDescription:qi,setAccDescription:Wi,addStyleClass:Nu,setCssClass:Du,addDescription:Bu,setDiagramTitle:Hi,getDiagramTitle:Vi},Fu={},$u=(t,e)=>{Fu[t]=e},Ru=(t,e)=>{const n=t.append("text").attr("x",2*gi().state.padding).attr("y",gi().state.textHeight+1.3*gi().state.padding).attr("font-size",gi().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),i=n.height,r=t.append("text").attr("x",gi().state.padding).attr("y",i+.4*gi().state.padding+gi().state.dividerMargin+gi().state.textHeight).attr("class","state-description");let a=!0,s=!0;e.descriptions.forEach((function(t){a||(!function(t,e,n){const i=t.append("tspan").attr("x",2*gi().state.padding).text(e);n||i.attr("dy",gi().state.textHeight)}(r,t,s),s=!1),a=!1}));const o=t.append("line").attr("x1",gi().state.padding).attr("y1",gi().state.padding+i+gi().state.dividerMargin/2).attr("y2",gi().state.padding+i+gi().state.dividerMargin/2).attr("class","descr-divider"),c=r.node().getBBox(),l=Math.max(c.width,n.width);return o.attr("x2",l+3*gi().state.padding),t.insert("rect",":first-child").attr("x",gi().state.padding).attr("y",gi().state.padding).attr("width",l+2*gi().state.padding).attr("height",c.height+i+2*gi().state.padding).attr("rx",gi().state.radius),t},Zu=(t,e,n)=>{const i=gi().state.padding,r=2*gi().state.padding,a=t.node().getBBox(),s=a.width,o=a.x,c=t.append("text").attr("x",0).attr("y",gi().state.titleShift).attr("font-size",gi().state.fontSize).attr("class","state-title").text(e.id),l=c.node().getBBox().width+r;let h,u=Math.max(l,s);u===s&&(u+=r);const d=t.node().getBBox();e.doc,h=o-i,l>s&&(h=(s-u)/2+i),Math.abs(o-d.x)<i&&l>s&&(h=o-(l-s)/2);const p=1-gi().state.textHeight;return t.insert("rect",":first-child").attr("x",h).attr("y",p).attr("class",n?"alt-composit":"composit").attr("width",u).attr("height",d.height+gi().state.textHeight+gi().state.titleShift+1).attr("rx","0"),c.attr("x",h+i),l<=s&&c.attr("x",o+(u-r)/2-l/2+i),t.insert("rect",":first-child").attr("x",h).attr("y",gi().state.titleShift-gi().state.textHeight-gi().state.padding).attr("width",u).attr("height",3*gi().state.textHeight).attr("rx",gi().state.radius),t.insert("rect",":first-child").attr("x",h).attr("y",gi().state.titleShift-gi().state.textHeight-gi().state.padding).attr("width",u).attr("height",d.height+3+2*gi().state.textHeight).attr("rx",gi().state.radius),t},Pu=(t,e)=>{e.attr("class","state-note");const n=e.append("rect").attr("x",0).attr("y",gi().state.padding),i=e.append("g"),{textWidth:r,textHeight:a}=((t,e,n,i)=>{let r=0;const a=i.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"<br/>");s=s.replace(/\n/g,"<br/>");const o=s.split(jt.lineBreakRegex);let c=1.25*gi().state.noteMargin;for(const l of o){const t=l.trim();if(t.length>0){const i=a.append("tspan");i.text(t),0===c&&(c+=i.node().getBBox().height),r+=c,i.attr("x",e+gi().state.noteMargin),i.attr("y",n+r+1.25*gi().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:r}})(t,0,0,i);return n.attr("height",a+2*gi().state.noteMargin),n.attr("width",r+2*gi().state.noteMargin),n},ju=function(t,e){const n=e.id,i={id:n,label:e.id,width:0,height:0},r=t.append("g").attr("id",n).attr("class","stateGroup");"start"===e.type&&(t=>{t.append("circle").attr("class","start-state").attr("r",gi().state.sizeUnit).attr("cx",gi().state.padding+gi().state.sizeUnit).attr("cy",gi().state.padding+gi().state.sizeUnit)})(r),"end"===e.type&&(t=>{t.append("circle").attr("class","end-state-outer").attr("r",gi().state.sizeUnit+gi().state.miniPadding).attr("cx",gi().state.padding+gi().state.sizeUnit+gi().state.miniPadding).attr("cy",gi().state.padding+gi().state.sizeUnit+gi().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",gi().state.sizeUnit).attr("cx",gi().state.padding+gi().state.sizeUnit+2).attr("cy",gi().state.padding+gi().state.sizeUnit+2)})(r),"fork"!==e.type&&"join"!==e.type||((t,e)=>{let n=gi().state.forkWidth,i=gi().state.forkHeight;if(e.parentId){let t=n;n=i,i=t}t.append("rect").style("stroke","black").style("fill","black").attr("width",n).attr("height",i).attr("x",gi().state.padding).attr("y",gi().state.padding)})(r,e),"note"===e.type&&Pu(e.note.text,r),"divider"===e.type&&(t=>{t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",gi().state.textHeight).attr("class","divider").attr("x2",2*gi().state.textHeight).attr("y1",0).attr("y2",0)})(r),"default"===e.type&&0===e.descriptions.length&&((t,e)=>{const n=t.append("text").attr("x",2*gi().state.padding).attr("y",gi().state.textHeight+2*gi().state.padding).attr("font-size",gi().state.fontSize).attr("class","state-title").text(e.id),i=n.node().getBBox();t.insert("rect",":first-child").attr("x",gi().state.padding).attr("y",gi().state.padding).attr("width",i.width+2*gi().state.padding).attr("height",i.height+2*gi().state.padding).attr("rx",gi().state.radius)})(r,e),"default"===e.type&&e.descriptions.length>0&&Ru(r,e);const a=r.node().getBBox();return i.width=a.width+2*gi().state.padding,i.height=a.height+2*gi().state.padding,$u(n,i),i};let Yu=0;let zu;const Uu={},Wu=(t,e,n,i,r,a,s)=>{const c=new lt.k({compound:!0,multigraph:!0});let l,h=!0;for(l=0;l<t.length;l++)if("relation"===t[l].stmt){h=!1;break}n?c.setGraph({rankdir:"LR",multigraph:!0,compound:!0,ranker:"tight-tree",ranksep:h?1:zu.edgeLengthFactor,nodeSep:h?1:50,isMultiGraph:!0}):c.setGraph({rankdir:"TB",multigraph:!0,compound:!0,ranksep:h?1:zu.edgeLengthFactor,nodeSep:h?1:50,ranker:"tight-tree",isMultiGraph:!0}),c.setDefaultEdgeLabel((function(){return{}})),s.db.extract(t);const u=s.db.getStates(),d=s.db.getRelations(),p=Object.keys(u);for(const o of p){const t=u[o];let l;if(n&&(t.parentId=n),t.doc){let n=e.append("g").attr("id",t.id).attr("class","stateGroup");l=Wu(t.doc,n,t.id,!i,r,a,s);{n=Zu(n,t,i);let e=n.node().getBBox();l.width=e.width,l.height=e.height+zu.padding/2,Uu[t.id]={y:zu.compositTitleSize}}}else l=ju(e,t);if(t.note){const n={descriptions:[],id:t.id+"-note",note:t.note,type:"note"},i=ju(e,n);"left of"===t.note.position?(c.setNode(l.id+"-note",i),c.setNode(l.id,l)):(c.setNode(l.id,l),c.setNode(l.id+"-note",i)),c.setParent(l.id,l.id+"-group"),c.setParent(l.id+"-note",l.id+"-group")}else c.setNode(l.id,l)}Bt.debug("Count=",c.nodeCount(),c);let f=0;d.forEach((function(t){var e;f++,Bt.debug("Setting edge",t),c.setEdge(t.id1,t.id2,{relation:t,width:(e=t.title,e?e.length*zu.fontSizeFactor:1),height:zu.labelHeight*jt.getRows(t.title).length,labelpos:"c"},"id"+f)})),(0,ct.bK)(c),Bt.debug("Graph after layout",c.nodes());const g=e.node();c.nodes().forEach((function(t){if(void 0!==t&&void 0!==c.node(t)){Bt.warn("Node "+t+": "+JSON.stringify(c.node(t))),r.select("#"+g.id+" #"+t).attr("transform","translate("+(c.node(t).x-c.node(t).width/2)+","+(c.node(t).y+(Uu[t]?Uu[t].y:0)-c.node(t).height/2)+" )"),r.select("#"+g.id+" #"+t).attr("data-x-shift",c.node(t).x-c.node(t).width/2);a.querySelectorAll("#"+g.id+" #"+t+" .divider").forEach((t=>{const e=t.parentElement;let n=0,i=0;e&&(e.parentElement&&(n=e.parentElement.getBBox().width),i=parseInt(e.getAttribute("data-x-shift"),10),Number.isNaN(i)&&(i=0)),t.setAttribute("x1",0-i+8),t.setAttribute("x2",n-i-8)}))}else Bt.debug("No Node "+t+": "+JSON.stringify(c.node(t)))}));let y=g.getBBox();c.edges().forEach((function(t){void 0!==t&&void 0!==c.edge(t)&&(Bt.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(c.edge(t))),function(t,e,n){e.points=e.points.filter((t=>!Number.isNaN(t.y)));const i=e.points,r=(0,o.jvg)().x((function(t){return t.x})).y((function(t){return t.y})).curve(o.$0Z),a=t.append("path").attr("d",r(i)).attr("id","edge"+Yu).attr("class","transition");let s="";if(gi().state.arrowMarkerAbsolute&&(s=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,s=s.replace(/\(/g,"\\("),s=s.replace(/\)/g,"\\)")),a.attr("marker-end","url("+s+"#"+function(t){switch(t){case Iu.relationType.AGGREGATION:return"aggregation";case Iu.relationType.EXTENSION:return"extension";case Iu.relationType.COMPOSITION:return"composition";case Iu.relationType.DEPENDENCY:return"dependency"}}(Iu.relationType.DEPENDENCY)+"End)"),void 0!==n.title){const i=t.append("g").attr("class","stateLabel"),{x:r,y:a}=ai.calcLabelPosition(e.points),s=jt.getRows(n.title);let o=0;const c=[];let l=0,h=0;for(let t=0;t<=s.length;t++){const e=i.append("text").attr("text-anchor","middle").text(s[t]).attr("x",r).attr("y",a+o),n=e.node().getBBox();if(l=Math.max(l,n.width),h=Math.min(h,n.x),Bt.info(n.x,r,a+o),0===o){const t=e.node().getBBox();o=t.height,Bt.info("Title height",o,a)}c.push(e)}let u=o*s.length;if(s.length>1){const t=(s.length-1)*o*.5;c.forEach(((e,n)=>e.attr("y",a+n*o-t))),u=o*s.length}const d=i.node().getBBox();i.insert("rect",":first-child").attr("class","box").attr("x",r-l/2-gi().state.padding/2).attr("y",a-u/2-gi().state.padding/2-3.5).attr("width",l+gi().state.padding).attr("height",u+gi().state.padding),Bt.info(d)}Yu++}(e,c.edge(t),c.edge(t).relation))})),y=g.getBBox();const m={id:n||"root",label:n||"root",width:0,height:0};return m.width=y.width+2*zu.padding,m.height=y.height+2*zu.padding,Bt.debug("Doc rendered",m,c),m},qu={setConf:function(){},draw:function(t,e,n,i){zu=gi().state;const r=gi().securityLevel;let a;"sandbox"===r&&(a=(0,o.Ys)("#i"+e));const s="sandbox"===r?(0,o.Ys)(a.nodes()[0].contentDocument.body):(0,o.Ys)("body"),c="sandbox"===r?a.nodes()[0].contentDocument:document;Bt.debug("Rendering diagram "+t);const l=s.select(`[id='${e}']`);l.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z");new lt.k({multigraph:!0,compound:!0,rankdir:"RL"}).setDefaultEdgeLabel((function(){return{}}));const h=i.db.getRootDoc();Wu(h,l,void 0,!1,s,c,i);const u=zu.padding,d=l.node().getBBox(),p=d.width+2*u,f=d.height+2*u;ki(l,f,1.75*p,zu.useMaxWidth),l.attr("viewBox",`${d.x-zu.padding} ${d.y-zu.padding} `+p+" "+f)}},Hu="rect",Vu="rectWithTitle",Gu="statediagram",Xu=`${Gu}-state`,Qu="transition",Ku=`${Qu} note-edge`,Ju=`${Gu}-note`,td=`${Gu}-cluster`,ed=`${Gu}-cluster-alt`,nd="parent",id="note",rd="----",ad=`${rd}${id}`,sd=`${rd}${nd}`,od="fill:none",cd="fill: #333",ld="text",hd="normal";let ud={},dd=0;function pd(t="",e=0,n="",i=rd){return`state-${t}${null!==n&&n.length>0?`${i}${n}`:""}-${e}`}const fd=(t,e,n,i,r,a)=>{const s=n.id,o=null==(c=i[s])?"":c.classes?c.classes.join(" "):"";var c;if("root"!==s){let e=Hu;!0===n.start&&(e="start"),!1===n.start&&(e="end"),n.type!==cu&&(e=n.type),ud[s]||(ud[s]={id:s,shape:e,description:jt.sanitizeText(s,gi()),classes:`${o} ${Xu}`});const i=ud[s];n.description&&(Array.isArray(i.description)?(i.shape=Vu,i.description.push(n.description)):i.description.length>0?(i.shape=Vu,i.description===s?i.description=[n.description]:i.description=[i.description,n.description]):(i.shape=Hu,i.description=n.description),i.description=jt.sanitizeTextOrArray(i.description,gi())),1===i.description.length&&i.shape===Vu&&(i.shape=Hu),!i.type&&n.doc&&(Bt.info("Setting cluster for ",s,yd(n)),i.type="group",i.dir=yd(n),i.shape=n.type===lu?"divider":"roundedWithTitle",i.classes=i.classes+" "+td+" "+(a?ed:""));const r={labelStyle:"",shape:i.shape,labelText:i.description,classes:i.classes,style:"",id:s,dir:i.dir,domId:pd(s,dd),type:i.type,padding:15};if(n.note){const e={labelStyle:"",shape:"note",labelText:n.note.text,classes:Ju,style:"",id:s+ad+"-"+dd,domId:pd(s,dd,id),type:i.type,padding:15},a={labelStyle:"",shape:"noteGroup",labelText:n.note.text,classes:i.classes,style:"",id:s+sd,domId:pd(s,dd,nd),type:"group",padding:0};dd++;const o=s+sd;t.setNode(o,a),t.setNode(e.id,e),t.setNode(s,r),t.setParent(s,o),t.setParent(e.id,o);let c=s,l=e.id;"left of"===n.note.position&&(c=e.id,l=s),t.setEdge(c,l,{arrowhead:"none",arrowType:"",style:od,labelStyle:"",classes:Ku,arrowheadStyle:cd,labelpos:"c",labelType:ld,thickness:hd})}else t.setNode(s,r)}e&&"root"!==e.id&&(Bt.trace("Setting node ",s," to be child of its parent ",e.id),t.setParent(s,e.id)),n.doc&&(Bt.trace("Adding nodes children "),gd(t,n,n.doc,i,r,!a))},gd=(t,e,n,i,r,a)=>{Bt.trace("items",n),n.forEach((n=>{switch(n.stmt){case su:case cu:fd(t,e,n,i,r,a);break;case ou:{fd(t,e,n.state1,i,r,a),fd(t,e,n.state2,i,r,a);const s={id:"edge"+dd,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:od,labelStyle:"",label:jt.sanitizeText(n.description,gi()),arrowheadStyle:cd,labelpos:"c",labelType:ld,thickness:hd,classes:Qu};t.setEdge(n.state1.id,n.state2.id,s,dd),dd++}}}))},yd=(t,e="TB")=>{let n=e;if(t.doc)for(let i=0;i<t.doc.length;i++){const e=t.doc[i];"dir"===e.stmt&&(n=e.value)}return n},md={setConf:function(t){const e=Object.keys(t);for(const n of e)t[n]},getClasses:function(t,e){Bt.trace("Extracting classes"),e.db.clear();try{return e.parser.parse(t),e.db.extract(e.db.getRootDocV2()),e.db.getClasses()}catch(n){return n}},draw:function(t,e,n,i){Bt.info("Drawing state diagram (v2)",e),ud={};let r=i.db.getDirection();void 0===r&&(r="LR");const{securityLevel:a,state:s}=gi(),c=s.nodeSpacing||50,l=s.rankSpacing||50;Bt.info(i.db.getRootDocV2()),i.db.extract(i.db.getRootDocV2()),Bt.info(i.db.getRootDocV2());const h=i.db.getStates(),u=new lt.k({multigraph:!0,compound:!0}).setGraph({rankdir:yd(i.db.getRootDocV2()),nodesep:c,ranksep:l,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));let d;fd(u,void 0,i.db.getRootDocV2(),h,i.db,!0),"sandbox"===a&&(d=(0,o.Ys)("#i"+e));const p="sandbox"===a?(0,o.Ys)(d.nodes()[0].contentDocument.body):(0,o.Ys)("body"),f=p.select(`[id="${e}"]`),g=p.select("#"+e+" g");no(g,u,["barb"],Gu,e);ai.insertTitle(f,"statediagramTitleText",s.titleTopMargin,i.db.getDiagramTitle());const y=f.node().getBBox(),m=y.width+16,b=y.height+16;f.attr("class",Gu);const _=f.node().getBBox();ki(f,b,m,s.useMaxWidth);const x=`${_.x-8} ${_.y-8} ${m} ${b}`;Bt.debug(`viewBox ${x}`),f.attr("viewBox",x);const v=document.querySelectorAll('[id="'+e+'"] .edgeLabel .label');for(const o of v){const t=o.getBBox(),e=document.createElementNS("http://www.w3.org/2000/svg",Hu);e.setAttribute("rx",0),e.setAttribute("ry",0),e.setAttribute("width",t.width),e.setAttribute("height",t.height),o.insertBefore(e,o.firstChild)}}};var bd=function(){var t,e=function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},n=[1,2],i=[1,5],r=[6,9,11,17,18,20,22,23,24,26],a=[1,15],s=[1,16],o=[1,17],c=[1,18],l=[1,19],h=[1,20],u=[1,24],d=[4,6,9,11,17,18,20,22,23,24,26],p={trace:function(){},yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,directive:7,line:8,SPACE:9,statement:10,NEWLINE:11,openDirective:12,typeDirective:13,closeDirective:14,":":15,argDirective:16,title:17,acc_title:18,acc_title_value:19,acc_descr:20,acc_descr_value:21,acc_descr_multiline_value:22,section:23,taskName:24,taskData:25,open_directive:26,type_directive:27,arg_directive:28,close_directive:29,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"acc_title",19:"acc_title_value",20:"acc_descr",21:"acc_descr_value",22:"acc_descr_multiline_value",23:"section",24:"taskName",25:"taskData",26:"open_directive",27:"type_directive",28:"arg_directive",29:"close_directive"},productions_:[0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,2],[10,2],[10,1],[10,1],[10,2],[10,1],[12,1],[13,1],[16,1],[14,1]],performAction:function(t,e,n,i,r,a,s){var o=a.length-1;switch(r){case 1:return a[o-1];case 3:case 7:case 8:this.$=[];break;case 4:a[o-1].push(a[o]),this.$=a[o-1];break;case 5:case 6:this.$=a[o];break;case 11:i.setDiagramTitle(a[o].substr(6)),this.$=a[o].substr(6);break;case 12:this.$=a[o].trim(),i.setAccTitle(this.$);break;case 13:case 14:this.$=a[o].trim(),i.setAccDescription(this.$);break;case 15:i.addSection(a[o].substr(8)),this.$=a[o].substr(8);break;case 16:i.addTask(a[o-1],a[o]),this.$="task";break;case 18:i.parseDirective("%%{","open_directive");break;case 19:i.parseDirective(a[o],"type_directive");break;case 20:a[o]=a[o].trim().replace(/'/g,'"'),i.parseDirective(a[o],"arg_directive");break;case 21:i.parseDirective("}%%","close_directive","journey")}},table:[{3:1,4:n,7:3,12:4,26:i},{1:[3]},e(r,[2,3],{5:6}),{3:7,4:n,7:3,12:4,26:i},{13:8,27:[1,9]},{27:[2,18]},{6:[1,10],7:21,8:11,9:[1,12],10:13,11:[1,14],12:4,17:a,18:s,20:o,22:c,23:l,24:h,26:i},{1:[2,2]},{14:22,15:[1,23],29:u},e([15,29],[2,19]),e(r,[2,8],{1:[2,1]}),e(r,[2,4]),{7:21,10:25,12:4,17:a,18:s,20:o,22:c,23:l,24:h,26:i},e(r,[2,6]),e(r,[2,7]),e(r,[2,11]),{19:[1,26]},{21:[1,27]},e(r,[2,14]),e(r,[2,15]),{25:[1,28]},e(r,[2,17]),{11:[1,29]},{16:30,28:[1,31]},{11:[2,21]},e(r,[2,5]),e(r,[2,12]),e(r,[2,13]),e(r,[2,16]),e(d,[2,9]),{14:32,29:u},{29:[2,20]},{11:[1,33]},e(d,[2,10])],defaultActions:{5:[2,18],7:[2,2],24:[2,21],31:[2,20]},parseError:function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},parse:function(t){var e=this,n=[0],i=[],r=[null],a=[],s=this.table,o="",c=0,l=0,h=a.slice.call(arguments,1),u=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);u.setInput(t,d.yy),d.yy.lexer=u,d.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var f=u.yylloc;a.push(f);var g=u.options&&u.options.ranges;function y(){var t;return"number"!=typeof(t=i.pop()||u.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var m,b,_,x,v,k,w,C,T={};;){if(b=n[n.length-1],this.defaultActions[b]?_=this.defaultActions[b]:(null==m&&(m=y()),_=s[b]&&s[b][m]),void 0===_||!_.length||!_[0]){var E="";for(v in C=[],s[b])this.terminals_[v]&&v>2&&C.push("'"+this.terminals_[v]+"'");E=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(E,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:f,expected:C})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+m);switch(_[0]){case 1:n.push(m),r.push(u.yytext),a.push(u.yylloc),n.push(_[1]),m=null,l=u.yyleng,o=u.yytext,c=u.yylineno,f=u.yylloc;break;case 2:if(k=this.productions_[_[1]][1],T.$=r[r.length-k],T._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},g&&(T._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),void 0!==(x=this.performAction.apply(T,[o,l,c,d.yy,_[1],r,a].concat(h))))return x;k&&(n=n.slice(0,-1*k*2),r=r.slice(0,-1*k),a=a.slice(0,-1*k)),n.push(this.productions_[_[1]][0]),r.push(T.$),a.push(T._$),w=s[n[n.length-2]][n[n.length-1]],n.push(w);break;case 3:return!0}}return!0}},f=(t={EOF:1,parseError:function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},setInput:function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},unput:function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(t){this.unput(this.match.slice(t))},pastInput:function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},test_match:function(t,e){var n,i,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var a in r)this[a]=r[a];return!1}return!1},next:function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),a=0;a<r.length;a++)if((n=this._input.match(this.rules[r[a]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,r[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return t||this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},pushState:function(t){this.begin(t)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),26;case 1:return this.begin("type_directive"),27;case 2:return this.popState(),this.begin("arg_directive"),15;case 3:return this.popState(),this.popState(),29;case 4:return 28;case 5:case 6:case 8:case 9:break;case 7:return 11;case 10:return 4;case 11:return 17;case 12:return this.begin("acc_title"),18;case 13:return this.popState(),"acc_title_value";case 14:return this.begin("acc_descr"),20;case 15:return this.popState(),"acc_descr_value";case 16:this.begin("acc_descr_multiline");break;case 17:this.popState();break;case 18:return"acc_descr_multiline_value";case 19:return 23;case 20:return 24;case 21:return 25;case 22:return 15;case 23:return 6;case 24:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{open_directive:{rules:[1],inclusive:!1},type_directive:{rules:[2,3],inclusive:!1},arg_directive:{rules:[3,4],inclusive:!1},acc_descr_multiline:{rules:[17,18],inclusive:!1},acc_descr:{rules:[15],inclusive:!1},acc_title:{rules:[13],inclusive:!1},INITIAL:{rules:[0,5,6,7,8,9,10,11,12,14,16,19,20,21,22,23,24],inclusive:!0}}},t);function g(){this.yy={}}return p.lexer=f,g.prototype=p,p.Parser=g,new g}();bd.parser=bd;const _d=bd,xd=t=>null!==t.match(/^\s*journey/);let vd="";const kd=[],wd=[],Cd=[],Td=function(){let t=!0;for(const[e,n]of Cd.entries())Cd[e].processed,t=t&&n.processed;return t},Ed={parseDirective:function(t,e,n){Cp.parseDirective(this,t,e,n)},getConfig:()=>gi().journey,clear:function(){kd.length=0,wd.length=0,vd="",Cd.length=0,Yi()},setDiagramTitle:Hi,getDiagramTitle:Vi,setAccTitle:zi,getAccTitle:Ui,setAccDescription:Wi,getAccDescription:qi,addSection:function(t){vd=t,kd.push(t)},getSections:function(){return kd},getTasks:function(){let t=Td();let e=0;for(;!t&&e<100;)t=Td(),e++;return wd.push(...Cd),wd},addTask:function(t,e){const n=e.substr(1).split(":");let i=0,r=[];1===n.length?(i=Number(n[0]),r=[]):(i=Number(n[0]),r=n[1].split(","));const a=r.map((t=>t.trim())),s={section:vd,type:vd,people:a,task:t,score:i};Cd.push(s)},addTaskOrg:function(t){const e={section:vd,type:vd,description:t,task:t,classes:[]};wd.push(e)},getActors:function(){return function(){const t=[];return wd.forEach((e=>{e.people&&t.push(...e.people)})),[...new Set(t)].sort()}()}},Sd=function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},Ad=function(t,e){const n=t.append("circle");return n.attr("cx",e.cx),n.attr("cy",e.cy),n.attr("class","actor-"+e.pos),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("r",e.r),void 0!==n.class&&n.attr("class",n.class),void 0!==e.title&&n.append("title").text(e.title),n},Ld=function(t,e){const n=e.text.replace(/<br\s*\/?>/gi," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.attr("class","legend"),i.style("text-anchor",e.anchor),void 0!==e.class&&i.attr("class",e.class);const r=i.append("tspan");return r.attr("x",e.x+2*e.textMargin),r.text(n),i};let Bd=-1;const Nd=function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},Dd=function(){function t(t,e,n,r,a,s,o,c){i(e.append("text").attr("x",n+a/2).attr("y",r+s/2+5).style("font-color",c).style("text-anchor","middle").text(t),o)}function e(t,e,n,r,a,s,o,c,l){const{taskFontSize:h,taskFontFamily:u}=c,d=t.split(/<br\s*\/?>/gi);for(let p=0;p<d.length;p++){const t=p*h-h*(d.length-1)/2,c=e.append("text").attr("x",n+a/2).attr("y",r).attr("fill",l).style("text-anchor","middle").style("font-size",h).style("font-family",u);c.append("tspan").attr("x",n+a/2).attr("dy",t).text(d[p]),c.attr("y",r+s/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(c,o)}}function n(t,n,r,a,s,o,c,l){const h=n.append("switch"),u=h.append("foreignObject").attr("x",r).attr("y",a).attr("width",s).attr("height",o).attr("position","fixed").append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").attr("class","label").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,a,s,o,c,l),i(u,c)}function i(t,e){for(const n in e)n in e&&t.attr(n,e[n])}return function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),Od=Ad,Md=function(t,e,n){const i=t.append("g"),r=Nd();r.x=e.x,r.y=e.y,r.fill=e.fill,r.width=n.width,r.height=n.height,r.class="journey-section section-type-"+e.num,r.rx=3,r.ry=3,Sd(i,r),Dd(n)(e.text,i,r.x,r.y,r.width,r.height,{class:"journey-section section-type-"+e.num},n,e.colour)},Id=Ld,Fd=function(t,e,n){const i=e.x+n.width/2,r=t.append("g");Bd++;r.append("line").attr("id","task"+Bd).attr("x1",i).attr("y1",e.y).attr("x2",i).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),function(t,e){const n=15,i=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",n).attr("stroke-width",2).attr("overflow","visible"),r=t.append("g");r.append("circle").attr("cx",e.cx-5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),r.append("circle").attr("cx",e.cx+5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),e.score>3?function(t){const i=(0,o.Nb1)().startAngle(Math.PI/2).endAngle(Math.PI/2*3).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}(r):e.score<3?function(t){const i=(0,o.Nb1)().startAngle(3*Math.PI/2).endAngle(Math.PI/2*5).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}(r):r.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}(r,{cx:i,cy:300+30*(5-e.score),score:e.score});const a=Nd();a.x=e.x,a.y=e.y,a.fill=e.fill,a.width=n.width,a.height=n.height,a.class="task task-type-"+e.num,a.rx=3,a.ry=3,Sd(r,a);let s=e.x+14;e.people.forEach((t=>{const n=e.actors[t].color,i={cx:s,cy:e.y,r:7,fill:n,stroke:"#000",title:t,pos:e.actors[t].position};Ad(r,i),s+=10})),Dd(n)(e.task,r,a.x,a.y,a.width,a.height,{class:"task"},n,e.colour)},$d=function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",5).attr("refY",2).attr("markerWidth",6).attr("markerHeight",4).attr("orient","auto").append("path").attr("d","M 0,0 V 4 L6,2 Z")},Rd={};const Zd=gi().journey,Pd=Zd.leftMargin,jd={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},updateVal:function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},updateBounds:function(t,e,n,i){const r=gi().journey,a=this;let s=0;var o;this.sequenceItems.forEach((function(c){s++;const l=a.sequenceItems.length-s+1;a.updateVal(c,"starty",e-l*r.boxMargin,Math.min),a.updateVal(c,"stopy",i+l*r.boxMargin,Math.max),a.updateVal(jd.data,"startx",t-l*r.boxMargin,Math.min),a.updateVal(jd.data,"stopx",n+l*r.boxMargin,Math.max),"activation"!==o&&(a.updateVal(c,"startx",t-l*r.boxMargin,Math.min),a.updateVal(c,"stopx",n+l*r.boxMargin,Math.max),a.updateVal(jd.data,"starty",e-l*r.boxMargin,Math.min),a.updateVal(jd.data,"stopy",i+l*r.boxMargin,Math.max))}))},insert:function(t,e,n,i){const r=Math.min(t,n),a=Math.max(t,n),s=Math.min(e,i),o=Math.max(e,i);this.updateVal(jd.data,"startx",r,Math.min),this.updateVal(jd.data,"starty",s,Math.min),this.updateVal(jd.data,"stopx",a,Math.max),this.updateVal(jd.data,"stopy",o,Math.max),this.updateBounds(r,s,a,o)},bumpVerticalPos:function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return this.data}},Yd=Zd.sectionFills,zd=Zd.sectionColours,Ud=function(t,e,n){const i=gi().journey;let r="";const a=n+(2*i.height+i.diagramMarginY);let s=0,o="#CCC",c="black",l=0;for(const[h,u]of e.entries()){if(r!==u.section){o=Yd[s%Yd.length],l=s%Yd.length,c=zd[s%zd.length];const e={x:h*i.taskMargin+h*i.width+Pd,y:50,text:u.section,fill:o,num:l,colour:c};Md(t,e,i),r=u.section,s++}const e=u.people.reduce(((t,e)=>(Rd[e]&&(t[e]=Rd[e]),t)),{});u.x=h*i.taskMargin+h*i.width+Pd,u.y=a,u.width=i.diagramMarginX,u.height=i.diagramMarginY,u.colour=c,u.fill=o,u.num=l,u.actors=e,Fd(t,u,i),jd.insert(u.x,u.y,u.x+u.width+i.taskMargin,450)}},Wd={setConf:function(t){Object.keys(t).forEach((function(e){Zd[e]=t[e]}))},draw:function(t,e,n,i){const r=gi().journey;i.db.clear(),i.parser.parse(t+"\n");const a=gi().securityLevel;let s;"sandbox"===a&&(s=(0,o.Ys)("#i"+e));const c="sandbox"===a?(0,o.Ys)(s.nodes()[0].contentDocument.body):(0,o.Ys)("body");jd.init();const l=c.select("#"+e);$d(l);const h=i.db.getTasks(),u=i.db.getDiagramTitle(),d=i.db.getActors();for(const o in Rd)delete Rd[o];let p=0;d.forEach((t=>{Rd[t]={color:r.actorColours[p%r.actorColours.length],position:p},p++})),function(t){const e=gi().journey;let n=60;Object.keys(Rd).forEach((i=>{const r=Rd[i].color,a={cx:20,cy:n,r:7,fill:r,stroke:"#000",pos:Rd[i].position};Od(t,a);const s={x:40,y:n+7,fill:"#666",text:i,textMargin:5|e.boxTextMargin};Id(t,s),n+=20}))}(l),jd.insert(0,0,Pd,50*Object.keys(Rd).length),Ud(l,h,0);const f=jd.getBounds();u&&l.append("text").text(u).attr("x",Pd).attr("font-size","4ex").attr("font-weight","bold").attr("y",25);const g=f.stopy-f.starty+2*r.diagramMarginY,y=Pd+f.stopx+2*r.diagramMarginX;ki(l,g,y,r.useMaxWidth),l.append("line").attr("x1",Pd).attr("y1",4*r.height).attr("x2",y-Pd-4).attr("y2",4*r.height).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");const m=u?70:0;l.attr("viewBox",`${f.startx} -25 ${y} ${g+m}`),l.attr("preserveAspectRatio","xMinYMin meet"),l.attr("height",g+m+25)}};let qd={};const Hd={setConf:function(t){qd={...qd,...t}},draw:(t,e,n)=>{try{Bt.debug("Renering svg for syntax error\n");const t=(0,o.Ys)("#"+e),i=t.append("g");i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in graph"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text("mermaid version "+n),t.attr("height",100),t.attr("width",500),t.attr("viewBox","768 0 912 512")}catch(r){Bt.error("Error while rendering info diagram"),Bt.error((i=r)instanceof Error?i.message:String(i))}var i}},Vd="flowchart-elk",Gd={id:Vd,detector:(t,e)=>{var n;return!!(t.match(/^\s*flowchart-elk/)||t.match(/^\s*flowchart|graph/)&&"elk"===(null==(n=null==e?void 0:e.flowchart)?void 0:n.defaultRenderer))},loader:async()=>{const{diagram:t}=await n.e(9487).then(n.bind(n,9487));return{id:Vd,diagram:t}}},Xd="timeline",Qd={id:Xd,detector:t=>null!==t.match(/^\s*timeline/),loader:async()=>{const{diagram:t}=await n.e(6316).then(n.bind(n,6316));return{id:Xd,diagram:t}}},Kd="mindmap",Jd={id:Kd,detector:t=>null!==t.match(/^\s*mindmap/),loader:async()=>{const{diagram:t}=await n.e(7724).then(n.bind(n,7724));return{id:Kd,diagram:t}}};let tp=!1;const ep=()=>{tp||(tp=!0,Mn(Gd,Qd,Jd),or("error",{db:{clear:()=>{}},styles:Ei,renderer:Hd,parser:{parser:{yy:{}},parse:()=>{}},init:()=>{}},(t=>"error"===t.toLowerCase().trim())),or("---",{db:{clear:()=>{}},styles:Ei,renderer:Hd,parser:{parser:{yy:{}},parse:()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with unindented `---` blocks")}},init:()=>null},(t=>t.toLowerCase().trimStart().startsWith("---"))),or("c4",{parser:qr,db:oa,renderer:Za,styles:Ii,init:t=>{Za.setConf(t.c4)}},Hr),or("class",{parser:ja,db:as,renderer:bs,styles:Ci,init:t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,as.clear()}},Ya),or("classDiagram",{parser:ja,db:as,renderer:so,styles:Ci,init:t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute,as.clear()}},za),or("er",{parser:co,db:fo,renderer:Eo,styles:Ti},lo),or("gantt",{parser:Ic,db:fl,renderer:ml,styles:Ai},Fc),or("info",{parser:_l,db:kl,renderer:wl,styles:Li},Cl),or("pie",{parser:El,db:Bl,renderer:Ml,styles:Bi},Sl),or("requirement",{parser:Fl,db:zl,renderer:th,styles:Ni},$l),or("sequence",{parser:nh,db:wh,renderer:eu,styles:Di,init:t=>{if(t.sequence||(t.sequence={}),t.sequence.arrowMarkerAbsolute=t.arrowMarkerAbsolute,"sequenceDiagram"in t)throw new Error("`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.");wh.setWrap(t.wrap),eu.setConf(t.sequence)}},ih),or("state",{parser:iu,db:Iu,renderer:qu,styles:Oi,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Iu.clear()}},ru),or("stateDiagram",{parser:iu,db:Iu,renderer:md,styles:Oi,init:t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Iu.clear()}},au),or("journey",{parser:_d,db:Ed,renderer:Wd,styles:Mi,init:t=>{Wd.setConf(t.journey),Ed.clear()}},xd),or("flowchart",{parser:Ao,db:Ec,renderer:Oc,styles:Si,init:t=>{t.flowchart||(t.flowchart={}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Lc(t.flowchart),Ec.clear(),Ec.setGen("gen-1")}},Lo),or("flowchart-v2",{parser:Ao,db:Ec,renderer:Oc,styles:Si,init:t=>{t.flowchart||(t.flowchart={}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,fi({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}}),Oc.setConf(t.flowchart),Ec.clear(),Ec.setGen("gen-2")}},Bo),or("gitGraph",{parser:hr,db:Ar,renderer:zr,styles:Ur},ur))};class np{constructor(t,e){var n,i;this.txt=t,this.type="graph",this.detectTypeFailed=!1;const r=gi();this.txt=t;try{this.type=On(t,r)}catch(o){this.handleError(o,e),this.type="error",this.detectTypeFailed=!0}const a=cr(this.type);Bt.debug("Type "+this.type),this.db=a.db,null==(i=(n=this.db).clear)||i.call(n),this.renderer=a.renderer,this.parser=a.parser;const s=this.parser.parse.bind(this.parser);this.parser.parse=t=>s(function(t,e){var n;const i=t.match(Ln);if(i){const r=An(i[1],{schema:Sn});return(null==r?void 0:r.title)&&(null==(n=e.setDiagramTitle)||n.call(e,r.title)),t.slice(i[0].length)}return t}(t,this.db)),this.parser.parser.yy=this.db,a.init&&(a.init(r),Bt.info("Initialized diagram "+this.type,r)),this.txt+="\n",this.parse(this.txt,e)}parse(t,e){var n,i;if(this.detectTypeFailed)return!1;try{return t+="\n",null==(i=(n=this.db).clear)||i.call(n),this.parser.parse(t),!0}catch(r){this.handleError(r,e)}return!1}handleError(t,e){if(void 0===e)throw t;ii(t)?e(t.str,t.hash):e(t)}getParser(){return this.parser}getType(){return this.type}}const ip=(t,e)=>{const n=On(t,gi());try{cr(n)}catch(i){const r=Dn[n].loader;if(!r)throw new Error(`Diagram ${n} not found.`);return r().then((({diagram:i})=>(or(n,i,void 0),new np(t,e))))}return new np(t,e)},rp=np,ap="graphics-document document";const sp=["graph","flowchart","flowchart-v2","stateDiagram","stateDiagram-v2"],op="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",cp="sandbox",lp="loose",hp="http://www.w3.org/1999/xlink",up="http://www.w3.org/1999/xhtml",dp=["foreignobject"],pp=["dominant-baseline"];const fp=function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)})),e=e.replace(/classDef.*:\S*#.*;/g,(function(t){return t.substring(0,t.length-1)})),e=e.replace(/#\w+;/g,(function(t){const e=t.substring(1,t.length-1);return/^\+?\d+$/.test(e)?"\ufb02\xb0\xb0"+e+"\xb6\xdf":"\ufb02\xb0"+e+"\xb6\xdf"})),e},gp=function(t){let e=t;return e=e.replace(/\ufb02\xb0\xb0/g,"&#"),e=e.replace(/\ufb02\xb0/g,"&"),e=e.replace(/\xb6\xdf/g,";"),e},yp=(t,e,n=[])=>`\n.${t} ${e} { ${n.join(" !important; ")} !important; }`,mp=(t,e,n,i)=>{const r=((t,e,n={})=>{var i;let r="";if(void 0!==t.themeCSS&&(r+=`\n${t.themeCSS}`),void 0!==t.fontFamily&&(r+=`\n:root { --mermaid-font-family: ${t.fontFamily}}`),void 0!==t.altFontFamily&&(r+=`\n:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),!(0,At.Z)(n)&&sp.includes(e)){const e=t.htmlLabels||(null==(i=t.flowchart)?void 0:i.htmlLabels)?["> *","span"]:["rect","polygon","ellipse","circle","path"];for(const t in n){const i=n[t];(0,At.Z)(i.styles)||e.forEach((t=>{r+=yp(i.id,t,i.styles)})),(0,At.Z)(i.textStyles)||(r+=yp(i.id,"tspan",i.textStyles))}}return r})(t,e,n);return M(it(`${i}{${$i(e,r,t.themeVariables)}}`),I)},bp=(t="",e,n)=>{let i=t;return n||e||(i=i.replace(/marker-end="url\(.*?#/g,'marker-end="url(#')),i=gp(i),i=i.replace(/<br>/g,"<br/>"),i},_p=(t="",e)=>`<iframe style="width:100%;height:${e?e.viewBox.baseVal.height+"px":"100%"};border:0;margin:0;" src="data:text/html;base64,${btoa('<body style="margin:0">'+t+"</body>")}" sandbox="allow-top-navigation-by-user-activation allow-popups">\n The "iframe" tag is not supported by your browser.\n</iframe>`,xp=(t,e,n,i,r)=>{const a=t.append("div");a.attr("id",n),i&&a.attr("style",i);const s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns","http://www.w3.org/2000/svg");return r&&s.attr("xmlns:xlink",r),s.append("g"),t};function vp(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}const kp=(t,e,n,i)=>{var r,a,s;null==(r=t.getElementById(e))||r.remove(),null==(a=t.getElementById(n))||a.remove(),null==(s=t.getElementById(i))||s.remove()};function wp(t,e,n,i){var r,a;a=t,(r=e).attr("role",ap),(0,At.Z)(a)||r.attr("aria-roledescription",a),function(t,e,n,i){if(void 0!==t.insert&&(e||n)){if(n){const e="chart-desc-"+i;t.attr("aria-describedby",e),t.insert("desc",":first-child").attr("id",e).text(n)}if(e){const n="chart-title-"+i;t.attr("aria-labelledby",n),t.insert("title",":first-child").attr("id",n).text(e)}}}(e,n,i,e.attr("id"))}const Cp=Object.freeze({render:function(t,e,n,i){var r,a,s,c;ep(),bi();const l=ai.detectInit(e);l&&(ei(l),mi(l));const u=gi();Bt.debug(u),e.length>((null==u?void 0:u.maxTextSize)??5e4)&&(e=op),e=e.replace(/\r\n?/g,"\n");const d="#"+t,p="i"+t,f="#"+p,g="d"+t,y="#"+g;let m=(0,o.Ys)("body");const b=u.securityLevel===cp,_=u.securityLevel===lp,x=u.fontFamily;if(void 0!==i){if(i&&(i.innerHTML=""),b){const t=vp((0,o.Ys)(i),p);m=(0,o.Ys)(t.nodes()[0].contentDocument.body),m.node().style.margin=0}else m=(0,o.Ys)(i);xp(m,t,g,`font-family: ${x}`,hp)}else{if(kp(document,t,g,p),b){const t=vp((0,o.Ys)("body"),p);m=(0,o.Ys)(t.nodes()[0].contentDocument.body),m.node().style.margin=0}else m=(0,o.Ys)("body");xp(m,t,g)}let v,k;e=fp(e);try{if(v=ip(e),"then"in v)throw new Error("Diagram is a promise. Use renderAsync.")}catch(O){v=new rp("error"),k=O}const w=m.select(y).node(),C=v.type,T=w.firstChild,E=T.firstChild,S=sp.includes(C)?v.renderer.getClasses(e,v):{},A=mp(u,C,S,d),L=document.createElement("style");L.innerHTML=A,T.insertBefore(L,E);try{v.renderer.draw(e,t,si,v)}catch(M){throw Hd.draw(e,t,si),M}wp(C,m.select(`${y} svg`),null==(a=(r=v.db).getAccTitle)?void 0:a.call(r),null==(c=(s=v.db).getAccDescription)?void 0:c.call(s)),m.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",up);let B=m.select(y).node().innerHTML;if(Bt.debug("config.arrowMarkerAbsolute",u.arrowMarkerAbsolute),B=bp(B,b,Zt(u.arrowMarkerAbsolute)),b){const t=m.select(y+" svg").node();B=_p(B,t)}else _||(B=h().sanitize(B,{ADD_TAGS:dp,ADD_ATTR:pp}));if(void 0!==n)switch(C){case"flowchart":case"flowchart-v2":n(B,Ec.bindFunctions);break;case"gantt":n(B,fl.bindFunctions);break;case"class":case"classDiagram":n(B,as.bindFunctions);break;default:n(B)}else Bt.debug("CB = undefined!");Th();const N=b?f:y,D=(0,o.Ys)(N).node();if(D&&"remove"in D&&D.remove(),k)throw k;return B},renderAsync:async function(t,e,n,i){var r,a,s,c;ep(),bi();const l=ai.detectInit(e);l&&(ei(l),mi(l));const u=gi();Bt.debug(u),e.length>((null==u?void 0:u.maxTextSize)??5e4)&&(e=op),e=e.replace(/\r\n?/g,"\n");const d="#"+t,p="i"+t,f="#"+p,g="d"+t,y="#"+g;let m=(0,o.Ys)("body");const b=u.securityLevel===cp,_=u.securityLevel===lp,x=u.fontFamily;if(void 0!==i){if(i&&(i.innerHTML=""),b){const t=vp((0,o.Ys)(i),p);m=(0,o.Ys)(t.nodes()[0].contentDocument.body),m.node().style.margin=0}else m=(0,o.Ys)(i);xp(m,t,g,`font-family: ${x}`,hp)}else{if(kp(document,t,g,p),b){const t=vp((0,o.Ys)("body"),p);m=(0,o.Ys)(t.nodes()[0].contentDocument.body),m.node().style.margin=0}else m=(0,o.Ys)("body");xp(m,t,g)}let v,k;e=fp(e);try{v=await ip(e)}catch(O){v=new rp("error"),k=O}const w=m.select(y).node(),C=v.type,T=w.firstChild,E=T.firstChild,S=sp.includes(C)?v.renderer.getClasses(e,v):{},A=mp(u,C,S,d),L=document.createElement("style");L.innerHTML=A,T.insertBefore(L,E);try{await v.renderer.draw(e,t,si,v)}catch(M){throw Hd.draw(e,t,si),M}wp(C,m.select(`${y} svg`),null==(a=(r=v.db).getAccTitle)?void 0:a.call(r),null==(c=(s=v.db).getAccDescription)?void 0:c.call(s)),m.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",up);let B=m.select(y).node().innerHTML;if(Bt.debug("config.arrowMarkerAbsolute",u.arrowMarkerAbsolute),B=bp(B,b,Zt(u.arrowMarkerAbsolute)),b){const t=m.select(y+" svg").node();B=_p(B,t)}else _||(B=h().sanitize(B,{ADD_TAGS:dp,ADD_ATTR:pp}));if(void 0!==n)switch(C){case"flowchart":case"flowchart-v2":n(B,Ec.bindFunctions);break;case"gantt":n(B,fl.bindFunctions);break;case"class":case"classDiagram":n(B,as.bindFunctions);break;default:n(B)}else Bt.debug("CB = undefined!");Th();const N=b?f:y,D=(0,o.Ys)(N).node();if(D&&"remove"in D&&D.remove(),k)throw k;return B},parse:function(t,e){return ep(),new rp(t,e).parse(t,e)},parseAsync:async function(t,e){return ep(),(await ip(t,e)).parse(t,e)},parseDirective:Ki,initialize:function(t={}){var e;(null==t?void 0:t.fontFamily)&&!(null==(e=t.themeVariables)?void 0:e.fontFamily)&&(t.themeVariables={fontFamily:t.fontFamily}),ci=$n({},t),(null==t?void 0:t.theme)&&t.theme in Xt?t.themeVariables=Xt[t.theme].getThemeVariables(t.themeVariables):t&&(t.themeVariables=Xt.default.getThemeVariables(t.themeVariables));const n="object"==typeof t?(t=>(li=$n({},oi),li=$n(li,t),t.theme&&Xt[t.theme]&&(li.themeVariables=Xt[t.theme].getThemeVariables(t.themeVariables)),di(li,hi),li))(t):pi();Nt(n.logLevel),ep()},getConfig:gi,setConfig:fi,getSiteConfig:pi,updateSiteConfig:t=>(li=$n(li,t),di(li,hi),li),reset:()=>{bi()},globalReset:()=>{bi(oi)},defaultConfig:oi});Nt(gi().logLevel),bi(gi());const Tp=(t,e,n)=>{Bt.warn(t),ii(t)?(n&&n(t.str,t.hash),e.push({...t,message:t.str,error:t})):(n&&n(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},Ep=async function(t,e,n){const r=Cp.getConfig();let a;if(t&&(Np.sequenceConfig=t),Bt.debug((n?"":"No ")+"Callback function found"),void 0===e)a=document.querySelectorAll(".mermaid");else if("string"==typeof e)a=document.querySelectorAll(e);else if(e instanceof HTMLElement)a=[e];else{if(!(e instanceof NodeList))throw new Error("Invalid argument nodes for mermaid.init");a=e}Bt.debug(`Found ${a.length} diagrams`),void 0!==(null==t?void 0:t.startOnLoad)&&(Bt.debug("Start On Load: "+(null==t?void 0:t.startOnLoad)),Cp.updateSiteConfig({startOnLoad:null==t?void 0:t.startOnLoad}));const s=new ai.initIdGenerator(r.deterministicIds,r.deterministicIDSeed);let o;const c=[];for(const h of Array.from(a)){if(Bt.info("Rendering diagram: "+h.id),h.getAttribute("data-processed"))continue;h.setAttribute("data-processed","true");const t=`mermaid-${s.next()}`;o=h.innerHTML,o=i(ai.entityDecode(o)).trim().replace(/<br\s*\/?>/gi,"<br/>");const e=ai.detectInit(o);e&&Bt.debug("Detected early reinit: ",e);try{await Cp.renderAsync(t,o,((e,i)=>{h.innerHTML=e,void 0!==n&&n(t),i&&i(h)}),h)}catch(l){Tp(l,c,Np.parseError)}}if(c.length>0)throw c[0]},Sp=function(){if(Np.startOnLoad){const{startOnLoad:t}=Cp.getConfig();t&&Np.init().catch((t=>Bt.error("Mermaid failed to initialize",t)))}};"undefined"!=typeof document&&window.addEventListener("load",Sp,!1);const Ap=[];let Lp=!1;const Bp=async()=>{if(!Lp){for(Lp=!0;Ap.length>0;){const e=Ap.shift();if(e)try{await e()}catch(t){Bt.error("Error executing queue",t)}}Lp=!1}},Np={startOnLoad:!0,diagrams:{},mermaidAPI:Cp,parse:t=>Cp.parse(t,Np.parseError),parseAsync:t=>new Promise(((e,n)=>{Ap.push((()=>new Promise(((i,r)=>{Cp.parseAsync(t,Np.parseError).then((t=>{i(t),e(t)}),(t=>{Bt.error("Error parsing",t),r(t),n(t)}))})))),Bp().catch(n)})),render:Cp.render,renderAsync:(t,e,n,i)=>new Promise(((r,a)=>{Ap.push((()=>new Promise(((s,o)=>{Cp.renderAsync(t,e,n,i).then((t=>{s(t),r(t)}),(t=>{Bt.error("Error parsing",t),o(t),a(t)}))})))),Bp().catch(a)})),init:async function(t,e,n){try{await Ep(t,e,n)}catch(i){Bt.warn("Syntax Error rendering"),ii(i)&&Bt.warn(i.str),Np.parseError&&Np.parseError(i)}},initThrowsErrors:function(t,e,n){const r=Cp.getConfig();let a;if(t&&(Np.sequenceConfig=t),Bt.debug((n?"":"No ")+"Callback function found"),void 0===e)a=document.querySelectorAll(".mermaid");else if("string"==typeof e)a=document.querySelectorAll(e);else if(e instanceof HTMLElement)a=[e];else{if(!(e instanceof NodeList))throw new Error("Invalid argument nodes for mermaid.init");a=e}Bt.debug(`Found ${a.length} diagrams`),void 0!==(null==t?void 0:t.startOnLoad)&&(Bt.debug("Start On Load: "+(null==t?void 0:t.startOnLoad)),Cp.updateSiteConfig({startOnLoad:null==t?void 0:t.startOnLoad}));const s=new ai.initIdGenerator(r.deterministicIds,r.deterministicIDSeed);let o;const c=[];for(const h of Array.from(a)){if(Bt.info("Rendering diagram: "+h.id),h.getAttribute("data-processed"))continue;h.setAttribute("data-processed","true");const t=`mermaid-${s.next()}`;o=h.innerHTML,o=i(ai.entityDecode(o)).trim().replace(/<br\s*\/?>/gi,"<br/>");const e=ai.detectInit(o);e&&Bt.debug("Detected early reinit: ",e);try{Cp.render(t,o,((e,i)=>{h.innerHTML=e,void 0!==n&&n(t),i&&i(h)}),h)}catch(l){Tp(l,c,Np.parseError)}}if(c.length>0)throw c[0]},initThrowsErrorsAsync:Ep,registerExternalDiagrams:async(t,{lazyLoad:e=!0}={})=>{e?Mn(...t):await(async(...t)=>{Bt.debug(`Loading ${t.length} external diagrams`);const e=(await Promise.allSettled(t.map((async({id:t,detector:e,loader:n})=>{const{diagram:i}=await n();or(t,i,e)})))).filter((t=>"rejected"===t.status));if(e.length>0){Bt.error(`Failed to load ${e.length} external diagrams`);for(const t of e)Bt.error(t);throw new Error(`Failed to load ${e.length} external diagrams`)}})(...t)},initialize:function(t){Cp.initialize(t)},parseError:void 0,contentLoaded:Sp,setParseErrorHandler:function(t){Np.parseError=t}}},7594:(t,e)=>{function n(t){let e,n=[];for(let i of t.split(",").map((t=>t.trim())))if(/^-?\d+$/.test(i))n.push(parseInt(i,10));else if(e=i.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[t,i,r,a]=e;if(i&&a){i=parseInt(i),a=parseInt(a);const t=i<a?1:-1;"-"!==r&&".."!==r&&"\u2025"!==r||(a+=t);for(let e=i;e!==a;e+=t)n.push(e)}}return n}e.default=n,t.exports=n},9373:(t,e,n)=>{"use strict";function i(t,e){let n;if(void 0===e)for(const i of t)null!=i&&(n<i||void 0===n&&i>=i)&&(n=i);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n<r||void 0===n&&r>=r)&&(n=r)}return n}function r(t,e){let n;if(void 0===e)for(const i of t)null!=i&&(n>i||void 0===n&&i>=i)&&(n=i);else{let i=-1;for(let r of t)null!=(r=e(r,++i,t))&&(n>r||void 0===n&&r>=r)&&(n=r)}return n}function a(t){return t}n.d(e,{Nb1:()=>so,LLu:()=>b,F5q:()=>m,$0Z:()=>xo,Dts:()=>ko,WQY:()=>Co,qpX:()=>Eo,u93:()=>So,tFB:()=>Lo,YY7:()=>Do,OvA:()=>Mo,dCK:()=>Fo,zgE:()=>Zo,fGX:()=>jo,$m7:()=>zo,c_6:()=>lo,fxm:()=>Wo,FdL:()=>Jo,ak_:()=>tc,SxZ:()=>ic,eA_:()=>ac,jsv:()=>oc,iJ:()=>sc,JHv:()=>gi,jvg:()=>po,Fp7:()=>i,VV$:()=>r,ve8:()=>yo,BYU:()=>cr,PKp:()=>gr,Xf:()=>Ns,Ys:()=>Ds,td_:()=>Os,YPS:()=>Vn,rr1:()=>Dr,i$Z:()=>ha,WQD:()=>Br,Z_i:()=>Ar,F0B:()=>Qr,NGh:()=>Fr});var s=1,o=2,c=3,l=4,h=1e-6;function u(t){return"translate("+t+",0)"}function d(t){return"translate(0,"+t+")"}function p(t){return e=>+t(e)}function f(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}function g(){return!this.__axis}function y(t,e){var n=[],i=null,r=null,y=6,m=6,b=3,_="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,x=t===s||t===l?-1:1,v=t===l||t===o?"x":"y",k=t===s||t===c?u:d;function w(u){var d=null==i?e.ticks?e.ticks.apply(e,n):e.domain():i,w=null==r?e.tickFormat?e.tickFormat.apply(e,n):a:r,C=Math.max(y,0)+b,T=e.range(),E=+T[0]+_,S=+T[T.length-1]+_,A=(e.bandwidth?f:p)(e.copy(),_),L=u.selection?u.selection():u,B=L.selectAll(".domain").data([null]),N=L.selectAll(".tick").data(d,e).order(),D=N.exit(),O=N.enter().append("g").attr("class","tick"),M=N.select("line"),I=N.select("text");B=B.merge(B.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),N=N.merge(O),M=M.merge(O.append("line").attr("stroke","currentColor").attr(v+"2",x*y)),I=I.merge(O.append("text").attr("fill","currentColor").attr(v,x*C).attr("dy",t===s?"0em":t===c?"0.71em":"0.32em")),u!==L&&(B=B.transition(u),N=N.transition(u),M=M.transition(u),I=I.transition(u),D=D.transition(u).attr("opacity",h).attr("transform",(function(t){return isFinite(t=A(t))?k(t+_):this.getAttribute("transform")})),O.attr("opacity",h).attr("transform",(function(t){var e=this.parentNode.__axis;return k((e&&isFinite(e=e(t))?e:A(t))+_)}))),D.remove(),B.attr("d",t===l||t===o?m?"M"+x*m+","+E+"H"+_+"V"+S+"H"+x*m:"M"+_+","+E+"V"+S:m?"M"+E+","+x*m+"V"+_+"H"+S+"V"+x*m:"M"+E+","+_+"H"+S),N.attr("opacity",1).attr("transform",(function(t){return k(A(t)+_)})),M.attr(v+"2",x*y),I.attr(v,x*C).text(w),L.filter(g).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===o?"start":t===l?"end":"middle"),L.each((function(){this.__axis=A}))}return w.scale=function(t){return arguments.length?(e=t,w):e},w.ticks=function(){return n=Array.from(arguments),w},w.tickArguments=function(t){return arguments.length?(n=null==t?[]:Array.from(t),w):n.slice()},w.tickValues=function(t){return arguments.length?(i=null==t?null:Array.from(t),w):i&&i.slice()},w.tickFormat=function(t){return arguments.length?(r=t,w):r},w.tickSize=function(t){return arguments.length?(y=m=+t,w):y},w.tickSizeInner=function(t){return arguments.length?(y=+t,w):y},w.tickSizeOuter=function(t){return arguments.length?(m=+t,w):m},w.tickPadding=function(t){return arguments.length?(b=+t,w):b},w.offset=function(t){return arguments.length?(_=+t,w):_},w}function m(t){return y(s,t)}function b(t){return y(c,t)}function _(){}function x(t){return null==t?_:function(){return this.querySelector(t)}}function v(t){return null==t?[]:Array.isArray(t)?t:Array.from(t)}function k(){return[]}function w(t){return null==t?k:function(){return this.querySelectorAll(t)}}function C(t){return function(){return this.matches(t)}}function T(t){return function(e){return e.matches(t)}}var E=Array.prototype.find;function S(){return this.firstElementChild}var A=Array.prototype.filter;function L(){return Array.from(this.children)}function B(t){return new Array(t.length)}function N(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function D(t,e,n,i,r,a){for(var s,o=0,c=e.length,l=a.length;o<l;++o)(s=e[o])?(s.__data__=a[o],i[o]=s):n[o]=new N(t,a[o]);for(;o<c;++o)(s=e[o])&&(r[o]=s)}function O(t,e,n,i,r,a,s){var o,c,l,h=new Map,u=e.length,d=a.length,p=new Array(u);for(o=0;o<u;++o)(c=e[o])&&(p[o]=l=s.call(c,c.__data__,o,e)+"",h.has(l)?r[o]=c:h.set(l,c));for(o=0;o<d;++o)l=s.call(t,a[o],o,a)+"",(c=h.get(l))?(i[o]=c,c.__data__=a[o],h.delete(l)):n[o]=new N(t,a[o]);for(o=0;o<u;++o)(c=e[o])&&h.get(p[o])===c&&(r[o]=c)}function M(t){return t.__data__}function I(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function F(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}N.prototype={constructor:N,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var $="http://www.w3.org/1999/xhtml";const R={svg:"http://www.w3.org/2000/svg",xhtml:$,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Z(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),R.hasOwnProperty(e)?{space:R[e],local:t}:t}function P(t){return function(){this.removeAttribute(t)}}function j(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Y(t,e){return function(){this.setAttribute(t,e)}}function z(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function U(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function W(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function q(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function H(t){return function(){this.style.removeProperty(t)}}function V(t,e,n){return function(){this.style.setProperty(t,e,n)}}function G(t,e,n){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}function X(t,e){return t.style.getPropertyValue(e)||q(t).getComputedStyle(t,null).getPropertyValue(e)}function Q(t){return function(){delete this[t]}}function K(t,e){return function(){this[t]=e}}function J(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function tt(t){return t.trim().split(/^|\s+/)}function et(t){return t.classList||new nt(t)}function nt(t){this._node=t,this._names=tt(t.getAttribute("class")||"")}function it(t,e){for(var n=et(t),i=-1,r=e.length;++i<r;)n.add(e[i])}function rt(t,e){for(var n=et(t),i=-1,r=e.length;++i<r;)n.remove(e[i])}function at(t){return function(){it(this,t)}}function st(t){return function(){rt(this,t)}}function ot(t,e){return function(){(e.apply(this,arguments)?it:rt)(this,t)}}function ct(){this.textContent=""}function lt(t){return function(){this.textContent=t}}function ht(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}function ut(){this.innerHTML=""}function dt(t){return function(){this.innerHTML=t}}function pt(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}function ft(){this.nextSibling&&this.parentNode.appendChild(this)}function gt(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function yt(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===$&&e.documentElement.namespaceURI===$?e.createElement(t):e.createElementNS(n,t)}}function mt(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function bt(t){var e=Z(t);return(e.local?mt:yt)(e)}function _t(){return null}function xt(){var t=this.parentNode;t&&t.removeChild(this)}function vt(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function kt(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function wt(t){return function(){var e=this.__on;if(e){for(var n,i=0,r=-1,a=e.length;i<a;++i)n=e[i],t.type&&n.type!==t.type||n.name!==t.name?e[++r]=n:this.removeEventListener(n.type,n.listener,n.options);++r?e.length=r:delete this.__on}}}function Ct(t,e,n){return function(){var i,r=this.__on,a=function(t){return function(e){t.call(this,e,this.__data__)}}(e);if(r)for(var s=0,o=r.length;s<o;++s)if((i=r[s]).type===t.type&&i.name===t.name)return this.removeEventListener(i.type,i.listener,i.options),this.addEventListener(i.type,i.listener=a,i.options=n),void(i.value=e);this.addEventListener(t.type,a,n),i={type:t.type,name:t.name,value:e,listener:a,options:n},r?r.push(i):this.__on=[i]}}function Tt(t,e,n){var i=q(t),r=i.CustomEvent;"function"==typeof r?r=new r(e,n):(r=i.document.createEvent("Event"),n?(r.initEvent(e,n.bubbles,n.cancelable),r.detail=n.detail):r.initEvent(e,!1,!1)),t.dispatchEvent(r)}function Et(t,e){return function(){return Tt(this,t,e)}}function St(t,e){return function(){return Tt(this,t,e.apply(this,arguments))}}nt.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var At=[null];function Lt(t,e){this._groups=t,this._parents=e}function Bt(){return new Lt([[document.documentElement]],At)}Lt.prototype=Bt.prototype={constructor:Lt,select:function(t){"function"!=typeof t&&(t=x(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s,o=e[r],c=o.length,l=i[r]=new Array(c),h=0;h<c;++h)(a=o[h])&&(s=t.call(a,a.__data__,h,o))&&("__data__"in a&&(s.__data__=a.__data__),l[h]=s);return new Lt(i,this._parents)},selectAll:function(t){t="function"==typeof t?function(t){return function(){return v(t.apply(this,arguments))}}(t):w(t);for(var e=this._groups,n=e.length,i=[],r=[],a=0;a<n;++a)for(var s,o=e[a],c=o.length,l=0;l<c;++l)(s=o[l])&&(i.push(t.call(s,s.__data__,l,o)),r.push(s));return new Lt(i,r)},selectChild:function(t){return this.select(null==t?S:function(t){return function(){return E.call(this.children,t)}}("function"==typeof t?t:T(t)))},selectChildren:function(t){return this.selectAll(null==t?L:function(t){return function(){return A.call(this.children,t)}}("function"==typeof t?t:T(t)))},filter:function(t){"function"!=typeof t&&(t=C(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s=e[r],o=s.length,c=i[r]=[],l=0;l<o;++l)(a=s[l])&&t.call(a,a.__data__,l,s)&&c.push(a);return new Lt(i,this._parents)},data:function(t,e){if(!arguments.length)return Array.from(this,M);var n,i=e?O:D,r=this._parents,a=this._groups;"function"!=typeof t&&(n=t,t=function(){return n});for(var s=a.length,o=new Array(s),c=new Array(s),l=new Array(s),h=0;h<s;++h){var u=r[h],d=a[h],p=d.length,f=I(t.call(u,u&&u.__data__,h,r)),g=f.length,y=c[h]=new Array(g),m=o[h]=new Array(g);i(u,d,y,m,l[h]=new Array(p),f,e);for(var b,_,x=0,v=0;x<g;++x)if(b=y[x]){for(x>=v&&(v=x+1);!(_=m[v])&&++v<g;);b._next=_||null}}return(o=new Lt(o,r))._enter=c,o._exit=l,o},enter:function(){return new Lt(this._enter||this._groups.map(B),this._parents)},exit:function(){return new Lt(this._exit||this._groups.map(B),this._parents)},join:function(t,e,n){var i=this.enter(),r=this,a=this.exit();return"function"==typeof t?(i=t(i))&&(i=i.selection()):i=i.append(t+""),null!=e&&(r=e(r))&&(r=r.selection()),null==n?a.remove():n(a),i&&r?i.merge(r).order():r},merge:function(t){for(var e=t.selection?t.selection():t,n=this._groups,i=e._groups,r=n.length,a=i.length,s=Math.min(r,a),o=new Array(r),c=0;c<s;++c)for(var l,h=n[c],u=i[c],d=h.length,p=o[c]=new Array(d),f=0;f<d;++f)(l=h[f]||u[f])&&(p[f]=l);for(;c<r;++c)o[c]=n[c];return new Lt(o,this._parents)},selection:function(){return this},order:function(){for(var t=this._groups,e=-1,n=t.length;++e<n;)for(var i,r=t[e],a=r.length-1,s=r[a];--a>=0;)(i=r[a])&&(s&&4^i.compareDocumentPosition(s)&&s.parentNode.insertBefore(i,s),s=i);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=F);for(var n=this._groups,i=n.length,r=new Array(i),a=0;a<i;++a){for(var s,o=n[a],c=o.length,l=r[a]=new Array(c),h=0;h<c;++h)(s=o[h])&&(l[h]=s);l.sort(e)}return new Lt(r,this._parents).order()},call:function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i=t[e],r=0,a=i.length;r<a;++r){var s=i[r];if(s)return s}return null},size:function(){let t=0;for(const e of this)++t;return t},empty:function(){return!this.node()},each:function(t){for(var e=this._groups,n=0,i=e.length;n<i;++n)for(var r,a=e[n],s=0,o=a.length;s<o;++s)(r=a[s])&&t.call(r,r.__data__,s,a);return this},attr:function(t,e){var n=Z(t);if(arguments.length<2){var i=this.node();return n.local?i.getAttributeNS(n.space,n.local):i.getAttribute(n)}return this.each((null==e?n.local?j:P:"function"==typeof e?n.local?W:U:n.local?z:Y)(n,e))},style:function(t,e,n){return arguments.length>1?this.each((null==e?H:"function"==typeof e?G:V)(t,e,null==n?"":n)):X(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?Q:"function"==typeof e?J:K)(t,e)):this.node()[t]},classed:function(t,e){var n=tt(t+"");if(arguments.length<2){for(var i=et(this.node()),r=-1,a=n.length;++r<a;)if(!i.contains(n[r]))return!1;return!0}return this.each(("function"==typeof e?ot:e?at:st)(n,e))},text:function(t){return arguments.length?this.each(null==t?ct:("function"==typeof t?ht:lt)(t)):this.node().textContent},html:function(t){return arguments.length?this.each(null==t?ut:("function"==typeof t?pt:dt)(t)):this.node().innerHTML},raise:function(){return this.each(ft)},lower:function(){return this.each(gt)},append:function(t){var e="function"==typeof t?t:bt(t);return this.select((function(){return this.appendChild(e.apply(this,arguments))}))},insert:function(t,e){var n="function"==typeof t?t:bt(t),i=null==e?_t:"function"==typeof e?e:x(e);return this.select((function(){return this.insertBefore(n.apply(this,arguments),i.apply(this,arguments)||null)}))},remove:function(){return this.each(xt)},clone:function(t){return this.select(t?kt:vt)},datum:function(t){return arguments.length?this.property("__data__",t):this.node().__data__},on:function(t,e,n){var i,r,a=function(t){return t.trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}(t+""),s=a.length;if(!(arguments.length<2)){for(o=e?Ct:wt,i=0;i<s;++i)this.each(o(a[i],e,n));return this}var o=this.node().__on;if(o)for(var c,l=0,h=o.length;l<h;++l)for(i=0,c=o[l];i<s;++i)if((r=a[i]).type===c.type&&r.name===c.name)return c.value},dispatch:function(t,e){return this.each(("function"==typeof e?St:Et)(t,e))},[Symbol.iterator]:function*(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i,r=t[e],a=0,s=r.length;a<s;++a)(i=r[a])&&(yield i)}};const Nt=Bt;var Dt={value:()=>{}};function Ot(){for(var t,e=0,n=arguments.length,i={};e<n;++e){if(!(t=arguments[e]+"")||t in i||/[\s.]/.test(t))throw new Error("illegal type: "+t);i[t]=[]}return new Mt(i)}function Mt(t){this._=t}function It(t,e){for(var n,i=0,r=t.length;i<r;++i)if((n=t[i]).name===e)return n.value}function Ft(t,e,n){for(var i=0,r=t.length;i<r;++i)if(t[i].name===e){t[i]=Dt,t=t.slice(0,i).concat(t.slice(i+1));break}return null!=n&&t.push({name:e,value:n}),t}Mt.prototype=Ot.prototype={constructor:Mt,on:function(t,e){var n,i,r=this._,a=(i=r,(t+"").trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");if(n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),t&&!i.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))),s=-1,o=a.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++s<o;)if(n=(t=a[s]).type)r[n]=Ft(r[n],t.name,e);else if(null==e)for(n in r)r[n]=Ft(r[n],t.name,null);return this}for(;++s<o;)if((n=(t=a[s]).type)&&(n=It(r[n],t.name)))return n},copy:function(){var t={},e=this._;for(var n in e)t[n]=e[n].slice();return new Mt(t)},call:function(t,e){if((n=arguments.length-2)>0)for(var n,i,r=new Array(n),a=0;a<n;++a)r[a]=arguments[a+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(a=0,n=(i=this._[t]).length;a<n;++a)i[a].value.apply(e,r)},apply:function(t,e,n){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var i=this._[t],r=0,a=i.length;r<a;++r)i[r].value.apply(e,n)}};const $t=Ot;var Rt,Zt,Pt=0,jt=0,Yt=0,zt=1e3,Ut=0,Wt=0,qt=0,Ht="object"==typeof performance&&performance.now?performance:Date,Vt="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function Gt(){return Wt||(Vt(Xt),Wt=Ht.now()+qt)}function Xt(){Wt=0}function Qt(){this._call=this._time=this._next=null}function Kt(t,e,n){var i=new Qt;return i.restart(t,e,n),i}function Jt(){Wt=(Ut=Ht.now())+qt,Pt=jt=0;try{!function(){Gt(),++Pt;for(var t,e=Rt;e;)(t=Wt-e._time)>=0&&e._call.call(void 0,t),e=e._next;--Pt}()}finally{Pt=0,function(){var t,e,n=Rt,i=1/0;for(;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Rt=e);Zt=t,ee(i)}(),Wt=0}}function te(){var t=Ht.now(),e=t-Ut;e>zt&&(qt-=e,Ut=t)}function ee(t){Pt||(jt&&(jt=clearTimeout(jt)),t-Wt>24?(t<1/0&&(jt=setTimeout(Jt,t-Ht.now()-qt)),Yt&&(Yt=clearInterval(Yt))):(Yt||(Ut=Ht.now(),Yt=setInterval(te,zt)),Pt=1,Vt(Jt)))}function ne(t,e,n){var i=new Qt;return e=null==e?0:+e,i.restart((n=>{i.stop(),t(n+e)}),e,n),i}Qt.prototype=Kt.prototype={constructor:Qt,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?Gt():+n)+(null==e?0:+e),this._next||Zt===this||(Zt?Zt._next=this:Rt=this,Zt=this),this._call=t,this._time=n,ee()},stop:function(){this._call&&(this._call=null,this._time=1/0,ee())}};var ie=$t("start","end","cancel","interrupt"),re=[],ae=0,se=1,oe=2,ce=3,le=4,he=5,ue=6;function de(t,e,n,i,r,a){var s=t.__transition;if(s){if(n in s)return}else t.__transition={};!function(t,e,n){var i,r=t.__transition;function a(t){n.state=se,n.timer.restart(s,n.delay,n.time),n.delay<=t&&s(t-n.delay)}function s(a){var l,h,u,d;if(n.state!==se)return c();for(l in r)if((d=r[l]).name===n.name){if(d.state===ce)return ne(s);d.state===le?(d.state=ue,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete r[l]):+l<e&&(d.state=ue,d.timer.stop(),d.on.call("cancel",t,t.__data__,d.index,d.group),delete r[l])}if(ne((function(){n.state===ce&&(n.state=le,n.timer.restart(o,n.delay,n.time),o(a))})),n.state=oe,n.on.call("start",t,t.__data__,n.index,n.group),n.state===oe){for(n.state=ce,i=new Array(u=n.tween.length),l=0,h=-1;l<u;++l)(d=n.tween[l].value.call(t,t.__data__,n.index,n.group))&&(i[++h]=d);i.length=h+1}}function o(e){for(var r=e<n.duration?n.ease.call(null,e/n.duration):(n.timer.restart(c),n.state=he,1),a=-1,s=i.length;++a<s;)i[a].call(t,r);n.state===he&&(n.on.call("end",t,t.__data__,n.index,n.group),c())}function c(){for(var i in n.state=ue,n.timer.stop(),delete r[e],r)return;delete t.__transition}r[e]=n,n.timer=Kt(a,0,n.time)}(t,n,{name:e,index:i,group:r,on:ie,tween:re,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:ae})}function pe(t,e){var n=ge(t,e);if(n.state>ae)throw new Error("too late; already scheduled");return n}function fe(t,e){var n=ge(t,e);if(n.state>ce)throw new Error("too late; already running");return n}function ge(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ye(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}var me,be=180/Math.PI,_e={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function xe(t,e,n,i,r,a){var s,o,c;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(c=t*n+e*i)&&(n-=t*c,i-=e*c),(o=Math.sqrt(n*n+i*i))&&(n/=o,i/=o,c/=o),t*i<e*n&&(t=-t,e=-e,c=-c,s=-s),{translateX:r,translateY:a,rotate:Math.atan2(e,t)*be,skewX:Math.atan(c)*be,scaleX:s,scaleY:o}}function ve(t,e,n,i){function r(t){return t.length?t.pop()+" ":""}return function(a,s){var o=[],c=[];return a=t(a),s=t(s),function(t,i,r,a,s,o){if(t!==r||i!==a){var c=s.push("translate(",null,e,null,n);o.push({i:c-4,x:ye(t,r)},{i:c-2,x:ye(i,a)})}else(r||a)&&s.push("translate("+r+e+a+n)}(a.translateX,a.translateY,s.translateX,s.translateY,o,c),function(t,e,n,a){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),a.push({i:n.push(r(n)+"rotate(",null,i)-2,x:ye(t,e)})):e&&n.push(r(n)+"rotate("+e+i)}(a.rotate,s.rotate,o,c),function(t,e,n,a){t!==e?a.push({i:n.push(r(n)+"skewX(",null,i)-2,x:ye(t,e)}):e&&n.push(r(n)+"skewX("+e+i)}(a.skewX,s.skewX,o,c),function(t,e,n,i,a,s){if(t!==n||e!==i){var o=a.push(r(a)+"scale(",null,",",null,")");s.push({i:o-4,x:ye(t,n)},{i:o-2,x:ye(e,i)})}else 1===n&&1===i||a.push(r(a)+"scale("+n+","+i+")")}(a.scaleX,a.scaleY,s.scaleX,s.scaleY,o,c),a=s=null,function(t){for(var e,n=-1,i=c.length;++n<i;)o[(e=c[n]).i]=e.x(t);return o.join("")}}}var ke=ve((function(t){const e=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?_e:xe(e.a,e.b,e.c,e.d,e.e,e.f)}),"px, ","px)","deg)"),we=ve((function(t){return null==t?_e:(me||(me=document.createElementNS("http://www.w3.org/2000/svg","g")),me.setAttribute("transform",t),(t=me.transform.baseVal.consolidate())?xe((t=t.matrix).a,t.b,t.c,t.d,t.e,t.f):_e)}),", ",")",")");function Ce(t,e){var n,i;return function(){var r=fe(this,t),a=r.tween;if(a!==n)for(var s=0,o=(i=n=a).length;s<o;++s)if(i[s].name===e){(i=i.slice()).splice(s,1);break}r.tween=i}}function Te(t,e,n){var i,r;if("function"!=typeof n)throw new Error;return function(){var a=fe(this,t),s=a.tween;if(s!==i){r=(i=s).slice();for(var o={name:e,value:n},c=0,l=r.length;c<l;++c)if(r[c].name===e){r[c]=o;break}c===l&&r.push(o)}a.tween=r}}function Ee(t,e,n){var i=t._id;return t.each((function(){var t=fe(this,i);(t.value||(t.value={}))[e]=n.apply(this,arguments)})),function(t){return ge(t,i).value[e]}}function Se(t,e,n){t.prototype=e.prototype=n,n.constructor=t}function Ae(t,e){var n=Object.create(t.prototype);for(var i in e)n[i]=e[i];return n}function Le(){}var Be=.7,Ne=1/Be,De="\\s*([+-]?\\d+)\\s*",Oe="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",Me="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Ie=/^#([0-9a-f]{3,8})$/,Fe=new RegExp(`^rgb\\(${De},${De},${De}\\)$`),$e=new RegExp(`^rgb\\(${Me},${Me},${Me}\\)$`),Re=new RegExp(`^rgba\\(${De},${De},${De},${Oe}\\)$`),Ze=new RegExp(`^rgba\\(${Me},${Me},${Me},${Oe}\\)$`),Pe=new RegExp(`^hsl\\(${Oe},${Me},${Me}\\)$`),je=new RegExp(`^hsla\\(${Oe},${Me},${Me},${Oe}\\)$`),Ye={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function ze(){return this.rgb().formatHex()}function Ue(){return this.rgb().formatRgb()}function We(t){var e,n;return t=(t+"").trim().toLowerCase(),(e=Ie.exec(t))?(n=e[1].length,e=parseInt(e[1],16),6===n?qe(e):3===n?new Xe(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?He(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?He(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Fe.exec(t))?new Xe(e[1],e[2],e[3],1):(e=$e.exec(t))?new Xe(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Re.exec(t))?He(e[1],e[2],e[3],e[4]):(e=Ze.exec(t))?He(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Pe.exec(t))?nn(e[1],e[2]/100,e[3]/100,1):(e=je.exec(t))?nn(e[1],e[2]/100,e[3]/100,e[4]):Ye.hasOwnProperty(t)?qe(Ye[t]):"transparent"===t?new Xe(NaN,NaN,NaN,0):null}function qe(t){return new Xe(t>>16&255,t>>8&255,255&t,1)}function He(t,e,n,i){return i<=0&&(t=e=n=NaN),new Xe(t,e,n,i)}function Ve(t){return t instanceof Le||(t=We(t)),t?new Xe((t=t.rgb()).r,t.g,t.b,t.opacity):new Xe}function Ge(t,e,n,i){return 1===arguments.length?Ve(t):new Xe(t,e,n,null==i?1:i)}function Xe(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function Qe(){return`#${en(this.r)}${en(this.g)}${en(this.b)}`}function Ke(){const t=Je(this.opacity);return`${1===t?"rgb(":"rgba("}${tn(this.r)}, ${tn(this.g)}, ${tn(this.b)}${1===t?")":`, ${t})`}`}function Je(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function tn(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function en(t){return((t=tn(t))<16?"0":"")+t.toString(16)}function nn(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new an(t,e,n,i)}function rn(t){if(t instanceof an)return new an(t.h,t.s,t.l,t.opacity);if(t instanceof Le||(t=We(t)),!t)return new an;if(t instanceof an)return t;var e=(t=t.rgb()).r/255,n=t.g/255,i=t.b/255,r=Math.min(e,n,i),a=Math.max(e,n,i),s=NaN,o=a-r,c=(a+r)/2;return o?(s=e===a?(n-i)/o+6*(n<i):n===a?(i-e)/o+2:(e-n)/o+4,o/=c<.5?a+r:2-a-r,s*=60):o=c>0&&c<1?0:s,new an(s,o,c,t.opacity)}function an(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function sn(t){return(t=(t||0)%360)<0?t+360:t}function on(t){return Math.max(0,Math.min(1,t||0))}function cn(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}function ln(t,e,n,i,r){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*n+(1+3*t+3*a-3*s)*i+s*r)/6}Se(Le,We,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:ze,formatHex:ze,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return rn(this).formatHsl()},formatRgb:Ue,toString:Ue}),Se(Xe,Ge,Ae(Le,{brighter(t){return t=null==t?Ne:Math.pow(Ne,t),new Xe(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?Be:Math.pow(Be,t),new Xe(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Xe(tn(this.r),tn(this.g),tn(this.b),Je(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Qe,formatHex:Qe,formatHex8:function(){return`#${en(this.r)}${en(this.g)}${en(this.b)}${en(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Ke,toString:Ke})),Se(an,(function(t,e,n,i){return 1===arguments.length?rn(t):new an(t,e,n,null==i?1:i)}),Ae(Le,{brighter(t){return t=null==t?Ne:Math.pow(Ne,t),new an(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?Be:Math.pow(Be,t),new an(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,r=2*n-i;return new Xe(cn(t>=240?t-240:t+120,r,i),cn(t,r,i),cn(t<120?t+240:t-120,r,i),this.opacity)},clamp(){return new an(sn(this.h),on(this.s),on(this.l),Je(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Je(this.opacity);return`${1===t?"hsl(":"hsla("}${sn(this.h)}, ${100*on(this.s)}%, ${100*on(this.l)}%${1===t?")":`, ${t})`}`}}));const hn=t=>()=>t;function un(t,e){return function(n){return t+n*e}}function dn(t){return 1==(t=+t)?pn:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}(e,n,t):hn(isNaN(e)?n:e)}}function pn(t,e){var n=e-t;return n?un(t,n):hn(isNaN(t)?e:t)}const fn=function t(e){var n=dn(e);function i(t,e){var i=n((t=Ge(t)).r,(e=Ge(e)).r),r=n(t.g,e.g),a=n(t.b,e.b),s=pn(t.opacity,e.opacity);return function(e){return t.r=i(e),t.g=r(e),t.b=a(e),t.opacity=s(e),t+""}}return i.gamma=t,i}(1);function gn(t){return function(e){var n,i,r=e.length,a=new Array(r),s=new Array(r),o=new Array(r);for(n=0;n<r;++n)i=Ge(e[n]),a[n]=i.r||0,s[n]=i.g||0,o[n]=i.b||0;return a=t(a),s=t(s),o=t(o),i.opacity=1,function(t){return i.r=a(t),i.g=s(t),i.b=o(t),i+""}}}gn((function(t){var e=t.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),r=t[i],a=t[i+1],s=i>0?t[i-1]:2*r-a,o=i<e-1?t[i+2]:2*a-r;return ln((n-i/e)*e,s,r,a,o)}})),gn((function(t){var e=t.length;return function(n){var i=Math.floor(((n%=1)<0?++n:n)*e),r=t[(i+e-1)%e],a=t[i%e],s=t[(i+1)%e],o=t[(i+2)%e];return ln((n-i/e)*e,r,a,s,o)}}));var yn=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,mn=new RegExp(yn.source,"g");function bn(t,e){var n,i,r,a=yn.lastIndex=mn.lastIndex=0,s=-1,o=[],c=[];for(t+="",e+="";(n=yn.exec(t))&&(i=mn.exec(e));)(r=i.index)>a&&(r=e.slice(a,r),o[s]?o[s]+=r:o[++s]=r),(n=n[0])===(i=i[0])?o[s]?o[s]+=i:o[++s]=i:(o[++s]=null,c.push({i:s,x:ye(n,i)})),a=mn.lastIndex;return a<e.length&&(r=e.slice(a),o[s]?o[s]+=r:o[++s]=r),o.length<2?c[0]?function(t){return function(e){return t(e)+""}}(c[0].x):function(t){return function(){return t}}(e):(e=c.length,function(t){for(var n,i=0;i<e;++i)o[(n=c[i]).i]=n.x(t);return o.join("")})}function _n(t,e){var n;return("number"==typeof e?ye:e instanceof We?fn:(n=We(e))?(e=n,fn):bn)(t,e)}function xn(t){return function(){this.removeAttribute(t)}}function vn(t){return function(){this.removeAttributeNS(t.space,t.local)}}function kn(t,e,n){var i,r,a=n+"";return function(){var s=this.getAttribute(t);return s===a?null:s===i?r:r=e(i=s,n)}}function wn(t,e,n){var i,r,a=n+"";return function(){var s=this.getAttributeNS(t.space,t.local);return s===a?null:s===i?r:r=e(i=s,n)}}function Cn(t,e,n){var i,r,a;return function(){var s,o,c=n(this);if(null!=c)return(s=this.getAttribute(t))===(o=c+"")?null:s===i&&o===r?a:(r=o,a=e(i=s,c));this.removeAttribute(t)}}function Tn(t,e,n){var i,r,a;return function(){var s,o,c=n(this);if(null!=c)return(s=this.getAttributeNS(t.space,t.local))===(o=c+"")?null:s===i&&o===r?a:(r=o,a=e(i=s,c));this.removeAttributeNS(t.space,t.local)}}function En(t,e){var n,i;function r(){var r=e.apply(this,arguments);return r!==i&&(n=(i=r)&&function(t,e){return function(n){this.setAttributeNS(t.space,t.local,e.call(this,n))}}(t,r)),n}return r._value=e,r}function Sn(t,e){var n,i;function r(){var r=e.apply(this,arguments);return r!==i&&(n=(i=r)&&function(t,e){return function(n){this.setAttribute(t,e.call(this,n))}}(t,r)),n}return r._value=e,r}function An(t,e){return function(){pe(this,t).delay=+e.apply(this,arguments)}}function Ln(t,e){return e=+e,function(){pe(this,t).delay=e}}function Bn(t,e){return function(){fe(this,t).duration=+e.apply(this,arguments)}}function Nn(t,e){return e=+e,function(){fe(this,t).duration=e}}var Dn=Nt.prototype.constructor;function On(t){return function(){this.style.removeProperty(t)}}var Mn=0;function In(t,e,n,i){this._groups=t,this._parents=e,this._name=n,this._id=i}function Fn(){return++Mn}var $n=Nt.prototype;In.prototype=function(t){return Nt().transition(t)}.prototype={constructor:In,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=x(t));for(var i=this._groups,r=i.length,a=new Array(r),s=0;s<r;++s)for(var o,c,l=i[s],h=l.length,u=a[s]=new Array(h),d=0;d<h;++d)(o=l[d])&&(c=t.call(o,o.__data__,d,l))&&("__data__"in o&&(c.__data__=o.__data__),u[d]=c,de(u[d],e,n,d,u,ge(o,n)));return new In(a,this._parents,e,n)},selectAll:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=w(t));for(var i=this._groups,r=i.length,a=[],s=[],o=0;o<r;++o)for(var c,l=i[o],h=l.length,u=0;u<h;++u)if(c=l[u]){for(var d,p=t.call(c,c.__data__,u,l),f=ge(c,n),g=0,y=p.length;g<y;++g)(d=p[g])&&de(d,e,n,g,p,f);a.push(p),s.push(c)}return new In(a,s,e,n)},selectChild:$n.selectChild,selectChildren:$n.selectChildren,filter:function(t){"function"!=typeof t&&(t=C(t));for(var e=this._groups,n=e.length,i=new Array(n),r=0;r<n;++r)for(var a,s=e[r],o=s.length,c=i[r]=[],l=0;l<o;++l)(a=s[l])&&t.call(a,a.__data__,l,s)&&c.push(a);return new In(i,this._parents,this._name,this._id)},merge:function(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,n=t._groups,i=e.length,r=n.length,a=Math.min(i,r),s=new Array(i),o=0;o<a;++o)for(var c,l=e[o],h=n[o],u=l.length,d=s[o]=new Array(u),p=0;p<u;++p)(c=l[p]||h[p])&&(d[p]=c);for(;o<i;++o)s[o]=e[o];return new In(s,this._parents,this._name,this._id)},selection:function(){return new Dn(this._groups,this._parents)},transition:function(){for(var t=this._name,e=this._id,n=Fn(),i=this._groups,r=i.length,a=0;a<r;++a)for(var s,o=i[a],c=o.length,l=0;l<c;++l)if(s=o[l]){var h=ge(s,e);de(s,t,n,l,o,{time:h.time+h.delay+h.duration,delay:0,duration:h.duration,ease:h.ease})}return new In(i,this._parents,t,n)},call:$n.call,nodes:$n.nodes,node:$n.node,size:$n.size,empty:$n.empty,each:$n.each,on:function(t,e){var n=this._id;return arguments.length<2?ge(this.node(),n).on.on(t):this.each(function(t,e,n){var i,r,a=function(t){return(t+"").trim().split(/^|\s+/).every((function(t){var e=t.indexOf(".");return e>=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?pe:fe;return function(){var s=a(this,t),o=s.on;o!==i&&(r=(i=o).copy()).on(e,n),s.on=r}}(n,t,e))},attr:function(t,e){var n=Z(t),i="transform"===n?we:_n;return this.attrTween(t,"function"==typeof e?(n.local?Tn:Cn)(n,i,Ee(this,"attr."+t,e)):null==e?(n.local?vn:xn)(n):(n.local?wn:kn)(n,i,e))},attrTween:function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var i=Z(t);return this.tween(n,(i.local?En:Sn)(i,e))},style:function(t,e,n){var i="transform"==(t+="")?ke:_n;return null==e?this.styleTween(t,function(t,e){var n,i,r;return function(){var a=X(this,t),s=(this.style.removeProperty(t),X(this,t));return a===s?null:a===n&&s===i?r:r=e(n=a,i=s)}}(t,i)).on("end.style."+t,On(t)):"function"==typeof e?this.styleTween(t,function(t,e,n){var i,r,a;return function(){var s=X(this,t),o=n(this),c=o+"";return null==o&&(this.style.removeProperty(t),c=o=X(this,t)),s===c?null:s===i&&c===r?a:(r=c,a=e(i=s,o))}}(t,i,Ee(this,"style."+t,e))).each(function(t,e){var n,i,r,a,s="style."+e,o="end."+s;return function(){var c=fe(this,t),l=c.on,h=null==c.value[s]?a||(a=On(e)):void 0;l===n&&r===h||(i=(n=l).copy()).on(o,r=h),c.on=i}}(this._id,t)):this.styleTween(t,function(t,e,n){var i,r,a=n+"";return function(){var s=X(this,t);return s===a?null:s===i?r:r=e(i=s,n)}}(t,i,e),n).on("end.style."+t,null)},styleTween:function(t,e,n){var i="style."+(t+="");if(arguments.length<2)return(i=this.tween(i))&&i._value;if(null==e)return this.tween(i,null);if("function"!=typeof e)throw new Error;return this.tween(i,function(t,e,n){var i,r;function a(){var a=e.apply(this,arguments);return a!==r&&(i=(r=a)&&function(t,e,n){return function(i){this.style.setProperty(t,e.call(this,i),n)}}(t,a,n)),i}return a._value=e,a}(t,e,null==n?"":n))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(Ee(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,function(t){var e,n;function i(){var i=t.apply(this,arguments);return i!==n&&(e=(n=i)&&function(t){return function(e){this.textContent=t.call(this,e)}}(i)),e}return i._value=t,i}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var i,r=ge(this.node(),n).tween,a=0,s=r.length;a<s;++a)if((i=r[a]).name===t)return i.value;return null}return this.each((null==e?Ce:Te)(n,t,e))},delay:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?An:Ln)(e,t)):ge(this.node(),e).delay},duration:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?Bn:Nn)(e,t)):ge(this.node(),e).duration},ease:function(t){var e=this._id;return arguments.length?this.each(function(t,e){if("function"!=typeof e)throw new Error;return function(){fe(this,t).ease=e}}(e,t)):ge(this.node(),e).ease},easeVarying:function(t){if("function"!=typeof t)throw new Error;return this.each(function(t,e){return function(){var n=e.apply(this,arguments);if("function"!=typeof n)throw new Error;fe(this,t).ease=n}}(this._id,t))},end:function(){var t,e,n=this,i=n._id,r=n.size();return new Promise((function(a,s){var o={value:s},c={value:function(){0==--r&&a()}};n.each((function(){var n=fe(this,i),r=n.on;r!==t&&((e=(t=r).copy())._.cancel.push(o),e._.interrupt.push(o),e._.end.push(c)),n.on=e})),0===r&&a()}))},[Symbol.iterator]:$n[Symbol.iterator]};var Rn={time:null,delay:0,duration:250,ease:function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}};function Zn(t,e){for(var n;!(n=t.__transition)||!(n=n[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return n}Nt.prototype.interrupt=function(t){return this.each((function(){!function(t,e){var n,i,r,a=t.__transition,s=!0;if(a){for(r in e=null==e?null:e+"",a)(n=a[r]).name===e?(i=n.state>oe&&n.state<he,n.state=ue,n.timer.stop(),n.on.call(i?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete a[r]):s=!1;s&&delete t.__transition}}(this,t)}))},Nt.prototype.transition=function(t){var e,n;t instanceof In?(e=t._id,t=t._name):(e=Fn(),(n=Rn).time=Gt(),t=null==t?null:t+"");for(var i=this._groups,r=i.length,a=0;a<r;++a)for(var s,o=i[a],c=o.length,l=0;l<c;++l)(s=o[l])&&de(s,t,e,l,o,n||Zn(s,e));return new In(i,this._parents,t,e)};const{abs:Pn,max:jn,min:Yn}=Math;function zn(t){return[+t[0],+t[1]]}function Un(t){return[zn(t[0]),zn(t[1])]}["w","e"].map(Wn),["n","s"].map(Wn),["n","w","e","s","nw","ne","sw","se"].map(Wn);function Wn(t){return{type:t}}function qn(t){if(!t.ok)throw new Error(t.status+" "+t.statusText);return t.text()}function Hn(t){return(e,n)=>function(t,e){return fetch(t,e).then(qn)}(e,n).then((e=>(new DOMParser).parseFromString(e,t)))}Hn("application/xml");Hn("text/html");var Vn=Hn("image/svg+xml");const Gn=Math.PI/180,Xn=180/Math.PI,Qn=.96422,Kn=1,Jn=.82521,ti=4/29,ei=6/29,ni=3*ei*ei,ii=ei*ei*ei;function ri(t){if(t instanceof ai)return new ai(t.l,t.a,t.b,t.opacity);if(t instanceof di)return pi(t);t instanceof Xe||(t=Ve(t));var e,n,i=li(t.r),r=li(t.g),a=li(t.b),s=si((.2225045*i+.7168786*r+.0606169*a)/Kn);return i===r&&r===a?e=n=s:(e=si((.4360747*i+.3850649*r+.1430804*a)/Qn),n=si((.0139322*i+.0971045*r+.7141733*a)/Jn)),new ai(116*s-16,500*(e-s),200*(s-n),t.opacity)}function ai(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}function si(t){return t>ii?Math.pow(t,1/3):t/ni+ti}function oi(t){return t>ei?t*t*t:ni*(t-ti)}function ci(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function li(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function hi(t){if(t instanceof di)return new di(t.h,t.c,t.l,t.opacity);if(t instanceof ai||(t=ri(t)),0===t.a&&0===t.b)return new di(NaN,0<t.l&&t.l<100?0:NaN,t.l,t.opacity);var e=Math.atan2(t.b,t.a)*Xn;return new di(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function ui(t,e,n,i){return 1===arguments.length?hi(t):new di(t,e,n,null==i?1:i)}function di(t,e,n,i){this.h=+t,this.c=+e,this.l=+n,this.opacity=+i}function pi(t){if(isNaN(t.h))return new ai(t.l,0,0,t.opacity);var e=t.h*Gn;return new ai(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}function fi(t){return function(e,n){var i=t((e=ui(e)).h,(n=ui(n)).h),r=pn(e.c,n.c),a=pn(e.l,n.l),s=pn(e.opacity,n.opacity);return function(t){return e.h=i(t),e.c=r(t),e.l=a(t),e.opacity=s(t),e+""}}}Se(ai,(function(t,e,n,i){return 1===arguments.length?ri(t):new ai(t,e,n,null==i?1:i)}),Ae(Le,{brighter(t){return new ai(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker(t){return new ai(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return new Xe(ci(3.1338561*(e=Qn*oi(e))-1.6168667*(t=Kn*oi(t))-.4906146*(n=Jn*oi(n))),ci(-.9787684*e+1.9161415*t+.033454*n),ci(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}})),Se(di,ui,Ae(Le,{brighter(t){return new di(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker(t){return new di(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb(){return pi(this).rgb()}}));const gi=fi((function(t,e){var n=e-t;return n?un(t,n>180||n<-180?n-360*Math.round(n/360):n):hn(isNaN(t)?e:t)}));fi(pn);const yi=Math.sqrt(50),mi=Math.sqrt(10),bi=Math.sqrt(2);function _i(t,e,n){const i=(e-t)/Math.max(0,n),r=Math.floor(Math.log10(i)),a=i/Math.pow(10,r),s=a>=yi?10:a>=mi?5:a>=bi?2:1;let o,c,l;return r<0?(l=Math.pow(10,-r)/s,o=Math.round(t*l),c=Math.round(e*l),o/l<t&&++o,c/l>e&&--c,l=-l):(l=Math.pow(10,r)*s,o=Math.round(t/l),c=Math.round(e/l),o*l<t&&++o,c*l>e&&--c),c<o&&.5<=n&&n<2?_i(t,e,2*n):[o,c,l]}function xi(t,e,n){return _i(t=+t,e=+e,n=+n)[2]}function vi(t,e,n){n=+n;const i=(e=+e)<(t=+t),r=i?xi(e,t,n):xi(t,e,n);return(i?-1:1)*(r<0?1/-r:r)}function ki(t,e){return null==t||null==e?NaN:t<e?-1:t>e?1:t>=e?0:NaN}function wi(t,e){return null==t||null==e?NaN:e<t?-1:e>t?1:e>=t?0:NaN}function Ci(t){let e,n,i;function r(t,i,r=0,a=t.length){if(r<a){if(0!==e(i,i))return a;do{const e=r+a>>>1;n(t[e],i)<0?r=e+1:a=e}while(r<a)}return r}return 2!==t.length?(e=ki,n=(e,n)=>ki(t(e),n),i=(e,n)=>t(e)-n):(e=t===ki||t===wi?t:Ti,n=t,i=t),{left:r,center:function(t,e,n=0,a=t.length){const s=r(t,e,n,a-1);return s>n&&i(t[s-1],e)>-i(t[s],e)?s-1:s},right:function(t,i,r=0,a=t.length){if(r<a){if(0!==e(i,i))return a;do{const e=r+a>>>1;n(t[e],i)<=0?r=e+1:a=e}while(r<a)}return r}}}function Ti(){return 0}const Ei=Ci(ki),Si=Ei.right,Ai=(Ei.left,Ci((function(t){return null===t?NaN:+t})).center,Si);function Li(t,e){var n,i=e?e.length:0,r=t?Math.min(i,t.length):0,a=new Array(r),s=new Array(i);for(n=0;n<r;++n)a[n]=Oi(t[n],e[n]);for(;n<i;++n)s[n]=e[n];return function(t){for(n=0;n<r;++n)s[n]=a[n](t);return s}}function Bi(t,e){var n=new Date;return t=+t,e=+e,function(i){return n.setTime(t*(1-i)+e*i),n}}function Ni(t,e){var n,i={},r={};for(n in null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={}),e)n in t?i[n]=Oi(t[n],e[n]):r[n]=e[n];return function(t){for(n in i)r[n]=i[n](t);return r}}function Di(t,e){e||(e=[]);var n,i=t?Math.min(e.length,t.length):0,r=e.slice();return function(a){for(n=0;n<i;++n)r[n]=t[n]*(1-a)+e[n]*a;return r}}function Oi(t,e){var n,i,r=typeof e;return null==e||"boolean"===r?hn(e):("number"===r?ye:"string"===r?(n=We(e))?(e=n,fn):bn:e instanceof We?fn:e instanceof Date?Bi:(i=e,!ArrayBuffer.isView(i)||i instanceof DataView?Array.isArray(e)?Li:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?Ni:ye:Di))(t,e)}function Mi(t,e){return t=+t,e=+e,function(n){return Math.round(t*(1-n)+e*n)}}function Ii(t){return+t}var Fi=[0,1];function $i(t){return t}function Ri(t,e){return(e-=t=+t)?function(n){return(n-t)/e}:(n=isNaN(e)?NaN:.5,function(){return n});var n}function Zi(t,e,n){var i=t[0],r=t[1],a=e[0],s=e[1];return r<i?(i=Ri(r,i),a=n(s,a)):(i=Ri(i,r),a=n(a,s)),function(t){return a(i(t))}}function Pi(t,e,n){var i=Math.min(t.length,e.length)-1,r=new Array(i),a=new Array(i),s=-1;for(t[i]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++s<i;)r[s]=Ri(t[s],t[s+1]),a[s]=n(e[s],e[s+1]);return function(e){var n=Ai(t,e,1,i)-1;return a[n](r[n](e))}}function ji(t,e){return e.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())}function Yi(){var t,e,n,i,r,a,s=Fi,o=Fi,c=Oi,l=$i;function h(){var t,e,n,c=Math.min(s.length,o.length);return l!==$i&&(t=s[0],e=s[c-1],t>e&&(n=t,t=e,e=n),l=function(n){return Math.max(t,Math.min(e,n))}),i=c>2?Pi:Zi,r=a=null,u}function u(e){return null==e||isNaN(e=+e)?n:(r||(r=i(s.map(t),o,c)))(t(l(e)))}return u.invert=function(n){return l(e((a||(a=i(o,s.map(t),ye)))(n)))},u.domain=function(t){return arguments.length?(s=Array.from(t,Ii),h()):s.slice()},u.range=function(t){return arguments.length?(o=Array.from(t),h()):o.slice()},u.rangeRound=function(t){return o=Array.from(t),c=Mi,h()},u.clamp=function(t){return arguments.length?(l=!!t||$i,h()):l!==$i},u.interpolate=function(t){return arguments.length?(c=t,h()):c},u.unknown=function(t){return arguments.length?(n=t,u):n},function(n,i){return t=n,e=i,h()}}function zi(){return Yi()($i,$i)}function Ui(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}var Wi,qi=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Hi(t){if(!(e=qi.exec(t)))throw new Error("invalid format: "+t);var e;return new Vi({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function Vi(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function Gi(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]}function Xi(t){return(t=Gi(Math.abs(t)))?t[1]:NaN}function Qi(t,e){var n=Gi(t,e);if(!n)return t+"";var i=n[0],r=n[1];return r<0?"0."+new Array(-r).join("0")+i:i.length>r+1?i.slice(0,r+1)+"."+i.slice(r+1):i+new Array(r-i.length+2).join("0")}Hi.prototype=Vi.prototype,Vi.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const Ki={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>Qi(100*t,e),r:Qi,s:function(t,e){var n=Gi(t,e);if(!n)return t+"";var i=n[0],r=n[1],a=r-(Wi=3*Math.max(-8,Math.min(8,Math.floor(r/3))))+1,s=i.length;return a===s?i:a>s?i+new Array(a-s+1).join("0"):a>0?i.slice(0,a)+"."+i.slice(a):"0."+new Array(1-a).join("0")+Gi(t,Math.max(0,e+a-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function Ji(t){return t}var tr,er,nr,ir=Array.prototype.map,rr=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"];function ar(t){var e,n,i=void 0===t.grouping||void 0===t.thousands?Ji:(e=ir.call(t.grouping,Number),n=t.thousands+"",function(t,i){for(var r=t.length,a=[],s=0,o=e[0],c=0;r>0&&o>0&&(c+o+1>i&&(o=Math.max(1,i-c)),a.push(t.substring(r-=o,r+o)),!((c+=o+1)>i));)o=e[s=(s+1)%e.length];return a.reverse().join(n)}),r=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",s=void 0===t.decimal?".":t.decimal+"",o=void 0===t.numerals?Ji:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(ir.call(t.numerals,String)),c=void 0===t.percent?"%":t.percent+"",l=void 0===t.minus?"\u2212":t.minus+"",h=void 0===t.nan?"NaN":t.nan+"";function u(t){var e=(t=Hi(t)).fill,n=t.align,u=t.sign,d=t.symbol,p=t.zero,f=t.width,g=t.comma,y=t.precision,m=t.trim,b=t.type;"n"===b?(g=!0,b="g"):Ki[b]||(void 0===y&&(y=12),m=!0,b="g"),(p||"0"===e&&"="===n)&&(p=!0,e="0",n="=");var _="$"===d?r:"#"===d&&/[boxX]/.test(b)?"0"+b.toLowerCase():"",x="$"===d?a:/[%p]/.test(b)?c:"",v=Ki[b],k=/[defgprs%]/.test(b);function w(t){var r,a,c,d=_,w=x;if("c"===b)w=v(t)+w,t="";else{var C=(t=+t)<0||1/t<0;if(t=isNaN(t)?h:v(Math.abs(t),y),m&&(t=function(t){t:for(var e,n=t.length,i=1,r=-1;i<n;++i)switch(t[i]){case".":r=e=i;break;case"0":0===r&&(r=i),e=i;break;default:if(!+t[i])break t;r>0&&(r=0)}return r>0?t.slice(0,r)+t.slice(e+1):t}(t)),C&&0==+t&&"+"!==u&&(C=!1),d=(C?"("===u?u:l:"-"===u||"("===u?"":u)+d,w=("s"===b?rr[8+Wi/3]:"")+w+(C&&"("===u?")":""),k)for(r=-1,a=t.length;++r<a;)if(48>(c=t.charCodeAt(r))||c>57){w=(46===c?s+t.slice(r+1):t.slice(r))+w,t=t.slice(0,r);break}}g&&!p&&(t=i(t,1/0));var T=d.length+t.length+w.length,E=T<f?new Array(f-T+1).join(e):"";switch(g&&p&&(t=i(E+t,E.length?f-w.length:1/0),E=""),n){case"<":t=d+t+w+E;break;case"=":t=d+E+t+w;break;case"^":t=E.slice(0,T=E.length>>1)+d+t+w+E.slice(T);break;default:t=E+d+t+w}return o(t)}return y=void 0===y?6:/[gprs]/.test(b)?Math.max(1,Math.min(21,y)):Math.max(0,Math.min(20,y)),w.toString=function(){return t+""},w}return{format:u,formatPrefix:function(t,e){var n=u(((t=Hi(t)).type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(Xi(e)/3))),r=Math.pow(10,-i),a=rr[8+i/3];return function(t){return n(r*t)+a}}}}function sr(t,e,n,i){var r,a=vi(t,e,n);switch((i=Hi(null==i?",f":i)).type){case"s":var s=Math.max(Math.abs(t),Math.abs(e));return null!=i.precision||isNaN(r=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Xi(e)/3)))-Xi(Math.abs(t)))}(a,s))||(i.precision=r),nr(i,s);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(r=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Xi(e)-Xi(t))+1}(a,Math.max(Math.abs(t),Math.abs(e))))||(i.precision=r-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(r=function(t){return Math.max(0,-Xi(Math.abs(t)))}(a))||(i.precision=r-2*("%"===i.type))}return er(i)}function or(t){var e=t.domain;return t.ticks=function(t){var n=e();return function(t,e,n){if(!((n=+n)>0))return[];if((t=+t)==(e=+e))return[t];const i=e<t,[r,a,s]=i?_i(e,t,n):_i(t,e,n);if(!(a>=r))return[];const o=a-r+1,c=new Array(o);if(i)if(s<0)for(let l=0;l<o;++l)c[l]=(a-l)/-s;else for(let l=0;l<o;++l)c[l]=(a-l)*s;else if(s<0)for(let l=0;l<o;++l)c[l]=(r+l)/-s;else for(let l=0;l<o;++l)c[l]=(r+l)*s;return c}(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var i=e();return sr(i[0],i[i.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10);var i,r,a=e(),s=0,o=a.length-1,c=a[s],l=a[o],h=10;for(l<c&&(r=c,c=l,l=r,r=s,s=o,o=r);h-- >0;){if((r=xi(c,l,n))===i)return a[s]=c,a[o]=l,e(a);if(r>0)c=Math.floor(c/r)*r,l=Math.ceil(l/r)*r;else{if(!(r<0))break;c=Math.ceil(c*r)/r,l=Math.floor(l*r)/r}i=r}return t},t}function cr(){var t=zi();return t.copy=function(){return ji(t,cr())},Ui.apply(t,arguments),or(t)}tr=ar({thousands:",",grouping:[3],currency:["$",""]}),er=tr.format,nr=tr.formatPrefix;class lr extends Map{constructor(t,e=pr){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[n,i]of t)this.set(n,i)}get(t){return super.get(hr(this,t))}has(t){return super.has(hr(this,t))}set(t,e){return super.set(ur(this,t),e)}delete(t){return super.delete(dr(this,t))}}function hr({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):n}function ur({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):(t.set(i,n),n)}function dr({_intern:t,_key:e},n){const i=e(n);return t.has(i)&&(n=t.get(i),t.delete(i)),n}function pr(t){return null!==t&&"object"==typeof t?t.valueOf():t}const fr=Symbol("implicit");function gr(){var t=new lr,e=[],n=[],i=fr;function r(r){let a=t.get(r);if(void 0===a){if(i!==fr)return i;t.set(r,a=e.push(r)-1)}return n[a%n.length]}return r.domain=function(n){if(!arguments.length)return e.slice();e=[],t=new lr;for(const i of n)t.has(i)||t.set(i,e.push(i)-1);return r},r.range=function(t){return arguments.length?(n=Array.from(t),r):n.slice()},r.unknown=function(t){return arguments.length?(i=t,r):i},r.copy=function(){return gr(e,n).unknown(i)},Ui.apply(r,arguments),r}const yr=1e3,mr=6e4,br=36e5,_r=864e5,xr=6048e5,vr=2592e6,kr=31536e6,wr=new Date,Cr=new Date;function Tr(t,e,n,i){function r(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return r.floor=e=>(t(e=new Date(+e)),e),r.ceil=n=>(t(n=new Date(n-1)),e(n,1),t(n),n),r.round=t=>{const e=r(t),n=r.ceil(t);return t-e<n-t?e:n},r.offset=(t,n)=>(e(t=new Date(+t),null==n?1:Math.floor(n)),t),r.range=(n,i,a)=>{const s=[];if(n=r.ceil(n),a=null==a?1:Math.floor(a),!(n<i&&a>0))return s;let o;do{s.push(o=new Date(+n)),e(n,a),t(n)}while(o<n&&n<i);return s},r.filter=n=>Tr((e=>{if(e>=e)for(;t(e),!n(e);)e.setTime(e-1)}),((t,i)=>{if(t>=t)if(i<0)for(;++i<=0;)for(;e(t,-1),!n(t););else for(;--i>=0;)for(;e(t,1),!n(t););})),n&&(r.count=(e,i)=>(wr.setTime(+e),Cr.setTime(+i),t(wr),t(Cr),Math.floor(n(wr,Cr))),r.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?r.filter(i?e=>i(e)%t==0:e=>r.count(0,e)%t==0):r:null)),r}const Er=Tr((()=>{}),((t,e)=>{t.setTime(+t+e)}),((t,e)=>e-t));Er.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?Tr((e=>{e.setTime(Math.floor(e/t)*t)}),((e,n)=>{e.setTime(+e+n*t)}),((e,n)=>(n-e)/t)):Er:null);Er.range;const Sr=Tr((t=>{t.setTime(t-t.getMilliseconds())}),((t,e)=>{t.setTime(+t+e*yr)}),((t,e)=>(e-t)/yr),(t=>t.getUTCSeconds())),Ar=(Sr.range,Tr((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*yr)}),((t,e)=>{t.setTime(+t+e*mr)}),((t,e)=>(e-t)/mr),(t=>t.getMinutes()))),Lr=(Ar.range,Tr((t=>{t.setUTCSeconds(0,0)}),((t,e)=>{t.setTime(+t+e*mr)}),((t,e)=>(e-t)/mr),(t=>t.getUTCMinutes()))),Br=(Lr.range,Tr((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*yr-t.getMinutes()*mr)}),((t,e)=>{t.setTime(+t+e*br)}),((t,e)=>(e-t)/br),(t=>t.getHours()))),Nr=(Br.range,Tr((t=>{t.setUTCMinutes(0,0,0)}),((t,e)=>{t.setTime(+t+e*br)}),((t,e)=>(e-t)/br),(t=>t.getUTCHours()))),Dr=(Nr.range,Tr((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*mr)/_r),(t=>t.getDate()-1))),Or=(Dr.range,Tr((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/_r),(t=>t.getUTCDate()-1))),Mr=(Or.range,Tr((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/_r),(t=>Math.floor(t/_r))));Mr.range;function Ir(t){return Tr((e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),((t,e)=>{t.setDate(t.getDate()+7*e)}),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*mr)/xr))}const Fr=Ir(0),$r=Ir(1),Rr=Ir(2),Zr=Ir(3),Pr=Ir(4),jr=Ir(5),Yr=Ir(6);Fr.range,$r.range,Rr.range,Zr.range,Pr.range,jr.range,Yr.range;function zr(t){return Tr((e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+7*e)}),((t,e)=>(e-t)/xr))}const Ur=zr(0),Wr=zr(1),qr=zr(2),Hr=zr(3),Vr=zr(4),Gr=zr(5),Xr=zr(6),Qr=(Ur.range,Wr.range,qr.range,Hr.range,Vr.range,Gr.range,Xr.range,Tr((t=>{t.setDate(1),t.setHours(0,0,0,0)}),((t,e)=>{t.setMonth(t.getMonth()+e)}),((t,e)=>e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())),(t=>t.getMonth()))),Kr=(Qr.range,Tr((t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)}),((t,e)=>e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())),(t=>t.getUTCMonth()))),Jr=(Kr.range,Tr((t=>{t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,e)=>{t.setFullYear(t.getFullYear()+e)}),((t,e)=>e.getFullYear()-t.getFullYear()),(t=>t.getFullYear())));Jr.every=t=>isFinite(t=Math.floor(t))&&t>0?Tr((e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),((e,n)=>{e.setFullYear(e.getFullYear()+n*t)})):null;Jr.range;const ta=Tr((t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)}),((t,e)=>e.getUTCFullYear()-t.getUTCFullYear()),(t=>t.getUTCFullYear()));ta.every=t=>isFinite(t=Math.floor(t))&&t>0?Tr((e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),((e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null;ta.range;function ea(t,e,n,i,r,a){const s=[[Sr,1,yr],[Sr,5,5e3],[Sr,15,15e3],[Sr,30,3e4],[a,1,mr],[a,5,3e5],[a,15,9e5],[a,30,18e5],[r,1,br],[r,3,108e5],[r,6,216e5],[r,12,432e5],[i,1,_r],[i,2,1728e5],[n,1,xr],[e,1,vr],[e,3,7776e6],[t,1,kr]];function o(e,n,i){const r=Math.abs(n-e)/i,a=Ci((([,,t])=>t)).right(s,r);if(a===s.length)return t.every(vi(e/kr,n/kr,i));if(0===a)return Er.every(Math.max(vi(e,n,i),1));const[o,c]=s[r/s[a-1][2]<s[a][2]/r?a-1:a];return o.every(c)}return[function(t,e,n){const i=e<t;i&&([t,e]=[e,t]);const r=n&&"function"==typeof n.range?n:o(t,e,n),a=r?r.range(t,+e+1):[];return i?a.reverse():a},o]}const[na,ia]=ea(ta,Kr,Ur,Mr,Nr,Lr),[ra,aa]=ea(Jr,Qr,Fr,Dr,Br,Ar);function sa(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function oa(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function ca(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}var la,ha,ua={"-":"",_:" ",0:"0"},da=/^\s*\d+/,pa=/^%/,fa=/[\\^$*+?|[\]().{}]/g;function ga(t,e,n){var i=t<0?"-":"",r=(i?-t:t)+"",a=r.length;return i+(a<n?new Array(n-a+1).join(e)+r:r)}function ya(t){return t.replace(fa,"\\$&")}function ma(t){return new RegExp("^(?:"+t.map(ya).join("|")+")","i")}function ba(t){return new Map(t.map(((t,e)=>[t.toLowerCase(),e])))}function _a(t,e,n){var i=da.exec(e.slice(n,n+1));return i?(t.w=+i[0],n+i[0].length):-1}function xa(t,e,n){var i=da.exec(e.slice(n,n+1));return i?(t.u=+i[0],n+i[0].length):-1}function va(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.U=+i[0],n+i[0].length):-1}function ka(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.V=+i[0],n+i[0].length):-1}function wa(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.W=+i[0],n+i[0].length):-1}function Ca(t,e,n){var i=da.exec(e.slice(n,n+4));return i?(t.y=+i[0],n+i[0].length):-1}function Ta(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.y=+i[0]+(+i[0]>68?1900:2e3),n+i[0].length):-1}function Ea(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function Sa(t,e,n){var i=da.exec(e.slice(n,n+1));return i?(t.q=3*i[0]-3,n+i[0].length):-1}function Aa(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function La(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function Ba(t,e,n){var i=da.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function Na(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function Da(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function Oa(t,e,n){var i=da.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function Ma(t,e,n){var i=da.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function Ia(t,e,n){var i=da.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function Fa(t,e,n){var i=pa.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function $a(t,e,n){var i=da.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}function Ra(t,e,n){var i=da.exec(e.slice(n));return i?(t.s=+i[0],n+i[0].length):-1}function Za(t,e){return ga(t.getDate(),e,2)}function Pa(t,e){return ga(t.getHours(),e,2)}function ja(t,e){return ga(t.getHours()%12||12,e,2)}function Ya(t,e){return ga(1+Dr.count(Jr(t),t),e,3)}function za(t,e){return ga(t.getMilliseconds(),e,3)}function Ua(t,e){return za(t,e)+"000"}function Wa(t,e){return ga(t.getMonth()+1,e,2)}function qa(t,e){return ga(t.getMinutes(),e,2)}function Ha(t,e){return ga(t.getSeconds(),e,2)}function Va(t){var e=t.getDay();return 0===e?7:e}function Ga(t,e){return ga(Fr.count(Jr(t)-1,t),e,2)}function Xa(t){var e=t.getDay();return e>=4||0===e?Pr(t):Pr.ceil(t)}function Qa(t,e){return t=Xa(t),ga(Pr.count(Jr(t),t)+(4===Jr(t).getDay()),e,2)}function Ka(t){return t.getDay()}function Ja(t,e){return ga($r.count(Jr(t)-1,t),e,2)}function ts(t,e){return ga(t.getFullYear()%100,e,2)}function es(t,e){return ga((t=Xa(t)).getFullYear()%100,e,2)}function ns(t,e){return ga(t.getFullYear()%1e4,e,4)}function is(t,e){var n=t.getDay();return ga((t=n>=4||0===n?Pr(t):Pr.ceil(t)).getFullYear()%1e4,e,4)}function rs(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+ga(e/60|0,"0",2)+ga(e%60,"0",2)}function as(t,e){return ga(t.getUTCDate(),e,2)}function ss(t,e){return ga(t.getUTCHours(),e,2)}function os(t,e){return ga(t.getUTCHours()%12||12,e,2)}function cs(t,e){return ga(1+Or.count(ta(t),t),e,3)}function ls(t,e){return ga(t.getUTCMilliseconds(),e,3)}function hs(t,e){return ls(t,e)+"000"}function us(t,e){return ga(t.getUTCMonth()+1,e,2)}function ds(t,e){return ga(t.getUTCMinutes(),e,2)}function ps(t,e){return ga(t.getUTCSeconds(),e,2)}function fs(t){var e=t.getUTCDay();return 0===e?7:e}function gs(t,e){return ga(Ur.count(ta(t)-1,t),e,2)}function ys(t){var e=t.getUTCDay();return e>=4||0===e?Vr(t):Vr.ceil(t)}function ms(t,e){return t=ys(t),ga(Vr.count(ta(t),t)+(4===ta(t).getUTCDay()),e,2)}function bs(t){return t.getUTCDay()}function _s(t,e){return ga(Wr.count(ta(t)-1,t),e,2)}function xs(t,e){return ga(t.getUTCFullYear()%100,e,2)}function vs(t,e){return ga((t=ys(t)).getUTCFullYear()%100,e,2)}function ks(t,e){return ga(t.getUTCFullYear()%1e4,e,4)}function ws(t,e){var n=t.getUTCDay();return ga((t=n>=4||0===n?Vr(t):Vr.ceil(t)).getUTCFullYear()%1e4,e,4)}function Cs(){return"+0000"}function Ts(){return"%"}function Es(t){return+t}function Ss(t){return Math.floor(+t/1e3)}function As(t){return new Date(t)}function Ls(t){return t instanceof Date?+t:+new Date(+t)}function Bs(t,e,n,i,r,a,s,o,c,l){var h=zi(),u=h.invert,d=h.domain,p=l(".%L"),f=l(":%S"),g=l("%I:%M"),y=l("%I %p"),m=l("%a %d"),b=l("%b %d"),_=l("%B"),x=l("%Y");function v(t){return(c(t)<t?p:o(t)<t?f:s(t)<t?g:a(t)<t?y:i(t)<t?r(t)<t?m:b:n(t)<t?_:x)(t)}return h.invert=function(t){return new Date(u(t))},h.domain=function(t){return arguments.length?d(Array.from(t,Ls)):d().map(As)},h.ticks=function(e){var n=d();return t(n[0],n[n.length-1],null==e?10:e)},h.tickFormat=function(t,e){return null==e?v:l(e)},h.nice=function(t){var n=d();return t&&"function"==typeof t.range||(t=e(n[0],n[n.length-1],null==t?10:t)),t?d(function(t,e){var n,i=0,r=(t=t.slice()).length-1,a=t[i],s=t[r];return s<a&&(n=i,i=r,r=n,n=a,a=s,s=n),t[i]=e.floor(a),t[r]=e.ceil(s),t}(n,t)):h},h.copy=function(){return ji(h,Bs(t,e,n,i,r,a,s,o,c,l))},h}function Ns(){return Ui.apply(Bs(ra,aa,Jr,Qr,Fr,Dr,Br,Ar,Sr,ha).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}function Ds(t){return"string"==typeof t?new Lt([[document.querySelector(t)]],[document.documentElement]):new Lt([[t]],At)}function Os(t){return"string"==typeof t?new Lt([document.querySelectorAll(t)],[document.documentElement]):new Lt([v(t)],At)}function Ms(t){return function(){return t}}!function(t){la=function(t){var e=t.dateTime,n=t.date,i=t.time,r=t.periods,a=t.days,s=t.shortDays,o=t.months,c=t.shortMonths,l=ma(r),h=ba(r),u=ma(a),d=ba(a),p=ma(s),f=ba(s),g=ma(o),y=ba(o),m=ma(c),b=ba(c),_={a:function(t){return s[t.getDay()]},A:function(t){return a[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return o[t.getMonth()]},c:null,d:Za,e:Za,f:Ua,g:es,G:is,H:Pa,I:ja,j:Ya,L:za,m:Wa,M:qa,p:function(t){return r[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:Es,s:Ss,S:Ha,u:Va,U:Ga,V:Qa,w:Ka,W:Ja,x:null,X:null,y:ts,Y:ns,Z:rs,"%":Ts},x={a:function(t){return s[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return o[t.getUTCMonth()]},c:null,d:as,e:as,f:hs,g:vs,G:ws,H:ss,I:os,j:cs,L:ls,m:us,M:ds,p:function(t){return r[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:Es,s:Ss,S:ps,u:fs,U:gs,V:ms,w:bs,W:_s,x:null,X:null,y:xs,Y:ks,Z:Cs,"%":Ts},v={a:function(t,e,n){var i=p.exec(e.slice(n));return i?(t.w=f.get(i[0].toLowerCase()),n+i[0].length):-1},A:function(t,e,n){var i=u.exec(e.slice(n));return i?(t.w=d.get(i[0].toLowerCase()),n+i[0].length):-1},b:function(t,e,n){var i=m.exec(e.slice(n));return i?(t.m=b.get(i[0].toLowerCase()),n+i[0].length):-1},B:function(t,e,n){var i=g.exec(e.slice(n));return i?(t.m=y.get(i[0].toLowerCase()),n+i[0].length):-1},c:function(t,n,i){return C(t,e,n,i)},d:La,e:La,f:Ia,g:Ta,G:Ca,H:Na,I:Na,j:Ba,L:Ma,m:Aa,M:Da,p:function(t,e,n){var i=l.exec(e.slice(n));return i?(t.p=h.get(i[0].toLowerCase()),n+i[0].length):-1},q:Sa,Q:$a,s:Ra,S:Oa,u:xa,U:va,V:ka,w:_a,W:wa,x:function(t,e,i){return C(t,n,e,i)},X:function(t,e,n){return C(t,i,e,n)},y:Ta,Y:Ca,Z:Ea,"%":Fa};function k(t,e){return function(n){var i,r,a,s=[],o=-1,c=0,l=t.length;for(n instanceof Date||(n=new Date(+n));++o<l;)37===t.charCodeAt(o)&&(s.push(t.slice(c,o)),null!=(r=ua[i=t.charAt(++o)])?i=t.charAt(++o):r="e"===i?" ":"0",(a=e[i])&&(i=a(n,r)),s.push(i),c=o+1);return s.push(t.slice(c,o)),s.join("")}}function w(t,e){return function(n){var i,r,a=ca(1900,void 0,1);if(C(a,t,n+="",0)!=n.length)return null;if("Q"in a)return new Date(a.Q);if("s"in a)return new Date(1e3*a.s+("L"in a?a.L:0));if(e&&!("Z"in a)&&(a.Z=0),"p"in a&&(a.H=a.H%12+12*a.p),void 0===a.m&&(a.m="q"in a?a.q:0),"V"in a){if(a.V<1||a.V>53)return null;"w"in a||(a.w=1),"Z"in a?(r=(i=oa(ca(a.y,0,1))).getUTCDay(),i=r>4||0===r?Wr.ceil(i):Wr(i),i=Or.offset(i,7*(a.V-1)),a.y=i.getUTCFullYear(),a.m=i.getUTCMonth(),a.d=i.getUTCDate()+(a.w+6)%7):(r=(i=sa(ca(a.y,0,1))).getDay(),i=r>4||0===r?$r.ceil(i):$r(i),i=Dr.offset(i,7*(a.V-1)),a.y=i.getFullYear(),a.m=i.getMonth(),a.d=i.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),r="Z"in a?oa(ca(a.y,0,1)).getUTCDay():sa(ca(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(r+5)%7:a.w+7*a.U-(r+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,oa(a)):sa(a)}}function C(t,e,n,i){for(var r,a,s=0,o=e.length,c=n.length;s<o;){if(i>=c)return-1;if(37===(r=e.charCodeAt(s++))){if(r=e.charAt(s++),!(a=v[r in ua?e.charAt(s++):r])||(i=a(t,n,i))<0)return-1}else if(r!=n.charCodeAt(i++))return-1}return i}return _.x=k(n,_),_.X=k(i,_),_.c=k(e,_),x.x=k(n,x),x.X=k(i,x),x.c=k(e,x),{format:function(t){var e=k(t+="",_);return e.toString=function(){return t},e},parse:function(t){var e=w(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=k(t+="",x);return e.toString=function(){return t},e},utcParse:function(t){var e=w(t+="",!0);return e.toString=function(){return t},e}}}(t),ha=la.format,la.parse,la.utcFormat,la.utcParse}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});const Is=Math.abs,Fs=Math.atan2,$s=Math.cos,Rs=Math.max,Zs=Math.min,Ps=Math.sin,js=Math.sqrt,Ys=1e-12,zs=Math.PI,Us=zs/2,Ws=2*zs;function qs(t){return t>=1?Us:t<=-1?-Us:Math.asin(t)}const Hs=Math.PI,Vs=2*Hs,Gs=1e-6,Xs=Vs-Gs;function Qs(t){this._+=t[0];for(let e=1,n=t.length;e<n;++e)this._+=arguments[e]+t[e]}class Ks{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==t?Qs:function(t){let e=Math.floor(t);if(!(e>=0))throw new Error(`invalid digits: ${t}`);if(e>15)return Qs;const n=10**e;return function(t){this._+=t[0];for(let e=1,i=t.length;e<i;++e)this._+=Math.round(arguments[e]*n)/n+t[e]}}(t)}moveTo(t,e){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,e){this._append`L${this._x1=+t},${this._y1=+e}`}quadraticCurveTo(t,e,n,i){this._append`Q${+t},${+e},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(t,e,n,i,r,a){this._append`C${+t},${+e},${+n},${+i},${this._x1=+r},${this._y1=+a}`}arcTo(t,e,n,i,r){if(t=+t,e=+e,n=+n,i=+i,(r=+r)<0)throw new Error(`negative radius: ${r}`);let a=this._x1,s=this._y1,o=n-t,c=i-e,l=a-t,h=s-e,u=l*l+h*h;if(null===this._x1)this._append`M${this._x1=t},${this._y1=e}`;else if(u>Gs)if(Math.abs(h*o-c*l)>Gs&&r){let d=n-a,p=i-s,f=o*o+c*c,g=d*d+p*p,y=Math.sqrt(f),m=Math.sqrt(u),b=r*Math.tan((Hs-Math.acos((f+u-g)/(2*y*m)))/2),_=b/m,x=b/y;Math.abs(_-1)>Gs&&this._append`L${t+_*l},${e+_*h}`,this._append`A${r},${r},0,0,${+(h*d>l*p)},${this._x1=t+x*o},${this._y1=e+x*c}`}else this._append`L${this._x1=t},${this._y1=e}`;else;}arc(t,e,n,i,r,a){if(t=+t,e=+e,a=!!a,(n=+n)<0)throw new Error(`negative radius: ${n}`);let s=n*Math.cos(i),o=n*Math.sin(i),c=t+s,l=e+o,h=1^a,u=a?i-r:r-i;null===this._x1?this._append`M${c},${l}`:(Math.abs(this._x1-c)>Gs||Math.abs(this._y1-l)>Gs)&&this._append`L${c},${l}`,n&&(u<0&&(u=u%Vs+Vs),u>Xs?this._append`A${n},${n},0,1,${h},${t-s},${e-o}A${n},${n},0,1,${h},${this._x1=c},${this._y1=l}`:u>Gs&&this._append`A${n},${n},0,${+(u>=Hs)},${h},${this._x1=t+n*Math.cos(r)},${this._y1=e+n*Math.sin(r)}`)}rect(t,e,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function Js(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(null==n)e=null;else{const t=Math.floor(n);if(!(t>=0))throw new RangeError(`invalid digits: ${n}`);e=t}return t},()=>new Ks(e)}function to(t){return t.innerRadius}function eo(t){return t.outerRadius}function no(t){return t.startAngle}function io(t){return t.endAngle}function ro(t){return t&&t.padAngle}function ao(t,e,n,i,r,a,s){var o=t-n,c=e-i,l=(s?a:-a)/js(o*o+c*c),h=l*c,u=-l*o,d=t+h,p=e+u,f=n+h,g=i+u,y=(d+f)/2,m=(p+g)/2,b=f-d,_=g-p,x=b*b+_*_,v=r-a,k=d*g-f*p,w=(_<0?-1:1)*js(Rs(0,v*v*x-k*k)),C=(k*_-b*w)/x,T=(-k*b-_*w)/x,E=(k*_+b*w)/x,S=(-k*b+_*w)/x,A=C-y,L=T-m,B=E-y,N=S-m;return A*A+L*L>B*B+N*N&&(C=E,T=S),{cx:C,cy:T,x01:-h,y01:-u,x11:C*(r/v-1),y11:T*(r/v-1)}}function so(){var t=to,e=eo,n=Ms(0),i=null,r=no,a=io,s=ro,o=null,c=Js(l);function l(){var l,h,u,d=+t.apply(this,arguments),p=+e.apply(this,arguments),f=r.apply(this,arguments)-Us,g=a.apply(this,arguments)-Us,y=Is(g-f),m=g>f;if(o||(o=l=c()),p<d&&(h=p,p=d,d=h),p>Ys)if(y>Ws-Ys)o.moveTo(p*$s(f),p*Ps(f)),o.arc(0,0,p,f,g,!m),d>Ys&&(o.moveTo(d*$s(g),d*Ps(g)),o.arc(0,0,d,g,f,m));else{var b,_,x=f,v=g,k=f,w=g,C=y,T=y,E=s.apply(this,arguments)/2,S=E>Ys&&(i?+i.apply(this,arguments):js(d*d+p*p)),A=Zs(Is(p-d)/2,+n.apply(this,arguments)),L=A,B=A;if(S>Ys){var N=qs(S/d*Ps(E)),D=qs(S/p*Ps(E));(C-=2*N)>Ys?(k+=N*=m?1:-1,w-=N):(C=0,k=w=(f+g)/2),(T-=2*D)>Ys?(x+=D*=m?1:-1,v-=D):(T=0,x=v=(f+g)/2)}var O=p*$s(x),M=p*Ps(x),I=d*$s(w),F=d*Ps(w);if(A>Ys){var $,R=p*$s(v),Z=p*Ps(v),P=d*$s(k),j=d*Ps(k);if(y<zs)if($=function(t,e,n,i,r,a,s,o){var c=n-t,l=i-e,h=s-r,u=o-a,d=u*c-h*l;if(!(d*d<Ys))return[t+(d=(h*(e-a)-u*(t-r))/d)*c,e+d*l]}(O,M,P,j,R,Z,I,F)){var Y=O-$[0],z=M-$[1],U=R-$[0],W=Z-$[1],q=1/Ps(((u=(Y*U+z*W)/(js(Y*Y+z*z)*js(U*U+W*W)))>1?0:u<-1?zs:Math.acos(u))/2),H=js($[0]*$[0]+$[1]*$[1]);L=Zs(A,(d-H)/(q-1)),B=Zs(A,(p-H)/(q+1))}else L=B=0}T>Ys?B>Ys?(b=ao(P,j,O,M,p,B,m),_=ao(R,Z,I,F,p,B,m),o.moveTo(b.cx+b.x01,b.cy+b.y01),B<A?o.arc(b.cx,b.cy,B,Fs(b.y01,b.x01),Fs(_.y01,_.x01),!m):(o.arc(b.cx,b.cy,B,Fs(b.y01,b.x01),Fs(b.y11,b.x11),!m),o.arc(0,0,p,Fs(b.cy+b.y11,b.cx+b.x11),Fs(_.cy+_.y11,_.cx+_.x11),!m),o.arc(_.cx,_.cy,B,Fs(_.y11,_.x11),Fs(_.y01,_.x01),!m))):(o.moveTo(O,M),o.arc(0,0,p,x,v,!m)):o.moveTo(O,M),d>Ys&&C>Ys?L>Ys?(b=ao(I,F,R,Z,d,-L,m),_=ao(O,M,P,j,d,-L,m),o.lineTo(b.cx+b.x01,b.cy+b.y01),L<A?o.arc(b.cx,b.cy,L,Fs(b.y01,b.x01),Fs(_.y01,_.x01),!m):(o.arc(b.cx,b.cy,L,Fs(b.y01,b.x01),Fs(b.y11,b.x11),!m),o.arc(0,0,d,Fs(b.cy+b.y11,b.cx+b.x11),Fs(_.cy+_.y11,_.cx+_.x11),m),o.arc(_.cx,_.cy,L,Fs(_.y11,_.x11),Fs(_.y01,_.x01),!m))):o.arc(0,0,d,w,k,m):o.lineTo(I,F)}else o.moveTo(0,0);if(o.closePath(),l)return o=null,l+""||null}return l.centroid=function(){var n=(+t.apply(this,arguments)+ +e.apply(this,arguments))/2,i=(+r.apply(this,arguments)+ +a.apply(this,arguments))/2-zs/2;return[$s(i)*n,Ps(i)*n]},l.innerRadius=function(e){return arguments.length?(t="function"==typeof e?e:Ms(+e),l):t},l.outerRadius=function(t){return arguments.length?(e="function"==typeof t?t:Ms(+t),l):e},l.cornerRadius=function(t){return arguments.length?(n="function"==typeof t?t:Ms(+t),l):n},l.padRadius=function(t){return arguments.length?(i=null==t?null:"function"==typeof t?t:Ms(+t),l):i},l.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Ms(+t),l):r},l.endAngle=function(t){return arguments.length?(a="function"==typeof t?t:Ms(+t),l):a},l.padAngle=function(t){return arguments.length?(s="function"==typeof t?t:Ms(+t),l):s},l.context=function(t){return arguments.length?(o=null==t?null:t,l):o},l}Ks.prototype;Array.prototype.slice;function oo(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function co(t){this._context=t}function lo(t){return new co(t)}function ho(t){return t[0]}function uo(t){return t[1]}function po(t,e){var n=Ms(!0),i=null,r=lo,a=null,s=Js(o);function o(o){var c,l,h,u=(o=oo(o)).length,d=!1;for(null==i&&(a=r(h=s())),c=0;c<=u;++c)!(c<u&&n(l=o[c],c,o))===d&&((d=!d)?a.lineStart():a.lineEnd()),d&&a.point(+t(l,c,o),+e(l,c,o));if(h)return a=null,h+""||null}return t="function"==typeof t?t:void 0===t?ho:Ms(t),e="function"==typeof e?e:void 0===e?uo:Ms(e),o.x=function(e){return arguments.length?(t="function"==typeof e?e:Ms(+e),o):t},o.y=function(t){return arguments.length?(e="function"==typeof t?t:Ms(+t),o):e},o.defined=function(t){return arguments.length?(n="function"==typeof t?t:Ms(!!t),o):n},o.curve=function(t){return arguments.length?(r=t,null!=i&&(a=r(i)),o):r},o.context=function(t){return arguments.length?(null==t?i=a=null:a=r(i=t),o):i},o}function fo(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function go(t){return t}function yo(){var t=go,e=fo,n=null,i=Ms(0),r=Ms(Ws),a=Ms(0);function s(s){var o,c,l,h,u,d=(s=oo(s)).length,p=0,f=new Array(d),g=new Array(d),y=+i.apply(this,arguments),m=Math.min(Ws,Math.max(-Ws,r.apply(this,arguments)-y)),b=Math.min(Math.abs(m)/d,a.apply(this,arguments)),_=b*(m<0?-1:1);for(o=0;o<d;++o)(u=g[f[o]=o]=+t(s[o],o,s))>0&&(p+=u);for(null!=e?f.sort((function(t,n){return e(g[t],g[n])})):null!=n&&f.sort((function(t,e){return n(s[t],s[e])})),o=0,l=p?(m-d*_)/p:0;o<d;++o,y=h)c=f[o],h=y+((u=g[c])>0?u*l:0)+_,g[c]={data:s[c],index:o,value:u,startAngle:y,endAngle:h,padAngle:b};return g}return s.value=function(e){return arguments.length?(t="function"==typeof e?e:Ms(+e),s):t},s.sortValues=function(t){return arguments.length?(e=t,n=null,s):e},s.sort=function(t){return arguments.length?(n=t,e=null,s):n},s.startAngle=function(t){return arguments.length?(i="function"==typeof t?t:Ms(+t),s):i},s.endAngle=function(t){return arguments.length?(r="function"==typeof t?t:Ms(+t),s):r},s.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:Ms(+t),s):a},s}function mo(){}function bo(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function _o(t){this._context=t}function xo(t){return new _o(t)}function vo(t){this._context=t}function ko(t){return new vo(t)}function wo(t){this._context=t}function Co(t){return new wo(t)}co.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}},_o.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:bo(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:bo(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},vo.prototype={areaStart:mo,areaEnd:mo,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:bo(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},wo.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,i=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,i):this._context.moveTo(n,i);break;case 3:this._point=4;default:bo(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};class To{constructor(t,e){this._context=t,this._x=e}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,e,t,e):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+e)/2,t,this._y0,t,e)}this._x0=t,this._y0=e}}function Eo(t){return new To(t,!0)}function So(t){return new To(t,!1)}function Ao(t,e){this._basis=new _o(t),this._beta=e}Ao.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var i,r=t[0],a=e[0],s=t[n]-r,o=e[n]-a,c=-1;++c<=n;)i=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(r+i*s),this._beta*e[c]+(1-this._beta)*(a+i*o));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};const Lo=function t(e){function n(t){return 1===e?new _o(t):new Ao(t,e)}return n.beta=function(e){return t(+e)},n}(.85);function Bo(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function No(t,e){this._context=t,this._k=(1-e)/6}No.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Bo(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Bo(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Do=function t(e){function n(t){return new No(t,e)}return n.tension=function(e){return t(+e)},n}(0);function Oo(t,e){this._context=t,this._k=(1-e)/6}Oo.prototype={areaStart:mo,areaEnd:mo,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Bo(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Mo=function t(e){function n(t){return new Oo(t,e)}return n.tension=function(e){return t(+e)},n}(0);function Io(t,e){this._context=t,this._k=(1-e)/6}Io.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Bo(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Fo=function t(e){function n(t){return new Io(t,e)}return n.tension=function(e){return t(+e)},n}(0);function $o(t,e,n){var i=t._x1,r=t._y1,a=t._x2,s=t._y2;if(t._l01_a>Ys){var o=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*o-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,r=(r*o-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>Ys){var l=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,h=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*l+t._x1*t._l23_2a-e*t._l12_2a)/h,s=(s*l+t._y1*t._l23_2a-n*t._l12_2a)/h}t._context.bezierCurveTo(i,r,a,s,t._x2,t._y2)}function Ro(t,e){this._context=t,this._alpha=e}Ro.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:$o(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Zo=function t(e){function n(t){return e?new Ro(t,e):new No(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Po(t,e){this._context=t,this._alpha=e}Po.prototype={areaStart:mo,areaEnd:mo,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:$o(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const jo=function t(e){function n(t){return e?new Po(t,e):new Oo(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Yo(t,e){this._context=t,this._alpha=e}Yo.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:$o(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const zo=function t(e){function n(t){return e?new Yo(t,e):new Io(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function Uo(t){this._context=t}function Wo(t){return new Uo(t)}function qo(t){return t<0?-1:1}function Ho(t,e,n){var i=t._x1-t._x0,r=e-t._x1,a=(t._y1-t._y0)/(i||r<0&&-0),s=(n-t._y1)/(r||i<0&&-0),o=(a*r+s*i)/(i+r);return(qo(a)+qo(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(o))||0}function Vo(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function Go(t,e,n){var i=t._x0,r=t._y0,a=t._x1,s=t._y1,o=(a-i)/3;t._context.bezierCurveTo(i+o,r+o*e,a-o,s-o*n,a,s)}function Xo(t){this._context=t}function Qo(t){this._context=new Ko(t)}function Ko(t){this._context=t}function Jo(t){return new Xo(t)}function tc(t){return new Qo(t)}function ec(t){this._context=t}function nc(t){var e,n,i=t.length-1,r=new Array(i),a=new Array(i),s=new Array(i);for(r[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e<i-1;++e)r[e]=1,a[e]=4,s[e]=4*t[e]+2*t[e+1];for(r[i-1]=2,a[i-1]=7,s[i-1]=8*t[i-1]+t[i],e=1;e<i;++e)n=r[e]/a[e-1],a[e]-=n,s[e]-=n*s[e-1];for(r[i-1]=s[i-1]/a[i-1],e=i-2;e>=0;--e)r[e]=(s[e]-r[e+1])/a[e];for(a[i-1]=(t[i]+r[i-1])/2,e=0;e<i-1;++e)a[e]=2*t[e+1]-r[e+1];return[r,a]}function ic(t){return new ec(t)}function rc(t,e){this._context=t,this._t=e}function ac(t){return new rc(t,.5)}function sc(t){return new rc(t,0)}function oc(t){return new rc(t,1)}function cc(t,e,n){this.k=t,this.x=e,this.y=n}Uo.prototype={areaStart:mo,areaEnd:mo,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}},Xo.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Go(this,this._t0,Vo(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(e=+e,(t=+t)!==this._x1||e!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,Go(this,Vo(this,n=Ho(this,t,e)),n);break;default:Go(this,this._t0,n=Ho(this,t,e))}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}},(Qo.prototype=Object.create(Xo.prototype)).point=function(t,e){Xo.prototype.point.call(this,e,t)},Ko.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,i,r,a){this._context.bezierCurveTo(e,t,i,n,a,r)}},ec.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),2===n)this._context.lineTo(t[1],e[1]);else for(var i=nc(t),r=nc(e),a=0,s=1;s<n;++a,++s)this._context.bezierCurveTo(i[0][a],r[0][a],i[1][a],r[1][a],t[s],e[s]);(this._line||0!==this._line&&1===n)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(t,e){this._x.push(+t),this._y.push(+e)}},rc.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&2===this._point&&this._context.lineTo(this._x,this._y),(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}},cc.prototype={constructor:cc,scale:function(t){return 1===t?this:new cc(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new cc(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};new cc(1,0,0);cc.prototype},3352:(t,e,n)=>{"use strict";function i(t,e,n,i){var a,s,o,c,l,h,u,d,p,f,g,y,m;if(a=e.y-t.y,o=t.x-e.x,l=e.x*t.y-t.x*e.y,p=a*n.x+o*n.y+l,f=a*i.x+o*i.y+l,!(0!==p&&0!==f&&r(p,f)||(s=i.y-n.y,c=n.x-i.x,h=i.x*n.y-n.x*i.y,u=s*t.x+c*t.y+h,d=s*e.x+c*e.y+h,0!==u&&0!==d&&r(u,d)||0==(g=a*c-s*o))))return y=Math.abs(g/2),{x:(m=o*h-c*l)<0?(m-y)/g:(m+y)/g,y:(m=s*l-a*h)<0?(m-y)/g:(m+y)/g}}function r(t,e){return t*e>0}function a(t,e,n){var r=t.x,a=t.y,s=[],o=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY;e.forEach((function(t){o=Math.min(o,t.x),c=Math.min(c,t.y)}));for(var l=r-t.width/2-o,h=a-t.height/2-c,u=0;u<e.length;u++){var d=e[u],p=e[u<e.length-1?u+1:0],f=i(t,n,{x:l+d.x,y:h+d.y},{x:l+p.x,y:h+p.y});f&&s.push(f)}return s.length?(s.length>1&&s.sort((function(t,e){var i=t.x-n.x,r=t.y-n.y,a=Math.sqrt(i*i+r*r),s=e.x-n.x,o=e.y-n.y,c=Math.sqrt(s*s+o*o);return a<c?-1:a===c?0:1})),s[0]):(console.log("NO INTERSECTION FOUND, RETURN NODE CENTER",t),t)}n.d(e,{A:()=>a})},2930:(t,e,n)=>{"use strict";function i(t,e){var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=0===o?0:l*s/o,i=l):(s<0&&(c=-c),n=c,i=0===s?0:c*o/s),{x:r+n,y:a+i}}n.d(e,{q:()=>i})},3349:(t,e,n)=>{"use strict";n.d(e,{a:()=>r});var i=n(6225);function r(t,e){var n=t.append("foreignObject").attr("width","100000"),r=n.append("xhtml:div");r.attr("xmlns","http://www.w3.org/1999/xhtml");var a=e.label;switch(typeof a){case"function":r.insert(a);break;case"object":r.insert((function(){return a}));break;default:r.html(a)}i.bg(r,e.labelStyle),r.style("display","inline-block"),r.style("white-space","nowrap");var s=r.node().getBoundingClientRect();return n.attr("width",s.width).attr("height",s.height),n}},6225:(t,e,n)=>{"use strict";n.d(e,{$p:()=>h,O1:()=>s,WR:()=>u,bF:()=>a,bg:()=>l});var i=n(7514),r=n(3234);function a(t,e){return!!t.children(e).length}function s(t){return c(t.v)+":"+c(t.w)+":"+c(t.name)}var o=/:/g;function c(t){return t?String(t).replace(o,"\\:"):""}function l(t,e){e&&t.attr("style",e)}function h(t,e,n){e&&t.attr("class",e).attr("class",n+" "+t.attr("class"))}function u(t,e){var n=e.graph();if(i.Z(n)){var a=n.transition;if(r.Z(a))return a(t)}return t}},277:(t,e,n)=>{"use strict";n.d(e,{bK:()=>Ge});var i=n(870),r=n(6749),a=n(5123),s=n(2002),o=n(7961),c=n(3836),l=n(4379),h=n(5625);class u{constructor(){var t={};t._next=t._prev=t,this._sentinel=t}dequeue(){var t=this._sentinel,e=t._prev;if(e!==t)return d(e),e}enqueue(t){var e=this._sentinel;t._prev&&t._next&&d(t),t._next=e._next,e._next._prev=t,e._next=t,t._prev=e}toString(){for(var t=[],e=this._sentinel,n=e._prev;n!==e;)t.push(JSON.stringify(n,p)),n=n._prev;return"["+t.join(", ")+"]"}}function d(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function p(t,e){if("_next"!==t&&"_prev"!==t)return e}var f=s.Z(1);function g(t,e){if(t.nodeCount()<=1)return[];var n=function(t,e){var n=new h.k,r=0,a=0;i.Z(t.nodes(),(function(t){n.setNode(t,{v:t,in:0,out:0})})),i.Z(t.edges(),(function(t){var i=n.edge(t.v,t.w)||0,s=e(t),o=i+s;n.setEdge(t.v,t.w,o),a=Math.max(a,n.node(t.v).out+=s),r=Math.max(r,n.node(t.w).in+=s)}));var s=l.Z(a+r+3).map((function(){return new u})),o=r+1;return i.Z(n.nodes(),(function(t){m(s,o,n.node(t))})),{graph:n,buckets:s,zeroIdx:o}}(t,e||f),r=function(t,e,n){var i,r=[],a=e[e.length-1],s=e[0];for(;t.nodeCount();){for(;i=s.dequeue();)y(t,e,n,i);for(;i=a.dequeue();)y(t,e,n,i);if(t.nodeCount())for(var o=e.length-2;o>0;--o)if(i=e[o].dequeue()){r=r.concat(y(t,e,n,i,!0));break}}return r}(n.graph,n.buckets,n.zeroIdx);return o.Z(c.Z(r,(function(e){return t.outEdges(e.v,e.w)})))}function y(t,e,n,r,a){var s=a?[]:void 0;return i.Z(t.inEdges(r.v),(function(i){var r=t.edge(i),o=t.node(i.v);a&&s.push({v:i.v,w:i.w}),o.out-=r,m(e,n,o)})),i.Z(t.outEdges(r.v),(function(i){var r=t.edge(i),a=i.w,s=t.node(a);s.in-=r,m(e,n,s)})),t.removeNode(r.v),s}function m(t,e,n){n.out?n.in?t[n.out-n.in+e].enqueue(n):t[t.length-1].enqueue(n):t[0].enqueue(n)}function b(t){var e="greedy"===t.graph().acyclicer?g(t,function(t){return function(e){return t.edge(e).weight}}(t)):function(t){var e=[],n={},r={};function s(o){a.Z(r,o)||(r[o]=!0,n[o]=!0,i.Z(t.outEdges(o),(function(t){a.Z(n,t.w)?e.push(t):s(t.w)})),delete n[o])}return i.Z(t.nodes(),s),e}(t);i.Z(e,(function(e){var n=t.edge(e);t.removeEdge(e),n.forwardName=e.name,n.reversed=!0,t.setEdge(e.w,e.v,n,r.Z("rev"))}))}var _=n(1667),x=n(4752),v=n(9651);const k=function(t,e,n){(void 0!==n&&!(0,v.Z)(t[e],n)||void 0===n&&!(e in t))&&(0,x.Z)(t,e,n)};var w=n(1395),C=n(1050),T=n(2701),E=n(7215),S=n(3658),A=n(9169),L=n(7771),B=n(836),N=n(7008),D=n(3234),O=n(7226),M=n(7514),I=n(8843);const F=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]};var $=n(1899),R=n(2957);const Z=function(t){return(0,$.Z)(t,(0,R.Z)(t))};const P=function(t,e,n,i,r,a,s){var o=F(t,n),c=F(e,n),l=s.get(c);if(l)k(t,n,l);else{var h=a?a(o,c,n+"",t,e,s):void 0,u=void 0===h;if(u){var d=(0,L.Z)(c),p=!d&&(0,N.Z)(c),f=!d&&!p&&(0,I.Z)(c);h=c,d||p||f?(0,L.Z)(o)?h=o:(0,B.Z)(o)?h=(0,E.Z)(o):p?(u=!1,h=(0,C.Z)(c,!0)):f?(u=!1,h=(0,T.Z)(c,!0)):h=[]:(0,M.Z)(c)||(0,A.Z)(c)?(h=o,(0,A.Z)(o)?h=Z(o):(0,O.Z)(o)&&!(0,D.Z)(o)||(h=(0,S.Z)(c))):u=!1}u&&(s.set(c,h),r(h,c,i,a,s),s.delete(c)),k(t,n,h)}};const j=function t(e,n,i,r,a){e!==n&&(0,w.Z)(n,(function(s,o){if(a||(a=new _.Z),(0,O.Z)(s))P(e,n,o,i,t,r,a);else{var c=r?r(F(e,o),s,o+"",e,n,a):void 0;void 0===c&&(c=s),k(e,o,c)}}),R.Z)};var Y=n(9581),z=n(439);const U=function(t){return(0,Y.Z)((function(e,n){var i=-1,r=n.length,a=r>1?n[r-1]:void 0,s=r>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(r--,a):void 0,s&&(0,z.Z)(n[0],n[1],s)&&(a=r<3?void 0:a,r=1),e=Object(e);++i<r;){var o=n[i];o&&t(e,o,i,a)}return e}))}((function(t,e,n){j(t,e,n)}));var W=n(1666),q=n(3688),H=n(2714);const V=function(t,e,n){for(var i=-1,r=t.length;++i<r;){var a=t[i],s=e(a);if(null!=s&&(void 0===o?s==s&&!(0,H.Z)(s):n(s,o)))var o=s,c=a}return c};const G=function(t,e){return t>e};var X=n(9203);const Q=function(t){return t&&t.length?V(t,X.Z,G):void 0};const K=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0};var J=n(2693),tt=n(4765);const et=function(t,e){var n={};return e=(0,tt.Z)(e,3),(0,J.Z)(t,(function(t,i,r){(0,x.Z)(n,i,e(t,i,r))})),n};var nt=n(9360);const it=function(t,e){return t<e};const rt=function(t){return t&&t.length?V(t,X.Z,it):void 0};var at=n(6092);const st=function(){return at.Z.Date.now()};function ot(t,e,n,i){var a;do{a=r.Z(i)}while(t.hasNode(a));return n.dummy=e,t.setNode(a,n),a}function ct(t){var e=new h.k({multigraph:t.isMultigraph()}).setGraph(t.graph());return i.Z(t.nodes(),(function(n){t.children(n).length||e.setNode(n,t.node(n))})),i.Z(t.edges(),(function(n){e.setEdge(n,t.edge(n))})),e}function lt(t,e){var n,i,r=t.x,a=t.y,s=e.x-r,o=e.y-a,c=t.width/2,l=t.height/2;if(!s&&!o)throw new Error("Not possible to find intersection inside of the rectangle");return Math.abs(o)*c>Math.abs(s)*l?(o<0&&(l=-l),n=l*s/o,i=l):(s<0&&(c=-c),n=c,i=c*o/s),{x:r+n,y:a+i}}function ht(t){var e=c.Z(l.Z(dt(t)+1),(function(){return[]}));return i.Z(t.nodes(),(function(n){var i=t.node(n),r=i.rank;nt.Z(r)||(e[r][i.order]=n)})),e}function ut(t,e,n,i){var r={width:0,height:0};return arguments.length>=4&&(r.rank=n,r.order=i),ot(t,"border",r,e)}function dt(t){return Q(c.Z(t.nodes(),(function(e){var n=t.node(e).rank;if(!nt.Z(n))return n})))}function pt(t,e){var n=st();try{return e()}finally{console.log(t+" time: "+(st()-n)+"ms")}}function ft(t,e){return e()}function gt(t,e,n,i,r,a){var s={width:0,height:0,rank:a,borderType:e},o=r[e][a-1],c=ot(t,"border",s,n);r[e][a]=c,t.setParent(c,i),o&&t.setEdge(o,c,{weight:1})}function yt(t){var e=t.graph().rankdir.toLowerCase();"bt"!==e&&"rl"!==e||function(t){i.Z(t.nodes(),(function(e){_t(t.node(e))})),i.Z(t.edges(),(function(e){var n=t.edge(e);i.Z(n.points,_t),a.Z(n,"y")&&_t(n)}))}(t),"lr"!==e&&"rl"!==e||(!function(t){i.Z(t.nodes(),(function(e){xt(t.node(e))})),i.Z(t.edges(),(function(e){var n=t.edge(e);i.Z(n.points,xt),a.Z(n,"x")&&xt(n)}))}(t),mt(t))}function mt(t){i.Z(t.nodes(),(function(e){bt(t.node(e))})),i.Z(t.edges(),(function(e){bt(t.edge(e))}))}function bt(t){var e=t.width;t.width=t.height,t.height=e}function _t(t){t.y=-t.y}function xt(t){var e=t.x;t.x=t.y,t.y=e}function vt(t){t.graph().dummyChains=[],i.Z(t.edges(),(function(e){!function(t,e){var n,i,r,a=e.v,s=t.node(a).rank,o=e.w,c=t.node(o).rank,l=e.name,h=t.edge(e),u=h.labelRank;if(c===s+1)return;for(t.removeEdge(e),r=0,++s;s<c;++r,++s)h.points=[],n=ot(t,"edge",i={width:0,height:0,edgeLabel:h,edgeObj:e,rank:s},"_d"),s===u&&(i.width=h.width,i.height=h.height,i.dummy="edge-label",i.labelpos=h.labelpos),t.setEdge(a,n,{weight:h.weight},l),0===r&&t.graph().dummyChains.push(n),a=n;t.setEdge(a,o,{weight:h.weight},l)}(t,e)}))}const kt=function(t,e){return t&&t.length?V(t,(0,tt.Z)(e,2),it):void 0};function wt(t){var e={};i.Z(t.sources(),(function n(i){var r=t.node(i);if(a.Z(e,i))return r.rank;e[i]=!0;var s=rt(c.Z(t.outEdges(i),(function(e){return n(e.w)-t.edge(e).minlen})));return s!==Number.POSITIVE_INFINITY&&null!=s||(s=0),r.rank=s}))}function Ct(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}function Tt(t){var e,n,i=new h.k({directed:!1}),r=t.nodes()[0],a=t.nodeCount();for(i.setNode(r,{});Et(i,t)<a;)e=St(i,t),n=i.hasNode(e.v)?Ct(t,e):-Ct(t,e),At(i,t,n);return i}function Et(t,e){return i.Z(t.nodes(),(function n(r){i.Z(e.nodeEdges(r),(function(i){var a=i.v,s=r===a?i.w:a;t.hasNode(s)||Ct(e,i)||(t.setNode(s,{}),t.setEdge(r,s,{}),n(s))}))})),t.nodeCount()}function St(t,e){return kt(e.edges(),(function(n){if(t.hasNode(n.v)!==t.hasNode(n.w))return Ct(e,n)}))}function At(t,e,n){i.Z(t.nodes(),(function(t){e.node(t).rank+=n}))}var Lt=n(585),Bt=n(7179);const Nt=function(t){return function(e,n,i){var r=Object(e);if(!(0,Lt.Z)(e)){var a=(0,tt.Z)(n,3);e=(0,Bt.Z)(e),n=function(t){return a(r[t],t,r)}}var s=t(e,n,i);return s>-1?r[a?e[s]:s]:void 0}};var Dt=n(1692),Ot=n(4099);const Mt=function(t){var e=(0,Ot.Z)(t),n=e%1;return e==e?n?e-n:e:0};var It=Math.max;const Ft=Nt((function(t,e,n){var i=null==t?0:t.length;if(!i)return-1;var r=null==n?0:Mt(n);return r<0&&(r=It(i+r,0)),(0,Dt.Z)(t,(0,tt.Z)(e,3),r)}));var $t=n(3445);s.Z(1);s.Z(1);n(9473),n(3970),n(3589),n(8533);(0,n(4193).Z)("length");RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var Rt="\\ud800-\\udfff",Zt="["+Rt+"]",Pt="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",jt="\\ud83c[\\udffb-\\udfff]",Yt="[^"+Rt+"]",zt="(?:\\ud83c[\\udde6-\\uddff]){2}",Ut="[\\ud800-\\udbff][\\udc00-\\udfff]",Wt="(?:"+Pt+"|"+jt+")"+"?",qt="[\\ufe0e\\ufe0f]?",Ht=qt+Wt+("(?:\\u200d(?:"+[Yt,zt,Ut].join("|")+")"+qt+Wt+")*"),Vt="(?:"+[Yt+Pt+"?",Pt,zt,Ut,Zt].join("|")+")";RegExp(jt+"(?="+jt+")|"+Vt+Ht,"g");function Gt(){}function Xt(t,e,n){L.Z(e)||(e=[e]);var r=(t.isDirected()?t.successors:t.neighbors).bind(t),a=[],s={};return i.Z(e,(function(e){if(!t.hasNode(e))throw new Error("Graph does not have node: "+e);Qt(t,e,"post"===n,s,r,a)})),a}function Qt(t,e,n,r,s,o){a.Z(r,e)||(r[e]=!0,n||o.push(e),i.Z(s(e),(function(e){Qt(t,e,n,r,s,o)})),n&&o.push(e))}Gt.prototype=new Error;n(2544);function Kt(t){t=function(t){var e=(new h.k).setGraph(t.graph());return i.Z(t.nodes(),(function(n){e.setNode(n,t.node(n))})),i.Z(t.edges(),(function(n){var i=e.edge(n.v,n.w)||{weight:0,minlen:1},r=t.edge(n);e.setEdge(n.v,n.w,{weight:i.weight+r.weight,minlen:Math.max(i.minlen,r.minlen)})})),e}(t),wt(t);var e,n=Tt(t);for(ee(n),Jt(n,t);e=ie(n);)ae(n,t,e,re(n,t,e))}function Jt(t,e){var n=function(t,e){return Xt(t,e,"post")}(t,t.nodes());n=n.slice(0,n.length-1),i.Z(n,(function(n){!function(t,e,n){var i=t.node(n),r=i.parent;t.edge(n,r).cutvalue=te(t,e,n)}(t,e,n)}))}function te(t,e,n){var r=t.node(n).parent,a=!0,s=e.edge(n,r),o=0;return s||(a=!1,s=e.edge(r,n)),o=s.weight,i.Z(e.nodeEdges(n),(function(i){var s,c,l=i.v===n,h=l?i.w:i.v;if(h!==r){var u=l===a,d=e.edge(i).weight;if(o+=u?d:-d,s=n,c=h,t.hasEdge(s,c)){var p=t.edge(n,h).cutvalue;o+=u?-p:p}}})),o}function ee(t,e){arguments.length<2&&(e=t.nodes()[0]),ne(t,{},1,e)}function ne(t,e,n,r,s){var o=n,c=t.node(r);return e[r]=!0,i.Z(t.neighbors(r),(function(i){a.Z(e,i)||(n=ne(t,e,n,i,r))})),c.low=o,c.lim=n++,s?c.parent=s:delete c.parent,n}function ie(t){return Ft(t.edges(),(function(e){return t.edge(e).cutvalue<0}))}function re(t,e,n){var i=n.v,r=n.w;e.hasEdge(i,r)||(i=n.w,r=n.v);var a=t.node(i),s=t.node(r),o=a,c=!1;a.lim>s.lim&&(o=s,c=!0);var l=$t.Z(e.edges(),(function(e){return c===se(t,t.node(e.v),o)&&c!==se(t,t.node(e.w),o)}));return kt(l,(function(t){return Ct(e,t)}))}function ae(t,e,n,r){var a=n.v,s=n.w;t.removeEdge(a,s),t.setEdge(r.v,r.w,{}),ee(t),Jt(t,e),function(t,e){var n=Ft(t.nodes(),(function(t){return!e.node(t).parent})),r=function(t,e){return Xt(t,e,"pre")}(t,n);r=r.slice(1),i.Z(r,(function(n){var i=t.node(n).parent,r=e.edge(n,i),a=!1;r||(r=e.edge(i,n),a=!0),e.node(n).rank=e.node(i).rank+(a?r.minlen:-r.minlen)}))}(t,e)}function se(t,e,n){return n.low<=e.lim&&e.lim<=n.lim}function oe(t){switch(t.graph().ranker){case"network-simplex":default:le(t);break;case"tight-tree":!function(t){wt(t),Tt(t)}(t);break;case"longest-path":ce(t)}}Kt.initLowLimValues=ee,Kt.initCutValues=Jt,Kt.calcCutValue=te,Kt.leaveEdge=ie,Kt.enterEdge=re,Kt.exchangeEdges=ae;var ce=wt;function le(t){Kt(t)}var he=n(4148),ue=n(2344);function de(t){var e=ot(t,"root",{},"_root"),n=function(t){var e={};function n(r,a){var s=t.children(r);s&&s.length&&i.Z(s,(function(t){n(t,a+1)})),e[r]=a}return i.Z(t.children(),(function(t){n(t,1)})),e}(t),r=Q(he.Z(n))-1,a=2*r+1;t.graph().nestingRoot=e,i.Z(t.edges(),(function(e){t.edge(e).minlen*=a}));var s=function(t){return ue.Z(t.edges(),(function(e,n){return e+t.edge(n).weight}),0)}(t)+1;i.Z(t.children(),(function(i){pe(t,e,a,s,r,n,i)})),t.graph().nodeRankFactor=a}function pe(t,e,n,r,a,s,o){var c=t.children(o);if(c.length){var l=ut(t,"_bt"),h=ut(t,"_bb"),u=t.node(o);t.setParent(l,o),u.borderTop=l,t.setParent(h,o),u.borderBottom=h,i.Z(c,(function(i){pe(t,e,n,r,a,s,i);var c=t.node(i),u=c.borderTop?c.borderTop:i,d=c.borderBottom?c.borderBottom:i,p=c.borderTop?r:2*r,f=u!==d?1:a-s[o]+1;t.setEdge(l,u,{weight:p,minlen:f,nestingEdge:!0}),t.setEdge(d,h,{weight:p,minlen:f,nestingEdge:!0})})),t.parent(o)||t.setEdge(e,l,{weight:0,minlen:a+s[o]})}else o!==e&&t.setEdge(e,o,{weight:0,minlen:n})}var fe=n(8451);const ge=function(t){return(0,fe.Z)(t,5)};function ye(t,e,n){var s=function(t){var e;for(;t.hasNode(e=r.Z("_root")););return e}(t),o=new h.k({compound:!0}).setGraph({root:s}).setDefaultNodeLabel((function(e){return t.node(e)}));return i.Z(t.nodes(),(function(r){var c=t.node(r),l=t.parent(r);(c.rank===e||c.minRank<=e&&e<=c.maxRank)&&(o.setNode(r),o.setParent(r,l||s),i.Z(t[n](r),(function(e){var n=e.v===r?e.w:e.v,i=o.edge(n,r),a=nt.Z(i)?0:i.weight;o.setEdge(n,r,{weight:t.edge(e).weight+a})})),a.Z(c,"minRank")&&o.setNode(r,{borderLeft:c.borderLeft[e],borderRight:c.borderRight[e]}))})),o}var me=n(2954);const be=function(t,e,n){for(var i=-1,r=t.length,a=e.length,s={};++i<r;){var o=i<a?e[i]:void 0;n(s,t[i],o)}return s};const _e=function(t,e){return be(t||[],e||[],me.Z)};var xe=n(626),ve=n(4073),ke=n(3317),we=n(1018);const Ce=function(t,e){var n=t.length;for(t.sort(e);n--;)t[n]=t[n].value;return t};var Te=n(1162);const Ee=function(t,e){if(t!==e){var n=void 0!==t,i=null===t,r=t==t,a=(0,H.Z)(t),s=void 0!==e,o=null===e,c=e==e,l=(0,H.Z)(e);if(!o&&!l&&!a&&t>e||a&&s&&c&&!o&&!l||i&&s&&c||!n&&c||!r)return 1;if(!i&&!a&&!l&&t<e||l&&n&&r&&!i&&!a||o&&n&&r||!s&&r||!c)return-1}return 0};const Se=function(t,e,n){for(var i=-1,r=t.criteria,a=e.criteria,s=r.length,o=n.length;++i<s;){var c=Ee(r[i],a[i]);if(c)return i>=o?c:c*("desc"==n[i]?-1:1)}return t.index-e.index};const Ae=function(t,e,n){e=e.length?(0,ve.Z)(e,(function(t){return(0,L.Z)(t)?function(e){return(0,ke.Z)(e,1===t.length?t[0]:t)}:t})):[X.Z];var i=-1;e=(0,ve.Z)(e,(0,Te.Z)(tt.Z));var r=(0,we.Z)(t,(function(t,n,r){return{criteria:(0,ve.Z)(e,(function(e){return e(t)})),index:++i,value:t}}));return Ce(r,(function(t,e){return Se(t,e,n)}))};const Le=(0,Y.Z)((function(t,e){if(null==t)return[];var n=e.length;return n>1&&(0,z.Z)(t,e[0],e[1])?e=[]:n>2&&(0,z.Z)(e[0],e[1],e[2])&&(e=[e[0]]),Ae(t,(0,xe.Z)(e,1),[])}));function Be(t,e){for(var n=0,i=1;i<e.length;++i)n+=Ne(t,e[i-1],e[i]);return n}function Ne(t,e,n){for(var r=_e(n,c.Z(n,(function(t,e){return e}))),a=o.Z(c.Z(e,(function(e){return Le(c.Z(t.outEdges(e),(function(e){return{pos:r[e.w],weight:t.edge(e).weight}})),"pos")}))),s=1;s<n.length;)s<<=1;var l=2*s-1;s-=1;var h=c.Z(new Array(l),(function(){return 0})),u=0;return i.Z(a.forEach((function(t){var e=t.pos+s;h[e]+=t.weight;for(var n=0;e>0;)e%2&&(n+=h[e+1]),h[e=e-1>>1]+=t.weight;u+=t.weight*n}))),u}function De(t,e){var n={};return i.Z(t,(function(t,e){var i=n[t.v]={indegree:0,in:[],out:[],vs:[t.v],i:e};nt.Z(t.barycenter)||(i.barycenter=t.barycenter,i.weight=t.weight)})),i.Z(e.edges(),(function(t){var e=n[t.v],i=n[t.w];nt.Z(e)||nt.Z(i)||(i.indegree++,e.out.push(n[t.w]))})),function(t){var e=[];function n(t){return function(e){e.merged||(nt.Z(e.barycenter)||nt.Z(t.barycenter)||e.barycenter>=t.barycenter)&&function(t,e){var n=0,i=0;t.weight&&(n+=t.barycenter*t.weight,i+=t.weight);e.weight&&(n+=e.barycenter*e.weight,i+=e.weight);t.vs=e.vs.concat(t.vs),t.barycenter=n/i,t.weight=i,t.i=Math.min(e.i,t.i),e.merged=!0}(t,e)}}function r(e){return function(n){n.in.push(e),0==--n.indegree&&t.push(n)}}for(;t.length;){var a=t.pop();e.push(a),i.Z(a.in.reverse(),n(a)),i.Z(a.out,r(a))}return c.Z($t.Z(e,(function(t){return!t.merged})),(function(t){return W.Z(t,["vs","i","barycenter","weight"])}))}($t.Z(n,(function(t){return!t.indegree})))}function Oe(t,e){var n,r=function(t,e){var n={lhs:[],rhs:[]};return i.Z(t,(function(t){e(t)?n.lhs.push(t):n.rhs.push(t)})),n}(t,(function(t){return a.Z(t,"barycenter")})),s=r.lhs,c=Le(r.rhs,(function(t){return-t.i})),l=[],h=0,u=0,d=0;s.sort((n=!!e,function(t,e){return t.barycenter<e.barycenter?-1:t.barycenter>e.barycenter?1:n?e.i-t.i:t.i-e.i})),d=Me(l,c,d),i.Z(s,(function(t){d+=t.vs.length,l.push(t.vs),h+=t.barycenter*t.weight,u+=t.weight,d=Me(l,c,d)}));var p={vs:o.Z(l)};return u&&(p.barycenter=h/u,p.weight=u),p}function Me(t,e,n){for(var i;e.length&&(i=K(e)).i<=n;)e.pop(),t.push(i.vs),n++;return n}function Ie(t,e,n,r){var s=t.children(e),l=t.node(e),h=l?l.borderLeft:void 0,u=l?l.borderRight:void 0,d={};h&&(s=$t.Z(s,(function(t){return t!==h&&t!==u})));var p=function(t,e){return c.Z(e,(function(e){var n=t.inEdges(e);if(n.length){var i=ue.Z(n,(function(e,n){var i=t.edge(n),r=t.node(n.v);return{sum:e.sum+i.weight*r.order,weight:e.weight+i.weight}}),{sum:0,weight:0});return{v:e,barycenter:i.sum/i.weight,weight:i.weight}}return{v:e}}))}(t,s);i.Z(p,(function(e){if(t.children(e.v).length){var i=Ie(t,e.v,n,r);d[e.v]=i,a.Z(i,"barycenter")&&(s=e,o=i,nt.Z(s.barycenter)?(s.barycenter=o.barycenter,s.weight=o.weight):(s.barycenter=(s.barycenter*s.weight+o.barycenter*o.weight)/(s.weight+o.weight),s.weight+=o.weight))}var s,o}));var f=De(p,n);!function(t,e){i.Z(t,(function(t){t.vs=o.Z(t.vs.map((function(t){return e[t]?e[t].vs:t})))}))}(f,d);var g=Oe(f,r);if(h&&(g.vs=o.Z([h,g.vs,u]),t.predecessors(h).length)){var y=t.node(t.predecessors(h)[0]),m=t.node(t.predecessors(u)[0]);a.Z(g,"barycenter")||(g.barycenter=0,g.weight=0),g.barycenter=(g.barycenter*g.weight+y.order+m.order)/(g.weight+2),g.weight+=2}return g}function Fe(t){var e=dt(t),n=$e(t,l.Z(1,e+1),"inEdges"),r=$e(t,l.Z(e-1,-1,-1),"outEdges"),s=function(t){var e={},n=$t.Z(t.nodes(),(function(e){return!t.children(e).length})),r=Q(c.Z(n,(function(e){return t.node(e).rank}))),s=c.Z(l.Z(r+1),(function(){return[]})),o=Le(n,(function(e){return t.node(e).rank}));return i.Z(o,(function n(r){if(!a.Z(e,r)){e[r]=!0;var o=t.node(r);s[o.rank].push(r),i.Z(t.successors(r),n)}})),s}(t);Ze(t,s);for(var o,h=Number.POSITIVE_INFINITY,u=0,d=0;d<4;++u,++d){Re(u%2?n:r,u%4>=2);var p=Be(t,s=ht(t));p<h&&(d=0,o=ge(s),h=p)}Ze(t,o)}function $e(t,e,n){return c.Z(e,(function(e){return ye(t,e,n)}))}function Re(t,e){var n=new h.k;i.Z(t,(function(t){var r=t.graph().root,a=Ie(t,r,n,e);i.Z(a.vs,(function(e,n){t.node(e).order=n})),function(t,e,n){var r,a={};i.Z(n,(function(n){for(var i,s,o=t.parent(n);o;){if((i=t.parent(o))?(s=a[i],a[i]=o):(s=r,r=o),s&&s!==o)return void e.setEdge(s,o);o=i}}))}(t,n,a.vs)}))}function Ze(t,e){i.Z(e,(function(e){i.Z(e,(function(e,n){t.node(e).order=n}))}))}function Pe(t){var e=function(t){var e={},n=0;function r(a){var s=n;i.Z(t.children(a),r),e[a]={low:s,lim:n++}}return i.Z(t.children(),r),e}(t);i.Z(t.graph().dummyChains,(function(n){for(var i=t.node(n),r=i.edgeObj,a=function(t,e,n,i){var r,a,s=[],o=[],c=Math.min(e[n].low,e[i].low),l=Math.max(e[n].lim,e[i].lim);r=n;do{r=t.parent(r),s.push(r)}while(r&&(e[r].low>c||l>e[r].lim));a=r,r=i;for(;(r=t.parent(r))!==a;)o.push(r);return{path:s.concat(o.reverse()),lca:a}}(t,e,r.v,r.w),s=a.path,o=a.lca,c=0,l=s[c],h=!0;n!==r.w;){if(i=t.node(n),h){for(;(l=s[c])!==o&&t.node(l).maxRank<i.rank;)c++;l===o&&(h=!1)}if(!h){for(;c<s.length-1&&t.node(l=s[c+1]).minRank<=i.rank;)c++;l=s[c]}t.setParent(n,l),n=t.successors(n)[0]}}))}var je=n(8882);const Ye=function(t,e){return null==t?t:(0,w.Z)(t,(0,je.Z)(e),R.Z)};function ze(t,e){var n={};return ue.Z(e,(function(e,r){var a=0,s=0,o=e.length,c=K(r);return i.Z(r,(function(e,l){var h=function(t,e){if(t.node(e).dummy)return Ft(t.predecessors(e),(function(e){return t.node(e).dummy}))}(t,e),u=h?t.node(h).order:o;(h||e===c)&&(i.Z(r.slice(s,l+1),(function(e){i.Z(t.predecessors(e),(function(i){var r=t.node(i),s=r.order;!(s<a||u<s)||r.dummy&&t.node(e).dummy||Ue(n,i,e)}))})),s=l+1,a=u)})),r})),n}function Ue(t,e,n){if(e>n){var i=e;e=n,n=i}var r=t[e];r||(t[e]=r={}),r[n]=!0}function We(t,e,n){if(e>n){var i=e;e=n,n=i}return a.Z(t[e],n)}function qe(t,e,n,r,s){var o={},c=function(t,e,n,r){var s=new h.k,o=t.graph(),c=function(t,e,n){return function(i,r,s){var o,c=i.node(r),l=i.node(s),h=0;if(h+=c.width/2,a.Z(c,"labelpos"))switch(c.labelpos.toLowerCase()){case"l":o=-c.width/2;break;case"r":o=c.width/2}if(o&&(h+=n?o:-o),o=0,h+=(c.dummy?e:t)/2,h+=(l.dummy?e:t)/2,h+=l.width/2,a.Z(l,"labelpos"))switch(l.labelpos.toLowerCase()){case"l":o=l.width/2;break;case"r":o=-l.width/2}return o&&(h+=n?o:-o),o=0,h}}(o.nodesep,o.edgesep,r);return i.Z(e,(function(e){var r;i.Z(e,(function(e){var i=n[e];if(s.setNode(i),r){var a=n[r],o=s.edge(a,i);s.setEdge(a,i,Math.max(c(t,e,r),o||0))}r=e}))})),s}(t,e,n,s),l=s?"borderLeft":"borderRight";function u(t,e){for(var n=c.nodes(),i=n.pop(),r={};i;)r[i]?t(i):(r[i]=!0,n.push(i),n=n.concat(e(i))),i=n.pop()}return u((function(t){o[t]=c.inEdges(t).reduce((function(t,e){return Math.max(t,o[e.v]+c.edge(e))}),0)}),c.predecessors.bind(c)),u((function(e){var n=c.outEdges(e).reduce((function(t,e){return Math.min(t,o[e.w]-c.edge(e))}),Number.POSITIVE_INFINITY),i=t.node(e);n!==Number.POSITIVE_INFINITY&&i.borderType!==l&&(o[e]=Math.max(o[e],n))}),c.successors.bind(c)),i.Z(r,(function(t){o[t]=o[n[t]]})),o}function He(t){var e,n=ht(t),r=U(ze(t,n),function(t,e){var n={};function r(e,r,a,s,o){var c;i.Z(l.Z(r,a),(function(r){c=e[r],t.node(c).dummy&&i.Z(t.predecessors(c),(function(e){var i=t.node(e);i.dummy&&(i.order<s||i.order>o)&&Ue(n,e,c)}))}))}return ue.Z(e,(function(e,n){var a,s=-1,o=0;return i.Z(n,(function(i,c){if("border"===t.node(i).dummy){var l=t.predecessors(i);l.length&&(a=t.node(l[0]).order,r(n,o,c,s,a),o=c,s=a)}r(n,o,n.length,a,e.length)})),n})),n}(t,n)),a={};i.Z(["u","d"],(function(s){e="u"===s?n:he.Z(n).reverse(),i.Z(["l","r"],(function(n){"r"===n&&(e=c.Z(e,(function(t){return he.Z(t).reverse()})));var o=("u"===s?t.predecessors:t.successors).bind(t),l=function(t,e,n,r){var a={},s={},o={};return i.Z(e,(function(t){i.Z(t,(function(t,e){a[t]=t,s[t]=t,o[t]=e}))})),i.Z(e,(function(t){var e=-1;i.Z(t,(function(t){var i=r(t);if(i.length){i=Le(i,(function(t){return o[t]}));for(var c=(i.length-1)/2,l=Math.floor(c),h=Math.ceil(c);l<=h;++l){var u=i[l];s[t]===t&&e<o[u]&&!We(n,t,u)&&(s[u]=t,s[t]=a[t]=a[u],e=o[u])}}}))})),{root:a,align:s}}(0,e,r,o),h=qe(t,e,l.root,l.align,"r"===n);"r"===n&&(h=et(h,(function(t){return-t}))),a[s+n]=h}))}));var s=function(t,e){return kt(he.Z(e),(function(e){var n=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;return Ye(e,(function(e,r){var a=function(t,e){return t.node(e).width}(t,r)/2;n=Math.max(e+a,n),i=Math.min(e-a,i)})),n-i}))}(t,a);return function(t,e){var n=he.Z(e),r=rt(n),a=Q(n);i.Z(["u","d"],(function(n){i.Z(["l","r"],(function(i){var s,o=n+i,c=t[o];if(c!==e){var l=he.Z(c);(s="l"===i?r-rt(l):a-Q(l))&&(t[o]=et(c,(function(t){return t+s})))}}))}))}(a,s),function(t,e){return et(t.ul,(function(n,i){if(e)return t[e.toLowerCase()][i];var r=Le(c.Z(t,i));return(r[1]+r[2])/2}))}(a,t.graph().align)}function Ve(t){(function(t){var e=ht(t),n=t.graph().ranksep,r=0;i.Z(e,(function(e){var a=Q(c.Z(e,(function(e){return t.node(e).height})));i.Z(e,(function(e){t.node(e).y=r+a/2})),r+=a+n}))})(t=ct(t)),i.Z(He(t),(function(e,n){t.node(n).x=e}))}function Ge(t,e){var n=e&&e.debugTiming?pt:ft;n("layout",(function(){var e=n(" buildLayoutGraph",(function(){return function(t){var e=new h.k({multigraph:!0,compound:!0}),n=sn(t.graph());return e.setGraph(U({},Qe,an(n,Xe),W.Z(n,Ke))),i.Z(t.nodes(),(function(n){var i=sn(t.node(n));e.setNode(n,q.Z(an(i,Je),tn)),e.setParent(n,t.parent(n))})),i.Z(t.edges(),(function(n){var i=sn(t.edge(n));e.setEdge(n,U({},nn,an(i,en),W.Z(i,rn)))})),e}(t)}));n(" runLayout",(function(){!function(t,e){e(" makeSpaceForEdgeLabels",(function(){!function(t){var e=t.graph();e.ranksep/=2,i.Z(t.edges(),(function(n){var i=t.edge(n);i.minlen*=2,"c"!==i.labelpos.toLowerCase()&&("TB"===e.rankdir||"BT"===e.rankdir?i.width+=i.labeloffset:i.height+=i.labeloffset)}))}(t)})),e(" removeSelfEdges",(function(){!function(t){i.Z(t.edges(),(function(e){if(e.v===e.w){var n=t.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e:e,label:t.edge(e)}),t.removeEdge(e)}}))}(t)})),e(" acyclic",(function(){b(t)})),e(" nestingGraph.run",(function(){de(t)})),e(" rank",(function(){oe(ct(t))})),e(" injectEdgeLabelProxies",(function(){!function(t){i.Z(t.edges(),(function(e){var n=t.edge(e);if(n.width&&n.height){var i=t.node(e.v),r={rank:(t.node(e.w).rank-i.rank)/2+i.rank,e:e};ot(t,"edge-proxy",r,"_ep")}}))}(t)})),e(" removeEmptyRanks",(function(){!function(t){var e=rt(c.Z(t.nodes(),(function(e){return t.node(e).rank}))),n=[];i.Z(t.nodes(),(function(i){var r=t.node(i).rank-e;n[r]||(n[r]=[]),n[r].push(i)}));var r=0,a=t.graph().nodeRankFactor;i.Z(n,(function(e,n){nt.Z(e)&&n%a!=0?--r:r&&i.Z(e,(function(e){t.node(e).rank+=r}))}))}(t)})),e(" nestingGraph.cleanup",(function(){!function(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,i.Z(t.edges(),(function(e){t.edge(e).nestingEdge&&t.removeEdge(e)}))}(t)})),e(" normalizeRanks",(function(){!function(t){var e=rt(c.Z(t.nodes(),(function(e){return t.node(e).rank})));i.Z(t.nodes(),(function(n){var i=t.node(n);a.Z(i,"rank")&&(i.rank-=e)}))}(t)})),e(" assignRankMinMax",(function(){!function(t){var e=0;i.Z(t.nodes(),(function(n){var i=t.node(n);i.borderTop&&(i.minRank=t.node(i.borderTop).rank,i.maxRank=t.node(i.borderBottom).rank,e=Q(e,i.maxRank))})),t.graph().maxRank=e}(t)})),e(" removeEdgeLabelProxies",(function(){!function(t){i.Z(t.nodes(),(function(e){var n=t.node(e);"edge-proxy"===n.dummy&&(t.edge(n.e).labelRank=n.rank,t.removeNode(e))}))}(t)})),e(" normalize.run",(function(){vt(t)})),e(" parentDummyChains",(function(){Pe(t)})),e(" addBorderSegments",(function(){!function(t){i.Z(t.children(),(function e(n){var r=t.children(n),s=t.node(n);if(r.length&&i.Z(r,e),a.Z(s,"minRank")){s.borderLeft=[],s.borderRight=[];for(var o=s.minRank,c=s.maxRank+1;o<c;++o)gt(t,"borderLeft","_bl",n,s,o),gt(t,"borderRight","_br",n,s,o)}}))}(t)})),e(" order",(function(){Fe(t)})),e(" insertSelfEdges",(function(){!function(t){var e=ht(t);i.Z(e,(function(e){var n=0;i.Z(e,(function(e,r){var a=t.node(e);a.order=r+n,i.Z(a.selfEdges,(function(e){ot(t,"selfedge",{width:e.label.width,height:e.label.height,rank:a.rank,order:r+ ++n,e:e.e,label:e.label},"_se")})),delete a.selfEdges}))}))}(t)})),e(" adjustCoordinateSystem",(function(){!function(t){var e=t.graph().rankdir.toLowerCase();"lr"!==e&&"rl"!==e||mt(t)}(t)})),e(" position",(function(){Ve(t)})),e(" positionSelfEdges",(function(){!function(t){i.Z(t.nodes(),(function(e){var n=t.node(e);if("selfedge"===n.dummy){var i=t.node(n.e.v),r=i.x+i.width/2,a=i.y,s=n.x-r,o=i.height/2;t.setEdge(n.e,n.label),t.removeNode(e),n.label.points=[{x:r+2*s/3,y:a-o},{x:r+5*s/6,y:a-o},{x:r+s,y:a},{x:r+5*s/6,y:a+o},{x:r+2*s/3,y:a+o}],n.label.x=n.x,n.label.y=n.y}}))}(t)})),e(" removeBorderNodes",(function(){!function(t){i.Z(t.nodes(),(function(e){if(t.children(e).length){var n=t.node(e),i=t.node(n.borderTop),r=t.node(n.borderBottom),a=t.node(K(n.borderLeft)),s=t.node(K(n.borderRight));n.width=Math.abs(s.x-a.x),n.height=Math.abs(r.y-i.y),n.x=a.x+n.width/2,n.y=i.y+n.height/2}})),i.Z(t.nodes(),(function(e){"border"===t.node(e).dummy&&t.removeNode(e)}))}(t)})),e(" normalize.undo",(function(){!function(t){i.Z(t.graph().dummyChains,(function(e){var n,i=t.node(e),r=i.edgeLabel;for(t.setEdge(i.edgeObj,r);i.dummy;)n=t.successors(e)[0],t.removeNode(e),r.points.push({x:i.x,y:i.y}),"edge-label"===i.dummy&&(r.x=i.x,r.y=i.y,r.width=i.width,r.height=i.height),e=n,i=t.node(e)}))}(t)})),e(" fixupEdgeLabelCoords",(function(){!function(t){i.Z(t.edges(),(function(e){var n=t.edge(e);if(a.Z(n,"x"))switch("l"!==n.labelpos&&"r"!==n.labelpos||(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset}}))}(t)})),e(" undoCoordinateSystem",(function(){yt(t)})),e(" translateGraph",(function(){!function(t){var e=Number.POSITIVE_INFINITY,n=0,r=Number.POSITIVE_INFINITY,s=0,o=t.graph(),c=o.marginx||0,l=o.marginy||0;function h(t){var i=t.x,a=t.y,o=t.width,c=t.height;e=Math.min(e,i-o/2),n=Math.max(n,i+o/2),r=Math.min(r,a-c/2),s=Math.max(s,a+c/2)}i.Z(t.nodes(),(function(e){h(t.node(e))})),i.Z(t.edges(),(function(e){var n=t.edge(e);a.Z(n,"x")&&h(n)})),e-=c,r-=l,i.Z(t.nodes(),(function(n){var i=t.node(n);i.x-=e,i.y-=r})),i.Z(t.edges(),(function(n){var s=t.edge(n);i.Z(s.points,(function(t){t.x-=e,t.y-=r})),a.Z(s,"x")&&(s.x-=e),a.Z(s,"y")&&(s.y-=r)})),o.width=n-e+c,o.height=s-r+l}(t)})),e(" assignNodeIntersects",(function(){!function(t){i.Z(t.edges(),(function(e){var n,i,r=t.edge(e),a=t.node(e.v),s=t.node(e.w);r.points?(n=r.points[0],i=r.points[r.points.length-1]):(r.points=[],n=s,i=a),r.points.unshift(lt(a,n)),r.points.push(lt(s,i))}))}(t)})),e(" reversePoints",(function(){!function(t){i.Z(t.edges(),(function(e){var n=t.edge(e);n.reversed&&n.points.reverse()}))}(t)})),e(" acyclic.undo",(function(){!function(t){i.Z(t.edges(),(function(e){var n=t.edge(e);if(n.reversed){t.removeEdge(e);var i=n.forwardName;delete n.reversed,delete n.forwardName,t.setEdge(e.w,e.v,n,i)}}))}(t)}))}(e,n)})),n(" updateInputGraph",(function(){!function(t,e){i.Z(t.nodes(),(function(n){var i=t.node(n),r=e.node(n);i&&(i.x=r.x,i.y=r.y,e.children(n).length&&(i.width=r.width,i.height=r.height))})),i.Z(t.edges(),(function(n){var i=t.edge(n),r=e.edge(n);i.points=r.points,a.Z(r,"x")&&(i.x=r.x,i.y=r.y)})),t.graph().width=e.graph().width,t.graph().height=e.graph().height}(t,e)}))}))}var Xe=["nodesep","edgesep","ranksep","marginx","marginy"],Qe={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},Ke=["acyclicer","ranker","rankdir","align"],Je=["width","height"],tn={width:0,height:0},en=["minlen","weight","width","height","labeloffset"],nn={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},rn=["labelpos"];function an(t,e){return et(W.Z(t,e),Number)}function sn(t){var e={};return i.Z(t,(function(t,n){e[n.toLowerCase()]=t})),e}},2544:(t,e,n)=>{"use strict";n.d(e,{k:()=>M});var i=n(5123),r=n(2002),a=n(3234),s=n(7179),o=n(3445),c=n(9697),l=n(870),h=n(9360),u=n(626),d=n(9581),p=n(3001),f=n(1692);const g=function(t){return t!=t};const y=function(t,e,n){for(var i=n-1,r=t.length;++i<r;)if(t[i]===e)return i;return-1};const m=function(t,e,n){return e==e?y(t,e,n):(0,f.Z)(t,g,n)};const b=function(t,e){return!!(null==t?0:t.length)&&m(t,e,0)>-1};const _=function(t,e,n){for(var i=-1,r=null==t?0:t.length;++i<r;)if(n(e,t[i]))return!0;return!1};var x=n(9548),v=n(3203);const k=function(){};var w=n(6545),C=v.Z&&1/(0,w.Z)(new v.Z([,-0]))[1]==1/0?function(t){return new v.Z(t)}:k;const T=C;const E=function(t,e,n){var i=-1,r=b,a=t.length,s=!0,o=[],c=o;if(n)s=!1,r=_;else if(a>=200){var l=e?null:T(t);if(l)return(0,w.Z)(l);s=!1,r=x.Z,c=new p.Z}else c=e?[]:o;t:for(;++i<a;){var h=t[i],u=e?e(h):h;if(h=n||0!==h?h:0,s&&u==u){for(var d=c.length;d--;)if(c[d]===u)continue t;e&&c.push(u),o.push(h)}else r(c,u,n)||(c!==o&&c.push(u),o.push(h))}return o};var S=n(836);const A=(0,d.Z)((function(t){return E((0,u.Z)(t,1,S.Z,!0))}));var L=n(4148),B=n(2344),N="\0",D="\0",O="\x01";class M{constructor(t={}){this._isDirected=!i.Z(t,"directed")||t.directed,this._isMultigraph=!!i.Z(t,"multigraph")&&t.multigraph,this._isCompound=!!i.Z(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=r.Z(void 0),this._defaultEdgeLabelFn=r.Z(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[D]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(t){return this._label=t,this}graph(){return this._label}setDefaultNodeLabel(t){return a.Z(t)||(t=r.Z(t)),this._defaultNodeLabelFn=t,this}nodeCount(){return this._nodeCount}nodes(){return s.Z(this._nodes)}sources(){var t=this;return o.Z(this.nodes(),(function(e){return c.Z(t._in[e])}))}sinks(){var t=this;return o.Z(this.nodes(),(function(e){return c.Z(t._out[e])}))}setNodes(t,e){var n=arguments,i=this;return l.Z(t,(function(t){n.length>1?i.setNode(t,e):i.setNode(t)})),this}setNode(t,e){return i.Z(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]=D,this._children[t]={},this._children[D][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)}node(t){return this._nodes[t]}hasNode(t){return i.Z(this._nodes,t)}removeNode(t){var e=this;if(i.Z(this._nodes,t)){var n=function(t){e.removeEdge(e._edgeObjs[t])};delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],l.Z(this.children(t),(function(t){e.setParent(t)})),delete this._children[t]),l.Z(s.Z(this._in[t]),n),delete this._in[t],delete this._preds[t],l.Z(s.Z(this._out[t]),n),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this}setParent(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(h.Z(e))e=D;else{for(var n=e+="";!h.Z(n);n=this.parent(n))if(n===t)throw new Error("Setting "+e+" as parent of "+t+" would create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this}_removeFromParentsChildList(t){delete this._children[this._parent[t]][t]}parent(t){if(this._isCompound){var e=this._parent[t];if(e!==D)return e}}children(t){if(h.Z(t)&&(t=D),this._isCompound){var e=this._children[t];if(e)return s.Z(e)}else{if(t===D)return this.nodes();if(this.hasNode(t))return[]}}predecessors(t){var e=this._preds[t];if(e)return s.Z(e)}successors(t){var e=this._sucs[t];if(e)return s.Z(e)}neighbors(t){var e=this.predecessors(t);if(e)return A(e,this.successors(t))}isLeaf(t){return 0===(this.isDirected()?this.successors(t):this.neighbors(t)).length}filterNodes(t){var e=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});e.setGraph(this.graph());var n=this;l.Z(this._nodes,(function(n,i){t(i)&&e.setNode(i,n)})),l.Z(this._edgeObjs,(function(t){e.hasNode(t.v)&&e.hasNode(t.w)&&e.setEdge(t,n.edge(t))}));var i={};function r(t){var a=n.parent(t);return void 0===a||e.hasNode(a)?(i[t]=a,a):a in i?i[a]:r(a)}return this._isCompound&&l.Z(e.nodes(),(function(t){e.setParent(t,r(t))})),e}setDefaultEdgeLabel(t){return a.Z(t)||(t=r.Z(t)),this._defaultEdgeLabelFn=t,this}edgeCount(){return this._edgeCount}edges(){return L.Z(this._edgeObjs)}setPath(t,e){var n=this,i=arguments;return B.Z(t,(function(t,r){return i.length>1?n.setEdge(t,r,e):n.setEdge(t,r),r})),this}setEdge(){var t,e,n,r,a=!1,s=arguments[0];"object"==typeof s&&null!==s&&"v"in s?(t=s.v,e=s.w,n=s.name,2===arguments.length&&(r=arguments[1],a=!0)):(t=s,e=arguments[1],n=arguments[3],arguments.length>2&&(r=arguments[2],a=!0)),t=""+t,e=""+e,h.Z(n)||(n=""+n);var o=$(this._isDirected,t,e,n);if(i.Z(this._edgeLabels,o))return a&&(this._edgeLabels[o]=r),this;if(!h.Z(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[o]=a?r:this._defaultEdgeLabelFn(t,e,n);var c=function(t,e,n,i){var r=""+e,a=""+n;if(!t&&r>a){var s=r;r=a,a=s}var o={v:r,w:a};i&&(o.name=i);return o}(this._isDirected,t,e,n);return t=c.v,e=c.w,Object.freeze(c),this._edgeObjs[o]=c,I(this._preds[e],t),I(this._sucs[t],e),this._in[e][o]=c,this._out[t][o]=c,this._edgeCount++,this}edge(t,e,n){var i=1===arguments.length?R(this._isDirected,arguments[0]):$(this._isDirected,t,e,n);return this._edgeLabels[i]}hasEdge(t,e,n){var r=1===arguments.length?R(this._isDirected,arguments[0]):$(this._isDirected,t,e,n);return i.Z(this._edgeLabels,r)}removeEdge(t,e,n){var i=1===arguments.length?R(this._isDirected,arguments[0]):$(this._isDirected,t,e,n),r=this._edgeObjs[i];return r&&(t=r.v,e=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],F(this._preds[e],t),F(this._sucs[t],e),delete this._in[e][i],delete this._out[t][i],this._edgeCount--),this}inEdges(t,e){var n=this._in[t];if(n){var i=L.Z(n);return e?o.Z(i,(function(t){return t.v===e})):i}}outEdges(t,e){var n=this._out[t];if(n){var i=L.Z(n);return e?o.Z(i,(function(t){return t.w===e})):i}}nodeEdges(t,e){var n=this.inEdges(t,e);if(n)return n.concat(this.outEdges(t,e))}}function I(t,e){t[e]?t[e]++:t[e]=1}function F(t,e){--t[e]||delete t[e]}function $(t,e,n,i){var r=""+e,a=""+n;if(!t&&r>a){var s=r;r=a,a=s}return r+O+a+O+(h.Z(i)?N:i)}function R(t,e){return $(t,e.v,e.w,e.name)}M.prototype._nodeCount=0,M.prototype._edgeCount=0},5625:(t,e,n)=>{"use strict";n.d(e,{k:()=>i.k});var i=n(2544)},9354:(t,e,n)=>{"use strict";n.d(e,{c:()=>o});var i=n(9360),r=n(8451);const a=function(t){return(0,r.Z)(t,4)};var s=n(3836);n(2544);function o(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:c(t),edges:l(t)};return i.Z(t.graph())||(e.value=a(t.graph())),e}function c(t){return s.Z(t.nodes(),(function(e){var n=t.node(e),r=t.parent(e),a={v:e};return i.Z(n)||(a.value=n),i.Z(r)||(a.parent=r),a}))}function l(t){return s.Z(t.edges(),(function(e){var n=t.edge(e),r={v:e.v,w:e.w};return i.Z(e.name)||(r.name=e.name),i.Z(n)||(r.value=n),r}))}},1518:(t,e,n)=>{"use strict";n.d(e,{sY:()=>T});var i=n(9373),r=n(5123),a=n(3688),s=n(870),o=n(277),c=n(6225),l={normal:function(t,e,n,i){var r=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").style("stroke-width",1).style("stroke-dasharray","1,0");c.bg(r,n[i+"Style"]),n[i+"Class"]&&r.attr("class",n[i+"Class"])},vee:function(t,e,n,i){var r=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 L 4 5 z").style("stroke-width",1).style("stroke-dasharray","1,0");c.bg(r,n[i+"Style"]),n[i+"Class"]&&r.attr("class",n[i+"Class"])},undirected:function(t,e,n,i){var r=t.append("marker").attr("id",e).attr("viewBox","0 0 10 10").attr("refX",9).attr("refY",5).attr("markerUnits","strokeWidth").attr("markerWidth",8).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 0 5 L 10 5").style("stroke-width",1).style("stroke-dasharray","1,0");c.bg(r,n[i+"Style"]),n[i+"Class"]&&r.attr("class",n[i+"Class"])}};var h=n(3349);function u(t,e,n){var i=e.label,r=t.append("g");"svg"===e.labelType?function(t,e){var n=t;n.node().appendChild(e.label),c.bg(n,e.labelStyle)}(r,e):"string"!=typeof i||"html"===e.labelType?(0,h.a)(r,e):function(t,e){for(var n=t.append("text"),i=function(t){for(var e,n="",i=!1,r=0;r<t.length;++r)e=t[r],i?(n+="n"===e?"\n":e,i=!1):"\\"===e?i=!0:n+=e;return n}(e.label).split("\n"),r=0;r<i.length;r++)n.append("tspan").attr("xml:space","preserve").attr("dy","1em").attr("x","1").text(i[r]);c.bg(n,e.labelStyle)}(r,e);var a,s=r.node().getBBox();switch(n){case"top":a=-e.height/2;break;case"bottom":a=e.height/2-s.height;break;default:a=-s.height/2}return r.attr("transform","translate("+-s.width/2+","+a+")"),r}var d=function(t,e){var n=e.nodes().filter((function(t){return c.bF(e,t)})),r=t.selectAll("g.cluster").data(n,(function(t){return t}));c.WR(r.exit(),e).style("opacity",0).remove();var a=r.enter().append("g").attr("class","cluster").attr("id",(function(t){return e.node(t).id})).style("opacity",0).each((function(t){var n=e.node(t),r=i.Ys(this);i.Ys(this).append("rect"),u(r.append("g").attr("class","label"),n,n.clusterLabelPos)}));return r=r.merge(a),(r=c.WR(r,e).style("opacity",1)).selectAll("rect").each((function(t){var n=e.node(t),r=i.Ys(this);c.bg(r,n.style)})),r};let p=function(t,e){var n,a=t.selectAll("g.edgeLabel").data(e.edges(),(function(t){return c.O1(t)})).classed("update",!0);return a.exit().remove(),a.enter().append("g").classed("edgeLabel",!0).style("opacity",0),(a=t.selectAll("g.edgeLabel")).each((function(t){var n=i.Ys(this);n.select(".label").remove();var a=e.edge(t),s=u(n,e.edge(t),0).classed("label",!0),o=s.node().getBBox();a.labelId&&s.attr("id",a.labelId),r.Z(a,"width")||(a.width=o.width),r.Z(a,"height")||(a.height=o.height)})),n=a.exit?a.exit():a.selectAll(null),c.WR(n,e).style("opacity",0).remove(),a};var f=n(6749),g=n(4379);function y(t,e){return t.intersect(e)}var m=function(t,e,n){var r=t.selectAll("g.edgePath").data(e.edges(),(function(t){return c.O1(t)})).classed("update",!0),a=function(t,e){var n=t.enter().append("g").attr("class","edgePath").style("opacity",0);return n.append("path").attr("class","path").attr("d",(function(t){var n=e.edge(t),i=e.node(t.v).elem;return b(n,g.Z(n.points.length).map((function(){return e=(t=i).getBBox(),{x:(n=t.ownerSVGElement.getScreenCTM().inverse().multiply(t.getScreenCTM()).translate(e.width/2,e.height/2)).e,y:n.f};var t,e,n})))})),n.append("defs"),n}(r,e);!function(t,e){var n=t.exit();c.WR(n,e).style("opacity",0).remove()}(r,e);var s=void 0!==r.merge?r.merge(a):r;return c.WR(s,e).style("opacity",1),s.each((function(t){var n=i.Ys(this),r=e.edge(t);r.elem=this,r.id&&n.attr("id",r.id),c.$p(n,r.class,(n.classed("update")?"update ":"")+"edgePath")})),s.selectAll("path.path").each((function(t){var n=e.edge(t);n.arrowheadId=f.Z("arrowhead");var r=i.Ys(this).attr("marker-end",(function(){return"url("+(t=location.href,e=n.arrowheadId,t.split("#")[0]+"#"+e+")");var t,e})).style("fill","none");c.WR(r,e).attr("d",(function(t){return function(t,e){var n=t.edge(e),i=t.node(e.v),r=t.node(e.w),a=n.points.slice(1,n.points.length-1);return a.unshift(y(i,a[0])),a.push(y(r,a[a.length-1])),b(n,a)}(e,t)})),c.bg(r,n.style)})),s.selectAll("defs *").remove(),s.selectAll("defs").each((function(t){var r=e.edge(t);(0,n[r.arrowhead])(i.Ys(this),r.arrowheadId,r,"arrowhead")})),s};function b(t,e){var n=(i.jvg||i.YPS.line)().x((function(t){return t.x})).y((function(t){return t.y}));return(n.curve||n.interpolate)(t.curve),n(e)}var _=n(1666),x=function(t,e,n){var a,s=e.nodes().filter((function(t){return!c.bF(e,t)})),o=t.selectAll("g.node").data(s,(function(t){return t})).classed("update",!0);return o.exit().remove(),o.enter().append("g").attr("class","node").style("opacity",0),(o=t.selectAll("g.node")).each((function(t){var a=e.node(t),s=i.Ys(this);c.$p(s,a.class,(s.classed("update")?"update ":"")+"node"),s.select("g.label").remove();var o=s.append("g").attr("class","label"),l=u(o,a),h=n[a.shape],d=_.Z(l.node().getBBox(),"width","height");a.elem=this,a.id&&s.attr("id",a.id),a.labelId&&o.attr("id",a.labelId),r.Z(a,"width")&&(d.width=a.width),r.Z(a,"height")&&(d.height=a.height),d.width+=a.paddingLeft+a.paddingRight,d.height+=a.paddingTop+a.paddingBottom,o.attr("transform","translate("+(a.paddingLeft-a.paddingRight)/2+","+(a.paddingTop-a.paddingBottom)/2+")");var p=i.Ys(this);p.select(".label-container").remove();var f=h(p,d,a).classed("label-container",!0);c.bg(f,a.style);var g=f.node().getBBox();a.width=g.width,a.height=g.height})),a=o.exit?o.exit():o.selectAll(null),c.WR(a,e).style("opacity",0).remove(),o};function v(t,e,n,i){var r=t.x,a=t.y,s=r-i.x,o=a-i.y,c=Math.sqrt(e*e*o*o+n*n*s*s),l=Math.abs(e*n*s/c);i.x<r&&(l=-l);var h=Math.abs(e*n*o/c);return i.y<a&&(h=-h),{x:r+l,y:a+h}}var k=n(3352),w=n(2930),C={rect:function(t,e,n){var i=t.insert("rect",":first-child").attr("rx",n.rx).attr("ry",n.ry).attr("x",-e.width/2).attr("y",-e.height/2).attr("width",e.width).attr("height",e.height);return n.intersect=function(t){return(0,w.q)(n,t)},i},ellipse:function(t,e,n){var i=e.width/2,r=e.height/2,a=t.insert("ellipse",":first-child").attr("x",-e.width/2).attr("y",-e.height/2).attr("rx",i).attr("ry",r);return n.intersect=function(t){return v(n,i,r,t)},a},circle:function(t,e,n){var i=Math.max(e.width,e.height)/2,r=t.insert("circle",":first-child").attr("x",-e.width/2).attr("y",-e.height/2).attr("r",i);return n.intersect=function(t){return function(t,e,n){return v(t,e,e,n)}(n,i,t)},r},diamond:function(t,e,n){var i=e.width*Math.SQRT2/2,r=e.height*Math.SQRT2/2,a=[{x:0,y:-r},{x:-i,y:0},{x:0,y:r},{x:i,y:0}],s=t.insert("polygon",":first-child").attr("points",a.map((function(t){return t.x+","+t.y})).join(" "));return n.intersect=function(t){return(0,k.A)(n,a,t)},s}};function T(){var t=function(t,e){!function(t){t.nodes().forEach((function(e){var n=t.node(e);r.Z(n,"label")||t.children(e).length||(n.label=e),r.Z(n,"paddingX")&&a.Z(n,{paddingLeft:n.paddingX,paddingRight:n.paddingX}),r.Z(n,"paddingY")&&a.Z(n,{paddingTop:n.paddingY,paddingBottom:n.paddingY}),r.Z(n,"padding")&&a.Z(n,{paddingLeft:n.padding,paddingRight:n.padding,paddingTop:n.padding,paddingBottom:n.padding}),a.Z(n,E),s.Z(["paddingLeft","paddingRight","paddingTop","paddingBottom"],(function(t){n[t]=Number(n[t])})),r.Z(n,"width")&&(n._prevWidth=n.width),r.Z(n,"height")&&(n._prevHeight=n.height)})),t.edges().forEach((function(e){var n=t.edge(e);r.Z(n,"label")||(n.label=""),a.Z(n,S)}))}(e);var n=A(t,"output"),h=A(n,"clusters"),u=A(n,"edgePaths"),f=p(A(n,"edgeLabels"),e),g=x(A(n,"nodes"),e,C);(0,o.bK)(e),function(t,e){function n(t){var n=e.node(t);return"translate("+n.x+","+n.y+")"}t.filter((function(){return!i.Ys(this).classed("update")})).attr("transform",n),c.WR(t,e).style("opacity",1).attr("transform",n)}(g,e),function(t,e){function n(t){var n=e.edge(t);return r.Z(n,"x")?"translate("+n.x+","+n.y+")":""}t.filter((function(){return!i.Ys(this).classed("update")})).attr("transform",n),c.WR(t,e).style("opacity",1).attr("transform",n)}(f,e),m(u,e,l),function(t,e){var n=t.filter((function(){return!i.Ys(this).classed("update")}));function r(t){var n=e.node(t);return"translate("+n.x+","+n.y+")"}n.attr("transform",r),c.WR(t,e).style("opacity",1).attr("transform",r),c.WR(n.selectAll("rect"),e).attr("width",(function(t){return e.node(t).width})).attr("height",(function(t){return e.node(t).height})).attr("x",(function(t){return-e.node(t).width/2})).attr("y",(function(t){return-e.node(t).height/2}))}(d(h,e),e),function(t){s.Z(t.nodes(),(function(e){var n=t.node(e);r.Z(n,"_prevWidth")?n.width=n._prevWidth:delete n.width,r.Z(n,"_prevHeight")?n.height=n._prevHeight:delete n.height,delete n._prevWidth,delete n._prevHeight}))}(e)};return t.createNodes=function(e){return arguments.length?(function(t){x=t}(e),t):x},t.createClusters=function(e){return arguments.length?(function(t){d=t}(e),t):d},t.createEdgeLabels=function(e){return arguments.length?(function(t){p=t}(e),t):p},t.createEdgePaths=function(e){return arguments.length?(function(t){m=t}(e),t):m},t.shapes=function(e){return arguments.length?(function(t){C=t}(e),t):C},t.arrows=function(e){return arguments.length?(function(t){l=t}(e),t):l},t}var E={paddingLeft:10,paddingRight:10,paddingTop:10,paddingBottom:10,rx:0,ry:0,shape:"rect"},S={arrowhead:"normal",curve:i.c_6};function A(t,e){var n=t.select("g."+e);return n.empty()&&(n=t.append("g").attr("class",e)),n}n(5625)},1883:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(1691),r=n(2142);const a=class{constructor(){this.type=r.w.ALL}get(){return this.type}set(t){if(this.type&&this.type!==t)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=t}reset(){this.type=r.w.ALL}is(t){return this.type===t}};const s=new class{constructor(t,e){this.color=e,this.changed=!1,this.data=t,this.type=new a}set(t,e){return this.color=e,this.changed=!1,this.data=t,this.type.type=r.w.ALL,this}_ensureHSL(){const t=this.data,{h:e,s:n,l:r}=t;void 0===e&&(t.h=i.Z.channel.rgb2hsl(t,"h")),void 0===n&&(t.s=i.Z.channel.rgb2hsl(t,"s")),void 0===r&&(t.l=i.Z.channel.rgb2hsl(t,"l"))}_ensureRGB(){const t=this.data,{r:e,g:n,b:r}=t;void 0===e&&(t.r=i.Z.channel.hsl2rgb(t,"r")),void 0===n&&(t.g=i.Z.channel.hsl2rgb(t,"g")),void 0===r&&(t.b=i.Z.channel.hsl2rgb(t,"b"))}get r(){const t=this.data,e=t.r;return this.type.is(r.w.HSL)||void 0===e?(this._ensureHSL(),i.Z.channel.hsl2rgb(t,"r")):e}get g(){const t=this.data,e=t.g;return this.type.is(r.w.HSL)||void 0===e?(this._ensureHSL(),i.Z.channel.hsl2rgb(t,"g")):e}get b(){const t=this.data,e=t.b;return this.type.is(r.w.HSL)||void 0===e?(this._ensureHSL(),i.Z.channel.hsl2rgb(t,"b")):e}get h(){const t=this.data,e=t.h;return this.type.is(r.w.RGB)||void 0===e?(this._ensureRGB(),i.Z.channel.rgb2hsl(t,"h")):e}get s(){const t=this.data,e=t.s;return this.type.is(r.w.RGB)||void 0===e?(this._ensureRGB(),i.Z.channel.rgb2hsl(t,"s")):e}get l(){const t=this.data,e=t.l;return this.type.is(r.w.RGB)||void 0===e?(this._ensureRGB(),i.Z.channel.rgb2hsl(t,"l")):e}get a(){return this.data.a}set r(t){this.type.set(r.w.RGB),this.changed=!0,this.data.r=t}set g(t){this.type.set(r.w.RGB),this.changed=!0,this.data.g=t}set b(t){this.type.set(r.w.RGB),this.changed=!0,this.data.b=t}set h(t){this.type.set(r.w.HSL),this.changed=!0,this.data.h=t}set s(t){this.type.set(r.w.HSL),this.changed=!0,this.data.s=t}set l(t){this.type.set(r.w.HSL),this.changed=!0,this.data.l=t}set a(t){this.changed=!0,this.data.a=t}}({r:0,g:0,b:0,a:0},"transparent")},1610:(t,e,n)=>{"use strict";n.d(e,{Z:()=>g});var i=n(1883),r=n(2142);const a={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:t=>{if(35!==t.charCodeAt(0))return;const e=t.match(a.re);if(!e)return;const n=e[1],r=parseInt(n,16),s=n.length,o=s%4==0,c=s>4,l=c?1:17,h=c?8:4,u=o?0:-1,d=c?255:15;return i.Z.set({r:(r>>h*(u+3)&d)*l,g:(r>>h*(u+2)&d)*l,b:(r>>h*(u+1)&d)*l,a:o?(r&d)*l/255:1},t)},stringify:t=>{const{r:e,g:n,b:i,a:a}=t;return a<1?`#${r.Q[Math.round(e)]}${r.Q[Math.round(n)]}${r.Q[Math.round(i)]}${r.Q[Math.round(255*a)]}`:`#${r.Q[Math.round(e)]}${r.Q[Math.round(n)]}${r.Q[Math.round(i)]}`}},s=a;var o=n(1691);const c={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:t=>{const e=t.match(c.hueRe);if(e){const[,t,n]=e;switch(n){case"grad":return o.Z.channel.clamp.h(.9*parseFloat(t));case"rad":return o.Z.channel.clamp.h(180*parseFloat(t)/Math.PI);case"turn":return o.Z.channel.clamp.h(360*parseFloat(t))}}return o.Z.channel.clamp.h(parseFloat(t))},parse:t=>{const e=t.charCodeAt(0);if(104!==e&&72!==e)return;const n=t.match(c.re);if(!n)return;const[,r,a,s,l,h]=n;return i.Z.set({h:c._hue2deg(r),s:o.Z.channel.clamp.s(parseFloat(a)),l:o.Z.channel.clamp.l(parseFloat(s)),a:l?o.Z.channel.clamp.a(h?parseFloat(l)/100:parseFloat(l)):1},t)},stringify:t=>{const{h:e,s:n,l:i,a:r}=t;return r<1?`hsla(${o.Z.lang.round(e)}, ${o.Z.lang.round(n)}%, ${o.Z.lang.round(i)}%, ${r})`:`hsl(${o.Z.lang.round(e)}, ${o.Z.lang.round(n)}%, ${o.Z.lang.round(i)}%)`}},l=c,h={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:t=>{t=t.toLowerCase();const e=h.colors[t];if(e)return s.parse(e)},stringify:t=>{const e=s.stringify(t);for(const n in h.colors)if(h.colors[n]===e)return n}},u=h,d={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:t=>{const e=t.charCodeAt(0);if(114!==e&&82!==e)return;const n=t.match(d.re);if(!n)return;const[,r,a,s,c,l,h,u,p]=n;return i.Z.set({r:o.Z.channel.clamp.r(a?2.55*parseFloat(r):parseFloat(r)),g:o.Z.channel.clamp.g(c?2.55*parseFloat(s):parseFloat(s)),b:o.Z.channel.clamp.b(h?2.55*parseFloat(l):parseFloat(l)),a:u?o.Z.channel.clamp.a(p?parseFloat(u)/100:parseFloat(u)):1},t)},stringify:t=>{const{r:e,g:n,b:i,a:r}=t;return r<1?`rgba(${o.Z.lang.round(e)}, ${o.Z.lang.round(n)}, ${o.Z.lang.round(i)}, ${o.Z.lang.round(r)})`:`rgb(${o.Z.lang.round(e)}, ${o.Z.lang.round(n)}, ${o.Z.lang.round(i)})`}},p=d,f={format:{keyword:h,hex:s,rgb:d,rgba:d,hsl:c,hsla:c},parse:t=>{if("string"!=typeof t)return t;const e=s.parse(t)||p.parse(t)||l.parse(t)||u.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},stringify:t=>!t.changed&&t.color?t.color:t.type.is(r.w.HSL)||void 0===t.data.r?l.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?p.stringify(t):s.stringify(t)},g=f},2142:(t,e,n)=>{"use strict";n.d(e,{Q:()=>r,w:()=>a});var i=n(1691);const r={};for(let s=0;s<=255;s++)r[s]=i.Z.unit.dec2hex(s);const a={ALL:0,RGB:1,HSL:2}},1506:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(1691),r=n(1610);const a=(t,e,n)=>{const a=r.Z.parse(t),s=a[e],o=i.Z.channel.clamp[e](s+n);return s!==o&&(a[e]=o),r.Z.stringify(a)}},7201:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(1506);const r=(t,e)=>(0,i.Z)(t,"l",-e)},5920:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(1506);const r=(t,e)=>(0,i.Z)(t,"l",e)},1691:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});const i={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:t=>t>=255?255:t<0?0:t,g:t=>t>=255?255:t<0?0:t,b:t=>t>=255?255:t<0?0:t,h:t=>t%360,s:t=>t>=100?100:t<0?0:t,l:t=>t>=100?100:t<0?0:t,a:t=>t>=1?1:t<0?0:t},toLinear:t=>{const e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},hue2rgb:(t,e,n)=>(n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t),hsl2rgb:({h:t,s:e,l:n},r)=>{if(!e)return 2.55*n;t/=360,e/=100;const a=(n/=100)<.5?n*(1+e):n+e-n*e,s=2*n-a;switch(r){case"r":return 255*i.hue2rgb(s,a,t+1/3);case"g":return 255*i.hue2rgb(s,a,t);case"b":return 255*i.hue2rgb(s,a,t-1/3)}},rgb2hsl:({r:t,g:e,b:n},i)=>{t/=255,e/=255,n/=255;const r=Math.max(t,e,n),a=Math.min(t,e,n),s=(r+a)/2;if("l"===i)return 100*s;if(r===a)return 0;const o=r-a;if("s"===i)return 100*(s>.5?o/(2-r-a):o/(r+a));switch(r){case t:return 60*((e-n)/o+(e<n?6:0));case e:return 60*((n-t)/o+2);case n:return 60*((t-e)/o+4);default:return-1}}},r={channel:i,lang:{clamp:(t,e,n)=>e>n?Math.min(e,Math.max(n,t)):Math.min(n,Math.max(e,t)),round:t=>Math.round(1e10*t)/1e10},unit:{dec2hex:t=>{const e=Math.round(t).toString(16);return e.length>1?e:`0${e}`}}}},7308:(t,e,n)=>{"use strict";n.d(e,{Z:()=>d});const i=function(){this.__data__=[],this.size=0};var r=n(9651);const a=function(t,e){for(var n=t.length;n--;)if((0,r.Z)(t[n][0],e))return n;return-1};var s=Array.prototype.splice;const o=function(t){var e=this.__data__,n=a(e,t);return!(n<0)&&(n==e.length-1?e.pop():s.call(e,n,1),--this.size,!0)};const c=function(t){var e=this.__data__,n=a(e,t);return n<0?void 0:e[n][1]};const l=function(t){return a(this.__data__,t)>-1};const h=function(t,e){var n=this.__data__,i=a(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this};function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}u.prototype.clear=i,u.prototype.delete=o,u.prototype.get=c,u.prototype.has=l,u.prototype.set=h;const d=u},6183:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(2508),r=n(6092);const a=(0,i.Z)(r.Z,"Map")},7834:(t,e,n)=>{"use strict";n.d(e,{Z:()=>w});const i=(0,n(2508).Z)(Object,"create");const r=function(){this.__data__=i?i(null):{},this.size=0};const a=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e};var s=Object.prototype.hasOwnProperty;const o=function(t){var e=this.__data__;if(i){var n=e[t];return"__lodash_hash_undefined__"===n?void 0:n}return s.call(e,t)?e[t]:void 0};var c=Object.prototype.hasOwnProperty;const l=function(t){var e=this.__data__;return i?void 0!==e[t]:c.call(e,t)};const h=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=i&&void 0===e?"__lodash_hash_undefined__":e,this};function u(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}u.prototype.clear=r,u.prototype.delete=a,u.prototype.get=o,u.prototype.has=l,u.prototype.set=h;const d=u;var p=n(7308),f=n(6183);const g=function(){this.size=0,this.__data__={hash:new d,map:new(f.Z||p.Z),string:new d}};const y=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t};const m=function(t,e){var n=t.__data__;return y(e)?n["string"==typeof e?"string":"hash"]:n.map};const b=function(t){var e=m(this,t).delete(t);return this.size-=e?1:0,e};const _=function(t){return m(this,t).get(t)};const x=function(t){return m(this,t).has(t)};const v=function(t,e){var n=m(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this};function k(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var i=t[e];this.set(i[0],i[1])}}k.prototype.clear=g,k.prototype.delete=b,k.prototype.get=_,k.prototype.has=x,k.prototype.set=v;const w=k},3203:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(2508),r=n(6092);const a=(0,i.Z)(r.Z,"Set")},3001:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(7834);const r=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};const a=function(t){return this.__data__.has(t)};function s(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new i.Z;++e<n;)this.add(t[e])}s.prototype.add=s.prototype.push=r,s.prototype.has=a;const o=s},1667:(t,e,n)=>{"use strict";n.d(e,{Z:()=>d});var i=n(7308);const r=function(){this.__data__=new i.Z,this.size=0};const a=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n};const s=function(t){return this.__data__.get(t)};const o=function(t){return this.__data__.has(t)};var c=n(6183),l=n(7834);const h=function(t,e){var n=this.__data__;if(n instanceof i.Z){var r=n.__data__;if(!c.Z||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new l.Z(r)}return n.set(t,e),this.size=n.size,this};function u(t){var e=this.__data__=new i.Z(t);this.size=e.size}u.prototype.clear=r,u.prototype.delete=a,u.prototype.get=s,u.prototype.has=o,u.prototype.set=h;const d=u},7685:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=n(6092).Z.Symbol},7623:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=n(6092).Z.Uint8Array},6579:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){for(var n=-1,i=null==t?0:t.length;++n<i&&!1!==e(t[n],n,t););return t}},8774:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){for(var n=-1,i=null==t?0:t.length,r=0,a=[];++n<i;){var s=t[n];e(s,n,t)&&(a[r++]=s)}return a}},7668:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});const i=function(t,e){for(var n=-1,i=Array(t);++n<t;)i[n]=e(n);return i};var r=n(9169),a=n(7771),s=n(7008),o=n(6009),c=n(8843),l=Object.prototype.hasOwnProperty;const h=function(t,e){var n=(0,a.Z)(t),h=!n&&(0,r.Z)(t),u=!n&&!h&&(0,s.Z)(t),d=!n&&!h&&!u&&(0,c.Z)(t),p=n||h||u||d,f=p?i(t.length,String):[],g=f.length;for(var y in t)!e&&!l.call(t,y)||p&&("length"==y||u&&("offset"==y||"parent"==y)||d&&("buffer"==y||"byteLength"==y||"byteOffset"==y)||(0,o.Z)(y,g))||f.push(y);return f}},4073:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){for(var n=-1,i=null==t?0:t.length,r=Array(i);++n<i;)r[n]=e(t[n],n,t);return r}},8694:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){for(var n=-1,i=e.length,r=t.length;++n<i;)t[r+n]=e[n];return t}},2954:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(4752),r=n(9651),a=Object.prototype.hasOwnProperty;const s=function(t,e,n){var s=t[e];a.call(t,e)&&(0,r.Z)(s,n)&&(void 0!==n||e in t)||(0,i.Z)(t,e,n)}},4752:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(7904);const r=function(t,e,n){"__proto__"==e&&i.Z?(0,i.Z)(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}},8451:(t,e,n)=>{"use strict";n.d(e,{Z:()=>J});var i=n(1667),r=n(6579),a=n(2954),s=n(1899),o=n(7179);const c=function(t,e){return t&&(0,s.Z)(e,(0,o.Z)(e),t)};var l=n(2957);const h=function(t,e){return t&&(0,s.Z)(e,(0,l.Z)(e),t)};var u=n(1050),d=n(7215),p=n(5695);const f=function(t,e){return(0,s.Z)(t,(0,p.Z)(t),e)};var g=n(8694),y=n(2513),m=n(532);const b=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)(0,g.Z)(e,(0,p.Z)(t)),t=(0,y.Z)(t);return e}:m.Z;const _=function(t,e){return(0,s.Z)(t,b(t),e)};var x=n(1808),v=n(3327);const k=function(t){return(0,v.Z)(t,l.Z,b)};var w=n(3970),C=Object.prototype.hasOwnProperty;const T=function(t){var e=t.length,n=new t.constructor(e);return e&&"string"==typeof t[0]&&C.call(t,"index")&&(n.index=t.index,n.input=t.input),n};var E=n(1884);const S=function(t,e){var n=e?(0,E.Z)(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)};var A=/\w*$/;const L=function(t){var e=new t.constructor(t.source,A.exec(t));return e.lastIndex=t.lastIndex,e};var B=n(7685),N=B.Z?B.Z.prototype:void 0,D=N?N.valueOf:void 0;const O=function(t){return D?Object(D.call(t)):{}};var M=n(2701);const I=function(t,e,n){var i=t.constructor;switch(e){case"[object ArrayBuffer]":return(0,E.Z)(t);case"[object Boolean]":case"[object Date]":return new i(+t);case"[object DataView]":return S(t,n);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return(0,M.Z)(t,n);case"[object Map]":case"[object Set]":return new i;case"[object Number]":case"[object String]":return new i(t);case"[object RegExp]":return L(t);case"[object Symbol]":return O(t)}};var F=n(3658),$=n(7771),R=n(7008),Z=n(8533);const P=function(t){return(0,Z.Z)(t)&&"[object Map]"==(0,w.Z)(t)};var j=n(1162),Y=n(8351),z=Y.Z&&Y.Z.isMap;const U=z?(0,j.Z)(z):P;var W=n(7226);const q=function(t){return(0,Z.Z)(t)&&"[object Set]"==(0,w.Z)(t)};var H=Y.Z&&Y.Z.isSet;const V=H?(0,j.Z)(H):q;var G="[object Arguments]",X="[object Function]",Q="[object Object]",K={};K[G]=K["[object Array]"]=K["[object ArrayBuffer]"]=K["[object DataView]"]=K["[object Boolean]"]=K["[object Date]"]=K["[object Float32Array]"]=K["[object Float64Array]"]=K["[object Int8Array]"]=K["[object Int16Array]"]=K["[object Int32Array]"]=K["[object Map]"]=K["[object Number]"]=K[Q]=K["[object RegExp]"]=K["[object Set]"]=K["[object String]"]=K["[object Symbol]"]=K["[object Uint8Array]"]=K["[object Uint8ClampedArray]"]=K["[object Uint16Array]"]=K["[object Uint32Array]"]=!0,K["[object Error]"]=K[X]=K["[object WeakMap]"]=!1;const J=function t(e,n,s,p,g,y){var m,b=1&n,v=2&n,C=4&n;if(s&&(m=g?s(e,p,g,y):s(e)),void 0!==m)return m;if(!(0,W.Z)(e))return e;var E=(0,$.Z)(e);if(E){if(m=T(e),!b)return(0,d.Z)(e,m)}else{var S=(0,w.Z)(e),A=S==X||"[object GeneratorFunction]"==S;if((0,R.Z)(e))return(0,u.Z)(e,b);if(S==Q||S==G||A&&!g){if(m=v||A?{}:(0,F.Z)(e),!b)return v?_(e,h(m,e)):f(e,c(m,e))}else{if(!K[S])return g?e:{};m=I(e,S,b)}}y||(y=new i.Z);var L=y.get(e);if(L)return L;y.set(e,m),V(e)?e.forEach((function(i){m.add(t(i,n,s,i,e,y))})):U(e)&&e.forEach((function(i,r){m.set(r,t(i,n,s,r,e,y))}));var B=C?v?k:x.Z:v?l.Z:o.Z,N=E?void 0:B(e);return(0,r.Z)(N||e,(function(i,r){N&&(i=e[r=i]),(0,a.Z)(m,r,t(i,n,s,r,e,y))})),m}},9811:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(2693),r=n(585);const a=function(t,e){return function(n,i){if(null==n)return n;if(!(0,r.Z)(n))return t(n,i);for(var a=n.length,s=e?a:-1,o=Object(n);(e?s--:++s<a)&&!1!==i(o[s],s,o););return n}}(i.Z)},1692:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e,n,i){for(var r=t.length,a=n+(i?1:-1);i?a--:++a<r;)if(e(t[a],a,t))return a;return-1}},626:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(8694),r=n(7685),a=n(9169),s=n(7771),o=r.Z?r.Z.isConcatSpreadable:void 0;const c=function(t){return(0,s.Z)(t)||(0,a.Z)(t)||!!(o&&t&&t[o])};const l=function t(e,n,r,a,s){var o=-1,l=e.length;for(r||(r=c),s||(s=[]);++o<l;){var h=e[o];n>0&&r(h)?n>1?t(h,n-1,r,a,s):(0,i.Z)(s,h):a||(s[s.length]=h)}return s}},1395:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return function(e,n,i){for(var r=-1,a=Object(e),s=i(e),o=s.length;o--;){var c=s[t?o:++r];if(!1===n(a[c],c,a))break}return e}}()},2693:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(1395),r=n(7179);const a=function(t,e){return t&&(0,i.Z)(t,e,r.Z)}},3317:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(2823),r=n(2281);const a=function(t,e){for(var n=0,a=(e=(0,i.Z)(e,t)).length;null!=t&&n<a;)t=t[(0,r.Z)(e[n++])];return n&&n==a?t:void 0}},3327:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(8694),r=n(7771);const a=function(t,e,n){var a=e(t);return(0,r.Z)(t)?a:(0,i.Z)(a,n(t))}},3589:(t,e,n)=>{"use strict";n.d(e,{Z:()=>d});var i=n(7685),r=Object.prototype,a=r.hasOwnProperty,s=r.toString,o=i.Z?i.Z.toStringTag:void 0;const c=function(t){var e=a.call(t,o),n=t[o];try{t[o]=void 0;var i=!0}catch(c){}var r=s.call(t);return i&&(e?t[o]=n:delete t[o]),r};var l=Object.prototype.toString;const h=function(t){return l.call(t)};var u=i.Z?i.Z.toStringTag:void 0;const d=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":u&&u in Object(t)?c(t):h(t)}},4765:(t,e,n)=>{"use strict";n.d(e,{Z:()=>H});var i=n(1667),r=n(3001);const a=function(t,e){for(var n=-1,i=null==t?0:t.length;++n<i;)if(e(t[n],n,t))return!0;return!1};var s=n(9548);const o=function(t,e,n,i,o,c){var l=1&n,h=t.length,u=e.length;if(h!=u&&!(l&&u>h))return!1;var d=c.get(t),p=c.get(e);if(d&&p)return d==e&&p==t;var f=-1,g=!0,y=2&n?new r.Z:void 0;for(c.set(t,e),c.set(e,t);++f<h;){var m=t[f],b=e[f];if(i)var _=l?i(b,m,f,e,t,c):i(m,b,f,t,e,c);if(void 0!==_){if(_)continue;g=!1;break}if(y){if(!a(e,(function(t,e){if(!(0,s.Z)(y,e)&&(m===t||o(m,t,n,i,c)))return y.push(e)}))){g=!1;break}}else if(m!==b&&!o(m,b,n,i,c)){g=!1;break}}return c.delete(t),c.delete(e),g};var c=n(7685),l=n(7623),h=n(9651);const u=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t,i){n[++e]=[i,t]})),n};var d=n(6545),p=c.Z?c.Z.prototype:void 0,f=p?p.valueOf:void 0;const g=function(t,e,n,i,r,a,s){switch(n){case"[object DataView]":if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case"[object ArrayBuffer]":return!(t.byteLength!=e.byteLength||!a(new l.Z(t),new l.Z(e)));case"[object Boolean]":case"[object Date]":case"[object Number]":return(0,h.Z)(+t,+e);case"[object Error]":return t.name==e.name&&t.message==e.message;case"[object RegExp]":case"[object String]":return t==e+"";case"[object Map]":var c=u;case"[object Set]":var p=1&i;if(c||(c=d.Z),t.size!=e.size&&!p)return!1;var g=s.get(t);if(g)return g==e;i|=2,s.set(t,e);var y=o(c(t),c(e),i,r,a,s);return s.delete(t),y;case"[object Symbol]":if(f)return f.call(t)==f.call(e)}return!1};var y=n(1808),m=Object.prototype.hasOwnProperty;const b=function(t,e,n,i,r,a){var s=1&n,o=(0,y.Z)(t),c=o.length;if(c!=(0,y.Z)(e).length&&!s)return!1;for(var l=c;l--;){var h=o[l];if(!(s?h in e:m.call(e,h)))return!1}var u=a.get(t),d=a.get(e);if(u&&d)return u==e&&d==t;var p=!0;a.set(t,e),a.set(e,t);for(var f=s;++l<c;){var g=t[h=o[l]],b=e[h];if(i)var _=s?i(b,g,h,e,t,a):i(g,b,h,t,e,a);if(!(void 0===_?g===b||r(g,b,n,i,a):_)){p=!1;break}f||(f="constructor"==h)}if(p&&!f){var x=t.constructor,v=e.constructor;x==v||!("constructor"in t)||!("constructor"in e)||"function"==typeof x&&x instanceof x&&"function"==typeof v&&v instanceof v||(p=!1)}return a.delete(t),a.delete(e),p};var _=n(3970),x=n(7771),v=n(7008),k=n(8843),w="[object Arguments]",C="[object Array]",T="[object Object]",E=Object.prototype.hasOwnProperty;const S=function(t,e,n,r,a,s){var c=(0,x.Z)(t),l=(0,x.Z)(e),h=c?C:(0,_.Z)(t),u=l?C:(0,_.Z)(e),d=(h=h==w?T:h)==T,p=(u=u==w?T:u)==T,f=h==u;if(f&&(0,v.Z)(t)){if(!(0,v.Z)(e))return!1;c=!0,d=!1}if(f&&!d)return s||(s=new i.Z),c||(0,k.Z)(t)?o(t,e,n,r,a,s):g(t,e,h,n,r,a,s);if(!(1&n)){var y=d&&E.call(t,"__wrapped__"),m=p&&E.call(e,"__wrapped__");if(y||m){var S=y?t.value():t,A=m?e.value():e;return s||(s=new i.Z),a(S,A,n,r,s)}}return!!f&&(s||(s=new i.Z),b(t,e,n,r,a,s))};var A=n(8533);const L=function t(e,n,i,r,a){return e===n||(null==e||null==n||!(0,A.Z)(e)&&!(0,A.Z)(n)?e!=e&&n!=n:S(e,n,i,r,t,a))};const B=function(t,e,n,r){var a=n.length,s=a,o=!r;if(null==t)return!s;for(t=Object(t);a--;){var c=n[a];if(o&&c[2]?c[1]!==t[c[0]]:!(c[0]in t))return!1}for(;++a<s;){var l=(c=n[a])[0],h=t[l],u=c[1];if(o&&c[2]){if(void 0===h&&!(l in t))return!1}else{var d=new i.Z;if(r)var p=r(h,u,l,t,e,d);if(!(void 0===p?L(u,h,3,r,d):p))return!1}}return!0};var N=n(7226);const D=function(t){return t==t&&!(0,N.Z)(t)};var O=n(7179);const M=function(t){for(var e=(0,O.Z)(t),n=e.length;n--;){var i=e[n],r=t[i];e[n]=[i,r,D(r)]}return e};const I=function(t,e){return function(n){return null!=n&&(n[t]===e&&(void 0!==e||t in Object(n)))}};const F=function(t){var e=M(t);return 1==e.length&&e[0][2]?I(e[0][0],e[0][1]):function(n){return n===t||B(n,t,e)}};var $=n(3317);const R=function(t,e,n){var i=null==t?void 0:(0,$.Z)(t,e);return void 0===i?n:i};var Z=n(5487),P=n(9365),j=n(2281);const Y=function(t,e){return(0,P.Z)(t)&&D(e)?I((0,j.Z)(t),e):function(n){var i=R(n,t);return void 0===i&&i===e?(0,Z.Z)(n,t):L(e,i,3)}};var z=n(9203),U=n(4193);const W=function(t){return function(e){return(0,$.Z)(e,t)}};const q=function(t){return(0,P.Z)(t)?(0,U.Z)((0,j.Z)(t)):W(t)};const H=function(t){return"function"==typeof t?t:null==t?z.Z:"object"==typeof t?(0,x.Z)(t)?Y(t[0],t[1]):F(t):q(t)}},9473:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(2764);const r=(0,n(1851).Z)(Object.keys,Object);var a=Object.prototype.hasOwnProperty;const s=function(t){if(!(0,i.Z)(t))return r(t);var e=[];for(var n in Object(t))a.call(t,n)&&"constructor"!=n&&e.push(n);return e}},1018:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(9811),r=n(585);const a=function(t,e){var n=-1,a=(0,r.Z)(t)?Array(t.length):[];return(0,i.Z)(t,(function(t,i,r){a[++n]=e(t,i,r)})),a}},4193:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return function(e){return null==e?void 0:e[t]}}},9581:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(9203),r=n(1211),a=n(7227);const s=function(t,e){return(0,a.Z)((0,r.Z)(t,e,i.Z),t+"")}},1162:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return function(e){return t(e)}}},9548:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){return t.has(e)}},8882:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(9203);const r=function(t){return"function"==typeof t?t:i.Z}},2823:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(7771),r=n(9365),a=n(2454);var s=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g;const c=function(t){var e=(0,a.Z)(t,(function(t){return 500===n.size&&n.clear(),t})),n=e.cache;return e}((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(s,(function(t,n,i,r){e.push(i?r.replace(o,"$1"):n||t)})),e}));var l=n(751);const h=function(t,e){return(0,i.Z)(t)?t:(0,r.Z)(t,e)?[t]:c((0,l.Z)(t))}},1884:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(7623);const r=function(t){var e=new t.constructor(t.byteLength);return new i.Z(e).set(new i.Z(t)),e}},1050:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(6092),r="object"==typeof exports&&exports&&!exports.nodeType&&exports,a=r&&"object"==typeof module&&module&&!module.nodeType&&module,s=a&&a.exports===r?i.Z.Buffer:void 0,o=s?s.allocUnsafe:void 0;const c=function(t,e){if(e)return t.slice();var n=t.length,i=o?o(n):new t.constructor(n);return t.copy(i),i}},2701:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(1884);const r=function(t,e){var n=e?(0,i.Z)(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}},7215:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){var n=-1,i=t.length;for(e||(e=Array(i));++n<i;)e[n]=t[n];return e}},1899:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(2954),r=n(4752);const a=function(t,e,n,a){var s=!n;n||(n={});for(var o=-1,c=e.length;++o<c;){var l=e[o],h=a?a(n[l],t[l],l,n,t):void 0;void 0===h&&(h=t[l]),s?(0,r.Z)(n,l,h):(0,i.Z)(n,l,h)}return n}},7904:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(2508);const r=function(){try{var t=(0,i.Z)(Object,"defineProperty");return t({},"",{}),t}catch(e){}}()},3413:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i="object"==typeof global&&global&&global.Object===Object&&global},1808:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(3327),r=n(5695),a=n(7179);const s=function(t){return(0,i.Z)(t,a.Z,r.Z)}},2508:(t,e,n)=>{"use strict";n.d(e,{Z:()=>b});var i=n(3234);const r=n(6092).Z["__core-js_shared__"];var a,s=(a=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||""))?"Symbol(src)_1."+a:"";const o=function(t){return!!s&&s in t};var c=n(7226),l=n(19),h=/^\[object .+?Constructor\]$/,u=Function.prototype,d=Object.prototype,p=u.toString,f=d.hasOwnProperty,g=RegExp("^"+p.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const y=function(t){return!(!(0,c.Z)(t)||o(t))&&((0,i.Z)(t)?g:h).test((0,l.Z)(t))};const m=function(t,e){return null==t?void 0:t[e]};const b=function(t,e){var n=m(t,e);return y(n)?n:void 0}},2513:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=(0,n(1851).Z)(Object.getPrototypeOf,Object)},5695:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(8774),r=n(532),a=Object.prototype.propertyIsEnumerable,s=Object.getOwnPropertySymbols;const o=s?function(t){return null==t?[]:(t=Object(t),(0,i.Z)(s(t),(function(e){return a.call(t,e)})))}:r.Z},3970:(t,e,n)=>{"use strict";n.d(e,{Z:()=>w});var i=n(2508),r=n(6092);const a=(0,i.Z)(r.Z,"DataView");var s=n(6183);const o=(0,i.Z)(r.Z,"Promise");var c=n(3203);const l=(0,i.Z)(r.Z,"WeakMap");var h=n(3589),u=n(19),d="[object Map]",p="[object Promise]",f="[object Set]",g="[object WeakMap]",y="[object DataView]",m=(0,u.Z)(a),b=(0,u.Z)(s.Z),_=(0,u.Z)(o),x=(0,u.Z)(c.Z),v=(0,u.Z)(l),k=h.Z;(a&&k(new a(new ArrayBuffer(1)))!=y||s.Z&&k(new s.Z)!=d||o&&k(o.resolve())!=p||c.Z&&k(new c.Z)!=f||l&&k(new l)!=g)&&(k=function(t){var e=(0,h.Z)(t),n="[object Object]"==e?t.constructor:void 0,i=n?(0,u.Z)(n):"";if(i)switch(i){case m:return y;case b:return d;case _:return p;case x:return f;case v:return g}return e});const w=k},6174:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(2823),r=n(9169),a=n(7771),s=n(6009),o=n(1656),c=n(2281);const l=function(t,e,n){for(var l=-1,h=(e=(0,i.Z)(e,t)).length,u=!1;++l<h;){var d=(0,c.Z)(e[l]);if(!(u=null!=t&&n(t,d)))break;t=t[d]}return u||++l!=h?u:!!(h=null==t?0:t.length)&&(0,o.Z)(h)&&(0,s.Z)(d,h)&&((0,a.Z)(t)||(0,r.Z)(t))}},3658:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(7226),r=Object.create;const a=function(){function t(){}return function(e){if(!(0,i.Z)(e))return{};if(r)return r(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();var s=n(2513),o=n(2764);const c=function(t){return"function"!=typeof t.constructor||(0,o.Z)(t)?{}:a((0,s.Z)(t))}},6009:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=/^(?:0|[1-9]\d*)$/;const r=function(t,e){var n=typeof t;return!!(e=null==e?9007199254740991:e)&&("number"==n||"symbol"!=n&&i.test(t))&&t>-1&&t%1==0&&t<e}},439:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(9651),r=n(585),a=n(6009),s=n(7226);const o=function(t,e,n){if(!(0,s.Z)(n))return!1;var o=typeof e;return!!("number"==o?(0,r.Z)(n)&&(0,a.Z)(e,n.length):"string"==o&&e in n)&&(0,i.Z)(n[e],t)}},9365:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(7771),r=n(2714),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,s=/^\w*$/;const o=function(t,e){if((0,i.Z)(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!(0,r.Z)(t))||(s.test(t)||!a.test(t)||null!=e&&t in Object(e))}},2764:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=Object.prototype;const r=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||i)}},8351:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(3413),r="object"==typeof exports&&exports&&!exports.nodeType&&exports,a=r&&"object"==typeof module&&module&&!module.nodeType&&module,s=a&&a.exports===r&&i.Z.process;const o=function(){try{var t=a&&a.require&&a.require("util").types;return t||s&&s.binding&&s.binding("util")}catch(e){}}()},1851:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){return function(n){return t(e(n))}}},1211:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});const i=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)};var r=Math.max;const a=function(t,e,n){return e=r(void 0===e?t.length-1:e,0),function(){for(var a=arguments,s=-1,o=r(a.length-e,0),c=Array(o);++s<o;)c[s]=a[e+s];s=-1;for(var l=Array(e+1);++s<e;)l[s]=a[s];return l[e]=n(c),i(t,this,l)}}},6092:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(3413),r="object"==typeof self&&self&&self.Object===Object&&self;const a=i.Z||r||Function("return this")()},6545:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t){n[++e]=t})),n}},7227:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(2002),r=n(7904),a=n(9203);const s=r.Z?function(t,e){return(0,r.Z)(t,"toString",{configurable:!0,enumerable:!1,value:(0,i.Z)(e),writable:!0})}:a.Z;var o=Date.now;const c=function(t){var e=0,n=0;return function(){var i=o(),r=16-(i-n);if(n=i,r>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}(s)},2281:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(2714);const r=function(t){if("string"==typeof t||(0,i.Z)(t))return t;var e=t+"";return"0"==e&&1/t==-Infinity?"-0":e}},19:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=Function.prototype.toString;const r=function(t){if(null!=t){try{return i.call(t)}catch(e){}try{return t+""}catch(e){}}return""}},2002:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return function(){return t}}},3688:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(9581),r=n(9651),a=n(439),s=n(2957),o=Object.prototype,c=o.hasOwnProperty;const l=(0,i.Z)((function(t,e){t=Object(t);var n=-1,i=e.length,l=i>2?e[2]:void 0;for(l&&(0,a.Z)(e[0],e[1],l)&&(i=1);++n<i;)for(var h=e[n],u=(0,s.Z)(h),d=-1,p=u.length;++d<p;){var f=u[d],g=t[f];(void 0===g||(0,r.Z)(g,o[f])&&!c.call(t,f))&&(t[f]=h[f])}return t}))},9651:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t,e){return t===e||t!=t&&e!=e}},3445:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(8774),r=n(9811);const a=function(t,e){var n=[];return(0,r.Z)(t,(function(t,i,r){e(t,i,r)&&n.push(t)})),n};var s=n(4765),o=n(7771);const c=function(t,e){return((0,o.Z)(t)?i.Z:a)(t,(0,s.Z)(e,3))}},7961:(t,e,n)=>{"use strict";n.d(e,{Z:()=>r});var i=n(626);const r=function(t){return(null==t?0:t.length)?(0,i.Z)(t,1):[]}},870:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(6579),r=n(9811),a=n(8882),s=n(7771);const o=function(t,e){return((0,s.Z)(t)?i.Z:r.Z)(t,(0,a.Z)(e))}},5123:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=Object.prototype.hasOwnProperty;const r=function(t,e){return null!=t&&i.call(t,e)};var a=n(6174);const s=function(t,e){return null!=t&&(0,a.Z)(t,e,r)}},5487:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});const i=function(t,e){return null!=t&&e in Object(t)};var r=n(6174);const a=function(t,e){return null!=t&&(0,r.Z)(t,e,i)}},9203:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return t}},9169:(t,e,n)=>{"use strict";n.d(e,{Z:()=>l});var i=n(3589),r=n(8533);const a=function(t){return(0,r.Z)(t)&&"[object Arguments]"==(0,i.Z)(t)};var s=Object.prototype,o=s.hasOwnProperty,c=s.propertyIsEnumerable;const l=a(function(){return arguments}())?a:function(t){return(0,r.Z)(t)&&o.call(t,"callee")&&!c.call(t,"callee")}},7771:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=Array.isArray},585:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(3234),r=n(1656);const a=function(t){return null!=t&&(0,r.Z)(t.length)&&!(0,i.Z)(t)}},836:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(585),r=n(8533);const a=function(t){return(0,r.Z)(t)&&(0,i.Z)(t)}},7008:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=n(6092);const r=function(){return!1};var a="object"==typeof exports&&exports&&!exports.nodeType&&exports,s=a&&"object"==typeof module&&module&&!module.nodeType&&module,o=s&&s.exports===a?i.Z.Buffer:void 0;const c=(o?o.isBuffer:void 0)||r},9697:(t,e,n)=>{"use strict";n.d(e,{Z:()=>d});var i=n(9473),r=n(3970),a=n(9169),s=n(7771),o=n(585),c=n(7008),l=n(2764),h=n(8843),u=Object.prototype.hasOwnProperty;const d=function(t){if(null==t)return!0;if((0,o.Z)(t)&&((0,s.Z)(t)||"string"==typeof t||"function"==typeof t.splice||(0,c.Z)(t)||(0,h.Z)(t)||(0,a.Z)(t)))return!t.length;var e=(0,r.Z)(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if((0,l.Z)(t))return!(0,i.Z)(t).length;for(var n in t)if(u.call(t,n))return!1;return!0}},3234:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(3589),r=n(7226);const a=function(t){if(!(0,r.Z)(t))return!1;var e=(0,i.Z)(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},1656:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},7226:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},8533:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return null!=t&&"object"==typeof t}},7514:(t,e,n)=>{"use strict";n.d(e,{Z:()=>u});var i=n(3589),r=n(2513),a=n(8533),s=Function.prototype,o=Object.prototype,c=s.toString,l=o.hasOwnProperty,h=c.call(Object);const u=function(t){if(!(0,a.Z)(t)||"[object Object]"!=(0,i.Z)(t))return!1;var e=(0,r.Z)(t);if(null===e)return!0;var n=l.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&c.call(n)==h}},2714:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(3589),r=n(8533);const a=function(t){return"symbol"==typeof t||(0,r.Z)(t)&&"[object Symbol]"==(0,i.Z)(t)}},8843:(t,e,n)=>{"use strict";n.d(e,{Z:()=>u});var i=n(3589),r=n(1656),a=n(8533),s={};s["[object Float32Array]"]=s["[object Float64Array]"]=s["[object Int8Array]"]=s["[object Int16Array]"]=s["[object Int32Array]"]=s["[object Uint8Array]"]=s["[object Uint8ClampedArray]"]=s["[object Uint16Array]"]=s["[object Uint32Array]"]=!0,s["[object Arguments]"]=s["[object Array]"]=s["[object ArrayBuffer]"]=s["[object Boolean]"]=s["[object DataView]"]=s["[object Date]"]=s["[object Error]"]=s["[object Function]"]=s["[object Map]"]=s["[object Number]"]=s["[object Object]"]=s["[object RegExp]"]=s["[object Set]"]=s["[object String]"]=s["[object WeakMap]"]=!1;const o=function(t){return(0,a.Z)(t)&&(0,r.Z)(t.length)&&!!s[(0,i.Z)(t)]};var c=n(1162),l=n(8351),h=l.Z&&l.Z.isTypedArray;const u=h?(0,c.Z)(h):o},9360:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(t){return void 0===t}},7179:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(7668),r=n(9473),a=n(585);const s=function(t){return(0,a.Z)(t)?(0,i.Z)(t):(0,r.Z)(t)}},2957:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(7668),r=n(7226),a=n(2764);const s=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e};var o=Object.prototype.hasOwnProperty;const c=function(t){if(!(0,r.Z)(t))return s(t);var e=(0,a.Z)(t),n=[];for(var i in t)("constructor"!=i||!e&&o.call(t,i))&&n.push(i);return n};var l=n(585);const h=function(t){return(0,l.Z)(t)?(0,i.Z)(t,!0):c(t)}},3836:(t,e,n)=>{"use strict";n.d(e,{Z:()=>o});var i=n(4073),r=n(4765),a=n(1018),s=n(7771);const o=function(t,e){return((0,s.Z)(t)?i.Z:a.Z)(t,(0,r.Z)(e,3))}},2454:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(7834);function r(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var i=arguments,r=e?e.apply(this,i):i[0],a=n.cache;if(a.has(r))return a.get(r);var s=t.apply(this,i);return n.cache=a.set(r,s)||a,s};return n.cache=new(r.Cache||i.Z),n}r.Cache=i.Z;const a=r},1666:(t,e,n)=>{"use strict";n.d(e,{Z:()=>y});var i=n(3317),r=n(2954),a=n(2823),s=n(6009),o=n(7226),c=n(2281);const l=function(t,e,n,i){if(!(0,o.Z)(t))return t;for(var l=-1,h=(e=(0,a.Z)(e,t)).length,u=h-1,d=t;null!=d&&++l<h;){var p=(0,c.Z)(e[l]),f=n;if("__proto__"===p||"constructor"===p||"prototype"===p)return t;if(l!=u){var g=d[p];void 0===(f=i?i(g,p,d):void 0)&&(f=(0,o.Z)(g)?g:(0,s.Z)(e[l+1])?[]:{})}(0,r.Z)(d,p,f),d=d[p]}return t};const h=function(t,e,n){for(var r=-1,s=e.length,o={};++r<s;){var c=e[r],h=(0,i.Z)(t,c);n(h,c)&&l(o,(0,a.Z)(c,t),h)}return o};var u=n(5487);const d=function(t,e){return h(t,e,(function(e,n){return(0,u.Z)(t,n)}))};var p=n(7961),f=n(1211),g=n(7227);const y=function(t){return(0,g.Z)((0,f.Z)(t,void 0,p.Z),t+"")}((function(t,e){return null==t?{}:d(t,e)}))},4379:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var i=Math.ceil,r=Math.max;const a=function(t,e,n,a){for(var s=-1,o=r(i((e-t)/(n||1)),0),c=Array(o);o--;)c[a?o:++s]=t,t+=n;return c};var s=n(439),o=n(4099);const c=function(t){return function(e,n,i){return i&&"number"!=typeof i&&(0,s.Z)(e,n,i)&&(n=i=void 0),e=(0,o.Z)(e),void 0===n?(n=e,e=0):n=(0,o.Z)(n),i=void 0===i?e<n?1:-1:(0,o.Z)(i),a(e,n,i,t)}}()},2344:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});const i=function(t,e,n,i){var r=-1,a=null==t?0:t.length;for(i&&a&&(n=t[++r]);++r<a;)n=e(n,t[r],r,t);return n};var r=n(9811),a=n(4765);const s=function(t,e,n,i,r){return r(t,(function(t,r,a){n=i?(i=!1,t):e(n,t,r,a)})),n};var o=n(7771);const c=function(t,e,n){var c=(0,o.Z)(t)?i:s,l=arguments.length<3;return c(t,(0,a.Z)(e,4),n,l,r.Z)}},532:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});const i=function(){return[]}},4099:(t,e,n)=>{"use strict";n.d(e,{Z:()=>g});var i=/\s/;const r=function(t){for(var e=t.length;e--&&i.test(t.charAt(e)););return e};var a=/^\s+/;const s=function(t){return t?t.slice(0,r(t)+1).replace(a,""):t};var o=n(7226),c=n(2714),l=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,u=/^0o[0-7]+$/i,d=parseInt;const p=function(t){if("number"==typeof t)return t;if((0,c.Z)(t))return NaN;if((0,o.Z)(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=(0,o.Z)(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=s(t);var n=h.test(t);return n||u.test(t)?d(t.slice(2),n?2:8):l.test(t)?NaN:+t};var f=1/0;const g=function(t){return t?(t=p(t))===f||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}},751:(t,e,n)=>{"use strict";n.d(e,{Z:()=>h});var i=n(7685),r=n(4073),a=n(7771),s=n(2714),o=i.Z?i.Z.prototype:void 0,c=o?o.toString:void 0;const l=function t(e){if("string"==typeof e)return e;if((0,a.Z)(e))return(0,r.Z)(e,t)+"";if((0,s.Z)(e))return c?c.call(e):"";var n=e+"";return"0"==n&&1/e==-Infinity?"-0":n};const h=function(t){return null==t?"":l(t)}},6749:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});var i=n(751),r=0;const a=function(t){var e=++r;return(0,i.Z)(t)+e}},4148:(t,e,n)=>{"use strict";n.d(e,{Z:()=>s});var i=n(4073);const r=function(t,e){return(0,i.Z)(e,(function(e){return t[e]}))};var a=n(7179);const s=function(t){return null==t?[]:r(t,(0,a.Z)(t))}}}]); \ No newline at end of file diff --git a/assets/js/8954.296edd99.js.LICENSE.txt b/assets/js/8954.296edd99.js.LICENSE.txt new file mode 100644 index 0000000..f253ee2 --- /dev/null +++ b/assets/js/8954.296edd99.js.LICENSE.txt @@ -0,0 +1,9 @@ +/*! + * Wait for document loaded before starting the execution + */ + +/*! @license DOMPurify 2.4.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.4.3/LICENSE */ + +/*! Check if previously processed */ + +/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */ diff --git a/assets/js/8b1802c5.6f267f4c.js b/assets/js/8b1802c5.6f267f4c.js new file mode 100644 index 0000000..45b3d2b --- /dev/null +++ b/assets/js/8b1802c5.6f267f4c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8480],{832:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/advent-of-code","page":1,"postsPerPage":10,"totalPages":1,"totalCount":5,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/8c0e532b.9cbc1be0.js b/assets/js/8c0e532b.9cbc1be0.js new file mode 100644 index 0000000..b0d81cb --- /dev/null +++ b/assets/js/8c0e532b.9cbc1be0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[822],{3968:s=>{s.exports=JSON.parse('{"label":"vps","permalink":"/blog/tags/vps","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/8e1fadd0.b5230023.js b/assets/js/8e1fadd0.b5230023.js new file mode 100644 index 0000000..699ba58 --- /dev/null +++ b/assets/js/8e1fadd0.b5230023.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6554],{9278:e=>{e.exports=JSON.parse('{"title":"Algorithms and Correctness","description":"Materials related to basic ideas behind algorithms and proofs of their\\ncorrectness.\\n","slug":"/category/algorithms-and-correctness","permalink":"/ib002/category/algorithms-and-correctness","navigation":{"previous":{"title":"Introduction","permalink":"/ib002/"},"next":{"title":"Vague postconditions and proving correctness of algorithms","permalink":"/ib002/algorithms-correctness/postcondition-ambiguity"}}}')}}]); \ No newline at end of file diff --git a/assets/js/90425ffc.955d8c56.js b/assets/js/90425ffc.955d8c56.js new file mode 100644 index 0000000..df40a0c --- /dev/null +++ b/assets/js/90425ffc.955d8c56.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8769],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var a=n(7294);function o(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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},m=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,m=s(e,["components","mdxType","originalType","parentName"]),u=p(n),d=o,h=u["".concat(l,".").concat(d)]||u[d]||c[d]||i;return n?a.createElement(h,r(r({ref:t},m),{},{components:n})):a.createElement(h,r({ref:t},m))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,r[1]=s;for(var p=2;p<i;p++)r[p]=n[p];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}d.displayName="MDXCreateElement"},3167:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const i={id:"seminar-03",title:"3rd seminar",description:"Select sort implementation on arrays.\n",last_update:{date:new Date("2023-03-07T00:00:00.000Z")}},r=void 0,s={unversionedId:"bonuses/seminar-03",id:"bonuses/seminar-03",title:"3rd seminar",description:"Select sort implementation on arrays.\n",source:"@site/pb071/bonuses/03.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-03",permalink:"/pb071/bonuses/seminar-03",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/bonuses/03.md",tags:[],version:"current",lastUpdatedAt:1678147200,formattedLastUpdatedAt:"Mar 7, 2023",frontMatter:{id:"seminar-03",title:"3rd seminar",description:"Select sort implementation on arrays.\n",last_update:{date:"2023-03-07T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Bonuses",permalink:"/pb071/category/bonuses"},next:{title:"4th seminar",permalink:"/pb071/bonuses/seminar-04"}},l={},p=[{value:"Light version (<code>main_light.c</code>)",id:"light-version-main_lightc",level:2},{value:"Full fat version (<code>main.c</code>)",id:"full-fat-version-mainc",level:2},{value:"Submitting",id:"submitting",level:2}],m={toc:p},u="wrapper";function c(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Deadline for the submission of the bonus is ",(0,o.kt)("strong",{parentName:"p"},"March 16th 24:00"),".")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In case you have any questions, feel free to reach out either by email, Discord\nor just by submitting an issue ",(0,o.kt)("a",{parentName:"p",href:"https://gitlab.fi.muni.cz/xfocko/kb/-/issues/new"},"here"),".")),(0,o.kt)("p",null,"This assignment has two versions. For the light version you can get 1.5 K\u20a1. For\nthe ",(0,o.kt)("em",{parentName:"p"},"full fat")," 3 K\u20a1. ",(0,o.kt)("strong",{parentName:"p"},"You can choose only one of them"),"."),(0,o.kt)("p",null,"To both of them you are given some basic tests. You can also have a look at the\ncode used by the tests and use it to your advantage."),(0,o.kt)("p",null,"Details can be found in the doxygen comments included in the source files."),(0,o.kt)("h2",{id:"light-version-main_lightc"},"Light version (",(0,o.kt)("inlineCode",{parentName:"h2"},"main_light.c"),")"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"pathname:///files/pb071/bonuses/03/main_light.c"},"Source")),(0,o.kt)("p",null,"For the light version you have 3 functions to finish:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"swap")," - that swaps two ints passed by pointers."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"maximum")," - that returns index of the biggest ",(0,o.kt)("inlineCode",{parentName:"li"},"int")," in the array."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"select_sort")," - that sorts passed array using Select Sort.")),(0,o.kt)("h2",{id:"full-fat-version-mainc"},"Full fat version (",(0,o.kt)("inlineCode",{parentName:"h2"},"main.c"),")"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"pathname:///files/pb071/bonuses/03/main.c"},"Source")),(0,o.kt)("p",null,"For the full fat version you have 4 functions to implement:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"swap")," - that swaps two variables passed by pointers."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"maximum")," - that returns index of the biggest element in the array using the\ncomparator."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"select_sort")," - that sorts passed array using Select Sort."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"int_comparator")," - that is used for generic sort and maximum")),(0,o.kt)("p",null,"To 2nd and 3rd function you are given a pseudocode that you can use to implement\nit."),(0,o.kt)("admonition",{title:"Function pointers",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"In the skeleton of the \u201cfull fat\u201d version you might have noticed a weird type\nsignature of both the ",(0,o.kt)("inlineCode",{parentName:"p"},"maximum")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"select_sort")," functions. Those functions get\npassed a ",(0,o.kt)("em",{parentName:"p"},"function pointer")," to the comparator that you use for comparing the\nrespective elements in the passed in array."),(0,o.kt)("p",{parentName:"admonition"},"If we take the parameter from one of the functions from the skeleton:"),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre",className:"language-c"},"int (*comp)(const void *, const void *)\n")),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"comp")," is a function pointer to a function that takes two pointers of unspecified\ntype, i.e. pure address to the memory (you don't know what stored in there), and\nreturns an ",(0,o.kt)("inlineCode",{parentName:"p"},"int"),"."),(0,o.kt)("p",{parentName:"admonition"},"You can pass the function by simply using its name. (There is no need to use ",(0,o.kt)("inlineCode",{parentName:"p"},"&"),"\nto get its address.) And you can also call the function by \u201ccalling\u201d the function\npointer, e.g. ",(0,o.kt)("inlineCode",{parentName:"p"},"comp(left, right)"),".")),(0,o.kt)("h2",{id:"submitting"},"Submitting"),(0,o.kt)("p",null,"For submitting the bonus assignment you can follow the same procedure as for\nsubmitting the homeworks, that is:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"On branch ",(0,o.kt)("inlineCode",{parentName:"li"},"main")," add the provided skeleton."),(0,o.kt)("li",{parentName:"ol"},"Checkout new branch ",(0,o.kt)("inlineCode",{parentName:"li"},"seminar-bonus-03"),"."),(0,o.kt)("li",{parentName:"ol"},"Add your solution to the newly created branch."),(0,o.kt)("li",{parentName:"ol"},"Create a MR to the ",(0,o.kt)("inlineCode",{parentName:"li"},"main")," branch with me (",(0,o.kt)("inlineCode",{parentName:"li"},"@xfocko"),") as the reviewer.")),(0,o.kt)("admonition",{title:"Directory structure for bonuses",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Ideally create a directory ",(0,o.kt)("inlineCode",{parentName:"p"},"seminar-bonuses")," in the root of your repository with\nbonuses in their own subdirectories."),(0,o.kt)("p",{parentName:"admonition"},"Structure of your repository can look like this:"),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre"},".\n\u251c\u2500\u2500 bonuses\n\u2502 \u2514\u2500\u2500 seminar-03\n\u251c\u2500\u2500 hello\n\u251c\u2500\u2500 hw01\n\u251c\u2500\u2500 hw02\n\u251c\u2500\u2500 seminar-01\n\u251c\u2500\u2500 seminar-02\n\u2514\u2500\u2500 seminar-03\n")),(0,o.kt)("p",{parentName:"admonition"},"or"),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre"},".\n\u251c\u2500\u2500 bonus-seminar-03\n\u251c\u2500\u2500 hello\n\u251c\u2500\u2500 hw01\n\u251c\u2500\u2500 hw02\n\u251c\u2500\u2500 seminar-01\n\u251c\u2500\u2500 seminar-02\n\u2514\u2500\u2500 seminar-03\n")),(0,o.kt)("p",{parentName:"admonition"},"Structure of the bonuses is entirely up to you, just keep it consistent.")))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9287eafd.8885dd15.js b/assets/js/9287eafd.8885dd15.js new file mode 100644 index 0000000..7671475 --- /dev/null +++ b/assets/js/9287eafd.8885dd15.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5521],{716:s=>{s.exports=JSON.parse('{"label":"rust","permalink":"/blog/tags/rust","allTagsPath":"/blog/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/94036ea2.8be2e014.js b/assets/js/94036ea2.8be2e014.js new file mode 100644 index 0000000..63fcead --- /dev/null +++ b/assets/js/94036ea2.8be2e014.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4477],{6996:e=>{e.exports=JSON.parse('{"pluginId":"pb161","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"autogeneratedBar":[{"type":"link","label":"Introduction","href":"/pb161/","docId":"pb161-intro"},{"type":"link","label":"Environment","href":"/pb161/environment","docId":"environment"}]},"docs":{"environment":{"id":"environment","title":"Environment","description":"Suggestions for setting up a local environment for C++ course.\\n","sidebar":"autogeneratedBar"},"pb161-intro":{"id":"pb161-intro","title":"Introduction","description":"","sidebar":"autogeneratedBar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/9487.b3a824a3.js b/assets/js/9487.b3a824a3.js new file mode 100644 index 0000000..ac76972 --- /dev/null +++ b/assets/js/9487.b3a824a3.js @@ -0,0 +1 @@ +(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9487],{7295:(n,t,e)=>{n.exports=function(){function n(t,e,i){function r(a,u){if(!e[a]){if(!t[a]){if(c)return c(a,!0);var o=new Error("Cannot find module '"+a+"'");throw o.code="MODULE_NOT_FOUND",o}var s=e[a]={exports:{}};t[a][0].call(s.exports,(function(n){return r(t[a][1][n]||n)}),s,s.exports,n,t,e,i)}return e[a].exports}for(var c=void 0,a=0;a<i.length;a++)r(i[a]);return r}return n}()({1:[function(n,t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function n(n,t){for(var e=0;e<t.length;e++){var i=t[e];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(n,i.key,i)}}return function(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}}();function r(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}var c=function(){function n(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=e.defaultLayoutOptions,c=void 0===i?{}:i,u=e.algorithms,o=void 0===u?["layered","stress","mrtree","radial","force","disco","sporeOverlap","sporeCompaction","rectpacking"]:u,s=e.workerFactory,h=e.workerUrl;if(r(this,n),this.defaultLayoutOptions=c,this.initialized=!1,void 0===h&&void 0===s)throw new Error("Cannot construct an ELK without both 'workerUrl' and 'workerFactory'.");var f=s;void 0!==h&&void 0===s&&(f=function(n){return new Worker(n)});var l=f(h);if("function"!=typeof l.postMessage)throw new TypeError("Created worker does not provide the required 'postMessage' function.");this.worker=new a(l),this.worker.postMessage({cmd:"register",algorithms:o}).then((function(n){return t.initialized=!0})).catch(console.err)}return i(n,[{key:"layout",value:function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=t.layoutOptions,i=void 0===e?this.defaultLayoutOptions:e,r=t.logging,c=void 0!==r&&r,a=t.measureExecutionTime,u=void 0!==a&&a;return n?this.worker.postMessage({cmd:"layout",graph:n,layoutOptions:i,options:{logging:c,measureExecutionTime:u}}):Promise.reject(new Error("Missing mandatory parameter 'graph'."))}},{key:"knownLayoutAlgorithms",value:function(){return this.worker.postMessage({cmd:"algorithms"})}},{key:"knownLayoutOptions",value:function(){return this.worker.postMessage({cmd:"options"})}},{key:"knownLayoutCategories",value:function(){return this.worker.postMessage({cmd:"categories"})}},{key:"terminateWorker",value:function(){this.worker.terminate()}}]),n}();e.default=c;var a=function(){function n(t){var e=this;if(r(this,n),void 0===t)throw new Error("Missing mandatory parameter 'worker'.");this.resolvers={},this.worker=t,this.worker.onmessage=function(n){setTimeout((function(){e.receive(e,n)}),0)}}return i(n,[{key:"postMessage",value:function(n){var t=this.id||0;this.id=t+1,n.id=t;var e=this;return new Promise((function(i,r){e.resolvers[t]=function(n,t){n?(e.convertGwtStyleError(n),r(n)):i(t)},e.worker.postMessage(n)}))}},{key:"receive",value:function(n,t){var e=t.data,i=n.resolvers[e.id];i&&(delete n.resolvers[e.id],e.error?i(e.error):i(null,e.data))}},{key:"terminate",value:function(){this.worker.terminate&&this.worker.terminate()}},{key:"convertGwtStyleError",value:function(n){if(n){var t=n.__java$exception;t&&(t.cause&&t.cause.backingJsObject&&(n.cause=t.cause.backingJsObject,this.convertGwtStyleError(n.cause)),delete n.__java$exception)}}}]),n}()},{}],2:[function(n,t,i){(function(n){(function(){"use strict";var e;function r(){}function c(){}function a(){}function u(){}function o(){}function s(){}function h(){}function f(){}function l(){}function b(){}function w(){}function d(){}function g(){}function p(){}function v(){}function m(){}function y(){}function k(){}function j(){}function E(){}function T(){}function M(){}function S(){}function P(){}function C(){}function I(){}function O(){}function A(){}function $(){}function L(){}function N(){}function x(){}function D(){}function R(){}function K(){}function _(){}function F(){}function B(){}function H(){}function q(){}function G(){}function z(){}function U(){}function X(){}function W(){}function V(){}function Q(){}function Y(){}function J(){}function Z(){}function nn(){}function tn(){}function en(){}function rn(){}function cn(){}function an(){}function un(){}function on(){}function sn(){}function hn(){}function fn(){}function ln(){}function bn(){}function wn(){}function dn(){}function gn(){}function pn(){}function vn(){}function mn(){}function yn(){}function kn(){}function jn(){}function En(){}function Tn(){}function Mn(){}function Sn(){}function Pn(){}function Cn(){}function In(){}function On(){}function An(){}function $n(){}function Ln(){}function Nn(){}function xn(){}function Dn(){}function Rn(){}function Kn(){}function _n(){}function Fn(){}function Bn(){}function Hn(){}function qn(){}function Gn(){}function zn(){}function Un(){}function Xn(){}function Wn(){}function Vn(){}function Qn(){}function Yn(){}function Jn(){}function Zn(){}function nt(){}function tt(){}function et(){}function it(){}function rt(){}function ct(){}function at(){}function ut(){}function ot(){}function st(){}function ht(){}function ft(){}function lt(){}function bt(){}function wt(){}function dt(){}function gt(){}function pt(){}function vt(){}function mt(){}function yt(){}function kt(){}function jt(){}function Et(){}function Tt(){}function Mt(){}function St(){}function Pt(){}function Ct(){}function It(){}function Ot(){}function At(){}function $t(){}function Lt(){}function Nt(){}function xt(){}function Dt(){}function Rt(){}function Kt(){}function _t(){}function Ft(){}function Bt(){}function Ht(){}function qt(){}function Gt(){}function zt(){}function Ut(){}function Xt(){}function Wt(){}function Vt(){}function Qt(){}function Yt(){}function Jt(){}function Zt(){}function ne(){}function te(){}function ee(){}function ie(){}function re(){}function ce(){}function ae(){}function ue(){}function oe(){}function se(){}function he(){}function fe(){}function le(){}function be(){}function we(){}function de(){}function ge(){}function pe(){}function ve(){}function me(){}function ye(){}function ke(){}function je(){}function Ee(){}function Te(){}function Me(){}function Se(){}function Pe(){}function Ce(){}function Ie(){}function Oe(){}function Ae(){}function $e(){}function Le(){}function Ne(){}function xe(){}function De(){}function Re(){}function Ke(){}function _e(){}function Fe(){}function Be(){}function He(){}function qe(){}function Ge(){}function ze(){}function Ue(){}function Xe(){}function We(){}function Ve(){}function Qe(){}function Ye(){}function Je(){}function Ze(){}function ni(){}function ti(){}function ei(){}function ii(){}function ri(){}function ci(){}function ai(){}function ui(){}function oi(){}function si(){}function hi(){}function fi(){}function li(){}function bi(){}function wi(){}function di(){}function gi(){}function pi(){}function vi(){}function mi(){}function yi(){}function ki(){}function ji(){}function Ei(){}function Ti(){}function Mi(){}function Si(){}function Pi(){}function Ci(){}function Ii(){}function Oi(){}function Ai(){}function $i(){}function Li(){}function Ni(){}function xi(){}function Di(){}function Ri(){}function Ki(){}function _i(){}function Fi(){}function Bi(){}function Hi(){}function qi(){}function Gi(){}function zi(){}function Ui(){}function Xi(){}function Wi(){}function Vi(){}function Qi(){}function Yi(){}function Ji(){}function Zi(){}function nr(){}function tr(){}function er(){}function ir(){}function rr(){}function cr(){}function ar(){}function ur(){}function or(){}function sr(){}function hr(){}function fr(){}function lr(){}function br(){}function wr(){}function dr(){}function gr(){}function pr(){}function vr(){}function mr(){}function yr(){}function kr(){}function jr(){}function Er(){}function Tr(){}function Mr(){}function Sr(){}function Pr(){}function Cr(){}function Ir(){}function Or(){}function Ar(){}function $r(){}function Lr(){}function Nr(){}function xr(){}function Dr(){}function Rr(){}function Kr(){}function _r(){}function Fr(){}function Br(){}function Hr(){}function qr(){}function Gr(){}function zr(){}function Ur(){}function Xr(){}function Wr(){}function Vr(){}function Qr(){}function Yr(){}function Jr(){}function Zr(){}function nc(){}function tc(){}function ec(){}function ic(){}function rc(){}function cc(){}function ac(){}function uc(){}function oc(){}function sc(){}function hc(){}function fc(){}function lc(){}function bc(){}function wc(){}function dc(){}function gc(){}function pc(){}function vc(){}function mc(){}function yc(){}function kc(){}function jc(){}function Ec(){}function Tc(){}function Mc(){}function Sc(){}function Pc(){}function Cc(){}function Ic(){}function Oc(){}function Ac(){}function $c(){}function Lc(){}function Nc(){}function xc(){}function Dc(){}function Rc(){}function Kc(){}function _c(){}function Fc(){}function Bc(){}function Hc(){}function qc(){}function Gc(){}function zc(){}function Uc(){}function Xc(){}function Wc(){}function Vc(){}function Qc(){}function Yc(){}function Jc(){}function Zc(){}function na(){}function ta(){}function ea(){}function ia(){}function ra(){}function ca(){}function aa(){}function ua(){}function oa(){}function sa(){}function ha(){}function fa(){}function la(){}function ba(){}function wa(){}function da(){}function ga(){}function pa(){}function va(){}function ma(){}function ya(){}function ka(){}function ja(){}function Ea(){}function Ta(){}function Ma(){}function Sa(){}function Pa(){}function Ca(){}function Ia(){}function Oa(){}function Aa(){}function $a(){}function La(){}function Na(){}function xa(){}function Da(){}function Ra(){}function Ka(){}function _a(){}function Fa(){}function Ba(){}function Ha(){}function qa(){}function Ga(){}function za(){}function Ua(){}function Xa(){}function Wa(){}function Va(){}function Qa(){}function Ya(){}function Ja(){}function Za(){}function nu(){}function tu(){}function eu(){}function iu(){}function ru(){}function cu(){}function au(){}function uu(){}function ou(){}function su(){}function hu(){}function fu(){}function lu(){}function bu(){}function wu(){}function du(){}function gu(){}function pu(){}function vu(){}function mu(){}function yu(){}function ku(){}function ju(){}function Eu(){}function Tu(){}function Mu(){}function Su(){}function Pu(){}function Cu(){}function Iu(){}function Ou(){}function Au(){}function $u(){}function Lu(){}function Nu(){}function xu(){}function Du(){}function Ru(){}function Ku(){}function _u(){}function Fu(){}function Bu(){}function Hu(){}function qu(){}function Gu(){}function zu(){}function Uu(){}function Xu(){}function Wu(){}function Vu(){}function Qu(){}function Yu(){}function Ju(){}function Zu(){}function no(){}function to(){}function eo(){}function io(){}function ro(){}function co(){}function ao(){}function uo(){}function oo(){}function so(){}function ho(){}function fo(){}function lo(){}function bo(){}function wo(){}function go(){}function po(){}function vo(){}function mo(){}function yo(){}function ko(){}function jo(){}function Eo(){}function To(){}function Mo(){}function So(){}function Po(){}function Co(){}function Io(){}function Oo(){}function Ao(){}function $o(){}function Lo(){}function No(){}function xo(){}function Do(){}function Ro(){}function Ko(){}function _o(){}function Fo(){}function Bo(){}function Ho(){}function qo(){}function Go(){}function zo(){}function Uo(){}function Xo(){}function Wo(){}function Vo(){}function Qo(){}function Yo(){}function Jo(){}function Zo(){}function ns(){}function ts(){}function es(){}function is(){}function rs(){}function cs(){}function as(){}function us(){}function os(){}function ss(){}function hs(){}function fs(){}function ls(){}function bs(){}function ws(){}function ds(){}function gs(){}function ps(){}function vs(){}function ms(){}function ys(){}function ks(){}function js(){}function Es(){}function Ts(){}function Ms(){}function Ss(){}function Ps(){}function Cs(){}function Is(){}function Os(){}function As(){}function $s(){}function Ls(){}function Ns(){}function xs(){}function Ds(){}function Rs(){}function Ks(){}function _s(){}function Fs(){}function Bs(){}function Hs(){}function qs(){}function Gs(){}function zs(){}function Us(){}function Xs(){}function Ws(){}function Vs(){}function Qs(){}function Ys(){}function Js(){}function Zs(){}function nh(){}function th(){}function eh(){}function ih(){}function rh(){}function ch(){}function ah(){}function uh(){}function oh(){}function sh(){}function hh(){}function fh(){}function lh(){}function bh(){}function wh(){}function dh(){}function gh(){}function ph(){}function vh(){}function mh(){}function yh(){}function kh(){}function jh(){}function Eh(){}function Th(){}function Mh(){}function Sh(){}function Ph(){}function Ch(){}function Ih(){}function Oh(){}function Ah(){}function $h(){}function Lh(){}function Nh(){}function xh(){}function Dh(){}function Rh(){}function Kh(){}function _h(n){}function Fh(n){}function Bh(){iy()}function Hh(){Gsn()}function qh(){Epn()}function Gh(){_kn()}function zh(){jSn()}function Uh(){fRn()}function Xh(){Kyn()}function Wh(){rkn()}function Vh(){EM()}function Qh(){mM()}function Yh(){q_()}function Jh(){TM()}function Zh(){Irn()}function nf(){SM()}function tf(){I6()}function ef(){Pin()}function rf(){Q8()}function cf(){_Z()}function af(){zsn()}function uf(){_Mn()}function of(){Cin()}function sf(){U2()}function hf(){fWn()}function ff(){Gyn()}function lf(){FZ()}function bf(){HXn()}function wf(){RZ()}function df(){Iin()}function gf(){Yun()}function pf(){GZ()}function vf(){C9()}function mf(){PM()}function yf(){KAn()}function kf(){Uyn()}function jf(){Fcn()}function Ef(){MMn()}function Tf(){bRn()}function Mf(){Bvn()}function Sf(){CAn()}function Pf(){Ran()}function Cf(){HZ()}function If(){s_n()}function Of(){$An()}function Af(){W$n()}function $f(){x9()}function Lf(){SMn()}function Nf(){sWn()}function xf(){Xsn()}function Df(){vdn()}function Rf(){qBn()}function Kf(){u_()}function _f(){wcn()}function Ff(){fFn()}function Bf(n){kW(n)}function Hf(n){this.a=n}function qf(n){this.a=n}function Gf(n){this.a=n}function zf(n){this.a=n}function Uf(n){this.a=n}function Xf(n){this.a=n}function Wf(n){this.a=n}function Vf(n){this.a=n}function Qf(n){this.a=n}function Yf(n){this.a=n}function Jf(n){this.a=n}function Zf(n){this.a=n}function nl(n){this.a=n}function tl(n){this.a=n}function el(n){this.a=n}function il(n){this.a=n}function rl(n){this.a=n}function cl(n){this.a=n}function al(n){this.a=n}function ul(n){this.a=n}function ol(n){this.a=n}function sl(n){this.b=n}function hl(n){this.c=n}function fl(n){this.a=n}function ll(n){this.a=n}function bl(n){this.a=n}function wl(n){this.a=n}function dl(n){this.a=n}function gl(n){this.a=n}function pl(n){this.a=n}function vl(n){this.a=n}function ml(n){this.a=n}function yl(n){this.a=n}function kl(n){this.a=n}function jl(n){this.a=n}function El(n){this.a=n}function Tl(n){this.a=n}function Ml(n){this.a=n}function Sl(n){this.a=n}function Pl(n){this.a=n}function Cl(){this.a=[]}function Il(n,t){n.a=t}function Ol(n,t){n.a=t}function Al(n,t){n.b=t}function $l(n,t){n.b=t}function Ll(n,t){n.b=t}function Nl(n,t){n.j=t}function xl(n,t){n.g=t}function Dl(n,t){n.i=t}function Rl(n,t){n.c=t}function Kl(n,t){n.d=t}function _l(n,t){n.d=t}function Fl(n,t){n.c=t}function Bl(n,t){n.k=t}function Hl(n,t){n.c=t}function ql(n,t){n.c=t}function Gl(n,t){n.a=t}function zl(n,t){n.a=t}function Ul(n,t){n.f=t}function Xl(n,t){n.a=t}function Wl(n,t){n.b=t}function Vl(n,t){n.d=t}function Ql(n,t){n.i=t}function Yl(n,t){n.o=t}function Jl(n,t){n.r=t}function Zl(n,t){n.a=t}function nb(n,t){n.b=t}function tb(n,t){n.e=t}function eb(n,t){n.f=t}function ib(n,t){n.g=t}function rb(n,t){n.e=t}function cb(n,t){n.f=t}function ab(n,t){n.f=t}function ub(n,t){n.n=t}function ob(n,t){n.a=t}function sb(n,t){n.a=t}function hb(n,t){n.c=t}function fb(n,t){n.c=t}function lb(n,t){n.d=t}function bb(n,t){n.e=t}function wb(n,t){n.g=t}function db(n,t){n.a=t}function gb(n,t){n.c=t}function pb(n,t){n.d=t}function vb(n,t){n.e=t}function mb(n,t){n.f=t}function yb(n,t){n.j=t}function kb(n,t){n.a=t}function jb(n,t){n.b=t}function Eb(n,t){n.a=t}function Tb(n){n.b=n.a}function Mb(n){n.c=n.d.d}function Sb(n){this.d=n}function Pb(n){this.a=n}function Cb(n){this.a=n}function Ib(n){this.a=n}function Ob(n){this.a=n}function Ab(n){this.a=n}function $b(n){this.a=n}function Lb(n){this.a=n}function Nb(n){this.a=n}function xb(n){this.a=n}function Db(n){this.a=n}function Rb(n){this.a=n}function Kb(n){this.a=n}function _b(n){this.a=n}function Fb(n){this.a=n}function Bb(n){this.b=n}function Hb(n){this.b=n}function qb(n){this.b=n}function Gb(n){this.a=n}function zb(n){this.a=n}function Ub(n){this.a=n}function Xb(n){this.c=n}function Wb(n){this.c=n}function Vb(n){this.c=n}function Qb(n){this.a=n}function Yb(n){this.a=n}function Jb(n){this.a=n}function Zb(n){this.a=n}function nw(n){this.a=n}function tw(n){this.a=n}function ew(n){this.a=n}function iw(n){this.a=n}function rw(n){this.a=n}function cw(n){this.a=n}function aw(n){this.a=n}function uw(n){this.a=n}function ow(n){this.a=n}function sw(n){this.a=n}function hw(n){this.a=n}function fw(n){this.a=n}function lw(n){this.a=n}function bw(n){this.a=n}function ww(n){this.a=n}function dw(n){this.a=n}function gw(n){this.a=n}function pw(n){this.a=n}function vw(n){this.a=n}function mw(n){this.a=n}function yw(n){this.a=n}function kw(n){this.a=n}function jw(n){this.a=n}function Ew(n){this.a=n}function Tw(n){this.a=n}function Mw(n){this.a=n}function Sw(n){this.a=n}function Pw(n){this.a=n}function Cw(n){this.a=n}function Iw(n){this.a=n}function Ow(n){this.a=n}function Aw(n){this.a=n}function $w(n){this.a=n}function Lw(n){this.a=n}function Nw(n){this.a=n}function xw(n){this.a=n}function Dw(n){this.a=n}function Rw(n){this.a=n}function Kw(n){this.a=n}function _w(n){this.a=n}function Fw(n){this.a=n}function Bw(n){this.e=n}function Hw(n){this.a=n}function qw(n){this.a=n}function Gw(n){this.a=n}function zw(n){this.a=n}function Uw(n){this.a=n}function Xw(n){this.a=n}function Ww(n){this.a=n}function Vw(n){this.a=n}function Qw(n){this.a=n}function Yw(n){this.a=n}function Jw(n){this.a=n}function Zw(n){this.a=n}function nd(n){this.a=n}function td(n){this.a=n}function ed(n){this.a=n}function id(n){this.a=n}function rd(n){this.a=n}function cd(n){this.a=n}function ad(n){this.a=n}function ud(n){this.a=n}function od(n){this.a=n}function sd(n){this.a=n}function hd(n){this.a=n}function fd(n){this.a=n}function ld(n){this.a=n}function bd(n){this.a=n}function wd(n){this.a=n}function dd(n){this.a=n}function gd(n){this.a=n}function pd(n){this.a=n}function vd(n){this.a=n}function md(n){this.a=n}function yd(n){this.a=n}function kd(n){this.a=n}function jd(n){this.a=n}function Ed(n){this.a=n}function Td(n){this.a=n}function Md(n){this.a=n}function Sd(n){this.a=n}function Pd(n){this.a=n}function Cd(n){this.a=n}function Id(n){this.a=n}function Od(n){this.a=n}function Ad(n){this.a=n}function $d(n){this.a=n}function Ld(n){this.a=n}function Nd(n){this.a=n}function xd(n){this.a=n}function Dd(n){this.a=n}function Rd(n){this.a=n}function Kd(n){this.a=n}function _d(n){this.a=n}function Fd(n){this.a=n}function Bd(n){this.c=n}function Hd(n){this.b=n}function qd(n){this.a=n}function Gd(n){this.a=n}function zd(n){this.a=n}function Ud(n){this.a=n}function Xd(n){this.a=n}function Wd(n){this.a=n}function Vd(n){this.a=n}function Qd(n){this.a=n}function Yd(n){this.a=n}function Jd(n){this.a=n}function Zd(n){this.a=n}function ng(n){this.a=n}function tg(n){this.a=n}function eg(n){this.a=n}function ig(n){this.a=n}function rg(n){this.a=n}function cg(n){this.a=n}function ag(n){this.a=n}function ug(n){this.a=n}function og(n){this.a=n}function sg(n){this.a=n}function hg(n){this.a=n}function fg(n){this.a=n}function lg(n){this.a=n}function bg(n){this.a=n}function wg(n){this.a=n}function dg(n){this.a=n}function gg(n){this.a=n}function pg(n){this.a=n}function vg(n){this.a=n}function mg(n){this.a=n}function yg(n){this.a=n}function kg(n){this.a=n}function jg(n){this.a=n}function Eg(n){this.a=n}function Tg(n){this.a=n}function Mg(n){this.a=n}function Sg(n){this.a=n}function Pg(n){this.a=n}function Cg(n){this.a=n}function Ig(n){this.a=n}function Og(n){this.a=n}function Ag(n){this.a=n}function $g(n){this.a=n}function Lg(n){this.a=n}function Ng(n){this.a=n}function xg(n){this.a=n}function Dg(n){this.a=n}function Rg(n){this.a=n}function Kg(n){this.a=n}function _g(n){this.a=n}function Fg(n){this.a=n}function Bg(n){this.a=n}function Hg(n){this.a=n}function qg(n){this.a=n}function Gg(n){this.a=n}function zg(n){this.a=n}function Ug(n){this.a=n}function Xg(n){this.a=n}function Wg(n){this.a=n}function Vg(n){this.a=n}function Qg(n){this.a=n}function Yg(n){this.a=n}function Jg(n){this.a=n}function Zg(n){this.a=n}function np(n){this.a=n}function tp(n){this.a=n}function ep(n){this.a=n}function ip(n){this.a=n}function rp(n){this.a=n}function cp(n){this.a=n}function ap(n){this.a=n}function up(n){this.b=n}function op(n){this.f=n}function sp(n){this.a=n}function hp(n){this.a=n}function fp(n){this.a=n}function lp(n){this.a=n}function bp(n){this.a=n}function wp(n){this.a=n}function dp(n){this.a=n}function gp(n){this.a=n}function pp(n){this.a=n}function vp(n){this.a=n}function mp(n){this.a=n}function yp(n){this.b=n}function kp(n){this.c=n}function jp(n){this.e=n}function Ep(n){this.a=n}function Tp(n){this.a=n}function Mp(n){this.a=n}function Sp(n){this.a=n}function Pp(n){this.a=n}function Cp(n){this.d=n}function Ip(n){this.a=n}function Op(n){this.a=n}function Ap(n){this.e=n}function $p(){this.a=0}function Lp(){DA(this)}function Np(){xA(this)}function xp(){$U(this)}function Dp(){wV(this)}function Rp(){_h(this)}function Kp(){this.c=L$t}function _p(n,t){t.Wb(n)}function Fp(n,t){n.b+=t}function Bp(n){n.b=new ok}function Hp(n){return n.e}function qp(n){return n.a}function Gp(n){return n.a}function zp(n){return n.a}function Up(n){return n.a}function Xp(n){return n.a}function Wp(){return null}function Vp(){return null}function Qp(){aE(),dXn()}function Yp(n){n.b.tf(n.e)}function Jp(n,t){n.b=t-n.b}function Zp(n,t){n.a=t-n.a}function nv(n,t){t.ad(n.a)}function tv(n,t){qCn(t,n)}function ev(n,t,e){n.Od(e,t)}function iv(n,t){n.e=t,t.b=n}function rv(n){s_(),this.a=n}function cv(n){s_(),this.a=n}function av(n){s_(),this.a=n}function uv(n){WX(),this.a=n}function ov(n){PY(),ett.be(n)}function sv(){gN.call(this)}function hv(){gN.call(this)}function fv(){sv.call(this)}function lv(){sv.call(this)}function bv(){sv.call(this)}function wv(){sv.call(this)}function dv(){sv.call(this)}function gv(){sv.call(this)}function pv(){sv.call(this)}function vv(){sv.call(this)}function mv(){sv.call(this)}function yv(){sv.call(this)}function kv(){sv.call(this)}function jv(){this.a=this}function Ev(){this.Bb|=256}function Tv(){this.b=new PO}function Mv(){Mv=O,new xp}function Sv(){fv.call(this)}function Pv(n,t){n.length=t}function Cv(n,t){WB(n.a,t)}function Iv(n,t){USn(n.c,t)}function Ov(n,t){TU(n.b,t)}function Av(n,t){Ivn(n.a,t)}function $v(n,t){Oln(n.a,t)}function Lv(n,t){ban(n.e,t)}function Nv(n){AOn(n.c,n.b)}function xv(n,t){n.kc().Nb(t)}function Dv(n){this.a=gbn(n)}function Rv(){this.a=new xp}function Kv(){this.a=new xp}function _v(){this.a=new Np}function Fv(){this.a=new Np}function Bv(){this.a=new Np}function Hv(){this.a=new kn}function qv(){this.a=new k6}function Gv(){this.a=new bt}function zv(){this.a=new WT}function Uv(){this.a=new D0}function Xv(){this.a=new cZ}function Wv(){this.a=new AR}function Vv(){this.a=new Np}function Qv(){this.a=new Np}function Yv(){this.a=new Np}function Jv(){this.a=new Np}function Zv(){this.d=new Np}function nm(){this.a=new Rv}function tm(){this.a=new xp}function em(){this.b=new xp}function im(){this.b=new Np}function rm(){this.e=new Np}function cm(){this.d=new Np}function am(){this.a=new uf}function um(){Np.call(this)}function om(){_v.call(this)}function sm(){NR.call(this)}function hm(){Qv.call(this)}function fm(){lm.call(this)}function lm(){Rp.call(this)}function bm(){Rp.call(this)}function wm(){bm.call(this)}function dm(){dY.call(this)}function gm(){dY.call(this)}function pm(){Wm.call(this)}function vm(){Wm.call(this)}function mm(){Wm.call(this)}function ym(){Vm.call(this)}function km(){YT.call(this)}function jm(){eo.call(this)}function Em(){eo.call(this)}function Tm(){ny.call(this)}function Mm(){ny.call(this)}function Sm(){xp.call(this)}function Pm(){xp.call(this)}function Cm(){xp.call(this)}function Im(){Rv.call(this)}function Om(){jin.call(this)}function Am(){Ev.call(this)}function $m(){OL.call(this)}function Lm(){OL.call(this)}function Nm(){xp.call(this)}function xm(){xp.call(this)}function Dm(){xp.call(this)}function Rm(){yo.call(this)}function Km(){yo.call(this)}function _m(){Rm.call(this)}function Fm(){Dh.call(this)}function Bm(n){dtn.call(this,n)}function Hm(n){dtn.call(this,n)}function qm(n){Qf.call(this,n)}function Gm(n){MT.call(this,n)}function zm(n){Gm.call(this,n)}function Um(n){MT.call(this,n)}function Xm(){this.a=new YT}function Wm(){this.a=new Rv}function Vm(){this.a=new xp}function Qm(){this.a=new Np}function Ym(){this.j=new Np}function Jm(){this.a=new Xa}function Zm(){this.a=new LE}function ny(){this.a=new mo}function ty(){ty=O,_nt=new xk}function ey(){ey=O,Knt=new Nk}function iy(){iy=O,Ont=new c}function ry(){ry=O,znt=new cN}function cy(n){Gm.call(this,n)}function ay(n){Gm.call(this,n)}function uy(n){d4.call(this,n)}function oy(n){d4.call(this,n)}function sy(n){VK.call(this,n)}function hy(n){ySn.call(this,n)}function fy(n){CT.call(this,n)}function ly(n){OT.call(this,n)}function by(n){OT.call(this,n)}function wy(n){OT.call(this,n)}function dy(n){fz.call(this,n)}function gy(n){dy.call(this,n)}function py(){Pl.call(this,{})}function vy(n){CL(),this.a=n}function my(n){n.b=null,n.c=0}function yy(n,t){n.e=t,Cxn(n,t)}function ky(n,t){n.a=t,aCn(n)}function jy(n,t,e){n.a[t.g]=e}function Ey(n,t,e){wjn(e,n,t)}function Ty(n,t){ZR(t.i,n.n)}function My(n,t){ssn(n).td(t)}function Sy(n,t){return n*n/t}function Py(n,t){return n.g-t.g}function Cy(n){return new Sl(n)}function Iy(n){return new GX(n)}function Oy(n){dy.call(this,n)}function Ay(n){dy.call(this,n)}function $y(n){dy.call(this,n)}function Ly(n){fz.call(this,n)}function Ny(n){_cn(),this.a=n}function xy(n){a_(),this.a=n}function Dy(n){FG(),this.f=n}function Ry(n){FG(),this.f=n}function Ky(n){dy.call(this,n)}function _y(n){dy.call(this,n)}function Fy(n){dy.call(this,n)}function By(n){dy.call(this,n)}function Hy(n){dy.call(this,n)}function qy(n){return kW(n),n}function Gy(n){return kW(n),n}function zy(n){return kW(n),n}function Uy(n){return kW(n),n}function Xy(n){return kW(n),n}function Wy(n){return n.b==n.c}function Vy(n){return!!n&&n.b}function Qy(n){return!!n&&n.k}function Yy(n){return!!n&&n.j}function Jy(n){kW(n),this.a=n}function Zy(n){return Zon(n),n}function nk(n){vU(n,n.length)}function tk(n){dy.call(this,n)}function ek(n){dy.call(this,n)}function ik(n){dy.call(this,n)}function rk(n){dy.call(this,n)}function ck(n){dy.call(this,n)}function ak(n){dy.call(this,n)}function uk(n){ZN.call(this,n,0)}function ok(){o1.call(this,12,3)}function sk(){sk=O,ttt=new j}function hk(){hk=O,Ynt=new r}function fk(){fk=O,rtt=new g}function lk(){lk=O,htt=new v}function bk(){throw Hp(new pv)}function wk(){throw Hp(new pv)}function dk(){throw Hp(new pv)}function gk(){throw Hp(new pv)}function pk(){throw Hp(new pv)}function vk(){throw Hp(new pv)}function mk(){this.a=SD(yX(FWn))}function yk(n){s_(),this.a=yX(n)}function kk(n,t){n.Td(t),t.Sd(n)}function jk(n,t){n.a.ec().Mc(t)}function Ek(n,t,e){n.c.lf(t,e)}function Tk(n){Ay.call(this,n)}function Mk(n){_y.call(this,n)}function Sk(){Ab.call(this,"")}function Pk(){Ab.call(this,"")}function Ck(){Ab.call(this,"")}function Ik(){Ab.call(this,"")}function Ok(n){Ay.call(this,n)}function Ak(n){Hb.call(this,n)}function $k(n){bN.call(this,n)}function Lk(n){Ak.call(this,n)}function Nk(){tl.call(this,null)}function xk(){tl.call(this,null)}function Dk(){Dk=O,PY()}function Rk(){Rk=O,ket=mEn()}function Kk(n){return n.a?n.b:0}function _k(n){return n.a?n.b:0}function Fk(n,t){return n.a-t.a}function Bk(n,t){return n.a-t.a}function Hk(n,t){return n.a-t.a}function qk(n,t){return m7(n,t)}function Gk(n,t){return gZ(n,t)}function zk(n,t){return t in n.a}function Uk(n,t){return n.f=t,n}function Xk(n,t){return n.b=t,n}function Wk(n,t){return n.c=t,n}function Vk(n,t){return n.g=t,n}function Qk(n,t){return n.a=t,n}function Yk(n,t){return n.f=t,n}function Jk(n,t){return n.k=t,n}function Zk(n,t){return n.a=t,n}function nj(n,t){return n.e=t,n}function tj(n,t){return n.e=t,n}function ej(n,t){return n.f=t,n}function ij(n,t){n.b=!0,n.d=t}function rj(n,t){n.b=new wA(t)}function cj(n,t,e){t.td(n.a[e])}function aj(n,t,e){t.we(n.a[e])}function uj(n,t){return n.b-t.b}function oj(n,t){return n.g-t.g}function sj(n,t){return n.s-t.s}function hj(n,t){return n?0:t-1}function fj(n,t){return n?0:t-1}function lj(n,t){return n?t-1:0}function bj(n,t){return t.Yf(n)}function wj(n,t){return n.b=t,n}function dj(n,t){return n.a=t,n}function gj(n,t){return n.c=t,n}function pj(n,t){return n.d=t,n}function vj(n,t){return n.e=t,n}function mj(n,t){return n.f=t,n}function yj(n,t){return n.a=t,n}function kj(n,t){return n.b=t,n}function jj(n,t){return n.c=t,n}function Ej(n,t){return n.c=t,n}function Tj(n,t){return n.b=t,n}function Mj(n,t){return n.d=t,n}function Sj(n,t){return n.e=t,n}function Pj(n,t){return n.f=t,n}function Cj(n,t){return n.g=t,n}function Ij(n,t){return n.a=t,n}function Oj(n,t){return n.i=t,n}function Aj(n,t){return n.j=t,n}function $j(n,t){return n.k=t,n}function Lj(n,t){return n.j=t,n}function Nj(n,t){_Mn(),CZ(t,n)}function xj(n,t,e){GG(n.a,t,e)}function Dj(n){BV.call(this,n)}function Rj(n){BV.call(this,n)}function Kj(n){n_.call(this,n)}function _j(n){qbn.call(this,n)}function Fj(n){gtn.call(this,n)}function Bj(n){pQ.call(this,n)}function Hj(n){pQ.call(this,n)}function qj(){O$.call(this,"")}function Gj(){this.a=0,this.b=0}function zj(){this.b=0,this.a=0}function Uj(n,t){n.b=0,Nen(n,t)}function Xj(n,t){n.c=t,n.b=!0}function Wj(n,t){return n.c._b(t)}function Vj(n){return n.e&&n.e()}function Qj(n){return n?n.d:null}function Yj(n,t){return gfn(n.b,t)}function Jj(n){return n?n.g:null}function Zj(n){return n?n.i:null}function nE(n){return ED(n),n.o}function tE(){tE=O,dOt=Xkn()}function eE(){eE=O,gOt=oTn()}function iE(){iE=O,n$t=Vkn()}function rE(){rE=O,dLt=Wkn()}function cE(){cE=O,gLt=iCn()}function aE(){aE=O,lAt=cin()}function uE(){throw Hp(new pv)}function oE(){throw Hp(new pv)}function sE(){throw Hp(new pv)}function hE(){throw Hp(new pv)}function fE(){throw Hp(new pv)}function lE(){throw Hp(new pv)}function bE(n){this.a=new XT(n)}function wE(n){lUn(),DXn(this,n)}function dE(n){this.a=new Wz(n)}function gE(n,t){for(;n.ye(t););}function pE(n,t){for(;n.sd(t););}function vE(n,t){return n.a+=t,n}function mE(n,t){return n.a+=t,n}function yE(n,t){return n.a+=t,n}function kE(n,t){return n.a+=t,n}function jE(n){return EW(n),n.a}function EE(n){return n.b!=n.d.c}function TE(n){return n.l|n.m<<22}function ME(n,t){return n.d[t.p]}function SE(n,t){return Sxn(n,t)}function PE(n,t,e){n.splice(t,e)}function CE(n){n.c?NDn(n):xDn(n)}function IE(n){this.a=0,this.b=n}function OE(){this.a=new CNn(ijt)}function AE(){this.b=new CNn(qyt)}function $E(){this.b=new CNn(WEt)}function LE(){this.b=new CNn(WEt)}function NE(){throw Hp(new pv)}function xE(){throw Hp(new pv)}function DE(){throw Hp(new pv)}function RE(){throw Hp(new pv)}function KE(){throw Hp(new pv)}function _E(){throw Hp(new pv)}function FE(){throw Hp(new pv)}function BE(){throw Hp(new pv)}function HE(){throw Hp(new pv)}function qE(){throw Hp(new pv)}function GE(){throw Hp(new yv)}function zE(){throw Hp(new yv)}function UE(n){this.a=new XE(n)}function XE(n){Gin(this,n,OEn())}function WE(n){return!n||pW(n)}function VE(n){return-1!=WLt[n]}function QE(){0!=ctt&&(ctt=0),utt=-1}function YE(){null==PWn&&(PWn=[])}function JE(n,t){tAn(QQ(n.a),t)}function ZE(n,t){tAn(QQ(n.a),t)}function nT(n,t){HL.call(this,n,t)}function tT(n,t){nT.call(this,n,t)}function eT(n,t){this.b=n,this.c=t}function iT(n,t){this.b=n,this.a=t}function rT(n,t){this.a=n,this.b=t}function cT(n,t){this.a=n,this.b=t}function aT(n,t){this.a=n,this.b=t}function uT(n,t){this.a=n,this.b=t}function oT(n,t){this.a=n,this.b=t}function sT(n,t){this.a=n,this.b=t}function hT(n,t){this.a=n,this.b=t}function fT(n,t){this.a=n,this.b=t}function lT(n,t){this.b=n,this.a=t}function bT(n,t){this.b=n,this.a=t}function wT(n,t){this.b=n,this.a=t}function dT(n,t){this.b=n,this.a=t}function gT(n,t){this.f=n,this.g=t}function pT(n,t){this.e=n,this.d=t}function vT(n,t){this.g=n,this.i=t}function mT(n,t){this.a=n,this.b=t}function yT(n,t){this.a=n,this.f=t}function kT(n,t){this.b=n,this.c=t}function jT(n,t){this.a=n,this.b=t}function ET(n,t){this.a=n,this.b=t}function TT(n,t){this.a=n,this.b=t}function MT(n){aN(n.dc()),this.c=n}function ST(n){this.b=BB(yX(n),83)}function PT(n){this.a=BB(yX(n),83)}function CT(n){this.a=BB(yX(n),15)}function IT(n){this.a=BB(yX(n),15)}function OT(n){this.b=BB(yX(n),47)}function AT(){this.q=new e.Date}function $T(){$T=O,Btt=new A}function LT(){LT=O,bet=new P}function NT(n){return n.f.c+n.g.c}function xT(n,t){return n.b.Hc(t)}function DT(n,t){return n.b.Ic(t)}function RT(n,t){return n.b.Qc(t)}function KT(n,t){return n.b.Hc(t)}function _T(n,t){return n.c.uc(t)}function FT(n,t){return n.a._b(t)}function BT(n,t){return Nfn(n.c,t)}function HT(n,t){return hU(n.b,t)}function qT(n,t){return n>t&&t<OVn}function GT(n,t){return n.Gc(t),n}function zT(n,t){return Frn(n,t),n}function UT(n){return XX(),n?stt:ott}function XT(n){non.call(this,n,0)}function WT(){Wz.call(this,null)}function VT(){B8.call(this,null)}function QT(n){this.c=n,Ann(this)}function YT(){P$(this),yQ(this)}function JT(n,t){EW(n),n.a.Nb(t)}function ZT(n,t){return n.Gc(t),n}function nM(n,t){return n.a.f=t,n}function tM(n,t){return n.a.d=t,n}function eM(n,t){return n.a.g=t,n}function iM(n,t){return n.a.j=t,n}function rM(n,t){return n.a.a=t,n}function cM(n,t){return n.a.d=t,n}function aM(n,t){return n.a.e=t,n}function uM(n,t){return n.a.g=t,n}function oM(n,t){return n.a.f=t,n}function sM(n){return n.b=!1,n}function hM(){hM=O,Pet=new CO}function fM(){fM=O,Cet=new IO}function lM(){lM=O,Het=new U}function bM(){bM=O,vut=new Kt}function wM(){wM=O,rct=new Ix}function dM(){dM=O,tit=new hn}function gM(){gM=O,kut=new _t}function pM(){pM=O,sit=new dn}function vM(){vM=O,Gat=new yt}function mM(){mM=O,Fut=new Gj}function yM(){yM=O,zat=new Pt}function kM(){kM=O,Vat=new DG}function jM(){jM=O,hut=new Mt}function EM(){EM=O,But=new be}function TM(){TM=O,nst=new Ye}function MM(){MM=O,wst=new Lr}function SM(){SM=O,Qst=new rc}function PM(){PM=O,Wkt=new B2}function CM(){CM=O,XEt=new LM}function IM(){IM=O,QEt=new vD}function OM(){OM=O,GTt=new XW}function AM(){AM=O,Wpt=new Wu}function $M(){Sin(),this.c=new ok}function LM(){gT.call(this,H1n,0)}function NM(n,t){Jgn(n.c.b,t.c,t)}function xM(n,t){Jgn(n.c.c,t.b,t)}function DM(n,t,e){mZ(n.d,t.f,e)}function RM(n,t,e,i){Jpn(n,i,t,e)}function KM(n,t,e,i){uNn(i,n,t,e)}function _M(n,t,e,i){oUn(i,n,t,e)}function FM(n,t){return n.a=t.g,n}function BM(n,t){return ekn(n.a,t)}function HM(n){return n.b?n.b:n.a}function qM(n){return(n.c+n.a)/2}function GM(){GM=O,lOt=new to}function zM(){zM=O,COt=new ho}function UM(){UM=O,RAt=new Pm}function XM(){XM=O,UAt=new Cm}function WM(){WM=O,zAt=new Nm}function VM(){VM=O,ZAt=new Dm}function QM(){QM=O,N$t=new z$}function YM(){YM=O,x$t=new U$}function JM(){JM=O,rLt=new Ns}function ZM(){ZM=O,aLt=new xs}function nS(){nS=O,mAt=new xp}function tS(){tS=O,V$t=new Np}function eS(){eS=O,MNt=new Kh}function iS(n){e.clearTimeout(n)}function rS(n){this.a=BB(yX(n),224)}function cS(n){return BB(n,42).cd()}function aS(n){return n.b<n.d.gc()}function uS(n,t){return CG(n.a,t)}function oS(n,t){return Vhn(n,t)>0}function sS(n,t){return Vhn(n,t)<0}function hS(n,t){return n.a.get(t)}function fS(n,t){return t.split(n)}function lS(n,t){return hU(n.e,t)}function bS(n){return kW(n),!1}function wS(n){w1.call(this,n,21)}function dS(n,t){_J.call(this,n,t)}function gS(n,t){gT.call(this,n,t)}function pS(n,t){gT.call(this,n,t)}function vS(n){VX(),VK.call(this,n)}function mS(n,t){jG(n,n.length,t)}function yS(n,t){QU(n,n.length,t)}function kS(n,t,e){t.ud(n.a.Ge(e))}function jS(n,t,e){t.we(n.a.Fe(e))}function ES(n,t,e){t.td(n.a.Kb(e))}function TS(n,t,e){n.Mb(e)&&t.td(e)}function MS(n,t,e){n.splice(t,0,e)}function SS(n,t){return SN(n.e,t)}function PS(n,t){this.d=n,this.e=t}function CS(n,t){this.b=n,this.a=t}function IS(n,t){this.b=n,this.a=t}function OS(n,t){this.b=n,this.a=t}function AS(n,t){this.a=n,this.b=t}function $S(n,t){this.a=n,this.b=t}function LS(n,t){this.a=n,this.b=t}function NS(n,t){this.a=n,this.b=t}function xS(n,t){this.a=n,this.b=t}function DS(n,t){this.b=n,this.a=t}function RS(n,t){this.b=n,this.a=t}function KS(n,t){gT.call(this,n,t)}function _S(n,t){gT.call(this,n,t)}function FS(n,t){gT.call(this,n,t)}function BS(n,t){gT.call(this,n,t)}function HS(n,t){gT.call(this,n,t)}function qS(n,t){gT.call(this,n,t)}function GS(n,t){gT.call(this,n,t)}function zS(n,t){gT.call(this,n,t)}function US(n,t){gT.call(this,n,t)}function XS(n,t){gT.call(this,n,t)}function WS(n,t){gT.call(this,n,t)}function VS(n,t){gT.call(this,n,t)}function QS(n,t){gT.call(this,n,t)}function YS(n,t){gT.call(this,n,t)}function JS(n,t){gT.call(this,n,t)}function ZS(n,t){gT.call(this,n,t)}function nP(n,t){gT.call(this,n,t)}function tP(n,t){gT.call(this,n,t)}function eP(n,t){this.a=n,this.b=t}function iP(n,t){this.a=n,this.b=t}function rP(n,t){this.a=n,this.b=t}function cP(n,t){this.a=n,this.b=t}function aP(n,t){this.a=n,this.b=t}function uP(n,t){this.a=n,this.b=t}function oP(n,t){this.a=n,this.b=t}function sP(n,t){this.a=n,this.b=t}function hP(n,t){this.a=n,this.b=t}function fP(n,t){this.b=n,this.a=t}function lP(n,t){this.b=n,this.a=t}function bP(n,t){this.b=n,this.a=t}function wP(n,t){this.b=n,this.a=t}function dP(n,t){this.c=n,this.d=t}function gP(n,t){this.e=n,this.d=t}function pP(n,t){this.a=n,this.b=t}function vP(n,t){this.b=t,this.c=n}function mP(n,t){gT.call(this,n,t)}function yP(n,t){gT.call(this,n,t)}function kP(n,t){gT.call(this,n,t)}function jP(n,t){gT.call(this,n,t)}function EP(n,t){gT.call(this,n,t)}function TP(n,t){gT.call(this,n,t)}function MP(n,t){gT.call(this,n,t)}function SP(n,t){gT.call(this,n,t)}function PP(n,t){gT.call(this,n,t)}function CP(n,t){gT.call(this,n,t)}function IP(n,t){gT.call(this,n,t)}function OP(n,t){gT.call(this,n,t)}function AP(n,t){gT.call(this,n,t)}function $P(n,t){gT.call(this,n,t)}function LP(n,t){gT.call(this,n,t)}function NP(n,t){gT.call(this,n,t)}function xP(n,t){gT.call(this,n,t)}function DP(n,t){gT.call(this,n,t)}function RP(n,t){gT.call(this,n,t)}function KP(n,t){gT.call(this,n,t)}function _P(n,t){gT.call(this,n,t)}function FP(n,t){gT.call(this,n,t)}function BP(n,t){gT.call(this,n,t)}function HP(n,t){gT.call(this,n,t)}function qP(n,t){gT.call(this,n,t)}function GP(n,t){gT.call(this,n,t)}function zP(n,t){gT.call(this,n,t)}function UP(n,t){gT.call(this,n,t)}function XP(n,t){gT.call(this,n,t)}function WP(n,t){gT.call(this,n,t)}function VP(n,t){gT.call(this,n,t)}function QP(n,t){gT.call(this,n,t)}function YP(n,t){gT.call(this,n,t)}function JP(n,t){gT.call(this,n,t)}function ZP(n,t){this.b=n,this.a=t}function nC(n,t){this.a=n,this.b=t}function tC(n,t){this.a=n,this.b=t}function eC(n,t){this.a=n,this.b=t}function iC(n,t){this.a=n,this.b=t}function rC(n,t){gT.call(this,n,t)}function cC(n,t){gT.call(this,n,t)}function aC(n,t){this.b=n,this.d=t}function uC(n,t){gT.call(this,n,t)}function oC(n,t){gT.call(this,n,t)}function sC(n,t){this.a=n,this.b=t}function hC(n,t){this.a=n,this.b=t}function fC(n,t){gT.call(this,n,t)}function lC(n,t){gT.call(this,n,t)}function bC(n,t){gT.call(this,n,t)}function wC(n,t){gT.call(this,n,t)}function dC(n,t){gT.call(this,n,t)}function gC(n,t){gT.call(this,n,t)}function pC(n,t){gT.call(this,n,t)}function vC(n,t){gT.call(this,n,t)}function mC(n,t){gT.call(this,n,t)}function yC(n,t){gT.call(this,n,t)}function kC(n,t){gT.call(this,n,t)}function jC(n,t){gT.call(this,n,t)}function EC(n,t){gT.call(this,n,t)}function TC(n,t){gT.call(this,n,t)}function MC(n,t){gT.call(this,n,t)}function SC(n,t){gT.call(this,n,t)}function PC(n,t){return SN(n.c,t)}function CC(n,t){return SN(t.b,n)}function IC(n,t){return-n.b.Je(t)}function OC(n,t){return SN(n.g,t)}function AC(n,t){gT.call(this,n,t)}function $C(n,t){gT.call(this,n,t)}function LC(n,t){this.a=n,this.b=t}function NC(n,t){this.a=n,this.b=t}function xC(n,t){this.a=n,this.b=t}function DC(n,t){gT.call(this,n,t)}function RC(n,t){gT.call(this,n,t)}function KC(n,t){gT.call(this,n,t)}function _C(n,t){gT.call(this,n,t)}function FC(n,t){gT.call(this,n,t)}function BC(n,t){gT.call(this,n,t)}function HC(n,t){gT.call(this,n,t)}function qC(n,t){gT.call(this,n,t)}function GC(n,t){gT.call(this,n,t)}function zC(n,t){gT.call(this,n,t)}function UC(n,t){gT.call(this,n,t)}function XC(n,t){gT.call(this,n,t)}function WC(n,t){gT.call(this,n,t)}function VC(n,t){gT.call(this,n,t)}function QC(n,t){gT.call(this,n,t)}function YC(n,t){gT.call(this,n,t)}function JC(n,t){this.a=n,this.b=t}function ZC(n,t){this.a=n,this.b=t}function nI(n,t){this.a=n,this.b=t}function tI(n,t){this.a=n,this.b=t}function eI(n,t){this.a=n,this.b=t}function iI(n,t){this.a=n,this.b=t}function rI(n,t){this.a=n,this.b=t}function cI(n,t){gT.call(this,n,t)}function aI(n,t){this.a=n,this.b=t}function uI(n,t){this.a=n,this.b=t}function oI(n,t){this.a=n,this.b=t}function sI(n,t){this.a=n,this.b=t}function hI(n,t){this.a=n,this.b=t}function fI(n,t){this.a=n,this.b=t}function lI(n,t){this.b=n,this.a=t}function bI(n,t){this.b=n,this.a=t}function wI(n,t){this.b=n,this.a=t}function dI(n,t){this.b=n,this.a=t}function gI(n,t){this.a=n,this.b=t}function pI(n,t){this.a=n,this.b=t}function vI(n,t){JLn(n.a,BB(t,56))}function mI(n,t){v7(n.a,BB(t,11))}function yI(n,t){return hH(),t!=n}function kI(){return Rk(),new ket}function jI(){qZ(),this.b=new Rv}function EI(){dxn(),this.a=new Rv}function TI(){KZ(),KG.call(this)}function MI(n,t){gT.call(this,n,t)}function SI(n,t){this.a=n,this.b=t}function PI(n,t){this.a=n,this.b=t}function CI(n,t){this.a=n,this.b=t}function II(n,t){this.a=n,this.b=t}function OI(n,t){this.a=n,this.b=t}function AI(n,t){this.a=n,this.b=t}function $I(n,t){this.d=n,this.b=t}function LI(n,t){this.d=n,this.e=t}function NI(n,t){this.f=n,this.c=t}function xI(n,t){this.b=n,this.c=t}function DI(n,t){this.i=n,this.g=t}function RI(n,t){this.e=n,this.a=t}function KI(n,t){this.a=n,this.b=t}function _I(n,t){n.i=null,arn(n,t)}function FI(n,t){n&&VW(hAt,n,t)}function BI(n,t){return rdn(n.a,t)}function HI(n){return adn(n.c,n.b)}function qI(n){return n?n.dd():null}function GI(n){return null==n?null:n}function zI(n){return typeof n===$Wn}function UI(n){return typeof n===LWn}function XI(n){return typeof n===NWn}function WI(n,t){return n.Hd().Xb(t)}function VI(n,t){return Qcn(n.Kc(),t)}function QI(n,t){return 0==Vhn(n,t)}function YI(n,t){return Vhn(n,t)>=0}function JI(n,t){return 0!=Vhn(n,t)}function ZI(n){return""+(kW(n),n)}function nO(n,t){return n.substr(t)}function tO(n){return zbn(n),n.d.gc()}function eO(n){return zOn(n,n.c),n}function iO(n){return JH(null==n),n}function rO(n,t){return n.a+=""+t,n}function cO(n,t){return n.a+=""+t,n}function aO(n,t){return n.a+=""+t,n}function uO(n,t){return n.a+=""+t,n}function oO(n,t){return n.a+=""+t,n}function sO(n,t){return n.a+=""+t,n}function hO(n,t){r5(n,t,n.a,n.a.a)}function fO(n,t){r5(n,t,n.c.b,n.c)}function lO(n,t,e){Kjn(t,RPn(n,e))}function bO(n,t,e){Kjn(t,RPn(n,e))}function wO(n,t){Tnn(new AL(n),t)}function dO(n,t){n.q.setTime(j2(t))}function gO(n,t){zz.call(this,n,t)}function pO(n,t){zz.call(this,n,t)}function vO(n,t){zz.call(this,n,t)}function mO(n){$U(this),Tcn(this,n)}function yO(n){return l1(n,0),null}function kO(n){return n.a=0,n.b=0,n}function jO(n,t){return n.a=t.g+1,n}function EO(n,t){return 2==n.j[t.p]}function TO(n){return sX(BB(n,79))}function MO(){MO=O,Art=lhn(tpn())}function SO(){SO=O,Zot=lhn(ENn())}function PO(){this.b=new XT(etn(12))}function CO(){this.b=0,this.a=!1}function IO(){this.b=0,this.a=!1}function OO(n){this.a=n,Bh.call(this)}function AO(n){this.a=n,Bh.call(this)}function $O(n,t){iR.call(this,n,t)}function LO(n,t){tK.call(this,n,t)}function NO(n,t){DI.call(this,n,t)}function xO(n,t){Aan.call(this,n,t)}function DO(n,t){QN.call(this,n,t)}function RO(n,t){nS(),VW(mAt,n,t)}function KO(n,t){return fx(n.a,0,t)}function _O(n,t){return n.a.a.a.cc(t)}function FO(n,t){return GI(n)===GI(t)}function BO(n,t){return Pln(n.a,t.a)}function HO(n,t){return E$(n.a,t.a)}function qO(n,t){return FU(n.a,t.a)}function GO(n,t){return n.indexOf(t)}function zO(n,t){return n==t?0:n?1:-1}function UO(n){return n<10?"0"+n:""+n}function XO(n){return yX(n),new OO(n)}function WO(n){return M$(n.l,n.m,n.h)}function VO(n){return CJ((kW(n),n))}function QO(n){return CJ((kW(n),n))}function YO(n,t){return E$(n.g,t.g)}function JO(n){return typeof n===LWn}function ZO(n){return n==Zat||n==eut}function nA(n){return n==Zat||n==nut}function tA(n){return E7(n.b.b,n,0)}function eA(n){this.a=kI(),this.b=n}function iA(n){this.a=kI(),this.b=n}function rA(n,t){return WB(n.a,t),t}function cA(n,t){return WB(n.c,t),n}function aA(n,t){return Jcn(n.a,t),n}function uA(n,t){return G_(),t.a+=n}function oA(n,t){return G_(),t.a+=n}function sA(n,t){return G_(),t.c+=n}function hA(n,t){z9(n,0,n.length,t)}function fA(){ew.call(this,new v4)}function lA(){uG.call(this,0,0,0,0)}function bA(){UV.call(this,0,0,0,0)}function wA(n){this.a=n.a,this.b=n.b}function dA(n){return n==_Pt||n==FPt}function gA(n){return n==HPt||n==KPt}function pA(n){return n==fvt||n==hvt}function vA(n){return n!=QCt&&n!=YCt}function mA(n){return n.Lg()&&n.Mg()}function yA(n){return mV(BB(n,118))}function kA(n){return Jcn(new B2,n)}function jA(n,t){return new Aan(t,n)}function EA(n,t){return new Aan(t,n)}function TA(n,t,e){jen(n,t),Een(n,e)}function MA(n,t,e){Sen(n,t),Men(n,e)}function SA(n,t,e){Pen(n,t),Cen(n,e)}function PA(n,t,e){Ten(n,t),Oen(n,e)}function CA(n,t,e){Ien(n,t),Aen(n,e)}function IA(n,t){Dsn(n,t),xen(n,n.D)}function OA(n){NI.call(this,n,!0)}function AA(n,t,e){ND.call(this,n,t,e)}function $A(n){ODn(),san.call(this,n)}function LA(){gS.call(this,"Head",1)}function NA(){gS.call(this,"Tail",3)}function xA(n){n.c=x8(Ant,HWn,1,0,5,1)}function DA(n){n.a=x8(Ant,HWn,1,8,5,1)}function RA(n){Otn(n.xf(),new Sw(n))}function KA(n){return null!=n?nsn(n):0}function _A(n,t){return Ctn(t,WJ(n))}function FA(n,t){return Ctn(t,WJ(n))}function BA(n,t){return n[n.length]=t}function HA(n,t){return n[n.length]=t}function qA(n){return FB(n.b.Kc(),n.a)}function GA(n,t){return Uin(PX(n.d),t)}function zA(n,t){return Uin(PX(n.g),t)}function UA(n,t){return Uin(PX(n.j),t)}function XA(n,t){iR.call(this,n.b,t)}function WA(n){uG.call(this,n,n,n,n)}function VA(n){return n.b&&VBn(n),n.a}function QA(n){return n.b&&VBn(n),n.c}function YA(n,t){Qet||(n.b=t)}function JA(n,t,e){return $X(n,t,e),e}function ZA(n,t,e){$X(n.c[t.g],t.g,e)}function n$(n,t,e){BB(n.c,69).Xh(t,e)}function t$(n,t,e){SA(e,e.i+n,e.j+t)}function e$(n,t){f9(a4(n.a),e1(t))}function i$(n,t){f9(H7(n.a),i1(t))}function r$(n){wWn(),Ap.call(this,n)}function c$(n){return null==n?0:nsn(n)}function a$(){a$=O,syt=new Hbn(oCt)}function u$(){u$=O,new o$,new Np}function o$(){new xp,new xp,new xp}function s$(){s$=O,Mv(),itt=new xp}function h$(){h$=O,e.Math.log(2)}function f$(){f$=O,zM(),R$t=COt}function l$(){throw Hp(new tk(Tnt))}function b$(){throw Hp(new tk(Tnt))}function w$(){throw Hp(new tk(Mnt))}function d$(){throw Hp(new tk(Mnt))}function g$(n){this.a=n,QB.call(this,n)}function p$(n){this.a=n,ST.call(this,n)}function v$(n){this.a=n,ST.call(this,n)}function m$(n,t){yG(n.c,n.c.length,t)}function y$(n){return n.a<n.c.c.length}function k$(n){return n.a<n.c.a.length}function j$(n,t){return n.a?n.b:t.De()}function E$(n,t){return n<t?-1:n>t?1:0}function T$(n,t){return Vhn(n,t)>0?n:t}function M$(n,t,e){return{l:n,m:t,h:e}}function S$(n,t){null!=n.a&&mI(t,n.a)}function P$(n){n.a=new $,n.c=new $}function C$(n){this.b=n,this.a=new Np}function I$(n){this.b=new et,this.a=n}function O$(n){LR.call(this),this.a=n}function A$(){gS.call(this,"Range",2)}function $$(){tjn(),this.a=new CNn(Uat)}function L$(n,t){yX(t),EV(n).Jc(new b)}function N$(n,t){return BZ(),t.n.b+=n}function x$(n,t,e){return VW(n.g,e,t)}function D$(n,t,e){return VW(n.k,e,t)}function R$(n,t){return VW(n.a,t.a,t)}function K$(n,t,e){return Idn(t,e,n.c)}function _$(n){return new xC(n.c,n.d)}function F$(n){return new xC(n.c,n.d)}function B$(n){return new xC(n.a,n.b)}function H$(n,t){return tzn(n.a,t,null)}function q$(n){SZ(n,null),MZ(n,null)}function G$(n){WZ(n,null),VZ(n,null)}function z$(){QN.call(this,null,null)}function U$(){YN.call(this,null,null)}function X$(n){this.a=n,xp.call(this)}function W$(n){this.b=(SQ(),new Xb(n))}function V$(n){n.j=x8(Ftt,sVn,310,0,0,1)}function Q$(n,t,e){n.c.Vc(t,BB(e,133))}function Y$(n,t,e){n.c.ji(t,BB(e,133))}function J$(n,t){sqn(n),n.Gc(BB(t,15))}function Z$(n,t){return Bqn(n.c,n.b,t)}function nL(n,t){return new pN(n.Kc(),t)}function tL(n,t){return-1!=Fun(n.Kc(),t)}function eL(n,t){return null!=n.a.Bc(t)}function iL(n){return n.Ob()?n.Pb():null}function rL(n){return Bdn(n,0,n.length)}function cL(n,t){return null!=n&&Qpn(n,t)}function aL(n,t){n.q.setHours(t),lBn(n,t)}function uL(n,t){n.c&&(RH(t),kJ(t))}function oL(n,t,e){BB(n.Kb(e),164).Nb(t)}function sL(n,t,e){return HGn(n,t,e),e}function hL(n,t,e){n.a=1502^t,n.b=e^aYn}function fL(n,t,e){return n.a[t.g][e.g]}function lL(n,t){return n.a[t.c.p][t.p]}function bL(n,t){return n.e[t.c.p][t.p]}function wL(n,t){return n.c[t.c.p][t.p]}function dL(n,t){return n.j[t.p]=pLn(t)}function gL(n,t){return f6(n.f,t.tg())}function pL(n,t){return f6(n.b,t.tg())}function vL(n,t){return n.a<XK(t)?-1:1}function mL(n,t,e){return e?0!=t:t!=n-1}function yL(n,t,e){return n.a=t,n.b=e,n}function kL(n,t){return n.a*=t,n.b*=t,n}function jL(n,t,e){return $X(n.g,t,e),e}function EL(n,t,e,i){$X(n.a[t.g],e.g,i)}function TL(n,t){_x(t,n.a.a.a,n.a.a.b)}function ML(n){n.a=BB(yan(n.b.a,4),126)}function SL(n){n.a=BB(yan(n.b.a,4),126)}function PL(n){OY(n,i8n),HLn(n,IUn(n))}function CL(){CL=O,Set=new vy(null)}function IL(){(IL=O)(),$et=new z}function OL(){this.Bb|=256,this.Bb|=512}function AL(n){this.i=n,this.f=this.i.j}function $L(n,t,e){yH.call(this,n,t,e)}function LL(n,t,e){$L.call(this,n,t,e)}function NL(n,t,e){$L.call(this,n,t,e)}function xL(n,t,e){LL.call(this,n,t,e)}function DL(n,t,e){yH.call(this,n,t,e)}function RL(n,t,e){yH.call(this,n,t,e)}function KL(n,t,e){MH.call(this,n,t,e)}function _L(n,t,e){MH.call(this,n,t,e)}function FL(n,t,e){KL.call(this,n,t,e)}function BL(n,t,e){DL.call(this,n,t,e)}function HL(n,t){this.a=n,ST.call(this,t)}function qL(n,t){this.a=n,uk.call(this,t)}function GL(n,t){this.a=n,uk.call(this,t)}function zL(n,t){this.a=n,uk.call(this,t)}function UL(n){this.a=n,hl.call(this,n.d)}function XL(n){this.c=n,this.a=this.c.a}function WL(n,t){this.a=t,uk.call(this,n)}function VL(n,t){this.a=t,d4.call(this,n)}function QL(n,t){this.a=n,d4.call(this,t)}function YL(n,t){return wz(bz(n.c)).Xb(t)}function JL(n,t){return ebn(n,new Ck,t).a}function ZL(n,t){return yX(t),new nN(n,t)}function nN(n,t){this.a=t,OT.call(this,n)}function tN(n){this.b=n,this.a=this.b.a.e}function eN(n){n.b.Qb(),--n.d.f.d,$G(n.d)}function iN(n){tl.call(this,BB(yX(n),35))}function rN(n){tl.call(this,BB(yX(n),35))}function cN(){gT.call(this,"INSTANCE",0)}function aN(n){if(!n)throw Hp(new wv)}function uN(n){if(!n)throw Hp(new dv)}function oN(n){if(!n)throw Hp(new yv)}function sN(){sN=O,JM(),cLt=new Ff}function hN(){hN=O,ptt=!1,vtt=!0}function fN(n){Ab.call(this,(kW(n),n))}function lN(n){Ab.call(this,(kW(n),n))}function bN(n){Hb.call(this,n),this.a=n}function wN(n){qb.call(this,n),this.a=n}function dN(n){Ak.call(this,n),this.a=n}function gN(){V$(this),jQ(this),this._d()}function pN(n,t){this.a=t,OT.call(this,n)}function vN(n,t){return new KPn(n.a,n.b,t)}function mN(n,t){return n.lastIndexOf(t)}function yN(n,t,e){return n.indexOf(t,e)}function kN(n){return null==n?zWn:Bbn(n)}function jN(n){return null==n?null:n.name}function EN(n){return null!=n.a?n.a:null}function TN(n){return EE(n.a)?u1(n):null}function MN(n,t){return null!=$J(n.a,t)}function SN(n,t){return!!t&&n.b[t.g]==t}function PN(n){return n.$H||(n.$H=++cit)}function CN(n){return n.l+n.m*IQn+n.h*OQn}function IN(n,t){return WB(t.a,n.a),n.a}function ON(n,t){return WB(t.b,n.a),n.a}function AN(n,t){return WB(t.a,n.a),n.a}function $N(n){return Px(null!=n.a),n.a}function LN(n){ew.call(this,new q8(n))}function NN(n,t){Sgn.call(this,n,t,null)}function xN(n){this.a=n,Bb.call(this,n)}function DN(){DN=O,Lrt=new iR(dJn,0)}function RN(n,t){return++n.b,WB(n.a,t)}function KN(n,t){return++n.b,y7(n.a,t)}function _N(n,t){return Pln(n.n.a,t.n.a)}function FN(n,t){return Pln(n.c.d,t.c.d)}function BN(n,t){return Pln(n.c.c,t.c.c)}function HN(n,t){return BB(h6(n.b,t),15)}function qN(n,t){return n.n.b=(kW(t),t)}function GN(n,t){return n.n.b=(kW(t),t)}function zN(n){return y$(n.a)||y$(n.b)}function UN(n,t,e){return p3(n,t,e,n.b)}function XN(n,t,e){return p3(n,t,e,n.c)}function WN(n,t,e){BB(D7(n,t),21).Fc(e)}function VN(n,t,e){Oln(n.a,e),Ivn(n.a,t)}function QN(n,t){QM(),this.a=n,this.b=t}function YN(n,t){YM(),this.b=n,this.c=t}function JN(n,t){FG(),this.f=t,this.d=n}function ZN(n,t){w6(t,n),this.d=n,this.c=t}function nx(n){var t;t=n.a,n.a=n.b,n.b=t}function tx(n){return G_(),!!n&&!n.dc()}function ex(n){return new h4(3,n)}function ix(n,t){return new bK(n,n.gc(),t)}function rx(n){return ry(),Cnn((DZ(),Xnt),n)}function cx(n){this.d=n,AL.call(this,n)}function ax(n){this.c=n,AL.call(this,n)}function ux(n){this.c=n,cx.call(this,n)}function ox(){MM(),this.b=new yd(this)}function sx(n){return lin(n,AVn),new J6(n)}function hx(n){return PY(),parseInt(n)||-1}function fx(n,t,e){return n.substr(t,e-t)}function lx(n,t,e){return yN(n,YTn(t),e)}function bx(n){return VU(n.c,n.c.length)}function wx(n){return null!=n.f?n.f:""+n.g}function dx(n){return null!=n.f?n.f:""+n.g}function gx(n){return Px(0!=n.b),n.a.a.c}function px(n){return Px(0!=n.b),n.c.b.c}function vx(n){cL(n,150)&&BB(n,150).Gh()}function mx(n){return n.b=BB(mQ(n.a),42)}function yx(n){hM(),this.b=n,this.a=!0}function kx(n){fM(),this.b=n,this.a=!0}function jx(n){n.d=new Cx(n),n.e=new xp}function Ex(n){if(!n)throw Hp(new vv)}function Tx(n){if(!n)throw Hp(new wv)}function Mx(n){if(!n)throw Hp(new dv)}function Sx(n){if(!n)throw Hp(new lv)}function Px(n){if(!n)throw Hp(new yv)}function Cx(n){nH.call(this,n,null,null)}function Ix(){gT.call(this,"POLYOMINO",0)}function Ox(n,t,e,i){sz.call(this,n,t,e,i)}function Ax(n,t){return _Mn(),JIn(n,t.e,t)}function $x(n,t,e){return AM(),e.qg(n,t)}function Lx(n,t){return!!n.q&&hU(n.q,t)}function Nx(n,t){return n>0?t*t/n:t*t*100}function xx(n,t){return n>0?t/(n*n):100*t}function Dx(n,t,e){return WB(t,own(n,e))}function Rx(n,t,e){x9(),n.Xe(t)&&e.td(n)}function Kx(n,t,e){n.Zc(t).Rb(e)}function _x(n,t,e){return n.a+=t,n.b+=e,n}function Fx(n,t,e){return n.a*=t,n.b*=e,n}function Bx(n,t,e){return n.a-=t,n.b-=e,n}function Hx(n,t){return n.a=t.a,n.b=t.b,n}function qx(n){return n.a=-n.a,n.b=-n.b,n}function Gx(n){this.c=n,this.a=1,this.b=1}function zx(n){this.c=n,Pen(n,0),Cen(n,0)}function Ux(n){YT.call(this),nin(this,n)}function Xx(n){RXn(),Bp(this),this.mf(n)}function Wx(n,t){QM(),QN.call(this,n,t)}function Vx(n,t){YM(),YN.call(this,n,t)}function Qx(n,t){YM(),YN.call(this,n,t)}function Yx(n,t){YM(),Vx.call(this,n,t)}function Jx(n,t,e){y9.call(this,n,t,e,2)}function Zx(n,t){f$(),cG.call(this,n,t)}function nD(n,t){f$(),Zx.call(this,n,t)}function tD(n,t){f$(),Zx.call(this,n,t)}function eD(n,t){f$(),tD.call(this,n,t)}function iD(n,t){f$(),cG.call(this,n,t)}function rD(n,t){f$(),iD.call(this,n,t)}function cD(n,t){f$(),cG.call(this,n,t)}function aD(n,t){return n.c.Fc(BB(t,133))}function uD(n,t,e){return NHn(F7(n,t),e)}function oD(n,t,e){return t.Qk(n.e,n.c,e)}function sD(n,t,e){return t.Rk(n.e,n.c,e)}function hD(n,t){return tfn(n.e,BB(t,49))}function fD(n,t,e){sln(H7(n.a),t,i1(e))}function lD(n,t,e){sln(a4(n.a),t,e1(e))}function bD(n,t){t.$modCount=n.$modCount}function wD(){wD=O,Vkt=new up("root")}function dD(){dD=O,pAt=new Tm,new Mm}function gD(){this.a=new pJ,this.b=new pJ}function pD(){jin.call(this),this.Bb|=BQn}function vD(){gT.call(this,"GROW_TREE",0)}function mD(n){return null==n?null:wUn(n)}function yD(n){return null==n?null:LSn(n)}function kD(n){return null==n?null:Bbn(n)}function jD(n){return null==n?null:Bbn(n)}function ED(n){null==n.o&&g$n(n)}function TD(n){return JH(null==n||zI(n)),n}function MD(n){return JH(null==n||UI(n)),n}function SD(n){return JH(null==n||XI(n)),n}function PD(n){this.q=new e.Date(j2(n))}function CD(n,t){this.c=n,pT.call(this,n,t)}function ID(n,t){this.a=n,CD.call(this,n,t)}function OD(n,t){this.d=n,Mb(this),this.b=t}function AD(n,t){B8.call(this,n),this.a=t}function $D(n,t){B8.call(this,n),this.a=t}function LD(n){qwn.call(this,0,0),this.f=n}function ND(n,t,e){W6.call(this,n,t,e,null)}function xD(n,t,e){W6.call(this,n,t,e,null)}function DD(n,t,e){return n.ue(t,e)<=0?e:t}function RD(n,t,e){return n.ue(t,e)<=0?t:e}function KD(n,t){return BB(lnn(n.b,t),149)}function _D(n,t){return BB(lnn(n.c,t),229)}function FD(n){return BB(xq(n.a,n.b),287)}function BD(n){return new xC(n.c,n.d+n.a)}function HD(n){return BZ(),pA(BB(n,197))}function qD(){qD=O,$rt=nbn((mdn(),_It))}function GD(n,t){t.a?Fxn(n,t):MN(n.a,t.b)}function zD(n,t){Qet||WB(n.a,t)}function UD(n,t){return mM(),wan(t.d.i,n)}function XD(n,t){return Irn(),new cKn(t,n)}function WD(n,t){return OY(t,uJn),n.f=t,n}function VD(n,t,e){return e=T_n(n,t,3,e)}function QD(n,t,e){return e=T_n(n,t,6,e)}function YD(n,t,e){return e=T_n(n,t,9,e)}function JD(n,t,e){++n.j,n.Ki(),L8(n,t,e)}function ZD(n,t,e){++n.j,n.Hi(t,n.oi(t,e))}function nR(n,t,e){n.Zc(t).Rb(e)}function tR(n,t,e){return ZBn(n.c,n.b,t,e)}function eR(n,t){return(t&DWn)%n.d.length}function iR(n,t){up.call(this,n),this.a=t}function rR(n,t){kp.call(this,n),this.a=t}function cR(n,t){kp.call(this,n),this.a=t}function aR(n,t){this.c=n,gtn.call(this,t)}function uR(n,t){this.a=n,yp.call(this,t)}function oR(n,t){this.a=n,yp.call(this,t)}function sR(n){this.a=(lin(n,AVn),new J6(n))}function hR(n){this.a=(lin(n,AVn),new J6(n))}function fR(n){return!n.a&&(n.a=new w),n.a}function lR(n){return n>8?0:n+1}function bR(n,t){return hN(),n==t?0:n?1:-1}function wR(n,t,e){return mG(n,BB(t,22),e)}function dR(n,t,e){return n.apply(t,e)}function gR(n,t,e){return n.a+=Bdn(t,0,e),n}function pR(n,t){var e;return e=n.e,n.e=t,e}function vR(n,t){n[iYn].call(n,t)}function mR(n,t){n[iYn].call(n,t)}function yR(n,t){n.a.Vc(n.b,t),++n.b,n.c=-1}function kR(n){$U(n.e),n.d.b=n.d,n.d.a=n.d}function jR(n){n.b?jR(n.b):n.f.c.zc(n.e,n.d)}function ER(n,t,e){dM(),Il(n,t.Ce(n.a,e))}function TR(n,t){return Qj(Mdn(n.a,t,!0))}function MR(n,t){return Qj(Sdn(n.a,t,!0))}function SR(n,t){return qk(new Array(t),n)}function PR(n){return String.fromCharCode(n)}function CR(n){return null==n?null:n.message}function IR(){this.a=new Np,this.b=new Np}function OR(){this.a=new bt,this.b=new Tv}function AR(){this.b=new Gj,this.c=new Np}function $R(){this.d=new Gj,this.e=new Gj}function LR(){this.n=new Gj,this.o=new Gj}function NR(){this.n=new bm,this.i=new bA}function xR(){this.a=new nf,this.b=new uc}function DR(){this.a=new Np,this.d=new Np}function RR(){this.b=new Rv,this.a=new Rv}function KR(){this.b=new xp,this.a=new xp}function _R(){this.b=new AE,this.a=new da}function FR(){NR.call(this),this.a=new Gj}function BR(n){Oan.call(this,n,(Z9(),Net))}function HR(n,t,e,i){uG.call(this,n,t,e,i)}function qR(n,t,e){null!=e&&Lin(t,Amn(n,e))}function GR(n,t,e){null!=e&&Nin(t,Amn(n,e))}function zR(n,t,e){return e=T_n(n,t,11,e)}function UR(n,t){return n.a+=t.a,n.b+=t.b,n}function XR(n,t){return n.a-=t.a,n.b-=t.b,n}function WR(n,t){return n.n.a=(kW(t),t+10)}function VR(n,t){return n.n.a=(kW(t),t+10)}function QR(n,t){return t==n||Sjn(CLn(t),n)}function YR(n,t){return null==VW(n.a,t,"")}function JR(n,t){return mM(),!wan(t.d.i,n)}function ZR(n,t){dA(n.f)?c$n(n,t):ITn(n,t)}function nK(n,t){return t.Hh(n.a)}function tK(n,t){Ay.call(this,e9n+n+o8n+t)}function eK(n,t,e,i){eU.call(this,n,t,e,i)}function iK(n,t,e,i){eU.call(this,n,t,e,i)}function rK(n,t,e,i){iK.call(this,n,t,e,i)}function cK(n,t,e,i){iU.call(this,n,t,e,i)}function aK(n,t,e,i){iU.call(this,n,t,e,i)}function uK(n,t,e,i){iU.call(this,n,t,e,i)}function oK(n,t,e,i){aK.call(this,n,t,e,i)}function sK(n,t,e,i){aK.call(this,n,t,e,i)}function hK(n,t,e,i){uK.call(this,n,t,e,i)}function fK(n,t,e,i){sK.call(this,n,t,e,i)}function lK(n,t,e,i){Zz.call(this,n,t,e,i)}function bK(n,t,e){this.a=n,ZN.call(this,t,e)}function wK(n,t,e){this.c=t,this.b=e,this.a=n}function dK(n,t,e){return n.d=BB(t.Kb(e),164)}function gK(n,t){return n.Aj().Nh().Kh(n,t)}function pK(n,t){return n.Aj().Nh().Ih(n,t)}function vK(n,t){return kW(n),GI(n)===GI(t)}function mK(n,t){return kW(n),GI(n)===GI(t)}function yK(n,t){return Qj(Mdn(n.a,t,!1))}function kK(n,t){return Qj(Sdn(n.a,t,!1))}function jK(n,t){return n.b.sd(new $S(n,t))}function EK(n,t){return n.b.sd(new LS(n,t))}function TK(n,t){return n.b.sd(new NS(n,t))}function MK(n,t,e){return n.lastIndexOf(t,e)}function SK(n,t,e){return Pln(n[t.b],n[e.b])}function PK(n,t){return hon(t,(HXn(),Rdt),n)}function CK(n,t){return E$(t.a.d.p,n.a.d.p)}function IK(n,t){return E$(n.a.d.p,t.a.d.p)}function OK(n,t){return Pln(n.c-n.s,t.c-t.s)}function AK(n){return n.c?E7(n.c.a,n,0):-1}function $K(n){return n<100?null:new Fj(n)}function LK(n){return n==UCt||n==WCt||n==XCt}function NK(n,t){return cL(t,15)&&QDn(n.c,t)}function xK(n,t){Qet||t&&(n.d=t)}function DK(n,t){return!!lsn(n,t)}function RK(n,t){this.c=n,GU.call(this,n,t)}function KK(n){this.c=n,vO.call(this,bVn,0)}function _K(n,t){JB.call(this,n,n.length,t)}function FK(n,t,e){return BB(n.c,69).lk(t,e)}function BK(n,t,e){return BB(n.c,69).mk(t,e)}function HK(n,t,e){return oD(n,BB(t,332),e)}function qK(n,t,e){return sD(n,BB(t,332),e)}function GK(n,t,e){return IEn(n,BB(t,332),e)}function zK(n,t,e){return QTn(n,BB(t,332),e)}function UK(n,t){return null==t?null:lfn(n.b,t)}function XK(n){return UI(n)?(kW(n),n):n.ke()}function WK(n){return!isNaN(n)&&!isFinite(n)}function VK(n){s_(),this.a=(SQ(),new Ak(n))}function QK(n){hH(),this.d=n,this.a=new Lp}function YK(n,t,e){this.a=n,this.b=t,this.c=e}function JK(n,t,e){this.a=n,this.b=t,this.c=e}function ZK(n,t,e){this.d=n,this.b=e,this.a=t}function n_(n){P$(this),yQ(this),Frn(this,n)}function t_(n){xA(this),tH(this.c,0,n.Pc())}function e_(n){fW(n.a),z8(n.c,n.b),n.b=null}function i_(n){this.a=n,$T(),fan(Date.now())}function r_(){r_=O,iit=new r,rit=new r}function c_(){c_=O,Tet=new L,Met=new N}function a_(){a_=O,wAt=x8(Ant,HWn,1,0,5,1)}function u_(){u_=O,M$t=x8(Ant,HWn,1,0,5,1)}function o_(){o_=O,S$t=x8(Ant,HWn,1,0,5,1)}function s_(){s_=O,new rv((SQ(),SQ(),set))}function h_(n){return Z9(),Cnn((n7(),_et),n)}function f_(n){return qsn(),Cnn((e8(),Zet),n)}function l_(n){return hpn(),Cnn((I4(),pit),n)}function b_(n){return Rnn(),Cnn((O4(),kit),n)}function w_(n){return tRn(),Cnn((xan(),Fit),n)}function d_(n){return Dtn(),Cnn((Z6(),Wit),n)}function g_(n){return J9(),Cnn((n8(),trt),n)}function p_(n){return G7(),Cnn((t8(),urt),n)}function v_(n){return dWn(),Cnn((MO(),Art),n)}function m_(n){return Dan(),Cnn((e7(),_rt),n)}function y_(n){return Hpn(),Cnn((i7(),zrt),n)}function k_(n){return qpn(),Cnn((r7(),ict),n)}function j_(n){return wM(),Cnn((Q2(),act),n)}function E_(n){return Knn(),Cnn((A4(),_ct),n)}function T_(n){return q7(),Cnn((i8(),Lat),n)}function M_(n){return yMn(),Cnn((Xnn(),qat),n)}function S_(n){return Aun(),Cnn((t7(),rut),n)}function P_(n){return Bfn(),Cnn((r8(),gut),n)}function C_(n,t){if(!n)throw Hp(new _y(t))}function I_(n){return uSn(),Cnn((hen(),Aut),n)}function O_(n){uG.call(this,n.d,n.c,n.a,n.b)}function A_(n){uG.call(this,n.d,n.c,n.a,n.b)}function $_(n,t,e){this.b=n,this.c=t,this.a=e}function L_(n,t,e){this.b=n,this.a=t,this.c=e}function N_(n,t,e){this.a=n,this.b=t,this.c=e}function x_(n,t,e){this.a=n,this.b=t,this.c=e}function D_(n,t,e){this.a=n,this.b=t,this.c=e}function R_(n,t,e){this.a=n,this.b=t,this.c=e}function K_(n,t,e){this.b=n,this.a=t,this.c=e}function __(n,t,e){this.e=t,this.b=n,this.d=e}function F_(n,t,e){return dM(),n.a.Od(t,e),t}function B_(n){var t;return(t=new jn).e=n,t}function H_(n){var t;return(t=new Zv).b=n,t}function q_(){q_=O,Uut=new Ne,Xut=new xe}function G_(){G_=O,dst=new vr,gst=new mr}function z_(n){return Iun(),Cnn((a7(),ost),n)}function U_(n){return Oun(),Cnn((o7(),Est),n)}function X_(n){return kDn(),Cnn((Gcn(),Vst),n)}function W_(n){return $Pn(),Cnn((ben(),rht),n)}function V_(n){return V8(),Cnn((R4(),oht),n)}function Q_(n){return Oin(),Cnn((c8(),bht),n)}function Y_(n){return LEn(),Cnn((Hnn(),Ost),n)}function J_(n){return Crn(),Cnn((o8(),_st),n)}function Z_(n){return uin(),Cnn((a8(),vht),n)}function nF(n){return Vvn(),Cnn((Fnn(),Mht),n)}function tF(n){return _nn(),Cnn((L4(),Iht),n)}function eF(n){return Jun(),Cnn((u8(),Nht),n)}function iF(n){return gSn(),Cnn((pen(),Hht),n)}function rF(n){return g7(),Cnn((N4(),Uht),n)}function cF(n){return Bjn(),Cnn((den(),nft),n)}function aF(n){return JMn(),Cnn((wen(),oft),n)}function uF(n){return bDn(),Cnn((Vun(),yft),n)}function oF(n){return Kan(),Cnn((h8(),Mft),n)}function sF(n){return z7(),Cnn((s8(),Oft),n)}function hF(n){return z2(),Cnn((K4(),Nft),n)}function fF(n){return Tbn(),Cnn((qnn(),zlt),n)}function lF(n){return TTn(),Cnn((gen(),rvt),n)}function bF(n){return Mhn(),Cnn((f8(),svt),n)}function wF(n){return bvn(),Cnn((s7(),dvt),n)}function dF(n){return ain(),Cnn((w8(),Uvt),n)}function gF(n){return sNn(),Cnn((qcn(),$vt),n)}function pF(n){return mon(),Cnn((b8(),Rvt),n)}function vF(n){return U7(),Cnn((D4(),Bvt),n)}function mF(n){return Hcn(),Cnn((l8(),Yvt),n)}function yF(n){return Nvn(),Cnn((Bnn(),jvt),n)}function kF(n){return A6(),Cnn((x4(),tmt),n)}function jF(n){return Usn(),Cnn((g8(),amt),n)}function EF(n){return dcn(),Cnn((p8(),fmt),n)}function TF(n){return $un(),Cnn((d8(),gmt),n)}function MF(n){return oin(),Cnn((v8(),Nmt),n)}function SF(n){return Q4(),Cnn((F4(),Gmt),n)}function PF(n){return gJ(),Cnn((B4(),iyt),n)}function CF(n){return oZ(),Cnn((H4(),uyt),n)}function IF(n){return O6(),Cnn((_4(),Pyt),n)}function OF(n){return dJ(),Cnn((q4(),Dyt),n)}function AF(n){return zyn(),Cnn((c7(),Hyt),n)}function $F(n){return DPn(),Cnn((ven(),Jyt),n)}function LF(n){return sZ(),Cnn((U4(),Fkt),n)}function NF(n){return Prn(),Cnn((z4(),Zkt),n)}function xF(n){return B0(),Cnn((G4(),Gkt),n)}function DF(n){return Cbn(),Cnn((m8(),rjt),n)}function RF(n){return D9(),Cnn((X4(),ojt),n)}function KF(n){return Hsn(),Cnn((y8(),bjt),n)}function _F(n){return Omn(),Cnn((u7(),zjt),n)}function FF(n){return Bcn(),Cnn((j8(),Qjt),n)}function BF(n){return Sbn(),Cnn((k8(),eEt),n)}function HF(n){return YLn(),Cnn((Unn(),BEt),n)}function qF(n){return Pbn(),Cnn((E8(),UEt),n)}function GF(n){return CM(),Cnn((W2(),VEt),n)}function zF(n){return IM(),Cnn((X2(),JEt),n)}function UF(n){return $6(),Cnn((V4(),eTt),n)}function XF(n){return $Sn(),Cnn((Gnn(),sTt),n)}function WF(n){return OM(),Cnn((V2(),UTt),n)}function VF(n){return Lun(),Cnn((W4(),QTt),n)}function QF(n){return rpn(),Cnn((znn(),bMt),n)}function YF(n){return PPn(),Cnn((zcn(),EMt),n)}function JF(n){return wvn(),Cnn((len(),xMt),n)}function ZF(n){return wEn(),Cnn((fen(),tSt),n)}function nB(n){return lWn(),Cnn((SO(),Zot),n)}function tB(n){return Srn(),Cnn(($4(),zut),n)}function eB(n){return Ffn(),Cnn((Wnn(),GPt),n)}function iB(n){return Rtn(),Cnn((M8(),VPt),n)}function rB(n){return Mbn(),Cnn((l7(),tCt),n)}function cB(n){return nMn(),Cnn((yen(),sCt),n)}function aB(n){return ufn(),Cnn((T8(),kCt),n)}function uB(n){return Xyn(),Cnn((f7(),PCt),n)}function oB(n){return n$n(),Cnn((Nan(),KCt),n)}function sB(n){return cpn(),Cnn((Vnn(),zCt),n)}function hB(n){return QEn(),Cnn((Htn(),ZCt),n)}function fB(n){return lIn(),Cnn((men(),uIt),n)}function lB(n){return mdn(),Cnn((w7(),BIt),n)}function bB(n){return n_n(),Cnn((Qun(),JIt),n)}function wB(n){return kUn(),Cnn((Qnn(),OIt),n)}function dB(n){return Fwn(),Cnn((b7(),rOt),n)}function gB(n){return Bsn(),Cnn((h7(),fOt),n)}function pB(n){return hAn(),Cnn((Ucn(),cAt),n)}function vB(n,t){return kW(n),n+(kW(t),t)}function mB(n,t){return $T(),f9(QQ(n.a),t)}function yB(n,t){return $T(),f9(QQ(n.a),t)}function kB(n,t){this.c=n,this.a=t,this.b=t-n}function jB(n,t,e){this.a=n,this.b=t,this.c=e}function EB(n,t,e){this.a=n,this.b=t,this.c=e}function TB(n,t,e){this.a=n,this.b=t,this.c=e}function MB(n,t,e){this.a=n,this.b=t,this.c=e}function SB(n,t,e){this.a=n,this.b=t,this.c=e}function PB(n,t,e){this.e=n,this.a=t,this.c=e}function CB(n,t,e){f$(),mJ.call(this,n,t,e)}function IB(n,t,e){f$(),rW.call(this,n,t,e)}function OB(n,t,e){f$(),rW.call(this,n,t,e)}function AB(n,t,e){f$(),rW.call(this,n,t,e)}function $B(n,t,e){f$(),IB.call(this,n,t,e)}function LB(n,t,e){f$(),IB.call(this,n,t,e)}function NB(n,t,e){f$(),LB.call(this,n,t,e)}function xB(n,t,e){f$(),OB.call(this,n,t,e)}function DB(n,t,e){f$(),AB.call(this,n,t,e)}function RB(n,t){return yX(n),yX(t),new hT(n,t)}function KB(n,t){return yX(n),yX(t),new _H(n,t)}function _B(n,t){return yX(n),yX(t),new FH(n,t)}function FB(n,t){return yX(n),yX(t),new lT(n,t)}function BB(n,t){return JH(null==n||Qpn(n,t)),n}function HB(n){var t;return fnn(t=new Np,n),t}function qB(n){var t;return fnn(t=new Rv,n),t}function GB(n){var t;return qrn(t=new zv,n),t}function zB(n){var t;return qrn(t=new YT,n),t}function UB(n){return!n.e&&(n.e=new Np),n.e}function XB(n){return!n.c&&(n.c=new Bo),n.c}function WB(n,t){return n.c[n.c.length]=t,!0}function VB(n,t){this.c=n,this.b=t,this.a=!1}function QB(n){this.d=n,Mb(this),this.b=rz(n.d)}function YB(){this.a=";,;",this.b="",this.c=""}function JB(n,t,e){Uz.call(this,t,e),this.a=n}function ZB(n,t,e){this.b=n,gO.call(this,t,e)}function nH(n,t,e){this.c=n,PS.call(this,t,e)}function tH(n,t,e){_Cn(e,0,n,t,e.length,!1)}function eH(n,t,e,i,r){n.b=t,n.c=e,n.d=i,n.a=r}function iH(n,t){t&&(n.b=t,n.a=(EW(t),t.a))}function rH(n,t,e,i,r){n.d=t,n.c=e,n.a=i,n.b=r}function cH(n){var t,e;t=n.b,e=n.c,n.b=e,n.c=t}function aH(n){var t,e;e=n.d,t=n.a,n.d=t,n.a=e}function uH(n){return uan(xU(JO(n)?Pan(n):n))}function oH(n,t){return E$(oq(n.d),oq(t.d))}function sH(n,t){return t==(kUn(),CIt)?n.c:n.d}function hH(){hH=O,kUn(),Rmt=CIt,Kmt=oIt}function fH(){this.b=Gy(MD(mpn((fRn(),aat))))}function lH(n){return dM(),x8(Ant,HWn,1,n,5,1)}function bH(n){return new xC(n.c+n.b,n.d+n.a)}function wH(n,t){return SM(),E$(n.d.p,t.d.p)}function dH(n){return Px(0!=n.b),Atn(n,n.a.a)}function gH(n){return Px(0!=n.b),Atn(n,n.c.b)}function pH(n,t){if(!n)throw Hp(new $y(t))}function vH(n,t){if(!n)throw Hp(new _y(t))}function mH(n,t,e){dP.call(this,n,t),this.b=e}function yH(n,t,e){LI.call(this,n,t),this.c=e}function kH(n,t,e){btn.call(this,t,e),this.d=n}function jH(n){o_(),yo.call(this),this.th(n)}function EH(n,t,e){this.a=n,NO.call(this,t,e)}function TH(n,t,e){this.a=n,NO.call(this,t,e)}function MH(n,t,e){LI.call(this,n,t),this.c=e}function SH(){R5(),oW.call(this,(WM(),zAt))}function PH(n){return null!=n&&!Xbn(n,LAt,NAt)}function CH(n,t){return(Wfn(n)<<4|Wfn(t))&QVn}function IH(n,t){return nV(),zvn(n,t),new GW(n,t)}function OH(n,t){var e;n.n&&(e=t,WB(n.f,e))}function AH(n,t,e){rtn(n,t,new GX(e))}function $H(n,t){var e;return e=n.c,Kin(n,t),e}function LH(n,t){return n.g=t<0?-1:t,n}function NH(n,t){return ztn(n),n.a*=t,n.b*=t,n}function xH(n,t,e,i,r){n.c=t,n.d=e,n.b=i,n.a=r}function DH(n,t){return r5(n,t,n.c.b,n.c),!0}function RH(n){n.a.b=n.b,n.b.a=n.a,n.a=n.b=null}function KH(n){this.b=n,this.a=lz(this.b.a).Ed()}function _H(n,t){this.b=n,this.a=t,Bh.call(this)}function FH(n,t){this.a=n,this.b=t,Bh.call(this)}function BH(n,t){Uz.call(this,t,1040),this.a=n}function HH(n){return 0==n||isNaN(n)?n:n<0?-1:1}function qH(n){return MQ(),PMn(n)==JJ(OMn(n))}function GH(n){return MQ(),OMn(n)==JJ(PMn(n))}function zH(n,t){return Yjn(n,new dP(t.a,t.b))}function UH(n){return!b5(n)&&n.c.i.c==n.d.i.c}function XH(n){var t;return t=n.n,n.a.b+t.d+t.a}function WH(n){var t;return t=n.n,n.e.b+t.d+t.a}function VH(n){var t;return t=n.n,n.e.a+t.b+t.c}function QH(n){return wWn(),new oG(0,n)}function YH(n){return n.a?n.a:eQ(n)}function JH(n){if(!n)throw Hp(new Ky(null))}function ZH(){ZH=O,SQ(),uLt=new Gb(P7n)}function nq(){nq=O,new svn((ty(),_nt),(ey(),Knt))}function tq(){tq=O,Itt=x8(Att,sVn,19,256,0,1)}function eq(n,t,e,i){awn.call(this,n,t,e,i,0,0)}function iq(n,t,e){return VW(n.b,BB(e.b,17),t)}function rq(n,t,e){return VW(n.b,BB(e.b,17),t)}function cq(n,t){return WB(n,new xC(t.a,t.b))}function aq(n,t){return n.c<t.c?-1:n.c==t.c?0:1}function uq(n){return n.e.c.length+n.g.c.length}function oq(n){return n.e.c.length-n.g.c.length}function sq(n){return n.b.c.length-n.e.c.length}function hq(n){return BZ(),(kUn(),bIt).Hc(n.j)}function fq(n){o_(),jH.call(this,n),this.a=-1}function lq(n,t){xI.call(this,n,t),this.a=this}function bq(n,t){var e;return(e=mX(n,t)).i=2,e}function wq(n,t){return++n.j,n.Ti(t)}function dq(n,t,e){return n.a=-1,WN(n,t.g,e),n}function gq(n,t,e){Kzn(n.a,n.b,n.c,BB(t,202),e)}function pq(n,t){Bin(n,null==t?null:(kW(t),t))}function vq(n,t){Rin(n,null==t?null:(kW(t),t))}function mq(n,t){Rin(n,null==t?null:(kW(t),t))}function yq(n,t,e){return new wK(dW(n).Ie(),e,t)}function kq(n,t,e,i,r,c){return Vjn(n,t,e,i,r,0,c)}function jq(){jq=O,jtt=x8(Ttt,sVn,217,256,0,1)}function Eq(){Eq=O,$tt=x8(Rtt,sVn,162,256,0,1)}function Tq(){Tq=O,Ktt=x8(_tt,sVn,184,256,0,1)}function Mq(){Mq=O,Mtt=x8(Stt,sVn,172,128,0,1)}function Sq(){eH(this,!1,!1,!1,!1)}function Pq(n){WX(),this.a=(SQ(),new Gb(yX(n)))}function Cq(n){for(yX(n);n.Ob();)n.Pb(),n.Qb()}function Iq(n){n.a.cd(),BB(n.a.dd(),14).gc(),wk()}function Oq(n){this.c=n,this.b=this.c.d.vc().Kc()}function Aq(n){this.c=n,this.a=new QT(this.c.a)}function $q(n){this.a=new XT(n.gc()),Frn(this,n)}function Lq(n){ew.call(this,new v4),Frn(this,n)}function Nq(n,t){return n.a+=Bdn(t,0,t.length),n}function xq(n,t){return l1(t,n.c.length),n.c[t]}function Dq(n,t){return l1(t,n.a.length),n.a[t]}function Rq(n,t){dM(),B8.call(this,n),this.a=t}function Kq(n,t){return jgn(rbn(jgn(n.a).a,t.a))}function _q(n,t){return kW(n),Ncn(n,(kW(t),t))}function Fq(n,t){return kW(t),Ncn(t,(kW(n),n))}function Bq(n,t){return $X(t,0,Hq(t[0],jgn(1)))}function Hq(n,t){return Kq(BB(n,162),BB(t,162))}function qq(n){return n.c-BB(xq(n.a,n.b),287).b}function Gq(n){return n.q?n.q:(SQ(),SQ(),het)}function zq(n){return n.e.Hd().gc()*n.c.Hd().gc()}function Uq(n,t,e){return E$(t.d[n.g],e.d[n.g])}function Xq(n,t,e){return E$(n.d[t.p],n.d[e.p])}function Wq(n,t,e){return E$(n.d[t.p],n.d[e.p])}function Vq(n,t,e){return E$(n.d[t.p],n.d[e.p])}function Qq(n,t,e){return E$(n.d[t.p],n.d[e.p])}function Yq(n,t,i){return e.Math.min(i/n,1/t)}function Jq(n,t){return n?0:e.Math.max(0,t-1)}function Zq(n,t){var e;for(e=0;e<t;++e)n[e]=-1}function nG(n){var t;return(t=uEn(n))?nG(t):n}function tG(n,t){return null==n.a&&wRn(n),n.a[t]}function eG(n){return n.c?n.c.f:n.e.b}function iG(n){return n.c?n.c.g:n.e.a}function rG(n){gtn.call(this,n.gc()),pX(this,n)}function cG(n,t){f$(),jp.call(this,t),this.a=n}function aG(n,t,e){this.a=n,$L.call(this,t,e,2)}function uG(n,t,e,i){_h(this),rH(this,n,t,e,i)}function oG(n,t){wWn(),Ap.call(this,n),this.a=t}function sG(n){this.b=new YT,this.a=n,this.c=-1}function hG(){this.d=new xC(0,0),this.e=new Rv}function fG(n){ZN.call(this,0,0),this.a=n,this.b=0}function lG(n){this.a=n,this.c=new xp,ron(this)}function bG(n){if(n.e.c!=n.b)throw Hp(new vv)}function wG(n){if(n.c.e!=n.a)throw Hp(new vv)}function dG(n){return JO(n)?0|n:TE(n)}function gG(n,t){return wWn(),new UU(n,t)}function pG(n,t){return null==n?null==t:mK(n,t)}function vG(n,t){return null==n?null==t:mgn(n,t)}function mG(n,t,e){return orn(n.a,t),EU(n,t.g,e)}function yG(n,t,e){ihn(0,t,n.length),z9(n,0,t,e)}function kG(n,t,e){LZ(t,n.c.length),MS(n.c,t,e)}function jG(n,t,e){var i;for(i=0;i<t;++i)n[i]=e}function EG(n,t){var e;return $on(e=nbn(n),t),e}function TG(n,t){return!n&&(n=[]),n[n.length]=t,n}function MG(n,t){return!(void 0===n.a.get(t))}function SG(n,t){return Xin(new nn,new uw(n),t)}function PG(n){return null==n?Set:new vy(kW(n))}function CG(n,t){return cL(t,22)&&SN(n,BB(t,22))}function IG(n,t){return cL(t,22)&&$tn(n,BB(t,22))}function OG(n){return H$n(n,26)*rYn+H$n(n,27)*cYn}function AG(n){return Array.isArray(n)&&n.im===I}function $G(n){n.b?$G(n.b):n.d.dc()&&n.f.c.Bc(n.e)}function LG(n,t){UR(n.c,t),n.b.c+=t.a,n.b.d+=t.b}function NG(n,t){LG(n,XR(new xC(t.a,t.b),n.c))}function xG(n,t){this.b=new YT,this.a=n,this.c=t}function DG(){this.b=new Ot,this.c=new lY(this)}function RG(){this.d=new mn,this.e=new fY(this)}function KG(){KZ(),this.f=new YT,this.e=new YT}function _G(){BZ(),this.k=new xp,this.d=new Rv}function FG(){FG=O,bOt=new XA((sWn(),aPt),0)}function BG(){BG=O,qnt=new fG(x8(Ant,HWn,1,0,5,1))}function HG(n,t,e){VAn(e,n,1),WB(t,new cP(e,n))}function qG(n,t,e){Fkn(e,n,1),WB(t,new bP(e,n))}function GG(n,t,e){return TU(n,new xS(t.a,e.a))}function zG(n,t,e){return-E$(n.f[t.p],n.f[e.p])}function UG(n,t,e){var i;n&&((i=n.i).c=t,i.b=e)}function XG(n,t,e){var i;n&&((i=n.i).d=t,i.a=e)}function WG(n,t,e){return n.a=-1,WN(n,t.g+1,e),n}function VG(n,t,e){return e=T_n(n,BB(t,49),7,e)}function QG(n,t,e){return e=T_n(n,BB(t,49),3,e)}function YG(n,t,e){this.a=n,LL.call(this,t,e,22)}function JG(n,t,e){this.a=n,LL.call(this,t,e,14)}function ZG(n,t,e,i){f$(),N0.call(this,n,t,e,i)}function nz(n,t,e,i){f$(),N0.call(this,n,t,e,i)}function tz(n,t){0!=(t.Bb&h6n)&&!n.a.o&&(n.a.o=t)}function ez(n){return null!=n&&DU(n)&&!(n.im===I)}function iz(n){return!Array.isArray(n)&&n.im===I}function rz(n){return cL(n,15)?BB(n,15).Yc():n.Kc()}function cz(n){return n.Qc(x8(Ant,HWn,1,n.gc(),5,1))}function az(n,t){return lgn(F7(n,t))?t.Qh():null}function uz(n){n?Fmn(n,($T(),Btt),""):$T()}function oz(n){this.a=(BG(),qnt),this.d=BB(yX(n),47)}function sz(n,t,e,i){this.a=n,W6.call(this,n,t,e,i)}function hz(n){eS(),this.a=0,this.b=n-1,this.c=1}function fz(n){V$(this),this.g=n,jQ(this),this._d()}function lz(n){return n.c?n.c:n.c=n.Id()}function bz(n){return n.d?n.d:n.d=n.Jd()}function wz(n){return n.c||(n.c=n.Dd())}function dz(n){return n.f||(n.f=n.Dc())}function gz(n){return n.i||(n.i=n.bc())}function pz(n){return wWn(),new vJ(10,n,0)}function vz(n){return JO(n)?""+n:GDn(n)}function mz(n){if(n.e.j!=n.d)throw Hp(new vv)}function yz(n,t){return uan(lSn(JO(n)?Pan(n):n,t))}function kz(n,t){return uan(jAn(JO(n)?Pan(n):n,t))}function jz(n,t){return uan(JSn(JO(n)?Pan(n):n,t))}function Ez(n,t){return bR((kW(n),n),(kW(t),t))}function Tz(n,t){return Pln((kW(n),n),(kW(t),t))}function Mz(n,t){return yX(t),n.a.Ad(t)&&!n.b.Ad(t)}function Sz(n,t){return M$(n.l&t.l,n.m&t.m,n.h&t.h)}function Pz(n,t){return M$(n.l|t.l,n.m|t.m,n.h|t.h)}function Cz(n,t){return M$(n.l^t.l,n.m^t.m,n.h^t.h)}function Iz(n,t){return $fn(n,(kW(t),new rw(t)))}function Oz(n,t){return $fn(n,(kW(t),new cw(t)))}function Az(n){return gcn(),0!=BB(n,11).e.c.length}function $z(n){return gcn(),0!=BB(n,11).g.c.length}function Lz(n,t){return Irn(),Pln(t.a.o.a,n.a.o.a)}function Nz(n,t,e){return TUn(n,BB(t,11),BB(e,11))}function xz(n){return n.e?D6(n.e):null}function Dz(n){n.d||(n.d=n.b.Kc(),n.c=n.b.gc())}function Rz(n,t,e){n.a.Mb(e)&&(n.b=!0,t.td(e))}function Kz(n,t){if(n<0||n>=t)throw Hp(new Sv)}function _z(n,t,e){return $X(t,0,Hq(t[0],e[0])),t}function Fz(n,t,e){t.Ye(e,Gy(MD(RX(n.b,e)))*n.a)}function Bz(n,t,e){return jDn(),Dcn(n,t)&&Dcn(n,e)}function Hz(n){return lIn(),!n.Hc(eIt)&&!n.Hc(rIt)}function qz(n){return new xC(n.c+n.b/2,n.d+n.a/2)}function Gz(n,t){return t.kh()?tfn(n.b,BB(t,49)):t}function zz(n,t){this.e=n,this.d=0!=(64&t)?t|hVn:t}function Uz(n,t){this.c=0,this.d=n,this.b=64|t|hVn}function Xz(n){this.b=new J6(11),this.a=(PQ(),n)}function Wz(n){this.b=null,this.a=(PQ(),n||wet)}function Vz(n){this.a=rvn(n.a),this.b=new t_(n.b)}function Qz(n){this.b=n,cx.call(this,n),ML(this)}function Yz(n){this.b=n,ux.call(this,n),SL(this)}function Jz(n,t,e){this.a=n,eK.call(this,t,e,5,6)}function Zz(n,t,e,i){this.b=n,$L.call(this,t,e,i)}function nU(n,t,e,i,r){k9.call(this,n,t,e,i,r,-1)}function tU(n,t,e,i,r){j9.call(this,n,t,e,i,r,-1)}function eU(n,t,e,i){$L.call(this,n,t,e),this.b=i}function iU(n,t,e,i){yH.call(this,n,t,e),this.b=i}function rU(n){NI.call(this,n,!1),this.a=!1}function cU(n,t){this.b=n,hl.call(this,n.b),this.a=t}function aU(n,t){WX(),jT.call(this,n,sfn(new Jy(t)))}function uU(n,t){return wWn(),new cW(n,t,0)}function oU(n,t){return wWn(),new cW(6,n,t)}function sU(n,t){return mK(n.substr(0,t.length),t)}function hU(n,t){return XI(t)?eY(n,t):!!AY(n.f,t)}function fU(n,t){for(kW(t);n.Ob();)t.td(n.Pb())}function lU(n,t,e){ODn(),this.e=n,this.d=t,this.a=e}function bU(n,t,e,i){var r;(r=n.i).i=t,r.a=e,r.b=i}function wU(n){var t;for(t=n;t.f;)t=t.f;return t}function dU(n){var t;return Px(null!=(t=Eon(n))),t}function gU(n){var t;return Px(null!=(t=mln(n))),t}function pU(n,t){var e;return w6(t,e=n.a.gc()),e-t}function vU(n,t){var e;for(e=0;e<t;++e)n[e]=!1}function mU(n,t,e,i){var r;for(r=t;r<e;++r)n[r]=i}function yU(n,t,e,i){ihn(t,e,n.length),mU(n,t,e,i)}function kU(n,t,e){Kz(e,n.a.c.length),c5(n.a,e,t)}function jU(n,t,e){this.c=n,this.a=t,SQ(),this.b=e}function EU(n,t,e){var i;return i=n.b[t],n.b[t]=e,i}function TU(n,t){return null==n.a.zc(t,n)}function MU(n){if(!n)throw Hp(new yv);return n.d}function SU(n,t){if(null==n)throw Hp(new Hy(t))}function PU(n,t){return!!t&&Frn(n,t)}function CU(n,t,e){return ehn(n,t.g,e),orn(n.c,t),n}function IU(n){return Mzn(n,(Ffn(),_Pt)),n.d=!0,n}function OU(n){return!n.j&&yb(n,FKn(n.g,n.b)),n.j}function AU(n){Mx(-1!=n.b),s6(n.c,n.a=n.b),n.b=-1}function $U(n){n.f=new eA(n),n.g=new iA(n),oY(n)}function LU(n){return new Rq(null,qU(n,n.length))}function NU(n){return new oz(new WL(n.a.length,n.a))}function xU(n){return M$(~n.l&SQn,~n.m&SQn,~n.h&PQn)}function DU(n){return typeof n===AWn||typeof n===xWn}function RU(n){return n==RQn?x7n:n==KQn?"-INF":""+n}function KU(n){return n==RQn?x7n:n==KQn?"-INF":""+n}function _U(n,t){return n>0?e.Math.log(n/t):-100}function FU(n,t){return Vhn(n,t)<0?-1:Vhn(n,t)>0?1:0}function BU(n,t,e){return SHn(n,BB(t,46),BB(e,167))}function HU(n,t){return BB(wz(lz(n.a)).Xb(t),42).cd()}function qU(n,t){return ptn(t,n.length),new BH(n,t)}function GU(n,t){this.d=n,AL.call(this,n),this.e=t}function zU(n){this.d=(kW(n),n),this.a=0,this.c=bVn}function UU(n,t){Ap.call(this,1),this.a=n,this.b=t}function XU(n,t){return n.c?XU(n.c,t):WB(n.b,t),n}function WU(n,t,e){var i;return i=dnn(n,t),r4(n,t,e),i}function VU(n,t){return m7(n.slice(0,t),n)}function QU(n,t,e){var i;for(i=0;i<t;++i)$X(n,i,e)}function YU(n,t,e,i,r){for(;t<e;)i[r++]=fV(n,t++)}function JU(n,t){return Pln(n.c.c+n.c.b,t.c.c+t.c.b)}function ZU(n,t){return null==Mon(n.a,t,(hN(),ptt))}function nX(n,t){r5(n.d,t,n.b.b,n.b),++n.a,n.c=null}function tX(n,t){J$(n,cL(t,153)?t:BB(t,1937).gl())}function eX(n,t){JT($V(n.Oc(),new Yr),new Id(t))}function iX(n,t,e,i,r){NEn(n,BB(h6(t.k,e),15),e,i,r)}function rX(n){n.s=NaN,n.c=NaN,ZOn(n,n.e),ZOn(n,n.j)}function cX(n){n.a=null,n.e=null,$U(n.b),n.d=0,++n.c}function aX(n){return e.Math.abs(n.d.e-n.e.e)-n.a}function uX(n,t,e){return BB(n.c._c(t,BB(e,133)),42)}function oX(){return ry(),Pun(Gk(Wnt,1),$Vn,538,0,[znt])}function sX(n){return MQ(),JJ(PMn(n))==JJ(OMn(n))}function hX(n){$R.call(this),this.a=n,WB(n.a,this)}function fX(n,t){this.d=Sln(n),this.c=t,this.a=.5*t}function lX(){v4.call(this),this.a=!0,this.b=!0}function bX(n){return(null==n.i&&qFn(n),n.i).length}function wX(n){return cL(n,99)&&0!=(BB(n,18).Bb&h6n)}function dX(n,t){++n.j,sTn(n,n.i,t),zIn(n,BB(t,332))}function gX(n,t){return t=n.nk(null,t),$Tn(n,null,t)}function pX(n,t){return n.hi()&&(t=nZ(n,t)),n.Wh(t)}function vX(n,t,e){var i;return Qen(e,i=mX(n,t)),i}function mX(n,t){var e;return(e=new pon).j=n,e.d=t,e}function yX(n){if(null==n)throw Hp(new gv);return n}function kX(n){return n.j||(n.j=new wl(n))}function jX(n){return n.f||(n.f=new UL(n))}function EX(n){return n.k||(n.k=new Yf(n))}function TX(n){return n.k||(n.k=new Yf(n))}function MX(n){return n.g||(n.g=new Qf(n))}function SX(n){return n.i||(n.i=new nl(n))}function PX(n){return n.d||(n.d=new il(n))}function CX(n){return yX(n),cL(n,475)?BB(n,475):Bbn(n)}function IX(n){return cL(n,607)?n:new bJ(n)}function OX(n,t){return w2(t,n.c.b.c.gc()),new sT(n,t)}function AX(n,t,e){return wWn(),new T0(n,t,e)}function $X(n,t,e){return Sx(null==e||Q_n(n,e)),n[t]=e}function LX(n,t){var e;return w2(t,e=n.a.gc()),e-1-t}function NX(n,t){return n.a+=String.fromCharCode(t),n}function xX(n,t){return n.a+=String.fromCharCode(t),n}function DX(n,t){for(kW(t);n.c<n.d;)n.ze(t,n.c++)}function RX(n,t){return XI(t)?SJ(n,t):qI(AY(n.f,t))}function KX(n,t){return MQ(),n==PMn(t)?OMn(t):PMn(t)}function _X(n,t){nW(n,new GX(null!=t.f?t.f:""+t.g))}function FX(n,t){nW(n,new GX(null!=t.f?t.f:""+t.g))}function BX(n){this.b=new Np,this.a=new Np,this.c=n}function HX(n){this.c=new Gj,this.a=new Np,this.b=n}function qX(n){$R.call(this),this.a=new Gj,this.c=n}function GX(n){if(null==n)throw Hp(new gv);this.a=n}function zX(n){Mv(),this.b=new Np,this.a=n,vGn(this,n)}function UX(n){this.c=n,this.a=new YT,this.b=new YT}function XX(){XX=O,ott=new Ml(!1),stt=new Ml(!0)}function WX(){WX=O,s_(),Fnt=new SY((SQ(),SQ(),set))}function VX(){VX=O,s_(),Vnt=new vS((SQ(),SQ(),fet))}function QX(){QX=O,t$t=GIn(),gWn(),i$t&&Rkn()}function YX(n,t){return Irn(),BB(oV(n,t.d),15).Fc(t)}function JX(n,t,e,i){return 0==e||(e-i)/e<n.e||t>=n.g}function ZX(n,t,e){return NRn(n,yrn(n,t,e))}function nW(n,t){var e;dnn(n,e=n.a.length),r4(n,e,t)}function tW(n,t){console[n].call(console,t)}function eW(n,t){var e;++n.j,e=n.Vi(),n.Ii(n.oi(e,t))}function iW(n,t,e){BB(t.b,65),Otn(t.a,new EB(n,e,t))}function rW(n,t,e){jp.call(this,t),this.a=n,this.b=e}function cW(n,t,e){Ap.call(this,n),this.a=t,this.b=e}function aW(n,t,e){this.a=n,kp.call(this,t),this.b=e}function uW(n,t,e){this.a=n,H2.call(this,8,t,null,e)}function oW(n){this.a=(kW(_9n),_9n),this.b=n,new Nm}function sW(n){this.c=n,this.b=this.c.a,this.a=this.c.e}function hW(n){this.c=n,this.b=n.a.d.a,bD(n.a.e,this)}function fW(n){Mx(-1!=n.c),n.d.$c(n.c),n.b=n.c,n.c=-1}function lW(n){return e.Math.sqrt(n.a*n.a+n.b*n.b)}function bW(n,t){return Kz(t,n.a.c.length),xq(n.a,t)}function wW(n,t){return GI(n)===GI(t)||null!=n&&Nfn(n,t)}function dW(n){return 0>=n?new VT:Win(n-1)}function gW(n){return!!SNt&&eY(SNt,n)}function pW(n){return n?n.dc():!n.Kc().Ob()}function vW(n){return!n.a&&n.c?n.c.b:n.a}function mW(n){return!n.a&&(n.a=new $L(LOt,n,4)),n.a}function yW(n){return!n.d&&(n.d=new $L(VAt,n,1)),n.d}function kW(n){if(null==n)throw Hp(new gv);return n}function jW(n){n.c?n.c.He():(n.d=!0,QNn(n))}function EW(n){n.c?EW(n.c):(Qln(n),n.d=!0)}function TW(n){TV(n.a),n.b=x8(Ant,HWn,1,n.b.length,5,1)}function MW(n,t){return E$(t.j.c.length,n.j.c.length)}function SW(n,t){n.c<0||n.b.b<n.c?fO(n.b,t):n.a._e(t)}function PW(n,t){var e;(e=n.Yg(t))>=0?n.Bh(e):cIn(n,t)}function CW(n){return n.c.i.c==n.d.i.c}function IW(n){if(4!=n.p)throw Hp(new dv);return n.e}function OW(n){if(3!=n.p)throw Hp(new dv);return n.e}function AW(n){if(6!=n.p)throw Hp(new dv);return n.f}function $W(n){if(6!=n.p)throw Hp(new dv);return n.k}function LW(n){if(3!=n.p)throw Hp(new dv);return n.j}function NW(n){if(4!=n.p)throw Hp(new dv);return n.j}function xW(n){return!n.b&&(n.b=new Tp(new xm)),n.b}function DW(n){return-2==n.c&&gb(n,uMn(n.g,n.b)),n.c}function RW(n,t){var e;return(e=mX("",n)).n=t,e.i=1,e}function KW(n,t){LG(BB(t.b,65),n),Otn(t.a,new Aw(n))}function _W(n,t){f9((!n.a&&(n.a=new oR(n,n)),n.a),t)}function FW(n,t){this.b=n,GU.call(this,n,t),ML(this)}function BW(n,t){this.b=n,RK.call(this,n,t),SL(this)}function HW(n,t,e,i){vT.call(this,n,t),this.d=e,this.a=i}function qW(n,t,e,i){vT.call(this,n,e),this.a=t,this.f=i}function GW(n,t){W$.call(this,Vin(yX(n),yX(t))),this.a=t}function zW(){dMn.call(this,S7n,(rE(),dLt)),Wqn(this)}function UW(){dMn.call(this,V9n,(iE(),n$t)),OHn(this)}function XW(){gT.call(this,"DELAUNAY_TRIANGULATION",0)}function WW(n){return String.fromCharCode.apply(null,n)}function VW(n,t,e){return XI(t)?mZ(n,t,e):jCn(n.f,t,e)}function QW(n){return SQ(),n?n.ve():(PQ(),PQ(),get)}function YW(n,t,e){return Nun(),e.pg(n,BB(t.cd(),146))}function JW(n,t){return nq(),new svn(new rN(n),new iN(t))}function ZW(n){return lin(n,NVn),ttn(rbn(rbn(5,n),n/10|0))}function nV(){nV=O,Bnt=new hy(Pun(Gk(Hnt,1),kVn,42,0,[]))}function tV(n){return!n.d&&(n.d=new Hb(n.c.Cc())),n.d}function eV(n){return!n.a&&(n.a=new Lk(n.c.vc())),n.a}function iV(n){return!n.b&&(n.b=new Ak(n.c.ec())),n.b}function rV(n,t){for(;t-- >0;)n=n<<1|(n<0?1:0);return n}function cV(n,t){return GI(n)===GI(t)||null!=n&&Nfn(n,t)}function aV(n,t){return hN(),BB(t.b,19).a<n}function uV(n,t){return hN(),BB(t.a,19).a<n}function oV(n,t){return CG(n.a,t)?n.b[BB(t,22).g]:null}function sV(n,t,e,i){n.a=fx(n.a,0,t)+""+i+nO(n.a,e)}function hV(n,t){n.u.Hc((lIn(),eIt))&&PIn(n,t),z6(n,t)}function fV(n,t){return b1(t,n.length),n.charCodeAt(t)}function lV(){dy.call(this,"There is no more element.")}function bV(n){this.d=n,this.a=this.d.b,this.b=this.d.c}function wV(n){n.b=!1,n.c=!1,n.d=!1,n.a=!1}function dV(n,t,e,i){return Rcn(n,t,e,!1),Zfn(n,i),n}function gV(n){return n.j.c=x8(Ant,HWn,1,0,5,1),n.a=-1,n}function pV(n){return!n.c&&(n.c=new hK(KOt,n,5,8)),n.c}function vV(n){return!n.b&&(n.b=new hK(KOt,n,4,7)),n.b}function mV(n){return!n.n&&(n.n=new eU(zOt,n,1,7)),n.n}function yV(n){return!n.c&&(n.c=new eU(XOt,n,9,9)),n.c}function kV(n){return n.e==C7n&&vb(n,Tgn(n.g,n.b)),n.e}function jV(n){return n.f==C7n&&mb(n,pkn(n.g,n.b)),n.f}function EV(n){var t;return!(t=n.b)&&(n.b=t=new Jf(n)),t}function TV(n){var t;for(t=n.Kc();t.Ob();)t.Pb(),t.Qb()}function MV(n){if(zbn(n.d),n.d.d!=n.c)throw Hp(new vv)}function SV(n,t){this.b=n,this.c=t,this.a=new QT(this.b)}function PV(n,t,e){this.a=XVn,this.d=n,this.b=t,this.c=e}function CV(n,t){this.d=(kW(n),n),this.a=16449,this.c=t}function IV(n,t){Jln(n,Gy(Ren(t,"x")),Gy(Ren(t,"y")))}function OV(n,t){Jln(n,Gy(Ren(t,"x")),Gy(Ren(t,"y")))}function AV(n,t){return Qln(n),new Rq(n,new Q9(t,n.a))}function $V(n,t){return Qln(n),new Rq(n,new M6(t,n.a))}function LV(n,t){return Qln(n),new AD(n,new E6(t,n.a))}function NV(n,t){return Qln(n),new $D(n,new T6(t,n.a))}function xV(n,t){return new pY(BB(yX(n),62),BB(yX(t),62))}function DV(n,t){return jM(),Pln((kW(n),n),(kW(t),t))}function RV(){return wM(),Pun(Gk(Pct,1),$Vn,481,0,[rct])}function KV(){return CM(),Pun(Gk(YEt,1),$Vn,482,0,[XEt])}function _V(){return IM(),Pun(Gk(tTt,1),$Vn,551,0,[QEt])}function FV(){return OM(),Pun(Gk(VTt,1),$Vn,530,0,[GTt])}function BV(n){this.a=new Np,this.e=x8(ANt,sVn,48,n,0,2)}function HV(n,t,e,i){this.a=n,this.e=t,this.d=e,this.c=i}function qV(n,t,e,i){this.a=n,this.c=t,this.b=e,this.d=i}function GV(n,t,e,i){this.c=n,this.b=t,this.a=e,this.d=i}function zV(n,t,e,i){this.c=n,this.b=t,this.d=e,this.a=i}function UV(n,t,e,i){this.c=n,this.d=t,this.b=e,this.a=i}function XV(n,t,e,i){this.a=n,this.d=t,this.c=e,this.b=i}function WV(n,t,e,i){gT.call(this,n,t),this.a=e,this.b=i}function VV(n,t,e,i){this.a=n,this.c=t,this.d=e,this.b=i}function QV(n,t,e){EHn(n.a,e),nun(e),AAn(n.b,e),rqn(t,e)}function YV(n,t,e){var i;return i=$Un(n),t.Kh(e,i)}function JV(n,t){var e,i;return(e=n/t)>(i=CJ(e))&&++i,i}function ZV(n){var t;return cen(t=new Kp,n),t}function nQ(n){var t;return DMn(t=new Kp,n),t}function tQ(n,t){return Kcn(t,RX(n.f,t)),null}function eQ(n){return Yin(n)||null}function iQ(n){return!n.b&&(n.b=new eU(_Ot,n,12,3)),n.b}function rQ(n){return null!=n&&xT(jAt,n.toLowerCase())}function cQ(n,t){return Pln(iG(n)*eG(n),iG(t)*eG(t))}function aQ(n,t){return Pln(iG(n)*eG(n),iG(t)*eG(t))}function uQ(n,t){return Pln(n.d.c+n.d.b/2,t.d.c+t.d.b/2)}function oQ(n,t){return Pln(n.g.c+n.g.b/2,t.g.c+t.g.b/2)}function sQ(n,t,e){e.a?Cen(n,t.b-n.f/2):Pen(n,t.a-n.g/2)}function hQ(n,t,e,i){this.a=n,this.b=t,this.c=e,this.d=i}function fQ(n,t,e,i){this.a=n,this.b=t,this.c=e,this.d=i}function lQ(n,t,e,i){this.e=n,this.a=t,this.c=e,this.d=i}function bQ(n,t,e,i){this.a=n,this.c=t,this.d=e,this.b=i}function wQ(n,t,e,i){f$(),e6.call(this,t,e,i),this.a=n}function dQ(n,t,e,i){f$(),e6.call(this,t,e,i),this.a=n}function gQ(n,t){this.a=n,OD.call(this,n,BB(n.d,15).Zc(t))}function pQ(n){this.f=n,this.c=this.f.e,n.f>0&&ujn(this)}function vQ(n,t,e,i){this.b=n,this.c=i,vO.call(this,t,e)}function mQ(n){return Px(n.b<n.d.gc()),n.d.Xb(n.c=n.b++)}function yQ(n){n.a.a=n.c,n.c.b=n.a,n.a.b=n.c.a=null,n.b=0}function kQ(n,t){return n.b=t.b,n.c=t.c,n.d=t.d,n.a=t.a,n}function jQ(n){return n.n&&(n.e!==FVn&&n._d(),n.j=null),n}function EQ(n){return JH(null==n||DU(n)&&!(n.im===I)),n}function TQ(n){this.b=new Np,gun(this.b,this.b),this.a=n}function MQ(){MQ=O,Sct=new Np,Mct=new xp,Tct=new Np}function SQ(){SQ=O,set=new S,het=new C,fet=new M}function PQ(){PQ=O,wet=new R,det=new R,get=new K}function CQ(){CQ=O,hit=new gn,lit=new RG,fit=new pn}function IQ(){256==ait&&(iit=rit,rit=new r,ait=0),++ait}function OQ(n){return n.f||(n.f=new pT(n,n.c))}function AQ(n){return QIn(n)&&qy(TD(ZAn(n,(HXn(),dgt))))}function $Q(n,t){return JIn(n,BB(mMn(t,(HXn(),Wgt)),19),t)}function LQ(n,t){return Tfn(n.j,t.s,t.c)+Tfn(t.e,n.s,n.c)}function NQ(n,t){n.e&&!n.e.a&&(Fp(n.e,t),NQ(n.e,t))}function xQ(n,t){n.d&&!n.d.a&&(Fp(n.d,t),xQ(n.d,t))}function DQ(n,t){return-Pln(iG(n)*eG(n),iG(t)*eG(t))}function RQ(n){return BB(n.cd(),146).tg()+":"+Bbn(n.dd())}function KQ(n){var t;G_(),(t=BB(n.g,10)).n.a=n.d.c+t.d.b}function _Q(n,t,e){return MM(),xbn(BB(RX(n.e,t),522),e)}function FQ(n,t){return tsn(n),tsn(t),Py(BB(n,22),BB(t,22))}function BQ(n,t,e){n.i=0,n.e=0,t!=e&&Xon(n,t,e)}function HQ(n,t,e){n.i=0,n.e=0,t!=e&&Won(n,t,e)}function qQ(n,t,e){rtn(n,t,new Sl(XK(e)))}function GQ(n,t,e,i,r,c){j9.call(this,n,t,e,i,r,c?-2:-1)}function zQ(n,t,e,i){LI.call(this,t,e),this.b=n,this.a=i}function UQ(n,t){new YT,this.a=new km,this.b=n,this.c=t}function XQ(n,t){return BB(mMn(n,(hWn(),clt)),15).Fc(t),t}function WQ(n,t){if(null==n)throw Hp(new Hy(t));return n}function VQ(n){return!n.q&&(n.q=new eU(QAt,n,11,10)),n.q}function QQ(n){return!n.s&&(n.s=new eU(FAt,n,21,17)),n.s}function YQ(n){return!n.a&&(n.a=new eU(UOt,n,10,11)),n.a}function JQ(n){return cL(n,14)?new $q(BB(n,14)):qB(n.Kc())}function ZQ(n){return new qL(n,n.e.Hd().gc()*n.c.Hd().gc())}function nY(n){return new GL(n,n.e.Hd().gc()*n.c.Hd().gc())}function tY(n){return n&&n.hashCode?n.hashCode():PN(n)}function eY(n,t){return null==t?!!AY(n.f,null):MG(n.g,t)}function iY(n){return yX(n),emn(new oz(ZL(n.a.Kc(),new h)))}function rY(n){return SQ(),cL(n,54)?new $k(n):new bN(n)}function cY(n,t,e){return!!n.f&&n.f.Ne(t,e)}function aY(n,t){return n.a=fx(n.a,0,t)+""+nO(n.a,t+1),n}function uY(n,t){var e;return(e=eL(n.a,t))&&(t.d=null),e}function oY(n){var t,e;t=0|(e=n).$modCount,e.$modCount=t+1}function sY(n){this.b=n,this.c=n,n.e=null,n.c=null,this.a=1}function hY(n){this.b=n,this.a=new dE(BB(yX(new tt),62))}function fY(n){this.c=n,this.b=new dE(BB(yX(new vn),62))}function lY(n){this.c=n,this.b=new dE(BB(yX(new It),62))}function bY(){this.a=new Qv,this.b=new hm,this.d=new Dt}function wY(){this.a=new km,this.b=(lin(3,AVn),new J6(3))}function dY(){this.b=new Rv,this.d=new YT,this.e=new om}function gY(n){this.c=n.c,this.d=n.d,this.b=n.b,this.a=n.a}function pY(n,t){zm.call(this,new Wz(n)),this.a=n,this.b=t}function vY(){iSn(this,new Rf),this.wb=(QX(),t$t),iE()}function mY(n){OTn(n,"No crossing minimization",1),HSn(n)}function yY(n){Dk(),e.setTimeout((function(){throw n}),0)}function kY(n){return n.u||(P5(n),n.u=new uR(n,n)),n.u}function jY(n){return BB(yan(n,16),26)||n.zh()}function EY(n,t){return cL(t,146)&&mK(n.b,BB(t,146).tg())}function TY(n,t){return n.a?t.Wg().Kc():BB(t.Wg(),69).Zh()}function MY(n){return n.k==(uSn(),Cut)&&Lx(n,(hWn(),zft))}function SY(n){this.a=(SQ(),cL(n,54)?new $k(n):new bN(n))}function PY(){var n,t;PY=O,t=!Ddn(),n=new d,ett=t?new E:n}function CY(n,t){var e;return e=nE(n.gm),null==t?e:e+": "+t}function IY(n,t){var e;return j4(e=n.b.Qc(t),n.b.gc()),e}function OY(n,t){if(null==n)throw Hp(new Hy(t));return n}function AY(n,t){return hhn(n,t,pZ(n,null==t?0:n.b.se(t)))}function $Y(n,t,e){return e>=0&&mK(n.substr(e,t.length),t)}function LY(n,t,e,i,r,c,a){return new b4(n.e,t,e,i,r,c,a)}function NY(n,t,e,i,r,c){this.a=n,kin.call(this,t,e,i,r,c)}function xY(n,t,e,i,r,c){this.a=n,kin.call(this,t,e,i,r,c)}function DY(n,t){this.g=n,this.d=Pun(Gk(Out,1),a1n,10,0,[t])}function RY(n,t){this.e=n,this.a=Ant,this.b=ARn(t),this.c=t}function KY(n,t){NR.call(this),xtn(this),this.a=n,this.c=t}function _Y(n,t,e,i){$X(n.c[t.g],e.g,i),$X(n.c[e.g],t.g,i)}function FY(n,t,e,i){$X(n.c[t.g],t.g,e),$X(n.b[t.g],t.g,i)}function BY(){return A6(),Pun(Gk(cmt,1),$Vn,376,0,[Zvt,Jvt])}function HY(){return g7(),Pun(Gk(Zht,1),$Vn,479,0,[Ght,qht])}function qY(){return _nn(),Pun(Gk(Lht,1),$Vn,419,0,[Sht,Pht])}function GY(){return V8(),Pun(Gk(lht,1),$Vn,422,0,[cht,aht])}function zY(){return z2(),Pun(Gk(Glt,1),$Vn,420,0,[Aft,$ft])}function UY(){return U7(),Pun(Gk(zvt,1),$Vn,421,0,[Kvt,_vt])}function XY(){return Q4(),Pun(Gk(Vmt,1),$Vn,523,0,[Hmt,Bmt])}function WY(){return O6(),Pun(Gk(xyt,1),$Vn,520,0,[Myt,Tyt])}function VY(){return gJ(),Pun(Gk(ayt,1),$Vn,516,0,[tyt,nyt])}function QY(){return oZ(),Pun(Gk(Syt,1),$Vn,515,0,[ryt,cyt])}function YY(){return dJ(),Pun(Gk(Byt,1),$Vn,455,0,[Lyt,Nyt])}function JY(){return B0(),Pun(Gk(Jkt,1),$Vn,425,0,[Hkt,Bkt])}function ZY(){return sZ(),Pun(Gk(qkt,1),$Vn,480,0,[Rkt,Kkt])}function nJ(){return Prn(),Pun(Gk(ijt,1),$Vn,495,0,[Qkt,Ykt])}function tJ(){return D9(),Pun(Gk(ljt,1),$Vn,426,0,[cjt,ajt])}function eJ(){return Lun(),Pun(Gk(YTt,1),$Vn,429,0,[WTt,XTt])}function iJ(){return $6(),Pun(Gk(oTt,1),$Vn,430,0,[nTt,ZEt])}function rJ(){return hpn(),Pun(Gk(yit,1),$Vn,428,0,[dit,wit])}function cJ(){return Rnn(),Pun(Gk(Kit,1),$Vn,427,0,[vit,mit])}function aJ(){return Knn(),Pun(Gk($at,1),$Vn,424,0,[Dct,Rct])}function uJ(){return Srn(),Pun(Gk(Wut,1),$Vn,511,0,[qut,Hut])}function oJ(n,t,e,i){return e>=0?n.jh(t,e,i):n.Sg(null,e,i)}function sJ(n){return 0==n.b.b?n.a.$e():dH(n.b)}function hJ(n){if(5!=n.p)throw Hp(new dv);return dG(n.f)}function fJ(n){if(5!=n.p)throw Hp(new dv);return dG(n.k)}function lJ(n){return GI(n.a)===GI((wcn(),I$t))&&Rqn(n),n.a}function bJ(n){this.a=BB(yX(n),271),this.b=(SQ(),new dN(n))}function wJ(n,t){Zl(this,new xC(n.a,n.b)),nb(this,zB(t))}function dJ(){dJ=O,Lyt=new oC(cJn,0),Nyt=new oC(aJn,1)}function gJ(){gJ=O,tyt=new cC(aJn,0),nyt=new cC(cJn,1)}function pJ(){ay.call(this,new XT(etn(12))),aN(!0),this.a=2}function vJ(n,t,e){wWn(),Ap.call(this,n),this.b=t,this.a=e}function mJ(n,t,e){f$(),jp.call(this,t),this.a=n,this.b=e}function yJ(n){NR.call(this),xtn(this),this.a=n,this.c=!0}function kJ(n){var t;t=n.c.d.b,n.b=t,n.a=n.c.d,t.a=n.c.d.b=n}function jJ(n){pin(n.a),RA(n.a),twn(new Pw(n.a))}function EJ(n,t){oRn(n,!0),Otn(n.e.wf(),new $_(n,!0,t))}function TJ(n,t){return c4(t),Yen(n,x8(ANt,hQn,25,t,15,1),t)}function MJ(n,t){return MQ(),n==JJ(PMn(t))||n==JJ(OMn(t))}function SJ(n,t){return null==t?qI(AY(n.f,null)):hS(n.g,t)}function PJ(n){return 0==n.b?null:(Px(0!=n.b),Atn(n,n.a.a))}function CJ(n){return 0|Math.max(Math.min(n,DWn),-2147483648)}function IJ(n,t){var e=Znt[n.charCodeAt(0)];return null==e?n:e}function OJ(n,t){return WQ(n,"set1"),WQ(t,"set2"),new ET(n,t)}function AJ(n,t){return UR(qx(nen(n.f,t)),n.f.d)}function $J(n,t){var e;return YGn(n,t,e=new q),e.d}function LJ(n,t,e,i){var r;r=new FR,t.a[e.g]=r,mG(n.b,i,r)}function NJ(n,t,e){var i;(i=n.Yg(t))>=0?n.sh(i,e):TLn(n,t,e)}function xJ(n,t,e){hZ(),n&&VW(fAt,n,t),n&&VW(hAt,n,e)}function DJ(n,t,e){this.i=new Np,this.b=n,this.g=t,this.a=e}function RJ(n,t,e){this.c=new Np,this.e=n,this.f=t,this.b=e}function KJ(n,t,e){this.a=new Np,this.e=n,this.f=t,this.c=e}function _J(n,t){V$(this),this.f=t,this.g=n,jQ(this),this._d()}function FJ(n,t){var e;e=n.q.getHours(),n.q.setDate(t),lBn(n,e)}function BJ(n,t){var e;for(yX(t),e=n.a;e;e=e.c)t.Od(e.g,e.i)}function HJ(n){var t;return $on(t=new bE(etn(n.length)),n),t}function qJ(n){function t(){}return t.prototype=n||{},new t}function GJ(n,t){return!!wun(n,t)&&(ein(n),!0)}function zJ(n,t){if(null==t)throw Hp(new gv);return ugn(n,t)}function UJ(n){if(n.qe())return null;var t=n.n;return SWn[t]}function XJ(n){return n.Db>>16!=3?null:BB(n.Cb,33)}function WJ(n){return n.Db>>16!=9?null:BB(n.Cb,33)}function VJ(n){return n.Db>>16!=6?null:BB(n.Cb,79)}function QJ(n){return n.Db>>16!=7?null:BB(n.Cb,235)}function YJ(n){return n.Db>>16!=7?null:BB(n.Cb,160)}function JJ(n){return n.Db>>16!=11?null:BB(n.Cb,33)}function ZJ(n,t){var e;return(e=n.Yg(t))>=0?n.lh(e):qIn(n,t)}function nZ(n,t){var e;return oMn(e=new Lq(t),n),new t_(e)}function tZ(n){var t;return t=n.d,t=n.si(n.f),f9(n,t),t.Ob()}function eZ(n,t){return n.b+=t.b,n.c+=t.c,n.d+=t.d,n.a+=t.a,n}function iZ(n,t){return e.Math.abs(n)<e.Math.abs(t)?n:t}function rZ(n){return!n.a&&(n.a=new eU(UOt,n,10,11)),n.a.i>0}function cZ(){this.a=new fA,this.e=new Rv,this.g=0,this.i=0}function aZ(n){this.a=n,this.b=x8(_mt,sVn,1944,n.e.length,0,2)}function uZ(n,t,e){var i;i=Non(n,t,e),n.b=new mrn(i.c.length)}function oZ(){oZ=O,ryt=new rC(pJn,0),cyt=new rC("UP",1)}function sZ(){sZ=O,Rkt=new bC(U3n,0),Kkt=new bC("FAN",1)}function hZ(){hZ=O,fAt=new xp,hAt=new xp,FI(yet,new wo)}function fZ(n){if(0!=n.p)throw Hp(new dv);return JI(n.f,0)}function lZ(n){if(0!=n.p)throw Hp(new dv);return JI(n.k,0)}function bZ(n){return n.Db>>16!=3?null:BB(n.Cb,147)}function wZ(n){return n.Db>>16!=6?null:BB(n.Cb,235)}function dZ(n){return n.Db>>16!=17?null:BB(n.Cb,26)}function gZ(n,t){var e=n.a=n.a||[];return e[t]||(e[t]=n.le(t))}function pZ(n,t){var e;return null==(e=n.a.get(t))?new Array:e}function vZ(n,t){var e;e=n.q.getHours(),n.q.setMonth(t),lBn(n,e)}function mZ(n,t,e){return null==t?jCn(n.f,null,e):ubn(n.g,t,e)}function yZ(n,t,e,i,r,c){return new N7(n.e,t,n.aj(),e,i,r,c)}function kZ(n,t,e){return n.a=fx(n.a,0,t)+""+e+nO(n.a,t),n}function jZ(n,t,e){return WB(n.a,(nV(),zvn(t,e),new vT(t,e))),n}function EZ(n){return oN(n.c),n.e=n.a=n.c,n.c=n.c.c,++n.d,n.a.f}function TZ(n){return oN(n.e),n.c=n.a=n.e,n.e=n.e.e,--n.d,n.a.f}function MZ(n,t){n.d&&y7(n.d.e,n),n.d=t,n.d&&WB(n.d.e,n)}function SZ(n,t){n.c&&y7(n.c.g,n),n.c=t,n.c&&WB(n.c.g,n)}function PZ(n,t){n.c&&y7(n.c.a,n),n.c=t,n.c&&WB(n.c.a,n)}function CZ(n,t){n.i&&y7(n.i.j,n),n.i=t,n.i&&WB(n.i.j,n)}function IZ(n,t,e){this.a=t,this.c=n,this.b=(yX(e),new t_(e))}function OZ(n,t,e){this.a=t,this.c=n,this.b=(yX(e),new t_(e))}function AZ(n,t){this.a=n,this.c=B$(this.a),this.b=new gY(t)}function $Z(n){return Qln(n),AV(n,new vw(new Rv))}function LZ(n,t){if(n<0||n>t)throw Hp(new Ay(jYn+n+EYn+t))}function NZ(n,t){return IG(n.a,t)?EU(n,BB(t,22).g,null):null}function xZ(n){return Shn(),hN(),0!=BB(n.a,81).d.e}function DZ(){DZ=O,Xnt=lhn((ry(),Pun(Gk(Wnt,1),$Vn,538,0,[znt])))}function RZ(){RZ=O,pmt=WG(new B2,(yMn(),Bat),(lWn(),qot))}function KZ(){KZ=O,vmt=WG(new B2,(yMn(),Bat),(lWn(),qot))}function _Z(){_Z=O,ymt=WG(new B2,(yMn(),Bat),(lWn(),qot))}function FZ(){FZ=O,zmt=dq(new B2,(yMn(),Bat),(lWn(),dot))}function BZ(){BZ=O,Qmt=dq(new B2,(yMn(),Bat),(lWn(),dot))}function HZ(){HZ=O,Zmt=dq(new B2,(yMn(),Bat),(lWn(),dot))}function qZ(){qZ=O,oyt=dq(new B2,(yMn(),Bat),(lWn(),dot))}function GZ(){GZ=O,zkt=WG(new B2,(zyn(),Fyt),(DPn(),zyt))}function zZ(n,t,e,i){this.c=n,this.d=i,WZ(this,t),VZ(this,e)}function UZ(n){this.c=new YT,this.b=n.b,this.d=n.c,this.a=n.a}function XZ(n){this.a=e.Math.cos(n),this.b=e.Math.sin(n)}function WZ(n,t){n.a&&y7(n.a.k,n),n.a=t,n.a&&WB(n.a.k,n)}function VZ(n,t){n.b&&y7(n.b.f,n),n.b=t,n.b&&WB(n.b.f,n)}function QZ(n,t){iW(n,n.b,n.c),BB(n.b.b,65),t&&BB(t.b,65).b}function YZ(n,t){zln(n,t),cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),2)}function JZ(n,t){cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),4),Nrn(n,t)}function ZZ(n,t){cL(n.Cb,179)&&(BB(n.Cb,179).tb=null),Nrn(n,t)}function n1(n,t){return ZM(),hnn(t)?new lq(t,n):new xI(t,n)}function t1(n,t){null!=t.c&&nW(n,new GX(t.c))}function e1(n){var t;return iE(),cen(t=new Kp,n),t}function i1(n){var t;return iE(),cen(t=new Kp,n),t}function r1(n,t){var e;return e=new HX(n),t.c[t.c.length]=e,e}function c1(n,t){var e;return(e=BB(lfn(OQ(n.a),t),14))?e.gc():0}function a1(n){return Qln(n),PQ(),PQ(),ytn(n,det)}function u1(n){for(var t;;)if(t=n.Pb(),!n.Ob())return t}function o1(n,t){Um.call(this,new XT(etn(n))),lin(t,oVn),this.a=t}function s1(n,t,e){Hfn(t,e,n.gc()),this.c=n,this.a=t,this.b=e-t}function h1(n,t,e){var i;Hfn(t,e,n.c.length),i=e-t,PE(n.c,t,i)}function f1(n,t){hL(n,dG(e0(kz(t,24),sYn)),dG(e0(t,sYn)))}function l1(n,t){if(n<0||n>=t)throw Hp(new Ay(jYn+n+EYn+t))}function b1(n,t){if(n<0||n>=t)throw Hp(new Ok(jYn+n+EYn+t))}function w1(n,t){this.b=(kW(n),n),this.a=0==(t&_Qn)?64|t|hVn:t}function d1(n){DA(this),Pv(this.a,kon(e.Math.max(8,n))<<1)}function g1(n){return Aon(Pun(Gk(PMt,1),sVn,8,0,[n.i.n,n.n,n.a]))}function p1(){return qsn(),Pun(Gk(nit,1),$Vn,132,0,[zet,Uet,Xet])}function v1(){return Dtn(),Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])}function m1(){return J9(),Pun(Gk(ert,1),$Vn,461,0,[Yit,Qit,Jit])}function y1(){return G7(),Pun(Gk(Ort,1),$Vn,462,0,[crt,rrt,irt])}function k1(){return Bfn(),Pun(Gk(mut,1),$Vn,423,0,[wut,but,lut])}function j1(){return q7(),Pun(Gk(Hat,1),$Vn,379,0,[Oat,Iat,Aat])}function E1(){return Mhn(),Pun(Gk(wvt,1),$Vn,378,0,[cvt,avt,uvt])}function T1(){return Oin(),Pun(Gk(pht,1),$Vn,314,0,[hht,sht,fht])}function M1(){return uin(),Pun(Gk(Tht,1),$Vn,337,0,[wht,ght,dht])}function S1(){return Jun(),Pun(Gk(Bht,1),$Vn,450,0,[Aht,Oht,$ht])}function P1(){return Crn(),Pun(Gk(Wst,1),$Vn,361,0,[Rst,Dst,xst])}function C1(){return z7(),Pun(Gk(Lft,1),$Vn,303,0,[Pft,Cft,Sft])}function I1(){return Kan(),Pun(Gk(Ift,1),$Vn,292,0,[jft,Eft,kft])}function O1(){return ain(),Pun(Gk(Qvt,1),$Vn,452,0,[Gvt,Hvt,qvt])}function A1(){return mon(),Pun(Gk(Fvt,1),$Vn,339,0,[Nvt,Lvt,xvt])}function $1(){return Hcn(),Pun(Gk(nmt,1),$Vn,375,0,[Xvt,Wvt,Vvt])}function L1(){return $un(),Pun(Gk(Smt,1),$Vn,377,0,[bmt,wmt,lmt])}function N1(){return Usn(),Pun(Gk(hmt,1),$Vn,336,0,[emt,imt,rmt])}function x1(){return dcn(),Pun(Gk(dmt,1),$Vn,338,0,[smt,umt,omt])}function D1(){return oin(),Pun(Gk(xmt,1),$Vn,454,0,[Omt,Amt,$mt])}function R1(){return Cbn(),Pun(Gk(ujt,1),$Vn,442,0,[ejt,njt,tjt])}function K1(){return Hsn(),Pun(Gk(Gjt,1),$Vn,380,0,[sjt,hjt,fjt])}function _1(){return Sbn(),Pun(Gk(NEt,1),$Vn,381,0,[Zjt,nEt,Jjt])}function F1(){return Bcn(),Pun(Gk(Yjt,1),$Vn,293,0,[Xjt,Wjt,Ujt])}function B1(){return Pbn(),Pun(Gk(WEt,1),$Vn,437,0,[HEt,qEt,GEt])}function H1(){return ufn(),Pun(Gk(SCt,1),$Vn,334,0,[vCt,pCt,mCt])}function q1(){return Rtn(),Pun(Gk(nCt,1),$Vn,272,0,[zPt,UPt,XPt])}function G1(n,t){return k$n(n,t,cL(t,99)&&0!=(BB(t,18).Bb&BQn))}function z1(n,t,e){var i;return(i=cHn(n,t,!1)).b<=t&&i.a<=e}function U1(n,t,e){var i;(i=new ca).b=t,i.a=e,++t.b,WB(n.d,i)}function X1(n,t){var e;return Tx(!!(e=(kW(n),n).g)),kW(t),e(t)}function W1(n,t){var e,i;return i=pU(n,t),e=n.a.Zc(i),new kT(n,e)}function V1(n){return n.Db>>16!=6?null:BB(cAn(n),235)}function Q1(n){if(2!=n.p)throw Hp(new dv);return dG(n.f)&QVn}function Y1(n){if(2!=n.p)throw Hp(new dv);return dG(n.k)&QVn}function J1(n){return n.a==(R5(),eLt)&&db(n,eLn(n.g,n.b)),n.a}function Z1(n){return n.d==(R5(),eLt)&&pb(n,NKn(n.g,n.b)),n.d}function n0(n){return Px(n.a<n.c.c.length),n.b=n.a++,n.c.c[n.b]}function t0(n,t){n.b=n.b|t.b,n.c=n.c|t.c,n.d=n.d|t.d,n.a=n.a|t.a}function e0(n,t){return uan(Sz(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function i0(n,t){return uan(Pz(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function r0(n,t){return uan(Cz(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function c0(n){return rbn(yz(fan(H$n(n,32)),32),fan(H$n(n,32)))}function a0(n){return yX(n),cL(n,14)?new t_(BB(n,14)):HB(n.Kc())}function u0(n,t){return Dnn(),n.c==t.c?Pln(t.d,n.d):Pln(n.c,t.c)}function o0(n,t){return Dnn(),n.c==t.c?Pln(n.d,t.d):Pln(n.c,t.c)}function s0(n,t){return Dnn(),n.c==t.c?Pln(n.d,t.d):Pln(t.c,n.c)}function h0(n,t){return Dnn(),n.c==t.c?Pln(t.d,n.d):Pln(t.c,n.c)}function f0(n,t){var e;e=Gy(MD(n.a.We((sWn(),OPt)))),VUn(n,t,e)}function l0(n,t){var e;e=BB(RX(n.g,t),57),Otn(t.d,new oP(n,e))}function b0(n,t){var e,i;return(e=oyn(n))<(i=oyn(t))?-1:e>i?1:0}function w0(n,t){var e;return e=S7(t),BB(RX(n.c,e),19).a}function d0(n,t){var e;for(e=n+"";e.length<t;)e="0"+e;return e}function g0(n){return null==n.c||0==n.c.length?"n_"+n.g:"n_"+n.c}function p0(n){return null==n.c||0==n.c.length?"n_"+n.b:"n_"+n.c}function v0(n,t){return n&&n.equals?n.equals(t):GI(n)===GI(t)}function m0(n,t){return 0==t?!!n.o&&0!=n.o.f:vpn(n,t)}function y0(n,t,e){var i;n.n&&t&&e&&(i=new Zu,WB(n.e,i))}function k0(n,t,e){var i;i=n.d[t.p],n.d[t.p]=n.d[e.p],n.d[e.p]=i}function j0(n,t,e){this.d=n,this.j=t,this.e=e,this.o=-1,this.p=3}function E0(n,t,e){this.d=n,this.k=t,this.f=e,this.o=-1,this.p=5}function T0(n,t,e){Ap.call(this,25),this.b=n,this.a=t,this.c=e}function M0(n){wWn(),Ap.call(this,n),this.c=!1,this.a=!1}function S0(n,t,e,i,r,c){Hen.call(this,n,t,e,i,r),c&&(this.o=-2)}function P0(n,t,e,i,r,c){qen.call(this,n,t,e,i,r),c&&(this.o=-2)}function C0(n,t,e,i,r,c){J5.call(this,n,t,e,i,r),c&&(this.o=-2)}function I0(n,t,e,i,r,c){Uen.call(this,n,t,e,i,r),c&&(this.o=-2)}function O0(n,t,e,i,r,c){Z5.call(this,n,t,e,i,r),c&&(this.o=-2)}function A0(n,t,e,i,r,c){Gen.call(this,n,t,e,i,r),c&&(this.o=-2)}function $0(n,t,e,i,r,c){zen.call(this,n,t,e,i,r),c&&(this.o=-2)}function L0(n,t,e,i,r,c){n6.call(this,n,t,e,i,r),c&&(this.o=-2)}function N0(n,t,e,i){jp.call(this,e),this.b=n,this.c=t,this.d=i}function x0(n,t){this.a=new Np,this.d=new Np,this.f=n,this.c=t}function D0(){this.c=new $$,this.a=new bY,this.b=new em,bM()}function R0(){Nun(),this.b=new xp,this.a=new xp,this.c=new Np}function K0(n,t){this.g=n,this.d=(R5(),eLt),this.a=eLt,this.b=t}function _0(n,t){this.f=n,this.a=(R5(),tLt),this.c=tLt,this.b=t}function F0(n,t){!n.c&&(n.c=new Ecn(n,0)),MHn(n.c,(Uqn(),LLt),t)}function B0(){B0=O,Hkt=new wC("DFS",0),Bkt=new wC("BFS",1)}function H0(n,t,e){var i;return!!(i=BB(n.Zb().xc(t),14))&&i.Hc(e)}function q0(n,t,e){var i;return!!(i=BB(n.Zb().xc(t),14))&&i.Mc(e)}function G0(n,t,e,i){return n.a+=""+fx(null==t?zWn:Bbn(t),e,i),n}function z0(n,t,e,i,r,c){return Rcn(n,t,e,c),Jfn(n,i),tln(n,r),n}function U0(n){return Px(n.b.b!=n.d.a),n.c=n.b=n.b.b,--n.a,n.c.c}function X0(n){for(;n.d>0&&0==n.a[--n.d];);0==n.a[n.d++]&&(n.e=0)}function W0(n){return n.a?0==n.e.length?n.a.a:n.a.a+""+n.e:n.c}function V0(n){return!(!n.a||0==H7(n.a.a).i||n.b&&Kvn(n.b))}function Q0(n){return!(!n.u||0==a4(n.u.a).i||n.n&&Rvn(n.n))}function Y0(n){return yq(n.e.Hd().gc()*n.c.Hd().gc(),16,new zf(n))}function J0(n,t){return FU(fan(n.q.getTime()),fan(t.q.getTime()))}function Z0(n){return BB(Qgn(n,x8(yut,c1n,17,n.c.length,0,1)),474)}function n2(n){return BB(Qgn(n,x8(Out,a1n,10,n.c.length,0,1)),193)}function t2(n){return BZ(),!(b5(n)||!b5(n)&&n.c.i.c==n.d.i.c)}function e2(n,t,e){yX(n),xyn(new IZ(new t_(n),t,e))}function i2(n,t,e){yX(n),Dyn(new OZ(new t_(n),t,e))}function r2(n,t){var e;return e=1-t,n.a[e]=wrn(n.a[e],e),wrn(n,t)}function c2(n,t){var e;n.e=new Jm,m$(e=wDn(t),n.c),IDn(n,e,0)}function a2(n,t,e,i){var r;(r=new vu).a=t,r.b=e,r.c=i,DH(n.a,r)}function u2(n,t,e,i){var r;(r=new vu).a=t,r.b=e,r.c=i,DH(n.b,r)}function o2(n){var t,e;return e=t_n(t=new lX,n),yzn(t),e}function s2(){var n,t;return n=new Kp,WB(V$t,t=n),t}function h2(n){return n.j.c=x8(Ant,HWn,1,0,5,1),TV(n.c),gV(n.a),n}function f2(n){return MM(),cL(n.g,10)?BB(n.g,10):null}function l2(n){return!EV(n).dc()&&(L$(n,new m),!0)}function b2(n){if(!("stack"in n))try{throw n}catch(t){}return n}function w2(n,t){if(n<0||n>=t)throw Hp(new Ay(LCn(n,t)));return n}function d2(n,t,e){if(n<0||t<n||t>e)throw Hp(new Ay(oPn(n,t,e)))}function g2(n,t){if(TU(n.a,t),t.d)throw Hp(new dy(IYn));t.d=n}function p2(n,t){if(t.$modCount!=n.$modCount)throw Hp(new vv)}function v2(n,t){return!!cL(t,42)&&Mmn(n.a,BB(t,42))}function m2(n,t){return!!cL(t,42)&&Mmn(n.a,BB(t,42))}function y2(n,t){return!!cL(t,42)&&Mmn(n.a,BB(t,42))}function k2(n,t){return n.a<=n.b&&(t.ud(n.a++),!0)}function j2(n){var t;return JO(n)?-0==(t=n)?0:t:pnn(n)}function E2(n){var t;return EW(n),t=new F,gE(n.a,new gw(t)),t}function T2(n){var t;return EW(n),t=new _,gE(n.a,new dw(t)),t}function M2(n,t){this.a=n,Sb.call(this,n),LZ(t,n.gc()),this.b=t}function S2(n){this.e=n,this.b=this.e.a.entries(),this.a=new Array}function P2(n){return yq(n.e.Hd().gc()*n.c.Hd().gc(),273,new Gf(n))}function C2(n){return new J6((lin(n,NVn),ttn(rbn(rbn(5,n),n/10|0))))}function I2(n){return BB(Qgn(n,x8(Gut,u1n,11,n.c.length,0,1)),1943)}function O2(n,t,e){return e.f.c.length>0?BU(n.a,t,e):BU(n.b,t,e)}function A2(n,t,e){n.d&&y7(n.d.e,n),n.d=t,n.d&&kG(n.d.e,e,n)}function $2(n,t){vXn(t,n),aH(n.d),aH(BB(mMn(n,(HXn(),Agt)),207))}function L2(n,t){pXn(t,n),cH(n.d),cH(BB(mMn(n,(HXn(),Agt)),207))}function N2(n,t){var e,i;return i=null,(e=zJ(n,t))&&(i=e.fe()),i}function x2(n,t){var e,i;return i=null,(e=dnn(n,t))&&(i=e.ie()),i}function D2(n,t){var e,i;return i=null,(e=zJ(n,t))&&(i=e.ie()),i}function R2(n,t){var e,i;return i=null,(e=zJ(n,t))&&(i=yPn(e)),i}function K2(n,t,e){var i;return i=Qdn(e),wKn(n.g,i,t),wKn(n.i,t,e),t}function _2(n,t,e){var i;i=Ldn();try{return dR(n,t,e)}finally{y3(i)}}function F2(n){var t;t=n.Wg(),this.a=cL(t,69)?BB(t,69).Zh():t.Kc()}function B2(){Ym.call(this),this.j.c=x8(Ant,HWn,1,0,5,1),this.a=-1}function H2(n,t,e,i){this.d=n,this.n=t,this.g=e,this.o=i,this.p=-1}function q2(n,t,e,i){this.e=i,this.d=null,this.c=n,this.a=t,this.b=e}function G2(n,t,e){this.d=new Fd(this),this.e=n,this.i=t,this.f=e}function z2(){z2=O,Aft=new DP(eJn,0),$ft=new DP("TOP_LEFT",1)}function U2(){U2=O,Tmt=JW(iln(1),iln(4)),Emt=JW(iln(1),iln(2))}function X2(){X2=O,JEt=lhn((IM(),Pun(Gk(tTt,1),$Vn,551,0,[QEt])))}function W2(){W2=O,VEt=lhn((CM(),Pun(Gk(YEt,1),$Vn,482,0,[XEt])))}function V2(){V2=O,UTt=lhn((OM(),Pun(Gk(VTt,1),$Vn,530,0,[GTt])))}function Q2(){Q2=O,act=lhn((wM(),Pun(Gk(Pct,1),$Vn,481,0,[rct])))}function Y2(){return Dan(),Pun(Gk(Grt,1),$Vn,406,0,[Rrt,Nrt,xrt,Drt])}function J2(){return Z9(),Pun(Gk(Fet,1),$Vn,297,0,[Net,xet,Det,Ret])}function Z2(){return qpn(),Pun(Gk(cct,1),$Vn,394,0,[Zrt,Jrt,nct,tct])}function n3(){return Hpn(),Pun(Gk(Urt,1),$Vn,323,0,[Brt,Frt,Hrt,qrt])}function t3(){return Aun(),Pun(Gk(dut,1),$Vn,405,0,[Zat,eut,nut,tut])}function e3(){return Iun(),Pun(Gk(pst,1),$Vn,360,0,[ast,rst,cst,ist])}function i3(n,t,e,i){return cL(e,54)?new Ox(n,t,e,i):new sz(n,t,e,i)}function r3(){return Oun(),Pun(Gk(Ist,1),$Vn,411,0,[vst,mst,yst,kst])}function c3(n){return n.j==(kUn(),SIt)&&SN(UOn(n),oIt)}function a3(n,t){var e;SZ(e=t.a,t.c.d),MZ(e,t.d.d),Ztn(e.a,n.n)}function u3(n,t){return BB($N(Iz(BB(h6(n.k,t),15).Oc(),Qst)),113)}function o3(n,t){return BB($N(Oz(BB(h6(n.k,t),15).Oc(),Qst)),113)}function s3(n){return new w1(tcn(BB(n.a.dd(),14).gc(),n.a.cd()),16)}function h3(n){return cL(n,14)?BB(n,14).dc():!n.Kc().Ob()}function f3(n){return MM(),cL(n.g,145)?BB(n.g,145):null}function l3(n){if(n.e.g!=n.b)throw Hp(new vv);return!!n.c&&n.d>0}function b3(n){return Px(n.b!=n.d.c),n.c=n.b,n.b=n.b.a,++n.a,n.c.c}function w3(n,t){kW(t),$X(n.a,n.c,t),n.c=n.c+1&n.a.length-1,wyn(n)}function d3(n,t){kW(t),n.b=n.b-1&n.a.length-1,$X(n.a,n.b,t),wyn(n)}function g3(n,t){var e;for(e=n.j.c.length;e<t;e++)WB(n.j,n.rg())}function p3(n,t,e,i){var r;return r=i[t.g][e.g],Gy(MD(mMn(n.a,r)))}function v3(n,t,e,i,r){this.i=n,this.a=t,this.e=e,this.j=i,this.f=r}function m3(n,t,e,i,r){this.a=n,this.e=t,this.f=e,this.b=i,this.g=r}function y3(n){n&&Inn((sk(),ttt)),--ctt,n&&-1!=utt&&(iS(utt),utt=-1)}function k3(){return bvn(),Pun(Gk(kvt,1),$Vn,197,0,[lvt,bvt,fvt,hvt])}function j3(){return zyn(),Pun(Gk(qyt,1),$Vn,393,0,[Ryt,Kyt,_yt,Fyt])}function E3(){return Omn(),Pun(Gk(Vjt,1),$Vn,340,0,[qjt,Bjt,Hjt,Fjt])}function T3(){return mdn(),Pun(Gk(YIt,1),$Vn,374,0,[KIt,_It,RIt,DIt])}function M3(){return Xyn(),Pun(Gk(RCt,1),$Vn,285,0,[MCt,jCt,ECt,TCt])}function S3(){return Mbn(),Pun(Gk(oCt,1),$Vn,218,0,[ZPt,YPt,QPt,JPt])}function P3(){return Fwn(),Pun(Gk(cOt,1),$Vn,311,0,[eOt,ZIt,tOt,nOt])}function C3(){return Bsn(),Pun(Gk(wOt,1),$Vn,396,0,[uOt,oOt,aOt,sOt])}function I3(n){return hZ(),hU(fAt,n)?BB(RX(fAt,n),331).ug():null}function O3(n,t,e){return t<0?qIn(n,e):BB(e,66).Nj().Sj(n,n.yh(),t)}function A3(n,t,e){var i;return i=Qdn(e),wKn(n.d,i,t),VW(n.e,t,e),t}function $3(n,t,e){var i;return i=Qdn(e),wKn(n.j,i,t),VW(n.k,t,e),t}function L3(n){var t;return tE(),t=new io,n&&HLn(t,n),t}function N3(n){var t;return t=n.ri(n.i),n.i>0&&aHn(n.g,0,t,0,n.i),t}function x3(n,t){var e;return nS(),!(e=BB(RX(mAt,n),55))||e.wj(t)}function D3(n){if(1!=n.p)throw Hp(new dv);return dG(n.f)<<24>>24}function R3(n){if(1!=n.p)throw Hp(new dv);return dG(n.k)<<24>>24}function K3(n){if(7!=n.p)throw Hp(new dv);return dG(n.k)<<16>>16}function _3(n){if(7!=n.p)throw Hp(new dv);return dG(n.f)<<16>>16}function F3(n){var t;for(t=0;n.Ob();)n.Pb(),t=rbn(t,1);return ttn(t)}function B3(n,t){var e;return e=new Ik,n.xd(e),e.a+="..",t.yd(e),e.a}function H3(n,t,e){var i;i=BB(RX(n.g,e),57),WB(n.a.c,new rI(t,i))}function q3(n,t,e){return Tz(MD(qI(AY(n.f,t))),MD(qI(AY(n.f,e))))}function G3(n,t,e){return UFn(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn))}function z3(n,t,e){return pBn(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn))}function U3(n,t,e){return x$n(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn))}function X3(n,t){return n==(uSn(),Cut)&&t==Cut?4:n==Cut||t==Cut?8:32}function W3(n,t){return GI(t)===GI(n)?"(this Map)":null==t?zWn:Bbn(t)}function V3(n,t){return BB(null==t?qI(AY(n.f,null)):hS(n.g,t),281)}function Q3(n,t,e){var i;return i=Qdn(e),VW(n.b,i,t),VW(n.c,t,e),t}function Y3(n,t){var e;for(e=t;e;)_x(n,e.i,e.j),e=JJ(e);return n}function J3(n,t){var e;return e=rY(HB(new C7(n,t))),Cq(new C7(n,t)),e}function Z3(n,t){var e;return ZM(),TSn(e=BB(n,66).Mj(),t),e.Ok(t)}function n4(n,t,e,i,r){WB(t,mCn(r,X$n(r,e,i))),UMn(n,r,t)}function t4(n,t,e){n.i=0,n.e=0,t!=e&&(Won(n,t,e),Xon(n,t,e))}function e4(n,t){var e;e=n.q.getHours(),n.q.setFullYear(t+sQn),lBn(n,e)}function i4(n,t,e){if(e){var i=e.ee();n.a[t]=i(e)}else delete n.a[t]}function r4(n,t,e){if(e){var i=e.ee();e=i(e)}else e=void 0;n.a[t]=e}function c4(n){if(n<0)throw Hp(new By("Negative array size: "+n))}function a4(n){return n.n||(P5(n),n.n=new YG(n,VAt,n),kY(n)),n.n}function u4(n){return Px(n.a<n.c.a.length),n.b=n.a,Ann(n),n.c.b[n.b]}function o4(n){n.b!=n.c&&(n.a=x8(Ant,HWn,1,8,5,1),n.b=0,n.c=0)}function s4(n){this.b=new xp,this.c=new xp,this.d=new xp,this.a=n}function h4(n,t){wWn(),Ap.call(this,n),this.a=t,this.c=-1,this.b=-1}function f4(n,t,e,i){j0.call(this,1,e,i),Fh(this),this.c=n,this.b=t}function l4(n,t,e,i){E0.call(this,1,e,i),Fh(this),this.c=n,this.b=t}function b4(n,t,e,i,r,c,a){kin.call(this,t,i,r,c,a),this.c=n,this.a=e}function w4(n,t,e){this.e=n,this.a=Ant,this.b=ARn(t),this.c=t,this.d=e}function d4(n){this.e=n,this.c=this.e.a,this.b=this.e.g,this.d=this.e.i}function g4(n){this.c=n,this.a=BB(Ikn(n),148),this.b=this.a.Aj().Nh()}function p4(n){this.d=n,this.b=this.d.a.entries(),this.a=this.b.next()}function v4(){xp.call(this),jx(this),this.d.b=this.d,this.d.a=this.d}function m4(n,t){$R.call(this),this.a=n,this.b=t,WB(this.a.b,this)}function y4(n,t){return iO(null!=t?SJ(n,t):qI(AY(n.f,t)))}function k4(n,t){return iO(null!=t?SJ(n,t):qI(AY(n.f,t)))}function j4(n,t){var e;for(e=0;e<t;++e)$X(n,e,new Ub(BB(n[e],42)))}function E4(n,t){var e;for(e=n.d-1;e>=0&&n.a[e]===t[e];e--);return e<0}function T4(n,t){var e;return zsn(),0!=(e=n.j.g-t.j.g)?e:0}function M4(n,t){return kW(t),null!=n.a?PG(t.Kb(n.a)):Set}function S4(n){var t;return n?new Lq(n):(qrn(t=new fA,n),t)}function P4(n,t){return t.b.Kb(T7(n,t.c.Ee(),new yw(t)))}function C4(n){yTn(),hL(this,dG(e0(kz(n,24),sYn)),dG(e0(n,sYn)))}function I4(){I4=O,pit=lhn((hpn(),Pun(Gk(yit,1),$Vn,428,0,[dit,wit])))}function O4(){O4=O,kit=lhn((Rnn(),Pun(Gk(Kit,1),$Vn,427,0,[vit,mit])))}function A4(){A4=O,_ct=lhn((Knn(),Pun(Gk($at,1),$Vn,424,0,[Dct,Rct])))}function $4(){$4=O,zut=lhn((Srn(),Pun(Gk(Wut,1),$Vn,511,0,[qut,Hut])))}function L4(){L4=O,Iht=lhn((_nn(),Pun(Gk(Lht,1),$Vn,419,0,[Sht,Pht])))}function N4(){N4=O,Uht=lhn((g7(),Pun(Gk(Zht,1),$Vn,479,0,[Ght,qht])))}function x4(){x4=O,tmt=lhn((A6(),Pun(Gk(cmt,1),$Vn,376,0,[Zvt,Jvt])))}function D4(){D4=O,Bvt=lhn((U7(),Pun(Gk(zvt,1),$Vn,421,0,[Kvt,_vt])))}function R4(){R4=O,oht=lhn((V8(),Pun(Gk(lht,1),$Vn,422,0,[cht,aht])))}function K4(){K4=O,Nft=lhn((z2(),Pun(Gk(Glt,1),$Vn,420,0,[Aft,$ft])))}function _4(){_4=O,Pyt=lhn((O6(),Pun(Gk(xyt,1),$Vn,520,0,[Myt,Tyt])))}function F4(){F4=O,Gmt=lhn((Q4(),Pun(Gk(Vmt,1),$Vn,523,0,[Hmt,Bmt])))}function B4(){B4=O,iyt=lhn((gJ(),Pun(Gk(ayt,1),$Vn,516,0,[tyt,nyt])))}function H4(){H4=O,uyt=lhn((oZ(),Pun(Gk(Syt,1),$Vn,515,0,[ryt,cyt])))}function q4(){q4=O,Dyt=lhn((dJ(),Pun(Gk(Byt,1),$Vn,455,0,[Lyt,Nyt])))}function G4(){G4=O,Gkt=lhn((B0(),Pun(Gk(Jkt,1),$Vn,425,0,[Hkt,Bkt])))}function z4(){z4=O,Zkt=lhn((Prn(),Pun(Gk(ijt,1),$Vn,495,0,[Qkt,Ykt])))}function U4(){U4=O,Fkt=lhn((sZ(),Pun(Gk(qkt,1),$Vn,480,0,[Rkt,Kkt])))}function X4(){X4=O,ojt=lhn((D9(),Pun(Gk(ljt,1),$Vn,426,0,[cjt,ajt])))}function W4(){W4=O,QTt=lhn((Lun(),Pun(Gk(YTt,1),$Vn,429,0,[WTt,XTt])))}function V4(){V4=O,eTt=lhn(($6(),Pun(Gk(oTt,1),$Vn,430,0,[nTt,ZEt])))}function Q4(){Q4=O,Hmt=new JP("UPPER",0),Bmt=new JP("LOWER",1)}function Y4(n,t){var e;qQ(e=new py,"x",t.a),qQ(e,"y",t.b),nW(n,e)}function J4(n,t){var e;qQ(e=new py,"x",t.a),qQ(e,"y",t.b),nW(n,e)}function Z4(n,t){var e,i;i=!1;do{i|=e=bon(n,t)}while(e);return i}function n5(n,t){var e,i;for(e=t,i=0;e>0;)i+=n.a[e],e-=e&-e;return i}function t5(n,t){var e;for(e=t;e;)_x(n,-e.i,-e.j),e=JJ(e);return n}function e5(n,t){var e,i;for(kW(t),i=n.Kc();i.Ob();)e=i.Pb(),t.td(e)}function i5(n,t){var e;return new vT(e=t.cd(),n.e.pc(e,BB(t.dd(),14)))}function r5(n,t,e,i){var r;(r=new $).c=t,r.b=e,r.a=i,i.b=e.a=r,++n.b}function c5(n,t,e){var i;return l1(t,n.c.length),i=n.c[t],n.c[t]=e,i}function a5(n,t,e){return BB(null==t?jCn(n.f,null,e):ubn(n.g,t,e),281)}function u5(n){return n.c&&n.d?p0(n.c)+"->"+p0(n.d):"e_"+PN(n)}function o5(n,t){return(Qln(n),jE(new Rq(n,new Q9(t,n.a)))).sd(tit)}function s5(){return yMn(),Pun(Gk(Uat,1),$Vn,356,0,[Rat,Kat,_at,Fat,Bat])}function h5(){return kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])}function f5(n){return Dk(),function(){return _2(n,this,arguments)}}function l5(){return Date.now?Date.now():(new Date).getTime()}function b5(n){return!(!n.c||!n.d||!n.c.i||n.c.i!=n.d.i)}function w5(n){if(!n.c.Sb())throw Hp(new yv);return n.a=!0,n.c.Ub()}function d5(n){n.i=0,yS(n.b,null),yS(n.c,null),n.a=null,n.e=null,++n.g}function g5(n){dS.call(this,null==n?zWn:Bbn(n),cL(n,78)?BB(n,78):null)}function p5(n){eWn(),Bp(this),this.a=new YT,dsn(this,n),DH(this.a,n)}function v5(){xA(this),this.b=new xC(RQn,RQn),this.a=new xC(KQn,KQn)}function m5(n,t){this.c=0,this.b=t,pO.call(this,n,17493),this.a=this.c}function y5(n){k5(),Qet||(this.c=n,this.e=!0,this.a=new Np)}function k5(){k5=O,Qet=!0,Wet=!1,Vet=!1,Jet=!1,Yet=!1}function j5(n,t){return!!cL(t,149)&&mK(n.c,BB(t,149).c)}function E5(n,t){var e;return e=0,n&&(e+=n.f.a/2),t&&(e+=t.f.a/2),e}function T5(n,t){return BB(lnn(n.d,t),23)||BB(lnn(n.e,t),23)}function M5(n){this.b=n,AL.call(this,n),this.a=BB(yan(this.b.a,4),126)}function S5(n){this.b=n,ax.call(this,n),this.a=BB(yan(this.b.a,4),126)}function P5(n){return n.t||(n.t=new dp(n),sln(new xy(n),0,n.t)),n.t}function C5(){return Ffn(),Pun(Gk(WPt,1),$Vn,103,0,[BPt,FPt,_Pt,KPt,HPt])}function I5(){return cpn(),Pun(Gk(JCt,1),$Vn,249,0,[BCt,qCt,_Ct,FCt,HCt])}function O5(){return rpn(),Pun(Gk(jMt,1),$Vn,175,0,[hMt,sMt,uMt,fMt,oMt])}function A5(){return $Sn(),Pun(Gk(zTt,1),$Vn,316,0,[iTt,rTt,uTt,cTt,aTt])}function $5(){return Nvn(),Pun(Gk(Avt,1),$Vn,315,0,[yvt,pvt,vvt,gvt,mvt])}function L5(){return Vvn(),Pun(Gk(Cht,1),$Vn,335,0,[yht,mht,jht,Eht,kht])}function N5(){return YLn(),Pun(Gk(zEt,1),$Vn,355,0,[DEt,xEt,KEt,REt,_Et])}function x5(){return LEn(),Pun(Gk(Kst,1),$Vn,363,0,[Mst,Pst,Cst,Sst,Tst])}function D5(){return Tbn(),Pun(Gk(ivt,1),$Vn,163,0,[qlt,_lt,Flt,Blt,Hlt])}function R5(){var n,t;R5=O,iE(),t=new Ev,tLt=t,n=new Om,eLt=n}function K5(n){var t;return n.c||cL(t=n.r,88)&&(n.c=BB(t,26)),n.c}function _5(n){return n.e=3,n.d=n.Yb(),2!=n.e&&(n.e=0,!0)}function F5(n){return M$(n&SQn,n>>22&SQn,n<0?PQn:0)}function B5(n){var t,e,i;for(e=0,i=(t=n).length;e<i;++e)jW(t[e])}function H5(n,t){var e,i;(e=BB(bfn(n.c,t),14))&&(i=e.gc(),e.$b(),n.d-=i)}function q5(n,t){var e;return!!(e=lsn(n,t.cd()))&&cV(e.e,t.dd())}function G5(n,t){return 0==t||0==n.e?n:t>0?Edn(n,t):Ixn(n,-t)}function z5(n,t){return 0==t||0==n.e?n:t>0?Ixn(n,t):Edn(n,-t)}function U5(n){if(dAn(n))return n.c=n.a,n.a.Pb();throw Hp(new yv)}function X5(n){var t,e;return t=n.c.i,e=n.d.i,t.k==(uSn(),Mut)&&e.k==Mut}function W5(n){var t;return qan(t=new wY,n),hon(t,(HXn(),vgt),null),t}function V5(n,t,e){var i;return(i=n.Yg(t))>=0?n._g(i,e,!0):cOn(n,t,e)}function Q5(n,t,e,i){var r;for(r=0;r<Zit;r++)XG(n.a[t.g][r],e,i[t.g])}function Y5(n,t,e,i){var r;for(r=0;r<nrt;r++)UG(n.a[r][t.g],e,i[t.g])}function J5(n,t,e,i,r){j0.call(this,t,i,r),Fh(this),this.c=n,this.a=e}function Z5(n,t,e,i,r){E0.call(this,t,i,r),Fh(this),this.c=n,this.a=e}function n6(n,t,e,i,r){i6.call(this,t,i,r),Fh(this),this.c=n,this.a=e}function t6(n,t,e,i,r){i6.call(this,t,i,r),Fh(this),this.c=n,this.b=e}function e6(n,t,e){jp.call(this,e),this.b=n,this.c=t,this.d=(Bwn(),z$t)}function i6(n,t,e){this.d=n,this.k=t?1:0,this.f=e?1:0,this.o=-1,this.p=0}function r6(n,t,e){var i;Tcn(i=new X$(n.a),n.a.a),jCn(i.f,t,e),n.a.a=i}function c6(n,t){n.qi(n.i+1),jL(n,n.i,n.oi(n.i,t)),n.bi(n.i++,t),n.ci()}function a6(n){var t,e;++n.j,t=n.g,e=n.i,n.g=null,n.i=0,n.di(e,t),n.ci()}function u6(n){var t;return yX(n),$on(t=new J6(ZW(n.length)),n),t}function o6(n){var t;return yX(n),JPn(t=n?new t_(n):HB(n.Kc())),sfn(t)}function s6(n,t){var e;return l1(t,n.c.length),e=n.c[t],PE(n.c,t,1),e}function h6(n,t){var e;return!(e=BB(n.c.xc(t),14))&&(e=n.ic(t)),n.pc(t,e)}function f6(n,t){var e,i;return kW(n),e=n,kW(t),e==(i=t)?0:e<i?-1:1}function l6(n){var t;return t=n.e+n.f,isNaN(t)&&WK(n.d)?n.d:t}function b6(n,t){return n.a?oO(n.a,n.b):n.a=new lN(n.d),aO(n.a,t),n}function w6(n,t){if(n<0||n>t)throw Hp(new Ay(dCn(n,t,"index")));return n}function d6(n,t,e,i){var r;return vTn(r=x8(ANt,hQn,25,t,15,1),n,t,e,i),r}function g6(n,t){var e;e=n.q.getHours()+(t/60|0),n.q.setMinutes(t),lBn(n,e)}function p6(n,t){return e.Math.min(W8(t.a,n.d.d.c),W8(t.b,n.d.d.c))}function v6(n,t){return XI(t)?null==t?gAn(n.f,null):Gan(n.g,t):gAn(n.f,t)}function m6(n){this.c=n,this.a=new Wb(this.c.a),this.b=new Wb(this.c.b)}function y6(){this.e=new Np,this.c=new Np,this.d=new Np,this.b=new Np}function k6(){this.g=new Bv,this.b=new Bv,this.a=new Np,this.k=new Np}function j6(n,t,e){this.a=n,this.c=t,this.d=e,WB(t.e,this),WB(e.b,this)}function E6(n,t){gO.call(this,t.rd(),-6&t.qd()),kW(n),this.a=n,this.b=t}function T6(n,t){pO.call(this,t.rd(),-6&t.qd()),kW(n),this.a=n,this.b=t}function M6(n,t){vO.call(this,t.rd(),-6&t.qd()),kW(n),this.a=n,this.b=t}function S6(n,t,e){this.a=n,this.b=t,this.c=e,WB(n.t,this),WB(t.i,this)}function P6(){this.b=new YT,this.a=new YT,this.b=new YT,this.a=new YT}function C6(){C6=O,TMt=new up("org.eclipse.elk.labels.labelManager")}function I6(){I6=O,est=new iR("separateLayerConnections",(Iun(),ast))}function O6(){O6=O,Myt=new uC("REGULAR",0),Tyt=new uC("CRITICAL",1)}function A6(){A6=O,Zvt=new XP("STACKED",0),Jvt=new XP("SEQUENCED",1)}function $6(){$6=O,nTt=new TC("FIXED",0),ZEt=new TC("CENTER_NODE",1)}function L6(n,t){var e;return e=xGn(n,t),n.b=new mrn(e.c.length),yqn(n,e)}function N6(n,t,e){return++n.e,--n.f,BB(n.d[t].$c(e),133).dd()}function x6(n){var t;return n.a||cL(t=n.r,148)&&(n.a=BB(t,148)),n.a}function D6(n){return n.a?n.e?D6(n.e):null:n}function R6(n,t){return n.p<t.p?1:n.p>t.p?-1:0}function K6(n,t){return kW(t),n.c<n.d&&(n.ze(t,n.c++),!0)}function _6(n,t){return!!hU(n.a,t)&&(v6(n.a,t),!0)}function F6(n){var t;return t=n.cd(),RB(BB(n.dd(),14).Nc(),new Vf(t))}function B6(n){var t;return t=BB(VU(n.b,n.b.length),9),new YK(n.a,t,n.c)}function H6(n){return Qln(n),new AD(n,new ZB(n,n.a.e,4|n.a.d))}function q6(n){var t;for(EW(n),t=0;n.a.sd(new fn);)t=rbn(t,1);return t}function G6(n,t,e){var i,r;for(i=0,r=0;r<t.length;r++)i+=n.$f(t[r],i,e)}function z6(n,t){var e;n.C&&((e=BB(oV(n.b,t),124).n).d=n.C.d,e.a=n.C.a)}function U6(n,t,e){return w2(t,n.e.Hd().gc()),w2(e,n.c.Hd().gc()),n.a[t][e]}function X6(n,t){ODn(),this.e=n,this.d=1,this.a=Pun(Gk(ANt,1),hQn,25,15,[t])}function W6(n,t,e,i){this.f=n,this.e=t,this.d=e,this.b=i,this.c=i?i.d:null}function V6(n){var t,e,i,r;r=n.d,t=n.a,e=n.b,i=n.c,n.d=e,n.a=i,n.b=r,n.c=t}function Q6(n,t,e,i){mFn(n,t,e,pBn(n,t,i,cL(t,99)&&0!=(BB(t,18).Bb&BQn)))}function Y6(n,t){OTn(t,"Label management",1),iO(mMn(n,(C6(),TMt))),HSn(t)}function J6(n){xA(this),vH(n>=0,"Initial capacity must not be negative")}function Z6(){Z6=O,Wit=lhn((Dtn(),Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])))}function n8(){n8=O,trt=lhn((J9(),Pun(Gk(ert,1),$Vn,461,0,[Yit,Qit,Jit])))}function t8(){t8=O,urt=lhn((G7(),Pun(Gk(Ort,1),$Vn,462,0,[crt,rrt,irt])))}function e8(){e8=O,Zet=lhn((qsn(),Pun(Gk(nit,1),$Vn,132,0,[zet,Uet,Xet])))}function i8(){i8=O,Lat=lhn((q7(),Pun(Gk(Hat,1),$Vn,379,0,[Oat,Iat,Aat])))}function r8(){r8=O,gut=lhn((Bfn(),Pun(Gk(mut,1),$Vn,423,0,[wut,but,lut])))}function c8(){c8=O,bht=lhn((Oin(),Pun(Gk(pht,1),$Vn,314,0,[hht,sht,fht])))}function a8(){a8=O,vht=lhn((uin(),Pun(Gk(Tht,1),$Vn,337,0,[wht,ght,dht])))}function u8(){u8=O,Nht=lhn((Jun(),Pun(Gk(Bht,1),$Vn,450,0,[Aht,Oht,$ht])))}function o8(){o8=O,_st=lhn((Crn(),Pun(Gk(Wst,1),$Vn,361,0,[Rst,Dst,xst])))}function s8(){s8=O,Oft=lhn((z7(),Pun(Gk(Lft,1),$Vn,303,0,[Pft,Cft,Sft])))}function h8(){h8=O,Mft=lhn((Kan(),Pun(Gk(Ift,1),$Vn,292,0,[jft,Eft,kft])))}function f8(){f8=O,svt=lhn((Mhn(),Pun(Gk(wvt,1),$Vn,378,0,[cvt,avt,uvt])))}function l8(){l8=O,Yvt=lhn((Hcn(),Pun(Gk(nmt,1),$Vn,375,0,[Xvt,Wvt,Vvt])))}function b8(){b8=O,Rvt=lhn((mon(),Pun(Gk(Fvt,1),$Vn,339,0,[Nvt,Lvt,xvt])))}function w8(){w8=O,Uvt=lhn((ain(),Pun(Gk(Qvt,1),$Vn,452,0,[Gvt,Hvt,qvt])))}function d8(){d8=O,gmt=lhn(($un(),Pun(Gk(Smt,1),$Vn,377,0,[bmt,wmt,lmt])))}function g8(){g8=O,amt=lhn((Usn(),Pun(Gk(hmt,1),$Vn,336,0,[emt,imt,rmt])))}function p8(){p8=O,fmt=lhn((dcn(),Pun(Gk(dmt,1),$Vn,338,0,[smt,umt,omt])))}function v8(){v8=O,Nmt=lhn((oin(),Pun(Gk(xmt,1),$Vn,454,0,[Omt,Amt,$mt])))}function m8(){m8=O,rjt=lhn((Cbn(),Pun(Gk(ujt,1),$Vn,442,0,[ejt,njt,tjt])))}function y8(){y8=O,bjt=lhn((Hsn(),Pun(Gk(Gjt,1),$Vn,380,0,[sjt,hjt,fjt])))}function k8(){k8=O,eEt=lhn((Sbn(),Pun(Gk(NEt,1),$Vn,381,0,[Zjt,nEt,Jjt])))}function j8(){j8=O,Qjt=lhn((Bcn(),Pun(Gk(Yjt,1),$Vn,293,0,[Xjt,Wjt,Ujt])))}function E8(){E8=O,UEt=lhn((Pbn(),Pun(Gk(WEt,1),$Vn,437,0,[HEt,qEt,GEt])))}function T8(){T8=O,kCt=lhn((ufn(),Pun(Gk(SCt,1),$Vn,334,0,[vCt,pCt,mCt])))}function M8(){M8=O,VPt=lhn((Rtn(),Pun(Gk(nCt,1),$Vn,272,0,[zPt,UPt,XPt])))}function S8(){return QEn(),Pun(Gk(aIt,1),$Vn,98,0,[YCt,QCt,VCt,UCt,WCt,XCt])}function P8(n,t){return!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),rdn(n.o,t)}function C8(n){return!n.g&&(n.g=new oo),!n.g.d&&(n.g.d=new lp(n)),n.g.d}function I8(n){return!n.g&&(n.g=new oo),!n.g.a&&(n.g.a=new bp(n)),n.g.a}function O8(n){return!n.g&&(n.g=new oo),!n.g.b&&(n.g.b=new fp(n)),n.g.b}function A8(n){return!n.g&&(n.g=new oo),!n.g.c&&(n.g.c=new wp(n)),n.g.c}function $8(n,t,e){var i,r;for(r=new Aan(t,n),i=0;i<e;++i)cvn(r);return r}function L8(n,t,e){var i,r;if(null!=e)for(i=0;i<t;++i)r=e[i],n.fi(i,r)}function N8(n,t,e,i){var r;return AFn(r=x8(ANt,hQn,25,t+1,15,1),n,t,e,i),r}function x8(n,t,e,i,r,c){var a;return a=Bmn(r,i),10!=r&&Pun(Gk(n,c),t,e,r,a),a}function D8(n,t,e,i){return e&&(i=e.gh(t,Awn(e.Tg(),n.c.Lj()),null,i)),i}function R8(n,t,e,i){return e&&(i=e.ih(t,Awn(e.Tg(),n.c.Lj()),null,i)),i}function K8(n,t,e){BB(n.b,65),BB(n.b,65),BB(n.b,65),Otn(n.a,new N_(e,t,n))}function _8(n,t,e){if(n<0||t>e||t<n)throw Hp(new Ok(mYn+n+kYn+t+hYn+e))}function F8(n){if(!n)throw Hp(new Fy("Unable to add element to queue"))}function B8(n){n?(this.c=n,this.b=null):(this.c=null,this.b=new Np)}function H8(n,t){PS.call(this,n,t),this.a=x8(Ket,kVn,436,2,0,1),this.b=!0}function q8(n){non.call(this,n,0),jx(this),this.d.b=this.d,this.d.a=this.d}function G8(n){var t;return 0==(t=n.b).b?null:BB(Dpn(t,0),188).b}function z8(n,t){var e;return(e=new q).c=!0,e.d=t.dd(),YGn(n,t.cd(),e)}function U8(n,t){var e;e=n.q.getHours()+(t/3600|0),n.q.setSeconds(t),lBn(n,e)}function X8(n,t,e){var i;(i=n.b[e.c.p][e.p]).b+=t.b,i.c+=t.c,i.a+=t.a,++i.a}function W8(n,t){var i,r;return i=n.a-t.a,r=n.b-t.b,e.Math.sqrt(i*i+r*r)}function V8(){V8=O,cht=new EP("QUADRATIC",0),aht=new EP("SCANLINE",1)}function Q8(){Q8=O,mmt=WG(dq(new B2,(yMn(),Rat),(lWn(),kot)),Bat,qot)}function Y8(){return wEn(),Pun(Gk(qPt,1),$Vn,291,0,[ZMt,JMt,YMt,VMt,WMt,QMt])}function J8(){return wvn(),Pun(Gk(nSt,1),$Vn,248,0,[CMt,AMt,$Mt,LMt,IMt,OMt])}function Z8(){return $Pn(),Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])}function n9(){return JMn(),Pun(Gk(mft,1),$Vn,275,0,[cft,eft,aft,rft,ift,tft])}function t9(){return Bjn(),Pun(Gk(uft,1),$Vn,274,0,[Qht,Vht,Jht,Wht,Yht,Xht])}function e9(){return TTn(),Pun(Gk(ovt,1),$Vn,313,0,[tvt,Zpt,Ypt,Jpt,evt,nvt])}function i9(){return gSn(),Pun(Gk(zht,1),$Vn,276,0,[Dht,xht,Kht,Rht,Fht,_ht])}function r9(){return DPn(),Pun(Gk(_kt,1),$Vn,327,0,[Qyt,Uyt,Wyt,Xyt,Vyt,zyt])}function c9(){return lIn(),Pun(Gk(IIt,1),$Vn,273,0,[rIt,eIt,iIt,tIt,nIt,cIt])}function a9(){return nMn(),Pun(Gk(yCt,1),$Vn,312,0,[aCt,rCt,uCt,eCt,cCt,iCt])}function u9(){return uSn(),Pun(Gk($ut,1),$Vn,267,0,[Cut,Put,Mut,Iut,Sut,Tut])}function o9(n){Mx(!!n.c),p2(n.e,n),n.c.Qb(),n.c=null,n.b=dun(n),bD(n.e,n)}function s9(n){return p2(n.c.a.e,n),Px(n.b!=n.c.a.d),n.a=n.b,n.b=n.b.a,n.a}function h9(n){var t;return n.a||-1==n.b||(t=n.c.Tg(),n.a=itn(t,n.b)),n.a}function f9(n,t){return!(n.hi()&&n.Hc(t)||(n.Yh(t),0))}function l9(n,t){return OY(t,"Horizontal alignment cannot be null"),n.b=t,n}function b9(n,t,e){var i;return wWn(),i=ZUn(n,t),e&&i&&gW(n)&&(i=null),i}function w9(n,t,e){var i;for(i=n.Kc();i.Ob();)ZRn(BB(i.Pb(),37),t,e)}function d9(n,t){var e;for(e=t.Kc();e.Ob();)$Kn(n,BB(e.Pb(),37),0,0)}function g9(n,t,i){var r;n.d[t.g]=i,(r=n.g.c)[t.g]=e.Math.max(r[t.g],i+1)}function p9(n,t){var e,i,r;return r=n.r,i=n.d,(e=cHn(n,t,!0)).b!=r||e.a!=i}function v9(n,t){return lS(n.e,t)||Jgn(n.e,t,new ipn(t)),BB(lnn(n.e,t),113)}function m9(n,t,e,i){return kW(n),kW(t),kW(e),kW(i),new jU(n,t,new G)}function y9(n,t,e,i){this.rj(),this.a=t,this.b=n,this.c=new Zz(this,t,e,i)}function k9(n,t,e,i,r,c){H2.call(this,t,i,r,c),Fh(this),this.c=n,this.b=e}function j9(n,t,e,i,r,c){H2.call(this,t,i,r,c),Fh(this),this.c=n,this.a=e}function E9(n,t,e){var i,r;r=null,(i=zJ(n,e))&&(r=yPn(i)),Xgn(t,e,r)}function T9(n,t,e){var i,r;r=null,(i=zJ(n,e))&&(r=yPn(i)),Xgn(t,e,r)}function M9(n,t,e){var i;return(i=$$n(n.b,t))?NHn(F7(n,i),e):null}function S9(n,t){var e;return(e=n.Yg(t))>=0?n._g(e,!0,!0):cOn(n,t,!0)}function P9(n,t){return Pln(Gy(MD(mMn(n,(hWn(),Tlt)))),Gy(MD(mMn(t,Tlt))))}function C9(){C9=O,Ukt=ogn(ogn(FM(new B2,(zyn(),Kyt)),(DPn(),Qyt)),Uyt)}function I9(n,t,e){var i;return i=Non(n,t,e),n.b=new mrn(i.c.length),sDn(n,i)}function O9(n){if(n.b<=0)throw Hp(new yv);return--n.b,n.a-=n.c.c,iln(n.a)}function A9(n){var t;if(!n.a)throw Hp(new lV);return t=n.a,n.a=JJ(n.a),t}function $9(n){for(;!n.a;)if(!TK(n.c,new pw(n)))return!1;return!0}function L9(n){return yX(n),cL(n,198)?BB(n,198):new ol(n)}function N9(n){x9(),BB(n.We((sWn(),fPt)),174).Fc((lIn(),iIt)),n.Ye(hPt,null)}function x9(){x9=O,tMt=new bu,iMt=new wu,eMt=vsn((sWn(),hPt),tMt,qSt,iMt)}function D9(){D9=O,cjt=new pC("LEAF_NUMBER",0),ajt=new pC("NODE_SIZE",1)}function R9(n,t,e){n.a=t,n.c=e,n.b.a.$b(),yQ(n.d),n.e.a.c=x8(Ant,HWn,1,0,5,1)}function K9(n){n.a=x8(ANt,hQn,25,n.b+1,15,1),n.c=x8(ANt,hQn,25,n.b,15,1),n.d=0}function _9(n,t){n.a.ue(t.d,n.b)>0&&(WB(n.c,new mH(t.c,t.d,n.d)),n.b=t.d)}function F9(n,t){if(null==n.g||t>=n.i)throw Hp(new LO(t,n.i));return n.g[t]}function B9(n,t,e){if(xsn(n,e),null!=e&&!n.wj(e))throw Hp(new lv);return e}function H9(n){var t;if(n.Ek())for(t=n.i-1;t>=0;--t)Wtn(n,t);return N3(n)}function q9(n){var t,e;if(!n.b)return null;for(e=n.b;t=e.a[0];)e=t;return e}function G9(n,t){var e;return c4(t),(e=m7(n.slice(0,t),n)).length=t,e}function z9(n,t,e,i){PQ(),i=i||wet,gCn(n.slice(t,e),n,t,e,-t,i)}function U9(n,t,e,i,r){return t<0?cOn(n,e,i):BB(e,66).Nj().Pj(n,n.yh(),t,i,r)}function X9(n){return cL(n,172)?""+BB(n,172).a:null==n?null:Bbn(n)}function W9(n){return cL(n,172)?""+BB(n,172).a:null==n?null:Bbn(n)}function V9(n,t){if(t.a)throw Hp(new dy(IYn));TU(n.a,t),t.a=n,!n.j&&(n.j=t)}function Q9(n,t){vO.call(this,t.rd(),-16449&t.qd()),kW(n),this.a=n,this.c=t}function Y9(n,t){var e,i;return i=t/n.c.Hd().gc()|0,e=t%n.c.Hd().gc(),U6(n,i,e)}function J9(){J9=O,Yit=new GS(cJn,0),Qit=new GS(eJn,1),Jit=new GS(aJn,2)}function Z9(){Z9=O,Net=new gS("All",0),xet=new LA,Det=new A$,Ret=new NA}function n7(){n7=O,_et=lhn((Z9(),Pun(Gk(Fet,1),$Vn,297,0,[Net,xet,Det,Ret])))}function t7(){t7=O,rut=lhn((Aun(),Pun(Gk(dut,1),$Vn,405,0,[Zat,eut,nut,tut])))}function e7(){e7=O,_rt=lhn((Dan(),Pun(Gk(Grt,1),$Vn,406,0,[Rrt,Nrt,xrt,Drt])))}function i7(){i7=O,zrt=lhn((Hpn(),Pun(Gk(Urt,1),$Vn,323,0,[Brt,Frt,Hrt,qrt])))}function r7(){r7=O,ict=lhn((qpn(),Pun(Gk(cct,1),$Vn,394,0,[Zrt,Jrt,nct,tct])))}function c7(){c7=O,Hyt=lhn((zyn(),Pun(Gk(qyt,1),$Vn,393,0,[Ryt,Kyt,_yt,Fyt])))}function a7(){a7=O,ost=lhn((Iun(),Pun(Gk(pst,1),$Vn,360,0,[ast,rst,cst,ist])))}function u7(){u7=O,zjt=lhn((Omn(),Pun(Gk(Vjt,1),$Vn,340,0,[qjt,Bjt,Hjt,Fjt])))}function o7(){o7=O,Est=lhn((Oun(),Pun(Gk(Ist,1),$Vn,411,0,[vst,mst,yst,kst])))}function s7(){s7=O,dvt=lhn((bvn(),Pun(Gk(kvt,1),$Vn,197,0,[lvt,bvt,fvt,hvt])))}function h7(){h7=O,fOt=lhn((Bsn(),Pun(Gk(wOt,1),$Vn,396,0,[uOt,oOt,aOt,sOt])))}function f7(){f7=O,PCt=lhn((Xyn(),Pun(Gk(RCt,1),$Vn,285,0,[MCt,jCt,ECt,TCt])))}function l7(){l7=O,tCt=lhn((Mbn(),Pun(Gk(oCt,1),$Vn,218,0,[ZPt,YPt,QPt,JPt])))}function b7(){b7=O,rOt=lhn((Fwn(),Pun(Gk(cOt,1),$Vn,311,0,[eOt,ZIt,tOt,nOt])))}function w7(){w7=O,BIt=lhn((mdn(),Pun(Gk(YIt,1),$Vn,374,0,[KIt,_It,RIt,DIt])))}function d7(){d7=O,qBn(),HLt=RQn,BLt=KQn,GLt=new Nb(RQn),qLt=new Nb(KQn)}function g7(){g7=O,Ght=new OP(QZn,0),qht=new OP("IMPROVE_STRAIGHTNESS",1)}function p7(n,t){return hH(),WB(n,new rI(t,iln(t.e.c.length+t.g.c.length)))}function v7(n,t){return hH(),WB(n,new rI(t,iln(t.e.c.length+t.g.c.length)))}function m7(n,t){return 10!=vnn(t)&&Pun(tsn(t),t.hm,t.__elementTypeId$,vnn(t),n),n}function y7(n,t){var e;return-1!=(e=E7(n,t,0))&&(s6(n,e),!0)}function k7(n,t){var e;return(e=BB(v6(n.e,t),387))?(RH(e),e.e):null}function j7(n){var t;return JO(n)&&(t=0-n,!isNaN(t))?t:uan(aon(n))}function E7(n,t,e){for(;e<n.c.length;++e)if(cV(t,n.c[e]))return e;return-1}function T7(n,t,e){var i;return EW(n),(i=new sn).a=t,n.a.Nb(new IS(i,e)),i.a}function M7(n){var t;return EW(n),t=x8(xNt,qQn,25,0,15,1),gE(n.a,new ww(t)),t}function S7(n){var t;return t=BB(xq(n.j,0),11),BB(mMn(t,(hWn(),dlt)),11)}function P7(n){var t;if(!Zin(n))throw Hp(new yv);return n.e=1,t=n.d,n.d=null,t}function C7(n,t){var e;this.f=n,this.b=t,e=BB(RX(n.b,t),283),this.c=e?e.b:null}function I7(){G_(),this.b=new xp,this.f=new xp,this.g=new xp,this.e=new xp}function O7(n,t){this.a=x8(Out,a1n,10,n.a.c.length,0,1),Qgn(n.a,this.a),this.b=t}function A7(n){var t;for(t=n.p+1;t<n.c.a.c.length;++t)--BB(xq(n.c.a,t),10).p}function $7(n){var t;null!=(t=n.Ai())&&-1!=n.d&&BB(t,92).Ng(n),n.i&&n.i.Fi()}function L7(n){V$(this),this.g=n?CY(n,n.$d()):null,this.f=n,jQ(this),this._d()}function N7(n,t,e,i,r,c,a){kin.call(this,t,i,r,c,a),Fh(this),this.c=n,this.b=e}function x7(n,t,e,i,r){return kW(n),kW(t),kW(e),kW(i),kW(r),new jU(n,t,i)}function D7(n,t){if(t<0)throw Hp(new Ay(n5n+t));return g3(n,t+1),xq(n.j,t)}function R7(n,t,e,i){if(!n)throw Hp(new _y($Rn(t,Pun(Gk(Ant,1),HWn,1,5,[e,i]))))}function K7(n,t){return cV(t,xq(n.f,0))||cV(t,xq(n.f,1))||cV(t,xq(n.f,2))}function _7(n,t){LK(BB(BB(n.f,33).We((sWn(),uPt)),98))&&Qbn(yV(BB(n.f,33)),t)}function F7(n,t){var e,i;return!(i=(e=BB(t,675)).Oh())&&e.Rh(i=new RI(n,t)),i}function B7(n,t){var e,i;return!(i=(e=BB(t,677)).pk())&&e.tk(i=new K0(n,t)),i}function H7(n){return n.b||(n.b=new JG(n,VAt,n),!n.a&&(n.a=new oR(n,n))),n.b}function q7(){q7=O,Oat=new WS("XY",0),Iat=new WS("X",1),Aat=new WS("Y",2)}function G7(){G7=O,crt=new zS("TOP",0),rrt=new zS(eJn,1),irt=new zS(oJn,2)}function z7(){z7=O,Pft=new xP(QZn,0),Cft=new xP("TOP",1),Sft=new xP(oJn,2)}function U7(){U7=O,Kvt=new GP("INPUT_ORDER",0),_vt=new GP("PORT_DEGREE",1)}function X7(){X7=O,btt=M$(SQn,SQn,524287),wtt=M$(0,0,CQn),dtt=F5(1),F5(2),gtt=F5(0)}function W7(n,t,e){n.a.c=x8(Ant,HWn,1,0,5,1),Xqn(n,t,e),0==n.a.c.length||f_n(n,t)}function V7(n){var t,e;return YU(n,0,e=n.length,t=x8(ONt,WVn,25,e,15,1),0),t}function Q7(n){var t;return n.dh()||(t=bX(n.Tg())-n.Ah(),n.ph().bk(t)),n.Pg()}function Y7(n){var t;return null==(t=een(yan(n,32)))&&(fgn(n),t=een(yan(n,32))),t}function J7(n,t){var e;return(e=Awn(n.d,t))>=0?Zpn(n,e,!0,!0):cOn(n,t,!0)}function Z7(n,t){var e,i;return MM(),e=f3(n),i=f3(t),!!e&&!!i&&!Kpn(e.k,i.k)}function nnn(n,t){Pen(n,null==t||WK((kW(t),t))||isNaN((kW(t),t))?0:(kW(t),t))}function tnn(n,t){Cen(n,null==t||WK((kW(t),t))||isNaN((kW(t),t))?0:(kW(t),t))}function enn(n,t){Sen(n,null==t||WK((kW(t),t))||isNaN((kW(t),t))?0:(kW(t),t))}function inn(n,t){Men(n,null==t||WK((kW(t),t))||isNaN((kW(t),t))?0:(kW(t),t))}function rnn(n){(this.q?this.q:(SQ(),SQ(),het)).Ac(n.q?n.q:(SQ(),SQ(),het))}function cnn(n,t){return cL(t,99)&&0!=(BB(t,18).Bb&BQn)?new xO(t,n):new Aan(t,n)}function ann(n,t){return cL(t,99)&&0!=(BB(t,18).Bb&BQn)?new xO(t,n):new Aan(t,n)}function unn(n,t){Vrt=new it,ect=t,BB((Wrt=n).b,65),K8(Wrt,Vrt,null),uqn(Wrt)}function onn(n,t,e){var i;return i=n.g[t],jL(n,t,n.oi(t,e)),n.gi(t,e,i),n.ci(),i}function snn(n,t){var e;return(e=n.Xc(t))>=0&&(n.$c(e),!0)}function hnn(n){var t;return n.d!=n.r&&(t=Ikn(n),n.e=!!t&&t.Cj()==E9n,n.d=t),n.e}function fnn(n,t){var e;for(yX(n),yX(t),e=!1;t.Ob();)e|=n.Fc(t.Pb());return e}function lnn(n,t){var e;return(e=BB(RX(n.e,t),387))?(uL(n,e),e.e):null}function bnn(n){var t,e;return t=n/60|0,0==(e=n%60)?""+t:t+":"+e}function wnn(n,t){return Qln(n),new Rq(n,new KK(new M6(t,n.a)))}function dnn(n,t){var e=n.a[t],i=(Zun(),ftt)[typeof e];return i?i(e):khn(typeof e)}function gnn(n){switch(n.g){case 0:return DWn;case 1:return-1;default:return 0}}function pnn(n){return Kkn(n,(X7(),gtt))<0?-CN(aon(n)):n.l+n.m*IQn+n.h*OQn}function vnn(n){return null==n.__elementTypeCategory$?10:n.__elementTypeCategory$}function mnn(n){var t;return null!=(t=0==n.b.c.length?null:xq(n.b,0))&&hrn(n,0),t}function ynn(n,t){for(;t[0]<n.length&&GO(" \t\r\n",YTn(fV(n,t[0])))>=0;)++t[0]}function knn(n,t){this.e=t,this.a=Van(n),this.a<54?this.f=j2(n):this.c=npn(n)}function jnn(n,t,e,i){wWn(),Ap.call(this,26),this.c=n,this.a=t,this.d=e,this.b=i}function Enn(n,t,e){var i,r;for(i=10,r=0;r<e-1;r++)t<i&&(n.a+="0"),i*=10;n.a+=t}function Tnn(n,t){var e;for(e=0;n.e!=n.i.gc();)gq(t,kpn(n),iln(e)),e!=DWn&&++e}function Mnn(n,t){var e;for(++n.d,++n.c[t],e=t+1;e<n.a.length;)++n.a[e],e+=e&-e}function Snn(n,t){var e,i,r;r=t.c.i,i=(e=BB(RX(n.f,r),57)).d.c-e.e.c,Yrn(t.a,i,0)}function Pnn(n){var t,e;return t=n+128,!(e=(jq(),jtt)[t])&&(e=jtt[t]=new $b(n)),e}function Cnn(n,t){var e;return kW(t),xnn(!!(e=n[":"+t]),Pun(Gk(Ant,1),HWn,1,5,[t])),e}function Inn(n){var t,e;if(n.b){e=null;do{t=n.b,n.b=null,e=sPn(t,e)}while(n.b);n.b=e}}function Onn(n){var t,e;if(n.a){e=null;do{t=n.a,n.a=null,e=sPn(t,e)}while(n.a);n.a=e}}function Ann(n){var t;for(++n.a,t=n.c.a.length;n.a<t;++n.a)if(n.c.b[n.a])return}function $nn(n,t){var e,i;for(e=(i=t.c)+1;e<=t.f;e++)n.a[e]>n.a[i]&&(i=e);return i}function Lnn(n,t){var e;return 0==(e=Ibn(n.e.c,t.e.c))?Pln(n.e.d,t.e.d):e}function Nnn(n,t){return 0==t.e||0==n.e?eet:($On(),ANn(n,t))}function xnn(n,t){if(!n)throw Hp(new _y(YNn("Enum constant undefined: %s",t)))}function Dnn(){Dnn=O,uut=new St,out=new Tt,cut=new At,aut=new $t,sut=new Lt}function Rnn(){Rnn=O,vit=new BS("BY_SIZE",0),mit=new BS("BY_SIZE_AND_SHAPE",1)}function Knn(){Knn=O,Dct=new XS("EADES",0),Rct=new XS("FRUCHTERMAN_REINGOLD",1)}function _nn(){_nn=O,Sht=new PP("READING_DIRECTION",0),Pht=new PP("ROTATION",1)}function Fnn(){Fnn=O,Mht=lhn((Vvn(),Pun(Gk(Cht,1),$Vn,335,0,[yht,mht,jht,Eht,kht])))}function Bnn(){Bnn=O,jvt=lhn((Nvn(),Pun(Gk(Avt,1),$Vn,315,0,[yvt,pvt,vvt,gvt,mvt])))}function Hnn(){Hnn=O,Ost=lhn((LEn(),Pun(Gk(Kst,1),$Vn,363,0,[Mst,Pst,Cst,Sst,Tst])))}function qnn(){qnn=O,zlt=lhn((Tbn(),Pun(Gk(ivt,1),$Vn,163,0,[qlt,_lt,Flt,Blt,Hlt])))}function Gnn(){Gnn=O,sTt=lhn(($Sn(),Pun(Gk(zTt,1),$Vn,316,0,[iTt,rTt,uTt,cTt,aTt])))}function znn(){znn=O,bMt=lhn((rpn(),Pun(Gk(jMt,1),$Vn,175,0,[hMt,sMt,uMt,fMt,oMt])))}function Unn(){Unn=O,BEt=lhn((YLn(),Pun(Gk(zEt,1),$Vn,355,0,[DEt,xEt,KEt,REt,_Et])))}function Xnn(){Xnn=O,qat=lhn((yMn(),Pun(Gk(Uat,1),$Vn,356,0,[Rat,Kat,_at,Fat,Bat])))}function Wnn(){Wnn=O,GPt=lhn((Ffn(),Pun(Gk(WPt,1),$Vn,103,0,[BPt,FPt,_Pt,KPt,HPt])))}function Vnn(){Vnn=O,zCt=lhn((cpn(),Pun(Gk(JCt,1),$Vn,249,0,[BCt,qCt,_Ct,FCt,HCt])))}function Qnn(){Qnn=O,OIt=lhn((kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])))}function Ynn(n,t){var e;return(e=BB(RX(n.a,t),134))||(e=new Zn,VW(n.a,t,e)),e}function Jnn(n){var t;return!!(t=BB(mMn(n,(hWn(),Rft)),305))&&t.a==n}function Znn(n){var t;return!!(t=BB(mMn(n,(hWn(),Rft)),305))&&t.i==n}function ntn(n,t){return kW(t),Dz(n),!!n.d.Ob()&&(t.td(n.d.Pb()),!0)}function ttn(n){return Vhn(n,DWn)>0?DWn:Vhn(n,_Vn)<0?_Vn:dG(n)}function etn(n){return n<3?(lin(n,IVn),n+1):n<OVn?CJ(n/.75+1):DWn}function itn(n,t){var e;return null==n.i&&qFn(n),e=n.i,t>=0&&t<e.length?e[t]:null}function rtn(n,t,e){var i;if(null==t)throw Hp(new gv);return i=zJ(n,t),i4(n,t,e),i}function ctn(n){return n.a>=-.01&&n.a<=fJn&&(n.a=0),n.b>=-.01&&n.b<=fJn&&(n.b=0),n}function atn(n,t){return t==(c_(),c_(),Met)?n.toLocaleLowerCase():n.toLowerCase()}function utn(n){return(0!=(2&n.i)?"interface ":0!=(1&n.i)?"":"class ")+(ED(n),n.o)}function otn(n){var t;t=new $m,f9((!n.q&&(n.q=new eU(QAt,n,11,10)),n.q),t)}function stn(n,t){var e;return e=t>0?t-1:t,$j(Lj(Fen(LH(new Xm,e),n.n),n.j),n.k)}function htn(n,t,e,i){n.j=-1,qOn(n,EPn(n,t,e),(ZM(),BB(t,66).Mj().Ok(i)))}function ftn(n){this.g=n,this.f=new Np,this.a=e.Math.min(this.g.c.c,this.g.d.c)}function ltn(n){this.b=new Np,this.a=new Np,this.c=new Np,this.d=new Np,this.e=n}function btn(n,t){this.a=new xp,this.e=new xp,this.b=(Mhn(),uvt),this.c=n,this.b=t}function wtn(n,t,e){NR.call(this),xtn(this),this.a=n,this.c=e,this.b=t.d,this.f=t.e}function dtn(n){this.d=n,this.c=n.c.vc().Kc(),this.b=null,this.a=null,this.e=(ry(),znt)}function gtn(n){if(n<0)throw Hp(new _y("Illegal Capacity: "+n));this.g=this.ri(n)}function ptn(n,t){if(0>n||n>t)throw Hp(new Tk("fromIndex: 0, toIndex: "+n+hYn+t))}function vtn(n){var t;if(n.a==n.b.a)throw Hp(new yv);return t=n.a,n.c=t,n.a=n.a.e,t}function mtn(n){var t;Mx(!!n.c),t=n.c.a,Atn(n.d,n.c),n.b==n.c?n.b=t:--n.a,n.c=null}function ytn(n,t){var e;return Qln(n),e=new vQ(n,n.a.rd(),4|n.a.qd(),t),new Rq(n,e)}function ktn(n,t){var e,i;return(e=BB(lfn(n.d,t),14))?(i=t,n.e.pc(i,e)):null}function jtn(n,t){var e;for(e=n.Kc();e.Ob();)hon(BB(e.Pb(),70),(hWn(),ult),t)}function Etn(n){var t;return(t=Gy(MD(mMn(n,(HXn(),agt)))))<0&&hon(n,agt,t=0),t}function Ttn(n,t,i){var r;Fkn(i,r=e.Math.max(0,n.b/2-.5),1),WB(t,new iP(i,r))}function Mtn(n,t,e){return CJ(HH(n.a.e[BB(t.a,10).p]-n.a.e[BB(e.a,10).p]))}function Stn(n,t,e,i,r,c){var a;SZ(a=W5(i),r),MZ(a,c),JIn(n.a,i,new L_(a,t,e.f))}function Ptn(n,t){var e;if(!(e=NNn(n.Tg(),t)))throw Hp(new _y(r6n+t+u6n));return e}function Ctn(n,t){var e;for(e=n;JJ(e);)if((e=JJ(e))==t)return!0;return!1}function Itn(n,t){var e,i,r;for(i=t.a.cd(),e=BB(t.a.dd(),14).gc(),r=0;r<e;r++)n.td(i)}function Otn(n,t){var e,i,r,c;for(kW(t),r=0,c=(i=n.c).length;r<c;++r)e=i[r],t.td(e)}function Atn(n,t){var e;return e=t.c,t.a.b=t.b,t.b.a=t.a,t.a=t.b=null,t.c=null,--n.b,e}function $tn(n,t){return!(!t||n.b[t.g]!=t||($X(n.b,t.g,null),--n.c,0))}function Ltn(n,t){return!!Zrn(n,t,dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15))))}function Ntn(n,t){LK(BB(mMn(BB(n.e,10),(HXn(),ept)),98))&&(SQ(),m$(BB(n.e,10).j,t))}function xtn(n){n.b=(J9(),Qit),n.f=(G7(),rrt),n.d=(lin(2,AVn),new J6(2)),n.e=new Gj}function Dtn(){Dtn=O,Git=new qS("BEGIN",0),zit=new qS(eJn,1),Uit=new qS("END",2)}function Rtn(){Rtn=O,zPt=new _C(eJn,0),UPt=new _C("HEAD",1),XPt=new _C("TAIL",2)}function Ktn(){return hAn(),Pun(Gk(aAt,1),$Vn,237,0,[iAt,nAt,tAt,ZOt,eAt,YOt,QOt,JOt])}function _tn(){return PPn(),Pun(Gk(SMt,1),$Vn,277,0,[kMt,wMt,vMt,yMt,dMt,gMt,pMt,mMt])}function Ftn(){return kDn(),Pun(Gk(iht,1),$Vn,270,0,[Bst,Gst,Fst,Xst,qst,Hst,Ust,zst])}function Btn(){return sNn(),Pun(Gk(Dvt,1),$Vn,260,0,[Ivt,Tvt,Pvt,Mvt,Svt,Evt,Cvt,Ovt])}function Htn(){Htn=O,ZCt=lhn((QEn(),Pun(Gk(aIt,1),$Vn,98,0,[YCt,QCt,VCt,UCt,WCt,XCt])))}function qtn(){qtn=O,nrt=(Dtn(),Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length,Zit=nrt}function Gtn(n){this.b=(yX(n),new t_(n)),this.a=new Np,this.d=new Np,this.e=new Gj}function ztn(n){var t;return(t=e.Math.sqrt(n.a*n.a+n.b*n.b))>0&&(n.a/=t,n.b/=t),n}function Utn(n){var t;return n.w?n.w:((t=V1(n))&&!t.kh()&&(n.w=t),t)}function Xtn(n){var t;return null==n?null:VTn(t=BB(n,190),t.length)}function Wtn(n,t){if(null==n.g||t>=n.i)throw Hp(new LO(t,n.i));return n.li(t,n.g[t])}function Vtn(n){var t,e;for(t=n.a.d.j,e=n.c.d.j;t!=e;)orn(n.b,t),t=Mln(t);orn(n.b,t)}function Qtn(n){var t;for(t=0;t<n.c.length;t++)(l1(t,n.c.length),BB(n.c[t],11)).p=t}function Ytn(n,t,e){var i,r,c;for(r=t[e],i=0;i<r.length;i++)c=r[i],n.e[c.c.p][c.p]=i}function Jtn(n,t){var e,i,r,c;for(r=0,c=(i=n.d).length;r<c;++r)e=i[r],lL(n.g,e).a=t}function Ztn(n,t){var e;for(e=spn(n,0);e.b!=e.d.c;)UR(BB(b3(e),8),t);return n}function nen(n,t){return XR(B$(BB(RX(n.g,t),8)),_$(BB(RX(n.f,t),460).b))}function ten(n){var t;return p2(n.e,n),Px(n.b),n.c=n.a,t=BB(n.a.Pb(),42),n.b=dun(n),t}function een(n){var t;return JH(null==n||Array.isArray(n)&&!((t=vnn(n))>=14&&t<=16)),n}function ien(n,t,e){var i=function(){return n.apply(i,arguments)};return t.apply(i,e),i}function ren(n,t,e){var i,r;i=t;do{r=Gy(n.p[i.p])+e,n.p[i.p]=r,i=n.a[i.p]}while(i!=t)}function cen(n,t){var e,i;i=n.a,e=Qfn(n,t,null),i!=t&&!n.e&&(e=azn(n,t,e)),e&&e.Fi()}function aen(n,t){return h$(),rin(KVn),e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)}function uen(n,t){return h$(),rin(KVn),e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)}function oen(n,t){return _Mn(),E$(n.b.c.length-n.e.c.length,t.b.c.length-t.e.c.length)}function sen(n,t){return Zj(Jrn(n,t,dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15)))))}function hen(){hen=O,Aut=lhn((uSn(),Pun(Gk($ut,1),$Vn,267,0,[Cut,Put,Mut,Iut,Sut,Tut])))}function fen(){fen=O,tSt=lhn((wEn(),Pun(Gk(qPt,1),$Vn,291,0,[ZMt,JMt,YMt,VMt,WMt,QMt])))}function len(){len=O,xMt=lhn((wvn(),Pun(Gk(nSt,1),$Vn,248,0,[CMt,AMt,$Mt,LMt,IMt,OMt])))}function ben(){ben=O,rht=lhn(($Pn(),Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])))}function wen(){wen=O,oft=lhn((JMn(),Pun(Gk(mft,1),$Vn,275,0,[cft,eft,aft,rft,ift,tft])))}function den(){den=O,nft=lhn((Bjn(),Pun(Gk(uft,1),$Vn,274,0,[Qht,Vht,Jht,Wht,Yht,Xht])))}function gen(){gen=O,rvt=lhn((TTn(),Pun(Gk(ovt,1),$Vn,313,0,[tvt,Zpt,Ypt,Jpt,evt,nvt])))}function pen(){pen=O,Hht=lhn((gSn(),Pun(Gk(zht,1),$Vn,276,0,[Dht,xht,Kht,Rht,Fht,_ht])))}function ven(){ven=O,Jyt=lhn((DPn(),Pun(Gk(_kt,1),$Vn,327,0,[Qyt,Uyt,Wyt,Xyt,Vyt,zyt])))}function men(){men=O,uIt=lhn((lIn(),Pun(Gk(IIt,1),$Vn,273,0,[rIt,eIt,iIt,tIt,nIt,cIt])))}function yen(){yen=O,sCt=lhn((nMn(),Pun(Gk(yCt,1),$Vn,312,0,[aCt,rCt,uCt,eCt,cCt,iCt])))}function ken(){return n$n(),Pun(Gk(GCt,1),$Vn,93,0,[ICt,CCt,ACt,DCt,xCt,NCt,$Ct,LCt,OCt])}function jen(n,t){var e;e=n.a,n.a=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,0,e,n.a))}function Een(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,1,e,n.b))}function Ten(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,3,e,n.b))}function Men(n,t){var e;e=n.f,n.f=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,3,e,n.f))}function Sen(n,t){var e;e=n.g,n.g=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,4,e,n.g))}function Pen(n,t){var e;e=n.i,n.i=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,5,e,n.i))}function Cen(n,t){var e;e=n.j,n.j=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,6,e,n.j))}function Ien(n,t){var e;e=n.j,n.j=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,1,e,n.j))}function Oen(n,t){var e;e=n.c,n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,4,e,n.c))}function Aen(n,t){var e;e=n.k,n.k=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new f4(n,2,e,n.k))}function $en(n,t){var e;e=n.d,n.d=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new l4(n,2,e,n.d))}function Len(n,t){var e;e=n.s,n.s=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new l4(n,4,e,n.s))}function Nen(n,t){var e;e=n.t,n.t=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new l4(n,5,e,n.t))}function xen(n,t){var e;e=n.F,n.F=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,5,e,t))}function Den(n,t){var e;return(e=BB(RX((nS(),mAt),n),55))?e.xj(t):x8(Ant,HWn,1,t,5,1)}function Ren(n,t){var e;return t in n.a&&(e=zJ(n,t).he())?e.a:null}function Ken(n,t){var e,i;return tE(),i=new uo,!!t&&INn(i,t),xin(e=i,n),e}function _en(n,t,e){if(xsn(n,e),!n.Bk()&&null!=e&&!n.wj(e))throw Hp(new lv);return e}function Fen(n,t){return n.n=t,n.n?(n.f=new Np,n.e=new Np):(n.f=null,n.e=null),n}function Ben(n,t,e,i,r,c){var a;return Qen(e,a=mX(n,t)),a.i=r?8:0,a.f=i,a.e=r,a.g=c,a}function Hen(n,t,e,i,r){this.d=t,this.k=i,this.f=r,this.o=-1,this.p=1,this.c=n,this.a=e}function qen(n,t,e,i,r){this.d=t,this.k=i,this.f=r,this.o=-1,this.p=2,this.c=n,this.a=e}function Gen(n,t,e,i,r){this.d=t,this.k=i,this.f=r,this.o=-1,this.p=6,this.c=n,this.a=e}function zen(n,t,e,i,r){this.d=t,this.k=i,this.f=r,this.o=-1,this.p=7,this.c=n,this.a=e}function Uen(n,t,e,i,r){this.d=t,this.j=i,this.e=r,this.o=-1,this.p=4,this.c=n,this.a=e}function Xen(n,t){var e,i,r,c;for(r=0,c=(i=t).length;r<c;++r)e=i[r],V9(n.a,e);return n}function Wen(n){var t,e,i;for(e=0,i=(t=n).length;e<i;++e)yX(t[e]);return new AO(n)}function Ven(n){var t=/function(?:\s+([\w$]+))?\s*\(/.exec(n);return t&&t[1]||zVn}function Qen(n,t){if(n){t.n=n;var e=UJ(t);e?e.gm=t:SWn[n]=[t]}}function Yen(n,t,i){var r;return r=n.length,_Cn(n,0,t,0,e.Math.min(i,r),!0),t}function Jen(n,t,e){var i,r;for(r=t.Kc();r.Ob();)i=BB(r.Pb(),79),TU(n,BB(e.Kb(i),33))}function Zen(){YE();for(var n=PWn,t=0;t<arguments.length;t++)n.push(arguments[t])}function nin(n,t){var e,i,r;for(i=0,r=(e=t).length;i<r;++i)r5(n,e[i],n.c.b,n.c)}function tin(n,t){n.b=e.Math.max(n.b,t.d),n.e+=t.r+(0==n.a.c.length?0:n.c),WB(n.a,t)}function ein(n){Mx(n.c>=0),rgn(n.d,n.c)<0&&(n.a=n.a-1&n.d.a.length-1,n.b=n.d.c),n.c=-1}function iin(n){return n.a<54?n.f<0?-1:n.f>0?1:0:(!n.c&&(n.c=yhn(n.f)),n.c).e}function rin(n){if(!(n>=0))throw Hp(new _y("tolerance ("+n+") must be >= 0"));return n}function cin(){return cMt||ksn(cMt=new ORn,Pun(Gk(_it,1),HWn,130,0,[new Nf])),cMt}function ain(){ain=O,Gvt=new zP(hJn,0),Hvt=new zP("INPUT",1),qvt=new zP("OUTPUT",2)}function uin(){uin=O,wht=new MP("ARD",0),ght=new MP("MSD",1),dht=new MP("MANUAL",2)}function oin(){oin=O,Omt=new YP("BARYCENTER",0),Amt=new YP(E1n,1),$mt=new YP(T1n,2)}function sin(n,t){var e;if(e=n.gc(),t<0||t>e)throw Hp(new tK(t,e));return new RK(n,t)}function hin(n,t){var e;return cL(t,42)?n.c.Mc(t):(e=rdn(n,t),Wdn(n,t),e)}function fin(n,t,e){return Ihn(n,t),Nrn(n,e),Len(n,0),Nen(n,1),nln(n,!0),Yfn(n,!0),n}function lin(n,t){if(n<0)throw Hp(new _y(t+" cannot be negative but was: "+n));return n}function bin(n,t){var e,i;for(e=0,i=n.gc();e<i;++e)if(cV(t,n.Xb(e)))return e;return-1}function win(n){var t;for(t=n.c.Cc().Kc();t.Ob();)BB(t.Pb(),14).$b();n.c.$b(),n.d=0}function din(n){var t,e,i,r;for(i=0,r=(e=n.a).length;i<r;++i)QU(t=e[i],t.length,null)}function gin(n){var t,e;if(0==n)return 32;for(e=0,t=1;0==(t&n);t<<=1)++e;return e}function pin(n){var t;for(t=new Wb(eyn(n));t.a<t.c.c.length;)BB(n0(t),680).Gf()}function vin(n){vM(),this.g=new xp,this.f=new xp,this.b=new xp,this.c=new pJ,this.i=n}function min(){this.f=new Gj,this.d=new wm,this.c=new Gj,this.a=new Np,this.b=new Np}function yin(n,t,e,i){this.rj(),this.a=t,this.b=n,this.c=null,this.c=new lK(this,t,e,i)}function kin(n,t,e,i,r){this.d=n,this.n=t,this.g=e,this.o=i,this.p=-1,r||(this.o=-2-i-1)}function jin(){OL.call(this),this.n=-1,this.g=null,this.i=null,this.j=null,this.Bb|=k6n}function Ein(){return n_n(),Pun(Gk(iOt,1),$Vn,259,0,[GIt,UIt,qIt,XIt,WIt,QIt,VIt,zIt,HIt])}function Tin(){return tRn(),Pun(Gk(Bit,1),$Vn,250,0,[Rit,$it,Lit,Ait,xit,Dit,Nit,Oit,Iit])}function Min(){Min=O,Ott=Pun(Gk(ANt,1),hQn,25,15,[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15])}function Sin(){Sin=O,kmt=dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)}function Pin(){Pin=O,jmt=dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)}function Cin(){Cin=O,Mmt=dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)}function Iin(){Iin=O,Cmt=WG(dq(dq(new B2,(yMn(),_at),(lWn(),Lot)),Fat,Eot),Bat,$ot)}function Oin(){Oin=O,hht=new TP("LAYER_SWEEP",0),sht=new TP(B1n,1),fht=new TP(QZn,2)}function Ain(n,t){var e,i;return e=n.c,(i=t.e[n.p])>0?BB(xq(e.a,i-1),10):null}function $in(n,t){var e;e=n.k,n.k=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,2,e,n.k))}function Lin(n,t){var e;e=n.f,n.f=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,8,e,n.f))}function Nin(n,t){var e;e=n.i,n.i=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,7,e,n.i))}function xin(n,t){var e;e=n.a,n.a=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,8,e,n.a))}function Din(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,0,e,n.b))}function Rin(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,0,e,n.b))}function Kin(n,t){var e;e=n.c,n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,e,n.c))}function _in(n,t){var e;e=n.c,n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,e,n.c))}function Fin(n,t){var e;e=n.c,n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,4,e,n.c))}function Bin(n,t){var e;e=n.d,n.d=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,e,n.d))}function Hin(n,t){var e;e=n.D,n.D=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,2,e,n.D))}function qin(n,t){n.r>0&&n.c<n.r&&(n.c+=t,n.i&&n.i.d>0&&0!=n.g&&qin(n.i,t/n.r*n.i.d))}function Gin(n,t,e){var i;n.b=t,n.a=e,i=512==(512&n.a)?new Fm:new Dh,n.c=MDn(i,n.b,n.a)}function zin(n,t){return $xn(n.e,t)?(ZM(),hnn(t)?new lq(t,n):new xI(t,n)):new KI(t,n)}function Uin(n,t){return Jj(Zrn(n.a,t,dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15)))))}function Xin(n,t,e){return x7(n,new fw(t),new un,new lw(e),Pun(Gk(nit,1),$Vn,132,0,[]))}function Win(n){return 0>n?new VT:new $D(null,new m5(n+1,n))}function Vin(n,t){var e;return SQ(),e=new XT(1),XI(n)?mZ(e,n,t):jCn(e.f,n,t),new Xb(e)}function Qin(n,t){var e,i;return(e=n.o+n.p)<(i=t.o+t.p)?-1:e==i?0:1}function Yin(n){var t;return cL(t=mMn(n,(hWn(),dlt)),160)?mwn(BB(t,160)):null}function Jin(n){var t;return(n=e.Math.max(n,2))>(t=kon(n))?(t<<=1)>0?t:OVn:t}function Zin(n){switch(uN(3!=n.e),n.e){case 2:return!1;case 0:return!0}return _5(n)}function nrn(n,t){var e;return!!cL(t,8)&&(e=BB(t,8),n.a==e.a&&n.b==e.b)}function trn(n,t,e){var i,r;return r=t>>5,i=31&t,e0(jz(n.n[e][r],dG(yz(i,1))),3)}function ern(n,t){var e,i;for(i=t.vc().Kc();i.Ob();)vjn(n,(e=BB(i.Pb(),42)).cd(),e.dd())}function irn(n,t){var e;e=new it,BB(t.b,65),BB(t.b,65),BB(t.b,65),Otn(t.a,new TB(n,e,t))}function rrn(n,t){var e;e=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,21,e,n.b))}function crn(n,t){var e;e=n.d,n.d=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,11,e,n.d))}function arn(n,t){var e;e=n.j,n.j=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,13,e,n.j))}function urn(n,t,e){var i,r,c;for(c=n.a.length-1,r=n.b,i=0;i<e;r=r+1&c,++i)$X(t,i,n.a[r])}function orn(n,t){var e;return kW(t),e=t.g,!n.b[e]&&($X(n.b,e,t),++n.c,!0)}function srn(n,t){var e;return!((e=null==t?-1:E7(n.b,t,0))<0||(hrn(n,e),0))}function hrn(n,t){var e;e=s6(n.b,n.b.c.length-1),t<n.b.c.length&&(c5(n.b,t,e),KCn(n,t))}function frn(n,t){0==(k5(),Qet?null:t.c).length&&zD(t,new X),mZ(n.a,Qet?null:t.c,t)}function lrn(n,t){OTn(t,"Hierarchical port constraint processing",1),bpn(n),YXn(n),HSn(t)}function brn(n,t){var e,i;for(i=t.Kc();i.Ob();)e=BB(i.Pb(),266),n.b=!0,TU(n.e,e),e.b=n}function wrn(n,t){var e,i;return e=1-t,i=n.a[e],n.a[e]=i.a[t],i.a[t]=n,n.b=!0,i.b=!1,i}function drn(n,t){var e,i;return e=BB(mMn(n,(HXn(),spt)),8),i=BB(mMn(t,spt),8),Pln(e.b,i.b)}function grn(n){RG.call(this),this.b=Gy(MD(mMn(n,(HXn(),ypt)))),this.a=BB(mMn(n,Zdt),218)}function prn(n,t,e){G2.call(this,n,t,e),this.a=new xp,this.b=new xp,this.d=new Wd(this)}function vrn(n){this.e=n,this.d=new bE(etn(gz(this.e).gc())),this.c=this.e.a,this.b=this.e.c}function mrn(n){this.b=n,this.a=x8(ANt,hQn,25,n+1,15,1),this.c=x8(ANt,hQn,25,n,15,1),this.d=0}function yrn(n,t,e){var i;return jxn(n,t,i=new Np,e,!0,!0),n.b=new mrn(i.c.length),i}function krn(n,t){var e;return(e=BB(RX(n.c,t),458))||((e=new cm).c=t,VW(n.c,e.c,e)),e}function jrn(n,t){var e=n.a,i=0;for(var r in e)e.hasOwnProperty(r)&&(t[i++]=r);return t}function Ern(n){return null==n.b?(YM(),YM(),x$t):n.Lk()?n.Kk():n.Jk()}function Trn(n){var t,e;for(e=new AL(n);e.e!=e.i.gc();)Pen(t=BB(kpn(e),33),0),Cen(t,0)}function Mrn(){Mrn=O,sat=new up(OZn),hat=new up(AZn),oat=new up($Zn),uat=new up(LZn)}function Srn(){Srn=O,qut=new ZS("TO_INTERNAL_LTR",0),Hut=new ZS("TO_INPUT_DIRECTION",1)}function Prn(){Prn=O,Qkt=new dC("P1_NODE_PLACEMENT",0),Ykt=new dC("P2_EDGE_ROUTING",1)}function Crn(){Crn=O,Rst=new kP("START",0),Dst=new kP("MIDDLE",1),xst=new kP("END",2)}function Irn(){Irn=O,tst=new iR("edgelabelcenterednessanalysis.includelabel",(hN(),ptt))}function Orn(n,t){JT(AV(new Rq(null,new w1(new Cb(n.b),1)),new JC(n,t)),new nI(n,t))}function Arn(){this.c=new IE(0),this.b=new IE(B3n),this.d=new IE(F3n),this.a=new IE(JJn)}function $rn(n){var t,e;for(e=n.c.a.ec().Kc();e.Ob();)Ul(t=BB(e.Pb(),214),new HMn(t.e))}function Lrn(n){var t,e;for(e=n.c.a.ec().Kc();e.Ob();)zl(t=BB(e.Pb(),214),new Vz(t.f))}function Nrn(n,t){var e;e=n.zb,n.zb=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,e,n.zb))}function xrn(n,t){var e;e=n.xb,n.xb=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,e,n.xb))}function Drn(n,t){var e;e=n.yb,n.yb=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,2,e,n.yb))}function Rrn(n,t){var e;(e=new Om).n=t,f9((!n.s&&(n.s=new eU(FAt,n,21,17)),n.s),e)}function Krn(n,t){var e;(e=new pD).n=t,f9((!n.s&&(n.s=new eU(FAt,n,21,17)),n.s),e)}function _rn(n,t){var e,i;for(z9(e=n.Pc(),0,e.length,t),i=0;i<e.length;i++)n._c(i,e[i])}function Frn(n,t){var e,i,r;for(kW(t),e=!1,r=t.Kc();r.Ob();)i=r.Pb(),e|=n.Fc(i);return e}function Brn(n){var t,e,i;for(t=0,i=n.Kc();i.Ob();)t=~~(t+=null!=(e=i.Pb())?nsn(e):0);return t}function Hrn(n){var t;return 0==n?"UTC":(n<0?(n=-n,t="UTC+"):t="UTC-",t+bnn(n))}function qrn(n,t){var e;return cL(t,14)?(e=BB(t,14),n.Gc(e)):fnn(n,BB(yX(t),20).Kc())}function Grn(n,t,e){btn.call(this,t,e),this.d=x8(Out,a1n,10,n.a.c.length,0,1),Qgn(n.a,this.d)}function zrn(n){n.a=null,n.e=null,n.b.c=x8(Ant,HWn,1,0,5,1),n.f.c=x8(Ant,HWn,1,0,5,1),n.c=null}function Urn(n,t){t?null==n.B&&(n.B=n.D,n.D=null):null!=n.B&&(n.D=n.B,n.B=null)}function Xrn(n,t){return Gy(MD($N($fn($V(new Rq(null,new w1(n.c.b,16)),new xd(n)),t))))}function Wrn(n,t){return Gy(MD($N($fn($V(new Rq(null,new w1(n.c.b,16)),new Nd(n)),t))))}function Vrn(n,t){OTn(t,k1n,1),JT(wnn(new Rq(null,new w1(n.b,16)),new Zt),new ne),HSn(t)}function Qrn(n,t){var e,i;return e=BB(ZAn(n,(Uyn(),Ljt)),19),i=BB(ZAn(t,Ljt),19),E$(e.a,i.a)}function Yrn(n,t,e){var i,r;for(r=spn(n,0);r.b!=r.d.c;)(i=BB(b3(r),8)).a+=t,i.b+=e;return n}function Jrn(n,t,e){var i;for(i=n.b[e&n.f];i;i=i.b)if(e==i.a&&wW(t,i.g))return i;return null}function Zrn(n,t,e){var i;for(i=n.c[e&n.f];i;i=i.d)if(e==i.f&&wW(t,i.i))return i;return null}function ncn(n,t,e){var i,r,c;for(i=0,r=0;r<e;r++)c=t[r],n[r]=c<<1|i,i=c>>>31;0!=i&&(n[e]=i)}function tcn(n,t){var e,i;for(SQ(),i=new Np,e=0;e<n;++e)i.c[i.c.length]=t;return new $k(i)}function ecn(n){var t;return QI((t=T2(n)).a,0)?(hM(),hM(),Pet):(hM(),new yx(t.b))}function icn(n){var t;return QI((t=T2(n)).a,0)?(hM(),hM(),Pet):(hM(),new yx(t.c))}function rcn(n){var t;return QI((t=E2(n)).a,0)?(fM(),fM(),Cet):(fM(),new kx(t.b))}function ccn(n){return n.b.c.i.k==(uSn(),Mut)?BB(mMn(n.b.c.i,(hWn(),dlt)),11):n.b.c}function acn(n){return n.b.d.i.k==(uSn(),Mut)?BB(mMn(n.b.d.i,(hWn(),dlt)),11):n.b.d}function ucn(n,t,e,i,r,c,a,u,o,s,h,f,l){return bCn(n,t,e,i,r,c,a,u,o,s,h,f,l),Gln(n,!1),n}function ocn(n,t,e,i,r,c,a){gT.call(this,n,t),this.d=e,this.e=i,this.c=r,this.b=c,this.a=u6(a)}function scn(n,t){typeof window===AWn&&typeof window.$gwt===AWn&&(window.$gwt[n]=t)}function hcn(n,t){return Aun(),n==Zat&&t==eut||n==eut&&t==Zat||n==tut&&t==nut||n==nut&&t==tut}function fcn(n,t){return Aun(),n==Zat&&t==nut||n==Zat&&t==tut||n==eut&&t==tut||n==eut&&t==nut}function lcn(n,t){return h$(),rin(fJn),e.Math.abs(0-t)<=fJn||0==t||isNaN(0)&&isNaN(t)?0:n/t}function bcn(){return bDn(),Pun(Gk(Tft,1),$Vn,256,0,[hft,lft,bft,wft,dft,gft,vft,sft,fft,pft])}function wcn(){wcn=O,P$t=new Im,I$t=Pun(Gk(FAt,1),N9n,170,0,[]),C$t=Pun(Gk(QAt,1),x9n,59,0,[])}function dcn(){dcn=O,smt=new VP("NO",0),umt=new VP("GREEDY",1),omt=new VP("LOOK_BACK",2)}function gcn(){gcn=O,Dut=new Ht,Nut=new Bt,xut=new qt,Lut=new Gt,Rut=new zt,Kut=new Ut}function pcn(n){var t,e;for(e=0,t=new Wb(n.b);t.a<t.c.c.length;)BB(n0(t),29).p=e,++e}function vcn(n,t){var e;return $In(new xC((e=_Tn(n)).c,e.d),new xC(e.b,e.a),n.rf(),t,n.Hf())}function mcn(n,t){var e;return n.b?null:(e=stn(n,n.g),DH(n.a,e),e.i=n,n.d=t,e)}function ycn(n,t,e){OTn(e,"DFS Treeifying phase",1),jdn(n,t),cxn(n,t),n.a=null,n.b=null,HSn(e)}function kcn(n,t,e){this.g=n,this.d=t,this.e=e,this.a=new Np,UCn(this),SQ(),m$(this.a,null)}function jcn(n){this.i=n.gc(),this.i>0&&(this.g=this.ri(this.i+(this.i/8|0)+1),n.Qc(this.g))}function Ecn(n,t){MH.call(this,W$t,n,t),this.b=this,this.a=axn(n.Tg(),itn(this.e.Tg(),this.c))}function Tcn(n,t){var e,i;for(kW(t),i=t.vc().Kc();i.Ob();)e=BB(i.Pb(),42),n.zc(e.cd(),e.dd())}function Mcn(n,t,e){var i;for(i=e.Kc();i.Ob();)if(!G3(n,t,i.Pb()))return!1;return!0}function Scn(n,t,e,i,r){var c;return e&&(c=Awn(t.Tg(),n.c),r=e.gh(t,-1-(-1==c?i:c),null,r)),r}function Pcn(n,t,e,i,r){var c;return e&&(c=Awn(t.Tg(),n.c),r=e.ih(t,-1-(-1==c?i:c),null,r)),r}function Ccn(n){var t;if(-2==n.b){if(0==n.e)t=-1;else for(t=0;0==n.a[t];t++);n.b=t}return n.b}function Icn(n){switch(n.g){case 2:return kUn(),CIt;case 4:return kUn(),oIt;default:return n}}function Ocn(n){switch(n.g){case 1:return kUn(),SIt;case 3:return kUn(),sIt;default:return n}}function Acn(n){var t,e,i;return n.j==(kUn(),sIt)&&(e=SN(t=UOn(n),oIt),(i=SN(t,CIt))||i&&e)}function $cn(n){var t;return new YK(t=BB(n.e&&n.e(),9),BB(VU(t,t.length),9),t.length)}function Lcn(n,t){OTn(t,k1n,1),twn(sM(new Pw((gM(),new HV(n,!1,!1,new Ft))))),HSn(t)}function Ncn(n,t){return hN(),XI(n)?f6(n,SD(t)):UI(n)?Tz(n,MD(t)):zI(n)?Ez(n,TD(t)):n.wd(t)}function xcn(n,t){t.q=n,n.d=e.Math.max(n.d,t.r),n.b+=t.d+(0==n.a.c.length?0:n.c),WB(n.a,t)}function Dcn(n,t){var e,i,r,c;return r=n.c,e=n.c+n.b,c=n.d,i=n.d+n.a,t.a>r&&t.a<e&&t.b>c&&t.b<i}function Rcn(n,t,e,i){cL(n.Cb,179)&&(BB(n.Cb,179).tb=null),Nrn(n,e),t&&_In(n,t),i&&n.xk(!0)}function Kcn(n,t){var e;qQ(e=BB(t,183),"x",n.i),qQ(e,"y",n.j),qQ(e,C6n,n.g),qQ(e,P6n,n.f)}function _cn(){_cn=O,Imt=ogn(jO(dq(dq(new B2,(yMn(),_at),(lWn(),Lot)),Fat,Eot),Bat),$ot)}function Fcn(){Fcn=O,Dmt=ogn(jO(dq(dq(new B2,(yMn(),_at),(lWn(),Lot)),Fat,Eot),Bat),$ot)}function Bcn(){Bcn=O,Xjt=new yC(QZn,0),Wjt=new yC("POLAR_COORDINATE",1),Ujt=new yC("ID",2)}function Hcn(){Hcn=O,Xvt=new UP("EQUALLY",0),Wvt=new UP(mJn,1),Vvt=new UP("NORTH_SOUTH",2)}function qcn(){qcn=O,$vt=lhn((sNn(),Pun(Gk(Dvt,1),$Vn,260,0,[Ivt,Tvt,Pvt,Mvt,Svt,Evt,Cvt,Ovt])))}function Gcn(){Gcn=O,Vst=lhn((kDn(),Pun(Gk(iht,1),$Vn,270,0,[Bst,Gst,Fst,Xst,qst,Hst,Ust,zst])))}function zcn(){zcn=O,EMt=lhn((PPn(),Pun(Gk(SMt,1),$Vn,277,0,[kMt,wMt,vMt,yMt,dMt,gMt,pMt,mMt])))}function Ucn(){Ucn=O,cAt=lhn((hAn(),Pun(Gk(aAt,1),$Vn,237,0,[iAt,nAt,tAt,ZOt,eAt,YOt,QOt,JOt])))}function Xcn(){Xcn=O,Qrt=new iR("debugSVG",(hN(),!1)),Yrt=new iR("overlapsExisted",!0)}function Wcn(n,t){return x7(new ow(n),new sw(t),new hw(t),new tn,Pun(Gk(nit,1),$Vn,132,0,[]))}function Vcn(){var n;return qet||(qet=new Kv,YA(n=new y5(""),(lM(),Het)),frn(qet,n)),qet}function Qcn(n,t){for(yX(t);n.Ob();)if(!Qan(BB(n.Pb(),10)))return!1;return!0}function Ycn(n,t){var e;return!!(e=XRn(cin(),n))&&(Ypn(t,(sWn(),mPt),e),!0)}function Jcn(n,t){var e;for(e=0;e<t.j.c.length;e++)BB(D7(n,e),21).Gc(BB(D7(t,e),14));return n}function Zcn(n,t){var e,i;for(i=new Wb(t.b);i.a<i.c.c.length;)e=BB(n0(i),29),n.a[e.p]=QMn(e)}function nan(n,t){var e,i;for(kW(t),i=n.vc().Kc();i.Ob();)e=BB(i.Pb(),42),t.Od(e.cd(),e.dd())}function tan(n,t){cL(t,83)?(BB(n.c,76).Xj(),ern(n,BB(t,83))):BB(n.c,76).Wb(t)}function ean(n){return cL(n,152)?o6(BB(n,152)):cL(n,131)?BB(n,131).a:cL(n,54)?new fy(n):new CT(n)}function ian(n,t){return t<n.b.gc()?BB(n.b.Xb(t),10):t==n.b.gc()?n.a:BB(xq(n.e,t-n.b.gc()-1),10)}function ran(n,t){n.a=rbn(n.a,1),n.c=e.Math.min(n.c,t),n.b=e.Math.max(n.b,t),n.d=rbn(n.d,t)}function can(n,t){OTn(t,"Edge and layer constraint edge reversal",1),Fzn(LRn(n)),HSn(t)}function aan(n){var t;null==n.d?(++n.e,n.f=0,rfn(null)):(++n.e,t=n.d,n.d=null,n.f=0,rfn(t))}function uan(n){var t;return 0==(t=n.h)?n.l+n.m*IQn:t==PQn?n.l+n.m*IQn-OQn:n}function oan(n){return qD(),n.A.Hc((mdn(),DIt))&&!n.B.Hc((n_n(),UIt))?ndn(n):null}function san(n){if(kW(n),0==n.length)throw Hp(new Mk("Zero length BigInteger"));iKn(this,n)}function han(n){if(!n)throw Hp(new Fy("no calls to next() since the last call to remove()"))}function fan(n){return $Qn<n&&n<OQn?n<0?e.Math.ceil(n):e.Math.floor(n):uan(gNn(n))}function lan(n,t){var e,i,r;for(e=n.c.Ee(),r=t.Kc();r.Ob();)i=r.Pb(),n.a.Od(e,i);return n.b.Kb(e)}function ban(n,t){var e,i,r;if(null!=(e=n.Jg())&&n.Mg())for(i=0,r=e.length;i<r;++i)e[i].ui(t)}function wan(n,t){var e,i;for(i=vW(e=n).e;i;){if((e=i)==t)return!0;i=vW(e).e}return!1}function dan(n,t,e){var i,r;return(i=n.a.f[t.p])<(r=n.a.f[e.p])?-1:i==r?0:1}function gan(n,t,e){var i,r;return r=BB(UK(n.d,t),19),i=BB(UK(n.b,e),19),r&&i?U6(n,r.a,i.a):null}function pan(n,t){var e,i;for(i=new AL(n);i.e!=i.i.gc();)SA(e=BB(kpn(i),33),e.i+t.b,e.j+t.d)}function van(n,t){var e,i;for(i=new Wb(t);i.a<i.c.c.length;)e=BB(n0(i),70),WB(n.d,e),KMn(n,e)}function man(n,t){var e,i;i=new Np,e=t;do{i.c[i.c.length]=e,e=BB(RX(n.k,e),17)}while(e);return i}function yan(n,t){var e;return 0!=(n.Db&t)?-1==(e=Rmn(n,t))?n.Eb:een(n.Eb)[e]:null}function kan(n,t){var e;return(e=new _f).G=t,!n.rb&&(n.rb=new Jz(n,HAt,n)),f9(n.rb,e),e}function jan(n,t){var e;return(e=new Ev).G=t,!n.rb&&(n.rb=new Jz(n,HAt,n)),f9(n.rb,e),e}function Ean(n,t){switch(t){case 1:return!!n.n&&0!=n.n.i;case 2:return null!=n.k}return m0(n,t)}function Tan(n){switch(n.a.g){case 1:return new EI;case 3:return new hyn;default:return new If}}function Man(n){var t;if(n.g>1||n.Ob())return++n.a,n.g=0,t=n.i,n.Ob(),t;throw Hp(new yv)}function San(n){var t;return a$(),uS(syt,n)||((t=new ua).a=n,wR(syt,n,t)),BB(oV(syt,n),635)}function Pan(n){var t,e,i;return e=0,(i=n)<0&&(i+=OQn,e=PQn),t=CJ(i/IQn),M$(CJ(i-t*IQn),t,e)}function Can(n){var t,e,i;for(i=0,e=new QT(n.a);e.a<e.c.a.length;)t=u4(e),n.b.Hc(t)&&++i;return i}function Ian(n){var t,e,i;for(t=1,i=n.Kc();i.Ob();)t=~~(t=31*t+(null==(e=i.Pb())?0:nsn(e)));return t}function Oan(n,t){var e;this.c=n,gmn(n,e=new Np,t,n.b,null,!1,null,!1),this.a=new M2(e,0)}function Aan(n,t){this.b=n,this.e=t,this.d=t.j,this.f=(ZM(),BB(n,66).Oj()),this.k=axn(t.e.Tg(),n)}function $an(n,t,e){this.b=(kW(n),n),this.d=(kW(t),t),this.e=(kW(e),e),this.c=this.d+""+this.e}function Lan(){this.a=BB(mpn((fRn(),qct)),19).a,this.c=Gy(MD(mpn(cat))),this.b=Gy(MD(mpn(tat)))}function Nan(){Nan=O,KCt=lhn((n$n(),Pun(Gk(GCt,1),$Vn,93,0,[ICt,CCt,ACt,DCt,xCt,NCt,$Ct,LCt,OCt])))}function xan(){xan=O,Fit=lhn((tRn(),Pun(Gk(Bit,1),$Vn,250,0,[Rit,$it,Lit,Ait,xit,Dit,Nit,Oit,Iit])))}function Dan(){Dan=O,Rrt=new US("UP",0),Nrt=new US(pJn,1),xrt=new US(cJn,2),Drt=new US(aJn,3)}function Ran(){Ran=O,sZ(),ykt=new $O(X3n,kkt=Rkt),B0(),vkt=new $O(W3n,mkt=Hkt)}function Kan(){Kan=O,jft=new NP("ONE_SIDED",0),Eft=new NP("TWO_SIDED",1),kft=new NP("OFF",2)}function _an(n){n.r=new Rv,n.w=new Rv,n.t=new Np,n.i=new Np,n.d=new Rv,n.a=new bA,n.c=new xp}function Fan(n){this.n=new Np,this.e=new YT,this.j=new YT,this.k=new Np,this.f=new Np,this.p=n}function Ban(n,t){n.c&&(JKn(n,t,!0),JT(new Rq(null,new w1(t,16)),new qd(n))),JKn(n,t,!1)}function Han(n,t,e){return n==(oin(),$mt)?new Pc:0!=H$n(t,1)?new Rj(e.length):new Dj(e.length)}function qan(n,t){var e;return t?((e=t.Ve()).dc()||(n.q?Tcn(n.q,e):n.q=new mO(e)),n):n}function Gan(n,t){var e;return void 0===(e=n.a.get(t))?++n.d:(mR(n.a,t),--n.c,oY(n.b)),e}function zan(n,t){var e;return 0==(e=t.p-n.p)?Pln(n.f.a*n.f.b,t.f.a*t.f.b):e}function Uan(n,t){var e,i;return(e=n.f.c.length)<(i=t.f.c.length)?-1:e==i?0:1}function Xan(n){return 0!=n.b.c.length&&BB(xq(n.b,0),70).a?BB(xq(n.b,0),70).a:eQ(n)}function Wan(n){var t;if(n){if((t=n).dc())throw Hp(new yv);return t.Xb(t.gc()-1)}return u1(n.Kc())}function Van(n){var t;return Vhn(n,0)<0&&(n=uH(n)),64-(0!=(t=dG(kz(n,32)))?ZIn(t):ZIn(dG(n))+32)}function Qan(n){var t;return t=BB(mMn(n,(hWn(),Qft)),61),n.k==(uSn(),Mut)&&(t==(kUn(),CIt)||t==oIt)}function Yan(n,t,e){var i,r;(r=BB(mMn(n,(HXn(),vgt)),74))&&(Wsn(i=new km,0,r),Ztn(i,e),Frn(t,i))}function Jan(n,t,e){var i,r,c,a;i=(a=vW(n)).d,r=a.c,c=n.n,t&&(c.a=c.a-i.b-r.a),e&&(c.b=c.b-i.d-r.b)}function Zan(n,t){var e,i;return(e=n.j)!=(i=t.j)?e.g-i.g:n.p==t.p?0:e==(kUn(),sIt)?n.p-t.p:t.p-n.p}function nun(n){var t,e;for(PUn(n),e=new Wb(n.d);e.a<e.c.c.length;)(t=BB(n0(e),101)).i&&XSn(t)}function tun(n,t,e,i,r){$X(n.c[t.g],e.g,i),$X(n.c[e.g],t.g,i),$X(n.b[t.g],e.g,r),$X(n.b[e.g],t.g,r)}function eun(n,t,e,i){BB(e.b,65),BB(e.b,65),BB(i.b,65),BB(i.b,65),BB(i.b,65),Otn(i.a,new EB(n,t,i))}function iun(n,t){n.d==(Ffn(),_Pt)||n.d==HPt?BB(t.a,57).c.Fc(BB(t.b,57)):BB(t.b,57).c.Fc(BB(t.a,57))}function run(n,t,e,i){return 1==e?(!n.n&&(n.n=new eU(zOt,n,1,7)),_pn(n.n,t,i)):eSn(n,t,e,i)}function cun(n,t){var e;return Nrn(e=new Ho,t),f9((!n.A&&(n.A=new NL(O$t,n,7)),n.A),e),e}function aun(n,t,e){var i,r;return r=N2(t,A6n),pjn((i=new aI(n,e)).a,i.b,r),r}function uun(n){var t;return(!n.a||0==(1&n.Bb)&&n.a.kh())&&cL(t=Ikn(n),148)&&(n.a=BB(t,148)),n.a}function oun(n,t){var e,i;for(kW(t),i=t.Kc();i.Ob();)if(e=i.Pb(),!n.Hc(e))return!1;return!0}function sun(n,t){var e,i,r;return e=n.l+t.l,i=n.m+t.m+(e>>22),r=n.h+t.h+(i>>22),M$(e&SQn,i&SQn,r&PQn)}function hun(n,t){var e,i,r;return e=n.l-t.l,i=n.m-t.m+(e>>22),r=n.h-t.h+(i>>22),M$(e&SQn,i&SQn,r&PQn)}function fun(n){var t;return n<128?(!(t=(Mq(),Mtt)[n])&&(t=Mtt[n]=new Lb(n)),t):new Lb(n)}function lun(n){var t;return cL(n,78)?n:((t=n&&n.__java$exception)||ov(t=new jhn(n)),t)}function bun(n){if(cL(n,186))return BB(n,118);if(n)return null;throw Hp(new Hy(e8n))}function wun(n,t){if(null==t)return!1;for(;n.a!=n.b;)if(Nfn(t,_hn(n)))return!0;return!1}function dun(n){return!!n.a.Ob()||n.a==n.d&&(n.a=new S2(n.e.f),n.a.Ob())}function gun(n,t){var e;return 0!=(e=t.Pc()).length&&(tH(n.c,n.c.length,e),!0)}function pun(n,t,e){var i,r;for(r=t.vc().Kc();r.Ob();)i=BB(r.Pb(),42),n.yc(i.cd(),i.dd(),e);return n}function vun(n,t){var e;for(e=new Wb(n.b);e.a<e.c.c.length;)hon(BB(n0(e),70),(hWn(),ult),t)}function mun(n,t,e){var i,r;for(r=new Wb(n.b);r.a<r.c.c.length;)SA(i=BB(n0(r),33),i.i+t,i.j+e)}function yun(n,t){if(!n)throw Hp(new _y($Rn("value already present: %s",Pun(Gk(Ant,1),HWn,1,5,[t]))))}function kun(n,t){return!(!n||!t||n==t)&&_dn(n.d.c,t.d.c+t.d.b)&&_dn(t.d.c,n.d.c+n.d.b)}function jun(){return k5(),Qet?new y5(null):FOn(Vcn(),"com.google.common.base.Strings")}function Eun(n,t){var e;return e=sx(t.a.gc()),JT(ytn(new Rq(null,new w1(t,1)),n.i),new NC(n,e)),e}function Tun(n){var t;return Nrn(t=new Ho,"T"),f9((!n.d&&(n.d=new NL(O$t,n,11)),n.d),t),t}function Mun(n){var t,e,i,r;for(t=1,e=0,r=n.gc();e<r;++e)t=31*t+(null==(i=n.ki(e))?0:nsn(i));return t}function Sun(n,t,e,i){var r;return w2(t,n.e.Hd().gc()),w2(e,n.c.Hd().gc()),r=n.a[t][e],$X(n.a[t],e,i),r}function Pun(n,t,e,i,r){return r.gm=n,r.hm=t,r.im=I,r.__elementTypeId$=e,r.__elementTypeCategory$=i,r}function Cun(n,t,i,r,c){return jDn(),e.Math.min(zGn(n,t,i,r,c),zGn(i,r,n,t,qx(new xC(c.a,c.b))))}function Iun(){Iun=O,ast=new tP(QZn,0),rst=new tP(C1n,1),cst=new tP(I1n,2),ist=new tP("BOTH",3)}function Oun(){Oun=O,vst=new mP(eJn,0),mst=new mP(cJn,1),yst=new mP(aJn,2),kst=new mP("TOP",3)}function Aun(){Aun=O,Zat=new QS("Q1",0),eut=new QS("Q4",1),nut=new QS("Q2",2),tut=new QS("Q3",3)}function $un(){$un=O,bmt=new QP("OFF",0),wmt=new QP("SINGLE_EDGE",1),lmt=new QP("MULTI_EDGE",2)}function Lun(){Lun=O,WTt=new SC("MINIMUM_SPANNING_TREE",0),XTt=new SC("MAXIMUM_SPANNING_TREE",1)}function Nun(){Nun=O,new up("org.eclipse.elk.addLayoutConfig"),ZTt=new ou,JTt=new au,new uu}function xun(n){var t,e;for(t=new YT,e=spn(n.d,0);e.b!=e.d.c;)DH(t,BB(b3(e),188).c);return t}function Dun(n){var t,e;for(e=new Np,t=n.Kc();t.Ob();)gun(e,wDn(BB(t.Pb(),33)));return e}function Run(n){var t;tBn(n,!0),t=VVn,Lx(n,(HXn(),fpt))&&(t+=BB(mMn(n,fpt),19).a),hon(n,fpt,iln(t))}function Kun(n,t,e){var i;$U(n.a),Otn(e.i,new jg(n)),kgn(n,i=new C$(BB(RX(n.a,t.b),65)),t),e.f=i}function _un(n,t){var e,i;return e=n.c,(i=t.e[n.p])<e.a.c.length-1?BB(xq(e.a,i+1),10):null}function Fun(n,t){var e,i;for(WQ(t,"predicate"),i=0;n.Ob();i++)if(e=n.Pb(),t.Lb(e))return i;return-1}function Bun(n,t){var e,i;if(i=0,n<64&&n<=t)for(t=t<64?t:63,e=n;e<=t;e++)i=i0(i,yz(1,e));return i}function Hun(n){var t,e,i;for(SQ(),i=0,e=n.Kc();e.Ob();)i+=null!=(t=e.Pb())?nsn(t):0,i|=0;return i}function qun(n){var t;return tE(),t=new co,n&&f9((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),t),t}function Gun(n){var t;return(t=new p).a=n,t.b=yon(n),t.c=x8(Qtt,sVn,2,2,6,1),t.c[0]=Hrn(n),t.c[1]=Hrn(n),t}function zun(n,t){if(0===t)return!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),void n.o.c.$b();mPn(n,t)}function Uun(n,t,e){switch(e.g){case 2:n.b=t;break;case 1:n.c=t;break;case 4:n.d=t;break;case 3:n.a=t}}function Xun(n){switch(n.g){case 1:return ECt;case 2:return jCt;case 3:return TCt;default:return MCt}}function Wun(n){switch(BB(mMn(n,(HXn(),kgt)),163).g){case 2:case 4:return!0;default:return!1}}function Vun(){Vun=O,yft=lhn((bDn(),Pun(Gk(Tft,1),$Vn,256,0,[hft,lft,bft,wft,dft,gft,vft,sft,fft,pft])))}function Qun(){Qun=O,JIt=lhn((n_n(),Pun(Gk(iOt,1),$Vn,259,0,[GIt,UIt,qIt,XIt,WIt,QIt,VIt,zIt,HIt])))}function Yun(){Yun=O,Xkt=dq(ogn(ogn(FM(dq(new B2,(zyn(),Kyt),(DPn(),Qyt)),_yt),Xyt),Wyt),Fyt,Vyt)}function Jun(){Jun=O,Aht=new CP(QZn,0),Oht=new CP("INCOMING_ONLY",1),$ht=new CP("OUTGOING_ONLY",2)}function Zun(){Zun=O,ftt={boolean:UT,number:Cy,string:Iy,object:TCn,function:TCn,undefined:Wp}}function non(n,t){vH(n>=0,"Negative initial capacity"),vH(t>=0,"Non-positive load factor"),$U(this)}function ton(n,t,e){return!(n>=128)&&JI(n<64?e0(yz(1,n),e):e0(yz(1,n-64),t),0)}function eon(n,t){return!(!n||!t||n==t)&&Ibn(n.b.c,t.b.c+t.b.b)<0&&Ibn(t.b.c,n.b.c+n.b.b)<0}function ion(n){var t,e,i;return e=n.n,i=n.o,t=n.d,new UV(e.a-t.b,e.b-t.d,i.a+(t.b+t.c),i.b+(t.d+t.a))}function ron(n){var t,e,i,r;for(i=0,r=(e=n.a).length;i<r;++i)Son(n,t=e[i],(kUn(),SIt)),Son(n,t,sIt)}function con(n){var t,e;for(null==n.j&&(n.j=(PY(),Ijn(ett.ce(n)))),t=0,e=n.j.length;t<e;++t);}function aon(n){var t,e;return M$(t=1+~n.l&SQn,e=~n.m+(0==t?1:0)&SQn,~n.h+(0==t&&0==e?1:0)&PQn)}function uon(n,t){return TFn(BB(BB(RX(n.g,t.a),46).a,65),BB(BB(RX(n.g,t.b),46).a,65))}function oon(n,t,e){var i;if(t>(i=n.gc()))throw Hp(new tK(t,i));return n.hi()&&(e=nZ(n,e)),n.Vh(t,e)}function son(n,t,e){return null==e?(!n.q&&(n.q=new xp),v6(n.q,t)):(!n.q&&(n.q=new xp),VW(n.q,t,e)),n}function hon(n,t,e){return null==e?(!n.q&&(n.q=new xp),v6(n.q,t)):(!n.q&&(n.q=new xp),VW(n.q,t,e)),n}function fon(n){var t,e;return qan(e=new y6,n),hon(e,(Mrn(),sat),n),eBn(n,e,t=new xp),Szn(n,e,t),e}function lon(n){var t,e,i;for(jDn(),e=x8(PMt,sVn,8,2,0,1),i=0,t=0;t<2;t++)i+=.5,e[t]=lmn(i,n);return e}function bon(n,t){var e,i,r;for(e=!1,i=n.a[t].length,r=0;r<i-1;r++)e|=Pdn(n,t,r,r+1);return e}function won(n,t,e,i,r){var c,a;for(a=e;a<=r;a++)for(c=t;c<=i;c++)vmn(n,c,a)||FRn(n,c,a,!0,!1)}function don(n,t){this.b=n,NO.call(this,(BB(Wtn(QQ((QX(),t$t).o),10),18),t.i),t.g),this.a=(wcn(),I$t)}function gon(n,t){this.c=n,this.d=t,this.b=this.d/this.c.c.Hd().gc()|0,this.a=this.d%this.c.c.Hd().gc()}function pon(){this.o=null,this.k=null,this.j=null,this.d=null,this.b=null,this.n=null,this.a=null}function von(n,t,i){this.q=new e.Date,this.q.setFullYear(n+sQn,t,i),this.q.setHours(0,0,0,0),lBn(this,0)}function mon(){mon=O,Nvt=new qP(QZn,0),Lvt=new qP("NODES_AND_EDGES",1),xvt=new qP("PREFER_EDGES",2)}function yon(n){var t;return 0==n?"Etc/GMT":(n<0?(n=-n,t="Etc/GMT-"):t="Etc/GMT+",t+bnn(n))}function kon(n){var t;if(n<0)return _Vn;if(0==n)return 0;for(t=OVn;0==(t&n);t>>=1);return t}function jon(n){var t,e;return 32==(e=ZIn(n.h))?32==(t=ZIn(n.m))?ZIn(n.l)+32:t+20-10:e-12}function Eon(n){var t;return null==(t=n.a[n.b])?null:($X(n.a,n.b,null),n.b=n.b+1&n.a.length-1,t)}function Ton(n){var t,e;return t=n.t-n.k[n.o.p]*n.d+n.j[n.o.p]>n.f,e=n.u+n.e[n.o.p]*n.d>n.f*n.s*n.d,t||e}function Mon(n,t,e){var i,r;return i=new H8(t,e),r=new q,n.b=Wxn(n,n.b,i,r),r.b||++n.c,n.b.b=!1,r.d}function Son(n,t,e){var i,r,c;for(c=0,r=Lfn(t,e).Kc();r.Ob();)i=BB(r.Pb(),11),VW(n.c,i,iln(c++))}function Pon(n){var t,e;for(e=new Wb(n.a.b);e.a<e.c.c.length;)(t=BB(n0(e),81)).g.c=-t.g.c-t.g.b;kNn(n)}function Con(n){var t,e;for(e=new Wb(n.a.b);e.a<e.c.c.length;)(t=BB(n0(e),57)).d.c=-t.d.c-t.d.b;yNn(n)}function Ion(n){var t;return(!n.c||0==(1&n.Bb)&&0!=(64&n.c.Db))&&cL(t=Ikn(n),88)&&(n.c=BB(t,26)),n.c}function Oon(n){var t,e,i;t=1+~n.l&SQn,e=~n.m+(0==t?1:0)&SQn,i=~n.h+(0==t&&0==e?1:0)&PQn,n.l=t,n.m=e,n.h=i}function Aon(n){var t,e,i,r,c;for(t=new Gj,r=0,c=(i=n).length;r<c;++r)e=i[r],t.a+=e.a,t.b+=e.b;return t}function $on(n,t){var e,i,r,c,a;for(SQ(),a=!1,r=0,c=(i=t).length;r<c;++r)e=i[r],a|=n.Fc(e);return a}function Lon(n){var t,e;for(jDn(),e=-17976931348623157e292,t=0;t<n.length;t++)n[t]>e&&(e=n[t]);return e}function Non(n,t,e){var i;return jxn(n,t,i=new Np,(kUn(),oIt),!0,!1),jxn(n,e,i,CIt,!1,!1),i}function xon(n,t,e){var i,r;return r=N2(t,"labels"),XAn((i=new gI(n,e)).a,i.b,r),r}function Don(n,t,e,i){var r;return(r=m$n(n,t,e,i))||!(r=aln(n,e,i))||Fqn(n,t,r)?r:null}function Ron(n,t,e,i){var r;return(r=y$n(n,t,e,i))||!(r=uln(n,e,i))||Fqn(n,t,r)?r:null}function Kon(n,t){var e;for(e=0;e<n.a.a.length;e++)if(!BB(Dq(n.a,e),169).Lb(t))return!1;return!0}function _on(n,t,e){if(yX(t),e.Ob())for(sO(t,CX(e.Pb()));e.Ob();)sO(t,n.a),sO(t,CX(e.Pb()));return t}function Fon(n){var t,e,i;for(SQ(),i=1,e=n.Kc();e.Ob();)i=31*i+(null!=(t=e.Pb())?nsn(t):0),i|=0;return i}function Bon(n,t,e,i,r){var c;return c=jAn(n,t),e&&Oon(c),r&&(n=Smn(n,t),ltt=i?aon(n):M$(n.l,n.m,n.h)),c}function Hon(n,t){var e;try{t.Vd()}catch(i){if(!cL(i=lun(i),78))throw Hp(i);e=i,n.c[n.c.length]=e}}function qon(n,t,e){var i,r;return cL(t,144)&&e?(i=BB(t,144),r=e,n.a[i.b][r.b]+n.a[r.b][i.b]):0}function Gon(n,t){switch(t){case 7:return!!n.e&&0!=n.e.i;case 8:return!!n.d&&0!=n.d.i}return fwn(n,t)}function zon(n,t){switch(t.g){case 0:cL(n.b,631)||(n.b=new Lan);break;case 1:cL(n.b,632)||(n.b=new fH)}}function Uon(n,t){for(;null!=n.g||n.c?null==n.g||0!=n.i&&BB(n.g[n.i-1],47).Ob():tZ(n);)vI(t,aLn(n))}function Xon(n,t,e){n.g=APn(n,t,(kUn(),oIt),n.b),n.d=APn(n,e,oIt,n.b),0!=n.g.c&&0!=n.d.c&&zMn(n)}function Won(n,t,e){n.g=APn(n,t,(kUn(),CIt),n.j),n.d=APn(n,e,CIt,n.j),0!=n.g.c&&0!=n.d.c&&zMn(n)}function Von(n,t,e){return!jE(AV(new Rq(null,new w1(n.c,16)),new aw(new ZC(t,e)))).sd((dM(),tit))}function Qon(n){var t;return EW(n),t=new sn,n.a.sd(t)?(CL(),new vy(kW(t.a))):(CL(),CL(),Set)}function Yon(n){var t;return!(n.b<=0)&&((t=GO("MLydhHmsSDkK",YTn(fV(n.c,0))))>1||t>=0&&n.b<3)}function Jon(n){var t,e;for(t=new km,e=spn(n,0);e.b!=e.d.c;)Kx(t,0,new wA(BB(b3(e),8)));return t}function Zon(n){var t;for(t=new Wb(n.a.b);t.a<t.c.c.length;)BB(n0(t),81).f.$b();ky(n.b,n),BNn(n)}function nsn(n){return XI(n)?vvn(n):UI(n)?VO(n):zI(n)?(kW(n),n?1231:1237):iz(n)?n.Hb():AG(n)?PN(n):tY(n)}function tsn(n){return XI(n)?Qtt:UI(n)?Ptt:zI(n)?ktt:iz(n)||AG(n)?n.gm:n.gm||Array.isArray(n)&&Gk(ntt,1)||ntt}function esn(n){if(0===n.g)return new cu;throw Hp(new _y(N4n+(null!=n.f?n.f:""+n.g)))}function isn(n){if(0===n.g)return new iu;throw Hp(new _y(N4n+(null!=n.f?n.f:""+n.g)))}function rsn(n,t,e){if(0===t)return!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),void tan(n.o,e);yCn(n,t,e)}function csn(n,t,e){this.g=n,this.e=new Gj,this.f=new Gj,this.d=new YT,this.b=new YT,this.a=t,this.c=e}function asn(n,t,e,i){this.b=new Np,this.n=new Np,this.i=i,this.j=e,this.s=n,this.t=t,this.r=0,this.d=0}function usn(n){this.e=n,this.d=new p4(this.e.g),this.a=this.d,this.b=dun(this),this.$modCount=n.$modCount}function osn(n){for(;!n.d||!n.d.Ob();){if(!n.b||Wy(n.b))return null;n.d=BB(dU(n.b),47)}return n.d}function ssn(n){return WB(n.c,(Nun(),ZTt)),uen(n.a,Gy(MD(mpn((Rwn(),Vpt)))))?new qu:new Cg(n)}function hsn(n){switch(n.g){case 1:return F3n;default:case 2:return 0;case 3:return JJn;case 4:return B3n}}function fsn(){var n;return wWn(),PNt||(n=ex(ZUn("M",!0)),n=gG(ZUn("M",!1),n),PNt=n)}function lsn(n,t){var e,i,r;for(r=n.b;r;){if(0==(e=n.a.ue(t,r.d)))return r;i=e<0?0:1,r=r.a[i]}return null}function bsn(n,t,e){var i,r;hN(),i=!!TO(e),(r=BB(t.xc(i),15))||(r=new Np,t.zc(i,r)),r.Fc(e)}function wsn(n,t){var e,i;return(e=BB(ZAn(n,(W$n(),dEt)),19).a)==(i=BB(ZAn(t,dEt),19).a)||e<i?-1:e>i?1:0}function dsn(n,t){return!!bNn(n,t)&&(JIn(n.b,BB(mMn(t,(hWn(),Xft)),21),t),DH(n.a,t),!0)}function gsn(n){var t,e;(t=BB(mMn(n,(hWn(),Elt)),10))&&(y7((e=t.c).a,t),0==e.a.c.length&&y7(vW(t).b,e))}function psn(n){return Qet?x8(Get,dYn,572,0,0,1):BB(Qgn(n.a,x8(Get,dYn,572,n.a.c.length,0,1)),842)}function vsn(n,t,e,i){return nV(),new hy(Pun(Gk(Hnt,1),kVn,42,0,[(zvn(n,t),new vT(n,t)),(zvn(e,i),new vT(e,i))]))}function msn(n,t,e){var i;return fin(i=new $m,t,e),f9((!n.q&&(n.q=new eU(QAt,n,11,10)),n.q),i),i}function ysn(n){var t,e,i,r;for(e=(r=fS(AOt,n)).length,i=x8(Qtt,sVn,2,e,6,1),t=0;t<e;++t)i[t]=r[t];return i}function ksn(n,t){var e,i,r,c,a;for(r=0,c=(i=t).length;r<c;++r)e=i[r],a=new UX(n),e.Qe(a),NBn(a);$U(n.f)}function jsn(n,t){var e;return t===n||!!cL(t,224)&&(e=BB(t,224),Nfn(n.Zb(),e.Zb()))}function Esn(n,t){var e;2*t+1>=n.b.c.length||(Esn(n,2*t+1),(e=2*t+2)<n.b.c.length&&Esn(n,e),KCn(n,t))}function Tsn(n,t,e){var i,r;this.g=n,this.c=t,this.a=this,this.d=this,r=Jin(e),i=x8(Qnt,CVn,330,r,0,1),this.b=i}function Msn(n,t,e){var i;for(i=e-1;i>=0&&n[i]===t[i];i--);return i<0?0:sS(e0(n[i],UQn),e0(t[i],UQn))?-1:1}function Ssn(n,t){var e,i;for(i=spn(n,0);i.b!=i.d.c;)(e=BB(b3(i),214)).e.length>0&&(t.td(e),e.i&&pln(e))}function Psn(n,t){var e,i;return i=BB(yan(n.a,4),126),e=x8(dAt,i9n,415,t,0,1),null!=i&&aHn(i,0,e,0,i.length),e}function Csn(n,t){var e;return e=new rRn(0!=(256&n.f),n.i,n.a,n.d,0!=(16&n.f),n.j,n.g,t),null!=n.e||(e.c=n),e}function Isn(n,t){var e;for(e=n.Zb().Cc().Kc();e.Ob();)if(BB(e.Pb(),14).Hc(t))return!0;return!1}function Osn(n,t,e,i,r){var c,a;for(a=e;a<=r;a++)for(c=t;c<=i;c++)if(vmn(n,c,a))return!0;return!1}function Asn(n,t,e){var i,r,c,a;for(kW(e),a=!1,c=n.Zc(t),r=e.Kc();r.Ob();)i=r.Pb(),c.Rb(i),a=!0;return a}function $sn(n,t){var e;return n===t||!!cL(t,83)&&(e=BB(t,83),zSn(lz(n),e.vc()))}function Lsn(n,t,e){var i,r;for(r=e.Kc();r.Ob();)if(i=BB(r.Pb(),42),n.re(t,i.dd()))return!0;return!1}function Nsn(n,t,e){return n.d[t.p][e.p]||(ivn(n,t,e),n.d[t.p][e.p]=!0,n.d[e.p][t.p]=!0),n.a[t.p][e.p]}function xsn(n,t){if(!n.ai()&&null==t)throw Hp(new _y("The 'no null' constraint is violated"));return t}function Dsn(n,t){null==n.D&&null!=n.B&&(n.D=n.B,n.B=null),Hin(n,null==t?null:(kW(t),t)),n.C&&n.yk(null)}function Rsn(n,t){return!(!n||n==t||!Lx(t,(hWn(),rlt)))&&BB(mMn(t,(hWn(),rlt)),10)!=n}function Ksn(n){switch(n.i){case 2:return!0;case 1:return!1;case-1:++n.c;default:return n.pl()}}function _sn(n){switch(n.i){case-2:return!0;case-1:return!1;case 1:--n.c;default:return n.ql()}}function Fsn(n){_J.call(this,"The given string does not match the expected format for individual spacings.",n)}function Bsn(){Bsn=O,uOt=new cI("ELK",0),oOt=new cI("JSON",1),aOt=new cI("DOT",2),sOt=new cI("SVG",3)}function Hsn(){Hsn=O,sjt=new vC(QZn,0),hjt=new vC("RADIAL_COMPACTION",1),fjt=new vC("WEDGE_COMPACTION",2)}function qsn(){qsn=O,zet=new pS("CONCURRENT",0),Uet=new pS("IDENTITY_FINISH",1),Xet=new pS("UNORDERED",2)}function Gsn(){Gsn=O,wM(),oct=new $O(BJn,sct=rct),uct=new up(HJn),hct=new up(qJn),fct=new up(GJn)}function zsn(){zsn=O,lst=new ji,bst=new Ei,fst=new Ti,hst=new Mi,kW(new Si),sst=new D}function Usn(){Usn=O,emt=new WP("CONSERVATIVE",0),imt=new WP("CONSERVATIVE_SOFT",1),rmt=new WP("SLOPPY",2)}function Xsn(){Xsn=O,dCt=new WA(15),wCt=new XA((sWn(),XSt),dCt),gCt=gPt,hCt=aSt,fCt=KSt,bCt=BSt,lCt=FSt}function Wsn(n,t,e){var i,r;for(i=new YT,r=spn(e,0);r.b!=r.d.c;)DH(i,new wA(BB(b3(r),8)));Asn(n,t,i)}function Vsn(n){var t,e,i;for(t=0,i=x8(PMt,sVn,8,n.b,0,1),e=spn(n,0);e.b!=e.d.c;)i[t++]=BB(b3(e),8);return i}function Qsn(n){var t;return!n.a&&(n.a=new eU(WAt,n,9,5)),0!=(t=n.a).i?HM(BB(Wtn(t,0),678)):null}function Ysn(n,t){var e;return e=rbn(n,t),sS(r0(n,t),0)|YI(r0(n,e),0)?e:rbn(bVn,r0(jz(e,63),1))}function Jsn(n,t){var e;e=null!=mpn((Rwn(),Vpt))&&null!=t.wg()?Gy(MD(t.wg()))/Gy(MD(mpn(Vpt))):1,VW(n.b,t,e)}function Zsn(n,t){var e,i;return(e=BB(n.d.Bc(t),14))?((i=n.e.hc()).Gc(e),n.e.d-=e.gc(),e.$b(),i):null}function nhn(n,t){var e,i;if(0!=(i=n.c[t]))for(n.c[t]=0,n.d-=i,e=t+1;e<n.a.length;)n.a[e]-=i,e+=e&-e}function thn(n){var t;if((t=n.a.c.length)>0)return Kz(t-1,n.a.c.length),s6(n.a,t-1);throw Hp(new mv)}function ehn(n,t,e){if(t<0)throw Hp(new Ay(n5n+t));t<n.j.c.length?c5(n.j,t,e):(g3(n,t),WB(n.j,e))}function ihn(n,t,e){if(n>t)throw Hp(new _y(mYn+n+yYn+t));if(n<0||t>e)throw Hp(new Tk(mYn+n+kYn+t+hYn+e))}function rhn(n){if(!n.a||0==(8&n.a.i))throw Hp(new Fy("Enumeration class expected for layout option "+n.f))}function chn(n){var t;++n.j,0==n.i?n.g=null:n.i<n.g.length&&(t=n.g,n.g=n.ri(n.i),aHn(t,0,n.g,0,n.i))}function ahn(n,t){var e,i;for(e=n.a.length-1,n.c=n.c-1&e;t!=n.c;)i=t+1&e,$X(n.a,t,n.a[i]),t=i;$X(n.a,n.c,null)}function uhn(n,t){var e,i;for(e=n.a.length-1;t!=n.b;)i=t-1&e,$X(n.a,t,n.a[i]),t=i;$X(n.a,n.b,null),n.b=n.b+1&e}function ohn(n,t,e){var i;return LZ(t,n.c.length),0!=(i=e.Pc()).length&&(tH(n.c,t,i),!0)}function shn(n){var t,e;if(null==n)return null;for(t=0,e=n.length;t<e;t++)if(!PH(n[t]))return n[t];return null}function hhn(n,t,e){var i,r,c,a;for(c=0,a=(r=e).length;c<a;++c)if(i=r[c],n.b.re(t,i.cd()))return i;return null}function fhn(n){var t,e,i,r,c;for(c=1,i=0,r=(e=n).length;i<r;++i)c=31*c+(null!=(t=e[i])?nsn(t):0),c|=0;return c}function lhn(n){var t,e,i,r,c;for(t={},r=0,c=(i=n).length;r<c;++r)t[":"+(null!=(e=i[r]).f?e.f:""+e.g)]=e;return t}function bhn(n){var t;for(yX(n),C_(!0,"numberToAdvance must be nonnegative"),t=0;t<0&&dAn(n);t++)U5(n);return t}function whn(n){var t,e,i;for(i=0,e=new oz(ZL(n.a.Kc(),new h));dAn(e);)(t=BB(U5(e),17)).c.i==t.d.i||++i;return i}function dhn(n,t){var e,i,r;for(e=n,r=0;;){if(e==t)return r;if(!(i=e.e))throw Hp(new wv);e=vW(i),++r}}function ghn(n,t){var e,i,r;for(r=t-n.f,i=new Wb(n.d);i.a<i.c.c.length;)kdn(e=BB(n0(i),443),e.e,e.f+r);n.f=t}function phn(n,t,i){return e.Math.abs(t-n)<_3n||e.Math.abs(i-n)<_3n||(t-n>_3n?n-i>_3n:i-n>_3n)}function vhn(n,t){return n?t&&!n.j||cL(n,124)&&0==BB(n,124).a.b?0:n.Re():0}function mhn(n,t){return n?t&&!n.k||cL(n,124)&&0==BB(n,124).a.a?0:n.Se():0}function yhn(n){return ODn(),n<0?-1!=n?new Rpn(-1,-n):Ytt:n<=10?Ztt[CJ(n)]:new Rpn(1,n)}function khn(n){throw Zun(),Hp(new gy("Unexpected typeof result '"+n+"'; please report this bug to the GWT team"))}function jhn(n){hk(),V$(this),jQ(this),this.e=n,Cxn(this,n),this.g=null==n?zWn:Bbn(n),this.a="",this.b=n,this.a=""}function Ehn(){this.a=new nu,this.f=new dg(this),this.b=new gg(this),this.i=new pg(this),this.e=new vg(this)}function Thn(){cy.call(this,new q8(etn(16))),lin(2,oVn),this.b=2,this.a=new HW(null,null,0,null),iv(this.a,this.a)}function Mhn(){Mhn=O,cvt=new KP("DUMMY_NODE_OVER",0),avt=new KP("DUMMY_NODE_UNDER",1),uvt=new KP("EQUAL",2)}function Shn(){Shn=O,Xat=HJ(Pun(Gk(WPt,1),$Vn,103,0,[(Ffn(),_Pt),FPt])),Wat=HJ(Pun(Gk(WPt,1),$Vn,103,0,[HPt,KPt]))}function Phn(n){return(kUn(),yIt).Hc(n.j)?Gy(MD(mMn(n,(hWn(),Llt)))):Aon(Pun(Gk(PMt,1),sVn,8,0,[n.i.n,n.n,n.a])).b}function Chn(n){var t,e;for(t=n.b.a.a.ec().Kc();t.Ob();)e=new Q$n(BB(t.Pb(),561),n.e,n.f),WB(n.g,e)}function Ihn(n,t){var e,i;e=n.nk(t,null),i=null,t&&(iE(),cen(i=new Kp,n.r)),(e=HTn(n,i,e))&&e.Fi()}function Ohn(n,t){var e,i;for(i=0!=H$n(n.d,1),e=!0;e;)e=!1,e=t.c.Tf(t.e,i),e|=DNn(n,t,i,!1),i=!i;$rn(n)}function Ahn(n,t){var e,i,r;return i=!1,e=t.q.d,t.d<n.b&&(r=dNn(t.q,n.b),t.q.d>r&&(aEn(t.q,r),i=e!=t.q.d)),i}function $hn(n,t){var i,r,c,a,u;return a=t.i,u=t.j,r=a-(i=n.f).i,c=u-i.j,e.Math.sqrt(r*r+c*c)}function Lhn(n,t){var e;return(e=Ydn(n))||(!$Ot&&($Ot=new Oo),RHn(),f9((e=new Cp(YPn(t))).Vk(),n)),e}function Nhn(n,t){var e,i;return(e=BB(n.c.Bc(t),14))?((i=n.hc()).Gc(e),n.d-=e.gc(),e.$b(),n.mc(i)):n.jc()}function xhn(n,t){var e;for(e=0;e<t.length;e++)if(n==(b1(e,t.length),t.charCodeAt(e)))return!0;return!1}function Dhn(n,t){var e;for(e=0;e<t.length;e++)if(n==(b1(e,t.length),t.charCodeAt(e)))return!0;return!1}function Rhn(n){var t,e;if(null==n)return!1;for(t=0,e=n.length;t<e;t++)if(!PH(n[t]))return!1;return!0}function Khn(n){var t;if(0!=n.c)return n.c;for(t=0;t<n.a.length;t++)n.c=33*n.c+(-1&n.a[t]);return n.c=n.c*n.e,n.c}function _hn(n){var t;return Px(n.a!=n.b),t=n.d.a[n.a],Ex(n.b==n.d.c&&null!=t),n.c=n.a,n.a=n.a+1&n.d.a.length-1,t}function Fhn(n){var t;if(!(n.c.c<0?n.a>=n.c.b:n.a<=n.c.b))throw Hp(new yv);return t=n.a,n.a+=n.c.c,++n.b,iln(t)}function Bhn(n){var t;return t=new ftn(n),i2(n.a,sut,new Jy(Pun(Gk(Jat,1),HWn,369,0,[t]))),t.d&&WB(t.f,t.d),t.f}function Hhn(n){var t;return qan(t=new O$(n.a),n),hon(t,(hWn(),dlt),n),t.o.a=n.g,t.o.b=n.f,t.n.a=n.i,t.n.b=n.j,t}function qhn(n,t,e,i){var r,c;for(c=n.Kc();c.Ob();)(r=BB(c.Pb(),70)).n.a=t.a+(i.a-r.o.a)/2,r.n.b=t.b,t.b+=r.o.b+e}function Ghn(n,t,e){var i;for(i=t.a.a.ec().Kc();i.Ob();)if(cY(n,BB(i.Pb(),57),e))return!0;return!1}function zhn(n){var t,e;for(e=new Wb(n.r);e.a<e.c.c.length;)if(t=BB(n0(e),10),n.n[t.p]<=0)return t;return null}function Uhn(n){var t,e;for(e=new Rv,t=new Wb(n);t.a<t.c.c.length;)Frn(e,dDn(BB(n0(t),33)));return e}function Xhn(n){var t;return t=kA(Cmt),BB(mMn(n,(hWn(),Zft)),21).Hc((bDn(),dft))&&dq(t,(yMn(),_at),(lWn(),Bot)),t}function Whn(n,t,e){var i;i=new MOn(n,t),JIn(n.r,t.Hf(),i),e&&!Hz(n.u)&&(i.c=new yJ(n.d),Otn(t.wf(),new Cw(i)))}function Vhn(n,t){var e;return JO(n)&&JO(t)&&(e=n-t,!isNaN(e))?e:Kkn(JO(n)?Pan(n):n,JO(t)?Pan(t):t)}function Qhn(n,t){return t<n.length&&(b1(t,n.length),63!=n.charCodeAt(t))&&(b1(t,n.length),35!=n.charCodeAt(t))}function Yhn(n,t,e,i){var r,c;n.a=t,c=i?0:1,n.f=(r=new ZSn(n.c,n.a,e,c),new uRn(e,n.a,r,n.e,n.b,n.c==(oin(),Amt)))}function Jhn(n,t,e){var i,r;return r=n.a,n.a=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,1,r,t),e?e.Ei(i):e=i),e}function Zhn(n,t,e){var i,r;return r=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,3,r,t),e?e.Ei(i):e=i),e}function nfn(n,t,e){var i,r;return r=n.f,n.f=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,0,r,t),e?e.Ei(i):e=i),e}function tfn(n,t){var e,i,r,c;return(c=kCn((i=t,(r=n?Ydn(n):null)&&r.Xk(),i)))==t&&(e=Ydn(n))&&e.Xk(),c}function efn(n,t){var e,i,r;for(r=1,e=n,i=t>=0?t:-t;i>0;)i%2==0?(e*=e,i=i/2|0):(r*=e,i-=1);return t<0?1/r:r}function ifn(n,t){var e,i,r;for(r=1,e=n,i=t>=0?t:-t;i>0;)i%2==0?(e*=e,i=i/2|0):(r*=e,i-=1);return t<0?1/r:r}function rfn(n){var t,e,i,r;if(null!=n)for(e=0;e<n.length;++e)if(t=n[e])for(BB(t.g,367),r=t.i,i=0;i<r;++i);}function cfn(n){var t,i,r;for(r=0,i=new Wb(n.a);i.a<i.c.c.length;)t=BB(n0(i),187),r=e.Math.max(r,t.g);return r}function afn(n){var t,e,i;for(i=new Wb(n.b);i.a<i.c.c.length;)(t=(e=BB(n0(i),214)).c.Rf()?e.f:e.a)&&wqn(t,e.j)}function ufn(){ufn=O,vCt=new HC("INHERIT",0),pCt=new HC("INCLUDE_CHILDREN",1),mCt=new HC("SEPARATE_CHILDREN",2)}function ofn(n,t){switch(t){case 1:return!n.n&&(n.n=new eU(zOt,n,1,7)),void sqn(n.n);case 2:return void $in(n,null)}zun(n,t)}function sfn(n){switch(n.gc()){case 0:return Fnt;case 1:return new Pq(yX(n.Xb(0)));default:return new SY(n)}}function hfn(n){switch(s_(),n.gc()){case 0:return VX(),Vnt;case 1:return new yk(n.Kc().Pb());default:return new vS(n)}}function ffn(n){switch(s_(),n.c){case 0:return VX(),Vnt;case 1:return new yk(JCn(new QT(n)));default:return new sy(n)}}function lfn(n,t){yX(n);try{return n.xc(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return null;throw Hp(e)}}function bfn(n,t){yX(n);try{return n.Bc(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return null;throw Hp(e)}}function wfn(n,t){yX(n);try{return n.Hc(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return!1;throw Hp(e)}}function dfn(n,t){yX(n);try{return n.Mc(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return!1;throw Hp(e)}}function gfn(n,t){yX(n);try{return n._b(t)}catch(e){if(cL(e=lun(e),205)||cL(e,173))return!1;throw Hp(e)}}function pfn(n,t){n.a.c.length>0&&dsn(BB(xq(n.a,n.a.c.length-1),570),t)||WB(n.a,new p5(t))}function vfn(n){var t,e;G_(),t=n.d.c-n.e.c,Otn((e=BB(n.g,145)).b,new jd(t)),Otn(e.c,new Ed(t)),e5(e.i,new Td(t))}function mfn(n){var t;return(t=new Ck).a+="VerticalSegment ",uO(t,n.e),t.a+=" ",oO(t,JL(new mk,new Wb(n.k))),t.a}function yfn(n){var t;return(t=BB(lnn(n.c.c,""),229))||(t=new UZ(jj(kj(new pu,""),"Other")),Jgn(n.c.c,"",t)),t}function kfn(n){var t;return 0!=(64&n.Db)?P$n(n):((t=new fN(P$n(n))).a+=" (name: ",cO(t,n.zb),t.a+=")",t.a)}function jfn(n,t,e){var i,r;return r=n.sb,n.sb=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,4,r,t),e?e.Ei(i):e=i),e}function Efn(n,t){var e,i;for(e=0,i=abn(n,t).Kc();i.Ob();)e+=null!=mMn(BB(i.Pb(),11),(hWn(),Elt))?1:0;return e}function Tfn(n,t,e){var i,r,c;for(i=0,c=spn(n,0);c.b!=c.d.c&&!((r=Gy(MD(b3(c))))>e);)r>=t&&++i;return i}function Mfn(n,t,e){var i;return i=new N7(n.e,3,13,null,t.c||(gWn(),l$t),uvn(n,t),!1),e?e.Ei(i):e=i,e}function Sfn(n,t,e){var i;return i=new N7(n.e,4,13,t.c||(gWn(),l$t),null,uvn(n,t),!1),e?e.Ei(i):e=i,e}function Pfn(n,t,e){var i,r;return r=n.r,n.r=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,8,r,n.r),e?e.Ei(i):e=i),e}function Cfn(n,t){var e,i;return!(i=(e=BB(t,676)).vk())&&e.wk(i=cL(t,88)?new $I(n,BB(t,26)):new _0(n,BB(t,148))),i}function Ifn(n,t,e){var i;n.qi(n.i+1),i=n.oi(t,e),t!=n.i&&aHn(n.g,t,n.g,t+1,n.i-t),$X(n.g,t,i),++n.i,n.bi(t,e),n.ci()}function Ofn(n,t){var e;return t.a&&(e=t.a.a.length,n.a?oO(n.a,n.b):n.a=new lN(n.d),G0(n.a,t.a,t.d.length,e)),n}function Afn(n,t){var e,i,r;if(t.vi(n.a),null!=(r=BB(yan(n.a,8),1936)))for(e=0,i=r.length;e<i;++e)null.jm()}function $fn(n,t){var e;return e=new sn,n.a.sd(e)?(CL(),new vy(kW(T7(n,e.a,t)))):(EW(n),CL(),CL(),Set)}function Lfn(n,t){switch(t.g){case 2:case 1:return abn(n,t);case 3:case 4:return ean(abn(n,t))}return SQ(),SQ(),set}function Nfn(n,t){return XI(n)?mK(n,t):UI(n)?vK(n,t):zI(n)?(kW(n),GI(n)===GI(t)):iz(n)?n.Fb(t):AG(n)?FO(n,t):v0(n,t)}function xfn(n){return n?0!=(1&n.i)?n==$Nt?ktt:n==ANt?Att:n==DNt?Ctt:n==xNt?Ptt:n==LNt?Rtt:n==RNt?_tt:n==NNt?Ttt:Stt:n:null}function Dfn(n,t,e,i,r){0!=t&&0!=i&&(1==t?r[i]=dvn(r,e,i,n[0]):1==i?r[t]=dvn(r,n,t,e[0]):YOn(n,e,r,t,i))}function Rfn(n,t){var e;0!=n.c.length&&(hA(e=BB(Qgn(n,x8(Out,a1n,10,n.c.length,0,1)),193),new Oe),eOn(e,t))}function Kfn(n,t){var e;0!=n.c.length&&(hA(e=BB(Qgn(n,x8(Out,a1n,10,n.c.length,0,1)),193),new Ae),eOn(e,t))}function _fn(n,t,e,i){switch(t){case 1:return!n.n&&(n.n=new eU(zOt,n,1,7)),n.n;case 2:return n.k}return Eyn(n,t,e,i)}function Ffn(){Ffn=O,BPt=new KC(hJn,0),FPt=new KC(aJn,1),_Pt=new KC(cJn,2),KPt=new KC(pJn,3),HPt=new KC("UP",4)}function Bfn(){Bfn=O,wut=new YS(QZn,0),but=new YS("INSIDE_PORT_SIDE_GROUPS",1),lut=new YS("FORCE_MODEL_ORDER",2)}function Hfn(n,t,e){if(n<0||t>e)throw Hp(new Ay(mYn+n+kYn+t+", size: "+e));if(n>t)throw Hp(new _y(mYn+n+yYn+t))}function qfn(n,t,e){if(t<0)cIn(n,e);else{if(!e.Ij())throw Hp(new _y(r6n+e.ne()+c6n));BB(e,66).Nj().Vj(n,n.yh(),t)}}function Gfn(n,t,e,i,r,c,a,u){var o;for(o=e;c<a;)o>=i||t<e&&u.ue(n[t],n[o])<=0?$X(r,c++,n[t++]):$X(r,c++,n[o++])}function zfn(n,t,e,i,r,c){this.e=new Np,this.f=(ain(),Gvt),WB(this.e,n),this.d=t,this.a=e,this.b=i,this.f=r,this.c=c}function Ufn(n,t){var e,i;for(i=new AL(n);i.e!=i.i.gc();)if(e=BB(kpn(i),26),GI(t)===GI(e))return!0;return!1}function Xfn(n){var t,e,i,r;for(dWn(),i=0,r=(e=tpn()).length;i<r;++i)if(-1!=E7((t=e[i]).a,n,0))return t;return Irt}function Wfn(n){return n>=65&&n<=70?n-65+10:n>=97&&n<=102?n-97+10:n>=48&&n<=57?n-48:0}function Vfn(n){var t;return 0!=(64&n.Db)?P$n(n):((t=new fN(P$n(n))).a+=" (source: ",cO(t,n.d),t.a+=")",t.a)}function Qfn(n,t,e){var i,r;return r=n.a,n.a=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,5,r,n.a),e?KEn(e,i):e=i),e}function Yfn(n,t){var e;e=0!=(256&n.Bb),t?n.Bb|=256:n.Bb&=-257,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,2,e,t))}function Jfn(n,t){var e;e=0!=(256&n.Bb),t?n.Bb|=256:n.Bb&=-257,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,8,e,t))}function Zfn(n,t){var e;e=0!=(256&n.Bb),t?n.Bb|=256:n.Bb&=-257,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,8,e,t))}function nln(n,t){var e;e=0!=(512&n.Bb),t?n.Bb|=512:n.Bb&=-513,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,3,e,t))}function tln(n,t){var e;e=0!=(512&n.Bb),t?n.Bb|=512:n.Bb&=-513,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,9,e,t))}function eln(n,t){var e;return-1==n.b&&n.a&&(e=n.a.Gj(),n.b=e?n.c.Xg(n.a.aj(),e):Awn(n.c.Tg(),n.a)),n.c.Og(n.b,t)}function iln(n){var t,e;return n>-129&&n<128?(t=n+128,!(e=(tq(),Itt)[t])&&(e=Itt[t]=new xb(n)),e):new xb(n)}function rln(n){var t,e;return n>-129&&n<128?(t=n+128,!(e=(Tq(),Ktt)[t])&&(e=Ktt[t]=new Rb(n)),e):new Rb(n)}function cln(n){var t;return n.k==(uSn(),Mut)&&((t=BB(mMn(n,(hWn(),Qft)),61))==(kUn(),sIt)||t==SIt)}function aln(n,t,e){var i,r;return(r=$$n(n.b,t))&&(i=BB(NHn(F7(n,r),""),26))?m$n(n,i,t,e):null}function uln(n,t,e){var i,r;return(r=$$n(n.b,t))&&(i=BB(NHn(F7(n,r),""),26))?y$n(n,i,t,e):null}function oln(n,t){var e,i;for(i=new AL(n);i.e!=i.i.gc();)if(e=BB(kpn(i),138),GI(t)===GI(e))return!0;return!1}function sln(n,t,e){var i;if(t>(i=n.gc()))throw Hp(new tK(t,i));if(n.hi()&&n.Hc(e))throw Hp(new _y(a8n));n.Xh(t,e)}function hln(n,t){var e;if(null==(e=sen(n.i,t)))throw Hp(new ek("Node did not exist in input."));return Kcn(t,e),null}function fln(n,t){var e;if(cL(e=NNn(n,t),322))return BB(e,34);throw Hp(new _y(r6n+t+"' is not a valid attribute"))}function lln(n,t,e){var i,r;for(r=cL(t,99)&&0!=(BB(t,18).Bb&BQn)?new xO(t,n):new Aan(t,n),i=0;i<e;++i)cvn(r);return r}function bln(n){var t,e,i;for(i=0,e=n.length,t=0;t<e;t++)32==n[t]||13==n[t]||10==n[t]||9==n[t]||(n[i++]=n[t]);return i}function wln(n){var t,e,i;for(t=new Np,i=new Wb(n.b);i.a<i.c.c.length;)e=BB(n0(i),594),gun(t,BB(e.jf(),14));return t}function dln(n){var t,e;for(e=BB(mMn(n,(qqn(),lkt)),15).Kc();e.Ob();)DH((t=BB(e.Pb(),188)).b.d,t),DH(t.c.b,t)}function gln(n){switch(BB(mMn(n,(hWn(),ilt)),303).g){case 1:hon(n,ilt,(z7(),Sft));break;case 2:hon(n,ilt,(z7(),Cft))}}function pln(n){var t;n.g&&(xxn((t=n.c.Rf()?n.f:n.a).a,n.o,!0),xxn(t.a,n.o,!1),hon(n.o,(HXn(),ept),(QEn(),UCt)))}function vln(n){var t;if(!n.a)throw Hp(new Fy("Cannot offset an unassigned cut."));t=n.c-n.b,n.b+=t,xQ(n,t),NQ(n,t)}function mln(n){var t;return null==(t=n.a[n.c-1&n.a.length-1])?null:(n.c=n.c-1&n.a.length-1,$X(n.a,n.c,null),t)}function yln(n){var t,e;for(e=n.p.a.ec().Kc();e.Ob();)if((t=BB(e.Pb(),213)).f&&n.b[t.c]<-1e-10)return t;return null}function kln(n,t){switch(n.b.g){case 0:case 1:return t;case 2:case 3:return new UV(t.d,0,t.a,t.b);default:return null}}function jln(n){switch(n.g){case 2:return FPt;case 1:return _Pt;case 4:return KPt;case 3:return HPt;default:return BPt}}function Eln(n){switch(n.g){case 1:return CIt;case 2:return sIt;case 3:return oIt;case 4:return SIt;default:return PIt}}function Tln(n){switch(n.g){case 1:return SIt;case 2:return CIt;case 3:return sIt;case 4:return oIt;default:return PIt}}function Mln(n){switch(n.g){case 1:return oIt;case 2:return SIt;case 3:return CIt;case 4:return sIt;default:return PIt}}function Sln(n){switch(n){case 0:return new mm;case 1:return new pm;case 2:return new vm;default:throw Hp(new wv)}}function Pln(n,t){return n<t?-1:n>t?1:n==t?0==n?Pln(1/n,1/t):0:isNaN(n)?isNaN(t)?0:1:-1}function Cln(n,t){OTn(t,"Sort end labels",1),JT(AV(wnn(new Rq(null,new w1(n.b,16)),new we),new de),new ge),HSn(t)}function Iln(n,t,e){var i,r;return n.ej()?(r=n.fj(),i=YIn(n,t,e),n.$i(n.Zi(7,iln(e),i,t,r)),i):YIn(n,t,e)}function Oln(n,t){var e,i,r;null==n.d?(++n.e,--n.f):(r=t.cd(),N6(n,i=((e=t.Sh())&DWn)%n.d.length,A$n(n,i,e,r)))}function Aln(n,t){var e;e=0!=(n.Bb&k6n),t?n.Bb|=k6n:n.Bb&=-1025,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,10,e,t))}function $ln(n,t){var e;e=0!=(n.Bb&_Qn),t?n.Bb|=_Qn:n.Bb&=-4097,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,12,e,t))}function Lln(n,t){var e;e=0!=(n.Bb&T9n),t?n.Bb|=T9n:n.Bb&=-8193,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,15,e,t))}function Nln(n,t){var e;e=0!=(n.Bb&M9n),t?n.Bb|=M9n:n.Bb&=-2049,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,11,e,t))}function xln(n,t){var e;return 0!=(e=Pln(n.b.c,t.b.c))||0!=(e=Pln(n.a.a,t.a.a))?e:Pln(n.a.b,t.a.b)}function Dln(n,t){var e;if(null==(e=RX(n.k,t)))throw Hp(new ek("Port did not exist in input."));return Kcn(t,e),null}function Rln(n){var t,e;for(e=G$n(Utn(n)).Kc();e.Ob();)if(N_n(n,t=SD(e.Pb())))return y4((UM(),RAt),t);return null}function Kln(n,t){var e,i,r,c,a;for(a=axn(n.e.Tg(),t),c=0,e=BB(n.g,119),r=0;r<n.i;++r)i=e[r],a.rl(i.ak())&&++c;return c}function _ln(n,t,e){var i,r;return i=BB(t.We(n.a),35),r=BB(e.We(n.a),35),null!=i&&null!=r?Ncn(i,r):null!=i?-1:null!=r?1:0}function Fln(n,t,e){var i;if(n.c)lMn(n.c,t,e);else for(i=new Wb(n.b);i.a<i.c.c.length;)Fln(BB(n0(i),157),t,e)}function Bln(n,t){var e,i;for(i=new Wb(t);i.a<i.c.c.length;)e=BB(n0(i),46),y7(n.b.b,e.b),uY(BB(e.a,189),BB(e.b,81))}function Hln(n){var t,e;for(e=xX(new Ck,91),t=!0;n.Ob();)t||(e.a+=FWn),t=!1,uO(e,n.Pb());return(e.a+="]",e).a}function qln(n,t){var e;e=0!=(n.Bb&hVn),t?n.Bb|=hVn:n.Bb&=-16385,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,16,e,t))}function Gln(n,t){var e;e=0!=(n.Bb&h6n),t?n.Bb|=h6n:n.Bb&=-32769,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,18,e,t))}function zln(n,t){var e;e=0!=(n.Bb&h6n),t?n.Bb|=h6n:n.Bb&=-32769,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,18,e,t))}function Uln(n,t){var e;e=0!=(n.Bb&BQn),t?n.Bb|=BQn:n.Bb&=-65537,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new t6(n,1,20,e,t))}function Xln(n){var t;return t=x8(ONt,WVn,25,2,15,1),n-=BQn,t[0]=(n>>10)+HQn&QVn,t[1]=56320+(1023&n)&QVn,Bdn(t,0,t.length)}function Wln(n){var t;return(t=BB(mMn(n,(HXn(),Udt)),103))==(Ffn(),BPt)?Gy(MD(mMn(n,Edt)))>=1?FPt:KPt:t}function Vln(n){switch(BB(mMn(n,(HXn(),Zdt)),218).g){case 1:return new ic;case 3:return new oc;default:return new ec}}function Qln(n){if(n.c)Qln(n.c);else if(n.d)throw Hp(new Fy("Stream already terminated, can't be modified or used"))}function Yln(n){var t;return 0!=(64&n.Db)?P$n(n):((t=new fN(P$n(n))).a+=" (identifier: ",cO(t,n.k),t.a+=")",t.a)}function Jln(n,t,e){var i;return tE(),jen(i=new ro,t),Een(i,e),n&&f9((!n.a&&(n.a=new $L(xOt,n,5)),n.a),i),i}function Zln(n,t,e,i){var r,c;return kW(i),kW(e),null==(c=null==(r=n.xc(t))?e:ZT(BB(r,15),BB(e,14)))?n.Bc(t):n.zc(t,c),c}function nbn(n){var t,e,i,r;return orn(e=new YK(t=BB(Vj((r=(i=n.gm).f)==Unt?i:r),9),BB(SR(t,t.length),9),0),n),e}function tbn(n,t,e){var i,r;for(r=n.a.ec().Kc();r.Ob();)if(i=BB(r.Pb(),10),oun(e,BB(xq(t,i.p),14)))return i;return null}function ebn(n,t,e){try{_on(n,t,e)}catch(i){throw cL(i=lun(i),597)?Hp(new g5(i)):Hp(i)}return t}function ibn(n,t){var e;return JO(n)&&JO(t)&&$Qn<(e=n-t)&&e<OQn?e:uan(hun(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function rbn(n,t){var e;return JO(n)&&JO(t)&&$Qn<(e=n+t)&&e<OQn?e:uan(sun(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function cbn(n,t){var e;return JO(n)&&JO(t)&&$Qn<(e=n*t)&&e<OQn?e:uan(fqn(JO(n)?Pan(n):n,JO(t)?Pan(t):t))}function abn(n,t){var e;return n.i||eIn(n),(e=BB(oV(n.g,t),46))?new s1(n.j,BB(e.a,19).a,BB(e.b,19).a):(SQ(),SQ(),set)}function ubn(n,t,e){var i;return i=n.a.get(t),n.a.set(t,void 0===e?null:e),void 0===i?(++n.c,oY(n.b)):++n.d,i}function obn(n,t,i){n.n=kq(LNt,[sVn,FQn],[364,25],14,[i,CJ(e.Math.ceil(t/32))],2),n.o=t,n.p=i,n.j=t-1>>1,n.k=i-1>>1}function sbn(){var n,t,i;yTn(),i=Let+++Date.now(),n=CJ(e.Math.floor(i*uYn))&sYn,t=CJ(i-n*oYn),this.a=1502^n,this.b=t^aYn}function hbn(n){var t,e;for(t=new Np,e=new Wb(n.j);e.a<e.c.c.length;)WB(t,BB(n0(e),11).b);return yX(t),new OO(t)}function fbn(n){var t,e;for(t=new Np,e=new Wb(n.j);e.a<e.c.c.length;)WB(t,BB(n0(e),11).e);return yX(t),new OO(t)}function lbn(n){var t,e;for(t=new Np,e=new Wb(n.j);e.a<e.c.c.length;)WB(t,BB(n0(e),11).g);return yX(t),new OO(t)}function bbn(n){var t,e;for(e=t$n(Utn(dZ(n))).Kc();e.Ob();)if(N_n(n,t=SD(e.Pb())))return k4((XM(),UAt),t);return null}function wbn(n){var t,e;for(t=0,e=n.length;t<e;t++)if(null==n[t])throw Hp(new Hy("at index "+t));return new Jy(n)}function dbn(n,t){var e;if(cL(e=NNn(n.Tg(),t),99))return BB(e,18);throw Hp(new _y(r6n+t+"' is not a valid reference"))}function gbn(n){var t;return(t=bSn(n))>34028234663852886e22?RQn:t<-34028234663852886e22?KQn:t}function pbn(n){return n=((n=((n-=n>>1&1431655765)>>2&858993459)+(858993459&n))>>4)+n&252645135,n+=n>>8,63&(n+=n>>16)}function vbn(n){var t,e,i;for(t=new hR(n.Hd().gc()),i=0,e=L9(n.Hd().Kc());e.Ob();)jZ(t,e.Pb(),iln(i++));return NSn(t.a)}function mbn(n,t){var e,i,r;for(r=new xp,i=t.vc().Kc();i.Ob();)VW(r,(e=BB(i.Pb(),42)).cd(),lan(n,BB(e.dd(),15)));return r}function ybn(n,t){0==n.n.c.length&&WB(n.n,new RJ(n.s,n.t,n.i)),WB(n.b,t),smn(BB(xq(n.n,n.n.c.length-1),211),t),BFn(n,t)}function kbn(n){return n.c==n.b.b&&n.i==n.g.b||(n.a.c=x8(Ant,HWn,1,0,5,1),gun(n.a,n.b),gun(n.a,n.g),n.c=n.b.b,n.i=n.g.b),n.a}function jbn(n,t){var e,i;for(i=0,e=BB(t.Kb(n),20).Kc();e.Ob();)qy(TD(mMn(BB(e.Pb(),17),(hWn(),Clt))))||++i;return i}function Ebn(n,t){var i,r;r=Gy(MD(edn(f2(t),(HXn(),ypt)))),Fkn(t,i=e.Math.max(0,r/2-.5),1),WB(n,new lP(t,i))}function Tbn(){Tbn=O,qlt=new BP(QZn,0),_lt=new BP("FIRST",1),Flt=new BP(C1n,2),Blt=new BP("LAST",3),Hlt=new BP(I1n,4)}function Mbn(){Mbn=O,ZPt=new FC(hJn,0),YPt=new FC("POLYLINE",1),QPt=new FC("ORTHOGONAL",2),JPt=new FC("SPLINES",3)}function Sbn(){Sbn=O,Zjt=new kC("ASPECT_RATIO_DRIVEN",0),nEt=new kC("MAX_SCALE_DRIVEN",1),Jjt=new kC("AREA_DRIVEN",2)}function Pbn(){Pbn=O,HEt=new EC("P1_STRUCTURE",0),qEt=new EC("P2_PROCESSING_ORDER",1),GEt=new EC("P3_EXECUTION",2)}function Cbn(){Cbn=O,ejt=new gC("OVERLAP_REMOVAL",0),njt=new gC("COMPACTION",1),tjt=new gC("GRAPH_SIZE_CALCULATION",2)}function Ibn(n,t){return h$(),rin(KVn),e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)?0:n<t?-1:n>t?1:zO(isNaN(n),isNaN(t))}function Obn(n,t){var e,i;for(e=spn(n,0);e.b!=e.d.c;){if((i=zy(MD(b3(e))))==t)return;if(i>t){U0(e);break}}nX(e,t)}function Abn(n,t){var e,i,r,c,a;if(e=t.f,Jgn(n.c.d,e,t),null!=t.g)for(c=0,a=(r=t.g).length;c<a;++c)i=r[c],Jgn(n.c.e,i,t)}function $bn(n,t,e,i){var r,c,a;for(r=t+1;r<e;++r)for(c=r;c>t&&i.ue(n[c-1],n[c])>0;--c)a=n[c],$X(n,c,n[c-1]),$X(n,c-1,a)}function Lbn(n,t,e,i){if(t<0)TLn(n,e,i);else{if(!e.Ij())throw Hp(new _y(r6n+e.ne()+c6n));BB(e,66).Nj().Tj(n,n.yh(),t,i)}}function Nbn(n,t){if(t==n.d)return n.e;if(t==n.e)return n.d;throw Hp(new _y("Node "+t+" not part of edge "+n))}function xbn(n,t){switch(t.g){case 2:return n.b;case 1:return n.c;case 4:return n.d;case 3:return n.a;default:return!1}}function Dbn(n,t){switch(t.g){case 2:return n.b;case 1:return n.c;case 4:return n.d;case 3:return n.a;default:return!1}}function Rbn(n,t,e,i){switch(t){case 3:return n.f;case 4:return n.g;case 5:return n.i;case 6:return n.j}return _fn(n,t,e,i)}function Kbn(n){return n.k==(uSn(),Cut)&&o5(new Rq(null,new zU(new oz(ZL(lbn(n).a.Kc(),new h)))),new qr)}function _bn(n){return null==n.e?n:(!n.c&&(n.c=new rRn(0!=(256&n.f),n.i,n.a,n.d,0!=(16&n.f),n.j,n.g,null)),n.c)}function Fbn(n,t){return n.h==CQn&&0==n.m&&0==n.l?(t&&(ltt=M$(0,0,0)),WO((X7(),dtt))):(t&&(ltt=M$(n.l,n.m,n.h)),M$(0,0,0))}function Bbn(n){return Array.isArray(n)&&n.im===I?nE(tsn(n))+"@"+(nsn(n)>>>0).toString(16):n.toString()}function Hbn(n){var t;this.a=new YK(t=BB(n.e&&n.e(),9),BB(SR(t,t.length),9),0),this.b=x8(Ant,HWn,1,this.a.a.length,5,1)}function qbn(n){var t,e,i;for(this.a=new fA,i=new Wb(n);i.a<i.c.c.length;)e=BB(n0(i),14),brn(t=new hG,e),TU(this.a,t)}function Gbn(n){var t,e;for(qD(),t=n.o.b,e=BB(BB(h6(n.r,(kUn(),SIt)),21),84).Kc();e.Ob();)BB(e.Pb(),111).e.b+=t}function zbn(n){var t;if(n.b){if(zbn(n.b),n.b.d!=n.c)throw Hp(new vv)}else n.d.dc()&&(t=BB(n.f.c.xc(n.e),14))&&(n.d=t)}function Ubn(n){var t;return null==n||(t=n.length)>0&&(b1(t-1,n.length),58==n.charCodeAt(t-1))&&!Xbn(n,LAt,NAt)}function Xbn(n,t,e){var i,r;for(i=0,r=n.length;i<r;i++)if(ton((b1(i,n.length),n.charCodeAt(i)),t,e))return!0;return!1}function Wbn(n,t){var e,i;for(i=n.e.a.ec().Kc();i.Ob();)if(tSn(t,(e=BB(i.Pb(),266)).d)||ICn(t,e.d))return!0;return!1}function Vbn(n,t){var e,i,r;for(r=(i=HRn(n,t))[i.length-1]/2,e=0;e<i.length;e++)if(i[e]>=r)return t.c+e;return t.c+t.b.gc()}function Qbn(n,t){var e,i,r,c;for(dD(),r=t,z9(i=H9(n),0,i.length,r),e=0;e<i.length;e++)e!=(c=gkn(n,i[e],e))&&Iln(n,e,c)}function Ybn(n,t){var e,i,r,c,a,u;for(i=0,e=0,a=0,u=(c=t).length;a<u;++a)(r=c[a])>0&&(i+=r,++e);return e>1&&(i+=n.d*(e-1)),i}function Jbn(n){var t,e,i;for((i=new Sk).a+="[",t=0,e=n.gc();t<e;)cO(i,kN(n.ki(t))),++t<e&&(i.a+=FWn);return i.a+="]",i.a}function Zbn(n){var t,e,i;return i=ATn(n),!WE(n.c)&&(rtn(i,"knownLayouters",e=new Cl),t=new rp(e),e5(n.c,t)),i}function nwn(n,t){var e,i;for(kW(t),e=!1,i=new Wb(n);i.a<i.c.c.length;)ywn(t,n0(i),!1)&&(AU(i),e=!0);return e}function twn(n){var t,e;for(e=Gy(MD(n.a.We((sWn(),OPt)))),t=new Wb(n.a.xf());t.a<t.c.c.length;)VUn(n,BB(n0(t),680),e)}function ewn(n,t){var e,i;for(i=new Wb(t);i.a<i.c.c.length;)e=BB(n0(i),46),WB(n.b.b,BB(e.b,81)),g2(BB(e.a,189),BB(e.b,81))}function iwn(n,t,e){var i,r;for(i=(r=n.a.b).c.length;i<e;i++)kG(r,0,new HX(n.a));PZ(t,BB(xq(r,r.c.length-e),29)),n.b[t.p]=e}function rwn(n,t,e){var i;!(i=e)&&(i=LH(new Xm,0)),OTn(i,qZn,2),mvn(n.b,t,mcn(i,1)),Kqn(n,t,mcn(i,1)),qUn(t,mcn(i,1)),HSn(i)}function cwn(n,t,e,i,r){BZ(),UNn(aM(cM(rM(uM(new Hv,0),r.d.e-n),t),r.d)),UNn(aM(cM(rM(uM(new Hv,0),e-r.a.e),r.a),i))}function awn(n,t,e,i,r,c){this.a=n,this.c=t,this.b=e,this.f=i,this.d=r,this.e=c,this.c>0&&this.b>0&&Yq(this.c,this.b,this.a)}function uwn(n){Rwn(),this.c=u6(Pun(Gk(rMt,1),HWn,831,0,[Wpt])),this.b=new xp,this.a=n,VW(this.b,Vpt,1),Otn(Qpt,new Pg(this))}function own(n,t){var e;return n.d?hU(n.b,t)?BB(RX(n.b,t),51):(e=t.Kf(),VW(n.b,t,e),e):t.Kf()}function swn(n,t){var e;return GI(n)===GI(t)||!!cL(t,91)&&(e=BB(t,91),n.e==e.e&&n.d==e.d&&E4(n,e.a))}function hwn(n){switch(kUn(),n.g){case 4:return sIt;case 1:return oIt;case 3:return SIt;case 2:return CIt;default:return PIt}}function fwn(n,t){switch(t){case 3:return 0!=n.f;case 4:return 0!=n.g;case 5:return 0!=n.i;case 6:return 0!=n.j}return Ean(n,t)}function lwn(n){switch(n.g){case 0:return new Ga;case 1:return new za;default:throw Hp(new _y(c4n+(null!=n.f?n.f:""+n.g)))}}function bwn(n){switch(n.g){case 0:return new qa;case 1:return new Ua;default:throw Hp(new _y(M1n+(null!=n.f?n.f:""+n.g)))}}function wwn(n){switch(n.g){case 0:return new Vm;case 1:return new ym;default:throw Hp(new _y(N4n+(null!=n.f?n.f:""+n.g)))}}function dwn(n){switch(n.g){case 1:return new Ra;case 2:return new gD;default:throw Hp(new _y(c4n+(null!=n.f?n.f:""+n.g)))}}function gwn(n){var t,e;if(n.b)return n.b;for(e=Qet?null:n.d;e;){if(t=Qet?null:e.b)return t;e=Qet?null:e.d}return lM(),Het}function pwn(n){var t,e;return 0==n.e?0:(t=n.d<<5,e=n.a[n.d-1],n.e<0&&Ccn(n)==n.d-1&&(--e,e|=0),t-=ZIn(e))}function vwn(n){var t,e,i;return n<tet.length?tet[n]:(t=31&n,(i=x8(ANt,hQn,25,1+(e=n>>5),15,1))[e]=1<<t,new lU(1,e+1,i))}function mwn(n){var t,e,i;return(e=n.zg())?cL(t=n.Ug(),160)&&null!=(i=mwn(BB(t,160)))?i+"."+e:e:null}function ywn(n,t,e){var i,r;for(r=n.Kc();r.Ob();)if(i=r.Pb(),GI(t)===GI(i)||null!=t&&Nfn(t,i))return e&&r.Qb(),!0;return!1}function kwn(n,t,e){var i,r;if(++n.j,e.dc())return!1;for(r=e.Kc();r.Ob();)i=r.Pb(),n.Hi(t,n.oi(t,i)),++t;return!0}function jwn(n,t,e,i){var r,c;if((c=e-t)<3)for(;c<3;)n*=10,++c;else{for(r=1;c>3;)r*=10,--c;n=(n+(r>>1))/r|0}return i.i=n,!0}function Ewn(n){return Shn(),hN(),!!(Dbn(BB(n.a,81).j,BB(n.b,103))||0!=BB(n.a,81).d.e&&Dbn(BB(n.a,81).j,BB(n.b,103)))}function Twn(n){x9(),BB(n.We((sWn(),qSt)),174).Hc((n_n(),VIt))&&(BB(n.We(fPt),174).Fc((lIn(),cIt)),BB(n.We(qSt),174).Mc(VIt))}function Mwn(n,t){var e;if(t){for(e=0;e<n.i;++e)if(BB(n.g[e],366).Di(t))return!1;return f9(n,t)}return!1}function Swn(n){var t,e,i;for(t=new Cl,i=new qb(n.b.Kc());i.b.Ob();)e=VSn(BB(i.b.Pb(),686)),WU(t,t.a.length,e);return t.a}function Pwn(n){var t;return!n.c&&(n.c=new Nn),m$(n.d,new Dn),YKn(n),t=lDn(n),JT(new Rq(null,new w1(n.d,16)),new Iw(n)),t}function Cwn(n){var t;return 0!=(64&n.Db)?kfn(n):((t=new fN(kfn(n))).a+=" (instanceClassName: ",cO(t,n.D),t.a+=")",t.a)}function Iwn(n,t){var e,i;t&&(e=Ren(t,"x"),Ten(new Zg(n).a,(kW(e),e)),i=Ren(t,"y"),Oen(new np(n).a,(kW(i),i)))}function Own(n,t){var e,i;t&&(e=Ren(t,"x"),Ien(new Vg(n).a,(kW(e),e)),i=Ren(t,"y"),Aen(new Yg(n).a,(kW(i),i)))}function Awn(n,t){var e,i,r;if(null==n.i&&qFn(n),e=n.i,-1!=(i=t.aj()))for(r=e.length;i<r;++i)if(e[i]==t)return i;return-1}function $wn(n){var t,e,i,r;for(e=BB(n.g,674),i=n.i-1;i>=0;--i)for(t=e[i],r=0;r<i;++r)if(vFn(n,t,e[r])){Lyn(n,i);break}}function Lwn(n){var t=n.e;function e(n){return n&&0!=n.length?"\t"+n.join("\n\t"):""}return t&&(t.stack||e(n[UVn]))}function Nwn(n){var t;switch(WX(),(t=n.Pc()).length){case 0:return Fnt;case 1:return new Pq(yX(t[0]));default:return new SY(wbn(t))}}function xwn(n,t){switch(t.g){case 1:return KB(n.j,(gcn(),Nut));case 2:return KB(n.j,(gcn(),Dut));default:return SQ(),SQ(),set}}function Dwn(n,t){switch(t){case 3:return void Men(n,0);case 4:return void Sen(n,0);case 5:return void Pen(n,0);case 6:return void Cen(n,0)}ofn(n,t)}function Rwn(){Rwn=O,AM(),HXn(),Vpt=Opt,Qpt=u6(Pun(Gk(lMt,1),k3n,146,0,[mpt,ypt,jpt,Ept,Spt,Ppt,Cpt,Ipt,$pt,Npt,kpt,Tpt,Apt]))}function Kwn(n){var t,e;t=n.d==($Pn(),Jst),e=$En(n),hon(n.a,(HXn(),kdt),t&&!e||!t&&e?(wvn(),$Mt):(wvn(),AMt))}function _wn(n,t){var e;return(e=BB(P4(n,m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15)).Qc(lH(e.gc()))}function Fwn(){Fwn=O,eOt=new YC("SIMPLE",0),ZIt=new YC("GROUP_DEC",1),tOt=new YC("GROUP_MIXED",2),nOt=new YC("GROUP_INC",3)}function Bwn(){Bwn=O,z$t=new $o,K$t=new Lo,_$t=new No,F$t=new xo,B$t=new Do,H$t=new Ro,q$t=new Ko,G$t=new _o,U$t=new Fo}function Hwn(n,t,e){qtn(),sm.call(this),this.a=kq(Xit,[sVn,rJn],[595,212],0,[nrt,Zit],2),this.c=new bA,this.g=n,this.f=t,this.d=e}function qwn(n,t){this.n=kq(LNt,[sVn,FQn],[364,25],14,[t,CJ(e.Math.ceil(n/32))],2),this.o=n,this.p=t,this.j=n-1>>1,this.k=t-1>>1}function Gwn(n,t){OTn(t,"End label post-processing",1),JT(AV(wnn(new Rq(null,new w1(n.b,16)),new ae),new ue),new oe),HSn(t)}function zwn(n,t,e){var i;return i=Gy(n.p[t.i.p])+Gy(n.d[t.i.p])+t.n.b+t.a.b,Gy(n.p[e.i.p])+Gy(n.d[e.i.p])+e.n.b+e.a.b-i}function Uwn(n,t,e){var i,r;for(i=e0(e,UQn),r=0;0!=Vhn(i,0)&&r<t;r++)i=rbn(i,e0(n[r],UQn)),n[r]=dG(i),i=kz(i,32);return dG(i)}function Xwn(n){var t,e,i,r;for(r=0,e=0,i=n.length;e<i;e++)b1(e,n.length),(t=n.charCodeAt(e))<64&&(r=i0(r,yz(1,t)));return r}function Wwn(n){var t;return null==n?null:new $A((t=FBn(n,!0)).length>0&&(b1(0,t.length),43==t.charCodeAt(0))?t.substr(1):t)}function Vwn(n){var t;return null==n?null:new $A((t=FBn(n,!0)).length>0&&(b1(0,t.length),43==t.charCodeAt(0))?t.substr(1):t)}function Qwn(n,t){return n.i>0&&(t.length<n.i&&(t=Den(tsn(t).c,n.i)),aHn(n.g,0,t,0,n.i)),t.length>n.i&&$X(t,n.i,null),t}function Ywn(n,t,e){var i,r,c;return n.ej()?(i=n.i,c=n.fj(),Ifn(n,i,t),r=n.Zi(3,null,t,i,c),e?e.Ei(r):e=r):Ifn(n,n.i,t),e}function Jwn(n,t,e){var i,r;return i=new N7(n.e,4,10,cL(r=t.c,88)?BB(r,26):(gWn(),d$t),null,uvn(n,t),!1),e?e.Ei(i):e=i,e}function Zwn(n,t,e){var i,r;return i=new N7(n.e,3,10,null,cL(r=t.c,88)?BB(r,26):(gWn(),d$t),uvn(n,t),!1),e?e.Ei(i):e=i,e}function ndn(n){var t;return qD(),t=new wA(BB(n.e.We((sWn(),BSt)),8)),n.B.Hc((n_n(),GIt))&&(t.a<=0&&(t.a=20),t.b<=0&&(t.b=20)),t}function tdn(n){return bvn(),(n.q?n.q:(SQ(),SQ(),het))._b((HXn(),Rgt))?BB(mMn(n,Rgt),197):BB(mMn(vW(n),Kgt),197)}function edn(n,t){var e,i;return i=null,Lx(n,(HXn(),Mpt))&&(e=BB(mMn(n,Mpt),94)).Xe(t)&&(i=e.We(t)),null==i&&(i=mMn(vW(n),t)),i}function idn(n,t){var e,i,r;return!!cL(t,42)&&(i=(e=BB(t,42)).cd(),wW(r=lfn(n.Rc(),i),e.dd())&&(null!=r||n.Rc()._b(i)))}function rdn(n,t){var e;return n.f>0&&(n.qj(),-1!=A$n(n,((e=null==t?0:nsn(t))&DWn)%n.d.length,e,t))}function cdn(n,t){var e,i;return n.f>0&&(n.qj(),e=aOn(n,((i=null==t?0:nsn(t))&DWn)%n.d.length,i,t))?e.dd():null}function adn(n,t){var e,i,r,c;for(c=axn(n.e.Tg(),t),e=BB(n.g,119),r=0;r<n.i;++r)if(i=e[r],c.rl(i.ak()))return!1;return!0}function udn(n){if(null==n.b){for(;n.a.Ob();)if(n.b=n.a.Pb(),!BB(n.b,49).Zg())return!0;return n.b=null,!1}return!0}function odn(n,t){n.mj();try{n.d.Vc(n.e++,t),n.f=n.d.j,n.g=-1}catch(e){throw cL(e=lun(e),73)?Hp(new vv):Hp(e)}}function sdn(n,t){var e,i;return s$(),i=null,t==(e=fR((fk(),fk(),rtt)))&&(i=BB(SJ(itt,n),615)),i||(i=new zX(n),t==e&&mZ(itt,n,i)),i}function hdn(n,t){var i,r;n.a=rbn(n.a,1),n.c=e.Math.min(n.c,t),n.b=e.Math.max(n.b,t),n.d+=t,i=t-n.f,r=n.e+i,n.f=r-n.e-i,n.e=r}function fdn(n,t){var e;n.c=t,n.a=pwn(t),n.a<54&&(n.f=(e=t.d>1?i0(yz(t.a[1],32),e0(t.a[0],UQn)):e0(t.a[0],UQn),j2(cbn(t.e,e))))}function ldn(n,t){var e;return JO(n)&&JO(t)&&$Qn<(e=n%t)&&e<OQn?e:uan((Aqn(JO(n)?Pan(n):n,JO(t)?Pan(t):t,!0),ltt))}function bdn(n,t){var e;Dzn(t),(e=BB(mMn(n,(HXn(),Jdt)),276))&&hon(n,Jdt,Ayn(e)),nx(n.c),nx(n.f),V6(n.d),V6(BB(mMn(n,Agt),207))}function wdn(n){this.e=x8(ANt,hQn,25,n.length,15,1),this.c=x8($Nt,ZYn,25,n.length,16,1),this.b=x8($Nt,ZYn,25,n.length,16,1),this.f=0}function ddn(n){var t,e;for(n.j=x8(xNt,qQn,25,n.p.c.length,15,1),e=new Wb(n.p);e.a<e.c.c.length;)t=BB(n0(e),10),n.j[t.p]=t.o.b/n.i}function gdn(n){var t;0!=n.c&&(1==(t=BB(xq(n.a,n.b),287)).b?(++n.b,n.b<n.a.c.length&&Tb(BB(xq(n.a,n.b),287))):--t.b,--n.c)}function pdn(n){var t;t=n.a;do{(t=BB(U5(new oz(ZL(lbn(t).a.Kc(),new h))),17).d.i).k==(uSn(),Put)&&WB(n.e,t)}while(t.k==(uSn(),Put))}function vdn(){vdn=O,LIt=new WA(15),$It=new XA((sWn(),XSt),LIt),xIt=new XA(LPt,15),NIt=new XA(vPt,iln(0)),AIt=new XA(cSt,dZn)}function mdn(){mdn=O,KIt=new VC("PORTS",0),_It=new VC("PORT_LABELS",1),RIt=new VC("NODE_LABELS",2),DIt=new VC("MINIMUM_SIZE",3)}function ydn(n,t){var e,i;for(i=t.length,e=0;e<i;e+=2)Yxn(n,(b1(e,t.length),t.charCodeAt(e)),(b1(e+1,t.length),t.charCodeAt(e+1)))}function kdn(n,t,e){var i,r,c,a;for(c=t-n.e,a=e-n.f,r=new Wb(n.a);r.a<r.c.c.length;)Tvn(i=BB(n0(r),187),i.s+c,i.t+a);n.e=t,n.f=e}function jdn(n,t){var e,i,r;for(r=t.b.b,n.a=new YT,n.b=x8(ANt,hQn,25,r,15,1),e=0,i=spn(t.b,0);i.b!=i.d.c;)BB(b3(i),86).g=e++}function Edn(n,t){var e,i,r,c;return e=t>>5,t&=31,r=n.d+e+(0==t?0:1),xTn(i=x8(ANt,hQn,25,r,15,1),n.a,e,t),X0(c=new lU(n.e,r,i)),c}function Tdn(n,t,e){var i,r;i=BB(SJ(iNt,t),117),r=BB(SJ(rNt,t),117),e?(mZ(iNt,n,i),mZ(rNt,n,r)):(mZ(rNt,n,i),mZ(iNt,n,r))}function Mdn(n,t,e){var i,r,c;for(r=null,c=n.b;c;){if(i=n.a.ue(t,c.d),e&&0==i)return c;i>=0?c=c.a[1]:(r=c,c=c.a[0])}return r}function Sdn(n,t,e){var i,r,c;for(r=null,c=n.b;c;){if(i=n.a.ue(t,c.d),e&&0==i)return c;i<=0?c=c.a[0]:(r=c,c=c.a[1])}return r}function Pdn(n,t,e,i){var r,c,a;return r=!1,LGn(n.f,e,i)&&(xgn(n.f,n.a[t][e],n.a[t][i]),a=(c=n.a[t])[i],c[i]=c[e],c[e]=a,r=!0),r}function Cdn(n,t,e,i,r){var c,a,u;for(a=r;t.b!=t.c;)c=BB(dU(t),10),u=BB(abn(c,i).Xb(0),11),n.d[u.p]=a++,e.c[e.c.length]=u;return a}function Idn(n,t,i){var r,c,a,u,o;return u=n.k,o=t.k,c=MD(edn(n,r=i[u.g][o.g])),a=MD(edn(t,r)),e.Math.max((kW(c),c),(kW(a),a))}function Odn(n,t,e){var i,r,c,a;for(i=e/n.c.length,r=0,a=new Wb(n);a.a<a.c.c.length;)ghn(c=BB(n0(a),200),c.f+i*r),ajn(c,t,i),++r}function Adn(n,t,e){var i,r,c;for(r=BB(RX(n.b,e),177),i=0,c=new Wb(t.j);c.a<c.c.c.length;)r[BB(n0(c),113).d.p]&&++i;return i}function $dn(n){var t,e;return null!=(t=BB(yan(n.a,4),126))?(aHn(t,0,e=x8(dAt,i9n,415,t.length,0,1),0,t.length),e):wAt}function Ldn(){var n;return 0!=ctt&&(n=l5())-att>2e3&&(att=n,utt=e.setTimeout(QE,10)),0==ctt++&&(Onn((sk(),ttt)),!0)}function Ndn(n,t){var e;for(e=new oz(ZL(lbn(n).a.Kc(),new h));dAn(e);)if(BB(U5(e),17).d.i.c==t)return!1;return!0}function xdn(n,t){var e;if(cL(t,245)){e=BB(t,245);try{return 0==n.vd(e)}catch(i){if(!cL(i=lun(i),205))throw Hp(i)}}return!1}function Ddn(){return Error.stackTraceLimit>0?(e.Error.stackTraceLimit=Error.stackTraceLimit=64,!0):"stack"in new Error}function Rdn(n,t){return h$(),h$(),rin(KVn),(e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)?0:n<t?-1:n>t?1:zO(isNaN(n),isNaN(t)))>0}function Kdn(n,t){return h$(),h$(),rin(KVn),(e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)?0:n<t?-1:n>t?1:zO(isNaN(n),isNaN(t)))<0}function _dn(n,t){return h$(),h$(),rin(KVn),(e.Math.abs(n-t)<=KVn||n==t||isNaN(n)&&isNaN(t)?0:n<t?-1:n>t?1:zO(isNaN(n),isNaN(t)))<=0}function Fdn(n,t){for(var e=0;!t[e]||""==t[e];)e++;for(var i=t[e++];e<t.length;e++)t[e]&&""!=t[e]&&(i+=n+t[e]);return i}function Bdn(n,t,i){var r,c,a,u;for(_8(t,a=t+i,n.length),u="",c=t;c<a;)r=e.Math.min(c+1e4,a),u+=WW(n.slice(c,r)),c=r;return u}function Hdn(n){var t,e,i,r;if(null==n)return null;for(r=new Np,e=0,i=(t=ysn(n)).length;e<i;++e)WB(r,FBn(t[e],!0));return r}function qdn(n){var t,e,i,r;if(null==n)return null;for(r=new Np,e=0,i=(t=ysn(n)).length;e<i;++e)WB(r,FBn(t[e],!0));return r}function Gdn(n){var t,e,i,r;if(null==n)return null;for(r=new Np,e=0,i=(t=ysn(n)).length;e<i;++e)WB(r,FBn(t[e],!0));return r}function zdn(n,t){var e,i,r;if(n.c)Sen(n.c,t);else for(e=t-iG(n),r=new Wb(n.d);r.a<r.c.c.length;)zdn(i=BB(n0(r),157),iG(i)+e)}function Udn(n,t){var e,i,r;if(n.c)Men(n.c,t);else for(e=t-eG(n),r=new Wb(n.a);r.a<r.c.c.length;)Udn(i=BB(n0(r),157),eG(i)+e)}function Xdn(n,t){var e,i,r;for(i=new J6(t.gc()),e=t.Kc();e.Ob();)(r=t_n(n,BB(e.Pb(),56)))&&(i.c[i.c.length]=r);return i}function Wdn(n,t){var e,i;return n.qj(),(e=aOn(n,((i=null==t?0:nsn(t))&DWn)%n.d.length,i,t))?(hin(n,e),e.dd()):null}function Vdn(n){var t,e;for(e=uPn(n),t=null;2==n.c;)QXn(n),t||(wWn(),wWn(),tqn(t=new r$(2),e),e=t),e.$l(uPn(n));return e}function Qdn(n){if(!(q6n in n.a))throw Hp(new ek("Every element must have an id."));return kIn(zJ(n,q6n))}function Ydn(n){var t,e,i;if(!(i=n.Zg()))for(t=0,e=n.eh();e;e=e.eh()){if(++t>GQn)return e.fh();if((i=e.Zg())||e==n)break}return i}function Jdn(n){return hZ(),cL(n,156)?BB(RX(hAt,yet),288).vg(n):hU(hAt,tsn(n))?BB(RX(hAt,tsn(n)),288).vg(n):null}function Zdn(n){if(mgn(a5n,n))return hN(),vtt;if(mgn(u5n,n))return hN(),ptt;throw Hp(new _y("Expecting true or false"))}function ngn(n,t){if(t.c==n)return t.d;if(t.d==n)return t.c;throw Hp(new _y("Input edge is not connected to the input port."))}function tgn(n,t){return n.e>t.e?1:n.e<t.e?-1:n.d>t.d?n.e:n.d<t.d?-t.e:n.e*Msn(n.a,t.a,n.d)}function egn(n){return n>=48&&n<48+e.Math.min(10,10)?n-48:n>=97&&n<97?n-97+10:n>=65&&n<65?n-65+10:-1}function ign(n,t){var e;return GI(t)===GI(n)||!!cL(t,21)&&(e=BB(t,21)).gc()==n.gc()&&n.Ic(e)}function rgn(n,t){var e,i,r;return i=n.a.length-1,e=t-n.b&i,r=n.c-t&i,Ex(e<(n.c-n.b&i)),e>=r?(ahn(n,t),-1):(uhn(n,t),1)}function cgn(n,t){var e,i;for(b1(t,n.length),e=n.charCodeAt(t),i=t+1;i<n.length&&(b1(i,n.length),n.charCodeAt(i)==e);)++i;return i-t}function agn(n){switch(n.g){case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:return!0;default:return!1}}function ugn(n,t){var e,i=n.a;t=String(t),i.hasOwnProperty(t)&&(e=i[t]);var r=(Zun(),ftt)[typeof e];return r?r(e):khn(typeof e)}function ogn(n,t){if(n.a<0)throw Hp(new Fy("Did not call before(...) or after(...) before calling add(...)."));return WN(n,n.a,t),n}function sgn(n,t,e,i){var r;0!=t.c.length&&(r=MLn(e,i),JT(ytn(new Rq(null,new w1(uIn(t),1)),new ja),new XV(n,e,r,i)))}function hgn(n,t,e){var i;0!=(n.Db&t)?null==e?WOn(n,t):-1==(i=Rmn(n,t))?n.Eb=e:$X(een(n.Eb),i,e):null!=e&&mxn(n,t,e)}function fgn(n){var t;return 0==(32&n.Db)&&0!=(t=bX(BB(yan(n,16),26)||n.zh())-bX(n.zh()))&&hgn(n,32,x8(Ant,HWn,1,t,5,1)),n}function lgn(n){var t;return n.b||Xj(n,!(t=nK(n.e,n.a))||!mK(u5n,cdn((!t.b&&(t.b=new Jx((gWn(),k$t),X$t,t)),t.b),"qualified"))),n.c}function bgn(n,t,e){var i,r;return((r=(i=BB(Wtn(H7(n.a),t),87)).c||(gWn(),l$t)).kh()?tfn(n.b,BB(r,49)):r)==e?lFn(i):cen(i,e),r}function wgn(n,t){(t||null==console.groupCollapsed?null!=console.group?console.group:console.log:console.groupCollapsed).call(console,n)}function dgn(n,t,e,i){BB(e.b,65),BB(e.b,65),BB(i.b,65),BB(i.b,65).c.b,K8(i,t,n)}function ggn(n){var t,e;for(t=new Wb(n.g);t.a<t.c.c.length;)BB(n0(t),562);zzn(e=new yxn(n.g,Gy(n.a),n.c)),n.g=e.b,n.d=e.a}function pgn(n,t,i){t.b=e.Math.max(t.b,-i.a),t.c=e.Math.max(t.c,i.a-n.a),t.d=e.Math.max(t.d,-i.b),t.a=e.Math.max(t.a,i.b-n.b)}function vgn(n,t){return n.e<t.e?-1:n.e>t.e?1:n.f<t.f?-1:n.f>t.f?1:nsn(n)-nsn(t)}function mgn(n,t){return kW(n),null!=t&&(!!mK(n,t)||n.length==t.length&&mK(n.toLowerCase(),t.toLowerCase()))}function ygn(n,t){var e,i,r,c;for(i=0,r=t.gc();i<r;++i)cL(e=t.il(i),99)&&0!=(BB(e,18).Bb&h6n)&&null!=(c=t.jl(i))&&t_n(n,BB(c,56))}function kgn(n,t,e){var i,r,c;for(c=new Wb(e.a);c.a<c.c.c.length;)r=BB(n0(c),221),i=new C$(BB(RX(n.a,r.b),65)),WB(t.a,i),kgn(n,i,r)}function jgn(n){var t,e;return Vhn(n,-129)>0&&Vhn(n,128)<0?(t=dG(n)+128,!(e=(Eq(),$tt)[t])&&(e=$tt[t]=new Db(n)),e):new Db(n)}function Egn(n,t){var e,i;return(e=t.Hh(n.a))&&null!=(i=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),t8n)))?i:t.ne()}function Tgn(n,t){var e,i;return(e=t.Hh(n.a))&&null!=(i=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),t8n)))?i:t.ne()}function Mgn(n,t){var e,i;for(qZ(),i=new oz(ZL(hbn(n).a.Kc(),new h));dAn(i);)if((e=BB(U5(i),17)).d.i==t||e.c.i==t)return e;return null}function Sgn(n,t,e){this.c=n,this.f=new Np,this.e=new Gj,this.j=new Sq,this.n=new Sq,this.b=t,this.g=new UV(t.c,t.d,t.b,t.a),this.a=e}function Pgn(n){var t,e,i,r;for(this.a=new fA,this.d=new Rv,this.e=0,i=0,r=(e=n).length;i<r;++i)t=e[i],!this.f&&(this.f=t),g2(this,t)}function Cgn(n){ODn(),0==n.length?(this.e=0,this.d=1,this.a=Pun(Gk(ANt,1),hQn,25,15,[0])):(this.e=1,this.d=n.length,this.a=n,X0(this))}function Ign(n,t,e){sm.call(this),this.a=x8(Xit,rJn,212,(Dtn(),Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length,0,1),this.b=n,this.d=t,this.c=e}function Ogn(n){this.d=new Np,this.e=new v4,this.c=x8(ANt,hQn,25,(kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,15,1),this.b=n}function Agn(n){var t,e,i,r;for(hon(r=BB(mMn(n,(hWn(),dlt)),11),Llt,n.i.n.b),e=0,i=(t=Z0(n.e)).length;e<i;++e)MZ(t[e],r)}function $gn(n){var t,e,i,r;for(hon(t=BB(mMn(n,(hWn(),dlt)),11),Llt,n.i.n.b),i=0,r=(e=Z0(n.g)).length;i<r;++i)SZ(e[i],t)}function Lgn(n){var t,e;return!!Lx(n.d.i,(HXn(),Wgt))&&(t=BB(mMn(n.c.i,Wgt),19),e=BB(mMn(n.d.i,Wgt),19),E$(t.a,e.a)>0)}function Ngn(n){var t;GI(ZAn(n,(sWn(),ESt)))===GI((ufn(),vCt))&&(JJ(n)?(t=BB(ZAn(JJ(n),ESt),334),Ypn(n,ESt,t)):Ypn(n,ESt,mCt))}function xgn(n,t,e){var i,r;fMn(n.e,t,e,(kUn(),CIt)),fMn(n.i,t,e,oIt),n.a&&(r=BB(mMn(t,(hWn(),dlt)),11),i=BB(mMn(e,dlt),11),k0(n.g,r,i))}function Dgn(n,t,e){var i,r,c;i=t.c.p,c=t.p,n.b[i][c]=new DY(n,t),e&&(n.a[i][c]=new Bd(t),(r=BB(mMn(t,(hWn(),rlt)),10))&&JIn(n.d,r,t))}function Rgn(n,t){var e,i,r;if(WB(Sct,n),t.Fc(n),e=BB(RX(Mct,n),21))for(r=e.Kc();r.Ob();)i=BB(r.Pb(),33),-1!=E7(Sct,i,0)||Rgn(i,t)}function Kgn(n,t,e){var i;(Wet?(gwn(n),1):Vet||Jet?(lM(),1):Yet&&(lM(),0))&&((i=new i_(t)).b=e,aSn(n,i))}function _gn(n,t){var e;e=!n.A.Hc((mdn(),_It))||n.q==(QEn(),XCt),n.u.Hc((lIn(),eIt))?e?NUn(n,t):aUn(n,t):n.u.Hc(rIt)&&(e?Azn(n,t):JUn(n,t))}function Fgn(n,t){var e,i;++n.j,null!=t&&oOn(t,e=cL(i=n.a.Cb,97)?BB(i,97).Jg():null)?hgn(n.a,4,e):hgn(n.a,4,BB(t,126))}function Bgn(n,t,i){return new UV(e.Math.min(n.a,t.a)-i/2,e.Math.min(n.b,t.b)-i/2,e.Math.abs(n.a-t.a)+i,e.Math.abs(n.b-t.b)+i)}function Hgn(n,t){var e,i;return 0!=(e=E$(n.a.c.p,t.a.c.p))?e:0!=(i=E$(n.a.d.i.p,t.a.d.i.p))?i:E$(t.a.d.p,n.a.d.p)}function qgn(n,t,e){var i,r,c,a;return(c=t.j)!=(a=e.j)?c.g-a.g:(i=n.f[t.p],r=n.f[e.p],0==i&&0==r?0:0==i?-1:0==r?1:Pln(i,r))}function Ggn(n,t,e){var i;if(!e[t.d])for(e[t.d]=!0,i=new Wb(kbn(t));i.a<i.c.c.length;)Ggn(n,Nbn(BB(n0(i),213),t),e)}function zgn(n,t,e){var i;switch(i=e[n.g][t],n.g){case 1:case 3:return new xC(0,i);case 2:case 4:return new xC(i,0);default:return null}}function Ugn(n,t,e){var i;i=BB(sJ(t.f),209);try{i.Ze(n,e),SW(t.f,i)}catch(r){throw cL(r=lun(r),102),Hp(r)}}function Xgn(n,t,e){var i,r,c,a;return i=null,(c=pGn(cin(),t))&&(r=null,null!=(a=Zqn(c,e))&&(r=n.Ye(c,a)),i=r),i}function Wgn(n,t,e,i){var r;return r=new N7(n.e,1,13,t.c||(gWn(),l$t),e.c||(gWn(),l$t),uvn(n,t),!1),i?i.Ei(r):i=r,i}function Vgn(n,t,e,i){var r;if(t>=(r=n.length))return r;for(t=t>0?t:0;t<r&&!ton((b1(t,n.length),n.charCodeAt(t)),e,i);t++);return t}function Qgn(n,t){var e,i;for(i=n.c.length,t.length<i&&(t=qk(new Array(i),t)),e=0;e<i;++e)$X(t,e,n.c[e]);return t.length>i&&$X(t,i,null),t}function Ygn(n,t){var e,i;for(i=n.a.length,t.length<i&&(t=qk(new Array(i),t)),e=0;e<i;++e)$X(t,e,n.a[e]);return t.length>i&&$X(t,i,null),t}function Jgn(n,t,e){var i,r,c;return(r=BB(RX(n.e,t),387))?(c=pR(r,e),uL(n,r),c):(i=new nH(n,t,e),VW(n.e,t,i),kJ(i),null)}function Zgn(n){var t;if(null==n)return null;if(null==(t=L$n(FBn(n,!0))))throw Hp(new ik("Invalid hexBinary value: '"+n+"'"));return t}function npn(n){return ODn(),Vhn(n,0)<0?0!=Vhn(n,-1)?new vEn(-1,j7(n)):Ytt:Vhn(n,10)<=0?Ztt[dG(n)]:new vEn(1,n)}function tpn(){return dWn(),Pun(Gk(Krt,1),$Vn,159,0,[Prt,Srt,Crt,vrt,prt,mrt,jrt,krt,yrt,Mrt,Trt,Ert,drt,wrt,grt,lrt,frt,brt,srt,ort,hrt,Irt])}function epn(n){var t;this.d=new Np,this.j=new Gj,this.g=new Gj,t=n.g.b,this.f=BB(mMn(vW(t),(HXn(),Udt)),103),this.e=Gy(MD(gpn(t,Spt)))}function ipn(n){this.b=new Np,this.e=new Np,this.d=n,this.a=!jE(AV(new Rq(null,new zU(new m6(n.b))),new aw(new Gr))).sd((dM(),tit))}function rpn(){rpn=O,hMt=new AC("PARENTS",0),sMt=new AC("NODES",1),uMt=new AC("EDGES",2),fMt=new AC("PORTS",3),oMt=new AC("LABELS",4)}function cpn(){cpn=O,BCt=new zC("DISTRIBUTED",0),qCt=new zC("JUSTIFIED",1),_Ct=new zC("BEGIN",2),FCt=new zC(eJn,3),HCt=new zC("END",4)}function apn(n){switch(n.yi(null)){case 10:return 0;case 15:return 1;case 14:return 2;case 11:return 3;case 21:return 4}return-1}function upn(n){switch(n.g){case 1:return Ffn(),HPt;case 4:return Ffn(),_Pt;case 2:return Ffn(),FPt;case 3:return Ffn(),KPt}return Ffn(),BPt}function opn(n,t,e){var i;switch((i=e.q.getFullYear()-sQn+sQn)<0&&(i=-i),t){case 1:n.a+=i;break;case 2:Enn(n,i%100,2);break;default:Enn(n,i,t)}}function spn(n,t){var e,i;if(LZ(t,n.b),t>=n.b>>1)for(i=n.c,e=n.b;e>t;--e)i=i.b;else for(i=n.a.a,e=0;e<t;++e)i=i.a;return new ZK(n,t,i)}function hpn(){hpn=O,dit=new FS("NUM_OF_EXTERNAL_SIDES_THAN_NUM_OF_EXTENSIONS_LAST",0),wit=new FS("CORNER_CASES_THAN_SINGLE_SIDE_LAST",1)}function fpn(n){var t,e,i;for(m$(e=uCn(n),But),(i=n.d).c=x8(Ant,HWn,1,0,5,1),t=new Wb(e);t.a<t.c.c.length;)gun(i,BB(n0(t),456).b)}function lpn(n){var t,e;for(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),t=(e=n.o).c.Kc();t.e!=t.i.gc();)BB(t.nj(),42).dd();return A8(e)}function bpn(n){var t;LK(BB(mMn(n,(HXn(),ept)),98))&&(fOn((l1(0,(t=n.b).c.length),BB(t.c[0],29))),fOn(BB(xq(t,t.c.length-1),29)))}function wpn(n,t){var i,r,c,a;for(i=0,c=new Wb(t.a);c.a<c.c.c.length;)a=(r=BB(n0(c),10)).o.a+r.d.c+r.d.b+n.j,i=e.Math.max(i,a);return i}function dpn(n){var t,e,i,r;for(r=0,e=0,i=n.length;e<i;e++)b1(e,n.length),(t=n.charCodeAt(e))>=64&&t<128&&(r=i0(r,yz(1,t-64)));return r}function gpn(n,t){var e,i;return i=null,Lx(n,(sWn(),CPt))&&(e=BB(mMn(n,CPt),94)).Xe(t)&&(i=e.We(t)),null==i&&vW(n)&&(i=mMn(vW(n),t)),i}function ppn(n,t){var e,i,r;(i=(r=t.d.i).k)!=(uSn(),Cut)&&i!=Tut&&dAn(e=new oz(ZL(lbn(r).a.Kc(),new h)))&&VW(n.k,t,BB(U5(e),17))}function vpn(n,t){var e,i,r;return i=itn(n.Tg(),t),(e=t-n.Ah())<0?(r=n.Yg(i))>=0?n.lh(r):qIn(n,i):e<0?qIn(n,i):BB(i,66).Nj().Sj(n,n.yh(),e)}function mpn(n){var t;if(cL(n.a,4)){if(null==(t=Jdn(n.a)))throw Hp(new Fy(o5n+n.b+"'. "+r5n+(ED(bAt),bAt.k)+c5n));return t}return n.a}function ypn(n){var t;if(null==n)return null;if(null==(t=UUn(FBn(n,!0))))throw Hp(new ik("Invalid base64Binary value: '"+n+"'"));return t}function kpn(n){var t;try{return t=n.i.Xb(n.e),n.mj(),n.g=n.e++,t}catch(e){throw cL(e=lun(e),73)?(n.mj(),Hp(new yv)):Hp(e)}}function jpn(n){var t;try{return t=n.c.ki(n.e),n.mj(),n.g=n.e++,t}catch(e){throw cL(e=lun(e),73)?(n.mj(),Hp(new yv)):Hp(e)}}function Epn(){Epn=O,sWn(),Ect=TPt,pct=ySt,lct=cSt,vct=XSt,_kn(),kct=Mit,yct=Eit,jct=Pit,mct=jit,Gsn(),wct=oct,bct=uct,dct=hct,gct=fct}function Tpn(n){switch(jM(),this.c=new Np,this.d=n,n.g){case 0:case 2:this.a=QW(hut),this.b=RQn;break;case 3:case 1:this.a=hut,this.b=KQn}}function Mpn(n,t,e){var i;if(n.c)Pen(n.c,n.c.i+t),Cen(n.c,n.c.j+e);else for(i=new Wb(n.b);i.a<i.c.c.length;)Mpn(BB(n0(i),157),t,e)}function Spn(n,t){var e,i;if(n.j.length!=t.j.length)return!1;for(e=0,i=n.j.length;e<i;e++)if(!mK(n.j[e],t.j[e]))return!1;return!0}function Ppn(n,t,e){var i;t.a.length>0&&(WB(n.b,new VB(t.a,e)),0<(i=t.a.length)?t.a=t.a.substr(0,0):0>i&&(t.a+=rL(x8(ONt,WVn,25,-i,15,1))))}function Cpn(n,t){var e,i,r;for(e=n.o,r=BB(BB(h6(n.r,t),21),84).Kc();r.Ob();)(i=BB(r.Pb(),111)).e.a=dyn(i,e.a),i.e.b=e.b*Gy(MD(i.b.We(Lrt)))}function Ipn(n,t){var e,i,r,c;return r=n.k,e=Gy(MD(mMn(n,(hWn(),Tlt)))),c=t.k,i=Gy(MD(mMn(t,Tlt))),c!=(uSn(),Mut)?-1:r!=Mut?1:e==i?0:e<i?-1:1}function Opn(n,t){var e,i;return e=BB(BB(RX(n.g,t.a),46).a,65),i=BB(BB(RX(n.g,t.b),46).a,65),W8(t.a,t.b)-W8(t.a,_$(e.b))-W8(t.b,_$(i.b))}function Apn(n,t){var e;return e=BB(mMn(n,(HXn(),vgt)),74),tL(t,vut)?e?yQ(e):(e=new km,hon(n,vgt,e)):e&&hon(n,vgt,null),e}function $pn(n){var t;return(t=new Ck).a+="n",n.k!=(uSn(),Cut)&&oO(oO((t.a+="(",t),dx(n.k).toLowerCase()),")"),oO((t.a+="_",t),gyn(n)),t.a}function Lpn(n,t){OTn(t,"Self-Loop post-processing",1),JT(AV(AV(wnn(new Rq(null,new w1(n.b,16)),new xi),new Di),new Ri),new Ki),HSn(t)}function Npn(n,t,e,i){var r;return e>=0?n.hh(t,e,i):(n.eh()&&(i=(r=n.Vg())>=0?n.Qg(i):n.eh().ih(n,-1-r,null,i)),n.Sg(t,e,i))}function xpn(n,t){switch(t){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),void sqn(n.e);case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),void sqn(n.d)}Dwn(n,t)}function Dpn(n,t){var e;e=n.Zc(t);try{return e.Pb()}catch(i){throw cL(i=lun(i),109)?Hp(new Ay("Can't get element "+t)):Hp(i)}}function Rpn(n,t){this.e=n,t<XQn?(this.d=1,this.a=Pun(Gk(ANt,1),hQn,25,15,[0|t])):(this.d=2,this.a=Pun(Gk(ANt,1),hQn,25,15,[t%XQn|0,t/XQn|0]))}function Kpn(n,t){var e,i,r,c;for(SQ(),e=n,c=t,cL(n,21)&&!cL(t,21)&&(e=t,c=n),r=e.Kc();r.Ob();)if(i=r.Pb(),c.Hc(i))return!1;return!0}function _pn(n,t,e){var i,r,c,a;return-1!=(i=n.Xc(t))&&(n.ej()?(c=n.fj(),a=Lyn(n,i),r=n.Zi(4,a,null,i,c),e?e.Ei(r):e=r):Lyn(n,i)),e}function Fpn(n,t,e){var i,r,c,a;return-1!=(i=n.Xc(t))&&(n.ej()?(c=n.fj(),a=wq(n,i),r=n.Zi(4,a,null,i,c),e?e.Ei(r):e=r):wq(n,i)),e}function Bpn(n,t){var e;switch(e=BB(oV(n.b,t),124).n,t.g){case 1:n.t>=0&&(e.d=n.t);break;case 3:n.t>=0&&(e.a=n.t)}n.C&&(e.b=n.C.b,e.c=n.C.c)}function Hpn(){Hpn=O,Brt=new _S(mJn,0),Frt=new _S(yJn,1),Hrt=new _S(kJn,2),qrt=new _S(jJn,3),Brt.a=!1,Frt.a=!0,Hrt.a=!1,qrt.a=!0}function qpn(){qpn=O,Zrt=new KS(mJn,0),Jrt=new KS(yJn,1),nct=new KS(kJn,2),tct=new KS(jJn,3),Zrt.a=!1,Jrt.a=!0,nct.a=!1,tct.a=!0}function Gpn(n){var t;t=n.a;do{(t=BB(U5(new oz(ZL(fbn(t).a.Kc(),new h))),17).c.i).k==(uSn(),Put)&&n.b.Fc(t)}while(t.k==(uSn(),Put));n.b=ean(n.b)}function zpn(n){var t,e,i;for(i=n.c.a,n.p=(yX(i),new t_(i)),e=new Wb(i);e.a<e.c.c.length;)(t=BB(n0(e),10)).p=hCn(t).a;SQ(),m$(n.p,new Oc)}function Upn(n){var t,e,i;if(e=0,0==(i=wDn(n)).c.length)return 1;for(t=new Wb(i);t.a<t.c.c.length;)e+=Upn(BB(n0(t),33));return e}function Xpn(n,t){var e,i,r;for(r=0,i=BB(BB(h6(n.r,t),21),84).Kc();i.Ob();)r+=(e=BB(i.Pb(),111)).d.b+e.b.rf().a+e.d.c,i.Ob()&&(r+=n.w);return r}function Wpn(n,t){var e,i,r;for(r=0,i=BB(BB(h6(n.r,t),21),84).Kc();i.Ob();)r+=(e=BB(i.Pb(),111)).d.d+e.b.rf().b+e.d.a,i.Ob()&&(r+=n.w);return r}function Vpn(n,t,e,i){if(t.a<i.a)return!0;if(t.a==i.a){if(t.b<i.b)return!0;if(t.b==i.b&&n.b>e.b)return!0}return!1}function Qpn(n,t){return XI(n)?!!OWn[t]:n.hm?!!n.hm[t]:UI(n)?!!IWn[t]:!!zI(n)&&!!CWn[t]}function Ypn(n,t,e){return null==e?(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),Wdn(n.o,t)):(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),vjn(n.o,t,e)),n}function Jpn(n,t,e,i){var r;(r=Xfn(t.Xe((sWn(),DSt))?BB(t.We(DSt),21):n.j))!=(dWn(),Irt)&&(e&&!agn(r)||USn(N$n(n,r,i),t))}function Zpn(n,t,e,i){var r,c,a;return c=itn(n.Tg(),t),(r=t-n.Ah())<0?(a=n.Yg(c))>=0?n._g(a,e,!0):cOn(n,c,e):BB(c,66).Nj().Pj(n,n.yh(),r,e,i)}function nvn(n,t,e,i){var r,c;e.mh(t)&&(ZM(),hnn(t)?ygn(n,BB(e.ah(t),153)):(r=(c=t)?BB(i,49).xh(c):null)&&_p(e.ah(t),r))}function tvn(n){switch(n.g){case 1:return Dan(),Rrt;case 3:return Dan(),Nrt;case 2:return Dan(),Drt;case 4:return Dan(),xrt;default:return null}}function evn(n){switch(typeof n){case NWn:return vvn(n);case LWn:return CJ(n);case $Wn:return hN(),n?1231:1237;default:return null==n?0:PN(n)}}function ivn(n,t,e){if(n.e)switch(n.b){case 1:BQ(n.c,t,e);break;case 0:HQ(n.c,t,e)}else t4(n.c,t,e);n.a[t.p][e.p]=n.c.i,n.a[e.p][t.p]=n.c.e}function rvn(n){var t,e;if(null==n)return null;for(e=x8(Out,sVn,193,n.length,0,2),t=0;t<e.length;t++)e[t]=BB(G9(n[t],n[t].length),193);return e}function cvn(n){var t;if(Ksn(n))return mz(n),n.Lk()&&(t=FIn(n.e,n.b,n.c,n.a,n.j),n.j=t),n.g=n.a,++n.a,++n.c,n.i=0,n.j;throw Hp(new yv)}function avn(n,t){var e,i,r,c;return(c=n.o)<(e=n.p)?c*=c:e*=e,i=c+e,(c=t.o)<(e=t.p)?c*=c:e*=e,i<(r=c+e)?-1:i==r?0:1}function uvn(n,t){var e,i;if((i=Wyn(n,t))>=0)return i;if(n.Fk())for(e=0;e<n.i;++e)if(GI(n.Gk(BB(n.g[e],56)))===GI(t))return e;return-1}function ovn(n,t,e){var i,r;if(t>=(r=n.gc()))throw Hp(new tK(t,r));if(n.hi()&&(i=n.Xc(e))>=0&&i!=t)throw Hp(new _y(a8n));return n.mi(t,e)}function svn(n,t){if(this.a=BB(yX(n),245),this.b=BB(yX(t),245),n.vd(t)>0||n==(ey(),Knt)||t==(ty(),_nt))throw Hp(new _y("Invalid range: "+B3(n,t)))}function hvn(n){var t,e;for(this.b=new Np,this.c=n,this.a=!1,e=new Wb(n.a);e.a<e.c.c.length;)t=BB(n0(e),10),this.a=this.a|t.k==(uSn(),Cut)}function fvn(n,t){var e,i,r;for(e=AN(new qv,n),r=new Wb(t);r.a<r.c.c.length;)i=BB(n0(r),121),UNn(aM(cM(uM(rM(new Hv,0),0),e),i));return e}function lvn(n,t,e){var i,r,c;for(r=new oz(ZL((t?fbn(n):lbn(n)).a.Kc(),new h));dAn(r);)i=BB(U5(r),17),(c=t?i.c.i:i.d.i).k==(uSn(),Sut)&&PZ(c,e)}function bvn(){bvn=O,lvt=new _P(QZn,0),bvt=new _P("PORT_POSITION",1),fvt=new _P("NODE_SIZE_WHERE_SPACE_PERMITS",2),hvt=new _P("NODE_SIZE",3)}function wvn(){wvn=O,CMt=new DC("AUTOMATIC",0),AMt=new DC(cJn,1),$Mt=new DC(aJn,2),LMt=new DC("TOP",3),IMt=new DC(oJn,4),OMt=new DC(eJn,5)}function dvn(n,t,e,i){var r,c;for($On(),r=0,c=0;c<e;c++)r=rbn(cbn(e0(t[c],UQn),e0(i,UQn)),e0(dG(r),UQn)),n[c]=dG(r),r=jz(r,32);return dG(r)}function gvn(n,t,i){var r,c;for(c=0,r=0;r<Zit;r++)c=e.Math.max(c,vhn(n.a[t.g][r],i));return t==(Dtn(),zit)&&n.b&&(c=e.Math.max(c,n.b.b)),c}function pvn(n,t){var e,i;if(Tx(t>0),(t&-t)==t)return CJ(t*H$n(n,31)*4.656612873077393e-10);do{i=(e=H$n(n,31))%t}while(e-i+(t-1)<0);return CJ(i)}function vvn(n){var t,e,i;return r_(),null!=(i=rit[e=":"+n])?CJ((kW(i),i)):(t=null==(i=iit[e])?JNn(n):CJ((kW(i),i)),IQ(),rit[e]=t,t)}function mvn(n,t,e){OTn(e,"Compound graph preprocessor",1),n.a=new pJ,Nzn(n,t,null),GHn(n,t),tNn(n),hon(t,(hWn(),Hft),n.a),n.a=null,$U(n.b),HSn(e)}function yvn(n,t,e){switch(e.g){case 1:n.a=t.a/2,n.b=0;break;case 2:n.a=t.a,n.b=t.b/2;break;case 3:n.a=t.a/2,n.b=t.b;break;case 4:n.a=0,n.b=t.b/2}}function kvn(n){var t,e,i;for(i=BB(h6(n.a,(LEn(),Pst)),15).Kc();i.Ob();)iX(n,e=BB(i.Pb(),101),(t=Hyn(e))[0],(Crn(),xst),0),iX(n,e,t[1],Rst,1)}function jvn(n){var t,e,i;for(i=BB(h6(n.a,(LEn(),Cst)),15).Kc();i.Ob();)iX(n,e=BB(i.Pb(),101),(t=Hyn(e))[0],(Crn(),xst),0),iX(n,e,t[1],Rst,1)}function Evn(n){switch(n.g){case 0:return null;case 1:return new Arn;case 2:return new Jm;default:throw Hp(new _y(c4n+(null!=n.f?n.f:""+n.g)))}}function Tvn(n,t,e){var i,r;for(mun(n,t-n.s,e-n.t),r=new Wb(n.n);r.a<r.c.c.length;)rb(i=BB(n0(r),211),i.e+t-n.s),cb(i,i.f+e-n.t);n.s=t,n.t=e}function Mvn(n){var t,e,i,r;for(e=0,i=new Wb(n.a);i.a<i.c.c.length;)BB(n0(i),121).d=e++;return r=null,(t=wSn(n)).c.length>1&&(r=fvn(n,t)),r}function Svn(n){var t;return n.f&&n.f.kh()&&(t=BB(n.f,49),n.f=BB(tfn(n,t),82),n.f!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,8,t,n.f))),n.f}function Pvn(n){var t;return n.i&&n.i.kh()&&(t=BB(n.i,49),n.i=BB(tfn(n,t),82),n.i!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,7,t,n.i))),n.i}function Cvn(n){var t;return n.b&&0!=(64&n.b.Db)&&(t=n.b,n.b=BB(tfn(n,t),18),n.b!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,21,t,n.b))),n.b}function Ivn(n,t){var e,i,r;null==n.d?(++n.e,++n.f):(i=t.Sh(),fNn(n,n.f+1),r=(i&DWn)%n.d.length,!(e=n.d[r])&&(e=n.d[r]=n.uj()),e.Fc(t),++n.f)}function Ovn(n,t,e){var i;return!t.Kj()&&(-2!=t.Zj()?null==(i=t.zj())?null==e:Nfn(i,e):t.Hj()==n.e.Tg()&&null==e)}function Avn(){var n;lin(16,IVn),n=Jin(16),this.b=x8(Gnt,CVn,317,n,0,1),this.c=x8(Gnt,CVn,317,n,0,1),this.a=null,this.e=null,this.i=0,this.f=n-1,this.g=0}function $vn(n){LR.call(this),this.k=(uSn(),Cut),this.j=(lin(6,AVn),new J6(6)),this.b=(lin(2,AVn),new J6(2)),this.d=new fm,this.f=new wm,this.a=n}function Lvn(n){var t,e;n.c.length<=1||(dPn(n,BB((t=EDn(n,(kUn(),SIt))).a,19).a,BB(t.b,19).a),dPn(n,BB((e=EDn(n,CIt)).a,19).a,BB(e.b,19).a))}function Nvn(){Nvn=O,yvt=new FP("SIMPLE",0),pvt=new FP(B1n,1),vvt=new FP("LINEAR_SEGMENTS",2),gvt=new FP("BRANDES_KOEPF",3),mvt=new FP(j3n,4)}function xvn(n,t,e){LK(BB(mMn(t,(HXn(),ept)),98))||(W7(n,t,DSn(t,e)),W7(n,t,DSn(t,(kUn(),SIt))),W7(n,t,DSn(t,sIt)),SQ(),m$(t.j,new _d(n)))}function Dvn(n,t,e,i){var r;for(r=BB(h6(i?n.a:n.b,t),21).Kc();r.Ob();)if(_Dn(n,e,BB(r.Pb(),33)))return!0;return!1}function Rvn(n){var t,e;for(e=new AL(n);e.e!=e.i.gc();)if((t=BB(kpn(e),87)).e||0!=(!t.d&&(t.d=new $L(VAt,t,1)),t.d).i)return!0;return!1}function Kvn(n){var t,e;for(e=new AL(n);e.e!=e.i.gc();)if((t=BB(kpn(e),87)).e||0!=(!t.d&&(t.d=new $L(VAt,t,1)),t.d).i)return!0;return!1}function _vn(n){var t,e;for(t=0,e=new Wb(n.c.a);e.a<e.c.c.length;)t+=F3(new oz(ZL(lbn(BB(n0(e),10)).a.Kc(),new h)));return t/n.c.a.c.length}function Fvn(n){var t,e;for(n.c||zqn(n),e=new km,n0(t=new Wb(n.a));t.a<t.c.c.length;)DH(e,BB(n0(t),407).a);return Px(0!=e.b),Atn(e,e.c.b),e}function Bvn(){Bvn=O,bRn(),qTt=RTt,BTt=new WA(8),new XA((sWn(),XSt),BTt),new XA(LPt,8),HTt=xTt,_Tt=MTt,FTt=STt,KTt=new XA(lSt,(hN(),!1))}function Hvn(n,t,e,i){switch(t){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e;case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d}return Rbn(n,t,e,i)}function qvn(n){var t;return n.a&&n.a.kh()&&(t=BB(n.a,49),n.a=BB(tfn(n,t),138),n.a!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,5,t,n.a))),n.a}function Gvn(n){return n<48||n>102?-1:n<=57?n-48:n<65?-1:n<=70?n-65+10:n<97?-1:n-97+10}function zvn(n,t){if(null==n)throw Hp(new Hy("null key in entry: null="+t));if(null==t)throw Hp(new Hy("null value in entry: "+n+"=null"))}function Uvn(n,t){for(var e,i;n.Ob();){if(!t.Ob())return!1;if(e=n.Pb(),i=t.Pb(),!(GI(e)===GI(i)||null!=e&&Nfn(e,i)))return!1}return!t.Ob()}function Xvn(n,t){var i;return i=Pun(Gk(xNt,1),qQn,25,15,[vhn(n.a[0],t),vhn(n.a[1],t),vhn(n.a[2],t)]),n.d&&(i[0]=e.Math.max(i[0],i[2]),i[2]=i[0]),i}function Wvn(n,t){var i;return i=Pun(Gk(xNt,1),qQn,25,15,[mhn(n.a[0],t),mhn(n.a[1],t),mhn(n.a[2],t)]),n.d&&(i[0]=e.Math.max(i[0],i[2]),i[2]=i[0]),i}function Vvn(){Vvn=O,yht=new SP("GREEDY",0),mht=new SP(H1n,1),jht=new SP(B1n,2),Eht=new SP("MODEL_ORDER",3),kht=new SP("GREEDY_MODEL_ORDER",4)}function Qvn(n,t){var e,i,r;for(n.b[t.g]=1,i=spn(t.d,0);i.b!=i.d.c;)r=(e=BB(b3(i),188)).c,1==n.b[r.g]?DH(n.a,e):2==n.b[r.g]?n.b[r.g]=1:Qvn(n,r)}function Yvn(n,t){var e,i,r;for(r=new J6(t.gc()),i=t.Kc();i.Ob();)(e=BB(i.Pb(),286)).c==e.f?hPn(n,e,e.c):rPn(n,e)||(r.c[r.c.length]=e);return r}function Jvn(n,t,e){var i,r,c,a;for(a=n.r+t,n.r+=t,n.d+=e,i=e/n.n.c.length,r=0,c=new Wb(n.n);c.a<c.c.c.length;)w$n(BB(n0(c),211),a,i,r),++r}function Zvn(n){var t,e;for(my(n.b.a),n.a=x8(bit,HWn,57,n.c.c.a.b.c.length,0,1),t=0,e=new Wb(n.c.c.a.b);e.a<e.c.c.length;)BB(n0(e),57).f=t++}function nmn(n){var t,e;for(my(n.b.a),n.a=x8(Qat,HWn,81,n.c.a.a.b.c.length,0,1),t=0,e=new Wb(n.c.a.a.b);e.a<e.c.c.length;)BB(n0(e),81).i=t++}function tmn(n,t,e){OTn(e,"Shrinking tree compaction",1),qy(TD(mMn(t,(Xcn(),Qrt))))?(irn(n,t.f),unn(t.f,t.c)):unn(t.f,t.c),HSn(e)}function emn(n){var t;if(t=bhn(n),!dAn(n))throw Hp(new Ay("position (0) must be less than the number of elements that remained ("+t+")"));return U5(n)}function imn(n,t,e){try{return vmn(n,t+n.j,e+n.k)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function rmn(n,t,e){try{return mmn(n,t+n.j,e+n.k)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function cmn(n,t,e){try{return ymn(n,t+n.j,e+n.k)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function amn(n){switch(n.g){case 1:return kUn(),CIt;case 4:return kUn(),sIt;case 3:return kUn(),oIt;case 2:return kUn(),SIt;default:return kUn(),PIt}}function umn(n,t,e){t.k==(uSn(),Cut)&&e.k==Put&&(n.d=Efn(t,(kUn(),SIt)),n.b=Efn(t,sIt)),e.k==Cut&&t.k==Put&&(n.d=Efn(e,(kUn(),sIt)),n.b=Efn(e,SIt))}function omn(n,t){var e,i;for(i=abn(n,t).Kc();i.Ob();)if(null!=mMn(e=BB(i.Pb(),11),(hWn(),Elt))||zN(new m6(e.b)))return!0;return!1}function smn(n,t){return Pen(t,n.e+n.d+(0==n.c.c.length?0:n.b)),Cen(t,n.f),n.a=e.Math.max(n.a,t.f),n.d+=t.g+(0==n.c.c.length?0:n.b),WB(n.c,t),!0}function hmn(n,t,e){var i,r,c,a;for(a=0,i=e/n.a.c.length,c=new Wb(n.a);c.a<c.c.c.length;)Tvn(r=BB(n0(c),187),r.s,r.t+a*i),Jvn(r,n.d-r.r+t,i),++a}function fmn(n){var t,e,i;for(e=new Wb(n.b);e.a<e.c.c.length;)for(t=0,i=new Wb(BB(n0(e),29).a);i.a<i.c.c.length;)BB(n0(i),10).p=t++}function lmn(n,t){var e,i,r,c,a,u;for(r=t.length-1,a=0,u=0,i=0;i<=r;i++)c=t[i],e=pSn(r,i)*efn(1-n,r-i)*efn(n,i),a+=c.a*e,u+=c.b*e;return new xC(a,u)}function bmn(n,t){var e,i,r,c,a;for(e=t.gc(),n.qi(n.i+e),c=t.Kc(),a=n.i,n.i+=e,i=a;i<n.i;++i)r=c.Pb(),jL(n,i,n.oi(i,r)),n.bi(i,r),n.ci();return 0!=e}function wmn(n,t,e){var i,r,c;return n.ej()?(i=n.Vi(),c=n.fj(),++n.j,n.Hi(i,n.oi(i,t)),r=n.Zi(3,null,t,i,c),e?e.Ei(r):e=r):ZD(n,n.Vi(),t),e}function dmn(n,t,e){var i,r,c;return(0!=(64&(c=cL(r=(i=BB(Wtn(a4(n.a),t),87)).c,88)?BB(r,26):(gWn(),d$t)).Db)?tfn(n.b,c):c)==e?lFn(i):cen(i,e),c}function gmn(n,t,e,i,r,c,a,u){var o,s;i&&((o=i.a[0])&&gmn(n,t,e,o,r,c,a,u),Iyn(n,e,i.d,r,c,a,u)&&t.Fc(i),(s=i.a[1])&&gmn(n,t,e,s,r,c,a,u))}function pmn(n,t){var e;return n.a||(e=x8(xNt,qQn,25,0,15,1),gE(n.b.a,new bw(e)),e.sort(ien(T.prototype.te,T,[])),n.a=new _K(e,n.d)),K6(n.a,t)}function vmn(n,t,e){try{return QI(trn(n,t,e),1)}catch(i){throw cL(i=lun(i),320)?Hp(new Ay(MJn+n.o+"*"+n.p+SJn+t+FWn+e+PJn)):Hp(i)}}function mmn(n,t,e){try{return QI(trn(n,t,e),0)}catch(i){throw cL(i=lun(i),320)?Hp(new Ay(MJn+n.o+"*"+n.p+SJn+t+FWn+e+PJn)):Hp(i)}}function ymn(n,t,e){try{return QI(trn(n,t,e),2)}catch(i){throw cL(i=lun(i),320)?Hp(new Ay(MJn+n.o+"*"+n.p+SJn+t+FWn+e+PJn)):Hp(i)}}function kmn(n,t){if(-1==n.g)throw Hp(new dv);n.mj();try{n.d._c(n.g,t),n.f=n.d.j}catch(e){throw cL(e=lun(e),73)?Hp(new vv):Hp(e)}}function jmn(n,t,e){OTn(e,"Linear segments node placement",1),n.b=BB(mMn(t,(hWn(),Alt)),304),VXn(n,t),vHn(n,t),QHn(n,t),hXn(n),n.a=null,n.b=null,HSn(e)}function Emn(n,t){var e,i,r,c;for(c=n.gc(),t.length<c&&(t=qk(new Array(c),t)),r=t,i=n.Kc(),e=0;e<c;++e)$X(r,e,i.Pb());return t.length>c&&$X(t,c,null),t}function Tmn(n,t){var e,i;if(i=n.gc(),null==t){for(e=0;e<i;e++)if(null==n.Xb(e))return e}else for(e=0;e<i;e++)if(Nfn(t,n.Xb(e)))return e;return-1}function Mmn(n,t){var e,i,r;return e=t.cd(),r=t.dd(),i=n.xc(e),!(!(GI(r)===GI(i)||null!=r&&Nfn(r,i))||null==i&&!n._b(e))}function Smn(n,t){var e,i,r;return t<=22?(e=n.l&(1<<t)-1,i=r=0):t<=44?(e=n.l,i=n.m&(1<<t-22)-1,r=0):(e=n.l,i=n.m,r=n.h&(1<<t-44)-1),M$(e,i,r)}function Pmn(n,t){switch(t.g){case 1:return n.f.n.d+n.t;case 3:return n.f.n.a+n.t;case 2:return n.f.n.c+n.s;case 4:return n.f.n.b+n.s;default:return 0}}function Cmn(n,t){var e,i;switch(i=t.c,e=t.a,n.b.g){case 0:e.d=n.e-i.a-i.d;break;case 1:e.d+=n.e;break;case 2:e.c=n.e-i.a-i.d;break;case 3:e.c=n.e+i.d}}function Imn(n,t,e,i){var r,c;this.a=t,this.c=i,$l(this,new xC(-(r=n.a).c,-r.d)),UR(this.b,e),c=i/2,t.a?Bx(this.b,0,c):Bx(this.b,c,0),WB(n.c,this)}function Omn(){Omn=O,qjt=new mC(QZn,0),Bjt=new mC(q1n,1),Hjt=new mC("EDGE_LENGTH_BY_POSITION",2),Fjt=new mC("CROSSING_MINIMIZATION_BY_POSITION",3)}function Amn(n,t){var e,i;if(e=BB(sen(n.g,t),33))return e;if(i=BB(sen(n.j,t),118))return i;throw Hp(new ek("Referenced shape does not exist: "+t))}function $mn(n,t){if(n.c==t)return n.d;if(n.d==t)return n.c;throw Hp(new _y("Node 'one' must be either source or target of edge 'edge'."))}function Lmn(n,t){if(n.c.i==t)return n.d.i;if(n.d.i==t)return n.c.i;throw Hp(new _y("Node "+t+" is neither source nor target of edge "+n))}function Nmn(n,t){var e;switch(t.g){case 2:case 4:e=n.a,n.c.d.n.b<e.d.n.b&&(e=n.c),bU(n,t,(Oun(),kst),e);break;case 1:case 3:bU(n,t,(Oun(),vst),null)}}function xmn(n,t,e,i,r,c){var a,u,o,s,h;for(a=ijn(t,e,c),u=e==(kUn(),sIt)||e==CIt?-1:1,s=n[e.g],h=0;h<s.length;h++)(o=s[h])>0&&(o+=r),s[h]=a,a+=u*(o+i)}function Dmn(n){var t,e,i;for(i=n.f,n.n=x8(xNt,qQn,25,i,15,1),n.d=x8(xNt,qQn,25,i,15,1),t=0;t<i;t++)e=BB(xq(n.c.b,t),29),n.n[t]=wpn(n,e),n.d[t]=VLn(n,e)}function Rmn(n,t){var e,i,r;for(r=0,i=2;i<t;i<<=1)0!=(n.Db&i)&&++r;if(0==r){for(e=t<<=1;e<=128;e<<=1)if(0!=(n.Db&e))return 0;return-1}return r}function Kmn(n,t){var e,i,r,c,a;for(a=axn(n.e.Tg(),t),c=null,e=BB(n.g,119),r=0;r<n.i;++r)i=e[r],a.rl(i.ak())&&(!c&&(c=new go),f9(c,i));c&&aXn(n,c)}function _mn(n){var t,e;if(!n)return null;if(n.dc())return"";for(e=new Sk,t=n.Kc();t.Ob();)cO(e,SD(t.Pb())),e.a+=" ";return KO(e,e.a.length-1)}function Fmn(n,t,e){var i,r,c,a;for(con(n),null==n.k&&(n.k=x8(Jnt,sVn,78,0,0,1)),r=0,c=(i=n.k).length;r<c;++r)Fmn(i[r],t,"\t"+e);(a=n.f)&&Fmn(a,t,e)}function Bmn(n,t){var e,i=new Array(t);switch(n){case 14:case 15:e=0;break;case 16:e=!1;break;default:return i}for(var r=0;r<t;++r)i[r]=e;return i}function Hmn(n){var t;for(t=new Wb(n.a.b);t.a<t.c.c.length;)BB(n0(t),57).c.$b();Otn(dA(n.d)?n.a.c:n.a.d,new Mw(n)),n.c.Me(n),_xn(n)}function qmn(n){var t,e,i;for(e=new Wb(n.e.c);e.a<e.c.c.length;){for(i=new Wb((t=BB(n0(e),282)).b);i.a<i.c.c.length;)_Bn(BB(n0(i),447));BCn(t)}}function Gmn(n){var t,i,r,c,a;for(r=0,a=0,c=0,i=new Wb(n.a);i.a<i.c.c.length;)t=BB(n0(i),187),a=e.Math.max(a,t.r),r+=t.d+(c>0?n.c:0),++c;n.b=r,n.d=a}function zmn(n,t){var i,r,c,a,u;for(r=0,c=0,i=0,u=new Wb(t);u.a<u.c.c.length;)a=BB(n0(u),200),r=e.Math.max(r,a.e),c+=a.b+(i>0?n.g:0),++i;n.c=c,n.d=r}function Umn(n,t){var i;return i=Pun(Gk(xNt,1),qQn,25,15,[gvn(n,(Dtn(),Git),t),gvn(n,zit,t),gvn(n,Uit,t)]),n.f&&(i[0]=e.Math.max(i[0],i[2]),i[2]=i[0]),i}function Xmn(n,t,e){try{FRn(n,t+n.j,e+n.k,!1,!0)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function Wmn(n,t,e){try{FRn(n,t+n.j,e+n.k,!0,!1)}catch(i){throw cL(i=lun(i),73)?Hp(new Ay(i.g+CJn+t+FWn+e+").")):Hp(i)}}function Vmn(n){var t;Lx(n,(HXn(),$gt))&&((t=BB(mMn(n,$gt),21)).Hc((n$n(),ICt))?(t.Mc(ICt),t.Fc(ACt)):t.Hc(ACt)&&(t.Mc(ACt),t.Fc(ICt)))}function Qmn(n){var t;Lx(n,(HXn(),$gt))&&((t=BB(mMn(n,$gt),21)).Hc((n$n(),DCt))?(t.Mc(DCt),t.Fc(NCt)):t.Hc(NCt)&&(t.Mc(NCt),t.Fc(DCt)))}function Ymn(n,t,e){OTn(e,"Self-Loop ordering",1),JT($V(AV(AV(wnn(new Rq(null,new w1(t.b,16)),new Ii),new Oi),new Ai),new $i),new bd(n)),HSn(e)}function Jmn(n,t,e,i){var r,c;for(r=t;r<n.c.length;r++){if(l1(r,n.c.length),c=BB(n.c[r],11),!e.Mb(c))return r;i.c[i.c.length]=c}return n.c.length}function Zmn(n,t,e,i){var r,c,a;return null==n.a&&dSn(n,t),a=t.b.j.c.length,c=e.d.p,(r=i.d.p-1)<0&&(r=a-1),c<=r?n.a[r]-n.a[c]:n.a[a-1]-n.a[c]+n.a[r]}function nyn(n){var t,e;if(!n.b)for(n.b=C2(BB(n.f,33).Ag().i),e=new AL(BB(n.f,33).Ag());e.e!=e.i.gc();)t=BB(kpn(e),137),WB(n.b,new Ry(t));return n.b}function tyn(n){var t,e;if(!n.e)for(n.e=C2(yV(BB(n.f,33)).i),e=new AL(yV(BB(n.f,33)));e.e!=e.i.gc();)t=BB(kpn(e),118),WB(n.e,new op(t));return n.e}function eyn(n){var t,e;if(!n.a)for(n.a=C2(YQ(BB(n.f,33)).i),e=new AL(YQ(BB(n.f,33)));e.e!=e.i.gc();)t=BB(kpn(e),33),WB(n.a,new JN(n,t));return n.a}function iyn(n){var t;if(!n.C&&(null!=n.D||null!=n.B))if(t=bzn(n))n.yk(t);else try{n.yk(null)}catch(e){if(!cL(e=lun(e),60))throw Hp(e)}return n.C}function ryn(n){switch(n.q.g){case 5:kjn(n,(kUn(),sIt)),kjn(n,SIt);break;case 4:cGn(n,(kUn(),sIt)),cGn(n,SIt);break;default:FPn(n,(kUn(),sIt)),FPn(n,SIt)}}function cyn(n){switch(n.q.g){case 5:jjn(n,(kUn(),oIt)),jjn(n,CIt);break;case 4:aGn(n,(kUn(),oIt)),aGn(n,CIt);break;default:BPn(n,(kUn(),oIt)),BPn(n,CIt)}}function ayn(n,t){var i,r,c;for(c=new Gj,r=n.Kc();r.Ob();)ZRn(i=BB(r.Pb(),37),c.a,0),c.a+=i.f.a+t,c.b=e.Math.max(c.b,i.f.b);return c.b>0&&(c.b+=t),c}function uyn(n,t){var i,r,c;for(c=new Gj,r=n.Kc();r.Ob();)ZRn(i=BB(r.Pb(),37),0,c.b),c.b+=i.f.b+t,c.a=e.Math.max(c.a,i.f.a);return c.a>0&&(c.a+=t),c}function oyn(n){var t,i,r;for(r=DWn,i=new Wb(n.a);i.a<i.c.c.length;)Lx(t=BB(n0(i),10),(hWn(),wlt))&&(r=e.Math.min(r,BB(mMn(t,wlt),19).a));return r}function syn(n,t){var e,i;if(0==t.length)return 0;for(e=ZX(n.a,t[0],(kUn(),CIt)),e+=ZX(n.a,t[t.length-1],oIt),i=0;i<t.length;i++)e+=qMn(n,i,t);return e}function hyn(){gxn(),this.c=new Np,this.i=new Np,this.e=new fA,this.f=new fA,this.g=new fA,this.j=new Np,this.a=new Np,this.b=new xp,this.k=new xp}function fyn(n,t){var e;return n.Db>>16==6?n.Cb.ih(n,5,GOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||n.zh(),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function lyn(n){PY();var t=n.e;if(t&&t.stack){var e=t.stack,i=t+"\n";return e.substring(0,i.length)==i&&(e=e.substring(i.length)),e.split("\n")}return[]}function byn(n){var t;return Min(),(t=Ott)[n>>>28]|t[n>>24&15]<<4|t[n>>20&15]<<8|t[n>>16&15]<<12|t[n>>12&15]<<16|t[n>>8&15]<<20|t[n>>4&15]<<24|t[15&n]<<28}function wyn(n){var t,i,r;n.b==n.c&&(r=n.a.length,i=kon(e.Math.max(8,r))<<1,0!=n.b?(urn(n,t=SR(n.a,i),r),n.a=t,n.b=0):Pv(n.a,i),n.c=r)}function dyn(n,t){var e;return(e=n.b).Xe((sWn(),aPt))?e.Hf()==(kUn(),CIt)?-e.rf().a-Gy(MD(e.We(aPt))):t+Gy(MD(e.We(aPt))):e.Hf()==(kUn(),CIt)?-e.rf().a:t}function gyn(n){var t;return 0!=n.b.c.length&&BB(xq(n.b,0),70).a?BB(xq(n.b,0),70).a:null!=(t=eQ(n))?t:""+(n.c?E7(n.c.a,n,0):-1)}function pyn(n){var t;return 0!=n.f.c.length&&BB(xq(n.f,0),70).a?BB(xq(n.f,0),70).a:null!=(t=eQ(n))?t:""+(n.i?E7(n.i.j,n,0):-1)}function vyn(n,t){var e,i;if(t<0||t>=n.gc())return null;for(e=t;e<n.gc();++e)if(i=BB(n.Xb(e),128),e==n.gc()-1||!i.o)return new rI(iln(e),i);return null}function myn(n,t,e){var i,r,c,a;for(c=n.c,i=e?n:t,r=(e?t:n).p+1;r<i.p;++r)if((a=BB(xq(c.a,r),10)).k!=(uSn(),Tut)&&!Lkn(a))return!1;return!0}function yyn(n){var t,i,r,c,a;for(a=0,c=KQn,r=0,i=new Wb(n.a);i.a<i.c.c.length;)a+=(t=BB(n0(i),187)).r+(r>0?n.c:0),c=e.Math.max(c,t.d),++r;n.e=a,n.b=c}function kyn(n){var t,e;if(!n.b)for(n.b=C2(BB(n.f,118).Ag().i),e=new AL(BB(n.f,118).Ag());e.e!=e.i.gc();)t=BB(kpn(e),137),WB(n.b,new Ry(t));return n.b}function jyn(n,t){var e,i,r;if(t.dc())return dD(),dD(),pAt;for(e=new aR(n,t.gc()),r=new AL(n);r.e!=r.i.gc();)i=kpn(r),t.Hc(i)&&f9(e,i);return e}function Eyn(n,t,e,i){return 0==t?i?(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),n.o):(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),A8(n.o)):Zpn(n,t,e,i)}function Tyn(n){var t,e;if(n.rb)for(t=0,e=n.rb.i;t<e;++t)vx(Wtn(n.rb,t));if(n.vb)for(t=0,e=n.vb.i;t<e;++t)vx(Wtn(n.vb,t));az((IPn(),Z$t),n),n.Bb|=1}function Myn(n,t,e,i,r,c,a,u,o,s,h,f,l,b){return bCn(n,t,i,null,r,c,a,u,o,s,l,!0,b),zln(n,h),cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),2),e&&rrn(n,e),Uln(n,f),n}function Syn(n){var t;if(null==n)return null;t=0;try{t=l_n(n,_Vn,DWn)&QVn}catch(e){if(!cL(e=lun(e),127))throw Hp(e);t=V7(n)[0]}return fun(t)}function Pyn(n){var t;if(null==n)return null;t=0;try{t=l_n(n,_Vn,DWn)&QVn}catch(e){if(!cL(e=lun(e),127))throw Hp(e);t=V7(n)[0]}return fun(t)}function Cyn(n,t){var e,i,r;return!((r=n.h-t.h)<0||(e=n.l-t.l,(r+=(i=n.m-t.m+(e>>22))>>22)<0||(n.l=e&SQn,n.m=i&SQn,n.h=r&PQn,0)))}function Iyn(n,t,e,i,r,c,a){var u,o;return!(t.Ae()&&(o=n.a.ue(e,i),o<0||!r&&0==o)||t.Be()&&(u=n.a.ue(e,c),u>0||!a&&0==u))}function Oyn(n,t){if(zsn(),0!=n.j.g-t.j.g)return 0;switch(n.j.g){case 2:return jbn(t,bst)-jbn(n,bst);case 4:return jbn(n,lst)-jbn(t,lst)}return 0}function Ayn(n){switch(n.g){case 0:return xht;case 1:return Dht;case 2:return Rht;case 3:return Kht;case 4:return _ht;case 5:return Fht;default:return null}}function $yn(n,t,e){var i,r;return Ihn(r=new Lm,t),Nrn(r,e),f9((!n.c&&(n.c=new eU(YAt,n,12,10)),n.c),r),Len(i=r,0),Nen(i,1),nln(i,!0),Yfn(i,!0),i}function Lyn(n,t){var e,i;if(t>=n.i)throw Hp(new LO(t,n.i));return++n.j,e=n.g[t],(i=n.i-t-1)>0&&aHn(n.g,t+1,n.g,t,i),$X(n.g,--n.i,null),n.fi(t,e),n.ci(),e}function Nyn(n,t){var e;return n.Db>>16==17?n.Cb.ih(n,21,qAt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||n.zh(),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function xyn(n){var t,e,i;for(SQ(),m$(n.c,n.a),i=new Wb(n.c);i.a<i.c.c.length;)for(e=n0(i),t=new Wb(n.b);t.a<t.c.c.length;)BB(n0(t),679).Ke(e)}function Dyn(n){var t,e,i;for(SQ(),m$(n.c,n.a),i=new Wb(n.c);i.a<i.c.c.length;)for(e=n0(i),t=new Wb(n.b);t.a<t.c.c.length;)BB(n0(t),369).Ke(e)}function Ryn(n){var t,e,i,r,c;for(r=DWn,c=null,i=new Wb(n.d);i.a<i.c.c.length;)(e=BB(n0(i),213)).d.j^e.e.j&&(t=e.e.e-e.d.e-e.a)<r&&(r=t,c=e);return c}function Kyn(){Kyn=O,dat=new $O(NZn,(hN(),!1)),fat=new $O(xZn,100),q7(),lat=new $O(DZn,bat=Oat),wat=new $O(RZn,lZn),gat=new $O(KZn,iln(DWn))}function _yn(n,t,e){var i,r,c,a,u,o;for(o=0,r=0,c=(i=n.a[t]).length;r<c;++r)for(u=Lfn(i[r],e).Kc();u.Ob();)a=BB(u.Pb(),11),VW(n.f,a,iln(o++))}function Fyn(n,t,e){var i,r;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)JIn(n,t,kIn(dnn(e,BB(r.Pb(),19).a)))}function Byn(n,t,e){var i,r;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)JIn(n,t,kIn(dnn(e,BB(r.Pb(),19).a)))}function Hyn(n){var t;return _Mn(),z9(t=BB(Emn(gz(n.k),x8(FIt,YZn,61,2,0,1)),122),0,t.length,null),t[0]==(kUn(),sIt)&&t[1]==CIt&&($X(t,0,CIt),$X(t,1,sIt)),t}function qyn(n,t,e){var i,r,c;return c=sDn(n,r=XNn(n,t,e)),K9(n.b),k0(n,t,e),SQ(),m$(r,new Vd(n)),i=sDn(n,r),K9(n.b),k0(n,e,t),new rI(iln(c),iln(i))}function Gyn(){Gyn=O,Umt=dq(new B2,(yMn(),Bat),(lWn(),dot)),Xmt=new iR("linearSegments.inputPrio",iln(0)),Wmt=new iR("linearSegments.outputPrio",iln(0))}function zyn(){zyn=O,Ryt=new fC("P1_TREEIFICATION",0),Kyt=new fC("P2_NODE_ORDERING",1),_yt=new fC("P3_NODE_PLACEMENT",2),Fyt=new fC("P4_EDGE_ROUTING",3)}function Uyn(){Uyn=O,sWn(),xjt=gPt,Kjt=LPt,Cjt=KSt,Ijt=BSt,Ojt=qSt,Pjt=DSt,Ajt=USt,Njt=fPt,KAn(),Mjt=wjt,Sjt=djt,$jt=pjt,Ljt=mjt,Djt=yjt,Rjt=kjt,_jt=Ejt}function Xyn(){Xyn=O,MCt=new qC("UNKNOWN",0),jCt=new qC("ABOVE",1),ECt=new qC("BELOW",2),TCt=new qC("INLINE",3),new iR("org.eclipse.elk.labelSide",MCt)}function Wyn(n,t){var e;if(n.ni()&&null!=t){for(e=0;e<n.i;++e)if(Nfn(t,n.g[e]))return e}else for(e=0;e<n.i;++e)if(GI(n.g[e])===GI(t))return e;return-1}function Vyn(n,t,e){var i,r;return t.c==(ain(),qvt)&&e.c==Hvt?-1:t.c==Hvt&&e.c==qvt?1:(i=dhn(t.a,n.a),r=dhn(e.a,n.a),t.c==qvt?r-i:i-r)}function Qyn(n,t,e){if(e&&(t<0||t>e.a.c.length))throw Hp(new _y("index must be >= 0 and <= layer node count"));n.c&&y7(n.c.a,n),n.c=e,e&&kG(e.a,t,n)}function Yyn(n,t){var e,i,r;for(i=new oz(ZL(hbn(n).a.Kc(),new h));dAn(i);)return e=BB(U5(i),17),new qf(yX((r=BB(t.Kb(e),10)).n.b+r.o.b/2));return iy(),iy(),Ont}function Jyn(n,t){this.c=new xp,this.a=n,this.b=t,this.d=BB(mMn(n,(hWn(),Alt)),304),GI(mMn(n,(HXn(),Lgt)))===GI((g7(),qht))?this.e=new gm:this.e=new dm}function Zyn(n,t){var i,r,c;for(c=0,r=new Wb(n);r.a<r.c.c.length;)i=BB(n0(r),33),c+=e.Math.pow(i.g*i.f-t,2);return e.Math.sqrt(c/(n.c.length-1))}function nkn(n,t){var e,i;return i=null,n.Xe((sWn(),CPt))&&(e=BB(n.We(CPt),94)).Xe(t)&&(i=e.We(t)),null==i&&n.yf()&&(i=n.yf().We(t)),null==i&&(i=mpn(t)),i}function tkn(n,t){var e,i;e=n.Zc(t);try{return i=e.Pb(),e.Qb(),i}catch(r){throw cL(r=lun(r),109)?Hp(new Ay("Can't remove element "+t)):Hp(r)}}function ekn(n,t){var e,i,r;if(0==(e=DBn(n,t,r=new von((i=new AT).q.getFullYear()-sQn,i.q.getMonth(),i.q.getDate())))||e<t.length)throw Hp(new _y(t));return r}function ikn(n,t){var e,i,r;for(kW(t),Tx(t!=n),r=n.b.c.length,i=t.Kc();i.Ob();)e=i.Pb(),WB(n.b,kW(e));return r!=n.b.c.length&&(Esn(n,0),!0)}function rkn(){rkn=O,sWn(),kat=CSt,new XA(dSt,(hN(),!0)),Tat=KSt,Mat=BSt,Sat=qSt,Eat=DSt,Pat=USt,Cat=fPt,Kyn(),yat=dat,vat=lat,mat=wat,jat=gat,pat=fat}function ckn(n,t){if(t==n.c)return n.d;if(t==n.d)return n.c;throw Hp(new _y("'port' must be either the source port or target port of the edge."))}function akn(n,t,e){var i,r;switch(r=n.o,i=n.d,t.g){case 1:return-i.d-e;case 3:return r.b+i.a+e;case 2:return r.a+i.c+e;case 4:return-i.b-e;default:return 0}}function ukn(n,t,e,i){var r,c,a;for(PZ(t,BB(i.Xb(0),29)),a=i.bd(1,i.gc()),c=BB(e.Kb(t),20).Kc();c.Ob();)ukn(n,(r=BB(c.Pb(),17)).c.i==t?r.d.i:r.c.i,e,a)}function okn(n){var t;return t=new xp,Lx(n,(hWn(),Dlt))?BB(mMn(n,Dlt),83):(JT(AV(new Rq(null,new w1(n.j,16)),new tr),new gd(t)),hon(n,Dlt,t),t)}function skn(n,t){var e;return n.Db>>16==6?n.Cb.ih(n,6,_Ot,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),yOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function hkn(n,t){var e;return n.Db>>16==7?n.Cb.ih(n,1,DOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),jOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function fkn(n,t){var e;return n.Db>>16==9?n.Cb.ih(n,9,UOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),TOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function lkn(n,t){var e;return n.Db>>16==5?n.Cb.ih(n,9,XAt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),s$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function bkn(n,t){var e;return n.Db>>16==3?n.Cb.ih(n,0,BOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),e$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function wkn(n,t){var e;return n.Db>>16==7?n.Cb.ih(n,6,GOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),v$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function dkn(){this.a=new lo,this.g=new Avn,this.j=new Avn,this.b=new xp,this.d=new Avn,this.i=new Avn,this.k=new xp,this.c=new xp,this.e=new xp,this.f=new xp}function gkn(n,t,e){var i,r,c;for(e<0&&(e=0),c=n.i,r=e;r<c;r++)if(i=Wtn(n,r),null==t){if(null==i)return r}else if(GI(t)===GI(i)||Nfn(t,i))return r;return-1}function pkn(n,t){var e,i;return(e=t.Hh(n.a))?(i=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),j7n)),mK(E7n,i)?az(n,Utn(t.Hj())):i):null}function vkn(n,t){var e,i;if(t){if(t==n)return!0;for(e=0,i=BB(t,49).eh();i&&i!=t;i=i.eh()){if(++e>GQn)return vkn(n,i);if(i==n)return!0}}return!1}function mkn(n){switch(DN(),n.q.g){case 5:vIn(n,(kUn(),sIt)),vIn(n,SIt);break;case 4:z$n(n,(kUn(),sIt)),z$n(n,SIt);break;default:vUn(n,(kUn(),sIt)),vUn(n,SIt)}}function ykn(n){switch(DN(),n.q.g){case 5:SOn(n,(kUn(),oIt)),SOn(n,CIt);break;case 4:Cpn(n,(kUn(),oIt)),Cpn(n,CIt);break;default:mUn(n,(kUn(),oIt)),mUn(n,CIt)}}function kkn(n){var t,e;(t=BB(mMn(n,(fRn(),nat)),19))?(e=t.a,hon(n,(Mrn(),hat),0==e?new sbn:new C4(e))):hon(n,(Mrn(),hat),new C4(1))}function jkn(n,t){var e;switch(e=n.i,t.g){case 1:return-(n.n.b+n.o.b);case 2:return n.n.a-e.o.a;case 3:return n.n.b-e.o.b;case 4:return-(n.n.a+n.o.a)}return 0}function Ekn(n,t){switch(n.g){case 0:return t==(Tbn(),Flt)?rst:cst;case 1:return t==(Tbn(),Flt)?rst:ist;case 2:return t==(Tbn(),Flt)?ist:cst;default:return ist}}function Tkn(n,t){var i,r,c;for(y7(n.a,t),n.e-=t.r+(0==n.a.c.length?0:n.c),c=n4n,r=new Wb(n.a);r.a<r.c.c.length;)i=BB(n0(r),187),c=e.Math.max(c,i.d);n.b=c}function Mkn(n,t){var e;return n.Db>>16==3?n.Cb.ih(n,12,UOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),mOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function Skn(n,t){var e;return n.Db>>16==11?n.Cb.ih(n,10,UOt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(CXn(),EOt),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function Pkn(n,t){var e;return n.Db>>16==10?n.Cb.ih(n,11,qAt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),g$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function Ckn(n,t){var e;return n.Db>>16==10?n.Cb.ih(n,12,QAt,t):(e=Cvn(BB(itn(BB(yan(n,16),26)||(gWn(),m$t),n.Db>>16),18)),n.Cb.ih(n,e.n,e.f,t))}function Ikn(n){var t;return 0==(1&n.Bb)&&n.r&&n.r.kh()&&(t=BB(n.r,49),n.r=BB(tfn(n,t),138),n.r!=t&&0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,8,t,n.r))),n.r}function Okn(n,t,i){var r;return r=Pun(Gk(xNt,1),qQn,25,15,[iMn(n,(Dtn(),Git),t,i),iMn(n,zit,t,i),iMn(n,Uit,t,i)]),n.f&&(r[0]=e.Math.max(r[0],r[2]),r[2]=r[0]),r}function Akn(n,t){var e,i,r;if(0!=(r=Yvn(n,t)).c.length)for(m$(r,new ti),e=r.c.length,i=0;i<e;i++)hPn(n,(l1(i,r.c.length),BB(r.c[i],286)),TDn(n,r,i))}function $kn(n){var t,e,i;for(i=BB(h6(n.a,(LEn(),Tst)),15).Kc();i.Ob();)for(t=gz((e=BB(i.Pb(),101)).k).Kc();t.Ob();)iX(n,e,BB(t.Pb(),61),(Crn(),Dst),1)}function Lkn(n){var t,e;if(n.k==(uSn(),Put))for(e=new oz(ZL(hbn(n).a.Kc(),new h));dAn(e);)if(!b5(t=BB(U5(e),17))&&n.c==Ajn(t,n).c)return!0;return!1}function Nkn(n){var t,e;if(n.k==(uSn(),Put))for(e=new oz(ZL(hbn(n).a.Kc(),new h));dAn(e);)if(!b5(t=BB(U5(e),17))&&t.c.i.c==t.d.i.c)return!0;return!1}function xkn(n,t){var e,i;for(OTn(t,"Dull edge routing",1),i=spn(n.b,0);i.b!=i.d.c;)for(e=spn(BB(b3(i),86).d,0);e.b!=e.d.c;)yQ(BB(b3(e),188).a)}function Dkn(n,t){var e,i,r;if(t)for(r=((e=new hz(t.a.length)).b-e.a)*e.c<0?(eS(),MNt):new XL(e);r.Ob();)(i=x2(t,BB(r.Pb(),19).a))&&O$n(n,i)}function Rkn(){var n;for(tS(),nWn((QX(),t$t)),_Xn(t$t),Tyn(t$t),gWn(),L$t=l$t,n=new Wb(V$t);n.a<n.c.c.length;)azn(BB(n0(n),241),l$t,null);return!0}function Kkn(n,t){var e,i,r,c,a,u;return(a=n.h>>19)!=(u=t.h>>19)?u-a:(i=n.h)!=(c=t.h)?i-c:(e=n.m)!=(r=t.m)?e-r:n.l-t.l}function _kn(){_kn=O,tRn(),Pit=new $O(UYn,Cit=xit),Rnn(),Mit=new $O(XYn,Sit=mit),hpn(),Eit=new $O(WYn,Tit=dit),jit=new $O(VYn,(hN(),!0))}function Fkn(n,t,e){var i,r;i=t*e,cL(n.g,145)?(r=f3(n)).f.d?r.f.a||(n.d.a+=i+fJn):(n.d.d-=i+fJn,n.d.a+=i+fJn):cL(n.g,10)&&(n.d.d-=i,n.d.a+=2*i)}function Bkn(n,t,i){var r,c,a,u,o;for(c=n[i.g],o=new Wb(t.d);o.a<o.c.c.length;)(a=(u=BB(n0(o),101)).i)&&a.i==i&&(c[r=u.d[i.g]]=e.Math.max(c[r],a.j.b))}function Hkn(n,t){var i,r,c,a,u;for(r=0,c=0,i=0,u=new Wb(t.d);u.a<u.c.c.length;)Gmn(a=BB(n0(u),443)),r=e.Math.max(r,a.b),c+=a.d+(i>0?n.g:0),++i;t.b=r,t.e=c}function qkn(n){var t,e,i;if(i=n.b,qT(n.i,i.length)){for(e=2*i.length,n.b=x8(Gnt,CVn,317,e,0,1),n.c=x8(Gnt,CVn,317,e,0,1),n.f=e-1,n.i=0,t=n.a;t;t=t.c)YCn(n,t,t);++n.g}}function Gkn(n,t,e,i){var r,c,a,u;for(r=0;r<t.o;r++)for(c=r-t.j+e,a=0;a<t.p;a++)u=a-t.k+i,vmn(t,r,a)?cmn(n,c,u)||Xmn(n,c,u):ymn(t,r,a)&&(imn(n,c,u)||Wmn(n,c,u))}function zkn(n,t,e){var i;(i=t.c.i).k==(uSn(),Put)?(hon(n,(hWn(),hlt),BB(mMn(i,hlt),11)),hon(n,flt,BB(mMn(i,flt),11))):(hon(n,(hWn(),hlt),t.c),hon(n,flt,e.d))}function Ukn(n,t,i){var r,c,a,u,o,s;return jDn(),u=t/2,a=i/2,o=1,s=1,(r=e.Math.abs(n.a))>u&&(o=u/r),(c=e.Math.abs(n.b))>a&&(s=a/c),kL(n,e.Math.min(o,s)),n}function Xkn(){var n,t;qBn();try{if(t=BB(Xjn((WM(),zAt),y6n),2014))return t}catch(e){if(!cL(e=lun(e),102))throw Hp(e);n=e,uz((u$(),n))}return new ao}function Wkn(){var n,t;d7();try{if(t=BB(Xjn((WM(),zAt),S7n),2024))return t}catch(e){if(!cL(e=lun(e),102))throw Hp(e);n=e,uz((u$(),n))}return new Ds}function Vkn(){var n,t;qBn();try{if(t=BB(Xjn((WM(),zAt),V9n),1941))return t}catch(e){if(!cL(e=lun(e),102))throw Hp(e);n=e,uz((u$(),n))}return new qo}function Qkn(n,t,e){var i,r;return r=n.e,n.e=t,0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,4,r,t),e?e.Ei(i):e=i),r!=t&&(e=azn(n,t?kLn(n,t):n.a,e)),e}function Ykn(){AT.call(this),this.e=-1,this.a=!1,this.p=_Vn,this.k=-1,this.c=-1,this.b=-1,this.g=!1,this.f=-1,this.j=-1,this.n=-1,this.i=-1,this.d=-1,this.o=_Vn}function Jkn(n,t){var e,i,r;if(i=n.b.d.d,n.a||(i+=n.b.d.a),r=t.b.d.d,t.a||(r+=t.b.d.a),0==(e=Pln(i,r))){if(!n.a&&t.a)return-1;if(!t.a&&n.a)return 1}return e}function Zkn(n,t){var e,i,r;if(i=n.b.b.d,n.a||(i+=n.b.b.a),r=t.b.b.d,t.a||(r+=t.b.b.a),0==(e=Pln(i,r))){if(!n.a&&t.a)return-1;if(!t.a&&n.a)return 1}return e}function njn(n,t){var e,i,r;if(i=n.b.g.d,n.a||(i+=n.b.g.a),r=t.b.g.d,t.a||(r+=t.b.g.a),0==(e=Pln(i,r))){if(!n.a&&t.a)return-1;if(!t.a&&n.a)return 1}return e}function tjn(){tjn=O,Nat=WG(dq(dq(dq(new B2,(yMn(),Fat),(lWn(),yot)),Fat,Tot),Bat,Aot),Bat,oot),Dat=dq(dq(new B2,Fat,Jut),Fat,sot),xat=WG(new B2,Bat,fot)}function ejn(n){var t,e,i,r,c;for(t=BB(mMn(n,(hWn(),zft)),83),c=n.n,i=t.Cc().Kc();i.Ob();)(r=(e=BB(i.Pb(),306)).i).c+=c.a,r.d+=c.b,e.c?NDn(e):xDn(e);hon(n,zft,null)}function ijn(n,t,e){var i,r;switch(i=(r=n.b).d,t.g){case 1:return-i.d-e;case 2:return r.o.a+i.c+e;case 3:return r.o.b+i.a+e;case 4:return-i.b-e;default:return-1}}function rjn(n){var t,e,i,r,c;if(i=0,r=ZJn,n.b)for(t=0;t<360;t++)e=.017453292519943295*t,UKn(n,n.d,0,0,Z3n,e),(c=n.b.ig(n.d))<r&&(i=e,r=c);UKn(n,n.d,0,0,Z3n,i)}function cjn(n,t){var e,i,r,c;for(c=new xp,t.e=null,t.f=null,i=new Wb(t.i);i.a<i.c.c.length;)e=BB(n0(i),65),r=BB(RX(n.g,e.a),46),e.a=qz(e.b),VW(c,e.a,r);n.g=c}function ajn(n,t,e){var i,r,c,a,u;for(r=(t-n.e)/n.d.c.length,c=0,u=new Wb(n.d);u.a<u.c.c.length;)a=BB(n0(u),443),i=n.b-a.b+e,kdn(a,a.e+c*r,a.f),hmn(a,r,i),++c}function ujn(n){var t;if(n.f.qj(),-1!=n.b){if(++n.b,t=n.f.d[n.a],n.b<t.i)return;++n.a}for(;n.a<n.f.d.length;++n.a)if((t=n.f.d[n.a])&&0!=t.i)return void(n.b=0);n.b=-1}function ojn(n,t){var e,i,r;for(e=$Cn(n,0==(r=t.c.length)?"":(l1(0,t.c.length),SD(t.c[0]))),i=1;i<r&&e;++i)e=BB(e,49).oh((l1(i,t.c.length),SD(t.c[i])));return e}function sjn(n,t){var e,i;for(i=new Wb(t);i.a<i.c.c.length;)e=BB(n0(i),10),n.c[e.c.p][e.p].a=OG(n.i),n.c[e.c.p][e.p].d=Gy(n.c[e.c.p][e.p].a),n.c[e.c.p][e.p].b=1}function hjn(n,t){var i,r,c;for(c=0,r=new Wb(n);r.a<r.c.c.length;)i=BB(n0(r),157),c+=e.Math.pow(iG(i)*eG(i)-t,2);return e.Math.sqrt(c/(n.c.length-1))}function fjn(n,t,e,i){var r,c,a;return a=NRn(n,c=qRn(n,t,e,i)),fMn(n,t,e,i),K9(n.b),SQ(),m$(c,new Qd(n)),r=NRn(n,c),fMn(n,e,t,i),K9(n.b),new rI(iln(a),iln(r))}function ljn(n,t,e){var i;for(OTn(e,"Interactive node placement",1),n.a=BB(mMn(t,(hWn(),Alt)),304),i=new Wb(t.b);i.a<i.c.c.length;)nDn(n,BB(n0(i),29));HSn(e)}function bjn(n,t){OTn(t,"General Compactor",1),t.n&&n&&y0(t,o2(n),(Bsn(),uOt)),dwn(BB(ZAn(n,(Uyn(),Sjt)),380)).hg(n),t.n&&n&&y0(t,o2(n),(Bsn(),uOt))}function wjn(n,t,e){var i,r;for(CA(n,n.j+t,n.k+e),r=new AL((!n.a&&(n.a=new $L(xOt,n,5)),n.a));r.e!=r.i.gc();)TA(i=BB(kpn(r),469),i.a+t,i.b+e);PA(n,n.b+t,n.c+e)}function djn(n,t,e,i){switch(e){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),Ywn(n.e,t,i);case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),Ywn(n.d,t,i)}return FTn(n,t,e,i)}function gjn(n,t,e,i){switch(e){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),_pn(n.e,t,i);case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),_pn(n.d,t,i)}return run(n,t,e,i)}function pjn(n,t,e){var i,r,c;if(e)for(c=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);c.Ob();)(r=x2(e,BB(c.Pb(),19).a))&&bIn(n,r,t)}function vjn(n,t,e){var i,r,c;return n.qj(),c=null==t?0:nsn(t),n.f>0&&(r=aOn(n,(c&DWn)%n.d.length,c,t))?r.ed(e):(i=n.tj(c,t,e),n.c.Fc(i),null)}function mjn(n,t){var e,i,r,c;switch(Cfn(n,t)._k()){case 3:case 2:for(r=0,c=(e=YBn(t)).i;r<c;++r)if(5==DW(B7(n,i=BB(Wtn(e,r),34))))return i}return null}function yjn(n){var t,e,i,r,c;if(qT(n.f,n.b.length))for(i=x8(Qnt,CVn,330,2*n.b.length,0,1),n.b=i,r=i.length-1,e=n.a;e!=n;e=e.Rd())t=(c=BB(e,330)).d&r,c.a=i[t],i[t]=c}function kjn(n,t){var i,r,c,a;for(a=0,c=BB(BB(h6(n.r,t),21),84).Kc();c.Ob();)r=BB(c.Pb(),111),a=e.Math.max(a,r.e.a+r.b.rf().a);(i=BB(oV(n.b,t),124)).n.b=0,i.a.a=a}function jjn(n,t){var i,r,c,a;for(i=0,a=BB(BB(h6(n.r,t),21),84).Kc();a.Ob();)c=BB(a.Pb(),111),i=e.Math.max(i,c.e.b+c.b.rf().b);(r=BB(oV(n.b,t),124)).n.d=0,r.a.b=i}function Ejn(n){var t,e;return e=BB(mMn(n,(hWn(),Zft)),21),t=kA(vyt),e.Hc((bDn(),gft))&&Jcn(t,kyt),e.Hc(vft)&&Jcn(t,Eyt),e.Hc(sft)&&Jcn(t,myt),e.Hc(fft)&&Jcn(t,yyt),t}function Tjn(n,t){var e;OTn(t,"Delaunay triangulation",1),e=new Np,Otn(n.i,new yg(e)),qy(TD(mMn(n,(Xcn(),Qrt)))),n.e?Frn(n.e,$Xn(e)):n.e=$Xn(e),HSn(t)}function Mjn(n){if(n<0)throw Hp(new _y("The input must be positive"));return n<MMt.length?j2(MMt[n]):e.Math.sqrt(Z3n*n)*(ifn(n,n)/efn(2.718281828459045,n))}function Sjn(n,t){var e;if(n.ni()&&null!=t){for(e=0;e<n.i;++e)if(Nfn(t,n.g[e]))return!0}else for(e=0;e<n.i;++e)if(GI(n.g[e])===GI(t))return!0;return!1}function Pjn(n,t){if(null==t){for(;n.a.Ob();)if(null==BB(n.a.Pb(),42).dd())return!0}else for(;n.a.Ob();)if(Nfn(t,BB(n.a.Pb(),42).dd()))return!0;return!1}function Cjn(n,t){var e;return t===n||!!cL(t,664)&&(e=BB(t,1947),ign(n.g||(n.g=new Zf(n)),e.g||(e.g=new Zf(e))))}function Ijn(n){var t,i,r;for(t="Sz",i="ez",r=e.Math.min(n.length,5)-1;r>=0;r--)if(mK(n[r].d,t)||mK(n[r].d,i)){n.length>=r+1&&n.splice(0,r+1);break}return n}function Ojn(n,t){var i;return JO(n)&&JO(t)&&$Qn<(i=n/t)&&i<OQn?i<0?e.Math.ceil(i):e.Math.floor(i):uan(Aqn(JO(n)?Pan(n):n,JO(t)?Pan(t):t,!1))}function Ajn(n,t){if(t==n.c.i)return n.d.i;if(t==n.d.i)return n.c.i;throw Hp(new _y("'node' must either be the source node or target node of the edge."))}function $jn(n){var t,e,i,r;if(r=BB(mMn(n,(hWn(),Fft)),37)){for(i=new Gj,t=vW(n.c.i);t!=r;)t=vW(e=t.e),_x(UR(UR(i,e.n),t.c),t.d.b,t.d.d);return i}return Fut}function Ljn(n){var t;JT(wnn(new Rq(null,new w1((t=BB(mMn(n,(hWn(),Olt)),403)).d,16)),new _i),new wd(n)),JT(AV(new Rq(null,new w1(t.d,16)),new Fi),new dd(n))}function Njn(n,t){var e,i;for(e=new oz(ZL((t?lbn(n):fbn(n)).a.Kc(),new h));dAn(e);)if((i=Ajn(BB(U5(e),17),n)).k==(uSn(),Put)&&i.c!=n.c)return i;return null}function xjn(n){var t,i,r;for(i=new Wb(n.p);i.a<i.c.c.length;)(t=BB(n0(i),10)).k==(uSn(),Cut)&&(r=t.o.b,n.i=e.Math.min(n.i,r),n.g=e.Math.max(n.g,r))}function Djn(n,t,e){var i,r,c;for(c=new Wb(t);c.a<c.c.c.length;)i=BB(n0(c),10),n.c[i.c.p][i.p].e=!1;for(r=new Wb(t);r.a<r.c.c.length;)xzn(n,i=BB(n0(r),10),e)}function Rjn(n,t,i){var r,c;(r=Tfn(t.j,i.s,i.c)+Tfn(i.e,t.s,t.c))==(c=Tfn(i.j,t.s,t.c)+Tfn(t.e,i.s,i.c))?r>0&&(n.b+=2,n.a+=r):(n.b+=1,n.a+=e.Math.min(r,c))}function Kjn(n,t){var e;if(e=!1,XI(t)&&(e=!0,nW(n,new GX(SD(t)))),e||cL(t,236)&&(e=!0,nW(n,new Sl(XK(BB(t,236))))),!e)throw Hp(new Ly(H6n))}function _jn(n,t,e,i){var r,c,a;return r=new N7(n.e,1,10,cL(a=t.c,88)?BB(a,26):(gWn(),d$t),cL(c=e.c,88)?BB(c,26):(gWn(),d$t),uvn(n,t),!1),i?i.Ei(r):i=r,i}function Fjn(n){var t,e;switch(BB(mMn(vW(n),(HXn(),pgt)),420).g){case 0:return t=n.n,e=n.o,new xC(t.a+e.a/2,t.b+e.b/2);case 1:return new wA(n.n);default:return null}}function Bjn(){Bjn=O,Qht=new AP(QZn,0),Vht=new AP("LEFTUP",1),Jht=new AP("RIGHTUP",2),Wht=new AP("LEFTDOWN",3),Yht=new AP("RIGHTDOWN",4),Xht=new AP("BALANCED",5)}function Hjn(n,t,e){var i,r,c;if(0==(i=Pln(n.a[t.p],n.a[e.p]))){if(r=BB(mMn(t,(hWn(),clt)),15),c=BB(mMn(e,clt),15),r.Hc(e))return-1;if(c.Hc(t))return 1}return i}function qjn(n){switch(n.g){case 1:return new _a;case 2:return new Fa;case 3:return new Ka;case 0:return null;default:throw Hp(new _y(c4n+(null!=n.f?n.f:""+n.g)))}}function Gjn(n,t,e){switch(t){case 1:return!n.n&&(n.n=new eU(zOt,n,1,7)),sqn(n.n),!n.n&&(n.n=new eU(zOt,n,1,7)),void pX(n.n,BB(e,14));case 2:return void $in(n,SD(e))}rsn(n,t,e)}function zjn(n,t,e){switch(t){case 3:return void Men(n,Gy(MD(e)));case 4:return void Sen(n,Gy(MD(e)));case 5:return void Pen(n,Gy(MD(e)));case 6:return void Cen(n,Gy(MD(e)))}Gjn(n,t,e)}function Ujn(n,t,e){var i,r;(i=HTn(r=new Lm,t,null))&&i.Fi(),Nrn(r,e),f9((!n.c&&(n.c=new eU(YAt,n,12,10)),n.c),r),Len(r,0),Nen(r,1),nln(r,!0),Yfn(r,!0)}function Xjn(n,t){var e,i;return cL(e=hS(n.g,t),235)?((i=BB(e,235)).Qh(),i.Nh()):cL(e,498)?i=BB(e,1938).b:null}function Wjn(n,t,e,i){var r,c;return yX(t),yX(e),R7(!!(c=BB(UK(n.d,t),19)),"Row %s not in %s",t,n.e),R7(!!(r=BB(UK(n.b,e),19)),"Column %s not in %s",e,n.c),Sun(n,c.a,r.a,i)}function Vjn(n,t,e,i,r,c,a){var u,o,s,h,f;if(f=Bmn(u=(s=c==a-1)?i:0,h=r[c]),10!=i&&Pun(Gk(n,a-c),t[c],e[c],u,f),!s)for(++c,o=0;o<h;++o)f[o]=Vjn(n,t,e,i,r,c,a);return f}function Qjn(n){if(-1==n.g)throw Hp(new dv);n.mj();try{n.i.$c(n.g),n.f=n.i.j,n.g<n.e&&--n.e,n.g=-1}catch(t){throw cL(t=lun(t),73)?Hp(new vv):Hp(t)}}function Yjn(n,t){return n.b.a=e.Math.min(n.b.a,t.c),n.b.b=e.Math.min(n.b.b,t.d),n.a.a=e.Math.max(n.a.a,t.c),n.a.b=e.Math.max(n.a.b,t.d),n.c[n.c.length]=t,!0}function Jjn(n){var t,e,i;for(i=-1,e=0,t=new Wb(n);t.a<t.c.c.length;){if(BB(n0(t),243).c==(ain(),Hvt)){i=0==e?0:e-1;break}e==n.c.length-1&&(i=e),e+=1}return i}function Zjn(n){var t,i,r,c;for(c=0,t=0,r=new Wb(n.c);r.a<r.c.c.length;)Pen(i=BB(n0(r),33),n.e+c),Cen(i,n.f),c+=i.g+n.b,t=e.Math.max(t,i.f+n.b);n.d=c-n.b,n.a=t-n.b}function nEn(n){var t,e,i;for(e=new Wb(n.a.b);e.a<e.c.c.length;)i=(t=BB(n0(e),57)).d.c,t.d.c=t.d.d,t.d.d=i,i=t.d.b,t.d.b=t.d.a,t.d.a=i,i=t.b.a,t.b.a=t.b.b,t.b.b=i;yNn(n)}function tEn(n){var t,e,i;for(e=new Wb(n.a.b);e.a<e.c.c.length;)i=(t=BB(n0(e),81)).g.c,t.g.c=t.g.d,t.g.d=i,i=t.g.b,t.g.b=t.g.a,t.g.a=i,i=t.e.a,t.e.a=t.e.b,t.e.b=i;kNn(n)}function eEn(n){var t,e,i,r,c;for(c=gz(n.k),kUn(),i=0,r=(e=Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length;i<r;++i)if((t=e[i])!=PIt&&!c.Hc(t))return t;return null}function iEn(n,t){var e,i;return(i=BB(EN(Qon(AV(new Rq(null,new w1(t.j,16)),new bc))),11))&&(e=BB(xq(i.e,0),17))?BB(mMn(e,(hWn(),wlt)),19).a:gnn(n.b)}function rEn(n,t){var e,i,r;for(r=new Wb(t.a);r.a<r.c.c.length;)for(i=BB(n0(r),10),nk(n.d),e=new oz(ZL(lbn(i).a.Kc(),new h));dAn(e);)XOn(n,i,BB(U5(e),17).d.i)}function cEn(n,t){var e,i;for(y7(n.b,t),i=new Wb(n.n);i.a<i.c.c.length;)if(-1!=E7((e=BB(n0(i),211)).c,t,0)){y7(e.c,t),Zjn(e),0==e.c.c.length&&y7(n.n,e);break}fHn(n)}function aEn(n,t){var i,r,c,a,u;for(u=n.f,c=0,a=0,r=new Wb(n.a);r.a<r.c.c.length;)Tvn(i=BB(n0(r),187),n.e,u),p9(i,t),a=e.Math.max(a,i.r),c=u+=i.d+n.c;n.d=a,n.b=c}function uEn(n){var t,e;return h3(e=wLn(n))?null:(yX(e),t=BB(emn(new oz(ZL(e.a.Kc(),new h))),79),PTn(BB(Wtn((!t.b&&(t.b=new hK(KOt,t,4,7)),t.b),0),82)))}function oEn(n){return n.o||(n.Lj()?n.o=new aW(n,n,null):n.rk()?n.o=new rR(n,null):1==DW(B7((IPn(),Z$t),n))?n.o=new g4(n):n.o=new cR(n,null)),n.o}function sEn(n,t,e,i){var r,c,a,u,o;e.mh(t)&&(r=(a=t)?BB(i,49).xh(a):null)&&(o=e.ah(t),(u=t.t)>1||-1==u?(c=BB(o,15),r.Wb(Xdn(n,c))):r.Wb(t_n(n,BB(o,56))))}function hEn(n,t,e,i){YE();var r=PWn;function c(){for(var n=0;n<r.length;n++)r[n]()}if(n)try{HNt(c)()}catch(a){n(t,a)}else HNt(c)()}function fEn(n){var t,e,i,r,c;for(i=new usn(new Pb(n.b).a);i.b;)t=BB((e=ten(i)).cd(),10),c=BB(BB(e.dd(),46).a,10),r=BB(BB(e.dd(),46).b,8),UR(kO(t.n),UR(B$(c.n),r))}function lEn(n){switch(BB(mMn(n.b,(HXn(),egt)),375).g){case 1:JT($V(wnn(new Rq(null,new w1(n.d,16)),new _r),new Fr),new Br);break;case 2:vRn(n);break;case 0:CCn(n)}}function bEn(n,t,e){OTn(e,"Straight Line Edge Routing",1),e.n&&t&&y0(e,o2(t),(Bsn(),uOt)),mHn(n,BB(ZAn(t,(wD(),Vkt)),33)),e.n&&t&&y0(e,o2(t),(Bsn(),uOt))}function wEn(){wEn=O,ZMt=new RC("V_TOP",0),JMt=new RC("V_CENTER",1),YMt=new RC("V_BOTTOM",2),VMt=new RC("H_LEFT",3),WMt=new RC("H_CENTER",4),QMt=new RC("H_RIGHT",5)}function dEn(n){var t;return 0!=(64&n.Db)?Cwn(n):((t=new fN(Cwn(n))).a+=" (abstract: ",yE(t,0!=(256&n.Bb)),t.a+=", interface: ",yE(t,0!=(512&n.Bb)),t.a+=")",t.a)}function gEn(n,t,e,i){var r,c,a;return mA(n.e)&&(a=LY(n,1,r=t.ak(),t.dd(),c=e.dd(),r.$j()?pBn(n,r,c,cL(r,99)&&0!=(BB(r,18).Bb&BQn)):-1,!0),i?i.Ei(a):i=a),i}function pEn(n){var t;null==n.c&&(t=GI(n.b)===GI(Ynt)?null:n.b,n.d=null==t?zWn:ez(t)?jN(EQ(t)):XI(t)?qVn:nE(tsn(t)),n.a=n.a+": "+(ez(t)?CR(EQ(t)):t+""),n.c="("+n.d+") "+n.a)}function vEn(n,t){this.e=n,QI(e0(t,-4294967296),0)?(this.d=1,this.a=Pun(Gk(ANt,1),hQn,25,15,[dG(t)])):(this.d=2,this.a=Pun(Gk(ANt,1),hQn,25,15,[dG(t),dG(kz(t,32))]))}function mEn(){function n(){try{return(new Map).entries().next().done}catch(n){return!1}}return typeof Map===xWn&&Map.prototype.entries&&n()?Map:bUn()}function yEn(n,t){var e,i,r;for(r=new M2(n.e,0),e=0;r.b<r.d.gc();){if((i=Gy((Px(r.b<r.d.gc()),MD(r.d.Xb(r.c=r.b++))))-t)>D3n)return e;i>-1e-6&&++e}return e}function kEn(n,t){var e;t!=n.b?(e=null,n.b&&(e=oJ(n.b,n,-4,e)),t&&(e=Npn(t,n,-4,e)),(e=Zhn(n,t,e))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,t,t))}function jEn(n,t){var e;t!=n.f?(e=null,n.f&&(e=oJ(n.f,n,-1,e)),t&&(e=Npn(t,n,-1,e)),(e=nfn(n,t,e))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,0,t,t))}function EEn(n){var t,e,i;if(null==n)return null;if((e=BB(n,15)).dc())return"";for(i=new Sk,t=e.Kc();t.Ob();)cO(i,(Uqn(),SD(t.Pb()))),i.a+=" ";return KO(i,i.a.length-1)}function TEn(n){var t,e,i;if(null==n)return null;if((e=BB(n,15)).dc())return"";for(i=new Sk,t=e.Kc();t.Ob();)cO(i,(Uqn(),SD(t.Pb()))),i.a+=" ";return KO(i,i.a.length-1)}function MEn(n,t,e){var i,r;return i=n.c[t.c.p][t.p],r=n.c[e.c.p][e.p],null!=i.a&&null!=r.a?Tz(i.a,r.a):null!=i.a?-1:null!=r.a?1:0}function SEn(n,t){var e,i,r;if(t)for(r=((e=new hz(t.a.length)).b-e.a)*e.c<0?(eS(),MNt):new XL(e);r.Ob();)i=x2(t,BB(r.Pb(),19).a),OV(new Bg(n).a,i)}function PEn(n,t){var e,i,r;if(t)for(r=((e=new hz(t.a.length)).b-e.a)*e.c<0?(eS(),MNt):new XL(e);r.Ob();)i=x2(t,BB(r.Pb(),19).a),IV(new $g(n).a,i)}function CEn(n){if(null!=n&&n.length>0&&33==fV(n,n.length-1))try{return null==YPn(fx(n,0,n.length-1)).e}catch(t){if(!cL(t=lun(t),32))throw Hp(t)}return!1}function IEn(n,t,e){var i,r,c;return i=t.ak(),c=t.dd(),r=i.$j()?LY(n,3,i,null,c,pBn(n,i,c,cL(i,99)&&0!=(BB(i,18).Bb&BQn)),!0):LY(n,1,i,i.zj(),c,-1,!0),e?e.Ei(r):e=r,e}function OEn(){var n,t,e;for(t=0,n=0;n<1;n++){if(0==(e=QOn((b1(n,1),"X".charCodeAt(n)))))throw Hp(new ak("Unknown Option: "+"X".substr(n)));t|=e}return t}function AEn(n,t,e){var i,r;switch(i=Wln(vW(t)),CZ(r=new CSn,t),e.g){case 1:qCn(r,Tln(hwn(i)));break;case 2:qCn(r,hwn(i))}return hon(r,(HXn(),tpt),MD(mMn(n,tpt))),r}function $En(n){var t,e;return t=BB(U5(new oz(ZL(fbn(n.a).a.Kc(),new h))),17),e=BB(U5(new oz(ZL(lbn(n.a).a.Kc(),new h))),17),qy(TD(mMn(t,(hWn(),Clt))))||qy(TD(mMn(e,Clt)))}function LEn(){LEn=O,Mst=new yP("ONE_SIDE",0),Pst=new yP("TWO_SIDES_CORNER",1),Cst=new yP("TWO_SIDES_OPPOSING",2),Sst=new yP("THREE_SIDES",3),Tst=new yP("FOUR_SIDES",4)}function NEn(n,t,e,i,r){var c,a;c=BB(P4(AV(t.Oc(),new Zr),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),a=BB(gan(n.b,e,i),15),0==r?a.Wc(0,c):a.Gc(c)}function xEn(n,t){var e,i,r;for(i=new Wb(t.a);i.a<i.c.c.length;)for(e=new oz(ZL(fbn(BB(n0(i),10)).a.Kc(),new h));dAn(e);)r=BB(U5(e),17).c.i.p,n.n[r]=n.n[r]-1}function DEn(n,t){var e,i,r,c;for(r=new Wb(t.d);r.a<r.c.c.length;)for(i=BB(n0(r),101),c=BB(RX(n.c,i),112).o,e=new QT(i.b);e.a<e.c.a.length;)g9(i,BB(u4(e),61),c)}function REn(n){var t;for(t=new Wb(n.e.b);t.a<t.c.c.length;)hzn(n,BB(n0(t),29));JT(AV(wnn(wnn(new Rq(null,new w1(n.e.b,16)),new Xc),new Zc),new na),new hg(n))}function KEn(n,t){return!!t&&!n.Di(t)&&(n.i?n.i.Ei(t):cL(t,143)?(n.i=BB(t,143),!0):(n.i=new po,n.i.Ei(t)))}function _En(n){if(n=FBn(n,!0),mK(a5n,n)||mK("1",n))return hN(),vtt;if(mK(u5n,n)||mK("0",n))return hN(),ptt;throw Hp(new ik("Invalid boolean value: '"+n+"'"))}function FEn(n,t,e){var i,r,c;for(r=n.vc().Kc();r.Ob();)if(c=(i=BB(r.Pb(),42)).cd(),GI(t)===GI(c)||null!=t&&Nfn(t,c))return e&&(i=new PS(i.cd(),i.dd()),r.Qb()),i;return null}function BEn(n){var t,e,i;qD(),n.B.Hc((n_n(),qIt))&&(i=n.f.i,t=new gY(n.a.c),(e=new bm).b=t.c-i.c,e.d=t.d-i.d,e.c=i.c+i.b-(t.c+t.b),e.a=i.d+i.a-(t.d+t.a),n.e.Ff(e))}function HEn(n,t,i,r){var c,a,u;for(u=e.Math.min(i,WFn(BB(n.b,65),t,i,r)),a=new Wb(n.a);a.a<a.c.c.length;)(c=BB(n0(a),221))!=t&&(u=e.Math.min(u,HEn(c,t,u,r)));return u}function qEn(n){var t,e,i;for(i=x8(Out,sVn,193,n.b.c.length,0,2),e=new M2(n.b,0);e.b<e.d.gc();)Px(e.b<e.d.gc()),t=BB(e.d.Xb(e.c=e.b++),29),i[e.b-1]=n2(t.a);return i}function GEn(n,t,e,i,r){var c,a,u,o;for(a=nj(Zk(H_(tvn(e)),i),akn(n,e,r)),o=DSn(n,e).Kc();o.Ob();)t[(u=BB(o.Pb(),11)).p]&&(c=t[u.p].i,WB(a.d,new xG(c,kln(a,c))));Pwn(a)}function zEn(n,t){this.f=new xp,this.b=new xp,this.j=new xp,this.a=n,this.c=t,this.c>0&&_yn(this,this.c-1,(kUn(),oIt)),this.c<this.a.length-1&&_yn(this,this.c+1,(kUn(),CIt))}function UEn(n){n.length>0&&n[0].length>0&&(this.c=qy(TD(mMn(vW(n[0][0]),(hWn(),alt))))),this.a=x8(Pmt,sVn,2018,n.length,0,2),this.b=x8(Lmt,sVn,2019,n.length,0,2),this.d=new Thn}function XEn(n){return 0!=n.c.length&&((l1(0,n.c.length),BB(n.c[0],17)).c.i.k==(uSn(),Put)||o5($V(new Rq(null,new w1(n,16)),new Kc),new _c))}function WEn(n,t,e){return OTn(e,"Tree layout",1),h2(n.b),CU(n.b,(zyn(),Ryt),Ryt),CU(n.b,Kyt,Kyt),CU(n.b,_yt,_yt),CU(n.b,Fyt,Fyt),n.a=$qn(n.b,t),lxn(n,t,mcn(e,1)),HSn(e),t}function VEn(n,t){var i,r,c,a,u,o;for(u=wDn(t),c=t.f,o=t.g,a=e.Math.sqrt(c*c+o*o),r=0,i=new Wb(u);i.a<i.c.c.length;)r+=VEn(n,BB(n0(i),33));return e.Math.max(r,a)}function QEn(){QEn=O,YCt=new UC(hJn,0),QCt=new UC("FREE",1),VCt=new UC("FIXED_SIDE",2),UCt=new UC("FIXED_ORDER",3),WCt=new UC("FIXED_RATIO",4),XCt=new UC("FIXED_POS",5)}function YEn(n,t){var e,i,r;if(e=t.Hh(n.a))for(r=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),T7n)),i=1;i<(IPn(),nLt).length;++i)if(mK(nLt[i],r))return i;return 0}function JEn(n){var t,e,i,r;if(null==n)return zWn;for(r=new $an(FWn,"[","]"),e=0,i=(t=n).length;e<i;++e)b6(r,""+t[e]);return r.a?0==r.e.length?r.a.a:r.a.a+""+r.e:r.c}function ZEn(n){var t,e,i,r;if(null==n)return zWn;for(r=new $an(FWn,"[","]"),e=0,i=(t=n).length;e<i;++e)b6(r,""+t[e]);return r.a?0==r.e.length?r.a.a:r.a.a+""+r.e:r.c}function nTn(n){var t,e,i;for(i=new $an(FWn,"{","}"),e=n.vc().Kc();e.Ob();)b6(i,W3(n,(t=BB(e.Pb(),42)).cd())+"="+W3(n,t.dd()));return i.a?0==i.e.length?i.a.a:i.a.a+""+i.e:i.c}function tTn(n){for(var t,e,i,r;!Wy(n.o);)e=BB(dU(n.o),46),i=BB(e.a,121),r=Nbn(t=BB(e.b,213),i),t.e==i?(RN(r.g,t),i.e=r.e+t.a):(RN(r.b,t),i.e=r.e-t.a),WB(n.e.a,i)}function eTn(n,t){var e,i,r;for(e=null,r=BB(t.Kb(n),20).Kc();r.Ob();)if(i=BB(r.Pb(),17),e){if((i.c.i==n?i.d.i:i.c.i)!=e)return!1}else e=i.c.i==n?i.d.i:i.c.i;return!0}function iTn(n,t){var e,i,r;for(i=new Wb(QLn(n,!1,t));i.a<i.c.c.length;)0==(e=BB(n0(i),129)).d?(WZ(e,null),VZ(e,null)):(r=e.a,WZ(e,e.b),VZ(e,r))}function rTn(n){var t,e;return Jcn(t=new B2,Cyt),(e=BB(mMn(n,(hWn(),Zft)),21)).Hc((bDn(),vft))&&Jcn(t,$yt),e.Hc(sft)&&Jcn(t,Iyt),e.Hc(gft)&&Jcn(t,Ayt),e.Hc(fft)&&Jcn(t,Oyt),t}function cTn(n){var t,e,i,r;for(Sqn(n),e=new oz(ZL(hbn(n).a.Kc(),new h));dAn(e);)r=(i=(t=BB(U5(e),17)).c.i==n)?t.d:t.c,i?MZ(t,null):SZ(t,null),hon(t,(hWn(),mlt),r),uAn(n,r.i)}function aTn(n,t,e,i){var r,c;switch(r=e[(c=t.i).g][n.d[c.g]],c.g){case 1:r-=i+t.j.b,t.g.b=r;break;case 3:r+=i,t.g.b=r;break;case 4:r-=i+t.j.a,t.g.a=r;break;case 2:r+=i,t.g.a=r}}function uTn(n){var t,e;for(e=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));e.e!=e.i.gc();)if(!dAn(new oz(ZL(wLn(t=BB(kpn(e),33)).a.Kc(),new h))))return t;return null}function oTn(){var n;return WOt?BB($$n((WM(),zAt),y6n),2016):(n=BB(cL(SJ((WM(),zAt),y6n),555)?SJ(zAt,y6n):new sAn,555),WOt=!0,_Gn(n),jWn(n),Tyn(n),mZ(zAt,y6n,n),n)}function sTn(n,t,e){var i,r;if(0==n.j)return e;if(r=BB(_en(n,t,e),72),!(i=e.ak()).Ij()||!n.a.rl(i))throw Hp(new dy("Invalid entry feature '"+i.Hj().zb+"."+i.ne()+"'"));return r}function hTn(n,t){var e,i,r,c,a,u,o;for(u=0,o=(a=n.a).length;u<o;++u)for(r=0,c=(i=a[u]).length;r<c;++r)if(e=i[r],GI(t)===GI(e)||null!=t&&Nfn(t,e))return!0;return!1}function fTn(n){var t,e,i;return Vhn(n,0)>=0?(e=Ojn(n,AQn),i=ldn(n,AQn)):(e=Ojn(t=jz(n,1),5e8),i=rbn(yz(i=ldn(t,5e8),1),e0(n,1))),i0(yz(i,32),e0(e,UQn))}function lTn(n,t,e){var i;switch(Px(0!=t.b),i=BB(Atn(t,t.a.a),8),e.g){case 0:i.b=0;break;case 2:i.b=n.f;break;case 3:i.a=0;break;default:i.a=n.g}return nX(spn(t,0),i),t}function bTn(n,t,e,i){var r,c,a,u,o;switch(o=n.b,u=zgn(a=(c=t.d).j,o.d[a.g],e),r=UR(B$(c.n),c.a),c.j.g){case 1:case 3:u.a+=r.a;break;case 2:case 4:u.b+=r.b}r5(i,u,i.c.b,i.c)}function wTn(n,t,e){var i,r,c,a;for(a=E7(n.e,t,0),(c=new rm).b=e,i=new M2(n.e,a);i.b<i.d.gc();)Px(i.b<i.d.gc()),(r=BB(i.d.Xb(i.c=i.b++),10)).p=e,WB(c.e,r),fW(i);return c}function dTn(n,t,e,i){var r,c,a,u,o;for(r=null,c=0,u=new Wb(t);u.a<u.c.c.length;)o=(a=BB(n0(u),33)).i+a.g,n<a.j+a.f+i&&(r?e.i-o<e.i-c&&(r=a):r=a,c=r.i+r.g);return r?c+i:0}function gTn(n,t,e,i){var r,c,a,u,o;for(c=null,r=0,u=new Wb(t);u.a<u.c.c.length;)o=(a=BB(n0(u),33)).j+a.f,n<a.i+a.g+i&&(c?e.j-o<e.j-r&&(c=a):c=a,r=c.j+c.f);return c?r+i:0}function pTn(n){var t,e,i;for(t=!1,i=n.b.c.length,e=0;e<i;e++)Yon(BB(xq(n.b,e),434))?!t&&e+1<i&&Yon(BB(xq(n.b,e+1),434))&&(t=!0,BB(xq(n.b,e),434).a=!0):t=!1}function vTn(n,t,e,i,r){var c,a;for(c=0,a=0;a<r;a++)c=rbn(c,ibn(e0(t[a],UQn),e0(i[a],UQn))),n[a]=dG(c),c=kz(c,32);for(;a<e;a++)c=rbn(c,e0(t[a],UQn)),n[a]=dG(c),c=kz(c,32)}function mTn(n,t){var e,i;for($On(),ODn(),i=Jtt,e=n;t>1;t>>=1)0!=(1&t)&&(i=Nnn(i,e)),e=1==e.d?Nnn(e,e):new Cgn(I_n(e.a,e.d,x8(ANt,hQn,25,e.d<<1,15,1)));return i=Nnn(i,e)}function yTn(){var n,t,e,i;for(yTn=O,Oet=x8(xNt,qQn,25,25,15,1),Aet=x8(xNt,qQn,25,33,15,1),i=152587890625e-16,t=32;t>=0;t--)Aet[t]=i,i*=.5;for(e=1,n=24;n>=0;n--)Oet[n]=e,e*=.5}function kTn(n){var t,e;if(qy(TD(ZAn(n,(HXn(),wgt)))))for(e=new oz(ZL(dLn(n).a.Kc(),new h));dAn(e);)if(QIn(t=BB(U5(e),79))&&qy(TD(ZAn(t,dgt))))return!0;return!1}function jTn(n,t){var e,i,r;TU(n.f,t)&&(t.b=n,i=t.c,-1!=E7(n.j,i,0)||WB(n.j,i),r=t.d,-1!=E7(n.j,r,0)||WB(n.j,r),0!=(e=t.a.b).c.length&&(!n.i&&(n.i=new epn(n)),van(n.i,e)))}function ETn(n){var t,e,i,r;return(e=(t=n.c.d).j)==(r=(i=n.d.d).j)?t.p<i.p?0:1:Mln(e)==r?0:Eln(e)==r?1:SN(n.b.b,Mln(e))?0:1}function TTn(){TTn=O,tvt=new RP(j3n,0),Zpt=new RP("LONGEST_PATH",1),Ypt=new RP("COFFMAN_GRAHAM",2),Jpt=new RP(B1n,3),evt=new RP("STRETCH_WIDTH",4),nvt=new RP("MIN_WIDTH",5)}function MTn(n){var t;this.d=new xp,this.c=n.c,this.e=n.d,this.b=n.b,this.f=new sG(n.e),this.a=n.a,n.f?this.g=n.f:this.g=new YK(t=BB(Vj(aAt),9),BB(SR(t,t.length),9),0)}function STn(n,t){var e,i,r,c;!(r=D2(i=n,"layoutOptions"))&&(r=D2(i,M6n)),r&&(e=null,(c=r)&&(e=new TT(c,jrn(c,x8(Qtt,sVn,2,0,6,1)))),e&&e5(e,new wI(c,t)))}function PTn(n){if(cL(n,239))return BB(n,33);if(cL(n,186))return WJ(BB(n,118));throw Hp(n?new tk("Only support nodes and ports."):new Hy(e8n))}function CTn(n,t,e,i){return t>=0&&mK(n.substr(t,3),"GMT")||t>=0&&mK(n.substr(t,3),"UTC")?(e[0]=t+3,y_n(n,e,i)):y_n(n,e,i)}function ITn(n,t){var e,i,r,c,a;for(c=n.g.a,a=n.g.b,i=new Wb(n.d);i.a<i.c.c.length;)(r=(e=BB(n0(i),70)).n).a=c,n.i==(kUn(),sIt)?r.b=a+n.j.b-e.o.b:r.b=a,UR(r,t),c+=e.o.a+n.e}function OTn(n,t,e){if(n.b)throw Hp(new Fy("The task is already done."));return null==n.p&&(n.p=t,n.r=e,n.k&&(n.o=($T(),cbn(fan(Date.now()),VVn))),!0)}function ATn(n){var t;return t=new py,null!=n.tg()&&AH(t,q6n,n.tg()),null!=n.ne()&&AH(t,t8n,n.ne()),null!=n.sg()&&AH(t,"description",n.sg()),t}function $Tn(n,t,e){var i,r,c;return c=n.q,n.q=t,0!=(4&n.Db)&&0==(1&n.Db)&&(r=new nU(n,1,9,c,t),e?e.Ei(r):e=r),t?(i=t.c)!=n.r&&(e=n.nk(i,e)):n.r&&(e=n.nk(null,e)),e}function LTn(n,t,e){var i,r;for(e=Npn(t,n.e,-1-n.c,e),r=new Mp(new usn(new Pb(xW(n.a).a).a));r.a.b;)e=azn(i=BB(ten(r.a).cd(),87),kLn(i,n.a),e);return e}function NTn(n,t,e){var i,r;for(e=oJ(t,n.e,-1-n.c,e),r=new Mp(new usn(new Pb(xW(n.a).a).a));r.a.b;)e=azn(i=BB(ten(r.a).cd(),87),kLn(i,n.a),e);return e}function xTn(n,t,e,i){var r,c,a;if(0==i)aHn(t,0,n,e,n.length-e);else for(a=32-i,n[n.length-1]=0,c=n.length-1;c>e;c--)n[c]|=t[c-e-1]>>>a,n[c-1]=t[c-e-1]<<i;for(r=0;r<e;r++)n[r]=0}function DTn(n){var t,i,r,c,a;for(t=0,i=0,a=n.Kc();a.Ob();)r=BB(a.Pb(),111),t=e.Math.max(t,r.d.b),i=e.Math.max(i,r.d.c);for(c=n.Kc();c.Ob();)(r=BB(c.Pb(),111)).d.b=t,r.d.c=i}function RTn(n){var t,i,r,c,a;for(i=0,t=0,a=n.Kc();a.Ob();)r=BB(a.Pb(),111),i=e.Math.max(i,r.d.d),t=e.Math.max(t,r.d.a);for(c=n.Kc();c.Ob();)(r=BB(c.Pb(),111)).d.d=i,r.d.a=t}function KTn(n,t){var e,i,r,c;for(c=new Np,r=0,i=t.Kc();i.Ob();){for(e=iln(BB(i.Pb(),19).a+r);e.a<n.f&&!tG(n,e.a);)e=iln(e.a+1),++r;if(e.a>=n.f)break;c.c[c.c.length]=e}return c}function _Tn(n){var t,e,i,r;for(t=null,r=new Wb(n.wf());r.a<r.c.c.length;)e=new UV((i=BB(n0(r),181)).qf().a,i.qf().b,i.rf().a,i.rf().b),t?CPn(t,e):t=e;return!t&&(t=new bA),t}function FTn(n,t,e,i){return 1==e?(!n.n&&(n.n=new eU(zOt,n,1,7)),Ywn(n.n,t,i)):BB(itn(BB(yan(n,16),26)||n.zh(),e),66).Nj().Qj(n,fgn(n),e-bX(n.zh()),t,i)}function BTn(n,t,e){var i,r,c,a,u;for(i=e.gc(),n.qi(n.i+i),(u=n.i-t)>0&&aHn(n.g,t,n.g,t+i,u),a=e.Kc(),n.i+=i,r=0;r<i;++r)c=a.Pb(),jL(n,t,n.oi(t,c)),n.bi(t,c),n.ci(),++t;return 0!=i}function HTn(n,t,e){var i;return t!=n.q?(n.q&&(e=oJ(n.q,n,-10,e)),t&&(e=Npn(t,n,-10,e)),e=$Tn(n,t,e)):0!=(4&n.Db)&&0==(1&n.Db)&&(i=new nU(n,1,9,t,t),e?e.Ei(i):e=i),e}function qTn(n,t,e,i){return C_(0==(e&hVn),"flatMap does not support SUBSIZED characteristic"),C_(0==(4&e),"flatMap does not support SORTED characteristic"),yX(n),yX(t),new q2(n,e,i,t)}function GTn(n,t){SU(t,"Cannot suppress a null exception."),vH(t!=n,"Exception can not suppress itself."),n.i||(null==n.k?n.k=Pun(Gk(Jnt,1),sVn,78,0,[t]):n.k[n.k.length]=t)}function zTn(n,t,e,i){var r,c,a,u,o,s;for(a=e.length,c=0,r=-1,s=atn(n.substr(t),(c_(),Tet)),u=0;u<a;++u)(o=e[u].length)>c&&sU(s,atn(e[u],Tet))&&(r=u,c=o);return r>=0&&(i[0]=t+c),r}function UTn(n,t){var e;if(0!=(e=YO(n.b.Hf(),t.b.Hf())))return e;switch(n.b.Hf().g){case 1:case 2:return E$(n.b.sf(),t.b.sf());case 3:case 4:return E$(t.b.sf(),n.b.sf())}return 0}function XTn(n){var t,e,i;for(i=n.e.c.length,n.a=kq(ANt,[sVn,hQn],[48,25],15,[i,i],2),e=new Wb(n.c);e.a<e.c.c.length;)t=BB(n0(e),282),n.a[t.c.b][t.d.b]+=BB(mMn(t,(fRn(),Zct)),19).a}function WTn(n,t,e){OTn(e,"Grow Tree",1),n.b=t.f,qy(TD(mMn(t,(Xcn(),Qrt))))?(n.c=new it,QZ(n,null)):n.c=new it,n.a=!1,FNn(n,t.f),hon(t,Yrt,(hN(),!!n.a)),HSn(e)}function VTn(n,t){var e,i,r,c,a;if(null==n)return null;for(a=x8(ONt,WVn,25,2*t,15,1),i=0,r=0;i<t;++i)e=n[i]>>4&15,c=15&n[i],a[r++]=OOt[e],a[r++]=OOt[c];return Bdn(a,0,a.length)}function QTn(n,t,e){var i,r,c;return i=t.ak(),c=t.dd(),r=i.$j()?LY(n,4,i,c,null,pBn(n,i,c,cL(i,99)&&0!=(BB(i,18).Bb&BQn)),!0):LY(n,i.Kj()?2:1,i,c,i.zj(),-1,!0),e?e.Ei(r):e=r,e}function YTn(n){var t,e;return n>=BQn?(t=HQn+(n-BQn>>10&1023)&QVn,e=56320+(n-BQn&1023)&QVn,String.fromCharCode(t)+""+String.fromCharCode(e)):String.fromCharCode(n&QVn)}function JTn(n,t){var e,i,r,c;return qD(),(r=BB(BB(h6(n.r,t),21),84)).gc()>=2&&(i=BB(r.Kc().Pb(),111),e=n.u.Hc((lIn(),tIt)),c=n.u.Hc(cIt),!i.a&&!e&&(2==r.gc()||c))}function ZTn(n,t,e,i,r){var c,a,u;for(c=eDn(n,t,e,i,r),u=!1;!c;)E$n(n,r,!0),u=!0,c=eDn(n,t,e,i,r);u&&E$n(n,r,!1),0!=(a=Dun(r)).c.length&&(n.d&&n.d.lg(a),ZTn(n,r,e,i,a))}function nMn(){nMn=O,aCt=new BC(QZn,0),rCt=new BC("DIRECTED",1),uCt=new BC("UNDIRECTED",2),eCt=new BC("ASSOCIATION",3),cCt=new BC("GENERALIZATION",4),iCt=new BC("DEPENDENCY",5)}function tMn(n,t){var e;if(!WJ(n))throw Hp(new Fy(F5n));switch(e=WJ(n),t.g){case 1:return-(n.j+n.f);case 2:return n.i-e.g;case 3:return n.j-e.f;case 4:return-(n.i+n.g)}return 0}function eMn(n,t){var e,i;for(kW(t),i=n.b.c.length,WB(n.b,t);i>0;){if(e=i,i=(i-1)/2|0,n.a.ue(xq(n.b,i),t)<=0)return c5(n.b,e,t),!0;c5(n.b,e,xq(n.b,i))}return c5(n.b,i,t),!0}function iMn(n,t,i,r){var c,a;if(c=0,i)c=mhn(n.a[i.g][t.g],r);else for(a=0;a<nrt;a++)c=e.Math.max(c,mhn(n.a[a][t.g],r));return t==(Dtn(),zit)&&n.b&&(c=e.Math.max(c,n.b.a)),c}function rMn(n,t){var e,i,r,c,a;return i=n.i,r=t.i,!(!i||!r)&&i.i==r.i&&i.i!=(kUn(),oIt)&&i.i!=(kUn(),CIt)&&(e=(c=i.g.a)+i.j.a,c<=(a=r.g.a)+r.j.a&&e>=a)}function cMn(n,t,e,i){var r;if(r=!1,XI(i)&&(r=!0,AH(t,e,SD(i))),r||zI(i)&&(r=!0,cMn(n,t,e,i)),r||cL(i,236)&&(r=!0,qQ(t,e,BB(i,236))),!r)throw Hp(new Ly(H6n))}function aMn(n,t){var e,i,r;if((e=t.Hh(n.a))&&null!=(r=cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),F9n)))for(i=1;i<(IPn(),Y$t).length;++i)if(mK(Y$t[i],r))return i;return 0}function uMn(n,t){var e,i,r;if((e=t.Hh(n.a))&&null!=(r=cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),F9n)))for(i=1;i<(IPn(),J$t).length;++i)if(mK(J$t[i],r))return i;return 0}function oMn(n,t){var e,i,r,c;if(kW(t),(c=n.a.gc())<t.gc())for(e=n.a.ec().Kc();e.Ob();)i=e.Pb(),t.Hc(i)&&e.Qb();else for(r=t.Kc();r.Ob();)i=r.Pb(),n.a.Bc(i);return c!=n.a.gc()}function sMn(n){var t,e;switch(e=B$(Aon(Pun(Gk(PMt,1),sVn,8,0,[n.i.n,n.n,n.a]))),t=n.i.d,n.j.g){case 1:e.b-=t.d;break;case 2:e.a+=t.c;break;case 3:e.b+=t.a;break;case 4:e.a-=t.b}return e}function hMn(n){var t;for(Irn(),t=BB(U5(new oz(ZL(fbn(n).a.Kc(),new h))),17).c.i;t.k==(uSn(),Put);)hon(t,(hWn(),olt),(hN(),!0)),t=BB(U5(new oz(ZL(fbn(t).a.Kc(),new h))),17).c.i}function fMn(n,t,e,i){var r,c,a;for(a=Lfn(t,i).Kc();a.Ob();)r=BB(a.Pb(),11),n.d[r.p]=n.d[r.p]+n.c[e.p];for(c=Lfn(e,i).Kc();c.Ob();)r=BB(c.Pb(),11),n.d[r.p]=n.d[r.p]-n.c[t.p]}function lMn(n,t,e){var i,r;for(r=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));r.e!=r.i.gc();)SA(i=BB(kpn(r),33),i.i+t,i.j+e);e5((!n.b&&(n.b=new eU(_Ot,n,12,3)),n.b),new tI(t,e))}function bMn(n,t,e,i){var r,c;for(r=null==(c=t).d||n.a.ue(e.d,c.d)>0?1:0;c.a[r]!=e;)c=c.a[r],r=n.a.ue(e.d,c.d)>0?1:0;c.a[r]=i,i.b=e.b,i.a[0]=e.a[0],i.a[1]=e.a[1],e.a[0]=null,e.a[1]=null}function wMn(n){return lIn(),!(Can(OJ(EG(eIt,Pun(Gk(IIt,1),$Vn,273,0,[rIt])),n))>1||Can(OJ(EG(tIt,Pun(Gk(IIt,1),$Vn,273,0,[nIt,cIt])),n))>1)}function dMn(n,t){cL(SJ((WM(),zAt),n),498)?mZ(zAt,n,new OI(this,t)):mZ(zAt,n,this),iSn(this,t),t==(iE(),n$t)?(this.wb=BB(this,1939),BB(t,1941)):this.wb=(QX(),t$t)}function gMn(n){var t,e;if(null==n)return null;for(t=null,e=0;e<IOt.length;++e)try{return BM(IOt[e],n)}catch(i){if(!cL(i=lun(i),32))throw Hp(i);t=i}throw Hp(new L7(t))}function pMn(){pMn=O,pet=Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]),vet=Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"])}function vMn(n){var t,e,i;(t=mK(typeof t,gYn)?null:new ln)&&(lM(),tW(e=(i=900)>=VVn?"error":i>=900?"warn":i>=800?"info":"log",n.a),n.b&&xNn(t,e,n.b,"Exception: ",!0))}function mMn(n,t){var e,i;return!n.q&&(n.q=new xp),null!=(i=RX(n.q,t))?i:(cL(e=t.wg(),4)&&(null==e?(!n.q&&(n.q=new xp),v6(n.q,t)):(!n.q&&(n.q=new xp),VW(n.q,t,e))),e)}function yMn(){yMn=O,Rat=new VS("P1_CYCLE_BREAKING",0),Kat=new VS("P2_LAYERING",1),_at=new VS("P3_NODE_ORDERING",2),Fat=new VS("P4_NODE_PLACEMENT",3),Bat=new VS("P5_EDGE_ROUTING",4)}function kMn(n,t){var e,i,r,c;for(i=(1==t?Wat:Xat).a.ec().Kc();i.Ob();)for(e=BB(i.Pb(),103),c=BB(h6(n.f.c,e),21).Kc();c.Ob();)r=BB(c.Pb(),46),y7(n.b.b,r.b),y7(n.b.a,BB(r.b,81).d)}function jMn(n,t){var e;if(Dnn(),n.c==t.c){if(n.b==t.b||hcn(n.b,t.b)){if(e=ZO(n.b)?1:-1,n.a&&!t.a)return e;if(!n.a&&t.a)return-e}return E$(n.b.g,t.b.g)}return Pln(n.c,t.c)}function EMn(n,t){var e;OTn(t,"Hierarchical port position processing",1),(e=n.b).c.length>0&&i_n((l1(0,e.c.length),BB(e.c[0],29)),n),e.c.length>1&&i_n(BB(xq(e,e.c.length-1),29),n),HSn(t)}function TMn(n,t){var e,i;if(NMn(n,t))return!0;for(i=new Wb(t);i.a<i.c.c.length;){if(_Dn(n,e=BB(n0(i),33),uEn(e)))return!0;if($hn(n,e)-n.g<=n.a)return!0}return!1}function MMn(){MMn=O,bRn(),kTt=RTt,vTt=LTt,pTt=ATt,dTt=PTt,gTt=ITt,wTt=new WA(8),bTt=new XA((sWn(),XSt),wTt),mTt=new XA(LPt,8),yTt=xTt,hTt=jTt,fTt=TTt,lTt=new XA(lSt,(hN(),!1))}function SMn(){SMn=O,zMt=new WA(15),GMt=new XA((sWn(),XSt),zMt),XMt=new XA(LPt,15),UMt=new XA(pPt,iln(0)),_Mt=jSt,BMt=KSt,qMt=qSt,DMt=new XA(cSt,f5n),FMt=CSt,HMt=BSt,RMt=uSt,KMt=hSt}function PMn(n){if(1!=(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i||1!=(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new _y(r8n));return PTn(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82))}function CMn(n){if(1!=(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i||1!=(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new _y(r8n));return bun(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82))}function IMn(n){if(1!=(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i||1!=(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new _y(r8n));return bun(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))}function OMn(n){if(1!=(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i||1!=(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new _y(r8n));return PTn(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))}function AMn(n,t,e){var i,r,c;if(++n.j,t>=(r=n.Vi())||t<0)throw Hp(new Ay(u8n+t+o8n+r));if(e>=r||e<0)throw Hp(new Ay(s8n+e+o8n+r));return t!=e?(c=n.Ti(e),n.Hi(t,c),i=c):i=n.Oi(e),i}function $Mn(n){var t,e,i;if(i=n,n)for(t=0,e=n.Ug();e;e=e.Ug()){if(++t>GQn)return $Mn(e);if(i=e,e==n)throw Hp(new Fy("There is a cycle in the containment hierarchy of "+n))}return i}function LMn(n){var t,e,i;for(i=new $an(FWn,"[","]"),e=n.Kc();e.Ob();)b6(i,GI(t=e.Pb())===GI(n)?"(this Collection)":null==t?zWn:Bbn(t));return i.a?0==i.e.length?i.a.a:i.a.a+""+i.e:i.c}function NMn(n,t){var e,i;if(i=!1,t.gc()<2)return!1;for(e=0;e<t.gc();e++)e<t.gc()-1?i|=_Dn(n,BB(t.Xb(e),33),BB(t.Xb(e+1),33)):i|=_Dn(n,BB(t.Xb(e),33),BB(t.Xb(0),33));return i}function xMn(n,t){var e;t!=n.a?(e=null,n.a&&(e=BB(n.a,49).ih(n,4,GOt,e)),t&&(e=BB(t,49).gh(n,4,GOt,e)),(e=Jhn(n,t,e))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,1,t,t))}function DMn(n,t){var e;t!=n.e?(n.e&&_6(xW(n.e),n),t&&(!t.b&&(t.b=new Tp(new xm)),YR(t.b,n)),(e=Qkn(n,t,null))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,4,t,t))}function RMn(n){var t,e,i;for(e=n.length,i=0;i<e&&(b1(i,n.length),n.charCodeAt(i)<=32);)++i;for(t=e;t>i&&(b1(t-1,n.length),n.charCodeAt(t-1)<=32);)--t;return i>0||t<e?n.substr(i,t-i):n}function KMn(n,t){var i;i=t.o,dA(n.f)?(n.j.a=e.Math.max(n.j.a,i.a),n.j.b+=i.b,n.d.c.length>1&&(n.j.b+=n.e)):(n.j.a+=i.a,n.j.b=e.Math.max(n.j.b,i.b),n.d.c.length>1&&(n.j.a+=n.e))}function _Mn(){_Mn=O,$st=Pun(Gk(FIt,1),YZn,61,0,[(kUn(),sIt),oIt,SIt]),Ast=Pun(Gk(FIt,1),YZn,61,0,[oIt,SIt,CIt]),Lst=Pun(Gk(FIt,1),YZn,61,0,[SIt,CIt,sIt]),Nst=Pun(Gk(FIt,1),YZn,61,0,[CIt,sIt,oIt])}function FMn(n,t,e,i){var r,c,a,u,o;if(c=n.c.d,a=n.d.d,c.j!=a.j)for(o=n.b,r=c.j,u=null;r!=a.j;)u=0==t?Mln(r):Eln(r),DH(i,UR(zgn(r,o.d[r.g],e),zgn(u,o.d[u.g],e))),r=u}function BMn(n,t,e,i){var r,c,a,u,o;return u=BB((a=qyn(n.a,t,e)).a,19).a,c=BB(a.b,19).a,i&&(o=BB(mMn(t,(hWn(),Elt)),10),r=BB(mMn(e,Elt),10),o&&r&&(t4(n.b,o,r),u+=n.b.i,c+=n.b.e)),u>c}function HMn(n){var t,e,i,r,c,a,u,o;for(this.a=rvn(n),this.b=new Np,i=0,r=(e=n).length;i<r;++i)for(t=e[i],c=new Np,WB(this.b,c),u=0,o=(a=t).length;u<o;++u)WB(c,new t_(a[u].j))}function qMn(n,t,e){var i,r,c;return c=0,i=e[t],t<e.length-1&&(r=e[t+1],n.b[t]?(c=bWn(n.d,i,r),c+=ZX(n.a,i,(kUn(),oIt)),c+=ZX(n.a,r,CIt)):c=I9(n.a,i,r)),n.c[t]&&(c+=L6(n.a,i)),c}function GMn(n,t,e,i,r){var c,a,u,o;for(o=null,u=new Wb(i);u.a<u.c.c.length;)if((a=BB(n0(u),441))!=e&&-1!=E7(a.e,r,0)){o=a;break}SZ(c=W5(r),e.b),MZ(c,o.b),JIn(n.a,r,new L_(c,t,e.f))}function zMn(n){for(;0!=n.g.c&&0!=n.d.c;)FD(n.g).c>FD(n.d).c?(n.i+=n.g.c,gdn(n.d)):FD(n.d).c>FD(n.g).c?(n.e+=n.d.c,gdn(n.g)):(n.i+=qq(n.g),n.e+=qq(n.d),gdn(n.g),gdn(n.d))}function UMn(n,t,e){var i,r,c,a;for(c=t.q,a=t.r,new zZ((O6(),Tyt),t,c,1),new zZ(Tyt,c,a,1),r=new Wb(e);r.a<r.c.c.length;)(i=BB(n0(r),112))!=c&&i!=t&&i!=a&&(gHn(n.a,i,t),gHn(n.a,i,a))}function XMn(n,t,i,r){n.a.d=e.Math.min(t,i),n.a.a=e.Math.max(t,r)-n.a.d,t<i?(n.b=.5*(t+i),n.g=K3n*n.b+.9*t,n.f=K3n*n.b+.9*i):(n.b=.5*(t+r),n.g=K3n*n.b+.9*r,n.f=K3n*n.b+.9*t)}function WMn(){function n(){return(new Date).getTime()}SWn={},!Array.isArray&&(Array.isArray=function(n){return"[object Array]"===Object.prototype.toString.call(n)}),!Date.now&&(Date.now=n)}function VMn(n,t){var e,i;i=BB(mMn(t,(HXn(),ept)),98),hon(t,(hWn(),ylt),i),(e=t.e)&&(JT(new Rq(null,new w1(e.a,16)),new Rw(n)),JT(wnn(new Rq(null,new w1(e.b,16)),new mt),new Kw(n)))}function QMn(n){var t,i,r,c;if(gA(BB(mMn(n.b,(HXn(),Udt)),103)))return 0;for(t=0,r=new Wb(n.a);r.a<r.c.c.length;)(i=BB(n0(r),10)).k==(uSn(),Cut)&&(c=i.o.a,t=e.Math.max(t,c));return t}function YMn(n){switch(BB(mMn(n,(HXn(),kgt)),163).g){case 1:hon(n,kgt,(Tbn(),Blt));break;case 2:hon(n,kgt,(Tbn(),Hlt));break;case 3:hon(n,kgt,(Tbn(),_lt));break;case 4:hon(n,kgt,(Tbn(),Flt))}}function JMn(){JMn=O,cft=new $P(QZn,0),eft=new $P(cJn,1),aft=new $P(aJn,2),rft=new $P("LEFT_RIGHT_CONSTRAINT_LOCKING",3),ift=new $P("LEFT_RIGHT_CONNECTION_LOCKING",4),tft=new $P(q1n,5)}function ZMn(n,t,i){var r,c,a,u,o,s,h;o=i.a/2,a=i.b/2,s=1,h=1,(r=e.Math.abs(t.a-n.a))>o&&(s=o/r),(c=e.Math.abs(t.b-n.b))>a&&(h=a/c),u=e.Math.min(s,h),n.a+=u*(t.a-n.a),n.b+=u*(t.b-n.b)}function nSn(n,t,e,i,r){var c,a;for(a=!1,c=BB(xq(e.b,0),33);hBn(n,t,c,i,r)&&(a=!0,cEn(e,c),0!=e.b.c.length);)c=BB(xq(e.b,0),33);return 0==e.b.c.length&&Tkn(e.j,e),a&&Gmn(t.q),a}function tSn(n,t){var e,i,r,c;if(jDn(),t.b<2)return!1;for(i=e=BB(b3(c=spn(t,0)),8);c.b!=c.d.c;){if(cNn(n,i,r=BB(b3(c),8)))return!0;i=r}return!!cNn(n,i,e)}function eSn(n,t,e,i){return 0==e?(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),BK(n.o,t,i)):BB(itn(BB(yan(n,16),26)||n.zh(),e),66).Nj().Rj(n,fgn(n),e-bX(n.zh()),t,i)}function iSn(n,t){var e;t!=n.sb?(e=null,n.sb&&(e=BB(n.sb,49).ih(n,1,HOt,e)),t&&(e=BB(t,49).gh(n,1,HOt,e)),(e=jfn(n,t,e))&&e.Fi()):0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,4,t,t))}function rSn(n,t){var e,i;if(!t)throw Hp(new ek("All edge sections need an end point."));e=Ren(t,"x"),Ten(new Kg(n).a,(kW(e),e)),i=Ren(t,"y"),Oen(new _g(n).a,(kW(i),i))}function cSn(n,t){var e,i;if(!t)throw Hp(new ek("All edge sections need a start point."));e=Ren(t,"x"),Ien(new xg(n).a,(kW(e),e)),i=Ren(t,"y"),Aen(new Dg(n).a,(kW(i),i))}function aSn(n,t){var e,i,r,c,a;for(i=0,c=psn(n).length;i<c;++i)vMn(t);for(a=!Qet&&n.e?Qet?null:n.d:null;a;){for(e=0,r=psn(a).length;e<r;++e)vMn(t);a=!Qet&&a.e?Qet?null:a.d:null}}function uSn(){uSn=O,Cut=new JS("NORMAL",0),Put=new JS("LONG_EDGE",1),Mut=new JS("EXTERNAL_PORT",2),Iut=new JS("NORTH_SOUTH_PORT",3),Sut=new JS("LABEL",4),Tut=new JS("BREAKING_POINT",5)}function oSn(n){var t,e,i,r;if(t=!1,Lx(n,(hWn(),zft)))for(e=BB(mMn(n,zft),83),r=new Wb(n.j);r.a<r.c.c.length;)J$n(i=BB(n0(r),11))&&(t||(iIn(vW(n)),t=!0),fpn(BB(e.xc(i),306)))}function sSn(n,t,e){var i;OTn(e,"Self-Loop routing",1),i=Vln(t),iO(mMn(t,(C6(),TMt))),JT($V(AV(AV(wnn(new Rq(null,new w1(t.b,16)),new zi),new Ui),new Xi),new Wi),new eP(n,i)),HSn(e)}function hSn(n){var t,e,i;return i=ATn(n),null!=n.e&&AH(i,n8n,n.e),!!n.k&&AH(i,"type",dx(n.k)),!WE(n.j)&&(e=new Cl,rtn(i,N6n,e),t=new cp(e),e5(n.j,t)),i}function fSn(n){var t,e,i,r;for(r=xX((lin(n.gc(),"size"),new Ik),123),i=!0,e=lz(n).Kc();e.Ob();)t=BB(e.Pb(),42),i||(r.a+=FWn),i=!1,uO(xX(uO(r,t.cd()),61),t.dd());return(r.a+="}",r).a}function lSn(n,t){var e,i,r;return(t&=63)<22?(e=n.l<<t,i=n.m<<t|n.l>>22-t,r=n.h<<t|n.m>>22-t):t<44?(e=0,i=n.l<<t-22,r=n.m<<t-22|n.l>>44-t):(e=0,i=0,r=n.l<<t-44),M$(e&SQn,i&SQn,r&PQn)}function bSn(n){if(null==ytt&&(ytt=new RegExp("^\\s*[+-]?(NaN|Infinity|((\\d+\\.?\\d*)|(\\.\\d+))([eE][+-]?\\d+)?[dDfF]?)\\s*$")),!ytt.test(n))throw Hp(new Mk(DQn+n+'"'));return parseFloat(n)}function wSn(n){var t,e,i,r;for(t=new Np,vU(e=x8($Nt,ZYn,25,n.a.c.length,16,1),e.length),r=new Wb(n.a);r.a<r.c.c.length;)e[(i=BB(n0(r),121)).d]||(t.c[t.c.length]=i,Ggn(n,i,e));return t}function dSn(n,t){var e,i,r,c;for(c=t.b.j,n.a=x8(ANt,hQn,25,c.c.length,15,1),r=0,i=0;i<c.c.length;i++)l1(i,c.c.length),0==(e=BB(c.c[i],11)).e.c.length&&0==e.g.c.length?r+=1:r+=3,n.a[i]=r}function gSn(){gSn=O,Dht=new IP("ALWAYS_UP",0),xht=new IP("ALWAYS_DOWN",1),Kht=new IP("DIRECTION_UP",2),Rht=new IP("DIRECTION_DOWN",3),Fht=new IP("SMART_UP",4),_ht=new IP("SMART_DOWN",5)}function pSn(n,t){if(n<0||t<0)throw Hp(new _y("k and n must be positive"));if(t>n)throw Hp(new _y("k must be smaller than n"));return 0==t||t==n?1:0==n?0:Mjn(n)/(Mjn(t)*Mjn(n-t))}function vSn(n,t){var e,i,r,c;for(e=new OA(n);null!=e.g||e.c?null==e.g||0!=e.i&&BB(e.g[e.i-1],47).Ob():tZ(e);)if(cL(c=BB(aLn(e),56),160))for(i=BB(c,160),r=0;r<t.length;r++)t[r].og(i)}function mSn(n){var t;return 0!=(64&n.Db)?Yln(n):((t=new fN(Yln(n))).a+=" (height: ",vE(t,n.f),t.a+=", width: ",vE(t,n.g),t.a+=", x: ",vE(t,n.i),t.a+=", y: ",vE(t,n.j),t.a+=")",t.a)}function ySn(n){var t,e,i,r,c,a;for(t=new v4,r=0,c=(i=n).length;r<c;++r)if(null!=Jgn(t,a=yX((e=i[r]).cd()),yX(e.dd())))throw Hp(new _y("duplicate key: "+a));this.b=(SQ(),new Xb(t))}function kSn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],b6(c,String.fromCharCode(t));return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function jSn(){jSn=O,Knn(),Ict=new $O(oZn,Oct=Rct),iln(1),Cct=new $O(sZn,iln(300)),iln(0),Lct=new $O(hZn,iln(0)),new $p,Nct=new $O(fZn,lZn),new $p,Act=new $O(bZn,5),xct=Rct,$ct=Dct}function ESn(n,t){var e,i,r,c;for(i=(1==t?Wat:Xat).a.ec().Kc();i.Ob();)for(e=BB(i.Pb(),103),c=BB(h6(n.f.c,e),21).Kc();c.Ob();)r=BB(c.Pb(),46),WB(n.b.b,BB(r.b,81)),WB(n.b.a,BB(r.b,81).d)}function TSn(n,t){var e;if(null!=t&&!n.c.Yj().wj(t))throw e=cL(t,56)?BB(t,56).Tg().zb:nE(tsn(t)),Hp(new Ky(r6n+n.c.ne()+"'s type '"+n.c.Yj().ne()+"' does not permit a value of type '"+e+"'"))}function MSn(n,t,e){var i,r;for(r=new M2(n.b,0);r.b<r.d.gc();)Px(r.b<r.d.gc()),GI(mMn(i=BB(r.d.Xb(r.c=r.b++),70),(hWn(),vlt)))===GI(t)&&(OPn(i.n,vW(n.c.i),e),fW(r),WB(t.b,i))}function SSn(n,t){if(t.a)switch(BB(mMn(t.b,(hWn(),ylt)),98).g){case 0:case 1:lEn(t);case 2:JT(new Rq(null,new w1(t.d,16)),new Li),oAn(n.a,t)}else JT(new Rq(null,new w1(t.d,16)),new Li)}function PSn(n){var t,i;return i=e.Math.sqrt((null==n.k&&(n.k=Wrn(n,new Ec)),Gy(n.k)/(n.b*(null==n.g&&(n.g=Xrn(n,new jc)),Gy(n.g))))),t=dG(fan(e.Math.round(i))),t=e.Math.min(t,n.f)}function CSn(){gcn(),LR.call(this),this.j=(kUn(),PIt),this.a=new Gj,new fm,this.f=(lin(2,AVn),new J6(2)),this.e=(lin(4,AVn),new J6(4)),this.g=(lin(4,AVn),new J6(4)),this.b=new hP(this.e,this.g)}function ISn(n,t){var e;return!qy(TD(mMn(t,(hWn(),Clt))))&&(e=t.c.i,(n!=(Tbn(),_lt)||e.k!=(uSn(),Sut))&&BB(mMn(e,(HXn(),kgt)),163)!=Flt)}function OSn(n,t){var e;return!qy(TD(mMn(t,(hWn(),Clt))))&&(e=t.d.i,(n!=(Tbn(),Blt)||e.k!=(uSn(),Sut))&&BB(mMn(e,(HXn(),kgt)),163)!=Hlt)}function ASn(n,t){var e,i,r,c,a,u,o;for(a=n.d,o=n.o,u=new UV(-a.b,-a.d,a.b+o.a+a.c,a.d+o.b+a.a),r=0,c=(i=t).length;r<c;++r)(e=i[r])&&CPn(u,e.i);a.b=-u.c,a.d=-u.d,a.c=u.b-a.b-o.a,a.a=u.a-a.d-o.b}function $Sn(){$Sn=O,iTt=new MC("CENTER_DISTANCE",0),rTt=new MC("CIRCLE_UNDERLAP",1),uTt=new MC("RECTANGLE_UNDERLAP",2),cTt=new MC("INVERTED_OVERLAP",3),aTt=new MC("MINIMUM_ROOT_DISTANCE",4)}function LSn(n){var t,e,i,r;if(KDn(),null==n)return null;for(i=n.length,t=x8(ONt,WVn,25,2*i,15,1),e=0;e<i;e++)(r=n[e])<0&&(r+=256),t[2*e]=YLt[r>>4],t[2*e+1]=YLt[15&r];return Bdn(t,0,t.length)}function NSn(n){var t;switch(nV(),n.c.length){case 0:return Bnt;case 1:return IH((t=BB(JCn(new Wb(n)),42)).cd(),t.dd());default:return new hy(BB(Qgn(n,x8(Hnt,kVn,42,n.c.length,0,1)),165))}}function xSn(n){var t,e,i,r,c;for(t=new Lp,e=new Lp,d3(t,n),d3(e,n);e.b!=e.c;)for(c=new Wb(BB(dU(e),37).a);c.a<c.c.c.length;)(r=BB(n0(c),10)).e&&(d3(t,i=r.e),d3(e,i));return t}function DSn(n,t){switch(t.g){case 1:return KB(n.j,(gcn(),xut));case 2:return KB(n.j,(gcn(),Lut));case 3:return KB(n.j,(gcn(),Rut));case 4:return KB(n.j,(gcn(),Kut));default:return SQ(),SQ(),set}}function RSn(n,t){var e,i,r;e=sH(t,n.e),i=BB(RX(n.g.f,e),19).a,r=n.a.c.length-1,0!=n.a.c.length&&BB(xq(n.a,r),287).c==i?(++BB(xq(n.a,r),287).a,++BB(xq(n.a,r),287).b):WB(n.a,new Gx(i))}function KSn(n,t,e){var i,r;return 0!=(i=SRn(n,t,e))?i:Lx(t,(hWn(),wlt))&&Lx(e,wlt)?((r=E$(BB(mMn(t,wlt),19).a,BB(mMn(e,wlt),19).a))<0?uKn(n,t,e):r>0&&uKn(n,e,t),r):IOn(n,t,e)}function _Sn(n,t,e){var i,r,c,a;if(0!=t.b){for(i=new YT,a=spn(t,0);a.b!=a.d.c;)Frn(i,xun(c=BB(b3(a),86))),(r=c.e).a=BB(mMn(c,(qqn(),gkt)),19).a,r.b=BB(mMn(c,pkt),19).a;_Sn(n,i,mcn(e,i.b/n.a|0))}}function FSn(n,t){var e,i,r,c,a;if(n.e<=t)return n.g;if(z1(n,n.g,t))return n.g;for(c=n.r,i=n.g,a=n.r,r=(c-i)/2+i;i+1<c;)(e=cHn(n,r,!1)).b<=r&&e.a<=t?(a=r,c=r):i=r,r=(c-i)/2+i;return a}function BSn(n,t,e){OTn(e,"Recursive Graph Layout",hDn(n,t,!0)),vSn(t,Pun(Gk(nMt,1),HWn,527,0,[new $f])),P8(t,(sWn(),mPt))||vSn(t,Pun(Gk(nMt,1),HWn,527,0,[new gu])),lXn(n,t,null,e),HSn(e)}function HSn(n){var t;if(null==n.p)throw Hp(new Fy("The task has not begun yet."));n.b||(n.k&&($T(),t=cbn(fan(Date.now()),VVn),n.q=1e-9*j2(ibn(t,n.o))),n.c<n.r&&qin(n,n.r-n.c),n.b=!0)}function qSn(n){var t,e,i;for(DH(i=new km,new xC(n.j,n.k)),e=new AL((!n.a&&(n.a=new $L(xOt,n,5)),n.a));e.e!=e.i.gc();)DH(i,new xC((t=BB(kpn(e),469)).a,t.b));return DH(i,new xC(n.b,n.c)),i}function GSn(n,t,e,i,r){var c,a,u,o;if(r)for(o=((c=new hz(r.a.length)).b-c.a)*c.c<0?(eS(),MNt):new XL(c);o.Ob();)u=x2(r,BB(o.Pb(),19).a),D_n((a=new hQ(n,t,e,i)).a,a.b,a.c,a.d,u)}function zSn(n,t){var e;if(GI(n)===GI(t))return!0;if(cL(t,21)){e=BB(t,21);try{return n.gc()==e.gc()&&n.Ic(e)}catch(i){if(cL(i=lun(i),173)||cL(i,205))return!1;throw Hp(i)}}return!1}function USn(n,t){var i;WB(n.d,t),i=t.rf(),n.c?(n.e.a=e.Math.max(n.e.a,i.a),n.e.b+=i.b,n.d.c.length>1&&(n.e.b+=n.a)):(n.e.a+=i.a,n.e.b=e.Math.max(n.e.b,i.b),n.d.c.length>1&&(n.e.a+=n.a))}function XSn(n){var t,e,i,r;switch(t=(r=n.i).b,i=r.j,e=r.g,r.a.g){case 0:e.a=(n.g.b.o.a-i.a)/2;break;case 1:e.a=t.d.n.a+t.d.a.a;break;case 2:e.a=t.d.n.a+t.d.a.a-i.a;break;case 3:e.b=t.d.n.b+t.d.a.b}}function WSn(n,t,e,i,r){if(i<t||r<e)throw Hp(new _y("The highx must be bigger then lowx and the highy must be bigger then lowy"));return n.a<t?n.a=t:n.a>i&&(n.a=i),n.b<e?n.b=e:n.b>r&&(n.b=r),n}function VSn(n){if(cL(n,149))return MNn(BB(n,149));if(cL(n,229))return Zbn(BB(n,229));if(cL(n,23))return hSn(BB(n,23));throw Hp(new _y(z6n+LMn(new Jy(Pun(Gk(Ant,1),HWn,1,5,[n])))))}function QSn(n,t,e,i,r){var c,a,u;for(c=!0,a=0;a<i;a++)c&=0==e[a];if(0==r)aHn(e,i,n,0,t),a=t;else{for(u=32-r,c&=e[a]<<u==0,a=0;a<t-1;a++)n[a]=e[a+i]>>>r|e[a+i+1]<<u;n[a]=e[a+i]>>>r,++a}return c}function YSn(n,t,e,i){var r,c;if(t.k==(uSn(),Put))for(c=new oz(ZL(fbn(t).a.Kc(),new h));dAn(c);)if((r=BB(U5(c),17)).c.i.k==Put&&n.c.a[r.c.i.c.p]==i&&n.c.a[t.c.p]==e)return!0;return!1}function JSn(n,t){var e,i,r,c;return t&=63,e=n.h&PQn,t<22?(c=e>>>t,r=n.m>>t|e<<22-t,i=n.l>>t|n.m<<22-t):t<44?(c=0,r=e>>>t-22,i=n.m>>t-22|n.h<<44-t):(c=0,r=0,i=e>>>t-44),M$(i&SQn,r&SQn,c&PQn)}function ZSn(n,t,e,i){var r;this.b=i,this.e=n==(oin(),Amt),r=t[e],this.d=kq($Nt,[sVn,ZYn],[177,25],16,[r.length,r.length],2),this.a=kq(ANt,[sVn,hQn],[48,25],15,[r.length,r.length],2),this.c=new zEn(t,e)}function nPn(n){var t,e,i;for(n.k=new o1((kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,n.j.c.length),i=new Wb(n.j);i.a<i.c.c.length;)t=(e=BB(n0(i),113)).d.j,JIn(n.k,t,e);n.e=iNn(gz(n.k))}function tPn(n,t){var e,i,r;TU(n.d,t),e=new ka,VW(n.c,t,e),e.f=Phn(t.c),e.a=Phn(t.d),e.d=(gxn(),(r=t.c.i.k)==(uSn(),Cut)||r==Tut),e.e=(i=t.d.i.k)==Cut||i==Tut,e.b=t.c.j==(kUn(),CIt),e.c=t.d.j==oIt}function ePn(n){var t,e,i,r,c;for(c=DWn,r=DWn,i=new Wb(kbn(n));i.a<i.c.c.length;)t=(e=BB(n0(i),213)).e.e-e.d.e,e.e==n&&t<r?r=t:t<c&&(c=t);return r==DWn&&(r=-1),c==DWn&&(c=-1),new rI(iln(r),iln(c))}function iPn(n,t){var i,r,c;return c=ZJn,qpn(),r=Zrt,c=e.Math.abs(n.b),(i=e.Math.abs(t.f-n.b))<c&&(c=i,r=nct),(i=e.Math.abs(n.a))<c&&(c=i,r=tct),(i=e.Math.abs(t.g-n.a))<c&&(c=i,r=Jrt),r}function rPn(n,t){var e,i,r;for(e=t.a.o.a,r=new Sb(new s1(vW(t.a).b,t.c,t.f+1));r.b<r.d.gc();)if(Px(r.b<r.d.gc()),(i=BB(r.d.Xb(r.c=r.b++),29)).c.a>=e)return hPn(n,t,i.p),!0;return!1}function cPn(n){var t;return 0!=(64&n.Db)?mSn(n):(t=new lN(Z5n),!n.a||oO(oO((t.a+=' "',t),n.a),'"'),oO(kE(oO(kE(oO(kE(oO(kE((t.a+=" (",t),n.i),","),n.j)," | "),n.g),","),n.f),")"),t.a)}function aPn(n,t,e){var i,r,c,a,u;for(u=axn(n.e.Tg(),t),r=BB(n.g,119),i=0,a=0;a<n.i;++a)if(c=r[a],u.rl(c.ak())){if(i==e)return fDn(n,a),ZM(),BB(t,66).Oj()?c:c.dd();++i}throw Hp(new Ay(e9n+e+o8n+i))}function uPn(n){var t,e,i;if(2==(t=n.c)||7==t||1==t)return wWn(),wWn(),sNt;for(i=OXn(n),e=null;2!=(t=n.c)&&7!=t&&1!=t;)e||(wWn(),wWn(),tqn(e=new r$(1),i),i=e),tqn(e,OXn(n));return i}function oPn(n,t,e){return n<0||n>e?dCn(n,e,"start index"):t<0||t>e?dCn(t,e,"end index"):$Rn("end index (%s) must not be less than start index (%s)",Pun(Gk(Ant,1),HWn,1,5,[iln(t),iln(n)]))}function sPn(n,t){var e,i,r,c;for(i=0,r=n.length;i<r;i++){c=n[i];try{c[1]?c[0].jm()&&(t=TG(t,c)):c[0].jm()}catch(a){if(!cL(a=lun(a),78))throw Hp(a);e=a,Dk(),yY(cL(e,477)?BB(e,477).ae():e)}}return t}function hPn(n,t,i){var r,c;for(i!=t.c+t.b.gc()&&wHn(t.a,ian(t,i-t.c)),c=t.a.c.p,n.a[c]=e.Math.max(n.a[c],t.a.o.a),r=BB(mMn(t.a,(hWn(),Plt)),15).Kc();r.Ob();)hon(BB(r.Pb(),70),tst,(hN(),!0))}function fPn(n,t){var i,r,c;c=qNn(t),hon(t,(hWn(),llt),c),c&&(r=DWn,AY(n.f,c)&&(r=BB(qI(AY(n.f,c)),19).a),qy(TD(mMn(i=BB(xq(t.g,0),17),Clt)))||VW(n,c,iln(e.Math.min(BB(mMn(i,wlt),19).a,r))))}function lPn(n,t,e){var i,r,c,a;for(t.p=-1,a=xwn(t,(ain(),qvt)).Kc();a.Ob();)for(r=new Wb(BB(a.Pb(),11).g);r.a<r.c.c.length;)t!=(c=(i=BB(n0(r),17)).d.i)&&(c.p<0?e.Fc(i):c.p>0&&lPn(n,c,e));t.p=0}function bPn(n){var t;this.c=new YT,this.f=n.e,this.e=n.d,this.i=n.g,this.d=n.c,this.b=n.b,this.k=n.j,this.a=n.a,n.i?this.j=n.i:this.j=new YK(t=BB(Vj(jMt),9),BB(SR(t,t.length),9),0),this.g=n.f}function wPn(n){var t,e,i,r;for(t=xX(oO(new lN("Predicates."),"and"),40),e=!0,r=new Sb(n);r.b<r.d.gc();)Px(r.b<r.d.gc()),i=r.d.Xb(r.c=r.b++),e||(t.a+=","),t.a+=""+i,e=!1;return(t.a+=")",t).a}function dPn(n,t,e){var i,r,c;if(!(e<=t+2))for(r=(e-t)/2|0,i=0;i<r;++i)l1(t+i,n.c.length),c=BB(n.c[t+i],11),c5(n,t+i,(l1(e-i-1,n.c.length),BB(n.c[e-i-1],11))),l1(e-i-1,n.c.length),n.c[e-i-1]=c}function gPn(n,t,e){var i,r,c,a,u,o,s;u=(c=n.d.p).e,o=c.r,n.g=new QK(o),i=(a=n.d.o.c.p)>0?u[a-1]:x8(Out,a1n,10,0,0,1),r=u[a],s=a<u.length-1?u[a+1]:x8(Out,a1n,10,0,0,1),t==e-1?uZ(n.g,r,s):uZ(n.g,i,r)}function pPn(n){var t;this.j=new Np,this.f=new Rv,this.b=new YK(t=BB(Vj(FIt),9),BB(SR(t,t.length),9),0),this.d=x8(ANt,hQn,25,(kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,15,1),this.g=n}function vPn(n,t){var e,i,r;if(0!=t.c.length){for(e=TMn(n,t),r=!1;!e;)E$n(n,t,!0),r=!0,e=TMn(n,t);r&&E$n(n,t,!1),i=Dun(t),n.b&&n.b.lg(i),n.a=$hn(n,(l1(0,t.c.length),BB(t.c[0],33))),vPn(n,i)}}function mPn(n,t){var e,i,r;if(i=itn(n.Tg(),t),(e=t-n.Ah())<0){if(!i)throw Hp(new _y(o6n+t+s6n));if(!i.Ij())throw Hp(new _y(r6n+i.ne()+c6n));(r=n.Yg(i))>=0?n.Bh(r):cIn(n,i)}else qfn(n,e,i)}function yPn(n){var t,e;if(e=null,t=!1,cL(n,204)&&(t=!0,e=BB(n,204).a),t||cL(n,258)&&(t=!0,e=""+BB(n,258).a),t||cL(n,483)&&(t=!0,e=""+BB(n,483).a),!t)throw Hp(new Ly(H6n));return e}function kPn(n,t){var e,i;if(n.f){for(;t.Ob();)if(cL(i=(e=BB(t.Pb(),72)).ak(),99)&&0!=(BB(i,18).Bb&h6n)&&(!n.e||i.Gj()!=NOt||0!=i.aj())&&null!=e.dd())return t.Ub(),!0;return!1}return t.Ob()}function jPn(n,t){var e,i;if(n.f){for(;t.Sb();)if(cL(i=(e=BB(t.Ub(),72)).ak(),99)&&0!=(BB(i,18).Bb&h6n)&&(!n.e||i.Gj()!=NOt||0!=i.aj())&&null!=e.dd())return t.Pb(),!0;return!1}return t.Sb()}function EPn(n,t,e){var i,r,c,a,u,o;for(o=axn(n.e.Tg(),t),i=0,u=n.i,r=BB(n.g,119),a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak())){if(e==i)return a;++i,u=a+1}if(e==i)return u;throw Hp(new Ay(e9n+e+o8n+i))}function TPn(n,t){var i,r,c;if(0==n.f.c.length)return null;for(c=new bA,i=new Wb(n.f);i.a<i.c.c.length;)r=BB(n0(i),70).o,c.b=e.Math.max(c.b,r.a),c.a+=r.b;return c.a+=(n.f.c.length-1)*t,c}function MPn(n,t,e){var i,r,c;for(r=new oz(ZL(hbn(e).a.Kc(),new h));dAn(r);)b5(i=BB(U5(r),17))||!b5(i)&&i.c.i.c==i.d.i.c||(c=zLn(n,i,e,new um)).c.length>1&&(t.c[t.c.length]=c)}function SPn(n){var t,e,i;for(Frn(e=new YT,n.o),i=new om;0!=e.b;)WUn(n,t=BB(0==e.b?null:(Px(0!=e.b),Atn(e,e.a.a)),508),!0)&&WB(i.a,t);for(;0!=i.a.c.length;)WUn(n,t=BB(thn(i),508),!1)}function PPn(){PPn=O,kMt=new $C(hJn,0),wMt=new $C("BOOLEAN",1),vMt=new $C("INT",2),yMt=new $C("STRING",3),dMt=new $C("DOUBLE",4),gMt=new $C("ENUM",5),pMt=new $C("ENUMSET",6),mMt=new $C("OBJECT",7)}function CPn(n,t){var i,r,c,a,u;r=e.Math.min(n.c,t.c),a=e.Math.min(n.d,t.d),(c=e.Math.max(n.c+n.b,t.c+t.b))<r&&(i=r,r=c,c=i),(u=e.Math.max(n.d+n.a,t.d+t.a))<a&&(i=a,a=u,u=i),xH(n,r,a,c-r,u-a)}function IPn(){IPn=O,J$t=Pun(Gk(Qtt,1),sVn,2,6,[w7n,d7n,g7n,p7n,v7n,m7n,n8n]),Y$t=Pun(Gk(Qtt,1),sVn,2,6,[w7n,"empty",d7n,K9n,"elementOnly"]),nLt=Pun(Gk(Qtt,1),sVn,2,6,[w7n,"preserve","replace",y7n]),Z$t=new SH}function OPn(n,t,e){var i,r,c;if(t!=e){i=t;do{UR(n,i.c),(r=i.e)&&(_x(n,(c=i.d).b,c.d),UR(n,r.n),i=vW(r))}while(r);i=e;do{XR(n,i.c),(r=i.e)&&(Bx(n,(c=i.d).b,c.d),XR(n,r.n),i=vW(r))}while(r)}}function APn(n,t,e,i){var r,c,a,u,o;if(i.f.c+i.g.c==0)for(u=0,o=(a=n.a[n.c]).length;u<o;++u)VW(i,c=a[u],new kcn(n,c,e));return(r=BB(qI(AY(i.f,t)),663)).b=0,r.c=r.f,0==r.c||Tb(BB(xq(r.a,r.b),287)),r}function $Pn(){$Pn=O,Zst=new jP("MEDIAN_LAYER",0),tht=new jP("TAIL_LAYER",1),Jst=new jP("HEAD_LAYER",2),nht=new jP("SPACE_EFFICIENT_LAYER",3),eht=new jP("WIDEST_LAYER",4),Yst=new jP("CENTER_LAYER",5)}function LPn(n){switch(n.g){case 0:case 1:case 2:return kUn(),sIt;case 3:case 4:case 5:return kUn(),SIt;case 6:case 7:case 8:return kUn(),CIt;case 9:case 10:case 11:return kUn(),oIt;default:return kUn(),PIt}}function NPn(n,t){var e;return 0!=n.c.length&&(e=tdn((l1(0,n.c.length),BB(n.c[0],17)).c.i),BZ(),e==(bvn(),fvt)||e==hvt||o5($V(new Rq(null,new w1(n,16)),new Fc),new ig(t)))}function xPn(n,t,e){var i,r,c;if(!n.b[t.g]){for(n.b[t.g]=!0,!(i=e)&&(i=new P6),DH(i.b,t),c=n.a[t.g].Kc();c.Ob();)(r=BB(c.Pb(),188)).b!=t&&xPn(n,r.b,i),r.c!=t&&xPn(n,r.c,i),DH(i.a,r);return i}return null}function DPn(){DPn=O,Qyt=new lC("ROOT_PROC",0),Uyt=new lC("FAN_PROC",1),Wyt=new lC("NEIGHBORS_PROC",2),Xyt=new lC("LEVEL_HEIGHT",3),Vyt=new lC("NODE_POSITION_PROC",4),zyt=new lC("DETREEIFYING_PROC",5)}function RPn(n,t){if(cL(t,239))return zA(n,BB(t,33));if(cL(t,186))return UA(n,BB(t,118));if(cL(t,439))return GA(n,BB(t,202));throw Hp(new _y(z6n+LMn(new Jy(Pun(Gk(Ant,1),HWn,1,5,[t])))))}function KPn(n,t,e){var i,r;if(this.f=n,w6(e,r=(i=BB(RX(n.b,t),283))?i.a:0),e>=(r/2|0))for(this.e=i?i.c:null,this.d=r;e++<r;)TZ(this);else for(this.c=i?i.b:null;e-- >0;)EZ(this);this.b=t,this.a=null}function _Pn(n,t){var e,i;t.a?zNn(n,t):(!!(e=BB(kK(n.b,t.b),57))&&e==n.a[t.b.f]&&!!e.a&&e.a!=t.b.a&&e.c.Fc(t.b),!!(i=BB(yK(n.b,t.b),57))&&n.a[i.f]==t.b&&!!i.a&&i.a!=t.b.a&&t.b.c.Fc(i),MN(n.b,t.b))}function FPn(n,t){var e,i;if(e=BB(oV(n.b,t),124),BB(BB(h6(n.r,t),21),84).dc())return e.n.b=0,void(e.n.c=0);e.n.b=n.C.b,e.n.c=n.C.c,n.A.Hc((mdn(),_It))&&yRn(n,t),i=Xpn(n,t),PDn(n,t)==(cpn(),BCt)&&(i+=2*n.w),e.a.a=i}function BPn(n,t){var e,i;if(e=BB(oV(n.b,t),124),BB(BB(h6(n.r,t),21),84).dc())return e.n.d=0,void(e.n.a=0);e.n.d=n.C.d,e.n.a=n.C.a,n.A.Hc((mdn(),_It))&&kRn(n,t),i=Wpn(n,t),PDn(n,t)==(cpn(),BCt)&&(i+=2*n.w),e.a.b=i}function HPn(n,t){var e,i,r,c;for(c=new Np,i=new Wb(t);i.a<i.c.c.length;)WB(c,new RS(e=BB(n0(i),65),!0)),WB(c,new RS(e,!1));my((r=new hY(n)).a.a),e2(c,n.b,new Jy(Pun(Gk(oit,1),HWn,679,0,[r])))}function qPn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w;return u=n.a,f=n.b,o=t.a,l=t.b,s=e.a,b=e.b,new xC(((c=u*l-f*o)*(s-(h=i.a))-(a=s*(w=i.b)-b*h)*(u-o))/(r=(u-o)*(b-w)-(f-l)*(s-h)),(c*(b-w)-a*(f-l))/r)}function GPn(n,t){var e,i,r;if(!n.d[t.p]){for(n.d[t.p]=!0,n.a[t.p]=!0,i=new oz(ZL(lbn(t).a.Kc(),new h));dAn(i);)b5(e=BB(U5(i),17))||(r=e.d.i,n.a[r.p]?WB(n.b,e):GPn(n,r));n.a[t.p]=!1}}function zPn(n,t,e){var i;switch(i=0,BB(mMn(t,(HXn(),kgt)),163).g){case 2:i=2*-e+n.a,++n.a;break;case 1:i=-e;break;case 3:i=e;break;case 4:i=2*e+n.b,++n.b}return Lx(t,(hWn(),wlt))&&(i+=BB(mMn(t,wlt),19).a),i}function UPn(n,t,e){var i,r,c;for(e.zc(t,n),WB(n.n,t),c=n.p.eg(t),t.j==n.p.fg()?Obn(n.e,c):Obn(n.j,c),rX(n),r=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(t),new Gw(t)])));dAn(r);)i=BB(U5(r),11),e._b(i)||UPn(n,i,e)}function XPn(n){var t,e;return BB(ZAn(n,(sWn(),KSt)),21).Hc((mdn(),DIt))?(e=BB(ZAn(n,qSt),21),t=new wA(BB(ZAn(n,BSt),8)),e.Hc((n_n(),GIt))&&(t.a<=0&&(t.a=20),t.b<=0&&(t.b=20)),t):new Gj}function WPn(n){var t,e,i;if(!n.b){for(i=new Co,e=new ax(RBn(n));e.e!=e.i.gc();)0!=((t=BB(jpn(e),18)).Bb&h6n)&&f9(i,t);chn(i),n.b=new NO((BB(Wtn(QQ((QX(),t$t).o),8),18),i.i),i.g),P5(n).b&=-9}return n.b}function VPn(n,t){var e,i,r,c,a,u;a=BB(Emn(gz(t.k),x8(FIt,YZn,61,2,0,1)),122),Zmn(n,u=t.g,e=o3(t,a[0]),i=u3(t,a[1]))<=Zmn(n,u,r=o3(t,a[1]),c=u3(t,a[0]))?(t.a=e,t.c=i):(t.a=r,t.c=c)}function QPn(n,t,e){var i,r,c;for(OTn(e,"Processor set neighbors",1),n.a=0==t.b.b?1:t.b.b,r=null,i=spn(t.b,0);!r&&i.b!=i.d.c;)qy(TD(mMn(c=BB(b3(i),86),(qqn(),dkt))))&&(r=c);r&&LDn(n,new bg(r),e),HSn(e)}function YPn(n){var t,e,i,r;return RHn(),t=-1==(i=GO(n,YTn(35)))?n:n.substr(0,i),e=-1==i?null:n.substr(i+1),(r=V3(EAt,t))?null!=e&&(r=Csn(r,(kW(e),e))):(r=WXn(t),a5(EAt,t,r),null!=e&&(r=Csn(r,e))),r}function JPn(n){var t,e,i,r,c,a,u;if(SQ(),cL(n,54))for(c=0,r=n.gc()-1;c<r;++c,--r)t=n.Xb(c),n._c(c,n.Xb(r)),n._c(r,t);else for(e=n.Yc(),a=n.Zc(n.gc());e.Tb()<a.Vb();)i=e.Pb(),u=a.Ub(),e.Wb(u),a.Wb(i)}function ZPn(n,t){var e,i,r;OTn(t,"End label pre-processing",1),e=Gy(MD(mMn(n,(HXn(),jpt)))),i=Gy(MD(mMn(n,Spt))),r=gA(BB(mMn(n,Udt),103)),JT(wnn(new Rq(null,new w1(n.b,16)),new he),new D_(e,i,r)),HSn(t)}function nCn(n,t){var e,i,r,c,a,u;for(u=0,d3(c=new Lp,t);c.b!=c.c;)for(u+=syn((a=BB(dU(c),214)).d,a.e),r=new Wb(a.b);r.a<r.c.c.length;)i=BB(n0(r),37),(e=BB(xq(n.b,i.p),214)).s||(u+=nCn(n,e));return u}function tCn(n,t,i){var r,c;_an(this),t==(dJ(),Lyt)?TU(this.r,n.c):TU(this.w,n.c),TU(i==Lyt?this.r:this.w,n.d),tPn(this,n),XMn(this,r=Phn(n.c),c=Phn(n.d),c),this.o=(gxn(),e.Math.abs(r-c)<.2)}function eCn(n,t,e){var i,r,c,a,u;if(null!=(a=BB(yan(n.a,8),1936)))for(r=0,c=a.length;r<c;++r)null.jm();i=e,0==(1&n.a.Db)&&(u=new uW(n,e,t),i.ui(u)),cL(i,672)?BB(i,672).wi(n.a):i.ti()==n.a&&i.vi(null)}function iCn(){var n;return ZLt?BB($$n((WM(),zAt),S7n),1945):(sUn(),n=BB(cL(SJ((WM(),zAt),S7n),586)?SJ(zAt,S7n):new zW,586),ZLt=!0,gXn(n),pWn(n),VW((VM(),ZAt),n,new Ks),Tyn(n),mZ(zAt,S7n,n),n)}function rCn(n,t,e,i){var r;return(r=zTn(n,e,Pun(Gk(Qtt,1),sVn,2,6,[bQn,wQn,dQn,gQn,pQn,vQn,mQn]),t))<0&&(r=zTn(n,e,Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]),t)),!(r<0||(i.d=r,0))}function cCn(n,t,e,i){var r;return(r=zTn(n,e,Pun(Gk(Qtt,1),sVn,2,6,[bQn,wQn,dQn,gQn,pQn,vQn,mQn]),t))<0&&(r=zTn(n,e,Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]),t)),!(r<0||(i.d=r,0))}function aCn(n){var t,e,i;for(_$n(n),i=new Np,e=new Wb(n.a.a.b);e.a<e.c.c.length;)WB(i,new fP(t=BB(n0(e),81),!0)),WB(i,new fP(t,!1));nmn(n.c),i2(i,n.b,new Jy(Pun(Gk(Jat,1),HWn,369,0,[n.c]))),vAn(n)}function uCn(n){var t,e,i,r;for(e=new xp,r=new Wb(n.d);r.a<r.c.c.length;)i=BB(n0(r),181),t=BB(i.We((hWn(),Uft)),17),AY(e.f,t)||VW(e,t,new TQ(t)),WB(BB(qI(AY(e.f,t)),456).b,i);return new t_(new Ob(e))}function oCn(n,t){var e,i,r,c,a;for(i=new d1(n.j.c.length),e=null,c=new Wb(n.j);c.a<c.c.c.length;)(r=BB(n0(c),11)).j!=e&&(i.b==i.c||F$n(i,e,t),o4(i),e=r.j),(a=mAn(r))&&w3(i,a);i.b==i.c||F$n(i,e,t)}function sCn(n,t){var e,i;for(i=new M2(n.b,0);i.b<i.d.gc();)Px(i.b<i.d.gc()),e=BB(i.d.Xb(i.c=i.b++),70),BB(mMn(e,(HXn(),Ydt)),272)==(Rtn(),UPt)&&(fW(i),WB(t.b,e),Lx(e,(hWn(),Uft))||hon(e,Uft,n))}function hCn(n){var t,i,r;for(t=F3(new oz(ZL(lbn(n).a.Kc(),new h))),i=new oz(ZL(fbn(n).a.Kc(),new h));dAn(i);)r=F3(new oz(ZL(lbn(BB(U5(i),17).c.i).a.Kc(),new h))),t=e.Math.max(t,r);return iln(t)}function fCn(n,t,e){var i,r,c,a;for(OTn(e,"Processor arrange node",1),r=null,c=new YT,i=spn(t.b,0);!r&&i.b!=i.d.c;)qy(TD(mMn(a=BB(b3(i),86),(qqn(),dkt))))&&(r=a);r5(c,r,c.c.b,c.c),Yzn(n,c,mcn(e,1)),HSn(e)}function lCn(n,t,e){var i,r,c;i=BB(ZAn(n,(sWn(),hSt)),21),r=0,c=0,t.a>e.a&&(i.Hc((wEn(),WMt))?r=(t.a-e.a)/2:i.Hc(QMt)&&(r=t.a-e.a)),t.b>e.b&&(i.Hc((wEn(),JMt))?c=(t.b-e.b)/2:i.Hc(YMt)&&(c=t.b-e.b)),lMn(n,r,c)}function bCn(n,t,e,i,r,c,a,u,o,s,h,f,l){cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),4),Nrn(n,e),n.f=a,$ln(n,u),Nln(n,o),Aln(n,s),Lln(n,h),nln(n,f),qln(n,l),Yfn(n,!0),Len(n,r),n.ok(c),Ihn(n,t),null!=i&&(n.i=null,arn(n,i))}function wCn(n){var t,e;if(n.f){for(;n.n>0;){if(cL(e=(t=BB(n.k.Xb(n.n-1),72)).ak(),99)&&0!=(BB(e,18).Bb&h6n)&&(!n.e||e.Gj()!=NOt||0!=e.aj())&&null!=t.dd())return!0;--n.n}return!1}return n.n>0}function dCn(n,t,e){if(n<0)return $Rn(BWn,Pun(Gk(Ant,1),HWn,1,5,[e,iln(n)]));if(t<0)throw Hp(new _y(qWn+t));return $Rn("%s (%s) must not be greater than size (%s)",Pun(Gk(Ant,1),HWn,1,5,[e,iln(n),iln(t)]))}function gCn(n,t,e,i,r,c){var a,u,o;if(i-e<7)$bn(t,e,i,c);else if(gCn(t,n,u=e+r,o=u+((a=i+r)-u>>1),-r,c),gCn(t,n,o,a,-r,c),c.ue(n[o-1],n[o])<=0)for(;e<i;)$X(t,e++,n[u++]);else Gfn(n,u,o,a,t,e,i,c)}function pCn(n,t){var e,i,r;for(r=new Np,i=new Wb(n.c.a.b);i.a<i.c.c.length;)e=BB(n0(i),57),t.Lb(e)&&(WB(r,new OS(e,!0)),WB(r,new OS(e,!1)));Zvn(n.e),e2(r,n.d,new Jy(Pun(Gk(oit,1),HWn,679,0,[n.e])))}function vCn(n,t){var e,i,r,c,a,u,o;for(o=t.d,r=t.b.j,u=new Wb(o);u.a<u.c.c.length;)for(a=BB(n0(u),101),c=x8($Nt,ZYn,25,r.c.length,16,1),VW(n.b,a,c),e=a.a.d.p-1,i=a.c.d.p;e!=i;)c[e=(e+1)%r.c.length]=!0}function mCn(n,t){for(n.r=new Fan(n.p),Jl(n.r,n),Frn(n.r.j,n.j),yQ(n.j),DH(n.j,t),DH(n.r.e,t),rX(n),rX(n.r);0!=n.f.c.length;)G$(BB(xq(n.f,0),129));for(;0!=n.k.c.length;)G$(BB(xq(n.k,0),129));return n.r}function yCn(n,t,e){var i,r,c;if(r=itn(n.Tg(),t),(i=t-n.Ah())<0){if(!r)throw Hp(new _y(o6n+t+s6n));if(!r.Ij())throw Hp(new _y(r6n+r.ne()+c6n));(c=n.Yg(r))>=0?n.sh(c,e):TLn(n,r,e)}else Lbn(n,i,r,e)}function kCn(n){var t,e,i,r;if(e=BB(n,49).qh())try{if(i=null,(t=$$n((WM(),zAt),M_n(_bn(e))))&&(r=t.rh())&&(i=r.Wk(Xy(e.e))),i&&i!=n)return kCn(i)}catch(c){if(!cL(c=lun(c),60))throw Hp(c)}return n}function jCn(n,t,e){var i,r,c,a;if(a=null==t?0:n.b.se(t),0==(r=null==(i=n.a.get(a))?new Array:i).length)n.a.set(a,r);else if(c=hhn(n,t,r))return c.ed(e);return $X(r,r.length,new PS(t,e)),++n.c,oY(n.b),null}function ECn(n,t){var e;return h2(n.a),CU(n.a,(Prn(),Qkt),Qkt),CU(n.a,Ykt,Ykt),dq(e=new B2,Ykt,(Cbn(),ejt)),GI(ZAn(t,(Uyn(),Sjt)))!==GI((Hsn(),sjt))&&dq(e,Ykt,njt),dq(e,Ykt,tjt),aA(n.a,e),$qn(n.a,t)}function TCn(n){if(!n)return lk(),htt;var t=n.valueOf?n.valueOf():n;if(t!==n){var i=ftt[typeof t];return i?i(t):khn(typeof t)}return n instanceof Array||n instanceof e.Array?new Tl(n):new Pl(n)}function MCn(n,t,i){var r,c,a;switch(a=n.o,(c=(r=BB(oV(n.p,i),244)).i).b=SIn(r),c.a=MIn(r),c.b=e.Math.max(c.b,a.a),c.b>a.a&&!t&&(c.b=a.a),c.c=-(c.b-a.a)/2,i.g){case 1:c.d=-c.a;break;case 3:c.d=a.b}_Fn(r),GFn(r)}function SCn(n,t,i){var r,c,a;switch(a=n.o,(c=(r=BB(oV(n.p,i),244)).i).b=SIn(r),c.a=MIn(r),c.a=e.Math.max(c.a,a.b),c.a>a.b&&!t&&(c.a=a.b),c.d=-(c.a-a.b)/2,i.g){case 4:c.c=-c.b;break;case 2:c.c=a.a}_Fn(r),GFn(r)}function PCn(n,t){var e,i,r,c,a;if(!t.dc())if(r=BB(t.Xb(0),128),1!=t.gc())for(e=1;e<t.gc();)!r.j&&r.o||(c=vyn(t,e))&&(i=BB(c.a,19).a,kxn(n,r,a=BB(c.b,128),e,i,t),e=i+1,r=a);else kxn(n,r,r,1,0,t)}function CCn(n){var t,e,i,r;for(m$(r=new t_(n.d),new zr),kDn(),t=Pun(Gk(iht,1),$Vn,270,0,[Bst,Gst,Fst,Xst,qst,Hst,Ust,zst]),e=0,i=new Wb(r);i.a<i.c.c.length;)COn(BB(n0(i),101),t[e%t.length]),++e}function ICn(n,t){var e,i,r,c;if(jDn(),t.b<2)return!1;for(i=e=BB(b3(c=spn(t,0)),8);c.b!=c.d.c;){if(r=BB(b3(c),8),!Dcn(n,i)||!Dcn(n,r))return!1;i=r}return!(!Dcn(n,i)||!Dcn(n,e))}function OCn(n,t){var e,i,r,c,a;return e=Ren(a=n,"x"),nnn(new qg(t).a,e),i=Ren(a,"y"),tnn(new Gg(t).a,i),r=Ren(a,C6n),enn(new zg(t).a,r),c=Ren(a,P6n),inn(new Ug(t).a,c),c}function ACn(n,t){dRn(n,t),0!=(1&n.b)&&(n.a.a=null),0!=(2&n.b)&&(n.a.f=null),0!=(4&n.b)&&(n.a.g=null,n.a.i=null),0!=(16&n.b)&&(n.a.d=null,n.a.e=null),0!=(8&n.b)&&(n.a.b=null),0!=(32&n.b)&&(n.a.j=null,n.a.c=null)}function $Cn(n,t){var e,i;if(i=0,t.length>0)try{i=l_n(t,_Vn,DWn)}catch(r){throw cL(r=lun(r),127)?Hp(new L7(r)):Hp(r)}return!n.a&&(n.a=new Sp(n)),i<(e=n.a).i&&i>=0?BB(Wtn(e,i),56):null}function LCn(n,t){if(n<0)return $Rn(BWn,Pun(Gk(Ant,1),HWn,1,5,["index",iln(n)]));if(t<0)throw Hp(new _y(qWn+t));return $Rn("%s (%s) must be less than size (%s)",Pun(Gk(Ant,1),HWn,1,5,["index",iln(n),iln(t)]))}function NCn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+t);return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function xCn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+t);return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function DCn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+t);return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function RCn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+t);return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function KCn(n,t){var e,i,r,c,a,u;for(e=n.b.c.length,r=xq(n.b,t);2*t+1<e&&(u=c=2*t+1,(a=c+1)<e&&n.a.ue(xq(n.b,a),xq(n.b,c))<0&&(u=a),i=u,!(n.a.ue(r,xq(n.b,i))<0));)c5(n.b,t,xq(n.b,i)),t=i;c5(n.b,t,r)}function _Cn(n,t,i,r,c,a){var u,o,s,h,f;for(GI(n)===GI(i)&&(n=n.slice(t,t+c),t=0),s=i,o=t,h=t+c;o<h;)c=(u=e.Math.min(o+1e4,h))-o,(f=n.slice(o,u)).splice(0,0,r,a?c:0),Array.prototype.splice.apply(s,f),o=u,r+=c}function FCn(n,t,e){var i,r;return i=e.d,r=e.e,n.g[i.d]<=n.i[t.d]&&n.i[t.d]<=n.i[i.d]&&n.g[r.d]<=n.i[t.d]&&n.i[t.d]<=n.i[r.d]?!(n.i[i.d]<n.i[r.d]):n.i[i.d]<n.i[r.d]}function BCn(n){var t,e,i,r,c,a,u;if((i=n.a.c.length)>0)for(a=n.c.d,r=kL(XR(new xC((u=n.d.d).a,u.b),a),1/(i+1)),c=new xC(a.a,a.b),e=new Wb(n.a);e.a<e.c.c.length;)(t=BB(n0(e),559)).d.a=c.a,t.d.b=c.b,UR(c,r)}function HCn(n,t,i){var r,c,a,u,o,s;for(s=RQn,a=new Wb(GLn(n.b));a.a<a.c.c.length;)for(c=BB(n0(a),168),o=new Wb(GLn(t.b));o.a<o.c.c.length;)u=BB(n0(o),168),r=Cun(c.a,c.b,u.a,u.b,i),s=e.Math.min(s,r);return s}function qCn(n,t){if(!t)throw Hp(new gv);if(n.j=t,!n.d)switch(n.j.g){case 1:n.a.a=n.o.a/2,n.a.b=0;break;case 2:n.a.a=n.o.a,n.a.b=n.o.b/2;break;case 3:n.a.a=n.o.a/2,n.a.b=n.o.b;break;case 4:n.a.a=0,n.a.b=n.o.b/2}}function GCn(n,t){var i,r;return cL(t.g,10)&&BB(t.g,10).k==(uSn(),Mut)?RQn:f3(t)?e.Math.max(0,n.b/2-.5):(i=f2(t))?(r=Gy(MD(edn(i,(HXn(),Opt)))),e.Math.max(0,r/2-.5)):RQn}function zCn(n,t){var i,r;return cL(t.g,10)&&BB(t.g,10).k==(uSn(),Mut)?RQn:f3(t)?e.Math.max(0,n.b/2-.5):(i=f2(t))?(r=Gy(MD(edn(i,(HXn(),Opt)))),e.Math.max(0,r/2-.5)):RQn}function UCn(n){var t,e,i,r;for(r=Lfn(n.d,n.e).Kc();r.Ob();)for(i=BB(r.Pb(),11),e=new Wb(n.e==(kUn(),CIt)?i.e:i.g);e.a<e.c.c.length;)b5(t=BB(n0(e),17))||t.c.i.c==t.d.i.c||(RSn(n,t),++n.f,++n.c)}function XCn(n,t){var e,i;if(t.dc())return SQ(),SQ(),set;for(WB(i=new Np,iln(_Vn)),e=1;e<n.f;++e)null==n.a&&wRn(n),n.a[e]&&WB(i,iln(e));return 1==i.c.length?(SQ(),SQ(),set):(WB(i,iln(DWn)),dBn(t,i))}function WCn(n,t){var e,i,r,c,a,u;e=ckn(t,u=t.c.i.k!=(uSn(),Cut)?t.d:t.c).i,r=BB(RX(n.k,u),121),i=n.i[e.p].a,AK(u.i)<(e.c?E7(e.c.a,e,0):-1)?(c=r,a=i):(c=i,a=r),UNn(aM(cM(uM(rM(new Hv,0),4),c),a))}function VCn(n,t,e){var i,r,c;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)(c=Amn(n,kIn(dnn(e,BB(r.Pb(),19).a))))&&(!t.b&&(t.b=new hK(KOt,t,4,7)),f9(t.b,c))}function QCn(n,t,e){var i,r,c;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)(c=Amn(n,kIn(dnn(e,BB(r.Pb(),19).a))))&&(!t.c&&(t.c=new hK(KOt,t,5,8)),f9(t.c,c))}function YCn(n,t,e){var i,r;i=t.a&n.f,t.b=n.b[i],n.b[i]=t,r=t.f&n.f,t.d=n.c[r],n.c[r]=t,e?(t.e=e.e,t.e?t.e.c=t:n.a=t,t.c=e.c,t.c?t.c.e=t:n.e=t):(t.e=n.e,t.c=null,n.e?n.e.c=t:n.a=t,n.e=t),++n.i,++n.g}function JCn(n){var t,e,i;if(t=n.Pb(),!n.Ob())return t;for(i=uO(oO(new Ck,"expected one element but was: <"),t),e=0;e<4&&n.Ob();e++)uO((i.a+=FWn,i),n.Pb());throw n.Ob()&&(i.a+=", ..."),i.a+=">",Hp(new _y(i.a))}function ZCn(n,t){var e;t.d?t.d.b=t.b:n.a=t.b,t.b?t.b.d=t.d:n.e=t.d,t.e||t.c?(--(e=BB(RX(n.b,t.a),283)).a,t.e?t.e.c=t.c:e.b=t.c,t.c?t.c.e=t.e:e.c=t.e):((e=BB(v6(n.b,t.a),283)).a=0,++n.c),--n.d}function nIn(n){var t,e;return e=-n.a,t=Pun(Gk(ONt,1),WVn,25,15,[43,48,48,48,48]),e<0&&(t[0]=45,e=-e),t[1]=t[1]+((e/60|0)/10|0)&QVn,t[2]=t[2]+(e/60|0)%10&QVn,t[3]=t[3]+(e%60/10|0)&QVn,t[4]=t[4]+e%10&QVn,Bdn(t,0,t.length)}function tIn(n,t,e){var i,r;for(i=t.d,r=e.d;i.a-r.a==0&&i.b-r.b==0;)i.a+=H$n(n,26)*rYn+H$n(n,27)*cYn-.5,i.b+=H$n(n,26)*rYn+H$n(n,27)*cYn-.5,r.a+=H$n(n,26)*rYn+H$n(n,27)*cYn-.5,r.b+=H$n(n,26)*rYn+H$n(n,27)*cYn-.5}function eIn(n){var t,e,i,r;for(n.g=new Hbn(BB(yX(FIt),290)),i=0,kUn(),e=sIt,t=0;t<n.j.c.length;t++)(r=BB(xq(n.j,t),11)).j!=e&&(i!=t&&mG(n.g,e,new rI(iln(i),iln(t))),e=r.j,i=t);mG(n.g,e,new rI(iln(i),iln(t)))}function iIn(n){var t,e,i,r,c;for(e=0,t=new Wb(n.b);t.a<t.c.c.length;)for(r=new Wb(BB(n0(t),29).a);r.a<r.c.c.length;)for((i=BB(n0(r),10)).p=e++,c=new Wb(i.j);c.a<c.c.c.length;)BB(n0(c),11).p=e++}function rIn(n,t,e,i,r){var c,a,u,o;if(t)for(a=t.Kc();a.Ob();)for(o=cRn(BB(a.Pb(),10),(ain(),qvt),e).Kc();o.Ob();)u=BB(o.Pb(),11),(c=BB(qI(AY(r.f,u)),112))||(c=new Fan(n.d),i.c[i.c.length]=c,UPn(c,u,r))}function cIn(n,t){var e,i,r;if(!(r=Fqn((IPn(),Z$t),n.Tg(),t)))throw Hp(new _y(r6n+t.ne()+c6n));ZM(),BB(r,66).Oj()||(r=Z1(B7(Z$t,r))),i=BB((e=n.Yg(r))>=0?n._g(e,!0,!0):cOn(n,r,!0),153),BB(i,215).ol(t)}function aIn(n){var t,i;return n>-0x800000000000&&n<0x800000000000?0==n?0:((t=n<0)&&(n=-n),i=CJ(e.Math.floor(e.Math.log(n)/.6931471805599453)),(!t||n!=e.Math.pow(2,i))&&++i,i):Van(fan(n))}function uIn(n){var t,e,i,r,c,a,u;for(c=new fA,e=new Wb(n);e.a<e.c.c.length;)a=(t=BB(n0(e),129)).a,u=t.b,c.a._b(a)||c.a._b(u)||(r=a,i=u,a.e.b+a.j.b>2&&u.e.b+u.j.b<=2&&(r=u,i=a),c.a.zc(r,c),r.q=i);return c}function oIn(n,t){var e,i,r;return qan(i=new $vn(n),t),hon(i,(hWn(),Vft),t),hon(i,(HXn(),ept),(QEn(),XCt)),hon(i,kdt,(wvn(),OMt)),Bl(i,(uSn(),Mut)),CZ(e=new CSn,i),qCn(e,(kUn(),CIt)),CZ(r=new CSn,i),qCn(r,oIt),i}function sIn(n){switch(n.g){case 0:return new Ny((oin(),Omt));case 1:return new df;case 2:return new jf;default:throw Hp(new _y("No implementation is available for the crossing minimizer "+(null!=n.f?n.f:""+n.g)))}}function hIn(n,t){var e,i,r,c;for(n.c[t.p]=!0,WB(n.a,t),c=new Wb(t.j);c.a<c.c.c.length;)for(e=new m6((r=BB(n0(c),11)).b);y$(e.a)||y$(e.b);)i=ngn(r,BB(y$(e.a)?n0(e.a):n0(e.b),17)).i,n.c[i.p]||hIn(n,i)}function fIn(n){var t,i,r,c,a,u,o;for(u=0,i=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));i.e!=i.i.gc();)o=(t=BB(kpn(i),33)).g,c=t.f,r=e.Math.sqrt(o*o+c*c),u=e.Math.max(r,u),a=fIn(t),u=e.Math.max(a,u);return u}function lIn(){lIn=O,rIt=new XC("OUTSIDE",0),eIt=new XC("INSIDE",1),iIt=new XC("NEXT_TO_PORT_IF_POSSIBLE",2),tIt=new XC("ALWAYS_SAME_SIDE",3),nIt=new XC("ALWAYS_OTHER_SAME_SIDE",4),cIt=new XC("SPACE_EFFICIENT",5)}function bIn(n,t,e){var i,r,c,a;return $in(i=K2(n,(tE(),r=new jm,!!e&&nNn(r,e),r),t),R2(t,q6n)),STn(t,i),o$n(t,i),OCn(t,i),c=N2(t,"ports"),PLn((a=new pI(n,i)).a,a.b,c),xon(n,t,i),aun(n,t,i),i}function wIn(n){var t,e;return e=-n.a,t=Pun(Gk(ONt,1),WVn,25,15,[43,48,48,58,48,48]),e<0&&(t[0]=45,e=-e),t[1]=t[1]+((e/60|0)/10|0)&QVn,t[2]=t[2]+(e/60|0)%10&QVn,t[4]=t[4]+(e%60/10|0)&QVn,t[5]=t[5]+e%10&QVn,Bdn(t,0,t.length)}function dIn(n){var t;return t=Pun(Gk(ONt,1),WVn,25,15,[71,77,84,45,48,48,58,48,48]),n<=0&&(t[3]=43,n=-n),t[4]=t[4]+((n/60|0)/10|0)&QVn,t[5]=t[5]+(n/60|0)%10&QVn,t[7]=t[7]+(n%60/10|0)&QVn,t[8]=t[8]+n%10&QVn,Bdn(t,0,t.length)}function gIn(n){var t,e,i,r,c;if(null==n)return zWn;for(c=new $an(FWn,"[","]"),i=0,r=(e=n).length;i<r;++i)t=e[i],c.a?oO(c.a,c.b):c.a=new lN(c.d),aO(c.a,""+vz(t));return c.a?0==c.e.length?c.a.a:c.a.a+""+c.e:c.c}function pIn(n,t){var i,r,c;for(c=DWn,r=new Wb(kbn(t));r.a<r.c.c.length;)(i=BB(n0(r),213)).f&&!n.c[i.c]&&(n.c[i.c]=!0,c=e.Math.min(c,pIn(n,Nbn(i,t))));return n.i[t.d]=n.j,n.g[t.d]=e.Math.min(c,n.j++),n.g[t.d]}function vIn(n,t){var e,i,r;for(r=BB(BB(h6(n.r,t),21),84).Kc();r.Ob();)(i=BB(r.Pb(),111)).e.b=(e=i.b).Xe((sWn(),aPt))?e.Hf()==(kUn(),sIt)?-e.rf().b-Gy(MD(e.We(aPt))):Gy(MD(e.We(aPt))):e.Hf()==(kUn(),sIt)?-e.rf().b:0}function mIn(n){var t,e,i,r,c,a,u;for(e=QA(n.e),c=kL(Bx(B$(VA(n.e)),n.d*n.a,n.c*n.b),-.5),t=e.a-c.a,r=e.b-c.b,u=0;u<n.c;u++){for(i=t,a=0;a<n.d;a++)Wbn(n.e,new UV(i,r,n.a,n.b))&&FRn(n,a,u,!1,!0),i+=n.a;r+=n.b}}function yIn(n){var t,e,i;if(qy(TD(ZAn(n,(sWn(),SSt))))){for(i=new Np,e=new oz(ZL(dLn(n).a.Kc(),new h));dAn(e);)QIn(t=BB(U5(e),79))&&qy(TD(ZAn(t,PSt)))&&(i.c[i.c.length]=t);return i}return SQ(),SQ(),set}function kIn(n){var t;if(t=!1,cL(n,204))return t=!0,BB(n,204).a;if(!t&&cL(n,258)&&BB(n,258).a%1==0)return t=!0,iln(QO(BB(n,258).a));throw Hp(new ek("Id must be a string or an integer: '"+n+"'."))}function jIn(n,t){var e,i,r,c,a,u;for(c=null,r=new rU((!n.a&&(n.a=new Sp(n)),n.a));bOn(r);)if(YBn(a=(e=BB(aLn(r),56)).Tg()),null!=(i=(u=a.o)&&e.mh(u)?pK(uun(u),e.ah(u)):null)&&mK(i,t)){c=e;break}return c}function EIn(n,t,e){var i,r,c,a,u;if(lin(e,"occurrences"),0==e)return(u=BB(lfn(OQ(n.a),t),14))?u.gc():0;if(!(a=BB(lfn(OQ(n.a),t),14)))return 0;if(e>=(c=a.gc()))a.$b();else for(r=a.Kc(),i=0;i<e;i++)r.Pb(),r.Qb();return c}function TIn(n,t,e){var i,r,c;return lin(e,"oldCount"),lin(0,"newCount"),((i=BB(lfn(OQ(n.a),t),14))?i.gc():0)==e&&(lin(0,"count"),(c=-((r=BB(lfn(OQ(n.a),t),14))?r.gc():0))>0?wk():c<0&&EIn(n,t,-c),!0)}function MIn(n){var t,e,i,r,c,a;if(a=0,0==n.b){for(t=0,r=0,c=(i=Xvn(n,!0)).length;r<c;++r)(e=i[r])>0&&(a+=e,++t);t>1&&(a+=n.c*(t-1))}else a=Kk(ecn(LV(AV(LU(n.a),new Mn),new Sn)));return a>0?a+n.n.d+n.n.a:0}function SIn(n){var t,e,i,r,c,a;if(a=0,0==n.b)a=Kk(ecn(LV(AV(LU(n.a),new En),new Tn)));else{for(t=0,r=0,c=(i=Wvn(n,!0)).length;r<c;++r)(e=i[r])>0&&(a+=e,++t);t>1&&(a+=n.c*(t-1))}return a>0?a+n.n.b+n.n.c:0}function PIn(n,t){var i,r,c,a;for(i=(a=BB(oV(n.b,t),124)).a,c=BB(BB(h6(n.r,t),21),84).Kc();c.Ob();)(r=BB(c.Pb(),111)).c&&(i.a=e.Math.max(i.a,VH(r.c)));if(i.a>0)switch(t.g){case 2:a.n.c=n.s;break;case 4:a.n.b=n.s}}function CIn(n,t){var e,i,r;return 0==(e=BB(mMn(t,(fRn(),Zct)),19).a-BB(mMn(n,Zct),19).a)?(i=XR(B$(BB(mMn(n,(Mrn(),uat)),8)),BB(mMn(n,oat),8)),r=XR(B$(BB(mMn(t,uat),8)),BB(mMn(t,oat),8)),Pln(i.a*i.b,r.a*r.b)):e}function IIn(n,t){var e,i,r;return 0==(e=BB(mMn(t,(CAn(),$kt)),19).a-BB(mMn(n,$kt),19).a)?(i=XR(B$(BB(mMn(n,(qqn(),Zyt)),8)),BB(mMn(n,nkt),8)),r=XR(B$(BB(mMn(t,Zyt),8)),BB(mMn(t,nkt),8)),Pln(i.a*i.b,r.a*r.b)):e}function OIn(n){var t,e;return(e=new Ck).a+="e_",null!=(t=Xan(n))&&(e.a+=""+t),n.c&&n.d&&(oO((e.a+=" ",e),pyn(n.c)),oO(uO((e.a+="[",e),n.c.i),"]"),oO((e.a+=e1n,e),pyn(n.d)),oO(uO((e.a+="[",e),n.d.i),"]")),e.a}function AIn(n){switch(n.g){case 0:return new pf;case 1:return new vf;case 2:return new gf;case 3:return new mf;default:throw Hp(new _y("No implementation is available for the layout phase "+(null!=n.f?n.f:""+n.g)))}}function $In(n,t,i,r,c){var a;switch(a=0,c.g){case 1:a=e.Math.max(0,t.b+n.b-(i.b+r));break;case 3:a=e.Math.max(0,-n.b-r);break;case 2:a=e.Math.max(0,-n.a-r);break;case 4:a=e.Math.max(0,t.a+n.a-(i.a+r))}return a}function LIn(n,t,e){var i,r,c;if(e)for(c=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);c.Ob();)r=x2(e,BB(c.Pb(),19).a),L6n in r.a||N6n in r.a?sKn(n,r,t):EXn(n,r,t),PL(BB(RX(n.b,Qdn(r)),79))}function NIn(n){var t,e;switch(n.b){case-1:return!0;case 0:return(e=n.t)>1||-1==e||(t=Ikn(n))&&(ZM(),t.Cj()==E9n)?(n.b=-1,!0):(n.b=1,!1);default:return!1}}function xIn(n,t){var e,i,r,c,a;for(!t.s&&(t.s=new eU(FAt,t,21,17)),c=null,r=0,a=(i=t.s).i;r<a;++r)switch(DW(B7(n,e=BB(Wtn(i,r),170)))){case 2:case 3:!c&&(c=new Np),c.c[c.c.length]=e}return c||(SQ(),SQ(),set)}function DIn(n,t){var e,i,r,c;if(QXn(n),0!=n.c||123!=n.a)throw Hp(new ak(kWn((u$(),P8n))));if(c=112==t,i=n.d,(e=lx(n.i,125,i))<0)throw Hp(new ak(kWn((u$(),C8n))));return r=fx(n.i,i,e),n.d=e+1,b9(r,c,512==(512&n.e))}function RIn(n){var t;if((t=BB(mMn(n,(HXn(),qdt)),314))==(Oin(),hht))throw Hp(new ck("The hierarchy aware processor "+t+" in child node "+n+" is only allowed if the root node specifies the same hierarchical processor."))}function KIn(n,t){var e,i,r,c;for(G_(),e=null,r=t.Kc();r.Ob();)(i=BB(r.Pb(),128)).o||(WB((c=new PBn(F$(i.a),bH(i.a),null,BB(i.d.a.ec().Kc().Pb(),17))).c,i.a),n.c[n.c.length]=c,e&&WB(e.d,c),e=c)}function _In(n,t){var e,i,r;if(t)if(0!=(4&t.i))for(i="[]",e=t.c;;e=e.c){if(0==(4&e.i)){Hin(n,r=Uy((ED(e),e.o+i))),xen(n,r);break}i+="[]"}else Hin(n,r=Uy((ED(t),t.o))),xen(n,r);else Hin(n,null),xen(n,null);n.yk(t)}function FIn(n,t,e,i,r){var c,a,u,o;return GI(o=hD(n,BB(r,56)))!==GI(r)?(u=BB(n.g[e],72),jL(n,e,sTn(n,e,c=Z3(t,o))),mA(n.e)&&(KEn(a=LY(n,9,c.ak(),r,o,i,!1),new N7(n.e,9,n.c,u,c,i,!1)),$7(a)),o):r}function BIn(n,t,e){var i,r,c,a,u,o;for(i=BB(h6(n.c,t),15),r=BB(h6(n.c,e),15),c=i.Zc(i.gc()),a=r.Zc(r.gc());c.Sb()&&a.Sb();)if((u=BB(c.Ub(),19))!=(o=BB(a.Ub(),19)))return E$(u.a,o.a);return c.Ob()||a.Ob()?c.Ob()?1:-1:0}function HIn(n,t){var e,i;try{return X1(n.a,t)}catch(r){if(cL(r=lun(r),32)){try{if(i=l_n(t,_Vn,DWn),e=Vj(n.a),i>=0&&i<e.length)return e[i]}catch(c){if(!cL(c=lun(c),127))throw Hp(c)}return null}throw Hp(r)}}function qIn(n,t){var e,i,r;if(r=Fqn((IPn(),Z$t),n.Tg(),t))return ZM(),BB(r,66).Oj()||(r=Z1(B7(Z$t,r))),i=BB((e=n.Yg(r))>=0?n._g(e,!0,!0):cOn(n,r,!0),153),BB(i,215).ll(t);throw Hp(new _y(r6n+t.ne()+u6n))}function GIn(){var n;return tS(),Q$t?BB($$n((WM(),zAt),V9n),1939):(RO(Hnt,new Cs),nzn(),n=BB(cL(SJ((WM(),zAt),V9n),547)?SJ(zAt,V9n):new UW,547),Q$t=!0,oWn(n),TWn(n),VW((VM(),ZAt),n,new Go),mZ(zAt,V9n,n),n)}function zIn(n,t){var e,i,r,c;n.j=-1,mA(n.e)?(e=n.i,c=0!=n.i,c6(n,t),i=new N7(n.e,3,n.c,null,t,e,c),r=t.Qk(n.e,n.c,null),(r=IEn(n,t,r))?(r.Ei(i),r.Fi()):ban(n.e,i)):(c6(n,t),(r=t.Qk(n.e,n.c,null))&&r.Fi())}function UIn(n,t){var e,i,r;if(r=0,(i=t[0])>=n.length)return-1;for(b1(i,n.length),e=n.charCodeAt(i);e>=48&&e<=57&&(r=10*r+(e-48),!(++i>=n.length));)b1(i,n.length),e=n.charCodeAt(i);return i>t[0]?t[0]=i:r=-1,r}function XIn(n){var t,i,r,c,a;return i=c=BB(n.a,19).a,r=a=BB(n.b,19).a,t=e.Math.max(e.Math.abs(c),e.Math.abs(a)),c<=0&&c==a?(i=0,r=a-1):c==-t&&a!=t?(i=a,r=c,a>=0&&++i):(i=-a,r=c),new rI(iln(i),iln(r))}function WIn(n,t,e,i){var r,c,a,u,o,s;for(r=0;r<t.o;r++)for(c=r-t.j+e,a=0;a<t.p;a++)if(o=c,s=u=a-t.k+i,o+=n.j,s+=n.k,o>=0&&s>=0&&o<n.o&&s<n.p&&(!mmn(t,r,a)&&imn(n,c,u)||vmn(t,r,a)&&!rmn(n,c,u)))return!0;return!1}function VIn(n,t,e){var i,r,c,a;c=n.c,a=n.d,r=(Aon(Pun(Gk(PMt,1),sVn,8,0,[c.i.n,c.n,c.a])).b+Aon(Pun(Gk(PMt,1),sVn,8,0,[a.i.n,a.n,a.a])).b)/2,i=null,i=c.j==(kUn(),oIt)?new xC(t+c.i.c.c.a+e,r):new xC(t-e,r),Kx(n.a,0,i)}function QIn(n){var t,e,i;for(t=null,e=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c)])));dAn(e);)if(i=PTn(BB(U5(e),82)),t){if(t!=i)return!1}else t=i;return!0}function YIn(n,t,e){var i;if(++n.j,t>=n.i)throw Hp(new Ay(u8n+t+o8n+n.i));if(e>=n.i)throw Hp(new Ay(s8n+e+o8n+n.i));return i=n.g[e],t!=e&&(t<e?aHn(n.g,t,n.g,t+1,e-t):aHn(n.g,e+1,n.g,e,t-e),$X(n.g,t,i),n.ei(t,i,e),n.ci()),i}function JIn(n,t,e){var i;if(i=BB(n.c.xc(t),14))return!!i.Fc(e)&&(++n.d,!0);if((i=n.ic(t)).Fc(e))return++n.d,n.c.zc(t,i),!0;throw Hp(new g5("New Collection violated the Collection spec"))}function ZIn(n){var t,e,i;return n<0?0:0==n?32:(e=16-(t=(i=-(n>>16))>>16&16),e+=t=(i=(n>>=t)-256)>>16&8,e+=t=(i=(n<<=t)-_Qn)>>16&4,(e+=t=(i=(n<<=t)-hVn)>>16&2)+2-(t=(i=(n<<=t)>>14)&~(i>>1)))}function nOn(n){var t,e,i,r;for(MQ(),Sct=new Np,Mct=new xp,Tct=new Np,!n.a&&(n.a=new eU(UOt,n,10,11)),xUn(t=n.a),r=new AL(t);r.e!=r.i.gc();)i=BB(kpn(r),33),-1==E7(Sct,i,0)&&(e=new Np,WB(Tct,e),Rgn(i,e));return Tct}function tOn(n,t,e){var i,r,c,a;n.a=e.b.d,cL(t,352)?(e5(c=qSn(r=cDn(BB(t,79),!1,!1)),i=new Nw(n)),VFn(c,r),null!=t.We((sWn(),OSt))&&e5(BB(t.We(OSt),74),i)):((a=BB(t,470)).Hg(a.Dg()+n.a.a),a.Ig(a.Eg()+n.a.b))}function eOn(n,t){var i,r,c,a,u,o,s,h;for(h=Gy(MD(mMn(t,(HXn(),Npt)))),s=n[0].n.a+n[0].o.a+n[0].d.c+h,o=1;o<n.length;o++)r=n[o].n,c=n[o].o,i=n[o].d,(a=r.a-i.b-s)<0&&(r.a-=a),(u=t.f).a=e.Math.max(u.a,r.a+c.a),s=r.a+c.a+i.c+h}function iOn(n,t){var e,i,r,c,a,u;return i=BB(BB(RX(n.g,t.a),46).a,65),r=BB(BB(RX(n.g,t.b),46).a,65),(e=nqn(c=i.b,a=r.b))>=0?e:(u=lW(XR(new xC(a.c+a.b/2,a.d+a.a/2),new xC(c.c+c.b/2,c.d+c.a/2))),-(Y_n(c,a)-1)*u)}function rOn(n,t,e){var i;JT(new Rq(null,(!e.a&&(e.a=new eU(FOt,e,6,6)),new w1(e.a,16))),new eI(n,t)),JT(new Rq(null,(!e.n&&(e.n=new eU(zOt,e,1,7)),new w1(e.n,16))),new iI(n,t)),(i=BB(ZAn(e,(sWn(),OSt)),74))&&Yrn(i,n,t)}function cOn(n,t,e){var i,r,c;if(c=Fqn((IPn(),Z$t),n.Tg(),t))return ZM(),BB(c,66).Oj()||(c=Z1(B7(Z$t,c))),r=BB((i=n.Yg(c))>=0?n._g(i,!0,!0):cOn(n,c,!0),153),BB(r,215).hl(t,e);throw Hp(new _y(r6n+t.ne()+u6n))}function aOn(n,t,e,i){var r,c,a,u,o;if(r=n.d[t])if(c=r.g,o=r.i,null!=i){for(u=0;u<o;++u)if((a=BB(c[u],133)).Sh()==e&&Nfn(i,a.cd()))return a}else for(u=0;u<o;++u)if(GI((a=BB(c[u],133)).cd())===GI(i))return a;return null}function uOn(n,t){var e;if(t<0)throw Hp(new Oy("Negative exponent"));if(0==t)return Jtt;if(1==t||swn(n,Jtt)||swn(n,eet))return n;if(!fAn(n,0)){for(e=1;!fAn(n,e);)++e;return Nnn(vwn(e*t),uOn(z5(n,e),t))}return mTn(n,t)}function oOn(n,t){var e,i,r;if(GI(n)===GI(t))return!0;if(null==n||null==t)return!1;if(n.length!=t.length)return!1;for(e=0;e<n.length;++e)if(i=n[e],r=t[e],!(GI(i)===GI(r)||null!=i&&Nfn(i,r)))return!1;return!0}function sOn(n){var t,e,i;for(kM(),this.b=Vat,this.c=(Ffn(),BPt),this.f=(yM(),zat),this.a=n,tj(this,new Ct),kNn(this),i=new Wb(n.b);i.a<i.c.c.length;)(e=BB(n0(i),81)).d||(t=new Pgn(Pun(Gk(Qat,1),HWn,81,0,[e])),WB(n.a,t))}function hOn(n,t,e){var i,r,c,a,u,o;if(!n||0==n.c.length)return null;for(c=new KY(t,!e),r=new Wb(n);r.a<r.c.c.length;)i=BB(n0(r),70),USn(c,(gM(),new Bw(i)));return(a=c.i).a=(o=c.n,c.e.b+o.d+o.a),a.b=(u=c.n,c.e.a+u.b+u.c),c}function fOn(n){var t,e,i,r,c,a,u;for(hA(u=n2(n.a),new Pe),e=null,c=0,a=(r=u).length;c<a&&(i=r[c]).k==(uSn(),Mut);++c)(t=BB(mMn(i,(hWn(),Qft)),61))!=(kUn(),CIt)&&t!=oIt||(e&&BB(mMn(e,clt),15).Fc(i),e=i)}function lOn(n,t,e){var i,r,c,a,u,o;l1(t,n.c.length),u=BB(n.c[t],329),s6(n,t),u.b/2>=e&&(i=t,c=(o=(u.c+u.a)/2)-e,u.c<=o-e&&kG(n,i++,new kB(u.c,c)),(a=o+e)<=u.a&&(r=new kB(a,u.a),LZ(i,n.c.length),MS(n.c,i,r)))}function bOn(n){var t;if(n.c||null!=n.g){if(null==n.g)return!0;if(0==n.i)return!1;t=BB(n.g[n.i-1],47)}else n.d=n.si(n.f),f9(n,n.d),t=n.d;return t==n.b&&null.km>=null.jm()?(aLn(n),bOn(n)):t.Ob()}function wOn(n,t,e){var i,r,c,a;if(!(a=e)&&(a=LH(new Xm,0)),OTn(a,qZn,1),$Gn(n.c,t),1==(c=RGn(n.a,t)).gc())VHn(BB(c.Xb(0),37),a);else for(r=1/c.gc(),i=c.Kc();i.Ob();)VHn(BB(i.Pb(),37),mcn(a,r));Ek(n.a,c,t),FDn(t),HSn(a)}function dOn(n){if(this.a=n,n.c.i.k==(uSn(),Mut))this.c=n.c,this.d=BB(mMn(n.c.i,(hWn(),Qft)),61);else{if(n.d.i.k!=Mut)throw Hp(new _y("Edge "+n+" is not an external edge."));this.c=n.d,this.d=BB(mMn(n.d.i,(hWn(),Qft)),61)}}function gOn(n,t){var e,i,r;r=n.b,n.b=t,0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,r,n.b)),t?t!=n&&(Nrn(n,t.zb),$en(n,t.d),Fin(n,null==(e=null==(i=t.c)?t.zb:i)||mK(e,t.zb)?null:e)):(Nrn(n,null),$en(n,0),Fin(n,null))}function pOn(n){var t,e;if(n.f){for(;n.n<n.o;){if(cL(e=(t=BB(n.j?n.j.pi(n.n):n.k.Xb(n.n),72)).ak(),99)&&0!=(BB(e,18).Bb&h6n)&&(!n.e||e.Gj()!=NOt||0!=e.aj())&&null!=t.dd())return!0;++n.n}return!1}return n.n<n.o}function vOn(n,t){var e;this.e=(WX(),yX(n),WX(),Nwn(n)),this.c=(yX(t),Nwn(t)),aN(this.e.Hd().dc()==this.c.Hd().dc()),this.d=vbn(this.e),this.b=vbn(this.c),e=kq(Ant,[sVn,HWn],[5,1],5,[this.e.Hd().gc(),this.c.Hd().gc()],2),this.a=e,din(this)}function mOn(n){var t=(!Znt&&(Znt=QUn()),Znt);return'"'+n.replace(/[\x00-\x1f\xad\u0600-\u0603\u06dd\u070f\u17b4\u17b5\u200b-\u200f\u2028-\u202e\u2060-\u2064\u206a-\u206f\ufeff\ufff9-\ufffb"\\]/g,(function(n){return IJ(n,t)}))+'"'}function yOn(n){var t,e;for(CQ(),this.b=hit,this.c=lit,this.g=(pM(),sit),this.d=(Ffn(),BPt),this.a=n,yNn(this),e=new Wb(n.b);e.a<e.c.c.length;)!(t=BB(n0(e),57)).a&&IN(Xen(new Xv,Pun(Gk(bit,1),HWn,57,0,[t])),n),t.e=new gY(t.d)}function kOn(n){var t,e,i,r,c;for(r=n.e.c.length,i=x8(Rnt,nZn,15,r,0,1),c=new Wb(n.e);c.a<c.c.c.length;)i[BB(n0(c),144).b]=new YT;for(e=new Wb(n.c);e.a<e.c.c.length;)i[(t=BB(n0(e),282)).c.b].Fc(t),i[t.d.b].Fc(t);return i}function jOn(n){var t,e,i,r,c,a;for(a=sx(n.c.length),r=new Wb(n);r.a<r.c.c.length;){for(i=BB(n0(r),10),c=new Rv,e=new oz(ZL(lbn(i).a.Kc(),new h));dAn(e);)(t=BB(U5(e),17)).c.i==t.d.i||TU(c,t.d.i);a.c[a.c.length]=c}return a}function EOn(n,t){var e,i,r,c,a;if(t>=(a=null==(e=BB(yan(n.a,4),126))?0:e.length))throw Hp(new tK(t,a));return r=e[t],1==a?i=null:(aHn(e,0,i=x8(dAt,i9n,415,a-1,0,1),0,t),(c=a-t-1)>0&&aHn(e,t+1,i,t,c)),Fgn(n,i),eCn(n,t,r),r}function TOn(){TOn=O,lLt=BB(Wtn(QQ((cE(),gLt).qb),6),34),sLt=BB(Wtn(QQ(gLt.qb),3),34),hLt=BB(Wtn(QQ(gLt.qb),4),34),fLt=BB(Wtn(QQ(gLt.qb),5),18),oEn(lLt),oEn(sLt),oEn(hLt),oEn(fLt),bLt=new Jy(Pun(Gk(FAt,1),N9n,170,0,[lLt,sLt]))}function MOn(n,t){var e;this.d=new lm,this.b=t,this.e=new wA(t.qf()),e=n.u.Hc((lIn(),iIt)),n.u.Hc(eIt)?n.D?this.a=e&&!t.If():this.a=!0:n.u.Hc(rIt)?this.a=!!e&&!(t.zf().Kc().Ob()||t.Bf().Kc().Ob()):this.a=!1}function SOn(n,t){var e,i,r,c;for(e=n.o.a,c=BB(BB(h6(n.r,t),21),84).Kc();c.Ob();)(r=BB(c.Pb(),111)).e.a=(i=r.b).Xe((sWn(),aPt))?i.Hf()==(kUn(),CIt)?-i.rf().a-Gy(MD(i.We(aPt))):e+Gy(MD(i.We(aPt))):i.Hf()==(kUn(),CIt)?-i.rf().a:e}function POn(n,t){var e,i,r;e=BB(mMn(n,(HXn(),Udt)),103),r=BB(ZAn(t,upt),61),(i=BB(mMn(n,ept),98))!=(QEn(),QCt)&&i!=YCt?r==(kUn(),PIt)&&(r=OFn(t,e))==PIt&&(r=hwn(e)):r=XHn(t)>0?hwn(e):Tln(hwn(e)),Ypn(t,upt,r)}function COn(n,t){var e,i,r,c,a;for(a=n.j,t.a!=t.b&&m$(a,new Ur),r=a.c.length/2|0,i=0;i<r;i++)l1(i,a.c.length),(c=BB(a.c[i],113)).c&&qCn(c.d,t.a);for(e=r;e<a.c.length;e++)l1(e,a.c.length),(c=BB(a.c[e],113)).c&&qCn(c.d,t.b)}function IOn(n,t,e){var i,r,c;return i=n.c[t.c.p][t.p],r=n.c[e.c.p][e.p],null!=i.a&&null!=r.a?((c=Tz(i.a,r.a))<0?uKn(n,t,e):c>0&&uKn(n,e,t),c):null!=i.a?(uKn(n,t,e),-1):null!=r.a?(uKn(n,e,t),1):0}function OOn(n,t){var e,i,r,c;n.ej()?(e=n.Vi(),c=n.fj(),++n.j,n.Hi(e,n.oi(e,t)),i=n.Zi(3,null,t,e,c),n.bj()&&(r=n.cj(t,null))?(r.Ei(i),r.Fi()):n.$i(i)):(eW(n,t),n.bj()&&(r=n.cj(t,null))&&r.Fi())}function AOn(n,t){var e,i,r,c,a;for(a=axn(n.e.Tg(),t),r=new go,e=BB(n.g,119),c=n.i;--c>=0;)i=e[c],a.rl(i.ak())&&f9(r,i);!aXn(n,r)&&mA(n.e)&&Lv(n,t.$j()?LY(n,6,t,(SQ(),set),null,-1,!1):LY(n,t.Kj()?2:1,t,null,null,-1,!1))}function $On(){var n,t;for($On=O,aet=x8(oet,sVn,91,32,0,1),uet=x8(oet,sVn,91,32,0,1),n=1,t=0;t<=18;t++)aet[t]=npn(n),uet[t]=npn(yz(n,t)),n=cbn(n,5);for(;t<uet.length;t++)aet[t]=Nnn(aet[t-1],aet[1]),uet[t]=Nnn(uet[t-1],(ODn(),net))}function LOn(n,t){var e,i,r,c;return n.a==(JMn(),cft)||(r=t.a.c,e=t.a.c+t.a.b,!(t.j&&(c=(i=t.A).c.c.a-i.o.a/2,r-(i.n.a+i.o.a)>c)||t.q&&(c=(i=t.C).c.c.a-i.o.a/2,i.n.a-e>c)))}function NOn(n,t){OTn(t,"Partition preprocessing",1),JT(BB(P4(AV(wnn(AV(new Rq(null,new w1(n.a,16)),new vi),new mi),new yi),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15).Oc(),new ki),HSn(t)}function xOn(n){var t,e,i,r,c,a;for(qZ(),e=new v4,i=new Wb(n.e.b);i.a<i.c.c.length;)for(c=new Wb(BB(n0(i),29).a);c.a<c.c.c.length;)r=BB(n0(c),10),(t=BB(lnn(e,a=n.g[r.p]),15))||Jgn(e,a,t=new Np),t.Fc(r);return e}function DOn(n,t){var e,i,r,c,a;for(r=t.b.b,n.a=x8(Rnt,nZn,15,r,0,1),n.b=x8($Nt,ZYn,25,r,16,1),a=spn(t.b,0);a.b!=a.d.c;)c=BB(b3(a),86),n.a[c.g]=new YT;for(i=spn(t.a,0);i.b!=i.d.c;)e=BB(b3(i),188),n.a[e.b.g].Fc(e),n.a[e.c.g].Fc(e)}function ROn(n){var t;return 0!=(64&n.Db)?P$n(n):((t=new fN(P$n(n))).a+=" (startX: ",vE(t,n.j),t.a+=", startY: ",vE(t,n.k),t.a+=", endX: ",vE(t,n.b),t.a+=", endY: ",vE(t,n.c),t.a+=", identifier: ",cO(t,n.d),t.a+=")",t.a)}function KOn(n){var t;return 0!=(64&n.Db)?kfn(n):((t=new fN(kfn(n))).a+=" (ordered: ",yE(t,0!=(256&n.Bb)),t.a+=", unique: ",yE(t,0!=(512&n.Bb)),t.a+=", lowerBound: ",mE(t,n.s),t.a+=", upperBound: ",mE(t,n.t),t.a+=")",t.a)}function _On(n,t,e,i,r,c,a,u){var o;return cL(n.Cb,88)&&ACn(P5(BB(n.Cb,88)),4),Nrn(n,e),n.f=i,$ln(n,r),Nln(n,c),Aln(n,a),Lln(n,!1),nln(n,!0),qln(n,u),Yfn(n,!0),Len(n,0),n.b=0,Nen(n,1),(o=HTn(n,t,null))&&o.Fi(),Gln(n,!1),n}function FOn(n,t){var i,r;return BB(SJ(n.a,t),512)||(i=new y5(t),k5(),xK(i,FOn(n,fx(r=Qet?null:i.c,0,e.Math.max(0,mN(r,YTn(46)))))),0==(Qet?null:i.c).length&&zD(i,new X),mZ(n.a,Qet?null:i.c,i),i)}function BOn(n,t){var e;n.b=t,n.g=new Np,e=JOn(n.b),n.e=e,n.f=e,n.c=qy(TD(mMn(n.b,(_kn(),jit)))),n.a=MD(mMn(n.b,(sWn(),cSt))),null==n.a&&(n.a=1),Gy(n.a)>1?n.e*=Gy(n.a):n.f/=Gy(n.a),Chn(n),ggn(n),TRn(n),hon(n.b,(Epn(),gct),n.g)}function HOn(n,t,e){var i,r,c,a,u;for(i=0,u=e,t||(i=e*(n.c.length-1),u*=-1),c=new Wb(n);c.a<c.c.c.length;){for(hon(r=BB(n0(c),10),(HXn(),kdt),(wvn(),OMt)),r.o.a=i,a=DSn(r,(kUn(),oIt)).Kc();a.Ob();)BB(a.Pb(),11).n.a=i;i+=u}}function qOn(n,t,e){var i,r,c;n.ej()?(c=n.fj(),Ifn(n,t,e),i=n.Zi(3,null,e,t,c),n.bj()?(r=n.cj(e,null),n.ij()&&(r=n.jj(e,r)),r?(r.Ei(i),r.Fi()):n.$i(i)):n.$i(i)):(Ifn(n,t,e),n.bj()&&(r=n.cj(e,null))&&r.Fi())}function GOn(n,t,e){var i,r,c,a,u,o;return(u=n.Gk(e))!=e?(a=n.g[t],o=u,jL(n,t,n.oi(t,o)),c=a,n.gi(t,o,c),n.rk()&&(i=e,r=n.dj(i,null),!BB(u,49).eh()&&(r=n.cj(o,r)),r&&r.Fi()),mA(n.e)&&Lv(n,n.Zi(9,e,u,t,!1)),u):e}function zOn(n,t){var e,i,r;for(e=new Wb(n.a.a);e.a<e.c.c.length;)BB(n0(e),189).g=!0;for(r=new Wb(n.a.b);r.a<r.c.c.length;)(i=BB(n0(r),81)).k=qy(TD(n.e.Kb(new rI(i,t)))),i.d.g=i.d.g&qy(TD(n.e.Kb(new rI(i,t))));return n}function UOn(n){var t,e,i,r,c;if(e=new YK(t=BB(Vj(FIt),9),BB(SR(t,t.length),9),0),c=BB(mMn(n,(hWn(),Elt)),10))for(r=new Wb(c.j);r.a<r.c.c.length;)GI(mMn(i=BB(n0(r),11),dlt))===GI(n)&&zN(new m6(i.b))&&orn(e,i.j);return e}function XOn(n,t,e){var i,r,c,a;if(!n.d[e.p]){for(i=new oz(ZL(lbn(e).a.Kc(),new h));dAn(i);){for(c=new oz(ZL(fbn(a=BB(U5(i),17).d.i).a.Kc(),new h));dAn(c);)(r=BB(U5(c),17)).c.i==t&&(n.a[r.p]=!0);XOn(n,t,a)}n.d[e.p]=!0}}function WOn(n,t){var e,i,r,c,a,u,o;if(1==(i=pbn(254&n.Db)))n.Eb=null;else if(c=een(n.Eb),2==i)r=Rmn(n,t),n.Eb=c[0==r?1:0];else{for(a=x8(Ant,HWn,1,i-1,5,1),e=2,u=0,o=0;e<=128;e<<=1)e==t?++u:0!=(n.Db&e)&&(a[o++]=c[u++]);n.Eb=a}n.Db&=~t}function VOn(n,t){var e,i,r,c,a;for(!t.s&&(t.s=new eU(FAt,t,21,17)),c=null,r=0,a=(i=t.s).i;r<a;++r)switch(DW(B7(n,e=BB(Wtn(i,r),170)))){case 4:case 5:case 6:!c&&(c=new Np),c.c[c.c.length]=e}return c||(SQ(),SQ(),set)}function QOn(n){var t;switch(t=0,n){case 105:t=2;break;case 109:t=8;break;case 115:t=4;break;case 120:t=16;break;case 117:t=32;break;case 119:t=64;break;case 70:t=256;break;case 72:t=128;break;case 88:t=512;break;case 44:t=k6n}return t}function YOn(n,t,e,i,r){var c,a,u,o;if(GI(n)!==GI(t)||i!=r)for(u=0;u<i;u++){for(a=0,c=n[u],o=0;o<r;o++)a=rbn(rbn(cbn(e0(c,UQn),e0(t[o],UQn)),e0(e[u+o],UQn)),e0(dG(a),UQn)),e[u+o]=dG(a),a=jz(a,32);e[u+r]=dG(a)}else I_n(n,i,e)}function JOn(n){var t,i,r,c,a,u,o,s,h,f,l;for(f=0,h=0,o=(c=n.a).a.gc(),r=c.a.ec().Kc();r.Ob();)(i=BB(r.Pb(),561)).b&&VBn(i),f+=(l=(t=i.a).a)+(u=t.b),h+=l*u;return s=e.Math.sqrt(400*o*h-4*h+f*f)+f,0==(a=2*(100*o-1))?s:s/a}function ZOn(n,t){0!=t.b&&(isNaN(n.s)?n.s=Gy((Px(0!=t.b),MD(t.a.a.c))):n.s=e.Math.min(n.s,Gy((Px(0!=t.b),MD(t.a.a.c)))),isNaN(n.c)?n.c=Gy((Px(0!=t.b),MD(t.c.b.c))):n.c=e.Math.max(n.c,Gy((Px(0!=t.b),MD(t.c.b.c)))))}function nAn(n){var t,e,i;for(t=null,e=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c)])));dAn(e);)if(i=PTn(BB(U5(e),82)),t){if(t!=JJ(i))return!0}else t=JJ(i);return!1}function tAn(n,t){var e,i,r,c;n.ej()?(e=n.i,c=n.fj(),c6(n,t),i=n.Zi(3,null,t,e,c),n.bj()?(r=n.cj(t,null),n.ij()&&(r=n.jj(t,r)),r?(r.Ei(i),r.Fi()):n.$i(i)):n.$i(i)):(c6(n,t),n.bj()&&(r=n.cj(t,null))&&r.Fi())}function eAn(n,t,e){var i,r,c;n.ej()?(c=n.fj(),++n.j,n.Hi(t,n.oi(t,e)),i=n.Zi(3,null,e,t,c),n.bj()&&(r=n.cj(e,null))?(r.Ei(i),r.Fi()):n.$i(i)):(++n.j,n.Hi(t,n.oi(t,e)),n.bj()&&(r=n.cj(e,null))&&r.Fi())}function iAn(n){var t,e,i,r;for(r=n.length,t=null,i=0;i<r;i++)b1(i,n.length),GO(".*+?{[()|\\^$",YTn(e=n.charCodeAt(i)))>=0?(t||(t=new Pk,i>0&&cO(t,n.substr(0,i))),t.a+="\\",NX(t,e&QVn)):t&&NX(t,e&QVn);return t?t.a:n}function rAn(n){var t;if(!n.a)throw Hp(new Fy("IDataType class expected for layout option "+n.f));if(null==(t=I3(n.a)))throw Hp(new Fy("Couldn't create new instance of property '"+n.f+"'. "+r5n+(ED(bAt),bAt.k)+c5n));return BB(t,414)}function cAn(n){var t,e,i,r,c;return(c=n.eh())&&c.kh()&&(r=tfn(n,c))!=c?(e=n.Vg(),i=(t=n.Vg())>=0?n.Qg(null):n.eh().ih(n,-1-t,null,null),n.Rg(BB(r,49),e),i&&i.Fi(),n.Lg()&&n.Mg()&&e>-1&&ban(n,new nU(n,9,e,c,r)),r):c}function aAn(n){var t,e,i,r,c,a,u;for(c=0,r=n.f.e,e=0;e<r.c.length;++e)for(l1(e,r.c.length),a=BB(r.c[e],144),i=e+1;i<r.c.length;++i)l1(i,r.c.length),u=BB(r.c[i],144),t=W8(a.d,u.d)-n.a[a.b][u.b],c+=n.i[a.b][u.b]*t*t;return c}function uAn(n,t){var e;if(!Lx(t,(HXn(),kgt))&&(e=Ekn(BB(mMn(t,est),360),BB(mMn(n,kgt),163)),hon(t,est,e),!dAn(new oz(ZL(hbn(t).a.Kc(),new h)))))switch(e.g){case 1:hon(t,kgt,(Tbn(),_lt));break;case 2:hon(t,kgt,(Tbn(),Blt))}}function oAn(n,t){var e;mRn(n),n.a=(e=new ok,JT(new Rq(null,new w1(t.d,16)),new Od(e)),e),Mxn(n,BB(mMn(t.b,(HXn(),igt)),376)),kvn(n),OAn(n),$kn(n),jvn(n),jqn(n,t),JT(wnn(new Rq(null,Y0(SX(n.b).a)),new Wr),new Vr),t.a=!1,n.a=null}function sAn(){dMn.call(this,y6n,(tE(),dOt)),this.p=null,this.a=null,this.f=null,this.n=null,this.g=null,this.c=null,this.i=null,this.j=null,this.d=null,this.b=null,this.e=null,this.k=null,this.o=null,this.s=null,this.q=!1,this.r=!1}function hAn(){hAn=O,iAt=new MI(G1n,0),nAt=new MI("INSIDE_SELF_LOOPS",1),tAt=new MI("MULTI_EDGES",2),ZOt=new MI("EDGE_LABELS",3),eAt=new MI("PORTS",4),YOt=new MI("COMPOUND",5),QOt=new MI("CLUSTERS",6),JOt=new MI("DISCONNECTED",7)}function fAn(n,t){var e,i,r;if(0==t)return 0!=(1&n.a[0]);if(t<0)throw Hp(new Oy("Negative bit address"));if((r=t>>5)>=n.d)return n.e<0;if(e=n.a[r],t=1<<(31&t),n.e<0){if(r<(i=Ccn(n)))return!1;e=i==r?-e:~e}return 0!=(e&t)}function lAn(n,t,e,i){var r;BB(e.b,65),BB(e.b,65),BB(i.b,65),BB(i.b,65),NH(r=XR(B$(BB(e.b,65).c),BB(i.b,65).c),HCn(BB(e.b,65),BB(i.b,65),r)),BB(i.b,65),BB(i.b,65),BB(i.b,65).c.a,r.a,BB(i.b,65).c.b,r.b,BB(i.b,65),Otn(i.a,new TB(n,t,i))}function bAn(n,t){var e,i,r,c,a,u,o;if(c=t.e)for(e=cAn(c),i=BB(n.g,674),a=0;a<n.i;++a)if(qvn(o=i[a])==e&&(!o.d&&(o.d=new $L(VAt,o,1)),r=o.d,(u=BB(e.ah(gKn(c,c.Cb,c.Db>>16)),15).Xc(c))<r.i))return bAn(n,BB(Wtn(r,u),87));return t}function wAn(n,t,e){var i,r=SWn,c=r[n],a=c instanceof Array?c[0]:null;c&&!a?MWn=c:(!(i=t&&t.prototype)&&(i=SWn[t]),(MWn=qJ(i)).hm=e,!t&&(MWn.im=I),r[n]=MWn);for(var u=3;u<arguments.length;++u)arguments[u].prototype=MWn;a&&(MWn.gm=a)}function dAn(n){for(var t;!BB(yX(n.a),47).Ob();){if(n.d=osn(n),!n.d)return!1;if(n.a=BB(n.d.Pb(),47),cL(n.a,39)){if(t=BB(n.a,39),n.a=t.a,!n.b&&(n.b=new Lp),d3(n.b,n.d),t.b)for(;!Wy(t.b);)d3(n.b,BB(gU(t.b),47));n.d=t.d}}return!0}function gAn(n,t){var e,i,r,c,a;for(c=null==t?0:n.b.se(t),i=null==(e=n.a.get(c))?new Array:e,a=0;a<i.length;a++)if(r=i[a],n.b.re(t,r.cd()))return 1==i.length?(i.length=0,vR(n.a,c)):i.splice(a,1),--n.c,oY(n.b),r.dd();return null}function pAn(n,t){var e,i,r,c;for(r=1,t.j=!0,c=null,i=new Wb(kbn(t));i.a<i.c.c.length;)e=BB(n0(i),213),n.c[e.c]||(n.c[e.c]=!0,c=Nbn(e,t),e.f?r+=pAn(n,c):c.j||e.a!=e.e.e-e.d.e||(e.f=!0,TU(n.p,e),r+=pAn(n,c)));return r}function vAn(n){var t,i,r;for(i=new Wb(n.a.a.b);i.a<i.c.c.length;)t=BB(n0(i),81),kW(0),(r=0)>0&&((!dA(n.a.c)||!t.n.d)&&(!gA(n.a.c)||!t.n.b)&&(t.g.d+=e.Math.max(0,r/2-.5)),(!dA(n.a.c)||!t.n.a)&&(!gA(n.a.c)||!t.n.c)&&(t.g.a-=r-1))}function mAn(n){var t,i,r,c,a;if(a=K_n(n,c=new Np),t=BB(mMn(n,(hWn(),Elt)),10))for(r=new Wb(t.j);r.a<r.c.c.length;)GI(mMn(i=BB(n0(r),11),dlt))===GI(n)&&(a=e.Math.max(a,K_n(i,c)));return 0==c.c.length||hon(n,blt,a),-1!=a?c:null}function yAn(n,t,e){var i,r,c,a,u,o;r=(i=(c=BB(xq(t.e,0),17).c).i).k,u=(a=(o=BB(xq(e.g,0),17).d).i).k,r==(uSn(),Put)?hon(n,(hWn(),hlt),BB(mMn(i,hlt),11)):hon(n,(hWn(),hlt),c),hon(n,(hWn(),flt),u==Put?BB(mMn(a,flt),11):o)}function kAn(n,t){var e,i,r,c;for(e=(c=dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15))))&n.b.length-1,r=null,i=n.b[e];i;r=i,i=i.a)if(i.d==c&&wW(i.i,t))return r?r.a=i.a:n.b[e]=i.a,kk(i.c,i.f),iv(i.b,i.e),--n.f,++n.e,!0;return!1}function jAn(n,t){var e,i,r,c,a;return t&=63,(i=0!=((e=n.h)&CQn))&&(e|=-1048576),t<22?(a=e>>t,c=n.m>>t|e<<22-t,r=n.l>>t|n.m<<22-t):t<44?(a=i?PQn:0,c=e>>t-22,r=n.m>>t-22|e<<44-t):(a=i?PQn:0,c=i?SQn:0,r=e>>t-44),M$(r&SQn,c&SQn,a&PQn)}function EAn(n){var t,i,r,c,a,u;for(this.c=new Np,this.d=n,r=RQn,c=RQn,t=KQn,i=KQn,u=spn(n,0);u.b!=u.d.c;)a=BB(b3(u),8),r=e.Math.min(r,a.a),c=e.Math.min(c,a.b),t=e.Math.max(t,a.a),i=e.Math.max(i,a.b);this.a=new UV(r,c,t-r,i-c)}function TAn(n,t){var e,i,r,c;for(i=new Wb(n.b);i.a<i.c.c.length;)for(c=new Wb(BB(n0(i),29).a);c.a<c.c.c.length;)for((r=BB(n0(c),10)).k==(uSn(),Sut)&&hFn(r,t),e=new oz(ZL(lbn(r).a.Kc(),new h));dAn(e);)vun(BB(U5(e),17),t)}function MAn(n){var t,e,i;this.c=n,i=BB(mMn(n,(HXn(),Udt)),103),t=Gy(MD(mMn(n,Edt))),e=Gy(MD(mMn(n,Kpt))),i==(Ffn(),_Pt)||i==FPt||i==BPt?this.b=t*e:this.b=1/(t*e),this.j=Gy(MD(mMn(n,Apt))),this.e=Gy(MD(mMn(n,Opt))),this.f=n.b.c.length}function SAn(n){var t,e;for(n.e=x8(ANt,hQn,25,n.p.c.length,15,1),n.k=x8(ANt,hQn,25,n.p.c.length,15,1),e=new Wb(n.p);e.a<e.c.c.length;)t=BB(n0(e),10),n.e[t.p]=F3(new oz(ZL(fbn(t).a.Kc(),new h))),n.k[t.p]=F3(new oz(ZL(lbn(t).a.Kc(),new h)))}function PAn(n){var t,e,i,r,c;for(i=0,n.q=new Np,t=new Rv,c=new Wb(n.p);c.a<c.c.c.length;){for((r=BB(n0(c),10)).p=i,e=new oz(ZL(lbn(r).a.Kc(),new h));dAn(e);)TU(t,BB(U5(e),17).d.i);t.a.Bc(r),WB(n.q,new $q(t)),t.a.$b(),++i}}function CAn(){CAn=O,Okt=new WA(20),Ikt=new XA((sWn(),XSt),Okt),xkt=new XA(LPt,20),jkt=new XA(cSt,dZn),$kt=new XA(pPt,iln(1)),Nkt=new XA(kPt,(hN(),!0)),Ekt=lSt,Mkt=KSt,Skt=BSt,Pkt=qSt,Tkt=DSt,Ckt=USt,Akt=fPt,Ran(),Dkt=ykt,Lkt=vkt}function IAn(n,t){var e,i,r,c,a,u,o,s,h;if(n.a.f>0&&cL(t,42)&&(n.a.qj(),c=null==(o=(s=BB(t,42)).cd())?0:nsn(o),a=eR(n.a,c),e=n.a.d[a]))for(i=BB(e.g,367),h=e.i,u=0;u<h;++u)if((r=i[u]).Sh()==c&&r.Fb(s))return IAn(n,s),!0;return!1}function OAn(n){var t,e,i,r;for(r=BB(h6(n.a,(LEn(),Sst)),15).Kc();r.Ob();)iX(n,i=BB(r.Pb(),101),(e=(t=gz(i.k)).Hc((kUn(),sIt))?t.Hc(oIt)?t.Hc(SIt)?t.Hc(CIt)?null:$st:Nst:Lst:Ast)[0],(Crn(),xst),0),iX(n,i,e[1],Dst,1),iX(n,i,e[2],Rst,1)}function AAn(n,t){var e,i;Jxn(n,t,e=mKn(t)),iTn(n.a,BB(mMn(vW(t.b),(hWn(),Slt)),230)),b_n(n),DEn(n,t),i=x8(ANt,hQn,25,t.b.j.c.length,15,1),szn(n,t,(kUn(),sIt),i,e),szn(n,t,oIt,i,e),szn(n,t,SIt,i,e),szn(n,t,CIt,i,e),n.a=null,n.c=null,n.b=null}function $An(){$An=O,Sbn(),oEt=new $O(E4n,sEt=nEt),aEt=new $O(T4n,(hN(),!0)),iln(-1),iEt=new $O(M4n,iln(-1)),iln(-1),rEt=new $O(S4n,iln(-1)),uEt=new $O(P4n,!1),hEt=new $O(C4n,!0),cEt=new $O(I4n,!1),fEt=new $O(O4n,-1)}function LAn(n,t,e){switch(t){case 7:return!n.e&&(n.e=new hK(_Ot,n,7,4)),sqn(n.e),!n.e&&(n.e=new hK(_Ot,n,7,4)),void pX(n.e,BB(e,14));case 8:return!n.d&&(n.d=new hK(_Ot,n,8,5)),sqn(n.d),!n.d&&(n.d=new hK(_Ot,n,8,5)),void pX(n.d,BB(e,14))}zjn(n,t,e)}function NAn(n,t){var e,i,r,c,a;if(GI(t)===GI(n))return!0;if(!cL(t,15))return!1;if(a=BB(t,15),n.gc()!=a.gc())return!1;for(c=a.Kc(),i=n.Kc();i.Ob();)if(e=i.Pb(),r=c.Pb(),!(GI(e)===GI(r)||null!=e&&Nfn(e,r)))return!1;return!0}function xAn(n,t){var e,i,r,c;for((c=BB(P4(wnn(wnn(new Rq(null,new w1(t.b,16)),new Re),new Ke),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15)).Jc(new _e),e=0,r=c.Kc();r.Ob();)-1==(i=BB(r.Pb(),11)).p&&FAn(n,i,e++)}function DAn(n){switch(n.g){case 0:return new Cf;case 1:return new lf;case 2:return new ff;case 3:return new jI;case 4:return new _G;default:throw Hp(new _y("No implementation is available for the node placer "+(null!=n.f?n.f:""+n.g)))}}function RAn(n){switch(n.g){case 0:return new KG;case 1:return new wf;case 2:return new rf;case 3:return new cf;case 4:return new TI;default:throw Hp(new _y("No implementation is available for the cycle breaker "+(null!=n.f?n.f:""+n.g)))}}function KAn(){KAn=O,mjt=new $O(u4n,iln(0)),yjt=new $O(o4n,0),Hsn(),djt=new $O(s4n,gjt=sjt),iln(0),wjt=new $O(h4n,iln(1)),Bcn(),kjt=new $O(f4n,jjt=Xjt),D9(),Ejt=new $O(l4n,Tjt=ajt),Omn(),pjt=new $O(b4n,vjt=qjt)}function _An(n,t,e){var i;i=null,t&&(i=t.d),Yjn(n,new dP(t.n.a-i.b+e.a,t.n.b-i.d+e.b)),Yjn(n,new dP(t.n.a-i.b+e.a,t.n.b+t.o.b+i.a+e.b)),Yjn(n,new dP(t.n.a+t.o.a+i.c+e.a,t.n.b-i.d+e.b)),Yjn(n,new dP(t.n.a+t.o.a+i.c+e.a,t.n.b+t.o.b+i.a+e.b))}function FAn(n,t,e){var i,r,c;for(t.p=e,c=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(t),new Gw(t)])));dAn(c);)-1==(i=BB(U5(c),11)).p&&FAn(n,i,e);if(t.i.k==(uSn(),Put))for(r=new Wb(t.i.j);r.a<r.c.c.length;)(i=BB(n0(r),11))!=t&&-1==i.p&&FAn(n,i,e)}function BAn(n){var t,i,r,c,a;if(c=BB(P4($Z(a1(n)),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),r=ZJn,c.gc()>=2)for(t=MD((i=c.Kc()).Pb());i.Ob();)a=t,t=MD(i.Pb()),r=e.Math.min(r,(kW(t),t-(kW(a),a)));return r}function HAn(n,t){var e,i,r,c,a;r5(i=new YT,t,i.c.b,i.c);do{for(Px(0!=i.b),e=BB(Atn(i,i.a.a),86),n.b[e.g]=1,c=spn(e.d,0);c.b!=c.d.c;)a=(r=BB(b3(c),188)).c,1==n.b[a.g]?DH(n.a,r):2==n.b[a.g]?n.b[a.g]=1:r5(i,a,i.c.b,i.c)}while(0!=i.b)}function qAn(n,t){var e,i,r;if(GI(t)===GI(yX(n)))return!0;if(!cL(t,15))return!1;if(i=BB(t,15),(r=n.gc())!=i.gc())return!1;if(cL(i,54)){for(e=0;e<r;e++)if(!wW(n.Xb(e),i.Xb(e)))return!1;return!0}return Uvn(n.Kc(),i.Kc())}function GAn(n,t){var e;if(0!=n.c.length){if(2==n.c.length)hFn((l1(0,n.c.length),BB(n.c[0],10)),(Xyn(),jCt)),hFn((l1(1,n.c.length),BB(n.c[1],10)),ECt);else for(e=new Wb(n);e.a<e.c.c.length;)hFn(BB(n0(e),10),t);n.c=x8(Ant,HWn,1,0,5,1)}}function zAn(n){var t,e;if(2!=n.c.length)throw Hp(new Fy("Order only allowed for two paths."));l1(0,n.c.length),t=BB(n.c[0],17),l1(1,n.c.length),e=BB(n.c[1],17),t.d.i!=e.c.i&&(n.c=x8(Ant,HWn,1,0,5,1),n.c[n.c.length]=e,n.c[n.c.length]=t)}function UAn(n,t){var e,i,r,c,a;for(i=new v4,c=S4(new Jy(n.g)).a.ec().Kc();c.Ob();){if(!(r=BB(c.Pb(),10))){OH(t,"There are no classes in a balanced layout.");break}(e=BB(lnn(i,a=n.j[r.p]),15))||Jgn(i,a,e=new Np),e.Fc(r)}return i}function XAn(n,t,e){var i,r,c,a;if(e)for(r=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);r.Ob();)(c=x2(e,BB(r.Pb(),19).a))&&(a=Ken(R2(c,O6n),t),VW(n.f,a,c),q6n in c.a&&$in(a,R2(c,q6n)),STn(c,a),OCn(c,a))}function WAn(n,t){var e,i,r;for(OTn(t,"Port side processing",1),r=new Wb(n.a);r.a<r.c.c.length;)cBn(BB(n0(r),10));for(e=new Wb(n.b);e.a<e.c.c.length;)for(i=new Wb(BB(n0(e),29).a);i.a<i.c.c.length;)cBn(BB(n0(i),10));HSn(t)}function VAn(n,t,e){var i,r,c,a,u;if(!(r=n.f)&&(r=BB(n.a.a.ec().Kc().Pb(),57)),Fkn(r,t,e),1!=n.a.a.gc())for(i=t*e,a=n.a.a.ec().Kc();a.Ob();)(c=BB(a.Pb(),57))!=r&&((u=f3(c)).f.d?(c.d.d+=i+fJn,c.d.a-=i+fJn):u.f.a&&(c.d.a-=i+fJn))}function QAn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w;return u=i-n,o=r-t,s=(a=e.Math.atan2(u,o))+JJn,h=a-JJn,f=c*e.Math.sin(s)+n,b=c*e.Math.cos(s)+t,l=c*e.Math.sin(h)+n,w=c*e.Math.cos(h)+t,u6(Pun(Gk(PMt,1),sVn,8,0,[new xC(f,b),new xC(l,w)]))}function YAn(n,t,i,r){var c,a,u,o,s,h,f,l;c=i,a=f=t;do{a=n.a[a.p],l=n.g[a.p],o=Gy(n.p[l.p])+Gy(n.d[a.p])-a.d.d,(s=Ain(a,r))&&(h=n.g[s.p],u=Gy(n.p[h.p])+Gy(n.d[s.p])+s.o.b+s.d.a,c=e.Math.min(c,o-(u+K$(n.k,a,s))))}while(f!=a);return c}function JAn(n,t,i,r){var c,a,u,o,s,h,f,l;c=i,a=f=t;do{a=n.a[a.p],l=n.g[a.p],u=Gy(n.p[l.p])+Gy(n.d[a.p])+a.o.b+a.d.a,(s=_un(a,r))&&(h=n.g[s.p],o=Gy(n.p[h.p])+Gy(n.d[s.p])-s.d.d,c=e.Math.min(c,o-(u+K$(n.k,a,s))))}while(f!=a);return c}function ZAn(n,t){var e,i;return!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),null!=(i=cdn(n.o,t))?i:(cL(e=t.wg(),4)&&(null==e?(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),Wdn(n.o,t)):(!n.o&&(n.o=new y9((CXn(),MOt),rAt,n,0)),vjn(n.o,t,e))),e)}function n$n(){n$n=O,ICt=new GC("H_LEFT",0),CCt=new GC("H_CENTER",1),ACt=new GC("H_RIGHT",2),DCt=new GC("V_TOP",3),xCt=new GC("V_CENTER",4),NCt=new GC("V_BOTTOM",5),$Ct=new GC("INSIDE",6),LCt=new GC("OUTSIDE",7),OCt=new GC("H_PRIORITY",8)}function t$n(n){var t,e,i,r,c,a,u;if((t=n.Hh(V9n))&&null!=(u=SD(cdn((!t.b&&(t.b=new Jx((gWn(),k$t),X$t,t)),t.b),"settingDelegates")))){for(e=new Np,c=0,a=(r=kKn(u,"\\w+")).length;c<a;++c)i=r[c],e.c[e.c.length]=i;return e}return SQ(),SQ(),set}function e$n(n,t){var e,i,r,c,a,u,o;if(!t.f)throw Hp(new _y("The input edge is not a tree edge."));for(c=null,r=DWn,i=new Wb(n.d);i.a<i.c.c.length;)u=(e=BB(n0(i),213)).d,o=e.e,FCn(n,u,t)&&!FCn(n,o,t)&&(a=o.e-u.e-e.a)<r&&(r=a,c=e);return c}function i$n(n){var t,e,i,r,c,a;if(!(n.f.e.c.length<=1)){t=0,r=aAn(n),e=RQn;do{for(t>0&&(r=e),a=new Wb(n.f.e);a.a<a.c.c.length;)qy(TD(mMn(c=BB(n0(a),144),(rkn(),yat))))||(i=Z_n(n,c),UR(kO(c.d),i));e=aAn(n)}while(!JX(n,t++,r,e))}}function r$n(n,t){var e,i,r;for(OTn(t,"Layer constraint preprocessing",1),e=new Np,r=new M2(n.a,0);r.b<r.d.gc();)Px(r.b<r.d.gc()),Wun(i=BB(r.d.Xb(r.c=r.b++),10))&&(cTn(i),e.c[e.c.length]=i,fW(r));0==e.c.length||hon(n,(hWn(),nlt),e),HSn(t)}function c$n(n,t){var e,i,r,c,a;for(c=n.g.a,a=n.g.b,i=new Wb(n.d);i.a<i.c.c.length;)r=(e=BB(n0(i),70)).n,n.a==(Oun(),mst)||n.i==(kUn(),oIt)?r.a=c:n.a==yst||n.i==(kUn(),CIt)?r.a=c+n.j.a-e.o.a:r.a=c+(n.j.a-e.o.a)/2,r.b=a,UR(r,t),a+=e.o.b+n.e}function a$n(n,t,e){var i,r,c,a;for(OTn(e,"Processor set coordinates",1),n.a=0==t.b.b?1:t.b.b,c=null,i=spn(t.b,0);!c&&i.b!=i.d.c;)qy(TD(mMn(a=BB(b3(i),86),(qqn(),dkt))))&&(c=a,(r=a.e).a=BB(mMn(a,gkt),19).a,r.b=0);_Sn(n,xun(c),mcn(e,1)),HSn(e)}function u$n(n,t,e){var i,r,c;for(OTn(e,"Processor determine the height for each level",1),n.a=0==t.b.b?1:t.b.b,r=null,i=spn(t.b,0);!r&&i.b!=i.d.c;)qy(TD(mMn(c=BB(b3(i),86),(qqn(),dkt))))&&(r=c);r&&Zxn(n,u6(Pun(Gk(Yyt,1),tZn,86,0,[r])),e),HSn(e)}function o$n(n,t){var e,i,r,c,a;(c=D2(n,"individualSpacings"))&&(!P8(t,(sWn(),CPt))&&(e=new Yu,Ypn(t,CPt,e)),r=BB(ZAn(t,CPt),373),i=null,(a=c)&&(i=new TT(a,jrn(a,x8(Qtt,sVn,2,0,6,1)))),i&&e5(i,new dI(a,r)))}function s$n(n,t){var e,i,r,c,a,u;return c=null,(J6n in(a=n).a||Z6n in a.a||D6n in a.a)&&(u=qun(t),i=D2(a,J6n),Own(new Hg(u).a,i),r=D2(a,Z6n),Iwn(new Jg(u).a,r),e=N2(a,D6n),PEn(new tp(u).a,e),c=e),c}function h$n(n,t){var e,i,r;if(t===n)return!0;if(cL(t,543)){if(r=BB(t,835),n.a.d!=r.a.d||EV(n).gc()!=EV(r).gc())return!1;for(i=EV(r).Kc();i.Ob();)if(c1(n,(e=BB(i.Pb(),416)).a.cd())!=BB(e.a.dd(),14).gc())return!1;return!0}return!1}function f$n(n){var t,e,i,r;return t=i=BB(n.a,19).a,e=r=BB(n.b,19).a,0==i&&0==r?e-=1:-1==i&&r<=0?(t=0,e-=2):i<=0&&r>0?(t-=1,e-=1):i>=0&&r<0?(t+=1,e+=1):i>0&&r>=0?(t-=1,e+=1):(t+=1,e-=1),new rI(iln(t),iln(e))}function l$n(n,t){return n.c<t.c?-1:n.c>t.c?1:n.b<t.b?-1:n.b>t.b?1:n.a!=t.a?nsn(n.a)-nsn(t.a):n.d==(Q4(),Hmt)&&t.d==Bmt?-1:n.d==Bmt&&t.d==Hmt?1:0}function b$n(n,t){var e,i,r,c,a;return a=(c=t.a).c.i==t.b?c.d:c.c,i=c.c.i==t.b?c.c:c.d,(r=zwn(n.a,a,i))>0&&r<ZJn?(e=YAn(n.a,i.i,r,n.c),ren(n.a,i.i,-e),e>0):r<0&&-r<ZJn&&(e=JAn(n.a,i.i,-r,n.c),ren(n.a,i.i,e),e>0)}function w$n(n,t,e,i){var r,c,a,u,o,s;for(r=(t-n.d)/n.c.c.length,c=0,n.a+=e,n.d=t,s=new Wb(n.c);s.a<s.c.c.length;)u=(o=BB(n0(s),33)).g,a=o.f,Pen(o,o.i+c*r),Cen(o,o.j+i*e),Sen(o,o.g+r),Men(o,n.a),++c,lCn(o,new xC(o.g,o.f),new xC(u,a))}function d$n(n){var t,e,i,r,c,a,u;if(null==n)return null;for(u=n.length,a=x8(NNt,v6n,25,r=(u+1)/2|0,15,1),u%2!=0&&(a[--r]=ZDn((b1(u-1,n.length),n.charCodeAt(u-1)))),e=0,i=0;e<r;++e)t=ZDn(fV(n,i++)),c=ZDn(fV(n,i++)),a[e]=(t<<4|c)<<24>>24;return a}function g$n(n){if(n.pe()){var t=n.c;return t.qe()?n.o="["+t.n:t.pe()?n.o="["+t.ne():n.o="[L"+t.ne()+";",n.b=t.me()+"[]",void(n.k=t.oe()+"[]")}var e=n.j,i=n.d;i=i.split("/"),n.o=Fdn(".",[e,Fdn("$",i)]),n.b=Fdn(".",[e,Fdn(".",i)]),n.k=i[i.length-1]}function p$n(n,t){var e,i,r,c,a;for(a=null,c=new Wb(n.e.a);c.a<c.c.c.length;)if((r=BB(n0(c),121)).b.a.c.length==r.g.a.c.length){for(i=r.e,a=ePn(r),e=r.e-BB(a.a,19).a+1;e<r.e+BB(a.b,19).a;e++)t[e]<t[i]&&(i=e);t[i]<t[r.e]&&(--t[r.e],++t[i],r.e=i)}}function v$n(n){var t,i,r,c,a,u,o;for(r=RQn,i=KQn,t=new Wb(n.e.b);t.a<t.c.c.length;)for(a=new Wb(BB(n0(t),29).a);a.a<a.c.c.length;)c=BB(n0(a),10),u=(o=Gy(n.p[c.p]))+Gy(n.b[n.g[c.p].p]),r=e.Math.min(r,o),i=e.Math.max(i,u);return i-r}function m$n(n,t,e,i){var r,c,a,u,o,s;for(o=null,u=0,s=(r=jKn(n,t)).gc();u<s;++u)if(mK(i,kV(B7(n,c=BB(r.Xb(u),170)))))if(a=jV(B7(n,c)),null==e){if(null==a)return c;!o&&(o=c)}else{if(mK(e,a))return c;null==a&&!o&&(o=c)}return null}function y$n(n,t,e,i){var r,c,a,u,o,s;for(o=null,u=0,s=(r=EKn(n,t)).gc();u<s;++u)if(mK(i,kV(B7(n,c=BB(r.Xb(u),170)))))if(a=jV(B7(n,c)),null==e){if(null==a)return c;!o&&(o=c)}else{if(mK(e,a))return c;null==a&&!o&&(o=c)}return null}function k$n(n,t,e){var i,r,c,a,u,o;if(a=new go,u=axn(n.e.Tg(),t),i=BB(n.g,119),ZM(),BB(t,66).Oj())for(c=0;c<n.i;++c)r=i[c],u.rl(r.ak())&&f9(a,r);else for(c=0;c<n.i;++c)r=i[c],u.rl(r.ak())&&(o=r.dd(),f9(a,e?FIn(n,t,c,a.i,o):o));return N3(a)}function j$n(n,t){var e,i,r,c;for(e=new Hbn(uht),$Pn(),r=0,c=(i=Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])).length;r<c;++r)wR(e,i[r],new Np);return JT($V(AV(wnn(new Rq(null,new w1(n.b,16)),new Ze),new ni),new hd(t)),new fd(e)),e}function E$n(n,t,i){var r,c,a,u,o,s,h,f;for(a=t.Kc();a.Ob();)s=(c=BB(a.Pb(),33)).i+c.g/2,f=c.j+c.f/2,o=s-((u=n.f).i+u.g/2),h=f-(u.j+u.f/2),r=e.Math.sqrt(o*o+h*h),o*=n.e/r,h*=n.e/r,i?(s-=o,f-=h):(s+=o,f+=h),Pen(c,s-c.g/2),Cen(c,f-c.f/2)}function T$n(n){var t,e,i;if(!n.c&&null!=n.b){for(t=n.b.length-4;t>=0;t-=2)for(e=0;e<=t;e+=2)(n.b[e]>n.b[e+2]||n.b[e]===n.b[e+2]&&n.b[e+1]>n.b[e+3])&&(i=n.b[e+2],n.b[e+2]=n.b[e],n.b[e]=i,i=n.b[e+3],n.b[e+3]=n.b[e+1],n.b[e+1]=i);n.c=!0}}function M$n(n,t){var e,i,r,c,a,u;for(c=(1==t?Wat:Xat).a.ec().Kc();c.Ob();)for(r=BB(c.Pb(),103),u=BB(h6(n.f.c,r),21).Kc();u.Ob();)switch(a=BB(u.Pb(),46),i=BB(a.b,81),e=BB(a.a,189).c,r.g){case 2:case 1:i.g.d+=e;break;case 4:case 3:i.g.c+=e}}function S$n(n,t){var e,i,r,c,a,u,o,s,h;for(s=-1,h=0,u=0,o=(a=n).length;u<o;++u){for(c=a[u],e=new kH(-1==s?n[0]:n[s],t,(Mhn(),uvt)),i=0;i<c.length;i++)for(r=i+1;r<c.length;r++)Lx(c[i],(hWn(),wlt))&&Lx(c[r],wlt)&&fXn(e,c[i],c[r])>0&&++h;++s}return h}function P$n(n){var t;return(t=new lN(nE(n.gm))).a+="@",oO(t,(nsn(n)>>>0).toString(16)),n.kh()?(t.a+=" (eProxyURI: ",uO(t,n.qh()),n.$g()&&(t.a+=" eClass: ",uO(t,n.$g())),t.a+=")"):n.$g()&&(t.a+=" (eClass: ",uO(t,n.$g()),t.a+=")"),t.a}function C$n(n){var t,e,i;if(n.e)throw Hp(new Fy((ED(git),AYn+git.k+$Yn)));for(n.d==(Ffn(),BPt)&&Tzn(n,_Pt),e=new Wb(n.a.a);e.a<e.c.c.length;)(t=BB(n0(e),307)).g=t.i;for(i=new Wb(n.a.b);i.a<i.c.c.length;)BB(n0(i),57).i=KQn;return n.b.Le(n),n}function I$n(n,t){var e,i,r,c,a;if(t<2*n.b)throw Hp(new _y("The knot vector must have at least two time the dimension elements."));for(n.f=1,r=0;r<n.b;r++)WB(n.e,0);for(e=a=t+1-2*n.b,c=1;c<a;c++)WB(n.e,c/e);if(n.d)for(i=0;i<n.b;i++)WB(n.e,1)}function O$n(n,t){var e,i,r,c,a;if(c=t,!(a=BB(Uin(PX(n.i),c),33)))throw Hp(new ek("Unable to find elk node for json object '"+R2(c,q6n)+"' Panic!"));i=N2(c,"edges"),LIn((e=new uI(n,a)).a,e.b,i),r=N2(c,A6n),Dkn(new Ng(n).a,r)}function A$n(n,t,e,i){var r,c,a,u,o;if(null!=i){if(r=n.d[t])for(c=r.g,o=r.i,u=0;u<o;++u)if((a=BB(c[u],133)).Sh()==e&&Nfn(i,a.cd()))return u}else if(r=n.d[t])for(c=r.g,o=r.i,u=0;u<o;++u)if(GI((a=BB(c[u],133)).cd())===GI(i))return u;return-1}function $$n(n,t){var e,i;return cL(e=null==t?qI(AY(n.f,null)):hS(n.g,t),235)?((i=BB(e,235)).Qh(),i):cL(e,498)?((i=BB(e,1938).a)&&(null==i.yb||(null==t?jCn(n.f,null,i):ubn(n.g,t,i))),i):null}function L$n(n){var t,e,i,r,c,a,u;if(KDn(),null==n)return null;if((r=n.length)%2!=0)return null;for(t=V7(n),e=x8(NNt,v6n,25,c=r/2|0,15,1),i=0;i<c;i++){if(-1==(a=QLt[t[2*i]]))return null;if(-1==(u=QLt[t[2*i+1]]))return null;e[i]=(a<<4|u)<<24>>24}return e}function N$n(n,t,e){var i,r,c;if(!(r=BB(oV(n.i,t),306)))if(r=new wtn(n.d,t,e),mG(n.i,t,r),agn(t))EL(n.a,t.c,t.b,r);else switch(c=LPn(t),i=BB(oV(n.p,c),244),c.g){case 1:case 3:r.j=!0,jy(i,t.b,r);break;case 4:case 2:r.k=!0,jy(i,t.c,r)}return r}function x$n(n,t,e,i){var r,c,a,u,o,s;if(u=new go,o=axn(n.e.Tg(),t),r=BB(n.g,119),ZM(),BB(t,66).Oj())for(a=0;a<n.i;++a)c=r[a],o.rl(c.ak())&&f9(u,c);else for(a=0;a<n.i;++a)c=r[a],o.rl(c.ak())&&(s=c.dd(),f9(u,i?FIn(n,t,a,u.i,s):s));return Qwn(u,e)}function D$n(n,t){var i,r,c,a,u,o;if((r=n.b[t.p])>=0)return r;for(c=1,a=new Wb(t.j);a.a<a.c.c.length;)for(i=new Wb(BB(n0(a),11).g);i.a<i.c.c.length;)t!=(o=BB(n0(i),17).d.i)&&(u=D$n(n,o),c=e.Math.max(c,u+1));return iwn(n,t,c),c}function R$n(n,t,e){var i,r,c;for(i=1;i<n.c.length;i++){for(l1(i,n.c.length),c=BB(n.c[i],10),r=i;r>0&&t.ue((l1(r-1,n.c.length),BB(n.c[r-1],10)),c)>0;)c5(n,r,(l1(r-1,n.c.length),BB(n.c[r-1],10))),--r;l1(r,n.c.length),n.c[r]=c}e.a=new xp,e.b=new xp}function K$n(n,t,e){var i,r,c,a,u,o,s;for(s=new YK(i=BB(t.e&&t.e(),9),BB(SR(i,i.length),9),0),a=0,u=(c=kKn(e,"[\\[\\]\\s,]+")).length;a<u;++a)if(0!=RMn(r=c[a]).length){if(null==(o=HIn(n,r)))return null;orn(s,BB(o,22))}return s}function _$n(n){var t,i,r;for(i=new Wb(n.a.a.b);i.a<i.c.c.length;)t=BB(n0(i),81),kW(0),(r=0)>0&&((!dA(n.a.c)||!t.n.d)&&(!gA(n.a.c)||!t.n.b)&&(t.g.d-=e.Math.max(0,r/2-.5)),(!dA(n.a.c)||!t.n.a)&&(!gA(n.a.c)||!t.n.c)&&(t.g.a+=e.Math.max(0,r-1)))}function F$n(n,t,e){var i;if(2==(n.c-n.b&n.a.length-1))t==(kUn(),sIt)||t==oIt?(jtn(BB(Eon(n),15),(Xyn(),jCt)),jtn(BB(Eon(n),15),ECt)):(jtn(BB(Eon(n),15),(Xyn(),ECt)),jtn(BB(Eon(n),15),jCt));else for(i=new bV(n);i.a!=i.b;)jtn(BB(_hn(i),15),e)}function B$n(n,t){var e,i,r,c,a,u;for(a=new M2(i=HB(new sp(n)),i.c.length),u=new M2(r=HB(new sp(t)),r.c.length),c=null;a.b>0&&u.b>0&&(Px(a.b>0),e=BB(a.a.Xb(a.c=--a.b),33),Px(u.b>0),e==BB(u.a.Xb(u.c=--u.b),33));)c=e;return c}function H$n(n,t){var i,r,c,a;return c=n.a*aYn+1502*n.b,a=n.b*aYn+11,c+=i=e.Math.floor(a*uYn),a-=i*oYn,c%=oYn,n.a=c,n.b=a,t<=24?e.Math.floor(n.a*Oet[t]):((r=n.a*(1<<t-24)+e.Math.floor(n.b*Aet[t]))>=2147483648&&(r-=XQn),r)}function q$n(n,t,e){var i,r,c,a;w0(n,t)>w0(n,e)?(i=abn(e,(kUn(),oIt)),n.d=i.dc()?0:uq(BB(i.Xb(0),11)),a=abn(t,CIt),n.b=a.dc()?0:uq(BB(a.Xb(0),11))):(r=abn(e,(kUn(),CIt)),n.d=r.dc()?0:uq(BB(r.Xb(0),11)),c=abn(t,oIt),n.b=c.dc()?0:uq(BB(c.Xb(0),11)))}function G$n(n){var t,e,i,r,c,a,u;if(n&&(t=n.Hh(V9n))&&null!=(a=SD(cdn((!t.b&&(t.b=new Jx((gWn(),k$t),X$t,t)),t.b),"conversionDelegates")))){for(u=new Np,r=0,c=(i=kKn(a,"\\w+")).length;r<c;++r)e=i[r],u.c[u.c.length]=e;return u}return SQ(),SQ(),set}function z$n(n,t){var e,i,r,c;for(e=n.o.a,c=BB(BB(h6(n.r,t),21),84).Kc();c.Ob();)(r=BB(c.Pb(),111)).e.a=e*Gy(MD(r.b.We(Lrt))),r.e.b=(i=r.b).Xe((sWn(),aPt))?i.Hf()==(kUn(),sIt)?-i.rf().b-Gy(MD(i.We(aPt))):Gy(MD(i.We(aPt))):i.Hf()==(kUn(),sIt)?-i.rf().b:0}function U$n(n){var t,e,i,r,c,a,u,o;t=!0,r=null,c=null;n:for(o=new Wb(n.a);o.a<o.c.c.length;)for(i=new oz(ZL(fbn(u=BB(n0(o),10)).a.Kc(),new h));dAn(i);){if(e=BB(U5(i),17),r&&r!=u){t=!1;break n}if(r=u,a=e.c.i,c&&c!=a){t=!1;break n}c=a}return t}function X$n(n,t,e){var i,r,c,a,u,o;for(c=-1,u=-1,a=0;a<t.c.length&&(l1(a,t.c.length),!((r=BB(t.c[a],329)).c>n.c));a++)r.a>=n.s&&(c<0&&(c=a),u=a);return o=(n.s+n.c)/2,c>=0&&(o=qM((l1(i=YRn(n,t,c,u),t.c.length),BB(t.c[i],329))),lOn(t,i,e)),o}function W$n(){W$n=O,lEt=new XA((sWn(),cSt),1.3),gEt=jSt,IEt=new WA(15),CEt=new XA(XSt,IEt),$Et=new XA(LPt,15),bEt=hSt,jEt=KSt,EEt=BSt,TEt=qSt,kEt=DSt,MEt=USt,OEt=fPt,$An(),PEt=oEt,yEt=aEt,SEt=uEt,AEt=hEt,pEt=cEt,vEt=CSt,mEt=ISt,dEt=rEt,wEt=iEt,LEt=fEt}function V$n(n,t,e){var i,r,c,a,u;for(Bin(r=new jo,(kW(t),t)),!r.b&&(r.b=new Jx((gWn(),k$t),X$t,r)),u=r.b,a=1;a<e.length;a+=2)vjn(u,e[a-1],e[a]);for(!n.Ab&&(n.Ab=new eU(KAt,n,0,3)),i=n.Ab,c=0;c<0;++c)i=mW(BB(Wtn(i,i.i-1),590));f9(i,r)}function Q$n(n,t,e){var i,r,c;for(LD.call(this,new Np),this.a=t,this.b=e,this.e=n,n.b&&VBn(n),i=n.a,this.d=JV(i.a,this.a),this.c=JV(i.b,this.b),obn(this,this.d,this.c),mIn(this),c=this.e.e.a.ec().Kc();c.Ob();)(r=BB(c.Pb(),266)).c.c.length>0&&xqn(this,r)}function Y$n(n,t,e,i,r,c){var a,u,o;if(!r[t.b]){for(r[t.b]=!0,!(a=i)&&(a=new y6),WB(a.e,t),o=c[t.b].Kc();o.Ob();)(u=BB(o.Pb(),282)).d!=e&&u.c!=e&&(u.c!=t&&Y$n(n,u.c,t,a,r,c),u.d!=t&&Y$n(n,u.d,t,a,r,c),WB(a.c,u),gun(a.d,u.b));return a}return null}function J$n(n){var t,e,i;for(t=0,e=new Wb(n.e);e.a<e.c.c.length;)o5(new Rq(null,new w1(BB(n0(e),17).b,16)),new pe)&&++t;for(i=new Wb(n.g);i.a<i.c.c.length;)o5(new Rq(null,new w1(BB(n0(i),17).b,16)),new ve)&&++t;return t>=2}function Z$n(n,t){var e,i,r,c;for(OTn(t,"Self-Loop pre-processing",1),i=new Wb(n.a);i.a<i.c.c.length;)Kbn(e=BB(n0(i),10))&&(c=new Ogn(e),hon(e,(hWn(),Olt),c),k_n(c),JT($V(wnn(new Rq(null,new w1((r=c).d,16)),new Hi),new qi),new Gi),ixn(r));HSn(t)}function nLn(n,t,e,i,r){var c,a,u,o,s;for(c=n.c.d.j,a=BB(Dpn(e,0),8),s=1;s<e.b;s++)o=BB(Dpn(e,s),8),r5(i,a,i.c.b,i.c),u=kL(UR(new wA(a),o),.5),UR(u,kL(new XZ(hsn(c)),r)),r5(i,u,i.c.b,i.c),a=o,c=0==t?Mln(c):Eln(c);DH(i,(Px(0!=e.b),BB(e.c.b.c,8)))}function tLn(n){return n$n(),!(Can(OJ(EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[LCt])),n))>1||Can(OJ(EG(ICt,Pun(Gk(GCt,1),$Vn,93,0,[CCt,ACt])),n))>1||Can(OJ(EG(DCt,Pun(Gk(GCt,1),$Vn,93,0,[xCt,NCt])),n))>1)}function eLn(n,t){var e,i,r;return(e=t.Hh(n.a))&&null!=(r=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),"affiliation")))?-1==(i=mN(r,YTn(35)))?uln(n,az(n,Utn(t.Hj())),r):0==i?uln(n,null,r.substr(1)):uln(n,r.substr(0,i),r.substr(i+1)):null}function iLn(n){var t,e;try{return null==n?zWn:Bbn(n)}catch(i){if(cL(i=lun(i),102))return t=i,e=nE(tsn(n))+"@"+($T(),(evn(n)>>>0).toString(16)),Kgn(jun(),(lM(),"Exception during lenientFormat for "+e),t),"<"+e+" threw "+nE(t.gm)+">";throw Hp(i)}}function rLn(n){switch(n.g){case 0:return new of;case 1:return new ef;case 2:return new $M;case 3:return new Ic;case 4:return new RR;case 5:return new sf;default:throw Hp(new _y("No implementation is available for the layerer "+(null!=n.f?n.f:""+n.g)))}}function cLn(n,t,e){var i,r,c;for(c=new Wb(n.t);c.a<c.c.c.length;)(i=BB(n0(c),268)).b.s<0&&i.c>0&&(i.b.n-=i.c,i.b.n<=0&&i.b.u>0&&DH(t,i.b));for(r=new Wb(n.i);r.a<r.c.c.length;)(i=BB(n0(r),268)).a.s<0&&i.c>0&&(i.a.u-=i.c,i.a.u<=0&&i.a.n>0&&DH(e,i.a))}function aLn(n){var t,e,i;if(null==n.g&&(n.d=n.si(n.f),f9(n,n.d),n.c))return n.f;if(i=(t=BB(n.g[n.i-1],47)).Pb(),n.e=t,(e=n.si(i)).Ob())n.d=e,f9(n,e);else for(n.d=null;!t.Ob()&&($X(n.g,--n.i,null),0!=n.i);)t=BB(n.g[n.i-1],47);return i}function uLn(n,t){var e,i,r,c,a,u;if(r=(i=t).ak(),$xn(n.e,r)){if(r.hi()&&G3(n,r,i.dd()))return!1}else for(u=axn(n.e.Tg(),r),e=BB(n.g,119),c=0;c<n.i;++c)if(a=e[c],u.rl(a.ak()))return!Nfn(a,i)&&(BB(ovn(n,c,t),72),!0);return f9(n,t)}function oLn(n,t,i,r){var c,a,u;for(Bl(c=new $vn(n),(uSn(),Sut)),hon(c,(hWn(),dlt),t),hon(c,Plt,r),hon(c,(HXn(),ept),(QEn(),XCt)),hon(c,hlt,t.c),hon(c,flt,t.d),zxn(t,c),u=e.Math.floor(i/2),a=new Wb(c.j);a.a<a.c.c.length;)BB(n0(a),11).n.b=u;return c}function sLn(n,t){var e,i,r,c,a,u,o,s,h;for(o=sx(n.c-n.b&n.a.length-1),s=null,h=null,c=new bV(n);c.a!=c.b;)r=BB(_hn(c),10),e=(u=BB(mMn(r,(hWn(),hlt)),11))?u.i:null,i=(a=BB(mMn(r,flt),11))?a.i:null,s==e&&h==i||(GAn(o,t),s=e,h=i),o.c[o.c.length]=r;GAn(o,t)}function hLn(n){var t,i,r,c,a,u;for(t=0,i=new Wb(n.a);i.a<i.c.c.length;)for(c=new oz(ZL(lbn(BB(n0(i),10)).a.Kc(),new h));dAn(c);)n==(r=BB(U5(c),17)).d.i.c&&r.c.j==(kUn(),CIt)&&(a=g1(r.c).b,u=g1(r.d).b,t=e.Math.max(t,e.Math.abs(u-a)));return t}function fLn(n,t,e){var i,r;OTn(e,"Remove overlaps",1),e.n&&t&&y0(e,o2(t),(Bsn(),uOt)),i=BB(ZAn(t,(wD(),Vkt)),33),n.f=i,n.a=Evn(BB(ZAn(t,(Uyn(),Rjt)),293)),ib(n,(kW(r=MD(ZAn(t,(sWn(),LPt)))),r)),Xzn(n,t,wDn(i),e),e.n&&t&&y0(e,o2(t),(Bsn(),uOt))}function lLn(n,t,i){switch(i.g){case 1:return new xC(t.a,e.Math.min(n.d.b,t.b));case 2:return new xC(e.Math.max(n.c.a,t.a),t.b);case 3:return new xC(t.a,e.Math.max(n.c.b,t.b));case 4:return new xC(e.Math.min(t.a,n.d.a),t.b)}return new xC(t.a,t.b)}function bLn(n,t,e,i){var r,c,a,u,o,s,h,f,l;for(f=i?(kUn(),CIt):(kUn(),oIt),r=!1,s=0,h=(o=t[e]).length;s<h;++s)LK(BB(mMn(u=o[s],(HXn(),ept)),98))||(a=u.e,(l=!abn(u,f).dc()&&!!a)&&(c=qEn(a),n.b=new zEn(c,i?0:c.length-1)),r|=c_n(n,u,f,l));return r}function wLn(n){var t,e,i;for(WB(t=sx(1+(!n.c&&(n.c=new eU(XOt,n,9,9)),n.c).i),(!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d)),i=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));i.e!=i.i.gc();)WB(t,(!(e=BB(kpn(i),118)).d&&(e.d=new hK(_Ot,e,8,5)),e.d));return yX(t),new OO(t)}function dLn(n){var t,e,i;for(WB(t=sx(1+(!n.c&&(n.c=new eU(XOt,n,9,9)),n.c).i),(!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e)),i=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));i.e!=i.i.gc();)WB(t,(!(e=BB(kpn(i),118)).e&&(e.e=new hK(_Ot,e,7,4)),e.e));return yX(t),new OO(t)}function gLn(n){var t,e,i,r;if(null==n)return null;if(i=FBn(n,!0),r=x7n.length,mK(i.substr(i.length-r,r),x7n))if(4==(e=i.length)){if(b1(0,i.length),43==(t=i.charCodeAt(0)))return HLt;if(45==t)return BLt}else if(3==e)return HLt;return bSn(i)}function pLn(n){var t,e,i,r;for(t=0,e=0,r=new Wb(n.j);r.a<r.c.c.length;)if(t=dG(rbn(t,q6(AV(new Rq(null,new w1((i=BB(n0(r),11)).e,16)),new Yc)))),e=dG(rbn(e,q6(AV(new Rq(null,new w1(i.g,16)),new Jc)))),t>1||e>1)return 2;return t+e==1?2:0}function vLn(n,t,e){var i,r,c,a;for(OTn(e,"ELK Force",1),qy(TD(ZAn(t,(fRn(),Wct))))||jJ(new Tw((GM(),new Dy(t)))),kkn(a=fon(t)),zon(n,BB(mMn(a,Gct),424)),r=(c=HFn(n.a,a)).Kc();r.Ob();)i=BB(r.Pb(),231),PKn(n.b,i,mcn(e,1/c.gc()));SUn(a=GUn(c)),HSn(e)}function mLn(n,t){var e,i,r;if(OTn(t,"Breaking Point Processor",1),Ozn(n),qy(TD(mMn(n,(HXn(),Gpt))))){for(i=new Wb(n.b);i.a<i.c.c.length;)for(e=0,r=new Wb(BB(n0(i),29).a);r.a<r.c.c.length;)BB(n0(r),10).p=e++;oHn(n),Hxn(n,!0),Hxn(n,!1)}HSn(t)}function yLn(n,t,e){var i,r,c,a,u;for(a=n.c,c=(e.q?e.q:(SQ(),SQ(),het)).vc().Kc();c.Ob();)r=BB(c.Pb(),42),!jE(AV(new Rq(null,new w1(a,16)),new aw(new LC(t,r)))).sd((dM(),tit))&&(cL(u=r.dd(),4)&&null!=(i=Jdn(u))&&(u=i),t.Ye(BB(r.cd(),146),u))}function kLn(n,t){var e,i,r,c;if(t){for(c=!(r=cL(n.Cb,88)||cL(n.Cb,99))&&cL(n.Cb,322),e=new AL((!t.a&&(t.a=new aG(t,VAt,t)),t.a));e.e!=e.i.gc();)if(i=lFn(BB(kpn(e),87)),r?cL(i,88):c?cL(i,148):i)return i;return r?(gWn(),d$t):(gWn(),l$t)}return null}function jLn(n,t){var e,i,r,c,a;for(OTn(t,"Constraints Postprocessor",1),c=0,r=new Wb(n.b);r.a<r.c.c.length;){for(a=0,i=new Wb(BB(n0(r),29).a);i.a<i.c.c.length;)(e=BB(n0(i),10)).k==(uSn(),Cut)&&(hon(e,(HXn(),jgt),iln(c)),hon(e,Bdt,iln(a)),++a);++c}HSn(t)}function ELn(n,t,e,i){var r,c,a,u,o,s;for(XR(u=new xC(e,i),BB(mMn(t,(qqn(),nkt)),8)),s=spn(t.b,0);s.b!=s.d.c;)UR((o=BB(b3(s),86)).e,u),DH(n.b,o);for(a=spn(t.a,0);a.b!=a.d.c;){for(r=spn((c=BB(b3(a),188)).a,0);r.b!=r.d.c;)UR(BB(b3(r),8),u);DH(n.a,c)}}function TLn(n,t,e){var i,r,c;if(!(c=Fqn((IPn(),Z$t),n.Tg(),t)))throw Hp(new _y(r6n+t.ne()+c6n));if(ZM(),!BB(c,66).Oj()&&!(c=Z1(B7(Z$t,c))))throw Hp(new _y(r6n+t.ne()+c6n));r=BB((i=n.Yg(c))>=0?n._g(i,!0,!0):cOn(n,c,!0),153),BB(r,215).ml(t,e)}function MLn(n,t){var e,i,r,c,a;for(e=new Np,r=wnn(new Rq(null,new w1(n,16)),new Ea),c=wnn(new Rq(null,new w1(n,16)),new Ta),a=M7(H6(LV(SNn(Pun(Gk(eit,1),HWn,833,0,[r,c])),new Ma))),i=1;i<a.length;i++)a[i]-a[i-1]>=2*t&&WB(e,new kB(a[i-1]+t,a[i]-t));return e}function SLn(n,t,e){OTn(e,"Eades radial",1),e.n&&t&&y0(e,o2(t),(Bsn(),uOt)),n.d=BB(ZAn(t,(wD(),Vkt)),33),n.c=Gy(MD(ZAn(t,(Uyn(),Djt)))),n.e=Evn(BB(ZAn(t,Rjt),293)),n.a=lwn(BB(ZAn(t,_jt),426)),n.b=qjn(BB(ZAn(t,$jt),340)),rjn(n),e.n&&t&&y0(e,o2(t),(Bsn(),uOt))}function PLn(n,t,e){var i,r,c,a,u;if(e)for(c=((i=new hz(e.a.length)).b-i.a)*i.c<0?(eS(),MNt):new XL(i);c.Ob();)(r=x2(e,BB(c.Pb(),19).a))&&($in(a=$3(n,(tE(),u=new Em,!!t&&BLn(u,t),u),r),R2(r,q6n)),STn(r,a),OCn(r,a),xon(n,r,a))}function CLn(n){var t,e,i,r;if(!n.j){if(r=new Io,null==(t=P$t).a.zc(n,t)){for(i=new AL(kY(n));i.e!=i.i.gc();)pX(r,CLn(e=BB(kpn(i),26))),f9(r,e);t.a.Bc(n)}chn(r),n.j=new NO((BB(Wtn(QQ((QX(),t$t).o),11),18),r.i),r.g),P5(n).b&=-33}return n.j}function ILn(n){var t,e,i,r;if(null==n)return null;if(i=FBn(n,!0),r=x7n.length,mK(i.substr(i.length-r,r),x7n))if(4==(e=i.length)){if(b1(0,i.length),43==(t=i.charCodeAt(0)))return GLt;if(45==t)return qLt}else if(3==e)return GLt;return new Dv(i)}function OLn(n){var t,e,i;return 0!=((e=n.l)&e-1)||0!=((i=n.m)&i-1)||0!=((t=n.h)&t-1)||0==t&&0==i&&0==e?-1:0==t&&0==i&&0!=e?gin(e):0==t&&0!=i&&0==e?gin(i)+22:0!=t&&0==i&&0==e?gin(t)+44:-1}function ALn(n,t){var e,i,r,c;for(OTn(t,"Edge joining",1),e=qy(TD(mMn(n,(HXn(),Dpt)))),i=new Wb(n.b);i.a<i.c.c.length;)for(c=new M2(BB(n0(i),29).a,0);c.b<c.d.gc();)Px(c.b<c.d.gc()),(r=BB(c.d.Xb(c.c=c.b++),10)).k==(uSn(),Put)&&(rGn(r,e),fW(c));HSn(t)}function $Ln(n,t,e){var i;if(h2(n.b),CU(n.b,(Pbn(),HEt),(OM(),GTt)),CU(n.b,qEt,t.g),CU(n.b,GEt,t.a),n.a=$qn(n.b,t),OTn(e,"Compaction by shrinking a tree",n.a.c.length),t.i.c.length>1)for(i=new Wb(n.a);i.a<i.c.c.length;)BB(n0(i),51).pf(t,mcn(e,1));HSn(e)}function LLn(n,t){var e,i,r,c,a;for(r=t.a&n.f,c=null,i=n.b[r];;i=i.b){if(i==t){c?c.b=t.b:n.b[r]=t.b;break}c=i}for(a=t.f&n.f,c=null,e=n.c[a];;e=e.d){if(e==t){c?c.d=t.d:n.c[a]=t.d;break}c=e}t.e?t.e.c=t.c:n.a=t.c,t.c?t.c.e=t.e:n.e=t.e,--n.i,++n.g}function NLn(n){var t,i,r,c,a,u,o,s,h,f;for(i=n.o,t=n.p,u=DWn,c=_Vn,o=DWn,a=_Vn,h=0;h<i;++h)for(f=0;f<t;++f)vmn(n,h,f)&&(u=e.Math.min(u,h),c=e.Math.max(c,h),o=e.Math.min(o,f),a=e.Math.max(a,f));return s=c-u+1,r=a-o+1,new VV(iln(u),iln(o),iln(s),iln(r))}function xLn(n,t){var e,i,r,c;for(Px((c=new M2(n,0)).b<c.d.gc()),e=BB(c.d.Xb(c.c=c.b++),140);c.b<c.d.gc();)Px(c.b<c.d.gc()),r=new mH((i=BB(c.d.Xb(c.c=c.b++),140)).c,e.d,t),Px(c.b>0),c.a.Xb(c.c=--c.b),yR(c,r),Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++),r.a=!1,e=i}function DLn(n){var t,e,i,r,c;for(i=BB(mMn(n,(hWn(),Kft)),11),c=new Wb(n.j);c.a<c.c.c.length;){for(e=new Wb((r=BB(n0(c),11)).g);e.a<e.c.c.length;)return MZ(BB(n0(e),17),i),r;for(t=new Wb(r.e);t.a<t.c.c.length;)return SZ(BB(n0(t),17),i),r}return null}function RLn(n,t,i){var r,c;Vhn(r=fan(i.q.getTime()),0)<0?(c=VVn-dG(ldn(j7(r),VVn)))==VVn&&(c=0):c=dG(ldn(r,VVn)),1==t?xX(n,48+(c=e.Math.min((c+50)/100|0,9))&QVn):2==t?Enn(n,c=e.Math.min((c+5)/10|0,99),2):(Enn(n,c,3),t>3&&Enn(n,0,t-3))}function KLn(n){var t,e,i,r;return GI(mMn(n,(HXn(),sgt)))===GI((ufn(),pCt))?!n.e&&GI(mMn(n,Rdt))!==GI((Kan(),kft)):(i=BB(mMn(n,Kdt),292),r=qy(TD(mMn(n,Hdt)))||GI(mMn(n,qdt))===GI((Oin(),sht)),t=BB(mMn(n,Ddt),19).a,e=n.a.c.length,!r&&i!=(Kan(),kft)&&(0==t||t>e))}function _Ln(n){var t,e;for(e=0;e<n.c.length&&!(sq((l1(e,n.c.length),BB(n.c[e],113)))>0);e++);if(e>0&&e<n.c.length-1)return e;for(t=0;t<n.c.length&&!(sq((l1(t,n.c.length),BB(n.c[t],113)))>0);t++);return t>0&&e<n.c.length-1?t:n.c.length/2|0}function FLn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=6&&t){if(vkn(n,t))throw Hp(new _y(w6n+ROn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?skn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=Npn(t,n,6,i)),(i=QD(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,6,t,t))}function BLn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=9&&t){if(vkn(n,t))throw Hp(new _y(w6n+URn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?fkn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=Npn(t,n,9,i)),(i=YD(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,9,t,t))}function HLn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=3&&t){if(vkn(n,t))throw Hp(new _y(w6n+lHn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?Mkn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=Npn(t,n,12,i)),(i=VD(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,t,t))}function qLn(n){var t,e,i,r,c;if(i=Ikn(n),null==(c=n.j)&&i)return n.$j()?null:i.zj();if(cL(i,148)){if((e=i.Aj())&&(r=e.Nh())!=n.i){if((t=BB(i,148)).Ej())try{n.g=r.Kh(t,c)}catch(a){if(!cL(a=lun(a),78))throw Hp(a);n.g=null}n.i=r}return n.g}return null}function GLn(n){var t;return WB(t=new Np,new xS(new xC(n.c,n.d),new xC(n.c+n.b,n.d))),WB(t,new xS(new xC(n.c,n.d),new xC(n.c,n.d+n.a))),WB(t,new xS(new xC(n.c+n.b,n.d+n.a),new xC(n.c+n.b,n.d))),WB(t,new xS(new xC(n.c+n.b,n.d+n.a),new xC(n.c,n.d+n.a))),t}function zLn(n,t,e,i){var r,c,a;if(a=Ajn(t,e),i.c[i.c.length]=t,-1==n.j[a.p]||2==n.j[a.p]||n.a[t.p])return i;for(n.j[a.p]=-1,c=new oz(ZL(hbn(a).a.Kc(),new h));dAn(c);)if(!b5(r=BB(U5(c),17))&&(b5(r)||r.c.i.c!=r.d.i.c)&&r!=t)return zLn(n,r,a,i);return i}function ULn(n,t,e){var i,r;for(r=t.a.ec().Kc();r.Ob();)i=BB(r.Pb(),79),!BB(RX(n.b,i),266)&&(JJ(PMn(i))==JJ(OMn(i))?tDn(n,i,e):PMn(i)==JJ(OMn(i))?null==RX(n.c,i)&&null!=RX(n.b,OMn(i))&&rzn(n,i,e,!1):null==RX(n.d,i)&&null!=RX(n.b,PMn(i))&&rzn(n,i,e,!0))}function XLn(n,t){var e,i,r,c,a,u,o;for(r=n.Kc();r.Ob();)for(i=BB(r.Pb(),10),CZ(u=new CSn,i),qCn(u,(kUn(),oIt)),hon(u,(hWn(),jlt),(hN(),!0)),a=t.Kc();a.Ob();)c=BB(a.Pb(),10),CZ(o=new CSn,c),qCn(o,CIt),hon(o,jlt,!0),hon(e=new wY,jlt,!0),SZ(e,u),MZ(e,o)}function WLn(n,t,e,i){var r,c,a,u;r=Adn(n,t,e),c=Adn(n,e,t),a=BB(RX(n.c,t),112),u=BB(RX(n.c,e),112),r<c?new zZ((O6(),Myt),a,u,c-r):c<r?new zZ((O6(),Myt),u,a,r-c):(0!=r||t.i&&e.i&&i[t.i.c][e.i.c])&&(new zZ((O6(),Myt),a,u,0),new zZ(Myt,u,a,0))}function VLn(n,t){var e,i,r,c,a,u;for(r=0,a=new Wb(t.a);a.a<a.c.c.length;)for(r+=(c=BB(n0(a),10)).o.b+c.d.a+c.d.d+n.e,i=new oz(ZL(fbn(c).a.Kc(),new h));dAn(i);)(e=BB(U5(i),17)).c.i.k==(uSn(),Iut)&&(r+=(u=BB(mMn(e.c.i,(hWn(),dlt)),10)).o.b+u.d.a+u.d.d);return r}function QLn(n,t,e){var i,r,c,a,u,o,s;for(c=new Np,OBn(n,s=new YT,a=new YT,t),Ezn(n,s,a,t,e),o=new Wb(n);o.a<o.c.c.length;)for(r=new Wb((u=BB(n0(o),112)).k);r.a<r.c.c.length;)i=BB(n0(r),129),(!t||i.c==(O6(),Tyt))&&u.g>i.b.g&&(c.c[c.c.length]=i);return c}function YLn(){YLn=O,DEt=new jC("CANDIDATE_POSITION_LAST_PLACED_RIGHT",0),xEt=new jC("CANDIDATE_POSITION_LAST_PLACED_BELOW",1),KEt=new jC("CANDIDATE_POSITION_WHOLE_DRAWING_RIGHT",2),REt=new jC("CANDIDATE_POSITION_WHOLE_DRAWING_BELOW",3),_Et=new jC("WHOLE_DRAWING",4)}function JLn(n,t){if(cL(t,239))return hln(n,BB(t,33));if(cL(t,186))return Dln(n,BB(t,118));if(cL(t,354))return tQ(n,BB(t,137));if(cL(t,352))return JFn(n,BB(t,79));if(t)return null;throw Hp(new _y(z6n+LMn(new Jy(Pun(Gk(Ant,1),HWn,1,5,[t])))))}function ZLn(n){var t,e,i,r,c,a,u;for(c=new YT,r=new Wb(n.d.a);r.a<r.c.c.length;)0==(i=BB(n0(r),121)).b.a.c.length&&r5(c,i,c.c.b,c.c);if(c.b>1)for(t=AN((e=new qv,++n.b,e),n.d),u=spn(c,0);u.b!=u.d.c;)a=BB(b3(u),121),UNn(aM(cM(uM(rM(new Hv,1),0),t),a))}function nNn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=11&&t){if(vkn(n,t))throw Hp(new _y(w6n+zRn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?Skn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=Npn(t,n,10,i)),(i=zR(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,11,t,t))}function tNn(n){var t,e,i,r;for(i=new usn(new Pb(n.b).a);i.b;)r=BB((e=ten(i)).cd(),11),hon(t=BB(e.dd(),10),(hWn(),dlt),r),hon(r,Elt,t),hon(r,elt,(hN(),!0)),qCn(r,BB(mMn(t,Qft),61)),mMn(t,Qft),hon(r.i,(HXn(),ept),(QEn(),VCt)),BB(mMn(vW(r.i),Zft),21).Fc((bDn(),dft))}function eNn(n,t,e){var i,r,c;if(i=0,r=0,n.c)for(c=new Wb(n.d.i.j);c.a<c.c.c.length;)i+=BB(n0(c),11).e.c.length;else i=1;if(n.d)for(c=new Wb(n.c.i.j);c.a<c.c.c.length;)r+=BB(n0(c),11).g.c.length;else r=1;return(e+t)/2+.4*CJ(HH(r-i))*(e-t)}function iNn(n){var t,e;if(LEn(),n.Hc((kUn(),PIt)))throw Hp(new _y("Port sides must not contain UNDEFINED"));switch(n.gc()){case 1:return Mst;case 2:return t=n.Hc(oIt)&&n.Hc(CIt),e=n.Hc(sIt)&&n.Hc(SIt),t||e?Cst:Pst;case 3:return Sst;case 4:return Tst;default:return null}}function rNn(n,t,e){var i,r,c,a;for(OTn(e,"Breaking Point Removing",1),n.a=BB(mMn(t,(HXn(),Zdt)),218),r=new Wb(t.b);r.a<r.c.c.length;)for(a=new Wb(a0(BB(n0(r),29).a));a.a<a.c.c.length;)Jnn(c=BB(n0(a),10))&&!(i=BB(mMn(c,(hWn(),Rft)),305)).d&&zUn(n,i);HSn(e)}function cNn(n,t,e){return jDn(),(!Dcn(n,t)||!Dcn(n,e))&&(mzn(new xC(n.c,n.d),new xC(n.c+n.b,n.d),t,e)||mzn(new xC(n.c+n.b,n.d),new xC(n.c+n.b,n.d+n.a),t,e)||mzn(new xC(n.c+n.b,n.d+n.a),new xC(n.c,n.d+n.a),t,e)||mzn(new xC(n.c,n.d+n.a),new xC(n.c,n.d),t,e))}function aNn(n,t){var e,i,r,c;if(!n.dc())for(e=0,i=n.gc();e<i;++e)if(null==(c=SD(n.Xb(e)))?null==t:mK(c.substr(0,3),"!##")?null!=t&&(r=t.length,!mK(c.substr(c.length-r,r),t)||c.length!=t.length+3)&&!mK(S7n,t):mK(c,P7n)&&!mK(S7n,t)||mK(c,t))return!0;return!1}function uNn(n,t,e,i){var r,c,a,u,o,s;for(a=n.j.c.length,o=x8(art,rJn,306,a,0,1),u=0;u<a;u++)(c=BB(xq(n.j,u),11)).p=u,o[u]=hOn(mAn(c),e,i);for(VNn(n,o,e,t,i),s=new xp,r=0;r<o.length;r++)o[r]&&VW(s,BB(xq(n.j,r),11),o[r]);s.f.c+s.g.c!=0&&(hon(n,(hWn(),zft),s),ASn(n,o))}function oNn(n,t,e){var i,r;for(i=new Wb(n.a.b);i.a<i.c.c.length;)if((r=f2(BB(n0(i),57)))&&r.k==(uSn(),Mut))switch(BB(mMn(r,(hWn(),Qft)),61).g){case 4:r.n.a=t.a;break;case 2:r.n.a=e.a-(r.o.a+r.d.c);break;case 1:r.n.b=t.b;break;case 3:r.n.b=e.b-(r.o.b+r.d.a)}}function sNn(){sNn=O,Ivt=new HP(QZn,0),Tvt=new HP("NIKOLOV",1),Pvt=new HP("NIKOLOV_PIXEL",2),Mvt=new HP("NIKOLOV_IMPROVED",3),Svt=new HP("NIKOLOV_IMPROVED_PIXEL",4),Evt=new HP("DUMMYNODE_PERCENTAGE",5),Cvt=new HP("NODECOUNT_PERCENTAGE",6),Ovt=new HP("NO_BOUNDARY",7)}function hNn(n,t,e){var i,r,c;if(!(r=BB(ZAn(t,(SMn(),UMt)),19))&&(r=iln(0)),!(c=BB(ZAn(e,UMt),19))&&(c=iln(0)),r.a>c.a)return-1;if(r.a<c.a)return 1;if(n.a){if(0!=(i=Pln(t.j,e.j)))return i;if(0!=(i=Pln(t.i,e.i)))return i}return Pln(t.g*t.f,e.g*e.f)}function fNn(n,t){var e,i,r,c,a,u,o,s,h,f;if(++n.e,t>(o=null==n.d?0:n.d.length)){for(h=n.d,n.d=x8(oAt,c9n,63,2*o+4,0,1),c=0;c<o;++c)if(s=h[c])for(i=s.g,f=s.i,u=0;u<f;++u)a=eR(n,(r=BB(i[u],133)).Sh()),!(e=n.d[a])&&(e=n.d[a]=n.uj()),e.Fc(r);return!0}return!1}function lNn(n,t,e){var i,r,c,a,u,o;if(c=(r=e).ak(),$xn(n.e,c)){if(c.hi())for(i=BB(n.g,119),a=0;a<n.i;++a)if(Nfn(u=i[a],r)&&a!=t)throw Hp(new _y(a8n))}else for(o=axn(n.e.Tg(),c),i=BB(n.g,119),a=0;a<n.i;++a)if(u=i[a],o.rl(u.ak()))throw Hp(new _y(I7n));sln(n,t,e)}function bNn(n,t){var e,i,r,c,a,u;for(e=BB(mMn(t,(hWn(),Xft)),21),a=BB(h6((RXn(),fut),e),21),u=BB(h6(put,e),21),c=a.Kc();c.Ob();)if(i=BB(c.Pb(),21),!BB(h6(n.b,i),15).dc())return!1;for(r=u.Kc();r.Ob();)if(i=BB(r.Pb(),21),!BB(h6(n.b,i),15).dc())return!1;return!0}function wNn(n,t){var e,i,r;for(OTn(t,"Partition postprocessing",1),e=new Wb(n.b);e.a<e.c.c.length;)for(i=new Wb(BB(n0(e),29).a);i.a<i.c.c.length;)for(r=new Wb(BB(n0(i),10).j);r.a<r.c.c.length;)qy(TD(mMn(BB(n0(r),11),(hWn(),jlt))))&&AU(r);HSn(t)}function dNn(n,t){var e,i,r,c,a,u,o;if(1==n.a.c.length)return FSn(BB(xq(n.a,0),187),t);for(r=cfn(n),a=0,u=n.d,i=r,o=n.d,c=(u-i)/2+i;i+1<u;){for(a=0,e=new Wb(n.a);e.a<e.c.c.length;)a+=cHn(BB(n0(e),187),c,!1).a;a<t?(o=c,u=c):i=c,c=(u-i)/2+i}return o}function gNn(n){var t,e,i,r;return isNaN(n)?(X7(),gtt):n<-0x8000000000000000?(X7(),wtt):n>=0x8000000000000000?(X7(),btt):(i=!1,n<0&&(i=!0,n=-n),e=0,n>=OQn&&(n-=(e=CJ(n/OQn))*OQn),t=0,n>=IQn&&(n-=(t=CJ(n/IQn))*IQn),r=M$(CJ(n),t,e),i&&Oon(r),r)}function pNn(n,t){var e,i,r,c;for(e=!t||!n.u.Hc((lIn(),eIt)),c=0,r=new Wb(n.e.Cf());r.a<r.c.c.length;){if((i=BB(n0(r),838)).Hf()==(kUn(),PIt))throw Hp(new _y("Label and node size calculator can only be used with ports that have port sides assigned."));i.vf(c++),Whn(n,i,e)}}function vNn(n,t){var e,i,r,c;return(i=t.Hh(n.a))&&(!i.b&&(i.b=new Jx((gWn(),k$t),X$t,i)),null!=(e=SD(cdn(i.b,J9n)))&&cL(c=-1==(r=e.lastIndexOf("#"))?uD(n,t.Aj(),e):0==r?M9(n,null,e.substr(1)):M9(n,e.substr(0,r),e.substr(r+1)),148))?BB(c,148):null}function mNn(n,t){var e,i,r,c;return(e=t.Hh(n.a))&&(!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),null!=(r=SD(cdn(e.b,k7n)))&&cL(c=-1==(i=r.lastIndexOf("#"))?uD(n,t.Aj(),r):0==i?M9(n,null,r.substr(1)):M9(n,r.substr(0,i),r.substr(i+1)),148))?BB(c,148):null}function yNn(n){var t,e,i,r,c;for(e=new Wb(n.a.a);e.a<e.c.c.length;){for((t=BB(n0(e),307)).j=null,c=t.a.a.ec().Kc();c.Ob();)kO((i=BB(c.Pb(),57)).b),(!t.j||i.d.c<t.j.d.c)&&(t.j=i);for(r=t.a.a.ec().Kc();r.Ob();)(i=BB(r.Pb(),57)).b.a=i.d.c-t.j.d.c,i.b.b=i.d.d-t.j.d.d}return n}function kNn(n){var t,e,i,r,c;for(e=new Wb(n.a.a);e.a<e.c.c.length;){for((t=BB(n0(e),189)).f=null,c=t.a.a.ec().Kc();c.Ob();)kO((i=BB(c.Pb(),81)).e),(!t.f||i.g.c<t.f.g.c)&&(t.f=i);for(r=t.a.a.ec().Kc();r.Ob();)(i=BB(r.Pb(),81)).e.a=i.g.c-t.f.g.c,i.e.b=i.g.d-t.f.g.d}return n}function jNn(n){var t,i,r;return i=BB(n.a,19).a,r=BB(n.b,19).a,i<(t=e.Math.max(e.Math.abs(i),e.Math.abs(r)))&&r==-t?new rI(iln(i+1),iln(r)):i==t&&r<t?new rI(iln(i),iln(r+1)):i>=-t&&r==t?new rI(iln(i-1),iln(r)):new rI(iln(i),iln(r-1))}function ENn(){return lWn(),Pun(Gk(ust,1),$Vn,77,0,[rot,tot,cot,kot,Fot,Mot,Uot,Oot,Kot,got,Not,Iot,_ot,lot,Wot,Vut,Lot,Hot,jot,Bot,Qot,Dot,Qut,Rot,Yot,Got,Vot,Eot,sot,Tot,yot,Xot,Zut,uot,Pot,Jut,Cot,vot,bot,Aot,dot,eot,not,mot,wot,$ot,zot,Yut,xot,pot,Sot,hot,oot,qot,aot,fot,iot])}function TNn(n,t,e){n.d=0,n.b=0,t.k==(uSn(),Iut)&&e.k==Iut&&BB(mMn(t,(hWn(),dlt)),10)==BB(mMn(e,dlt),10)&&(S7(t).j==(kUn(),sIt)?q$n(n,t,e):q$n(n,e,t)),t.k==Iut&&e.k==Put?S7(t).j==(kUn(),sIt)?n.d=1:n.b=1:e.k==Iut&&t.k==Put&&(S7(e).j==(kUn(),sIt)?n.b=1:n.d=1),umn(n,t,e)}function MNn(n){var t,e,i,r,c;return c=ATn(n),null!=n.a&&AH(c,"category",n.a),!WE(new Cb(n.d))&&(rtn(c,"knownOptions",i=new Cl),t=new ep(i),e5(new Cb(n.d),t)),!WE(n.g)&&(rtn(c,"supportedFeatures",r=new Cl),e=new ip(r),e5(n.g,e)),c}function SNn(n){var t,e,i,r,c,a,u,o;for(t=336,e=0,r=new sR(n.length),u=0,o=(a=n).length;u<o;++u)Qln(c=a[u]),EW(c),i=c.a,WB(r.a,yX(i)),t&=i.qd(),e=Ysn(e,i.rd());return BB(BB(XU(new Rq(null,qTn(new w1((WX(),Nwn(r.a)),16),new k,t,e)),new El(n)),670),833)}function PNn(n,t){var e;n.d&&(t.c!=n.e.c||fcn(n.e.b,t.b))&&(WB(n.f,n.d),n.a=n.d.c+n.d.b,n.d=null,n.e=null),nA(t.b)?n.c=t:n.b=t,(t.b==(Aun(),Zat)&&!t.a||t.b==nut&&t.a||t.b==tut&&t.a||t.b==eut&&!t.a)&&n.c&&n.b&&(e=new UV(n.a,n.c.d,t.c-n.a,n.b.d-n.c.d),n.d=e,n.e=t)}function CNn(n){var t;if(Ym.call(this),this.i=new lu,this.g=n,this.f=BB(n.e&&n.e(),9).length,0==this.f)throw Hp(new _y("There must be at least one phase in the phase enumeration."));this.c=new YK(t=BB(Vj(this.g),9),BB(SR(t,t.length),9),0),this.a=new B2,this.b=new xp}function INn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=7&&t){if(vkn(n,t))throw Hp(new _y(w6n+cPn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?hkn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=BB(t,49).gh(n,1,DOt,i)),(i=VG(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,7,t,t))}function ONn(n,t){var e,i;if(t!=n.Cb||n.Db>>16!=3&&t){if(vkn(n,t))throw Hp(new _y(w6n+Vfn(n)));i=null,n.Cb&&(i=(e=n.Db>>16)>=0?bkn(n,i):n.Cb.ih(n,-1-e,null,i)),t&&(i=BB(t,49).gh(n,0,BOt,i)),(i=QG(n,t,i))&&i.Fi()}else 0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,3,t,t))}function ANn(n,t){var e,i,r,c,a,u,o,s,h;return $On(),t.d>n.d&&(u=n,n=t,t=u),t.d<63?Xxn(n,t):(s=z5(n,a=(-2&n.d)<<4),h=z5(t,a),i=uBn(n,G5(s,a)),r=uBn(t,G5(h,a)),o=ANn(s,h),e=ANn(i,r),c=G5(c=$Hn($Hn(c=ANn(uBn(s,i),uBn(r,h)),o),e),a),$Hn($Hn(o=G5(o,a<<1),c),e))}function $Nn(n,t,e){var i,r,c,a,u;for(a=Lfn(n,e),u=x8(Out,a1n,10,t.length,0,1),i=0,c=a.Kc();c.Ob();)qy(TD(mMn(r=BB(c.Pb(),11),(hWn(),elt))))&&(u[i++]=BB(mMn(r,Elt),10));if(i<t.length)throw Hp(new Fy("Expected "+t.length+" hierarchical ports, but found only "+i+"."));return u}function LNn(n,t){var e,i,r,c,a,u;if(!n.tb){for(!n.rb&&(n.rb=new Jz(n,HAt,n)),u=new XT((c=n.rb).i),r=new AL(c);r.e!=r.i.gc();)i=BB(kpn(r),138),(e=BB(null==(a=i.ne())?jCn(u.f,null,i):ubn(u.g,a,i),138))&&(null==a?jCn(u.f,null,e):ubn(u.g,a,e));n.tb=u}return BB(SJ(n.tb,t),138)}function NNn(n,t){var e,i,r,c,a;if((null==n.i&&qFn(n),n.i).length,!n.p){for(a=new XT(1+(3*n.g.i/2|0)),r=new ax(n.g);r.e!=r.i.gc();)i=BB(jpn(r),170),(e=BB(null==(c=i.ne())?jCn(a.f,null,i):ubn(a.g,c,i),170))&&(null==c?jCn(a.f,null,e):ubn(a.g,c,e));n.p=a}return BB(SJ(n.p,t),170)}function xNn(n,t,e,i,r){var c,a,u,o;for(wgn(i+CY(e,e.$d()),r),tW(t,Lwn(e)),(c=e.f)&&xNn(n,t,c,"Caused by: ",!1),null==e.k&&(e.k=x8(Jnt,sVn,78,0,0,1)),u=0,o=(a=e.k).length;u<o;++u)xNn(n,t,a[u],"Suppressed: ",!1);null!=console.groupEnd&&console.groupEnd.call(console)}function DNn(n,t,e,i){var r,c,a,u;for(a=(u=t.e).length,c=t.q._f(u,e?0:a-1,e),c|=gRn(n,u[e?0:a-1],e,i),r=e?1:a-2;e?r<a:r>=0;r+=e?1:-1)c|=t.c.Sf(u,r,e,i&&!qy(TD(mMn(t.j,(hWn(),Jft))))&&!qy(TD(mMn(t.j,(hWn(),Ilt))))),c|=t.q._f(u,r,e),c|=gRn(n,u[r],e,i);return TU(n.c,t),c}function RNn(n,t,e){var i,r,c,a,u,o,s,h;for(s=0,h=(o=I2(n.j)).length;s<h;++s){if(u=o[s],e==(ain(),Hvt)||e==Gvt)for(c=0,a=(r=Z0(u.g)).length;c<a;++c)OSn(t,i=r[c])&&tBn(i,!0);if(e==qvt||e==Gvt)for(c=0,a=(r=Z0(u.e)).length;c<a;++c)ISn(t,i=r[c])&&tBn(i,!0)}}function KNn(n){var t,e;switch(t=null,e=null,eEn(n).g){case 1:kUn(),t=oIt,e=CIt;break;case 2:kUn(),t=SIt,e=sIt;break;case 3:kUn(),t=CIt,e=oIt;break;case 4:kUn(),t=sIt,e=SIt}Gl(n,BB($N(Oz(BB(h6(n.k,t),15).Oc(),Qst)),113)),ql(n,BB($N(Iz(BB(h6(n.k,e),15).Oc(),Qst)),113))}function _Nn(n){var t,e,i,r,c,a;if((r=BB(xq(n.j,0),11)).e.c.length+r.g.c.length==0)n.n.a=0;else{for(a=0,i=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(r),new Gw(r)])));dAn(i);)a+=(e=BB(U5(i),11)).i.n.a+e.n.a+e.a.a;c=(t=BB(mMn(n,(HXn(),npt)),8))?t.a:0,n.n.a=a/(r.e.c.length+r.g.c.length)-c}}function FNn(n,t){var e,i,r;for(i=new Wb(t.a);i.a<i.c.c.length;)e=BB(n0(i),221),LG(BB(e.b,65),XR(B$(BB(t.b,65).c),BB(t.b,65).a)),(r=Y_n(BB(t.b,65).b,BB(e.b,65).b))>1&&(n.a=!0),NG(BB(e.b,65),UR(B$(BB(t.b,65).c),kL(XR(B$(BB(e.b,65).a),BB(t.b,65).a),r))),QZ(n,t),FNn(n,e)}function BNn(n){var t,e,i,r,c,a;for(r=new Wb(n.a.a);r.a<r.c.c.length;)(e=BB(n0(r),189)).e=0,e.d.a.$b();for(i=new Wb(n.a.a);i.a<i.c.c.length;)for(t=(e=BB(n0(i),189)).a.a.ec().Kc();t.Ob();)for(a=BB(t.Pb(),81).f.Kc();a.Ob();)(c=BB(a.Pb(),81)).d!=e&&(TU(e.d,c),++c.d.e)}function HNn(n){var t,e,i,r,c,a,u,o;for(e=0,t=o=n.j.c.length,r=2*o,u=new Wb(n.j);u.a<u.c.c.length;)switch((a=BB(n0(u),11)).j.g){case 2:case 4:a.p=-1;break;case 1:case 3:i=a.e.c.length,c=a.g.c.length,a.p=i>0&&c>0?t++:i>0?e++:c>0?r++:e++}SQ(),m$(n.j,new bi)}function qNn(n){var t,e;e=null,t=BB(xq(n.g,0),17);do{if(Lx(e=t.d.i,(hWn(),flt)))return BB(mMn(e,flt),11).i;if(e.k!=(uSn(),Cut)&&dAn(new oz(ZL(lbn(e).a.Kc(),new h))))t=BB(U5(new oz(ZL(lbn(e).a.Kc(),new h))),17);else if(e.k!=Cut)return null}while(e&&e.k!=(uSn(),Cut));return e}function GNn(n,t){var e,i,r,c,a,u,o,s,h;for(u=t.j,a=t.g,o=BB(xq(u,u.c.length-1),113),l1(0,u.c.length),s=Zmn(n,a,o,h=BB(u.c[0],113)),c=1;c<u.c.length;c++)l1(c-1,u.c.length),e=BB(u.c[c-1],113),l1(c,u.c.length),(i=Zmn(n,a,e,r=BB(u.c[c],113)))>s&&(o=e,h=r,s=i);t.a=h,t.c=o}function zNn(n,t){var e;if(!ZU(n.b,t.b))throw Hp(new Fy("Invalid hitboxes for scanline constraint calculation."));(kun(t.b,BB(MR(n.b,t.b),57))||kun(t.b,BB(TR(n.b,t.b),57)))&&($T(),t.b),n.a[t.b.f]=BB(kK(n.b,t.b),57),(e=BB(yK(n.b,t.b),57))&&(n.a[e.f]=t.b)}function UNn(n){if(!n.a.d||!n.a.e)throw Hp(new Fy((ED(Hit),Hit.k+" must have a source and target "+(ED(qit),qit.k+" specified."))));if(n.a.d==n.a.e)throw Hp(new Fy("Network simplex does not support self-loops: "+n.a+" "+n.a.d+" "+n.a.e));return RN(n.a.d.g,n.a),RN(n.a.e.b,n.a),n.a}function XNn(n,t,e){var i,r,c,a,u,o,s;for(s=new dE(new Jd(n)),u=0,o=(a=Pun(Gk(Gut,1),u1n,11,0,[t,e])).length;u<o;++u)for(c=a[u],Mon(s.a,c,(hN(),ptt)),r=new m6(c.b);y$(r.a)||y$(r.b);)(i=BB(y$(r.a)?n0(r.a):n0(r.b),17)).c==i.d||ZU(s,c==i.c?i.d:i.c);return yX(s),new t_(s)}function WNn(n,t,e){var i,r,c,a,u,o;if(i=0,0!=t.b&&0!=e.b){c=spn(t,0),a=spn(e,0),u=Gy(MD(b3(c))),o=Gy(MD(b3(a))),r=!0;do{if(u>o-n.b&&u<o+n.b)return-1;u>o-n.a&&u<o+n.a&&++i,u<=o&&c.b!=c.d.c?u=Gy(MD(b3(c))):o<=u&&a.b!=a.d.c?o=Gy(MD(b3(a))):r=!1}while(r)}return i}function VNn(n,t,e,i,r){var c,a,u,o;for(o=new YK(c=BB(Vj(FIt),9),BB(SR(c,c.length),9),0),u=new Wb(n.j);u.a<u.c.c.length;)t[(a=BB(n0(u),11)).p]&&(BUn(a,t[a.p],i),orn(o,a.j));r?(GEn(n,t,(kUn(),oIt),2*e,i),GEn(n,t,CIt,2*e,i)):(GEn(n,t,(kUn(),sIt),2*e,i),GEn(n,t,SIt,2*e,i))}function QNn(n){var t,e,i,r,c;if(c=new Np,Otn(n.b,new kw(c)),n.b.c=x8(Ant,HWn,1,0,5,1),0!=c.c.length){for(l1(0,c.c.length),t=BB(c.c[0],78),e=1,i=c.c.length;e<i;++e)l1(e,c.c.length),(r=BB(c.c[e],78))!=t&>n(t,r);if(cL(t,60))throw Hp(BB(t,60));if(cL(t,289))throw Hp(BB(t,289))}}function YNn(n,t){var e,i,r,c;for(n=null==n?zWn:(kW(n),n),e=new Ik,c=0,i=0;i<t.length&&-1!=(r=n.indexOf("%s",c));)oO(e,n.substr(c,r-c)),uO(e,t[i++]),c=r+2;if(oO(e,n.substr(c)),i<t.length){for(e.a+=" [",uO(e,t[i++]);i<t.length;)e.a+=FWn,uO(e,t[i++]);e.a+="]"}return e.a}function JNn(n){var t,e,i,r;for(t=0,r=(i=n.length)-4,e=0;e<r;)b1(e+3,n.length),t=n.charCodeAt(e+3)+(b1(e+2,n.length),31*(n.charCodeAt(e+2)+(b1(e+1,n.length),31*(n.charCodeAt(e+1)+(b1(e,n.length),31*(n.charCodeAt(e)+31*t)))))),t|=0,e+=4;for(;e<i;)t=31*t+fV(n,e++);return t|=0}function ZNn(n){var t;for(t=new oz(ZL(lbn(n).a.Kc(),new h));dAn(t);)if(BB(U5(t),17).d.i.k!=(uSn(),Sut))throw Hp(new rk(P1n+gyn(n)+"' has its layer constraint set to LAST, but has at least one outgoing edge that does not go to a LAST_SEPARATE node. That must not happen."))}function nxn(n,t,i,r){var c,a,u,o,s,f,l;for(o=0,s=new Wb(n.a);s.a<s.c.c.length;){for(u=0,a=new oz(ZL(fbn(BB(n0(s),10)).a.Kc(),new h));dAn(a);)f=g1((c=BB(U5(a),17)).c).b,l=g1(c.d).b,u=e.Math.max(u,e.Math.abs(l-f));o=e.Math.max(o,u)}return r*e.Math.min(1,t/i)*o}function txn(n){var t;return t=new Pk,0!=(256&n)&&(t.a+="F"),0!=(128&n)&&(t.a+="H"),0!=(512&n)&&(t.a+="X"),0!=(2&n)&&(t.a+="i"),0!=(8&n)&&(t.a+="m"),0!=(4&n)&&(t.a+="s"),0!=(32&n)&&(t.a+="u"),0!=(64&n)&&(t.a+="w"),0!=(16&n)&&(t.a+="x"),0!=(n&k6n)&&(t.a+=","),Uy(t.a)}function exn(n,t){var e,i,r;for(OTn(t,"Resize child graph to fit parent.",1),i=new Wb(n.b);i.a<i.c.c.length;)e=BB(n0(i),29),gun(n.a,e.a),e.a.c=x8(Ant,HWn,1,0,5,1);for(r=new Wb(n.a);r.a<r.c.c.length;)PZ(BB(n0(r),10),null);n.b.c=x8(Ant,HWn,1,0,5,1),Bxn(n),n.e&&S_n(n.e,n),HSn(t)}function ixn(n){var t,e,i,r,c,a,u;if(r=(i=n.b).e,c=LK(BB(mMn(i,(HXn(),ept)),98)),e=!!r&&BB(mMn(r,(hWn(),Zft)),21).Hc((bDn(),lft)),!c&&!e)for(u=new Kb(new Ob(n.e).a.vc().Kc());u.a.Ob();)t=BB(u.a.Pb(),42),(a=BB(t.dd(),113)).a&&(CZ(a.d,null),a.c=!0,n.a=!0)}function rxn(n){var t,e,i,r,c,a,u,o,s,h,f,l;for(f=-1,l=0,s=0,h=(o=n).length;s<h;++s){for(a=0,u=(c=o[s]).length;a<u;++a)for(r=c[a],t=new pP(-1==f?n[0]:n[f],okn(r)),e=0;e<r.j.c.length;e++)for(i=e+1;i<r.j.c.length;i++)Nz(t,BB(xq(r.j,e),11),BB(xq(r.j,i),11))>0&&++l;++f}return l}function cxn(n,t){var e,i,r,c,a;for(a=BB(mMn(t,(CAn(),Lkt)),425),c=spn(t.b,0);c.b!=c.d.c;)if(r=BB(b3(c),86),0==n.b[r.g]){switch(a.g){case 0:Qvn(n,r);break;case 1:HAn(n,r)}n.b[r.g]=2}for(i=spn(n.a,0);i.b!=i.d.c;)ywn((e=BB(b3(i),188)).b.d,e,!0),ywn(e.c.b,e,!0);hon(t,(qqn(),lkt),n.a)}function axn(n,t){var e,i,r,c;return ZM(),t?t==(Uqn(),KLt)||(t==yLt||t==vLt||t==mLt)&&n!=pLt?new cUn(n,t):((e=(i=BB(t,677)).pk())||(kV(B7((IPn(),Z$t),t)),e=i.pk()),!e.i&&(e.i=new xp),!(r=BB(qI(AY((c=e.i).f,n)),1942))&&VW(c,n,r=new cUn(n,t)),r):aLt}function uxn(n,t){var e,i,r,c,a,u,o,s;for(u=BB(mMn(n,(hWn(),dlt)),11),o=Aon(Pun(Gk(PMt,1),sVn,8,0,[u.i.n,u.n,u.a])).a,s=n.i.n.b,r=0,c=(i=Z0(n.e)).length;r<c;++r)MZ(e=i[r],u),fO(e.a,new xC(o,s)),t&&((a=BB(mMn(e,(HXn(),vgt)),74))||(a=new km,hon(e,vgt,a)),DH(a,new xC(o,s)))}function oxn(n,t){var e,i,r,c,a,u,o,s;for(i=BB(mMn(n,(hWn(),dlt)),11),o=Aon(Pun(Gk(PMt,1),sVn,8,0,[i.i.n,i.n,i.a])).a,s=n.i.n.b,a=0,u=(c=Z0(n.g)).length;a<u;++a)SZ(r=c[a],i),hO(r.a,new xC(o,s)),t&&((e=BB(mMn(r,(HXn(),vgt)),74))||(e=new km,hon(r,vgt,e)),DH(e,new xC(o,s)))}function sxn(n,t){var e,i,r,c,a;for(n.b=new Np,n.d=BB(mMn(t,(hWn(),Slt)),230),n.e=c0(n.d),c=new YT,r=u6(Pun(Gk(jut,1),JZn,37,0,[t])),a=0;a<r.c.length;)l1(a,r.c.length),(i=BB(r.c[a],37)).p=a++,gun(r,(e=new CGn(i,n.a,n.b)).b),WB(n.b,e),e.s&&nX(spn(c,0),e);return n.c=new Rv,c}function hxn(n,t){var e,i,r,c,a,u;for(a=BB(BB(h6(n.r,t),21),84).Kc();a.Ob();)(e=(c=BB(a.Pb(),111)).c?VH(c.c):0)>0?c.a?e>(u=c.b.rf().a)&&(r=(e-u)/2,c.d.b=r,c.d.c=r):c.d.c=n.s+e:Hz(n.u)&&((i=_Tn(c.b)).c<0&&(c.d.b=-i.c),i.c+i.b>c.b.rf().a&&(c.d.c=i.c+i.b-c.b.rf().a))}function fxn(n,t){var e,i;for(OTn(t,"Semi-Interactive Crossing Minimization Processor",1),e=!1,i=new Wb(n.b);i.a<i.c.c.length;)e|=null!=$fn(ytn(AV(AV(new Rq(null,new w1(BB(n0(i),29).a,16)),new Qi),new Yi),new Ji),new Zi).a;e&&hon(n,(hWn(),alt),(hN(),!0)),HSn(t)}function lxn(n,t,e){var i,r,c;if(!(r=e)&&(r=new Xm),OTn(r,"Layout",n.a.c.length),qy(TD(mMn(t,(CAn(),Ekt)))))for($T(),i=0;i<n.a.c.length;i++)i++,nE(tsn(BB(xq(n.a,i),51)));for(c=new Wb(n.a);c.a<c.c.c.length;)BB(n0(c),51).pf(t,mcn(r,1));HSn(r)}function bxn(n){var t,i;if(t=BB(n.a,19).a,i=BB(n.b,19).a,t>=0){if(t==i)return new rI(iln(-t-1),iln(-t-1));if(t==-i)return new rI(iln(-t),iln(i+1))}return e.Math.abs(t)>e.Math.abs(i)?new rI(iln(-t),iln(t<0?i:i+1)):new rI(iln(t+1),iln(i))}function wxn(n){var t,e;e=BB(mMn(n,(HXn(),kgt)),163),t=BB(mMn(n,(hWn(),ilt)),303),e==(Tbn(),Flt)?(hon(n,kgt,qlt),hon(n,ilt,(z7(),Cft))):e==Hlt?(hon(n,kgt,qlt),hon(n,ilt,(z7(),Sft))):t==(z7(),Cft)?(hon(n,kgt,Flt),hon(n,ilt,Pft)):t==Sft&&(hon(n,kgt,Hlt),hon(n,ilt,Pft))}function dxn(){dxn=O,jyt=new oa,vyt=dq(new B2,(yMn(),_at),(lWn(),jot)),kyt=WG(dq(new B2,_at,Dot),Bat,xot),Eyt=ogn(ogn(FM(WG(dq(new B2,Rat,Uot),Bat,zot),Fat),Got),Xot),myt=WG(dq(dq(dq(new B2,Kat,Mot),Fat,Pot),Fat,Cot),Bat,Sot),yyt=WG(dq(dq(new B2,Fat,Cot),Fat,uot),Bat,aot)}function gxn(){gxn=O,Cyt=dq(WG(new B2,(yMn(),Bat),(lWn(),hot)),_at,jot),$yt=ogn(ogn(FM(WG(dq(new B2,Rat,Uot),Bat,zot),Fat),Got),Xot),Iyt=WG(dq(dq(dq(new B2,Kat,Mot),Fat,Pot),Fat,Cot),Bat,Sot),Ayt=dq(dq(new B2,_at,Dot),Bat,xot),Oyt=WG(dq(dq(new B2,Fat,Cot),Fat,uot),Bat,aot)}function pxn(n,t,e,i,r){var c,a;(b5(t)||t.c.i.c!=t.d.i.c)&&nrn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])),e)||b5(t)||(t.c==r?Kx(t.a,0,new wA(e)):DH(t.a,new wA(e)),i&&!FT(n.a,e)&&((a=BB(mMn(t,(HXn(),vgt)),74))||(a=new km,hon(t,vgt,a)),r5(a,c=new wA(e),a.c.b,a.c),TU(n.a,c)))}function vxn(n){var t;for(t=new oz(ZL(fbn(n).a.Kc(),new h));dAn(t);)if(BB(U5(t),17).c.i.k!=(uSn(),Sut))throw Hp(new rk(P1n+gyn(n)+"' has its layer constraint set to FIRST, but has at least one incoming edge that does not come from a FIRST_SEPARATE node. That must not happen."))}function mxn(n,t,e){var i,r,c,a,u,o;if(0==(r=pbn(254&n.Db)))n.Eb=e;else{if(1==r)a=x8(Ant,HWn,1,2,5,1),0==Rmn(n,t)?(a[0]=e,a[1]=n.Eb):(a[0]=n.Eb,a[1]=e);else for(a=x8(Ant,HWn,1,r+1,5,1),c=een(n.Eb),i=2,u=0,o=0;i<=128;i<<=1)i==t?a[o++]=e:0!=(n.Db&i)&&(a[o++]=c[u++]);n.Eb=a}n.Db|=t}function yxn(n,t,i){var r,c,a,u;for(this.b=new Np,c=0,r=0,u=new Wb(n);u.a<u.c.c.length;)a=BB(n0(u),167),i&&KBn(a),WB(this.b,a),c+=a.o,r+=a.p;this.b.c.length>0&&(c+=(a=BB(xq(this.b,0),167)).o,r+=a.p),c*=2,r*=2,t>1?c=CJ(e.Math.ceil(c*t)):r=CJ(e.Math.ceil(r/t)),this.a=new qwn(c,r)}function kxn(n,t,i,r,c,a){var u,o,s,h,f,l,b,w,d,g;for(h=r,t.j&&t.o?(d=(b=BB(RX(n.f,t.A),57)).d.c+b.d.b,--h):d=t.a.c+t.a.b,f=c,i.q&&i.o?(s=(b=BB(RX(n.f,i.C),57)).d.c,++f):s=i.a.c,w=d+(o=(s-d)/e.Math.max(2,f-h)),l=h;l<f;++l)g=(u=BB(a.Xb(l),128)).a.b,u.a.c=w-g/2,w+=o}function jxn(n,t,e,i,r,c){var a,u,o,s,h,f;for(s=e.c.length,c&&(n.c=x8(ANt,hQn,25,t.length,15,1)),a=r?0:t.length-1;r?a<t.length:a>=0;a+=r?1:-1){for(u=t[a],o=i==(kUn(),oIt)?r?abn(u,i):ean(abn(u,i)):r?ean(abn(u,i)):abn(u,i),c&&(n.c[u.p]=o.gc()),f=o.Kc();f.Ob();)h=BB(f.Pb(),11),n.d[h.p]=s++;gun(e,o)}}function Exn(n,t,e){var i,r,c,a,u,o,s,h;for(c=Gy(MD(n.b.Kc().Pb())),s=Gy(MD(Wan(t.b))),i=kL(B$(n.a),s-e),r=kL(B$(t.a),e-c),kL(h=UR(i,r),1/(s-c)),this.a=h,this.b=new Np,u=!0,(a=n.b.Kc()).Pb();a.Ob();)o=Gy(MD(a.Pb())),u&&o-e>D3n&&(this.b.Fc(e),u=!1),this.b.Fc(o);u&&this.b.Fc(e)}function Txn(n){var t,e,i,r;if(hKn(n,n.n),n.d.c.length>0){for(nk(n.c);pAn(n,BB(n0(new Wb(n.e.a)),121))<n.e.a.c.length;){for(r=(t=Ryn(n)).e.e-t.d.e-t.a,t.e.j&&(r=-r),i=new Wb(n.e.a);i.a<i.c.c.length;)(e=BB(n0(i),121)).j&&(e.e+=r);nk(n.c)}nk(n.c),pIn(n,BB(n0(new Wb(n.e.a)),121)),gGn(n)}}function Mxn(n,t){var e,i,r,c,a;for(r=BB(h6(n.a,(LEn(),Mst)),15).Kc();r.Ob();)switch(i=BB(r.Pb(),101),e=BB(xq(i.j,0),113).d.j,m$(c=new t_(i.j),new Jr),t.g){case 1:NEn(n,c,e,(Crn(),Dst),1);break;case 0:NEn(n,new s1(c,0,a=_Ln(c)),e,(Crn(),Dst),0),NEn(n,new s1(c,a,c.c.length),e,Dst,1)}}function Sxn(n,t){var e,i;if(Nun(),e=T5(cin(),t.tg())){if(i=e.j,cL(n,239))return rZ(BB(n,33))?SN(i,(rpn(),sMt))||SN(i,hMt):SN(i,(rpn(),sMt));if(cL(n,352))return SN(i,(rpn(),uMt));if(cL(n,186))return SN(i,(rpn(),fMt));if(cL(n,354))return SN(i,(rpn(),oMt))}return!0}function Pxn(n,t,e){var i,r,c,a,u,o;if(c=(r=e).ak(),$xn(n.e,c)){if(c.hi())for(i=BB(n.g,119),a=0;a<n.i;++a)if(Nfn(u=i[a],r)&&a!=t)throw Hp(new _y(a8n))}else for(o=axn(n.e.Tg(),c),i=BB(n.g,119),a=0;a<n.i;++a)if(u=i[a],o.rl(u.ak())&&a!=t)throw Hp(new _y(I7n));return BB(ovn(n,t,e),72)}function Cxn(n,t){if(t instanceof Object)try{if(t.__java$exception=n,-1!=navigator.userAgent.toLowerCase().indexOf("msie")&&$doc.documentMode<9)return;var e=n;Object.defineProperties(t,{cause:{get:function(){var n=e.Zd();return n&&n.Xd()}},suppressed:{get:function(){return e.Yd()}}})}catch(i){}}function Ixn(n,t){var e,i,r,c,a;if(i=t>>5,t&=31,i>=n.d)return n.e<0?(ODn(),Ytt):(ODn(),eet);if(c=n.d-i,QSn(r=x8(ANt,hQn,25,c+1,15,1),c,n.a,i,t),n.e<0){for(e=0;e<i&&0==n.a[e];e++);if(e<i||t>0&&n.a[e]<<32-t!=0){for(e=0;e<c&&-1==r[e];e++)r[e]=0;e==c&&++c,++r[e]}}return X0(a=new lU(n.e,c,r)),a}function Oxn(n){var t,e,i,r;return e=new $w(r=WJ(n)),i=new Lw(r),gun(t=new Np,(!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d)),gun(t,(!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e)),BB(P4($V(AV(new Rq(null,new w1(t,16)),e),i),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21)}function Axn(n,t,e,i){var r,c,a,u,o;if(ZM(),u=BB(t,66).Oj(),$xn(n.e,t)){if(t.hi()&&UFn(n,t,i,cL(t,99)&&0!=(BB(t,18).Bb&BQn)))throw Hp(new _y(a8n))}else for(o=axn(n.e.Tg(),t),r=BB(n.g,119),a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak()))throw Hp(new _y(I7n));sln(n,EPn(n,t,e),u?BB(i,72):Z3(t,i))}function $xn(n,t){var e,i,r;return ZM(),!!t.$j()||-2==t.Zj()&&(t==(TOn(),lLt)||t==sLt||t==hLt||t==fLt||!(Awn(r=n.Tg(),t)>=0)&&(!(e=Fqn((IPn(),Z$t),r,t))||((i=e.Zj())>1||-1==i)&&3!=DW(B7(Z$t,e))))}function Lxn(n,t,e,i){var r,c,a,u,o;return u=PTn(BB(Wtn((!t.b&&(t.b=new hK(KOt,t,4,7)),t.b),0),82)),o=PTn(BB(Wtn((!t.c&&(t.c=new hK(KOt,t,5,8)),t.c),0),82)),JJ(u)==JJ(o)||Ctn(o,u)?null:(a=XJ(t))==e?i:(c=BB(RX(n.a,a),10))&&(r=c.e)?r:null}function Nxn(n,t){var e;switch(OTn(t,"Label side selection ("+(e=BB(mMn(n,(HXn(),Jdt)),276))+")",1),e.g){case 0:TAn(n,(Xyn(),jCt));break;case 1:TAn(n,(Xyn(),ECt));break;case 2:sBn(n,(Xyn(),jCt));break;case 3:sBn(n,(Xyn(),ECt));break;case 4:uDn(n,(Xyn(),jCt));break;case 5:uDn(n,(Xyn(),ECt))}HSn(t)}function xxn(n,t,e){var i,r,c,a,u;if((c=n[lj(e,n.length)])[0].k==(uSn(),Mut))for(r=fj(e,c.length),u=t.j,i=0;i<u.c.length;i++)l1(i,u.c.length),a=BB(u.c[i],11),(e?a.j==(kUn(),oIt):a.j==(kUn(),CIt))&&qy(TD(mMn(a,(hWn(),elt))))&&(c5(u,i,BB(mMn(c[r],(hWn(),dlt)),11)),r+=e?1:-1)}function Dxn(n,t){var e,i,r,c,a;a=new Np,e=t;do{(c=BB(RX(n.b,e),128)).B=e.c,c.D=e.d,a.c[a.c.length]=c,e=BB(RX(n.k,e),17)}while(e);return l1(0,a.c.length),(i=BB(a.c[0],128)).j=!0,i.A=BB(i.d.a.ec().Kc().Pb(),17).c.i,(r=BB(xq(a,a.c.length-1),128)).q=!0,r.C=BB(r.d.a.ec().Kc().Pb(),17).d.i,a}function Rxn(n){if(null==n.g)switch(n.p){case 0:n.g=fZ(n)?(hN(),vtt):(hN(),ptt);break;case 1:n.g=Pnn(D3(n));break;case 2:n.g=fun(Q1(n));break;case 3:n.g=OW(n);break;case 4:n.g=new Nb(IW(n));break;case 6:n.g=jgn(AW(n));break;case 5:n.g=iln(hJ(n));break;case 7:n.g=rln(_3(n))}return n.g}function Kxn(n){if(null==n.n)switch(n.p){case 0:n.n=lZ(n)?(hN(),vtt):(hN(),ptt);break;case 1:n.n=Pnn(R3(n));break;case 2:n.n=fun(Y1(n));break;case 3:n.n=LW(n);break;case 4:n.n=new Nb(NW(n));break;case 6:n.n=jgn($W(n));break;case 5:n.n=iln(fJ(n));break;case 7:n.n=rln(K3(n))}return n.n}function _xn(n){var t,e,i,r,c,a;for(r=new Wb(n.a.a);r.a<r.c.c.length;)(e=BB(n0(r),307)).g=0,e.i=0,e.e.a.$b();for(i=new Wb(n.a.a);i.a<i.c.c.length;)for(t=(e=BB(n0(i),307)).a.a.ec().Kc();t.Ob();)for(a=BB(t.Pb(),57).c.Kc();a.Ob();)(c=BB(a.Pb(),57)).a!=e&&(TU(e.e,c),++c.a.g,++c.a.i)}function Fxn(n,t){var e,i,r;if(!ZU(n.a,t.b))throw Hp(new Fy("Invalid hitboxes for scanline overlap calculation."));for(r=!1,i=new Fb(new BR(new xN(new _b(n.a.a).a).b));aS(i.a.a);)if(e=BB(mx(i.a).cd(),65),eon(t.b,e))xj(n.b.a,t.b,e),r=!0;else if(r)break}function Bxn(n){var t,i,r,c,a;c=BB(mMn(n,(HXn(),Fgt)),21),a=BB(mMn(n,qgt),21),t=new wA(i=new xC(n.f.a+n.d.b+n.d.c,n.f.b+n.d.d+n.d.a)),c.Hc((mdn(),DIt))&&(r=BB(mMn(n,Hgt),8),a.Hc((n_n(),GIt))&&(r.a<=0&&(r.a=20),r.b<=0&&(r.b=20)),t.a=e.Math.max(i.a,r.a),t.b=e.Math.max(i.b,r.b)),XBn(n,i,t)}function Hxn(n,t){var e,i,r,c,a,u,o,s;r=t?new pc:new vc,c=!1;do{for(c=!1,a=(t?ean(n.b):n.b).Kc();a.Ob();)for(s=a0(BB(a.Pb(),29).a),t||new fy(s),o=new Wb(s);o.a<o.c.c.length;)u=BB(n0(o),10),r.Mb(u)&&(i=u,e=BB(mMn(u,(hWn(),Rft)),305),c=eRn(i,t?e.b:e.k,t,!1))}while(c)}function qxn(n,t,e){var i,r,c,a;for(OTn(e,"Longest path layering",1),n.a=t,a=n.a.a,n.b=x8(ANt,hQn,25,a.c.length,15,1),i=0,c=new Wb(a);c.a<c.c.c.length;)BB(n0(c),10).p=i,n.b[i]=-1,++i;for(r=new Wb(a);r.a<r.c.c.length;)D$n(n,BB(n0(r),10));a.c=x8(Ant,HWn,1,0,5,1),n.a=null,n.b=null,HSn(e)}function Gxn(n,t){var e,i,r;t.a?(ZU(n.b,t.b),n.a[t.b.i]=BB(kK(n.b,t.b),81),(e=BB(yK(n.b,t.b),81))&&(n.a[e.i]=t.b)):(!!(i=BB(kK(n.b,t.b),81))&&i==n.a[t.b.i]&&!!i.d&&i.d!=t.b.d&&i.f.Fc(t.b),!!(r=BB(yK(n.b,t.b),81))&&n.a[r.i]==t.b&&!!r.d&&r.d!=t.b.d&&t.b.f.Fc(r),MN(n.b,t.b))}function zxn(n,t){var i,r,c,a,u,o;return a=n.d,(o=Gy(MD(mMn(n,(HXn(),agt)))))<0&&hon(n,agt,o=0),t.o.b=o,u=e.Math.floor(o/2),qCn(r=new CSn,(kUn(),CIt)),CZ(r,t),r.n.b=u,qCn(c=new CSn,oIt),CZ(c,t),c.n.b=u,MZ(n,r),qan(i=new wY,n),hon(i,vgt,null),SZ(i,c),MZ(i,a),jFn(t,n,i),sCn(n,i),i}function Uxn(n){var t,e;return e=BB(mMn(n,(hWn(),Zft)),21),t=new B2,e.Hc((bDn(),bft))&&(Jcn(t,byt),Jcn(t,dyt)),(e.Hc(dft)||qy(TD(mMn(n,(HXn(),ugt)))))&&(Jcn(t,dyt),e.Hc(gft)&&Jcn(t,gyt)),e.Hc(lft)&&Jcn(t,lyt),e.Hc(vft)&&Jcn(t,pyt),e.Hc(wft)&&Jcn(t,wyt),e.Hc(sft)&&Jcn(t,hyt),e.Hc(fft)&&Jcn(t,fyt),t}function Xxn(n,t){var e,i,r,c,a,u,o,s,h;return c=(e=n.d)+(i=t.d),a=n.e!=t.e?-1:1,2==c?(h=dG(o=cbn(e0(n.a[0],UQn),e0(t.a[0],UQn))),0==(s=dG(jz(o,32)))?new X6(a,h):new lU(a,2,Pun(Gk(ANt,1),hQn,25,15,[h,s]))):(Dfn(n.a,e,t.a,i,r=x8(ANt,hQn,25,c,15,1)),X0(u=new lU(a,c,r)),u)}function Wxn(n,t,e,i){var r,c;return t?0==(r=n.a.ue(e.d,t.d))?(i.d=pR(t,e.e),i.b=!0,t):(c=r<0?0:1,t.a[c]=Wxn(n,t.a[c],e,i),Vy(t.a[c])&&(Vy(t.a[1-c])?(t.b=!0,t.a[0].b=!1,t.a[1].b=!1):Vy(t.a[c].a[c])?t=wrn(t,1-c):Vy(t.a[c].a[1-c])&&(t=r2(t,1-c))),t):e}function Vxn(n,t,i){var r,c,a,u;c=n.i,r=n.n,Y5(n,(Dtn(),Git),c.c+r.b,i),Y5(n,Uit,c.c+c.b-r.c-i[2],i),u=c.b-r.b-r.c,i[0]>0&&(i[0]+=n.d,u-=i[0]),i[2]>0&&(i[2]+=n.d,u-=i[2]),a=e.Math.max(0,u),i[1]=e.Math.max(i[1],u),Y5(n,zit,c.c+r.b+i[0]-(i[1]-u)/2,i),t==zit&&(n.c.b=a,n.c.c=c.c+r.b+(a-u)/2)}function Qxn(){this.c=x8(xNt,qQn,25,(kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,15,1),this.b=x8(xNt,qQn,25,Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt]).length,15,1),this.a=x8(xNt,qQn,25,Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt]).length,15,1),mS(this.c,RQn),mS(this.b,KQn),mS(this.a,KQn)}function Yxn(n,t,e){var i,r,c,a;if(t<=e?(r=t,c=e):(r=e,c=t),i=0,null==n.b)n.b=x8(ANt,hQn,25,2,15,1),n.b[0]=r,n.b[1]=c,n.c=!0;else{if(i=n.b.length,n.b[i-1]+1==r)return void(n.b[i-1]=c);a=x8(ANt,hQn,25,i+2,15,1),aHn(n.b,0,a,0,i),n.b=a,n.b[i-1]>=r&&(n.c=!1,n.a=!1),n.b[i++]=r,n.b[i]=c,n.c||T$n(n)}}function Jxn(n,t,e){var i,r,c,a,u,o,s;for(s=t.d,n.a=new J6(s.c.length),n.c=new xp,u=new Wb(s);u.a<u.c.c.length;)a=BB(n0(u),101),c=new Fan(null),WB(n.a,c),VW(n.c,a,c);for(n.b=new xp,vCn(n,t),i=0;i<s.c.length-1;i++)for(o=BB(xq(t.d,i),101),r=i+1;r<s.c.length;r++)WLn(n,o,BB(xq(t.d,r),101),e)}function Zxn(n,t,e){var i,r,c,a,u,o;if(!h3(t)){for(OTn(o=mcn(e,(cL(t,14)?BB(t,14).gc():F3(t.Kc()))/n.a|0),z3n,1),u=new Ia,a=0,c=t.Kc();c.Ob();)i=BB(c.Pb(),86),u=Wen(Pun(Gk(xnt,1),HWn,20,0,[u,new bg(i)])),a<i.f.b&&(a=i.f.b);for(r=t.Kc();r.Ob();)hon(i=BB(r.Pb(),86),(qqn(),ukt),a);HSn(o),Zxn(n,u,e)}}function nDn(n,t){var i,r,c,a,u,o,s;for(i=KQn,uSn(),o=Cut,c=new Wb(t.a);c.a<c.c.c.length;)(a=(r=BB(n0(c),10)).k)!=Cut&&(null==(u=MD(mMn(r,(hWn(),plt))))?(i=e.Math.max(i,0),r.n.b=i+XN(n.a,a,o)):r.n.b=(kW(u),u)),s=XN(n.a,a,o),r.n.b<i+s+r.d.d&&(r.n.b=i+s+r.d.d),i=r.n.b+r.o.b+r.d.a,o=a}function tDn(n,t,e){var i,r,c;for(qan(c=new EAn(XXn(qSn(cDn(t,!1,!1)),Gy(MD(ZAn(t,(Epn(),pct))))+n.a)),t),VW(n.b,t,c),e.c[e.c.length]=c,!t.n&&(t.n=new eU(zOt,t,1,7)),r=new AL(t.n);r.e!=r.i.gc();)i=JRn(n,BB(kpn(r),137),!0,0,0),e.c[e.c.length]=i;return c}function eDn(n,t,e,i,r){var c,a,u;if(n.d&&n.d.lg(r),Dvn(n,e,BB(r.Xb(0),33),!1))return!0;if(Dvn(n,i,BB(r.Xb(r.gc()-1),33),!0))return!0;if(NMn(n,r))return!0;for(u=r.Kc();u.Ob();)for(a=BB(u.Pb(),33),c=t.Kc();c.Ob();)if(_Dn(n,a,BB(c.Pb(),33)))return!0;return!1}function iDn(n,t,e){var i,r,c,a,u,o,s,h,f;f=t.c.length;n:for(c=BB((s=n.Yg(e))>=0?n._g(s,!1,!0):cOn(n,e,!1),58).Kc();c.Ob();){for(r=BB(c.Pb(),56),h=0;h<f;++h)if(l1(h,t.c.length),o=(a=BB(t.c[h],72)).dd(),u=a.ak(),i=r.bh(u,!1),null==o?null!=i:!Nfn(o,i))continue n;return r}return null}function rDn(n,t,e,i){var r,c,a,u;for(r=BB(DSn(t,(kUn(),CIt)).Kc().Pb(),11),c=BB(DSn(t,oIt).Kc().Pb(),11),u=new Wb(n.j);u.a<u.c.c.length;){for(a=BB(n0(u),11);0!=a.e.c.length;)MZ(BB(xq(a.e,0),17),r);for(;0!=a.g.c.length;)SZ(BB(xq(a.g,0),17),c)}e||hon(t,(hWn(),hlt),null),i||hon(t,(hWn(),flt),null)}function cDn(n,t,e){var i,r;if(0==(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)return qun(n);if(i=BB(Wtn((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),0),202),t&&(sqn((!i.a&&(i.a=new $L(xOt,i,5)),i.a)),Ien(i,0),Aen(i,0),Ten(i,0),Oen(i,0)),e)for(!n.a&&(n.a=new eU(FOt,n,6,6)),r=n.a;r.i>1;)fDn(r,r.i-1);return i}function aDn(n,t){var e,i,r,c,a,u,o;for(OTn(t,"Comment post-processing",1),c=new Wb(n.b);c.a<c.c.c.length;){for(r=BB(n0(c),29),i=new Np,u=new Wb(r.a);u.a<u.c.c.length;)a=BB(n0(u),10),o=BB(mMn(a,(hWn(),Klt)),15),e=BB(mMn(a,Dft),15),(o||e)&&(Wzn(a,o,e),o&&gun(i,o),e&&gun(i,e));gun(r.a,i)}HSn(t)}function uDn(n,t){var e,i,r,c,a,u;for(e=new Lp,r=new Wb(n.b);r.a<r.c.c.length;){for(u=!0,i=0,a=new Wb(BB(n0(r),29).a);a.a<a.c.c.length;)switch((c=BB(n0(a),10)).k.g){case 4:++i;case 1:w3(e,c);break;case 0:oCn(c,t);default:e.b==e.c||p_n(e,i,u,!1,t),u=!1,i=0}e.b==e.c||p_n(e,i,u,!0,t)}}function oDn(n,t){var e,i,r,c,a,u;for(r=new Np,e=0;e<=n.i;e++)(i=new HX(t)).p=n.i-e,r.c[r.c.length]=i;for(u=new Wb(n.o);u.a<u.c.c.length;)PZ(a=BB(n0(u),10),BB(xq(r,n.i-n.f[a.p]),29));for(c=new Wb(r);c.a<c.c.c.length;)0==BB(n0(c),29).a.c.length&&AU(c);t.b.c=x8(Ant,HWn,1,0,5,1),gun(t.b,r)}function sDn(n,t){var e,i,r,c,a,u;for(e=0,u=new Wb(t);u.a<u.c.c.length;){for(a=BB(n0(u),11),nhn(n.b,n.d[a.p]),r=new m6(a.b);y$(r.a)||y$(r.b);)(c=ME(n,a==(i=BB(y$(r.a)?n0(r.a):n0(r.b),17)).c?i.d:i.c))>n.d[a.p]&&(e+=n5(n.b,c),d3(n.a,iln(c)));for(;!Wy(n.a);)Mnn(n.b,BB(dU(n.a),19).a)}return e}function hDn(n,t,e){var i,r,c,a;for(c=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i,r=new AL((!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));r.e!=r.i.gc();)0==(!(i=BB(kpn(r),33)).a&&(i.a=new eU(UOt,i,10,11)),i.a).i||(c+=hDn(n,i,!1));if(e)for(a=JJ(t);a;)c+=(!a.a&&(a.a=new eU(UOt,a,10,11)),a.a).i,a=JJ(a);return c}function fDn(n,t){var e,i,r,c;return n.ej()?(i=null,r=n.fj(),n.ij()&&(i=n.kj(n.pi(t),null)),e=n.Zi(4,c=Lyn(n,t),null,t,r),n.bj()&&null!=c?(i=n.dj(c,i))?(i.Ei(e),i.Fi()):n.$i(e):i?(i.Ei(e),i.Fi()):n.$i(e),c):(c=Lyn(n,t),n.bj()&&null!=c&&(i=n.dj(c,null))&&i.Fi(),c)}function lDn(n){var t,i,r,c,a,u,o,s,h,f;for(h=n.a,t=new Rv,s=0,r=new Wb(n.d);r.a<r.c.c.length;){for(f=0,_rn((i=BB(n0(r),222)).b,new $n),u=spn(i.b,0);u.b!=u.d.c;)a=BB(b3(u),222),t.a._b(a)&&(c=i.c,f<(o=a.c).d+o.a+h&&f+c.a+h>o.d&&(f=o.d+o.a+h));i.c.d=f,t.a.zc(i,t),s=e.Math.max(s,i.c.d+i.c.a)}return s}function bDn(){bDn=O,hft=new LP("COMMENTS",0),lft=new LP("EXTERNAL_PORTS",1),bft=new LP("HYPEREDGES",2),wft=new LP("HYPERNODES",3),dft=new LP("NON_FREE_PORTS",4),gft=new LP("NORTH_SOUTH_PORTS",5),vft=new LP(G1n,6),sft=new LP("CENTER_LABELS",7),fft=new LP("END_LABELS",8),pft=new LP("PARTITIONS",9)}function wDn(n){var t,e,i,r,c;for(r=new Np,t=new $q((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a)),i=new oz(ZL(dLn(n).a.Kc(),new h));dAn(i);)cL(Wtn((!(e=BB(U5(i),79)).b&&(e.b=new hK(KOt,e,4,7)),e.b),0),186)||(c=PTn(BB(Wtn((!e.c&&(e.c=new hK(KOt,e,5,8)),e.c),0),82)),t.a._b(c)||(r.c[r.c.length]=c));return r}function dDn(n){var t,e,i,r,c;for(r=new Rv,t=new $q((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a)),i=new oz(ZL(dLn(n).a.Kc(),new h));dAn(i);)cL(Wtn((!(e=BB(U5(i),79)).b&&(e.b=new hK(KOt,e,4,7)),e.b),0),186)||(c=PTn(BB(Wtn((!e.c&&(e.c=new hK(KOt,e,5,8)),e.c),0),82)),t.a._b(c)||r.a.zc(c,r));return r}function gDn(n,t,e,i,r){return i<0?((i=zTn(n,r,Pun(Gk(Qtt,1),sVn,2,6,[YVn,JVn,ZVn,nQn,tQn,eQn,iQn,rQn,cQn,aQn,uQn,oQn]),t))<0&&(i=zTn(n,r,Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),t)),!(i<0||(e.k=i,0))):i>0&&(e.k=i-1,!0)}function pDn(n,t,e,i,r){return i<0?((i=zTn(n,r,Pun(Gk(Qtt,1),sVn,2,6,[YVn,JVn,ZVn,nQn,tQn,eQn,iQn,rQn,cQn,aQn,uQn,oQn]),t))<0&&(i=zTn(n,r,Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),t)),!(i<0||(e.k=i,0))):i>0&&(e.k=i-1,!0)}function vDn(n,t,e,i,r,c){var a,u,o;if(u=32,i<0){if(t[0]>=n.length)return!1;if(43!=(u=fV(n,t[0]))&&45!=u)return!1;if(++t[0],(i=UIn(n,t))<0)return!1;45==u&&(i=-i)}return 32==u&&t[0]-e==2&&2==r.b&&(a=(o=(new AT).q.getFullYear()-sQn+sQn-80)%100,c.a=i==a,i+=100*(o/100|0)+(i<a?100:0)),c.p=i,!0}function mDn(n,t){var i,r,c;JJ(n)&&(c=BB(mMn(t,(HXn(),Fgt)),174),GI(ZAn(n,ept))===GI((QEn(),YCt))&&Ypn(n,ept,QCt),GM(),r=qzn(new Dy(JJ(n)),new JN(JJ(n)?new Dy(JJ(n)):null,n),!1,!0),orn(c,(mdn(),DIt)),(i=BB(mMn(t,Hgt),8)).a=e.Math.max(r.a,i.a),i.b=e.Math.max(r.b,i.b))}function yDn(n,t,e){var i,r,c,a,u,o;for(a=BB(mMn(n,(hWn(),nlt)),15).Kc();a.Ob();){switch(c=BB(a.Pb(),10),BB(mMn(c,(HXn(),kgt)),163).g){case 2:PZ(c,t);break;case 4:PZ(c,e)}for(r=new oz(ZL(hbn(c).a.Kc(),new h));dAn(r);)(i=BB(U5(r),17)).c&&i.d||(u=!i.d,o=BB(mMn(i,mlt),11),u?MZ(i,o):SZ(i,o))}}function kDn(){kDn=O,Bst=new WV(mJn,0,(kUn(),sIt),sIt),Gst=new WV(kJn,1,SIt,SIt),Fst=new WV(yJn,2,oIt,oIt),Xst=new WV(jJn,3,CIt,CIt),qst=new WV("NORTH_WEST_CORNER",4,CIt,sIt),Hst=new WV("NORTH_EAST_CORNER",5,sIt,oIt),Ust=new WV("SOUTH_WEST_CORNER",6,SIt,CIt),zst=new WV("SOUTH_EAST_CORNER",7,oIt,SIt)}function jDn(){jDn=O,MMt=Pun(Gk(LNt,1),FQn,25,14,[1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600,6227020800,87178291200,1307674368e3,{l:3506176,m:794077,h:1},{l:884736,m:916411,h:20},{l:3342336,m:3912489,h:363},{l:589824,m:3034138,h:6914},{l:3407872,m:1962506,h:138294}]),e.Math.pow(2,-65)}function EDn(n,t){var e,i,r,c,a;if(0==n.c.length)return new rI(iln(0),iln(0));for(e=(l1(0,n.c.length),BB(n.c[0],11)).j,a=0,c=t.g,i=t.g+1;a<n.c.length-1&&e.g<c;)e=(l1(++a,n.c.length),BB(n.c[a],11)).j;for(r=a;r<n.c.length-1&&e.g<i;)++r,e=(l1(a,n.c.length),BB(n.c[a],11)).j;return new rI(iln(a),iln(r))}function TDn(n,t,i){var r,c,a,u,o,s,h,f,l,b;for(a=t.c.length,l1(i,t.c.length),o=(u=BB(t.c[i],286)).a.o.a,l=u.c,b=0,h=u.c;h<=u.f;h++){if(o<=n.a[h])return h;for(f=n.a[h],s=null,c=i+1;c<a;c++)l1(c,t.c.length),(r=BB(t.c[c],286)).c<=h&&r.f>=h&&(s=r);s&&(f=e.Math.max(f,s.a.o.a)),f>b&&(l=h,b=f)}return l}function MDn(n,t,e){var i,r,c;if(n.e=e,n.d=0,n.b=0,n.f=1,n.i=t,16==(16&n.e)&&(n.i=pKn(n.i)),n.j=n.i.length,QXn(n),c=Vdn(n),n.d!=n.j)throw Hp(new ak(kWn((u$(),w8n))));if(n.g){for(i=0;i<n.g.a.c.length;i++)if(r=BB(bW(n.g,i),584),n.f<=r.a)throw Hp(new ak(kWn((u$(),d8n))));n.g.a.c=x8(Ant,HWn,1,0,5,1)}return c}function SDn(n,t){var e,i,r;if(null==t){for(!n.a&&(n.a=new eU(WAt,n,9,5)),i=new AL(n.a);i.e!=i.i.gc();)if(null==(null==(r=(e=BB(kpn(i),678)).c)?e.zb:r))return e}else for(!n.a&&(n.a=new eU(WAt,n,9,5)),i=new AL(n.a);i.e!=i.i.gc();)if(mK(t,null==(r=(e=BB(kpn(i),678)).c)?e.zb:r))return e;return null}function PDn(n,t){var e;switch(e=null,t.g){case 1:n.e.Xe((sWn(),ePt))&&(e=BB(n.e.We(ePt),249));break;case 3:n.e.Xe((sWn(),iPt))&&(e=BB(n.e.We(iPt),249));break;case 2:n.e.Xe((sWn(),tPt))&&(e=BB(n.e.We(tPt),249));break;case 4:n.e.Xe((sWn(),rPt))&&(e=BB(n.e.We(rPt),249))}return!e&&(e=BB(n.e.We((sWn(),ZSt)),249)),e}function CDn(n,t,e){var i,r,c,a,u,o;for(t.p=1,r=t.c,o=xwn(t,(ain(),qvt)).Kc();o.Ob();)for(i=new Wb(BB(o.Pb(),11).g);i.a<i.c.c.length;)t!=(u=BB(n0(i),17).d.i)&&u.c.p<=r.p&&((c=r.p+1)==e.b.c.length?((a=new HX(e)).p=c,WB(e.b,a),PZ(u,a)):PZ(u,a=BB(xq(e.b,c),29)),CDn(n,u,e))}function IDn(n,t,i){var r,c,a,u,o,s;for(c=i,a=0,o=new Wb(t);o.a<o.c.c.length;)Ypn(u=BB(n0(o),33),(Uyn(),Ljt),iln(c++)),s=wDn(u),r=e.Math.atan2(u.j+u.f/2,u.i+u.g/2),(r+=r<0?Z3n:0)<.7853981633974483||r>p4n?m$(s,n.b):r<=p4n&&r>v4n?m$(s,n.d):r<=v4n&&r>m4n?m$(s,n.c):r<=m4n&&m$(s,n.a),a=IDn(n,s,a);return c}function ODn(){var n;for(ODn=O,Jtt=new X6(1,1),net=new X6(1,10),eet=new X6(0,0),Ytt=new X6(-1,1),Ztt=Pun(Gk(oet,1),sVn,91,0,[eet,Jtt,new X6(1,2),new X6(1,3),new X6(1,4),new X6(1,5),new X6(1,6),new X6(1,7),new X6(1,8),new X6(1,9),net]),tet=x8(oet,sVn,91,32,0,1),n=0;n<tet.length;n++)tet[n]=npn(yz(1,n))}function ADn(n,t,e,i,r,c){var a,u,o,s;for(u=!jE(AV(n.Oc(),new aw(new Je))).sd((dM(),tit)),a=n,c==(Ffn(),HPt)&&(a=cL(a,152)?o6(BB(a,152)):cL(a,131)?BB(a,131).a:cL(a,54)?new fy(a):new CT(a)),s=a.Kc();s.Ob();)(o=BB(s.Pb(),70)).n.a=t.a,o.n.b=u?t.b+(i.b-o.o.b)/2:r?t.b:t.b+i.b-o.o.b,t.a+=o.o.a+e}function $Dn(n,t,e,i){var r,c,a,u,o;for(r=(i.c+i.a)/2,yQ(t.j),DH(t.j,r),yQ(e.e),DH(e.e,r),o=new zj,a=new Wb(n.f);a.a<a.c.c.length;)Rjn(o,t,u=BB(n0(a),129).a),Rjn(o,e,u);for(c=new Wb(n.k);c.a<c.c.c.length;)Rjn(o,t,u=BB(n0(c),129).b),Rjn(o,e,u);return o.b+=2,o.a+=LQ(t,n.q),o.a+=LQ(n.q,e),o}function LDn(n,t,e){var i,r,c,a,u;if(!h3(t)){for(OTn(u=mcn(e,(cL(t,14)?BB(t,14).gc():F3(t.Kc()))/n.a|0),z3n,1),a=new Aa,c=null,r=t.Kc();r.Ob();)i=BB(r.Pb(),86),a=Wen(Pun(Gk(xnt,1),HWn,20,0,[a,new bg(i)])),c&&(hon(c,(qqn(),bkt),i),hon(i,ckt,c),G8(i)==G8(c)&&(hon(c,wkt,i),hon(i,akt,c))),c=i;HSn(u),LDn(n,a,e)}}function NDn(n){var t,e,i,r,c,a,u;for(e=n.i,t=n.n,u=e.d,n.f==(G7(),rrt)?u+=(e.a-n.e.b)/2:n.f==irt&&(u+=e.a-n.e.b),r=new Wb(n.d);r.a<r.c.c.length;){switch(a=(i=BB(n0(r),181)).rf(),(c=new Gj).b=u,u+=a.b+n.a,n.b.g){case 0:c.a=e.c+t.b;break;case 1:c.a=e.c+t.b+(e.b-a.a)/2;break;case 2:c.a=e.c+e.b-t.c-a.a}i.tf(c)}}function xDn(n){var t,e,i,r,c,a,u;for(e=n.i,t=n.n,u=e.c,n.b==(J9(),Qit)?u+=(e.b-n.e.a)/2:n.b==Jit&&(u+=e.b-n.e.a),r=new Wb(n.d);r.a<r.c.c.length;){switch(a=(i=BB(n0(r),181)).rf(),(c=new Gj).a=u,u+=a.a+n.a,n.f.g){case 0:c.b=e.d+t.d;break;case 1:c.b=e.d+t.d+(e.a-a.b)/2;break;case 2:c.b=e.d+e.a-t.a-a.b}i.tf(c)}}function DDn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;s=e.a.c,a=e.a.c+e.a.b,l=(c=BB(RX(e.c,t),459)).f,b=c.a,u=new xC(s,l),h=new xC(a,b),r=s,e.p||(r+=n.c),o=new xC(r+=e.F+e.v*n.b,l),f=new xC(r,b),nin(t.a,Pun(Gk(PMt,1),sVn,8,0,[u,o])),e.d.a.gc()>1&&(i=new xC(r,e.b),DH(t.a,i)),nin(t.a,Pun(Gk(PMt,1),sVn,8,0,[f,h]))}function RDn(n){NM(n,new MTn(vj(wj(pj(gj(new du,_5n),"ELK Randomizer"),'Distributes the nodes randomly on the plane, leading to very obfuscating layouts. Can be useful to demonstrate the power of "real" layout algorithms.'),new Qu))),u2(n,_5n,QJn,LIt),u2(n,_5n,vZn,15),u2(n,_5n,yZn,iln(0)),u2(n,_5n,VJn,dZn)}function KDn(){var n,t,e,i,r,c;for(KDn=O,QLt=x8(NNt,v6n,25,255,15,1),YLt=x8(ONt,WVn,25,16,15,1),t=0;t<255;t++)QLt[t]=-1;for(e=57;e>=48;e--)QLt[e]=e-48<<24>>24;for(i=70;i>=65;i--)QLt[i]=i-65+10<<24>>24;for(r=102;r>=97;r--)QLt[r]=r-97+10<<24>>24;for(c=0;c<10;c++)YLt[c]=48+c&QVn;for(n=10;n<=15;n++)YLt[n]=65+n-10&QVn}function _Dn(n,t,e){var i,r,c,a,u,o,s,h;return u=t.i-n.g/2,o=e.i-n.g/2,s=t.j-n.g/2,h=e.j-n.g/2,c=t.g+n.g/2,a=e.g+n.g/2,i=t.f+n.g/2,r=e.f+n.g/2,u<o+a&&o<u&&s<h+r&&h<s||o<u+c&&u<o&&h<s+i&&s<h||u<o+a&&o<u&&s<h&&h<s+i||o<u+c&&u<o&&s<h+r&&h<s}function FDn(n){var t,i,r,c,a;c=BB(mMn(n,(HXn(),Fgt)),21),a=BB(mMn(n,qgt),21),t=new wA(i=new xC(n.f.a+n.d.b+n.d.c,n.f.b+n.d.d+n.d.a)),c.Hc((mdn(),DIt))&&(r=BB(mMn(n,Hgt),8),a.Hc((n_n(),GIt))&&(r.a<=0&&(r.a=20),r.b<=0&&(r.b=20)),t.a=e.Math.max(i.a,r.a),t.b=e.Math.max(i.b,r.b)),qy(TD(mMn(n,Bgt)))||UBn(n,i,t)}function BDn(n,t){var e,i,r,c;for(c=abn(t,(kUn(),SIt)).Kc();c.Ob();)i=BB(c.Pb(),11),(e=BB(mMn(i,(hWn(),Elt)),10))&&UNn(aM(cM(uM(rM(new Hv,0),.1),n.i[t.p].d),n.i[e.p].a));for(r=abn(t,sIt).Kc();r.Ob();)i=BB(r.Pb(),11),(e=BB(mMn(i,(hWn(),Elt)),10))&&UNn(aM(cM(uM(rM(new Hv,0),.1),n.i[e.p].d),n.i[t.p].a))}function HDn(n){var t,e,i,r,c;if(!n.c){if(c=new Eo,null==(t=P$t).a.zc(n,t)){for(i=new AL(a4(n));i.e!=i.i.gc();)cL(r=lFn(e=BB(kpn(i),87)),88)&&pX(c,HDn(BB(r,26))),f9(c,e);t.a.Bc(n),t.a.gc()}$wn(c),chn(c),n.c=new NO((BB(Wtn(QQ((QX(),t$t).o),15),18),c.i),c.g),P5(n).b&=-33}return n.c}function qDn(n){var t;if(10!=n.c)throw Hp(new ak(kWn((u$(),g8n))));switch(t=n.a){case 110:t=10;break;case 114:t=13;break;case 116:t=9;break;case 92:case 124:case 46:case 94:case 45:case 63:case 42:case 43:case 123:case 125:case 40:case 41:case 91:case 93:break;default:throw Hp(new ak(kWn((u$(),U8n))))}return t}function GDn(n){var t,e,i,r;if(0==n.l&&0==n.m&&0==n.h)return"0";if(n.h==CQn&&0==n.m&&0==n.l)return"-9223372036854775808";if(n.h>>19!=0)return"-"+GDn(aon(n));for(e=n,i="";0!=e.l||0!=e.m||0!=e.h;){if(e=Aqn(e,F5(AQn),!0),t=""+TE(ltt),0!=e.l||0!=e.m||0!=e.h)for(r=9-t.length;r>0;r--)t="0"+t;i=t+i}return i}function zDn(){if(!Object.create||!Object.getOwnPropertyNames)return!1;var n="__proto__",t=Object.create(null);return void 0===t[n]&&0==Object.getOwnPropertyNames(t).length&&(t[n]=42,42===t[n]&&0!=Object.getOwnPropertyNames(t).length)}function UDn(n){var t,e,i,r,c,a,u;for(t=!1,e=0,r=new Wb(n.d.b);r.a<r.c.c.length;)for((i=BB(n0(r),29)).p=e++,a=new Wb(i.a);a.a<a.c.c.length;)c=BB(n0(a),10),!t&&!h3(hbn(c))&&(t=!0);u=EG((Ffn(),BPt),Pun(Gk(WPt,1),$Vn,103,0,[_Pt,FPt])),t||(orn(u,HPt),orn(u,KPt)),n.a=new ltn(u),$U(n.f),$U(n.b),$U(n.e),$U(n.g)}function XDn(n,t,e){var i,r,c,a,u,o,s,h,f;for(i=e.c,r=e.d,u=g1(t.c),o=g1(t.d),i==t.c?(u=lLn(n,u,r),o=sMn(t.d)):(u=sMn(t.c),o=lLn(n,o,r)),r5(s=new Kj(t.a),u,s.a,s.a.a),r5(s,o,s.c.b,s.c),a=t.c==i,f=new Jv,c=0;c<s.b-1;++c)h=new rI(BB(Dpn(s,c),8),BB(Dpn(s,c+1),8)),a&&0==c||!a&&c==s.b-2?f.b=h:WB(f.a,h);return f}function WDn(n,t){var e,i,r,c;if(0!=(c=n.j.g-t.j.g))return c;if(e=BB(mMn(n,(HXn(),ipt)),19),i=BB(mMn(t,ipt),19),e&&i&&0!=(r=e.a-i.a))return r;switch(n.j.g){case 1:return Pln(n.n.a,t.n.a);case 2:return Pln(n.n.b,t.n.b);case 3:return Pln(t.n.a,n.n.a);case 4:return Pln(t.n.b,n.n.b);default:throw Hp(new Fy(r1n))}}function VDn(n,t,i,r){var c,a,u,o;if(F3((q_(),new oz(ZL(hbn(t).a.Kc(),new h))))>=n.a)return-1;if(!eTn(t,i))return-1;if(h3(BB(r.Kb(t),20)))return 1;for(c=0,u=BB(r.Kb(t),20).Kc();u.Ob();){if(-1==(o=VDn(n,(a=BB(u.Pb(),17)).c.i==t?a.d.i:a.c.i,i,r)))return-1;if((c=e.Math.max(c,o))>n.c-1)return-1}return c+1}function QDn(n,t){var e,i,r,c,a,u;if(GI(t)===GI(n))return!0;if(!cL(t,15))return!1;if(i=BB(t,15),u=n.gc(),i.gc()!=u)return!1;if(a=i.Kc(),n.ni()){for(e=0;e<u;++e)if(r=n.ki(e),c=a.Pb(),null==r?null!=c:!Nfn(r,c))return!1}else for(e=0;e<u;++e)if(r=n.ki(e),c=a.Pb(),GI(r)!==GI(c))return!1;return!0}function YDn(n,t){var e,i,r,c,a,u;if(n.f>0)if(n.qj(),null!=t){for(c=0;c<n.d.length;++c)if(e=n.d[c])for(i=BB(e.g,367),u=e.i,a=0;a<u;++a)if(Nfn(t,(r=i[a]).dd()))return!0}else for(c=0;c<n.d.length;++c)if(e=n.d[c])for(i=BB(e.g,367),u=e.i,a=0;a<u;++a)if(r=i[a],GI(t)===GI(r.dd()))return!0;return!1}function JDn(n,t,e){var i,r,c,a;OTn(e,"Orthogonally routing hierarchical port edges",1),n.a=0,NGn(t,i=UHn(t)),Qqn(n,t,i),fUn(t),r=BB(mMn(t,(HXn(),ept)),98),Czn((l1(0,(c=t.b).c.length),BB(c.c[0],29)),r,t),Czn(BB(xq(c,c.c.length-1),29),r,t),TBn((l1(0,(a=t.b).c.length),BB(a.c[0],29))),TBn(BB(xq(a,a.c.length-1),29)),HSn(e)}function ZDn(n){switch(n){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return n-48<<24>>24;case 97:case 98:case 99:case 100:case 101:case 102:return n-97+10<<24>>24;case 65:case 66:case 67:case 68:case 69:case 70:return n-65+10<<24>>24;default:throw Hp(new Mk("Invalid hexadecimal"))}}function nRn(n,t,e){var i,r,c,a;for(OTn(e,"Processor order nodes",2),n.a=Gy(MD(mMn(t,(CAn(),xkt)))),r=new YT,a=spn(t.b,0);a.b!=a.d.c;)qy(TD(mMn(c=BB(b3(a),86),(qqn(),dkt))))&&r5(r,c,r.c.b,r.c);Px(0!=r.b),KHn(n,i=BB(r.a.a.c,86)),!e.b&&qin(e,1),BRn(n,i,0-Gy(MD(mMn(i,(qqn(),ukt))))/2,0),!e.b&&qin(e,1),HSn(e)}function tRn(){tRn=O,Rit=new HS("SPIRAL",0),$it=new HS("LINE_BY_LINE",1),Lit=new HS("MANHATTAN",2),Ait=new HS("JITTER",3),xit=new HS("QUADRANTS_LINE_BY_LINE",4),Dit=new HS("QUADRANTS_MANHATTAN",5),Nit=new HS("QUADRANTS_JITTER",6),Oit=new HS("COMBINE_LINE_BY_LINE_MANHATTAN",7),Iit=new HS("COMBINE_JITTER_MANHATTAN",8)}function eRn(n,t,e,i){var r,c,a,u,o,s;for(o=Njn(n,e),s=Njn(t,e),r=!1;o&&s&&(i||myn(o,s,e));)a=Njn(o,e),u=Njn(s,e),A7(t),A7(n),c=o.c,rGn(o,!1),rGn(s,!1),e?(Qyn(t,s.p,c),t.p=s.p,Qyn(n,o.p+1,c),n.p=o.p):(Qyn(n,o.p,c),n.p=o.p,Qyn(t,s.p+1,c),t.p=s.p),PZ(o,null),PZ(s,null),o=a,s=u,r=!0;return r}function iRn(n,t,e,i){var r,c,a,u,o;for(r=!1,c=!1,u=new Wb(i.j);u.a<u.c.c.length;)GI(mMn(a=BB(n0(u),11),(hWn(),dlt)))===GI(e)&&(0==a.g.c.length?0==a.e.c.length||(r=!0):c=!0);return o=0,r&&r^c?o=e.j==(kUn(),sIt)?-n.e[i.c.p][i.p]:t-n.e[i.c.p][i.p]:c&&r^c?o=n.e[i.c.p][i.p]+1:r&&c&&(o=e.j==(kUn(),sIt)?0:t/2),o}function rRn(n,t,e,i,r,c,a,u){var o,s,h;for(o=0,null!=t&&(o^=vvn(t.toLowerCase())),null!=e&&(o^=vvn(e)),null!=i&&(o^=vvn(i)),null!=a&&(o^=vvn(a)),null!=u&&(o^=vvn(u)),s=0,h=c.length;s<h;s++)o^=vvn(c[s]);n?o|=256:o&=-257,r?o|=16:o&=-17,this.f=o,this.i=null==t?null:(kW(t),t),this.a=e,this.d=i,this.j=c,this.g=a,this.e=u}function cRn(n,t,e){var i,r;switch(r=null,t.g){case 1:gcn(),r=Nut;break;case 2:gcn(),r=Dut}switch(i=null,e.g){case 1:gcn(),i=xut;break;case 2:gcn(),i=Lut;break;case 3:gcn(),i=Rut;break;case 4:gcn(),i=Kut}return r&&i?KB(n.j,new Hf(new Jy(Pun(Gk(Lnt,1),HWn,169,0,[BB(yX(r),169),BB(yX(i),169)])))):(SQ(),SQ(),set)}function aRn(n){var t,e,i;switch(t=BB(mMn(n,(HXn(),Hgt)),8),hon(n,Hgt,new xC(t.b,t.a)),BB(mMn(n,kdt),248).g){case 1:hon(n,kdt,(wvn(),LMt));break;case 2:hon(n,kdt,(wvn(),IMt));break;case 3:hon(n,kdt,(wvn(),AMt));break;case 4:hon(n,kdt,(wvn(),$Mt))}(n.q?n.q:(SQ(),SQ(),het))._b(spt)&&(i=(e=BB(mMn(n,spt),8)).a,e.a=e.b,e.b=i)}function uRn(n,t,e,i,r,c){if(this.b=e,this.d=r,n>=t.length)throw Hp(new Ay("Greedy SwitchDecider: Free layer not in graph."));this.c=t[n],this.e=new QK(i),yrn(this.e,this.c,(kUn(),CIt)),this.i=new QK(i),yrn(this.i,this.c,oIt),this.f=new lG(this.c),this.a=!c&&r.i&&!r.s&&this.c[0].k==(uSn(),Mut),this.a&&gPn(this,n,t.length)}function oRn(n,t){var e,i,r,c,a,u;c=!n.B.Hc((n_n(),HIt)),a=n.B.Hc(zIt),n.a=new Hwn(a,c,n.c),n.n&&kQ(n.a.n,n.n),jy(n.g,(Dtn(),zit),n.a),t||((i=new Ign(1,c,n.c)).n.a=n.k,mG(n.p,(kUn(),sIt),i),(r=new Ign(1,c,n.c)).n.d=n.k,mG(n.p,SIt,r),(u=new Ign(0,c,n.c)).n.c=n.k,mG(n.p,CIt,u),(e=new Ign(0,c,n.c)).n.b=n.k,mG(n.p,oIt,e))}function sRn(n){var t,e,i;switch((t=BB(mMn(n.d,(HXn(),Zdt)),218)).g){case 2:e=MXn(n);break;case 3:i=new Np,JT(AV($V(wnn(wnn(new Rq(null,new w1(n.d.b,16)),new Or),new Ar),new $r),new pr),new Cd(i)),e=i;break;default:throw Hp(new Fy("Compaction not supported for "+t+" edges."))}gqn(n,e),e5(new Cb(n.g),new Sd(n))}function hRn(n,t){var e;return e=new Zn,t&&qan(e,BB(RX(n.a,DOt),94)),cL(t,470)&&qan(e,BB(RX(n.a,ROt),94)),cL(t,354)?(qan(e,BB(RX(n.a,zOt),94)),e):(cL(t,82)&&qan(e,BB(RX(n.a,KOt),94)),cL(t,239)?(qan(e,BB(RX(n.a,UOt),94)),e):cL(t,186)?(qan(e,BB(RX(n.a,XOt),94)),e):(cL(t,352)&&qan(e,BB(RX(n.a,_Ot),94)),e))}function fRn(){fRn=O,Zct=new XA((sWn(),pPt),iln(1)),cat=new XA(LPt,80),rat=new XA(SPt,5),Fct=new XA(cSt,dZn),nat=new XA(vPt,iln(1)),iat=new XA(kPt,(hN(),!0)),Qct=new WA(50),Vct=new XA(XSt,Qct),Hct=CSt,Yct=uPt,Bct=new XA(dSt,!1),Wct=USt,Xct=qSt,Uct=KSt,zct=DSt,Jct=fPt,jSn(),Gct=Ict,aat=Nct,qct=Cct,tat=Act,eat=Lct}function lRn(n){var t,e,i,r,c,a,u;for(u=new v5,a=new Wb(n.a);a.a<a.c.c.length;)if((c=BB(n0(a),10)).k!=(uSn(),Mut))for(_An(u,c,new Gj),r=new oz(ZL(lbn(c).a.Kc(),new h));dAn(r);)if((i=BB(U5(r),17)).c.i.k!=Mut&&i.d.i.k!=Mut)for(e=spn(i.a,0);e.b!=e.d.c;)Yjn(u,new dP((t=BB(b3(e),8)).a,t.b));return u}function bRn(){bRn=O,RTt=new up(K4n),OM(),xTt=new $O(q4n,DTt=GTt),Lun(),LTt=new $O(_4n,NTt=WTt),$Sn(),ATt=new $O(F4n,$Tt=rTt),PTt=new $O(B4n,null),$6(),ITt=new $O(H4n,OTt=ZEt),CM(),jTt=new $O(G4n,ETt=XEt),TTt=new $O(z4n,(hN(),!1)),MTt=new $O(U4n,iln(64)),STt=new $O(X4n,!0),CTt=nTt}function wRn(n){var t,e,i,r,c;if(null==n.a)if(n.a=x8($Nt,ZYn,25,n.c.b.c.length,16,1),n.a[0]=!1,Lx(n.c,(HXn(),Upt)))for(e=BB(mMn(n.c,Upt),15).Kc();e.Ob();)(t=BB(e.Pb(),19).a)>0&&t<n.a.length&&(n.a[t]=!1);else for((c=new Wb(n.c.b)).a<c.c.c.length&&n0(c),i=1;c.a<c.c.c.length;)r=BB(n0(c),29),n.a[i++]=U$n(r)}function dRn(n,t){var e,i;switch(i=n.b,t){case 1:n.b|=1,n.b|=4,n.b|=8;break;case 2:n.b|=2,n.b|=4,n.b|=8;break;case 4:n.b|=1,n.b|=2,n.b|=4,n.b|=8;break;case 3:n.b|=16,n.b|=8;break;case 0:n.b|=32,n.b|=16,n.b|=8,n.b|=1,n.b|=2,n.b|=4}if(n.b!=i&&n.c)for(e=new AL(n.c);e.e!=e.i.gc();)ACn(P5(BB(kpn(e),473)),t)}function gRn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b;for(r=!1,u=0,o=(a=t).length;u<o;++u)c=a[u],qy((hN(),!!c.e))&&!BB(xq(n.b,c.e.p),214).s&&(r|=(s=c.e,(f=(h=BB(xq(n.b,s.p),214)).e)[l=fj(e,f.length)][0].k==(uSn(),Mut)?f[l]=$Nn(c,f[l],e?(kUn(),CIt):(kUn(),oIt)):h.c.Tf(f,e),b=DNn(n,h,e,i),xxn(h.e,h.o,e),b));return r}function pRn(n,t){var e,i,r,c,a;for(c=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i,r=new AL((!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));r.e!=r.i.gc();)GI(ZAn(i=BB(kpn(r),33),(sWn(),ESt)))!==GI((ufn(),mCt))&&((a=BB(ZAn(t,mPt),149))==(e=BB(ZAn(i,mPt),149))||a&&j5(a,e))&&0!=(!i.a&&(i.a=new eU(UOt,i,10,11)),i.a).i&&(c+=pRn(n,i));return c}function vRn(n){var t,e,i,r,c,a,u;for(i=0,u=0,a=new Wb(n.d);a.a<a.c.c.length;)c=BB(n0(a),101),r=BB(P4(AV(new Rq(null,new w1(c.j,16)),new Xr),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),e=null,i<=u?(kUn(),e=sIt,i+=r.gc()):u<i&&(kUn(),e=SIt,u+=r.gc()),t=e,JT($V(r.Oc(),new Hr),new Ad(t))}function mRn(n){var t,e,i,r,c,a,u,o;for(n.b=new vOn(new Jy((kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt]))),new Jy((Crn(),Pun(Gk(Wst,1),$Vn,361,0,[Rst,Dst,xst])))),u=0,o=(a=Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length;u<o;++u)for(c=a[u],i=0,r=(e=Pun(Gk(Wst,1),$Vn,361,0,[Rst,Dst,xst])).length;i<r;++i)t=e[i],Wjn(n.b,c,t,new Np)}function yRn(n,t){var e,i,r,c,a,u,o,s,h,f;if(a=BB(BB(h6(n.r,t),21),84),u=n.u.Hc((lIn(),rIt)),e=n.u.Hc(tIt),i=n.u.Hc(nIt),s=n.u.Hc(cIt),f=n.B.Hc((n_n(),QIt)),h=!e&&!i&&(s||2==a.gc()),hxn(n,t),r=null,o=null,u){for(o=r=BB((c=a.Kc()).Pb(),111);c.Ob();)o=BB(c.Pb(),111);r.d.b=0,o.d.c=0,h&&!r.a&&(r.d.c=0)}f&&(DTn(a),u&&(r.d.b=0,o.d.c=0))}function kRn(n,t){var e,i,r,c,a,u,o,s,h,f;if(a=BB(BB(h6(n.r,t),21),84),u=n.u.Hc((lIn(),rIt)),e=n.u.Hc(tIt),i=n.u.Hc(nIt),o=n.u.Hc(cIt),f=n.B.Hc((n_n(),QIt)),s=!e&&!i&&(o||2==a.gc()),V_n(n,t),h=null,r=null,u){for(r=h=BB((c=a.Kc()).Pb(),111);c.Ob();)r=BB(c.Pb(),111);h.d.d=0,r.d.a=0,s&&!h.a&&(h.d.a=0)}f&&(RTn(a),u&&(h.d.d=0,r.d.a=0))}function jRn(n,t,e){var i,r,c,a,u;if(i=t.k,t.p>=0)return!1;if(t.p=e.b,WB(e.e,t),i==(uSn(),Put)||i==Iut)for(r=new Wb(t.j);r.a<r.c.c.length;)for(u=new zw(new Wb(new Gw(BB(n0(r),11)).a.g));y$(u.a);)if(a=(c=BB(n0(u.a),17).d.i).k,t.c!=c.c&&(a==Put||a==Iut)&&jRn(n,c,e))return!0;return!0}function ERn(n){var t;return 0!=(64&n.Db)?KOn(n):((t=new fN(KOn(n))).a+=" (changeable: ",yE(t,0!=(n.Bb&k6n)),t.a+=", volatile: ",yE(t,0!=(n.Bb&M9n)),t.a+=", transient: ",yE(t,0!=(n.Bb&_Qn)),t.a+=", defaultValueLiteral: ",cO(t,n.j),t.a+=", unsettable: ",yE(t,0!=(n.Bb&T9n)),t.a+=", derived: ",yE(t,0!=(n.Bb&hVn)),t.a+=")",t.a)}function TRn(n){var t,e,i,r,c,a,u,o,s,h;for(e=NLn(n.d),c=(r=BB(mMn(n.b,(Epn(),vct)),116)).b+r.c,a=r.d+r.a,o=e.d.a*n.e+c,u=e.b.a*n.f+a,Ll(n.b,new xC(o,u)),h=new Wb(n.g);h.a<h.c.c.length;)t=UR(Fx(new xC((s=BB(n0(h),562)).g-e.a.a,s.i-e.c.a),s.a,s.b),kL(Bx(B$(VA(s.e)),s.d*s.a,s.c*s.b),-.5)),i=QA(s.e),ij(s.e,XR(t,i))}function MRn(n,t,e,i){var r,c,a,u,o;for(o=x8(xNt,sVn,104,(kUn(),Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length,0,2),a=0,u=(c=Pun(Gk(FIt,1),YZn,61,0,[PIt,sIt,oIt,SIt,CIt])).length;a<u;++a)o[(r=c[a]).g]=x8(xNt,qQn,25,n.c[r.g],15,1);return Bkn(o,n,sIt),Bkn(o,n,SIt),xmn(o,n,sIt,t,e,i),xmn(o,n,oIt,t,e,i),xmn(o,n,SIt,t,e,i),xmn(o,n,CIt,t,e,i),o}function SRn(n,t,e){if(hU(n.a,t)){if(FT(BB(RX(n.a,t),53),e))return 1}else VW(n.a,t,new Rv);if(hU(n.a,e)){if(FT(BB(RX(n.a,e),53),t))return-1}else VW(n.a,e,new Rv);if(hU(n.b,t)){if(FT(BB(RX(n.b,t),53),e))return-1}else VW(n.b,t,new Rv);if(hU(n.b,e)){if(FT(BB(RX(n.b,e),53),t))return 1}else VW(n.b,e,new Rv);return 0}function PRn(n,t,e,i){var r,c,a,u,o,s;if(null==e)for(r=BB(n.g,119),u=0;u<n.i;++u)if((a=r[u]).ak()==t)return _pn(n,a,i);return ZM(),c=BB(t,66).Oj()?BB(e,72):Z3(t,e),mA(n.e)?(s=!adn(n,t),i=Ywn(n,c,i),o=t.$j()?LY(n,3,t,null,e,pBn(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn)),s):LY(n,1,t,t.zj(),e,-1,s),i?i.Ei(o):i=o):i=Ywn(n,c,i),i}function CRn(n){var t,i,r,c,a,u;n.q!=(QEn(),WCt)&&n.q!=XCt&&(c=n.f.n.d+XH(BB(oV(n.b,(kUn(),sIt)),124))+n.c,t=n.f.n.a+XH(BB(oV(n.b,SIt),124))+n.c,r=BB(oV(n.b,oIt),124),u=BB(oV(n.b,CIt),124),a=e.Math.max(0,r.n.d-c),a=e.Math.max(a,u.n.d-c),i=e.Math.max(0,r.n.a-t),i=e.Math.max(i,u.n.a-t),r.n.d=a,u.n.d=a,r.n.a=i,u.n.a=i)}function IRn(n,t){var e,i,r,c,a,u,o;for(OTn(t,"Restoring reversed edges",1),a=new Wb(n.b);a.a<a.c.c.length;)for(u=new Wb(BB(n0(a),29).a);u.a<u.c.c.length;)for(o=new Wb(BB(n0(u),10).j);o.a<o.c.c.length;)for(r=0,c=(i=Z0(BB(n0(o),11).g)).length;r<c;++r)qy(TD(mMn(e=i[r],(hWn(),Clt))))&&tBn(e,!1);HSn(t)}function ORn(){this.b=new v4,this.d=new v4,this.e=new v4,this.c=new v4,this.a=new xp,this.f=new xp,xJ(PMt,new mu,new yu),xJ(NMt,new Au,new $u),xJ(Eut,new Lu,new Nu),xJ(_ut,new Du,new Ru),xJ(hOt,new Ku,new _u),xJ(met,new ku,new ju),xJ(Iet,new Eu,new Tu),xJ(jet,new Mu,new Su),xJ(Eet,new Pu,new Cu),xJ(Bet,new Iu,new Ou)}function ARn(n){var t,e,i,r,c,a;return c=0,(t=Ikn(n)).Bj()&&(c|=4),0!=(n.Bb&T9n)&&(c|=2),cL(n,99)?(r=Cvn(e=BB(n,18)),0!=(e.Bb&h6n)&&(c|=32),r&&(bX(dZ(r)),c|=8,((a=r.t)>1||-1==a)&&(c|=16),0!=(r.Bb&h6n)&&(c|=64)),0!=(e.Bb&BQn)&&(c|=M9n),c|=k6n):cL(t,457)?c|=512:(i=t.Bj())&&0!=(1&i.i)&&(c|=256),0!=(512&n.Bb)&&(c|=128),c}function $Rn(n,t){var e,i,r,c,a;for(n=null==n?zWn:(kW(n),n),r=0;r<t.length;r++)t[r]=iLn(t[r]);for(e=new Ik,a=0,i=0;i<t.length&&-1!=(c=n.indexOf("%s",a));)e.a+=""+fx(null==n?zWn:(kW(n),n),a,c),uO(e,t[i++]),a=c+2;if(G0(e,n,a,n.length),i<t.length){for(e.a+=" [",uO(e,t[i++]);i<t.length;)e.a+=FWn,uO(e,t[i++]);e.a+="]"}return e.a}function LRn(n){var t,e,i,r,c;for(c=new J6(n.a.c.length),r=new Wb(n.a);r.a<r.c.c.length;){switch(i=BB(n0(r),10),t=null,(e=BB(mMn(i,(HXn(),kgt)),163)).g){case 1:case 2:Jun(),t=$ht;break;case 3:case 4:Jun(),t=Oht}t?(hon(i,(hWn(),Gft),(Jun(),$ht)),t==Oht?RNn(i,e,(ain(),Hvt)):t==$ht&&RNn(i,e,(ain(),qvt))):c.c[c.c.length]=i}return c}function NRn(n,t){var e,i,r,c,a,u,o;for(e=0,o=new Wb(t);o.a<o.c.c.length;){for(u=BB(n0(o),11),nhn(n.b,n.d[u.p]),a=0,r=new m6(u.b);y$(r.a)||y$(r.b);)CW(i=BB(y$(r.a)?n0(r.a):n0(r.b),17))?(c=ME(n,u==i.c?i.d:i.c))>n.d[u.p]&&(e+=n5(n.b,c),d3(n.a,iln(c))):++a;for(e+=n.b.d*a;!Wy(n.a);)Mnn(n.b,BB(dU(n.a),19).a)}return e}function xRn(n,t){var e;return n.f==uLt?(e=DW(B7((IPn(),Z$t),t)),n.e?4==e&&t!=(TOn(),lLt)&&t!=(TOn(),sLt)&&t!=(TOn(),hLt)&&t!=(TOn(),fLt):2==e):!(!n.d||!(n.d.Hc(t)||n.d.Hc(Z1(B7((IPn(),Z$t),t)))||n.d.Hc(Fqn((IPn(),Z$t),n.b,t))))||!(!n.f||!aNn((IPn(),n.f),jV(B7(Z$t,t))))&&(e=DW(B7(Z$t,t)),n.e?4==e:2==e)}function DRn(n,t,i,r){var c,a,u,o,s,h,f,l;return s=(u=BB(ZAn(i,(sWn(),gPt)),8)).a,f=u.b+n,(c=e.Math.atan2(f,s))<0&&(c+=Z3n),(c+=t)>Z3n&&(c-=Z3n),h=(o=BB(ZAn(r,gPt),8)).a,l=o.b+n,(a=e.Math.atan2(l,h))<0&&(a+=Z3n),(a+=t)>Z3n&&(a-=Z3n),h$(),rin(1e-10),e.Math.abs(c-a)<=1e-10||c==a||isNaN(c)&&isNaN(a)?0:c<a?-1:c>a?1:zO(isNaN(c),isNaN(a))}function RRn(n){var t,e,i,r,c,a,u;for(u=new xp,i=new Wb(n.a.b);i.a<i.c.c.length;)VW(u,t=BB(n0(i),57),new Np);for(r=new Wb(n.a.b);r.a<r.c.c.length;)for((t=BB(n0(r),57)).i=KQn,a=t.c.Kc();a.Ob();)c=BB(a.Pb(),57),BB(qI(AY(u.f,c)),15).Fc(t);for(e=new Wb(n.a.b);e.a<e.c.c.length;)(t=BB(n0(e),57)).c.$b(),t.c=BB(qI(AY(u.f,t)),15);_xn(n)}function KRn(n){var t,e,i,r,c,a,u;for(u=new xp,i=new Wb(n.a.b);i.a<i.c.c.length;)VW(u,t=BB(n0(i),81),new Np);for(r=new Wb(n.a.b);r.a<r.c.c.length;)for((t=BB(n0(r),81)).o=KQn,a=t.f.Kc();a.Ob();)c=BB(a.Pb(),81),BB(qI(AY(u.f,c)),15).Fc(t);for(e=new Wb(n.a.b);e.a<e.c.c.length;)(t=BB(n0(e),81)).f.$b(),t.f=BB(qI(AY(u.f,t)),15);BNn(n)}function _Rn(n,t,e,i){var r,c;for(Gkn(n,t,e,i),xl(t,n.j-t.j+e),Dl(t,n.k-t.k+i),c=new Wb(t.f);c.a<c.c.c.length;)switch((r=BB(n0(c),324)).a.g){case 0:won(n,t.g+r.b.a,0,t.g+r.c.a,t.i-1);break;case 1:won(n,t.g+t.o,t.i+r.b.a,n.o-1,t.i+r.c.a);break;case 2:won(n,t.g+r.b.a,t.i+t.p,t.g+r.c.a,n.p-1);break;default:won(n,0,t.i+r.b.a,t.g-1,t.i+r.c.a)}}function FRn(n,t,e,i,r){var c,a;try{if(t>=n.o)throw Hp(new Sv);a=t>>5,c=yz(1,dG(yz(31&t,1))),n.n[e][a]=r?i0(n.n[e][a],c):e0(n.n[e][a],uH(c)),c=yz(c,1),n.n[e][a]=i?i0(n.n[e][a],c):e0(n.n[e][a],uH(c))}catch(u){throw cL(u=lun(u),320)?Hp(new Ay(MJn+n.o+"*"+n.p+SJn+t+FWn+e+PJn)):Hp(u)}}function BRn(n,t,i,r){var c,a;t&&(c=Gy(MD(mMn(t,(qqn(),fkt))))+r,a=i+Gy(MD(mMn(t,ukt)))/2,hon(t,gkt,iln(dG(fan(e.Math.round(c))))),hon(t,pkt,iln(dG(fan(e.Math.round(a))))),0==t.d.b||BRn(n,BB(iL(new wg(spn(new bg(t).a.d,0))),86),i+Gy(MD(mMn(t,ukt)))+n.a,r+Gy(MD(mMn(t,okt)))),null!=mMn(t,wkt)&&BRn(n,BB(mMn(t,wkt),86),i,r))}function HRn(n,t){var i,r,c,a,u,o,s,h,f,l,b;for(c=2*Gy(MD(mMn(s=vW(t.a),(HXn(),Tpt)))),f=Gy(MD(mMn(s,Apt))),h=e.Math.max(c,f),a=x8(xNt,qQn,25,t.f-t.c+1,15,1),r=-h,i=0,o=t.b.Kc();o.Ob();)u=BB(o.Pb(),10),r+=n.a[u.c.p]+h,a[i++]=r;for(r+=n.a[t.a.c.p]+h,a[i++]=r,b=new Wb(t.e);b.a<b.c.c.length;)l=BB(n0(b),10),r+=n.a[l.c.p]+h,a[i++]=r;return a}function qRn(n,t,e,i){var r,c,a,u,o,s,h,f;for(f=new dE(new Yd(n)),u=0,o=(a=Pun(Gk(Out,1),a1n,10,0,[t,e])).length;u<o;++u)for(h=Lfn(a[u],i).Kc();h.Ob();)for(c=new m6((s=BB(h.Pb(),11)).b);y$(c.a)||y$(c.b);)b5(r=BB(y$(c.a)?n0(c.a):n0(c.b),17))||(Mon(f.a,s,(hN(),ptt)),CW(r)&&ZU(f,s==r.c?r.d:r.c));return yX(f),new t_(f)}function GRn(n,t){var e,i,r,c;if(0!=(c=BB(ZAn(n,(sWn(),wPt)),61).g-BB(ZAn(t,wPt),61).g))return c;if(e=BB(ZAn(n,sPt),19),i=BB(ZAn(t,sPt),19),e&&i&&0!=(r=e.a-i.a))return r;switch(BB(ZAn(n,wPt),61).g){case 1:return Pln(n.i,t.i);case 2:return Pln(n.j,t.j);case 3:return Pln(t.i,n.i);case 4:return Pln(t.j,n.j);default:throw Hp(new Fy(r1n))}}function zRn(n){var t,e,i;return 0!=(64&n.Db)?mSn(n):(t=new lN(n6n),(e=n.k)?oO(oO((t.a+=' "',t),e),'"'):(!n.n&&(n.n=new eU(zOt,n,1,7)),n.n.i>0&&(!(i=(!n.n&&(n.n=new eU(zOt,n,1,7)),BB(Wtn(n.n,0),137)).a)||oO(oO((t.a+=' "',t),i),'"'))),oO(kE(oO(kE(oO(kE(oO(kE((t.a+=" (",t),n.i),","),n.j)," | "),n.g),","),n.f),")"),t.a)}function URn(n){var t,e,i;return 0!=(64&n.Db)?mSn(n):(t=new lN(t6n),(e=n.k)?oO(oO((t.a+=' "',t),e),'"'):(!n.n&&(n.n=new eU(zOt,n,1,7)),n.n.i>0&&(!(i=(!n.n&&(n.n=new eU(zOt,n,1,7)),BB(Wtn(n.n,0),137)).a)||oO(oO((t.a+=' "',t),i),'"'))),oO(kE(oO(kE(oO(kE(oO(kE((t.a+=" (",t),n.i),","),n.j)," | "),n.g),","),n.f),")"),t.a)}function XRn(n,t){var e,i,r,c,a,u;if(null==t||0==t.length)return null;if(!(r=BB(SJ(n.a,t),149))){for(i=new Kb(new Ob(n.b).a.vc().Kc());i.a.Ob();)if(c=BB(i.a.Pb(),42),a=(e=BB(c.dd(),149)).c,u=t.length,mK(a.substr(a.length-u,u),t)&&(t.length==a.length||46==fV(a,a.length-t.length-1))){if(r)return null;r=e}r&&mZ(n.a,t,r)}return r}function WRn(n,t){var e,i,r;return e=new xn,(i=BB(P4($V(new Rq(null,new w1(n.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21).gc())<(r=BB(P4($V(new Rq(null,new w1(t.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[Xet,Uet]))),21).gc())?-1:i==r?0:1}function VRn(n){var t,e,i;Lx(n,(HXn(),$gt))&&((i=BB(mMn(n,$gt),21)).dc()||(e=new YK(t=BB(Vj(GCt),9),BB(SR(t,t.length),9),0),i.Hc((n$n(),$Ct))?orn(e,$Ct):orn(e,LCt),i.Hc(OCt)||orn(e,OCt),i.Hc(ICt)?orn(e,DCt):i.Hc(CCt)?orn(e,xCt):i.Hc(ACt)&&orn(e,NCt),i.Hc(DCt)?orn(e,ICt):i.Hc(xCt)?orn(e,CCt):i.Hc(NCt)&&orn(e,ACt),hon(n,$gt,e)))}function QRn(n){var t,e,i,r,c,a,u;for(r=BB(mMn(n,(hWn(),rlt)),10),l1(0,(i=n.j).c.length),e=BB(i.c[0],11),a=new Wb(r.j);a.a<a.c.c.length;)if(GI(c=BB(n0(a),11))===GI(mMn(e,dlt))){c.j==(kUn(),sIt)&&n.p>r.p?(qCn(c,SIt),c.d&&(u=c.o.b,t=c.a.b,c.a.b=u-t)):c.j==SIt&&r.p>n.p&&(qCn(c,sIt),c.d&&(u=c.o.b,t=c.a.b,c.a.b=-(u-t)));break}return r}function YRn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w;if(c=e,e<i)for(b=new Fan(n.p),w=new Fan(n.p),Frn(b.e,n.e),b.q=n.q,b.r=w,rX(b),Frn(w.j,n.j),w.r=b,rX(w),f=BB((l=new rI(b,w)).a,112),h=BB(l.b,112),l1(c,t.c.length),a=$Dn(n,f,h,r=BB(t.c[c],329)),s=e+1;s<=i;s++)l1(s,t.c.length),Vpn(u=BB(t.c[s],329),o=$Dn(n,f,h,u),r,a)&&(r=u,a=o);return c}function JRn(n,t,e,i,r){var c,a,u,o,s,h,f;if(!(cL(t,239)||cL(t,354)||cL(t,186)))throw Hp(new _y("Method only works for ElkNode-, ElkLabel and ElkPort-objects."));return a=n.a/2,o=t.i+i-a,h=t.j+r-a,s=o+t.g+n.a,f=h+t.f+n.a,DH(c=new km,new xC(o,h)),DH(c,new xC(o,f)),DH(c,new xC(s,f)),DH(c,new xC(s,h)),qan(u=new EAn(c),t),e&&VW(n.b,t,u),u}function ZRn(n,t,e){var i,r,c,a,u,o,s,h;for(c=new xC(t,e),s=new Wb(n.a);s.a<s.c.c.length;)for(UR((o=BB(n0(s),10)).n,c),h=new Wb(o.j);h.a<h.c.c.length;)for(r=new Wb(BB(n0(h),11).g);r.a<r.c.c.length;)for(Ztn((i=BB(n0(r),17)).a,c),(a=BB(mMn(i,(HXn(),vgt)),74))&&Ztn(a,c),u=new Wb(i.b);u.a<u.c.c.length;)UR(BB(n0(u),70).n,c)}function nKn(n,t,e){var i,r,c,a,u,o,s,h;for(c=new xC(t,e),s=new Wb(n.a);s.a<s.c.c.length;)for(UR((o=BB(n0(s),10)).n,c),h=new Wb(o.j);h.a<h.c.c.length;)for(r=new Wb(BB(n0(h),11).g);r.a<r.c.c.length;)for(Ztn((i=BB(n0(r),17)).a,c),(a=BB(mMn(i,(HXn(),vgt)),74))&&Ztn(a,c),u=new Wb(i.b);u.a<u.c.c.length;)UR(BB(n0(u),70).n,c)}function tKn(n){if(0==(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i)throw Hp(new ck("Edges must have a source."));if(0==(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i)throw Hp(new ck("Edges must have a target."));if(!n.b&&(n.b=new hK(KOt,n,4,7)),!(n.b.i<=1&&(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c.i<=1)))throw Hp(new ck("Hyperedges are not supported."))}function eKn(n,t){var e,i,r,c,a,u,o,s,h,f;for(f=0,d3(c=new Lp,t);c.b!=c.c;)for(o=BB(dU(c),214),s=0,h=BB(mMn(t.j,(HXn(),Ldt)),339),a=Gy(MD(mMn(t.j,Idt))),u=Gy(MD(mMn(t.j,Odt))),h!=(mon(),Nvt)&&(s+=a*S$n(o.e,h),s+=u*rxn(o.e)),f+=syn(o.d,o.e)+s,r=new Wb(o.b);r.a<r.c.c.length;)i=BB(n0(r),37),(e=BB(xq(n.b,i.p),214)).s||(f+=nCn(n,e));return f}function iKn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(o=b=t.length,b1(0,t.length),45==t.charCodeAt(0)?(f=-1,l=1,--b):(f=1,l=0),r=b/(c=(uHn(),cet)[10])|0,0!=(g=b%c)&&++r,u=x8(ANt,hQn,25,r,15,1),e=ret[8],a=0,w=l+(0==g?c:g),d=l;d<o;w=(d=w)+c)i=l_n(t.substr(d,w-d),_Vn,DWn),$On(),s=dvn(u,u,a,e),s+=Uwn(u,a,i),u[a++]=s;h=a,n.e=f,n.d=h,n.a=u,X0(n)}function rKn(n,t,e,i,r,c,a){if(n.c=i.qf().a,n.d=i.qf().b,r&&(n.c+=r.qf().a,n.d+=r.qf().b),n.b=t.rf().a,n.a=t.rf().b,r)switch(r.Hf().g){case 0:case 2:n.c+=r.rf().a+a+c.a+a;break;case 4:n.c-=a+c.a+a+t.rf().a;break;case 1:n.c+=r.rf().a+a,n.d-=a+c.b+a+t.rf().b;break;case 3:n.c+=r.rf().a+a,n.d+=r.rf().b+a+c.b+a}else e?n.c-=a+t.rf().a:n.c+=i.rf().a+a}function cKn(n,t){var e,i;for(this.b=new Np,this.e=new Np,this.a=n,this.d=t,Gpn(this),pdn(this),this.b.dc()?this.c=n.c.p:this.c=BB(this.b.Xb(0),10).c.p,0==this.e.c.length?this.f=n.c.p:this.f=BB(xq(this.e,this.e.c.length-1),10).c.p,i=BB(mMn(n,(hWn(),Plt)),15).Kc();i.Ob();)if(Lx(e=BB(i.Pb(),70),(HXn(),Vdt))){this.d=BB(mMn(e,Vdt),227);break}}function aKn(n,t,e){var i,r,c,a,u,o,s,h;for(i=BB(RX(n.a,t),53),c=BB(RX(n.a,e),53),r=BB(RX(n.e,t),53),a=BB(RX(n.e,e),53),i.a.zc(e,i),a.a.zc(t,a),h=c.a.ec().Kc();h.Ob();)s=BB(h.Pb(),10),i.a.zc(s,i),TU(BB(RX(n.e,s),53),t),Frn(BB(RX(n.e,s),53),r);for(o=r.a.ec().Kc();o.Ob();)u=BB(o.Pb(),10),a.a.zc(u,a),TU(BB(RX(n.a,u),53),e),Frn(BB(RX(n.a,u),53),c)}function uKn(n,t,e){var i,r,c,a,u,o,s,h;for(i=BB(RX(n.a,t),53),c=BB(RX(n.a,e),53),r=BB(RX(n.b,t),53),a=BB(RX(n.b,e),53),i.a.zc(e,i),a.a.zc(t,a),h=c.a.ec().Kc();h.Ob();)s=BB(h.Pb(),10),i.a.zc(s,i),TU(BB(RX(n.b,s),53),t),Frn(BB(RX(n.b,s),53),r);for(o=r.a.ec().Kc();o.Ob();)u=BB(o.Pb(),10),a.a.zc(u,a),TU(BB(RX(n.a,u),53),e),Frn(BB(RX(n.a,u),53),c)}function oKn(n,t){var e,i,r;switch(OTn(t,"Breaking Point Insertion",1),i=new MAn(n),BB(mMn(n,(HXn(),Bpt)),337).g){case 2:r=new Tc;case 0:r=new wc;break;default:r=new Mc}if(e=r.Vf(n,i),qy(TD(mMn(n,qpt)))&&(e=Dqn(n,e)),!r.Wf()&&Lx(n,Xpt))switch(BB(mMn(n,Xpt),338).g){case 2:e=XCn(i,e);break;case 1:e=KTn(i,e)}e.dc()||tXn(n,e),HSn(t)}function sKn(n,t,e){var i,r,c,a,u,o,s;if(s=t,$in(o=Q3(n,L3(e),s),R2(s,q6n)),a=N2(s,L6n),VCn((i=new oI(n,o)).a,i.b,a),u=N2(s,N6n),QCn((r=new sI(n,o)).a,r.b,u),0==(!o.b&&(o.b=new hK(KOt,o,4,7)),o.b).i||0==(!o.c&&(o.c=new hK(KOt,o,5,8)),o.c).i)throw c=R2(s,q6n),Hp(new ek(X6n+c+W6n));return STn(s,o),sXn(n,s,o),xon(n,s,o)}function hKn(n,t){var i,r,c,a,u,o,s;for(c=x8(ANt,hQn,25,n.e.a.c.length,15,1),u=new Wb(n.e.a);u.a<u.c.c.length;)c[(a=BB(n0(u),121)).d]+=a.b.a.c.length;for(o=zB(t);0!=o.b;)for(r=L9(new Wb((a=BB(0==o.b?null:(Px(0!=o.b),Atn(o,o.a.a)),121)).g.a));r.Ob();)(s=(i=BB(r.Pb(),213)).e).e=e.Math.max(s.e,a.e+i.a),--c[s.d],0==c[s.d]&&r5(o,s,o.c.b,o.c)}function fKn(n){var t,i,r,c,a,u,o,s,h,f,l;for(i=_Vn,c=DWn,o=new Wb(n.e.a);o.a<o.c.c.length;)a=BB(n0(o),121),c=e.Math.min(c,a.e),i=e.Math.max(i,a.e);for(t=x8(ANt,hQn,25,i-c+1,15,1),u=new Wb(n.e.a);u.a<u.c.c.length;)(a=BB(n0(u),121)).e-=c,++t[a.e];if(r=0,null!=n.k)for(f=0,l=(h=n.k).length;f<l&&(s=h[f],t[r++]+=s,t.length!=r);++f);return t}function lKn(n){switch(n.d){case 9:case 8:return!0;case 3:case 5:case 4:case 6:return!1;case 7:return BB(Kxn(n),19).a==n.o;case 1:case 2:if(-2==n.o)return!1;switch(n.p){case 0:case 1:case 2:case 6:case 5:case 7:return QI(n.k,n.f);case 3:case 4:return n.j==n.e;default:return null==n.n?null==n.g:Nfn(n.n,n.g)}default:return!1}}function bKn(n){NM(n,new MTn(vj(wj(pj(gj(new du,K5n),"ELK Fixed"),"Keeps the current layout as it is, without any automatic modification. Optional coordinates can be given for nodes and edge bend points."),new Vu))),u2(n,K5n,QJn,dCt),u2(n,K5n,g3n,mpn(gCt)),u2(n,K5n,g5n,mpn(hCt)),u2(n,K5n,PZn,mpn(fCt)),u2(n,K5n,BZn,mpn(bCt)),u2(n,K5n,Y2n,mpn(lCt))}function wKn(n,t,e){var i,r,c,a;if(i=dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15))),a=dG(cbn(SVn,rV(dG(cbn(null==e?0:nsn(e),PVn)),15))),(c=Jrn(n,t,i))&&a==c.f&&wW(e,c.i))return e;if(Zrn(n,e,a))throw Hp(new _y("value already present: "+e));return r=new qW(t,i,e,a),c?(LLn(n,c),YCn(n,r,c),c.e=null,c.c=null,c.i):(YCn(n,r,null),qkn(n),null)}function dKn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;s=e.a.c,a=e.a.c+e.a.b,l=(c=BB(RX(e.c,t),459)).f,b=c.a,u=c.b?new xC(a,l):new xC(s,l),h=c.c?new xC(s,b):new xC(a,b),r=s,e.p||(r+=n.c),o=new xC(r+=e.F+e.v*n.b,l),f=new xC(r,b),nin(t.a,Pun(Gk(PMt,1),sVn,8,0,[u,o])),e.d.a.gc()>1&&(i=new xC(r,e.b),DH(t.a,i)),nin(t.a,Pun(Gk(PMt,1),sVn,8,0,[f,h]))}function gKn(n,t,e){var i,r,c,a,u,o;if(t){if(e<=-1){if(cL(i=itn(t.Tg(),-1-e),99))return BB(i,18);for(u=0,o=(a=BB(t.ah(i),153)).gc();u<o;++u)if(GI(a.jl(u))===GI(n)&&cL(r=a.il(u),99)&&0!=((c=BB(r,18)).Bb&h6n))return c;throw Hp(new Fy("The containment feature could not be located"))}return Cvn(BB(itn(n.Tg(),e),18))}return null}function pKn(n){var t,e,i,r,c;for(i=n.length,t=new Pk,c=0;c<i;)if(9!=(e=fV(n,c++))&&10!=e&&12!=e&&13!=e&&32!=e)if(35!=e)92==e&&c<i?35==(b1(c,n.length),r=n.charCodeAt(c))||9==r||10==r||12==r||13==r||32==r?(NX(t,r&QVn),++c):(t.a+="\\",NX(t,r&QVn),++c):NX(t,e&QVn);else for(;c<i&&13!=(e=fV(n,c++))&&10!=e;);return t.a}function vKn(n,t){var e,i,r;for(i=new Wb(t);i.a<i.c.c.length;)if(e=BB(n0(i),33),JIn(n.a,e,e),JIn(n.b,e,e),0!=(r=wDn(e)).c.length)for(n.d&&n.d.lg(r),JIn(n.a,e,(l1(0,r.c.length),BB(r.c[0],33))),JIn(n.b,e,BB(xq(r,r.c.length-1),33));0!=Dun(r).c.length;)r=Dun(r),n.d&&n.d.lg(r),JIn(n.a,e,(l1(0,r.c.length),BB(r.c[0],33))),JIn(n.b,e,BB(xq(r,r.c.length-1),33))}function mKn(n){var t,e,i,r,c,a,u,o,s,h;for(e=0,u=new Wb(n.d);u.a<u.c.c.length;)(a=BB(n0(u),101)).i&&(a.i.c=e++);for(t=kq($Nt,[sVn,ZYn],[177,25],16,[e,e],2),h=n.d,r=0;r<h.c.length;r++)if(l1(r,h.c.length),(o=BB(h.c[r],101)).i)for(c=r+1;c<h.c.length;c++)l1(c,h.c.length),(s=BB(h.c[c],101)).i&&(i=rMn(o,s),t[o.i.c][s.i.c]=i,t[s.i.c][o.i.c]=i);return t}function yKn(n,t,e,i){var r,c,a;return a=new yT(t,e),n.a?i?(++(r=BB(RX(n.b,t),283)).a,a.d=i.d,a.e=i.e,a.b=i,a.c=i,i.e?i.e.c=a:BB(RX(n.b,t),283).b=a,i.d?i.d.b=a:n.a=a,i.d=a,i.e=a):(n.e.b=a,a.d=n.e,n.e=a,(r=BB(RX(n.b,t),283))?(++r.a,(c=r.c).c=a,a.e=c,r.c=a):(VW(n.b,t,r=new sY(a)),++n.c)):(n.a=n.e=a,VW(n.b,t,new sY(a)),++n.c),++n.d,a}function kKn(n,t){var e,i,r,c,a,u,o,s;for(e=new RegExp(t,"g"),o=x8(Qtt,sVn,2,0,6,1),i=0,s=n,c=null;;){if(null==(u=e.exec(s))||""==s){o[i]=s;break}a=u.index,o[i]=s.substr(0,a),s=fx(s,a+u[0].length,s.length),e.lastIndex=0,c==s&&(o[i]=s.substr(0,1),s=s.substr(1)),c=s,++i}if(n.length>0){for(r=o.length;r>0&&""==o[r-1];)--r;r<o.length&&(o.length=r)}return o}function jKn(n,t){var e,i,r,c,a,u,o,s;for(u=null,r=!1,c=0,o=a4((s=kY(t)).a).i;c<o;++c)(e=jKn(n,BB(eGn(s,c,cL(a=BB(Wtn(a4(s.a),c),87).c,88)?BB(a,26):(gWn(),d$t)),26))).dc()||(u?(r||(r=!0,u=new rG(u)),u.Gc(e)):u=e);return(i=xIn(n,t)).dc()?u||(SQ(),SQ(),set):u?(r||(u=new rG(u)),u.Gc(i),u):i}function EKn(n,t){var e,i,r,c,a,u,o,s;for(u=null,i=!1,c=0,o=a4((s=kY(t)).a).i;c<o;++c)(e=EKn(n,BB(eGn(s,c,cL(a=BB(Wtn(a4(s.a),c),87).c,88)?BB(a,26):(gWn(),d$t)),26))).dc()||(u?(i||(i=!0,u=new rG(u)),u.Gc(e)):u=e);return(r=VOn(n,t)).dc()?u||(SQ(),SQ(),set):u?(i||(u=new rG(u)),u.Gc(r),u):r}function TKn(n,t,e){var i,r,c,a,u,o;if(cL(t,72))return _pn(n,t,e);for(u=null,c=null,i=BB(n.g,119),a=0;a<n.i;++a)if(Nfn(t,(r=i[a]).dd())&&cL(c=r.ak(),99)&&0!=(BB(c,18).Bb&h6n)){u=r;break}return u&&(mA(n.e)&&(o=c.$j()?LY(n,4,c,t,null,pBn(n,c,t,cL(c,99)&&0!=(BB(c,18).Bb&BQn)),!0):LY(n,c.Kj()?2:1,c,t,c.zj(),-1,!0),e?e.Ei(o):e=o),e=TKn(n,u,e)),e}function MKn(n){var t,i,r,c;r=n.o,qD(),n.A.dc()||Nfn(n.A,$rt)?c=r.a:(c=SIn(n.f),n.A.Hc((mdn(),RIt))&&!n.B.Hc((n_n(),XIt))&&(c=e.Math.max(c,SIn(BB(oV(n.p,(kUn(),sIt)),244))),c=e.Math.max(c,SIn(BB(oV(n.p,SIt),244)))),(t=oan(n))&&(c=e.Math.max(c,t.a))),qy(TD(n.e.yf().We((sWn(),FSt))))?r.a=e.Math.max(r.a,c):r.a=c,(i=n.f.i).c=0,i.b=c,_Fn(n.f)}function SKn(n,t){var e,i,r,c,a,u,o,s,h;if((e=t.Hh(n.a))&&null!=(o=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),"memberTypes")))){for(s=new Np,a=0,u=(c=kKn(o,"\\w")).length;a<u;++a)cL(h=-1==(i=(r=c[a]).lastIndexOf("#"))?uD(n,t.Aj(),r):0==i?M9(n,null,r.substr(1)):M9(n,r.substr(0,i),r.substr(i+1)),148)&&WB(s,BB(h,148));return s}return SQ(),SQ(),set}function PKn(n,t,e){var i,r,c,a,u,o,s,h;for(OTn(e,aZn,1),n.bf(t),c=0;n.df(c);){for(h=new Wb(t.e);h.a<h.c.c.length;)for(o=BB(n0(h),144),u=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[t.e,t.d,t.b])));dAn(u);)(a=BB(U5(u),357))!=o&&(r=n.af(a,o))&&UR(o.a,r);for(s=new Wb(t.e);s.a<s.c.c.length;)WSn(i=(o=BB(n0(s),144)).a,-n.d,-n.d,n.d,n.d),UR(o.d,i),kO(i);n.cf(),++c}HSn(e)}function CKn(n,t,e){var i,r,c,a;if(a=axn(n.e.Tg(),t),i=BB(n.g,119),ZM(),BB(t,66).Oj()){for(c=0;c<n.i;++c)if(r=i[c],a.rl(r.ak())&&Nfn(r,e))return fDn(n,c),!0}else if(null!=e){for(c=0;c<n.i;++c)if(r=i[c],a.rl(r.ak())&&Nfn(e,r.dd()))return fDn(n,c),!0}else for(c=0;c<n.i;++c)if(r=i[c],a.rl(r.ak())&&null==r.dd())return fDn(n,c),!0;return!1}function IKn(n,t){var e,i,r,c,a;for(null==n.c||n.c.length<t.c.length?n.c=x8($Nt,ZYn,25,t.c.length,16,1):nk(n.c),n.a=new Np,i=0,a=new Wb(t);a.a<a.c.c.length;)(r=BB(n0(a),10)).p=i++;for(e=new YT,c=new Wb(t);c.a<c.c.c.length;)r=BB(n0(c),10),n.c[r.p]||(hIn(n,r),0==e.b||(Px(0!=e.b),BB(e.a.a.c,15)).gc()<n.a.c.length?hO(e,n.a):fO(e,n.a),n.a=new Np);return e}function OKn(n,t,e,i){var r,c,a,u,o,s,h;for(Pen(a=BB(Wtn(t,0),33),0),Cen(a,0),(o=new Np).c[o.c.length]=a,u=a,c=new eq(n.a,a.g,a.f,(YLn(),_Et)),s=1;s<t.i;s++)Pen(h=BB(Wtn(t,s),33),(r=aqn(n,nHn(n,DEt,h,u,c,o,e),nHn(n,xEt,h,u,c,o,e),nHn(n,KEt,h,u,c,o,e),nHn(n,REt,h,u,c,o,e),h,u,i)).d),Cen(h,r.e),ab(r,_Et),c=r,u=h,o.c[o.c.length]=h;return c}function AKn(n){NM(n,new MTn(vj(wj(pj(gj(new du,Q4n),"ELK SPOrE Overlap Removal"),'A node overlap removal algorithm proposed by Nachmanson et al. in "Node overlap removal by growing a tree".'),new eu))),u2(n,Q4n,K4n,mpn(qTt)),u2(n,Q4n,QJn,BTt),u2(n,Q4n,vZn,8),u2(n,Q4n,q4n,mpn(HTt)),u2(n,Q4n,U4n,mpn(_Tt)),u2(n,Q4n,X4n,mpn(FTt)),u2(n,Q4n,X2n,(hN(),!1))}function $Kn(n,t,e,i){var r,c,a,u,o,s,h,f;for(a=_x(t.c,e,i),h=new Wb(t.a);h.a<h.c.c.length;){for(UR((s=BB(n0(h),10)).n,a),f=new Wb(s.j);f.a<f.c.c.length;)for(c=new Wb(BB(n0(f),11).g);c.a<c.c.c.length;)for(Ztn((r=BB(n0(c),17)).a,a),(u=BB(mMn(r,(HXn(),vgt)),74))&&Ztn(u,a),o=new Wb(r.b);o.a<o.c.c.length;)UR(BB(n0(o),70).n,a);WB(n.a,s),s.a=n}}function LKn(n,t){var e,i,r,c;if(OTn(t,"Node and Port Label Placement and Node Sizing",1),RA((gM(),new HV(n,!0,!0,new Ve))),BB(mMn(n,(hWn(),Zft)),21).Hc((bDn(),lft)))for(i=(r=BB(mMn(n,(HXn(),cpt)),21)).Hc((lIn(),iIt)),c=qy(TD(mMn(n,apt))),e=new Wb(n.b);e.a<e.c.c.length;)JT(AV(new Rq(null,new w1(BB(n0(e),29).a,16)),new Qe),new K_(r,i,c));HSn(t)}function NKn(n,t){var e,i,r,c,a,u;if((e=t.Hh(n.a))&&null!=(u=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),n8n))))switch(r=mN(u,YTn(35)),i=t.Hj(),-1==r?(a=az(n,Utn(i)),c=u):0==r?(a=null,c=u.substr(1)):(a=u.substr(0,r),c=u.substr(r+1)),DW(B7(n,t))){case 2:case 3:return Don(n,i,a,c);case 0:case 4:case 5:case 6:return Ron(n,i,a,c)}return null}function xKn(n,t,e){var i,r,c,a,u;if(ZM(),a=BB(t,66).Oj(),$xn(n.e,t)){if(t.hi()&&UFn(n,t,e,cL(t,99)&&0!=(BB(t,18).Bb&BQn)))return!1}else for(u=axn(n.e.Tg(),t),i=BB(n.g,119),c=0;c<n.i;++c)if(r=i[c],u.rl(r.ak()))return!(a?Nfn(r,e):null==e?null==r.dd():Nfn(e,r.dd()))&&(BB(ovn(n,c,a?BB(e,72):Z3(t,e)),72),!0);return f9(n,a?BB(e,72):Z3(t,e))}function DKn(n){var t,e,i,r,c;if(n.d)throw Hp(new Fy((ED(Yat),AYn+Yat.k+$Yn)));for(n.c==(Ffn(),BPt)&&Mzn(n,_Pt),t=new Wb(n.a.a);t.a<t.c.c.length;)BB(n0(t),189).e=0;for(r=new Wb(n.a.b);r.a<r.c.c.length;)for((i=BB(n0(r),81)).o=KQn,e=i.f.Kc();e.Ob();)++BB(e.Pb(),81).d.e;for(Gzn(n),c=new Wb(n.a.b);c.a<c.c.c.length;)BB(n0(c),81).k=!0;return n}function RKn(n,t){var e,i,r,c,a,u,o,s;for(u=new pPn(n),r5(e=new YT,t,e.c.b,e.c);0!=e.b;){for((i=BB(0==e.b?null:(Px(0!=e.b),Atn(e,e.a.a)),113)).d.p=1,a=new Wb(i.e);a.a<a.c.c.length;)jTn(u,r=BB(n0(a),409)),0==(s=r.d).d.p&&r5(e,s,e.c.b,e.c);for(c=new Wb(i.b);c.a<c.c.c.length;)jTn(u,r=BB(n0(c),409)),0==(o=r.c).d.p&&r5(e,o,e.c.b,e.c)}return u}function KKn(n){var t,e,i,r,c;if(1!=(i=Gy(MD(ZAn(n,(sWn(),yPt))))))for(MA(n,i*n.g,i*n.f),e=XO(_B((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c),new Bu)),c=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!n.n&&(n.n=new eU(zOt,n,1,7)),n.n),(!n.c&&(n.c=new eU(XOt,n,9,9)),n.c),e])));dAn(c);)(r=BB(U5(c),470)).Gg(i*r.Dg(),i*r.Eg()),r.Fg(i*r.Cg(),i*r.Bg()),(t=BB(r.We(cPt),8))&&(t.a*=i,t.b*=i)}function _Kn(n,t,e,i,r){var c,a,u,o,s,h;for(c=new Wb(n.b);c.a<c.c.c.length;)for(s=0,h=(o=n2(BB(n0(c),29).a)).length;s<h;++s)switch(BB(mMn(u=o[s],(HXn(),kgt)),163).g){case 1:vxn(u),PZ(u,t),lvn(u,!0,i);break;case 3:ZNn(u),PZ(u,e),lvn(u,!1,r)}for(a=new M2(n.b,0);a.b<a.d.gc();)0==(Px(a.b<a.d.gc()),BB(a.d.Xb(a.c=a.b++),29)).a.c.length&&fW(a)}function FKn(n,t){var e,i,r,c,a,u,o;if((e=t.Hh(n.a))&&null!=(o=SD(cdn((!e.b&&(e.b=new Jx((gWn(),k$t),X$t,e)),e.b),M7n)))){for(i=new Np,a=0,u=(c=kKn(o,"\\w")).length;a<u;++a)mK(r=c[a],"##other")?WB(i,"!##"+az(n,Utn(t.Hj()))):mK(r,"##local")?i.c[i.c.length]=null:mK(r,E7n)?WB(i,az(n,Utn(t.Hj()))):i.c[i.c.length]=r;return i}return SQ(),SQ(),set}function BKn(n,t){var e,i,r;return e=new Xn,(i=1==(i=BB(P4($V(new Rq(null,new w1(n.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21).gc())?1:0)<(r=1==(r=BB(P4($V(new Rq(null,new w1(t.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[Xet,Uet]))),21).gc())?1:0)?-1:i==r?0:1}function HKn(n){var t,e,i,r,c,a,u,o,s,h,f,l;for(r=qy(TD(mMn(u=n.i,(HXn(),wgt)))),h=0,i=0,s=new Wb(n.g);s.a<s.c.c.length;)c=(a=b5(o=BB(n0(s),17)))&&r&&qy(TD(mMn(o,dgt))),l=o.d.i,a&&c?++i:a&&!c?++h:vW(l).e==u?++i:++h;for(e=new Wb(n.e);e.a<e.c.c.length;)c=(a=b5(t=BB(n0(e),17)))&&r&&qy(TD(mMn(t,dgt))),f=t.c.i,a&&c?++h:a&&!c?++i:vW(f).e==u?++h:++i;return h-i}function qKn(n,t,e,i){this.e=n,this.k=BB(mMn(n,(hWn(),Alt)),304),this.g=x8(Out,a1n,10,t,0,1),this.b=x8(Ptt,sVn,333,t,7,1),this.a=x8(Out,a1n,10,t,0,1),this.d=x8(Ptt,sVn,333,t,7,1),this.j=x8(Out,a1n,10,t,0,1),this.i=x8(Ptt,sVn,333,t,7,1),this.p=x8(Ptt,sVn,333,t,7,1),this.n=x8(ktt,sVn,476,t,8,1),yS(this.n,(hN(),!1)),this.f=x8(ktt,sVn,476,t,8,1),yS(this.f,!0),this.o=e,this.c=i}function GKn(n,t){var e,i,r;if(!t.dc())if(BB(t.Xb(0),286).d==($Pn(),nht))Akn(n,t);else for(i=t.Kc();i.Ob();){switch((e=BB(i.Pb(),286)).d.g){case 5:hPn(n,e,Vbn(n,e));break;case 0:hPn(n,e,(r=(e.f-e.c+1-1)/2|0,e.c+r));break;case 4:hPn(n,e,$nn(n,e));break;case 2:Kwn(e),hPn(n,e,$En(e)?e.c:e.f);break;case 1:Kwn(e),hPn(n,e,$En(e)?e.f:e.c)}hMn(e.a)}}function zKn(n,t){var e,i,r,c,a;if(!t.e){for(t.e=!0,i=t.d.a.ec().Kc();i.Ob();)e=BB(i.Pb(),17),t.o&&t.d.a.gc()<=1?(a=new xC((c=t.a.c)+(t.a.c+t.a.b-c)/2,t.b),DH(BB(t.d.a.ec().Kc().Pb(),17).a,a)):(r=BB(RX(t.c,e),459)).b||r.c?dKn(n,e,t):n.d==(Usn(),rmt)&&(r.d||r.e)&&LOn(n,t)&&t.d.a.gc()<=1?dzn(e,t):DDn(n,e,t);t.k&&e5(t.d,new Te)}}function UKn(n,t,i,r,c,a){var u,o,s,h,f,l,b,w,d,g,p,v,m;for(o=(r+c)/2+a,g=i*e.Math.cos(o),p=i*e.Math.sin(o),v=g-t.g/2,m=p-t.f/2,Pen(t,v),Cen(t,m),l=n.a.jg(t),(d=2*e.Math.acos(i/i+n.c))<c-r?(b=d/l,u=(r+c-d)/2):(b=(c-r)/l,u=r),w=wDn(t),n.e&&(n.e.kg(n.d),n.e.lg(w)),h=new Wb(w);h.a<h.c.c.length;)s=BB(n0(h),33),f=n.a.jg(s),UKn(n,s,i+n.c,u,u+b*f,a),u+=b*f}function XKn(n,t,e){var i;switch(i=e.q.getMonth(),t){case 5:oO(n,Pun(Gk(Qtt,1),sVn,2,6,["J","F","M","A","M","J","J","A","S","O","N","D"])[i]);break;case 4:oO(n,Pun(Gk(Qtt,1),sVn,2,6,[YVn,JVn,ZVn,nQn,tQn,eQn,iQn,rQn,cQn,aQn,uQn,oQn])[i]);break;case 3:oO(n,Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"])[i]);break;default:Enn(n,i+1,t)}}function WKn(n,t){var e,i,r,c;if(OTn(t,"Network simplex",1),n.e.a.c.length<1)HSn(t);else{for(r=new Wb(n.e.a);r.a<r.c.c.length;)BB(n0(r),121).e=0;for((c=n.e.a.c.length>=40)&&EFn(n),BHn(n),Txn(n),e=yln(n),i=0;e&&i<n.f;)e_n(n,e,e$n(n,e)),e=yln(n),++i;c&&tTn(n),n.a?p$n(n,fKn(n)):fKn(n),n.b=null,n.d=null,n.p=null,n.c=null,n.g=null,n.i=null,n.n=null,n.o=null,HSn(t)}}function VKn(n,t,e,i){var r,c,a,u,o,s,h,f;for(XR(u=new xC(e,i),BB(mMn(t,(Mrn(),oat)),8)),f=new Wb(t.e);f.a<f.c.c.length;)UR((h=BB(n0(f),144)).d,u),WB(n.e,h);for(a=new Wb(t.c);a.a<a.c.c.length;){for(r=new Wb((c=BB(n0(a),282)).a);r.a<r.c.c.length;)UR(BB(n0(r),559).d,u);WB(n.c,c)}for(s=new Wb(t.d);s.a<s.c.c.length;)UR((o=BB(n0(s),447)).d,u),WB(n.d,o)}function QKn(n,t){var e,i,r,c,a,u,o,s;for(o=new Wb(t.j);o.a<o.c.c.length;)for(r=new m6((u=BB(n0(o),11)).b);y$(r.a)||y$(r.b);)t!=(c=(e=(i=BB(y$(r.a)?n0(r.a):n0(r.b),17)).c==u?i.d:i.c).i)&&((s=BB(mMn(i,(HXn(),fpt)),19).a)<0&&(s=0),a=c.p,0==n.b[a]&&(i.d==e?(n.a[a]-=s+1,n.a[a]<=0&&n.c[a]>0&&DH(n.f,c)):(n.c[a]-=s+1,n.c[a]<=0&&n.a[a]>0&&DH(n.e,c))))}function YKn(n){var t,e,i,r,c,a,u;for(c=new dE(BB(yX(new Rn),62)),u=KQn,e=new Wb(n.d);e.a<e.c.c.length;){for(u=(t=BB(n0(e),222)).c.c;0!=c.a.c&&(a=BB(MU(q9(c.a)),222)).c.c+a.c.b<u;)$J(c.a,a);for(r=new Fb(new BR(new xN(new _b(c.a).a).b));aS(r.a.a);)DH((i=BB(mx(r.a).cd(),222)).b,t),DH(t.b,i);Mon(c.a,t,(hN(),ptt))}}function JKn(n,t,e){var i,r,c,a,u,o,s,h,f;for(c=new J6(t.c.length),s=new Wb(t);s.a<s.c.c.length;)a=BB(n0(s),10),WB(c,n.b[a.c.p][a.p]);for(mqn(n,c,e),f=null;f=ezn(c);)rBn(n,BB(f.a,233),BB(f.b,233),c);for(t.c=x8(Ant,HWn,1,0,5,1),r=new Wb(c);r.a<r.c.c.length;)for(o=0,h=(u=(i=BB(n0(r),233)).d).length;o<h;++o)a=u[o],t.c[t.c.length]=a,n.a[a.c.p][a.p].a=lL(i.g,i.d[0]).a}function ZKn(n,t){var e,i,r,c;if(0<(cL(n,14)?BB(n,14).gc():F3(n.Kc()))){if(1<(r=t)){for(--r,c=new pa,i=n.Kc();i.Ob();)e=BB(i.Pb(),86),c=Wen(Pun(Gk(xnt,1),HWn,20,0,[c,new bg(e)]));return ZKn(c,r)}if(r<0){for(c=new va,i=n.Kc();i.Ob();)e=BB(i.Pb(),86),c=Wen(Pun(Gk(xnt,1),HWn,20,0,[c,new bg(e)]));if(0<(cL(c,14)?BB(c,14).gc():F3(c.Kc())))return ZKn(c,r)}}return BB(iL(n.Kc()),86)}function n_n(){n_n=O,GIt=new QC("DEFAULT_MINIMUM_SIZE",0),UIt=new QC("MINIMUM_SIZE_ACCOUNTS_FOR_PADDING",1),qIt=new QC("COMPUTE_PADDING",2),XIt=new QC("OUTSIDE_NODE_LABELS_OVERHANG",3),WIt=new QC("PORTS_OVERHANG",4),QIt=new QC("UNIFORM_PORT_SPACING",5),VIt=new QC("SPACE_EFFICIENT_PORT_LABELS",6),zIt=new QC("FORCE_TABULAR_NODE_LABELS",7),HIt=new QC("ASYMMETRICAL",8)}function t_n(n,t){var e,i,r,c,a,u,o,s;if(t){if(e=(c=t.Tg())?Utn(c).Nh().Jh(c):null){for(Jgn(n,t,e),o=0,s=(null==(r=t.Tg()).i&&qFn(r),r.i).length;o<s;++o)null==r.i&&qFn(r),i=r.i,(u=o>=0&&o<i.length?i[o]:null).Ij()&&!u.Jj()&&(cL(u,322)?nvn(n,BB(u,34),t,e):0!=((a=BB(u,18)).Bb&h6n)&&sEn(n,a,t,e));t.kh()&&BB(e,49).vh(BB(t,49).qh())}return e}return null}function e_n(n,t,e){var i,r,c;if(!t.f)throw Hp(new _y("Given leave edge is no tree edge."));if(e.f)throw Hp(new _y("Given enter edge is a tree edge already."));for(t.f=!1,eL(n.p,t),e.f=!0,TU(n.p,e),i=e.e.e-e.d.e-e.a,FCn(n,e.e,t)||(i=-i),c=new Wb(n.e.a);c.a<c.c.c.length;)FCn(n,r=BB(n0(c),121),t)||(r.e+=i);n.j=1,nk(n.c),pIn(n,BB(n0(new Wb(n.e.a)),121)),gGn(n)}function i_n(n,t){var e,i,r,c,a,u;if((u=BB(mMn(t,(HXn(),ept)),98))==(QEn(),WCt)||u==XCt)for(r=new xC(t.f.a+t.d.b+t.d.c,t.f.b+t.d.d+t.d.a).b,a=new Wb(n.a);a.a<a.c.c.length;)(c=BB(n0(a),10)).k==(uSn(),Mut)&&((e=BB(mMn(c,(hWn(),Qft)),61))!=(kUn(),oIt)&&e!=CIt||(i=Gy(MD(mMn(c,Tlt))),u==WCt&&(i*=r),c.n.b=i-BB(mMn(c,npt),8).b,Jan(c,!1,!0)))}function r_n(n,t,e,i){var r,c,a,u,o,s,h,f,l,b;if(Ytn(n,t,e),c=t[e],b=i?(kUn(),CIt):(kUn(),oIt),mL(t.length,e,i)){for(G6(n,r=t[i?e-1:e+1],i?(ain(),qvt):(ain(),Hvt)),h=0,l=(o=c).length;h<l;++h)xvn(n,a=o[h],b);for(G6(n,c,i?(ain(),Hvt):(ain(),qvt)),s=0,f=(u=r).length;s<f;++s)(a=u[s]).e||xvn(n,a,Tln(b))}else for(s=0,f=(u=c).length;s<f;++s)xvn(n,a=u[s],b);return!1}function c_n(n,t,e,i){var r,c,a,u,o;u=abn(t,e),(e==(kUn(),SIt)||e==CIt)&&(u=cL(u,152)?o6(BB(u,152)):cL(u,131)?BB(u,131).a:cL(u,54)?new fy(u):new CT(u)),a=!1;do{for(r=!1,c=0;c<u.gc()-1;c++)BMn(n,BB(u.Xb(c),11),BB(u.Xb(c+1),11),i)&&(a=!0,k0(n.a,BB(u.Xb(c),11),BB(u.Xb(c+1),11)),o=BB(u.Xb(c+1),11),u._c(c+1,BB(u.Xb(c),11)),u._c(c,o),r=!0)}while(r);return a}function a_n(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w;if(!mA(n.e))return BB(YIn(n,t,e),72);if(t!=e&&(a=(b=(r=BB(n.g,119))[e]).ak(),$xn(n.e,a))){for(w=axn(n.e.Tg(),a),o=-1,u=-1,i=0,s=0,f=t>e?t:e;s<=f;++s)s==e?u=i++:(c=r[s],h=w.rl(c.ak()),s==t&&(o=s!=f||h?i:i-1),h&&++i);return l=BB(Iln(n,t,e),72),u!=o&&Lv(n,new j9(n.e,7,a,iln(u),b.dd(),o)),l}return BB(Iln(n,t,e),72)}function u_n(n,t){var e,i,r,c,a,u;for(OTn(t,"Port order processing",1),u=BB(mMn(n,(HXn(),opt)),421),e=new Wb(n.b);e.a<e.c.c.length;)for(r=new Wb(BB(n0(e),29).a);r.a<r.c.c.length;)i=BB(n0(r),10),c=BB(mMn(i,ept),98),a=i.j,c==(QEn(),UCt)||c==WCt||c==XCt?(SQ(),m$(a,sst)):c!=QCt&&c!=YCt&&(SQ(),m$(a,fst),Lvn(a),u==(U7(),_vt)&&m$(a,hst)),i.i=!0,eIn(i);HSn(t)}function o_n(n){var t,i,r,c,a,u,o,s;for(s=new xp,t=new Fv,u=n.Kc();u.Ob();)c=BB(u.Pb(),10),o=AN(oM(new qv,c),t),jCn(s.f,c,o);for(a=n.Kc();a.Ob();)for(r=new oz(ZL(lbn(c=BB(a.Pb(),10)).a.Kc(),new h));dAn(r);)b5(i=BB(U5(r),17))||UNn(aM(cM(rM(uM(new Hv,e.Math.max(1,BB(mMn(i,(HXn(),lpt)),19).a)),1),BB(RX(s,i.c.i),121)),BB(RX(s,i.d.i),121)));return t}function s_n(){s_n=O,byt=dq(new B2,(yMn(),Fat),(lWn(),vot)),dyt=dq(new B2,_at,jot),gyt=WG(dq(new B2,_at,Dot),Bat,xot),lyt=WG(dq(dq(new B2,_at,lot),Fat,bot),Bat,wot),pyt=ogn(ogn(FM(WG(dq(new B2,Rat,Uot),Bat,zot),Fat),Got),Xot),wyt=WG(new B2,Bat,mot),hyt=WG(dq(dq(dq(new B2,Kat,Mot),Fat,Pot),Fat,Cot),Bat,Sot),fyt=WG(dq(dq(new B2,Fat,Cot),Fat,uot),Bat,aot)}function h_n(n,t,e,i,r,c){var a,u,o,s,h,f;for(a=lSn(t,o=jon(t)-jon(n)),u=M$(0,0,0);o>=0&&(!Cyn(n,a)||(o<22?u.l|=1<<o:o<44?u.m|=1<<o-22:u.h|=1<<o-44,0!=n.l||0!=n.m||0!=n.h));)s=a.m,h=a.h,f=a.l,a.h=h>>>1,a.m=s>>>1|(1&h)<<21,a.l=f>>>1|(1&s)<<21,--o;return e&&Oon(u),c&&(i?(ltt=aon(n),r&&(ltt=hun(ltt,(X7(),dtt)))):ltt=M$(n.l,n.m,n.h)),u}function f_n(n,t){var e,i,r,c,a,u,o,s,h,f;for(s=n.e[t.c.p][t.p]+1,o=t.c.a.c.length+1,u=new Wb(n.a);u.a<u.c.c.length;){for(a=BB(n0(u),11),f=0,c=0,r=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(a),new Gw(a)])));dAn(r);)(i=BB(U5(r),11)).i.c==t.c&&(f+=bL(n,i.i)+1,++c);e=f/c,(h=a.j)==(kUn(),oIt)?n.f[a.p]=e<s?n.c-e:n.b+(o-e):h==CIt&&(n.f[a.p]=e<s?n.b+e:n.c-(o-e))}}function l_n(n,t,e){var i,r,c,a;if(null==n)throw Hp(new Mk(zWn));for(i=(c=n.length)>0&&(b1(0,n.length),45==n.charCodeAt(0)||(b1(0,n.length),43==n.charCodeAt(0)))?1:0;i<c;i++)if(-1==egn((b1(i,n.length),n.charCodeAt(i))))throw Hp(new Mk(DQn+n+'"'));if(r=(a=parseInt(n,10))<t,isNaN(a))throw Hp(new Mk(DQn+n+'"'));if(r||a>e)throw Hp(new Mk(DQn+n+'"'));return a}function b_n(n){var t,i,r,c,a,u;for(a=new YT,c=new Wb(n.a);c.a<c.c.c.length;)Vl(r=BB(n0(c),112),r.f.c.length),Ql(r,r.k.c.length),0==r.i&&(r.o=0,r5(a,r,a.c.b,a.c));for(;0!=a.b;)for(i=(r=BB(0==a.b?null:(Px(0!=a.b),Atn(a,a.a.a)),112)).o+1,t=new Wb(r.f);t.a<t.c.c.length;)Yl(u=BB(n0(t),129).a,e.Math.max(u.o,i)),Ql(u,u.i-1),0==u.i&&r5(a,u,a.c.b,a.c)}function w_n(n){var t,e,i,r,c,a,u,o;for(a=new Wb(n);a.a<a.c.c.length;){for(c=BB(n0(a),79),u=(i=PTn(BB(Wtn((!c.b&&(c.b=new hK(KOt,c,4,7)),c.b),0),82))).i,o=i.j,CA(r=BB(Wtn((!c.a&&(c.a=new eU(FOt,c,6,6)),c.a),0),202),r.j+u,r.k+o),PA(r,r.b+u,r.c+o),e=new AL((!r.a&&(r.a=new $L(xOt,r,5)),r.a));e.e!=e.i.gc();)TA(t=BB(kpn(e),469),t.a+u,t.b+o);Yrn(BB(ZAn(c,(sWn(),OSt)),74),u,o)}}function d_n(n){switch(n){case 100:return mWn(snt,!0);case 68:return mWn(snt,!1);case 119:return mWn(hnt,!0);case 87:return mWn(hnt,!1);case 115:return mWn(fnt,!0);case 83:return mWn(fnt,!1);case 99:return mWn(lnt,!0);case 67:return mWn(lnt,!1);case 105:return mWn(bnt,!0);case 73:return mWn(bnt,!1);default:throw Hp(new dy(ont+n.toString(16)))}}function g_n(n){var t,i,r,c,a;switch(c=BB(xq(n.a,0),10),t=new $vn(n),WB(n.a,t),t.o.a=e.Math.max(1,c.o.a),t.o.b=e.Math.max(1,c.o.b),t.n.a=c.n.a,t.n.b=c.n.b,BB(mMn(c,(hWn(),Qft)),61).g){case 4:t.n.a+=2;break;case 1:t.n.b+=2;break;case 2:t.n.a-=2;break;case 3:t.n.b-=2}return CZ(r=new CSn,t),SZ(i=new wY,a=BB(xq(c.j,0),11)),MZ(i,r),UR(kO(r.n),a.n),UR(kO(r.a),a.a),t}function p_n(n,t,e,i,r){e&&(!i||(n.c-n.b&n.a.length-1)>1)&&1==t&&BB(n.a[n.b],10).k==(uSn(),Sut)?hFn(BB(n.a[n.b],10),(Xyn(),jCt)):i&&(!e||(n.c-n.b&n.a.length-1)>1)&&1==t&&BB(n.a[n.c-1&n.a.length-1],10).k==(uSn(),Sut)?hFn(BB(n.a[n.c-1&n.a.length-1],10),(Xyn(),ECt)):2==(n.c-n.b&n.a.length-1)?(hFn(BB(Eon(n),10),(Xyn(),jCt)),hFn(BB(Eon(n),10),ECt)):sLn(n,r),o4(n)}function v_n(n,t,i){var r,c,a,u,o;for(a=0,c=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));c.e!=c.i.gc();)u="",0==(!(r=BB(kpn(c),33)).n&&(r.n=new eU(zOt,r,1,7)),r.n).i||(u=BB(Wtn((!r.n&&(r.n=new eU(zOt,r,1,7)),r.n),0),137).a),qan(o=new csn(a++,t,u),r),hon(o,(qqn(),skt),r),o.e.b=r.j+r.f/2,o.f.a=e.Math.max(r.g,1),o.e.a=r.i+r.g/2,o.f.b=e.Math.max(r.f,1),DH(t.b,o),jCn(i.f,r,o)}function m_n(n){var t,e,i,r,c;i=BB(mMn(n,(hWn(),dlt)),33),c=BB(ZAn(i,(HXn(),Fgt)),174).Hc((mdn(),_It)),n.e||(r=BB(mMn(n,Zft),21),t=new xC(n.f.a+n.d.b+n.d.c,n.f.b+n.d.d+n.d.a),r.Hc((bDn(),lft))?(Ypn(i,ept,(QEn(),XCt)),KUn(i,t.a,t.b,!1,!0)):qy(TD(ZAn(i,Bgt)))||KUn(i,t.a,t.b,!0,!0)),Ypn(i,Fgt,c?nbn(_It):new YK(e=BB(Vj(YIt),9),BB(SR(e,e.length),9),0))}function y_n(n,t,e){var i,r,c,a;if(t[0]>=n.length)return e.o=0,!0;switch(fV(n,t[0])){case 43:r=1;break;case 45:r=-1;break;default:return e.o=0,!0}if(++t[0],c=t[0],0==(a=UIn(n,t))&&t[0]==c)return!1;if(t[0]<n.length&&58==fV(n,t[0])){if(i=60*a,++t[0],c=t[0],0==(a=UIn(n,t))&&t[0]==c)return!1;i+=a}else(i=a)<24&&t[0]-c<=2?i*=60:i=i%100+60*(i/100|0);return i*=r,e.o=-i,!0}function k_n(n){var t,e,i,r,c,a,u;for(r=new Np,i=new oz(ZL(lbn(n.b).a.Kc(),new h));dAn(i);)b5(e=BB(U5(i),17))&&WB(r,new j6(e,v9(n,e.c),v9(n,e.d)));for(u=new Kb(new Ob(n.e).a.vc().Kc());u.a.Ob();)t=BB(u.a.Pb(),42),(c=BB(t.dd(),113)).d.p=0;for(a=new Kb(new Ob(n.e).a.vc().Kc());a.a.Ob();)t=BB(a.a.Pb(),42),0==(c=BB(t.dd(),113)).d.p&&WB(n.d,RKn(n,c))}function j_n(n){var t,e,i,r,c;for(c=WJ(n),r=new AL((!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e));r.e!=r.i.gc();)if(i=BB(kpn(r),79),!Ctn(PTn(BB(Wtn((!i.c&&(i.c=new hK(KOt,i,5,8)),i.c),0),82)),c))return!0;for(e=new AL((!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d));e.e!=e.i.gc();)if(t=BB(kpn(e),79),!Ctn(PTn(BB(Wtn((!t.b&&(t.b=new hK(KOt,t,4,7)),t.b),0),82)),c))return!0;return!1}function E_n(n){var t,i,r,c,a,u,o,s;for(s=new km,o=null,i=BB(b3(t=spn(n,0)),8),c=BB(b3(t),8);t.b!=t.d.c;)o=i,i=c,c=BB(b3(t),8),a=ctn(XR(new xC(o.a,o.b),i)),u=ctn(XR(new xC(c.a,c.b),i)),r=10,r=e.Math.min(r,e.Math.abs(a.a+a.b)/2),r=e.Math.min(r,e.Math.abs(u.a+u.b)/2),a.a=HH(a.a)*r,a.b=HH(a.b)*r,u.a=HH(u.a)*r,u.b=HH(u.b)*r,DH(s,UR(a,i)),DH(s,UR(u,i));return s}function T_n(n,t,e,i){var r,c,a,u,o;return a=n.eh(),r=null,(o=n.Zg())?t&&0==(gKn(n,t,e).Bb&BQn)?(i=_pn(o.Vk(),n,i),n.uh(null),r=t.fh()):o=null:(a&&(o=a.fh()),t&&(r=t.fh())),o!=r&&o&&o.Zk(n),u=n.Vg(),n.Rg(t,e),o!=r&&r&&r.Yk(n),n.Lg()&&n.Mg()&&(a&&u>=0&&u!=e&&(c=new nU(n,1,u,a,null),i?i.Ei(c):i=c),e>=0&&(c=new nU(n,1,e,u==e?a:null,t),i?i.Ei(c):i=c)),i}function M_n(n){var t,e,i;if(null==n.b){if(i=new Sk,null!=n.i&&(cO(i,n.i),i.a+=":"),0!=(256&n.f)){for(0!=(256&n.f)&&null!=n.a&&(rQ(n.i)||(i.a+="//"),cO(i,n.a)),null!=n.d&&(i.a+="/",cO(i,n.d)),0!=(16&n.f)&&(i.a+="/"),t=0,e=n.j.length;t<e;t++)0!=t&&(i.a+="/"),cO(i,n.j[t]);null!=n.g&&(i.a+="?",cO(i,n.g))}else cO(i,n.a);null!=n.e&&(i.a+="#",cO(i,n.e)),n.b=i.a}return n.b}function S_n(n,t){var e,i,r,c,a,u;for(r=new Wb(t.a);r.a<r.c.c.length;)cL(c=mMn(i=BB(n0(r),10),(hWn(),dlt)),11)&&(u=yFn(t,i,(a=BB(c,11)).o.a,a.o.b),a.n.a=u.a,a.n.b=u.b,qCn(a,BB(mMn(i,Qft),61)));e=new xC(t.f.a+t.d.b+t.d.c,t.f.b+t.d.d+t.d.a),BB(mMn(t,(hWn(),Zft)),21).Hc((bDn(),lft))?(hon(n,(HXn(),ept),(QEn(),XCt)),BB(mMn(vW(n),Zft),21).Fc(dft),bGn(n,e,!1)):bGn(n,e,!0)}function P_n(n,t,e){var i,r,c,a,u;OTn(e,"Minimize Crossings "+n.a,1),i=0==t.b.c.length||!jE(AV(new Rq(null,new w1(t.b,16)),new aw(new Ac))).sd((dM(),tit)),u=1==t.b.c.length&&1==BB(xq(t.b,0),29).a.c.length,c=GI(mMn(t,(HXn(),sgt)))===GI((ufn(),pCt)),i||u&&!c||(Ssn(r=sxn(n,t),(a=BB(Dpn(r,0),214)).c.Rf()?a.c.Lf()?new Ud(n):new Xd(n):new zd(n)),afn(n)),HSn(e)}function C_n(n,t,e,i){var r,c,a,u;if(u=dG(cbn(SVn,rV(dG(cbn(null==t?0:nsn(t),PVn)),15))),r=dG(cbn(SVn,rV(dG(cbn(null==e?0:nsn(e),PVn)),15))),a=Zrn(n,t,u),c=Jrn(n,e,r),a&&r==a.a&&wW(e,a.g))return e;if(c&&!i)throw Hp(new _y("key already present: "+e));return a&&LLn(n,a),c&&LLn(n,c),YCn(n,new qW(e,r,t,u),c),c&&(c.e=null,c.c=null),a&&(a.e=null,a.c=null),qkn(n),a?a.g:null}function I_n(n,t,e){var i,r,c,a,u;for(c=0;c<t;c++){for(i=0,u=c+1;u<t;u++)i=rbn(rbn(cbn(e0(n[c],UQn),e0(n[u],UQn)),e0(e[c+u],UQn)),e0(dG(i),UQn)),e[c+u]=dG(i),i=jz(i,32);e[c+t]=dG(i)}for(ncn(e,e,t<<1),i=0,r=0,a=0;r<t;++r,a++)i=rbn(rbn(cbn(e0(n[r],UQn),e0(n[r],UQn)),e0(e[a],UQn)),e0(dG(i),UQn)),e[a]=dG(i),i=rbn(i=jz(i,32),e0(e[++a],UQn)),e[a]=dG(i),i=jz(i,32);return e}function O_n(n,t,i){var r,c,a,u,o,s,h,f;if(!h3(t)){for(s=Gy(MD(edn(i.c,(HXn(),Npt)))),!(h=BB(edn(i.c,Lpt),142))&&(h=new lm),r=i.a,c=null,o=t.Kc();o.Ob();)u=BB(o.Pb(),11),f=0,c?(f=s,f+=c.o.b):f=h.d,a=AN(oM(new qv,u),n.f),VW(n.k,u,a),UNn(aM(cM(rM(uM(new Hv,0),CJ(e.Math.ceil(f))),r),a)),c=u,r=a;UNn(aM(cM(rM(uM(new Hv,0),CJ(e.Math.ceil(h.a+c.o.b))),r),i.d))}}function A_n(n,t,e,i,r,c,a,u){var o,s,h;return h=!1,s=c-e.s,o=e.t-t.f+cHn(e,s,!1).a,!(i.g+u>s)&&(o+u+cHn(i,s,!1).a<=t.b&&(p9(e,c-e.s),e.c=!0,p9(i,c-e.s),Tvn(i,e.s,e.t+e.d+u),i.k=!0,xcn(e.q,i),h=!0,r&&(tin(t,i),i.j=t,n.c.length>a&&(Tkn((l1(a,n.c.length),BB(n.c[a],200)),i),0==(l1(a,n.c.length),BB(n.c[a],200)).a.c.length&&s6(n,a)))),h)}function $_n(n,t){var e,i,r,c,a;if(OTn(t,"Partition midprocessing",1),r=new pJ,JT(AV(new Rq(null,new w1(n.a,16)),new di),new ld(r)),0!=r.d){for(a=BB(P4(a1(new Rq(null,(r.i||(r.i=new HL(r,r.c))).Nc())),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),e=BB((i=a.Kc()).Pb(),19);i.Ob();)c=BB(i.Pb(),19),XLn(BB(h6(r,e),21),BB(h6(r,c),21)),e=c;HSn(t)}}function L_n(n,t,e){var i,r,c,a,u;if(0==t.p){for(t.p=1,(r=e)||(r=new rI(new Np,new YK(i=BB(Vj(FIt),9),BB(SR(i,i.length),9),0))),BB(r.a,15).Fc(t),t.k==(uSn(),Mut)&&BB(r.b,21).Fc(BB(mMn(t,(hWn(),Qft)),61)),a=new Wb(t.j);a.a<a.c.c.length;)for(c=BB(n0(a),11),u=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(c),new Gw(c)])));dAn(u);)L_n(n,BB(U5(u),11).i,r);return r}return null}function N_n(n,t){var e,i,r,c,a;if(n.Ab)if(n.Ab){if((a=n.Ab.i)>0)if(r=BB(n.Ab.g,1934),null==t){for(c=0;c<a;++c)if(null==(e=r[c]).d)return e}else for(c=0;c<a;++c)if(mK(t,(e=r[c]).d))return e}else if(null==t){for(i=new AL(n.Ab);i.e!=i.i.gc();)if(null==(e=BB(kpn(i),590)).d)return e}else for(i=new AL(n.Ab);i.e!=i.i.gc();)if(mK(t,(e=BB(kpn(i),590)).d))return e;return null}function x_n(n,t){var e,i,r,c,a,u,o;if(null==(o=TD(mMn(t,(CAn(),Nkt))))||(kW(o),o)){for(DOn(n,t),r=new Np,u=spn(t.b,0);u.b!=u.d.c;)(e=xPn(n,BB(b3(u),86),null))&&(qan(e,t),r.c[r.c.length]=e);if(n.a=null,n.b=null,r.c.length>1)for(i=new Wb(r);i.a<i.c.c.length;)for(c=0,a=spn((e=BB(n0(i),135)).b,0);a.b!=a.d.c;)BB(b3(a),86).g=c++;return r}return u6(Pun(Gk(Gyt,1),tZn,135,0,[t]))}function D_n(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p;crn(b=A3(n,qun(t),r),R2(r,q6n)),d=D2(w=r,U6n),cSn(new Lg(b).a,d),g=D2(w,"endPoint"),rSn(new Rg(b).a,g),p=N2(w,D6n),SEn(new Fg(b).a,p),f=R2(r,K6n),qR((c=new hI(n,b)).a,c.b,f),l=R2(r,R6n),GR((a=new fI(n,b)).a,a.b,l),s=N2(r,F6n),Fyn((u=new lI(e,b)).b,u.a,s),h=N2(r,_6n),Byn((o=new bI(i,b)).b,o.a,h)}function R_n(n,t,e){var i,r,c,a,u;switch(u=null,t.g){case 1:for(r=new Wb(n.j);r.a<r.c.c.length;)if(qy(TD(mMn(i=BB(n0(r),11),(hWn(),tlt)))))return i;hon(u=new CSn,(hWn(),tlt),(hN(),!0));break;case 2:for(a=new Wb(n.j);a.a<a.c.c.length;)if(qy(TD(mMn(c=BB(n0(a),11),(hWn(),klt)))))return c;hon(u=new CSn,(hWn(),klt),(hN(),!0))}return u&&(CZ(u,n),qCn(u,e),yvn(u.n,n.o,e)),u}function K_n(n,t){var i,r,c,a,u,o;for(o=-1,u=new YT,r=new m6(n.b);y$(r.a)||y$(r.b);){for(i=BB(y$(r.a)?n0(r.a):n0(r.b),17),o=e.Math.max(o,Gy(MD(mMn(i,(HXn(),agt))))),i.c==n?JT(AV(new Rq(null,new w1(i.b,16)),new fe),new nd(u)):JT(AV(new Rq(null,new w1(i.b,16)),new le),new td(u)),a=spn(u,0);a.b!=a.d.c;)Lx(c=BB(b3(a),70),(hWn(),Uft))||hon(c,Uft,i);gun(t,u),yQ(u)}return o}function __n(n,t,e,i,r){var c,a,u,o;Bl(c=new $vn(n),(uSn(),Iut)),hon(c,(HXn(),ept),(QEn(),XCt)),hon(c,(hWn(),dlt),t.c.i),hon(a=new CSn,dlt,t.c),qCn(a,r),CZ(a,c),hon(t.c,Elt,c),Bl(u=new $vn(n),Iut),hon(u,ept,XCt),hon(u,dlt,t.d.i),hon(o=new CSn,dlt,t.d),qCn(o,r),CZ(o,u),hon(t.d,Elt,u),SZ(t,a),MZ(t,o),LZ(0,e.c.length),MS(e.c,0,c),i.c[i.c.length]=u,hon(c,Bft,iln(1)),hon(u,Bft,iln(1))}function F_n(n,t,i,r,c){var a,u,o,s,h;o=c?r.b:r.a,FT(n.a,r)||(h=o>i.s&&o<i.c,s=!1,0!=i.e.b&&0!=i.j.b&&(s|=e.Math.abs(o-Gy(MD(gx(i.e))))<lZn&&e.Math.abs(o-Gy(MD(gx(i.j))))<lZn,s|=e.Math.abs(o-Gy(MD(px(i.e))))<lZn&&e.Math.abs(o-Gy(MD(px(i.j))))<lZn),(h||s)&&((u=BB(mMn(t,(HXn(),vgt)),74))||(u=new km,hon(t,vgt,u)),r5(u,a=new wA(r),u.c.b,u.c),TU(n.a,a)))}function B_n(n,t,e,i){var r,c,a,u,o,s,h;if(WIn(n,t,e,i))return!0;for(a=new Wb(t.f);a.a<a.c.c.length;){switch(c=BB(n0(a),324),u=!1,s=(o=n.j-t.j+e)+t.o,r=(h=n.k-t.k+i)+t.p,c.a.g){case 0:u=Osn(n,o+c.b.a,0,o+c.c.a,h-1);break;case 1:u=Osn(n,s,h+c.b.a,n.o-1,h+c.c.a);break;case 2:u=Osn(n,o+c.b.a,r,o+c.c.a,n.p-1);break;default:u=Osn(n,0,h+c.b.a,o-1,h+c.c.a)}if(u)return!0}return!1}function H_n(n,t){var e,i,r,c,a,u,o,s;for(c=new Wb(t.b);c.a<c.c.c.length;)for(o=new Wb(BB(n0(c),29).a);o.a<o.c.c.length;){for(u=BB(n0(o),10),s=new Np,a=0,i=new oz(ZL(fbn(u).a.Kc(),new h));dAn(i);)b5(e=BB(U5(i),17))||!b5(e)&&e.c.i.c==e.d.i.c||((r=BB(mMn(e,(HXn(),bpt)),19).a)>a&&(a=r,s.c=x8(Ant,HWn,1,0,5,1)),r==a&&WB(s,new rI(e.c.i,e)));SQ(),m$(s,n.c),kG(n.b,u.p,s)}}function q_n(n,t){var e,i,r,c,a,u,o,s;for(c=new Wb(t.b);c.a<c.c.c.length;)for(o=new Wb(BB(n0(c),29).a);o.a<o.c.c.length;){for(u=BB(n0(o),10),s=new Np,a=0,i=new oz(ZL(lbn(u).a.Kc(),new h));dAn(i);)b5(e=BB(U5(i),17))||!b5(e)&&e.c.i.c==e.d.i.c||((r=BB(mMn(e,(HXn(),bpt)),19).a)>a&&(a=r,s.c=x8(Ant,HWn,1,0,5,1)),r==a&&WB(s,new rI(e.d.i,e)));SQ(),m$(s,n.c),kG(n.f,u.p,s)}}function G_n(n){NM(n,new MTn(vj(wj(pj(gj(new du,l5n),"ELK Box"),"Algorithm for packing of unconnected boxes, i.e. graphs without edges."),new xu))),u2(n,l5n,QJn,zMt),u2(n,l5n,vZn,15),u2(n,l5n,pZn,iln(0)),u2(n,l5n,A4n,mpn(_Mt)),u2(n,l5n,PZn,mpn(BMt)),u2(n,l5n,SZn,mpn(qMt)),u2(n,l5n,VJn,f5n),u2(n,l5n,jZn,mpn(FMt)),u2(n,l5n,BZn,mpn(HMt)),u2(n,l5n,b5n,mpn(RMt)),u2(n,l5n,u3n,mpn(KMt))}function z_n(n,t){var e,i,r,c,a,u,o,s,h;if(a=(r=n.i).o.a,c=r.o.b,a<=0&&c<=0)return kUn(),PIt;switch(s=n.n.a,h=n.n.b,u=n.o.a,e=n.o.b,t.g){case 2:case 1:if(s<0)return kUn(),CIt;if(s+u>a)return kUn(),oIt;break;case 4:case 3:if(h<0)return kUn(),sIt;if(h+e>c)return kUn(),SIt}return(o=(s+u/2)/a)+(i=(h+e/2)/c)<=1&&o-i<=0?(kUn(),CIt):o+i>=1&&o-i>=0?(kUn(),oIt):i<.5?(kUn(),sIt):(kUn(),SIt)}function U_n(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;for(e=!1,o=Gy(MD(mMn(t,(HXn(),Opt)))),l=KVn*o,r=new Wb(t.b);r.a<r.c.c.length;)for(i=BB(n0(r),29),c=BB(n0(u=new Wb(i.a)),10),s=wU(n.a[c.p]);u.a<u.c.c.length;)a=BB(n0(u),10),s!=(h=wU(n.a[a.p]))&&(f=K$(n.b,c,a),c.n.b+c.o.b+c.d.a+s.a+f>a.n.b-a.d.d+h.a+l&&(b=s.g+h.g,h.a=(h.g*h.a+s.g*s.a)/b,h.g=b,s.f=h,e=!0)),c=a,s=h;return e}function X_n(n,t,e,i,r,c,a){var u,o,s,h,f;for(f=new bA,o=t.Kc();o.Ob();)for(h=new Wb(BB(o.Pb(),839).wf());h.a<h.c.c.length;)GI((s=BB(n0(h),181)).We((sWn(),gSt)))===GI((Rtn(),XPt))&&(rKn(f,s,!1,i,r,c,a),CPn(n,f));for(u=e.Kc();u.Ob();)for(h=new Wb(BB(u.Pb(),839).wf());h.a<h.c.c.length;)GI((s=BB(n0(h),181)).We((sWn(),gSt)))===GI((Rtn(),UPt))&&(rKn(f,s,!0,i,r,c,a),CPn(n,f))}function W_n(n,t,e){var i,r,c,a,u,o,s;for(a=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));a.e!=a.i.gc();)for(r=new oz(ZL(dLn(c=BB(kpn(a),33)).a.Kc(),new h));dAn(r);)nAn(i=BB(U5(r),79))||nAn(i)||QIn(i)||(o=BB(qI(AY(e.f,c)),86),s=BB(RX(e,PTn(BB(Wtn((!i.c&&(i.c=new hK(KOt,i,5,8)),i.c),0),82))),86),o&&s&&(hon(u=new UQ(o,s),(qqn(),skt),i),qan(u,i),DH(o.d,u),DH(s.b,u),DH(t.a,u)))}function V_n(n,t){var i,r,c,a,u,o,s;for(o=BB(BB(h6(n.r,t),21),84).Kc();o.Ob();)(r=(u=BB(o.Pb(),111)).c?WH(u.c):0)>0?u.a?r>(s=u.b.rf().b)&&(n.v||1==u.c.d.c.length?(a=(r-s)/2,u.d.d=a,u.d.a=a):(i=(BB(xq(u.c.d,0),181).rf().b-s)/2,u.d.d=e.Math.max(0,i),u.d.a=r-i-s)):u.d.a=n.t+r:Hz(n.u)&&((c=_Tn(u.b)).d<0&&(u.d.d=-c.d),c.d+c.a>u.b.rf().b&&(u.d.a=c.d+c.a-u.b.rf().b))}function Q_n(n,t){var e;switch(vnn(n)){case 6:return XI(t);case 7:return UI(t);case 8:return zI(t);case 3:return Array.isArray(t)&&!((e=vnn(t))>=14&&e<=16);case 11:return null!=t&&typeof t===xWn;case 12:return null!=t&&(typeof t===AWn||typeof t==xWn);case 0:return Qpn(t,n.__elementTypeId$);case 2:return DU(t)&&!(t.im===I);case 1:return DU(t)&&!(t.im===I)||Qpn(t,n.__elementTypeId$);default:return!0}}function Y_n(n,t){var i,r,c,a;return r=e.Math.min(e.Math.abs(n.c-(t.c+t.b)),e.Math.abs(n.c+n.b-t.c)),a=e.Math.min(e.Math.abs(n.d-(t.d+t.a)),e.Math.abs(n.d+n.a-t.d)),(i=e.Math.abs(n.c+n.b/2-(t.c+t.b/2)))>n.b/2+t.b/2||(c=e.Math.abs(n.d+n.a/2-(t.d+t.a/2)))>n.a/2+t.a/2?1:0==i&&0==c?0:0==i?a/c+1:0==c?r/i+1:e.Math.min(r/i,a/c)+1}function J_n(n,t){var i,r,c,a,u,o;return(c=iin(n))==(o=iin(t))?n.e==t.e&&n.a<54&&t.a<54?n.f<t.f?-1:n.f>t.f?1:0:(r=n.e-t.e,(i=(n.d>0?n.d:e.Math.floor((n.a-1)*zQn)+1)-(t.d>0?t.d:e.Math.floor((t.a-1)*zQn)+1))>r+1?c:i<r-1?-c:(!n.c&&(n.c=yhn(n.f)),a=n.c,!t.c&&(t.c=yhn(t.f)),u=t.c,r<0?a=Nnn(a,kBn(-r)):r>0&&(u=Nnn(u,kBn(r))),tgn(a,u))):c<o?-1:1}function Z_n(n,t){var e,i,r,c,a,u,o;for(c=0,u=0,o=0,r=new Wb(n.f.e);r.a<r.c.c.length;)t!=(i=BB(n0(r),144))&&(c+=a=n.i[t.b][i.b],(e=W8(t.d,i.d))>0&&n.d!=(q7(),Aat)&&(u+=a*(i.d.a+n.a[t.b][i.b]*(t.d.a-i.d.a)/e)),e>0&&n.d!=(q7(),Iat)&&(o+=a*(i.d.b+n.a[t.b][i.b]*(t.d.b-i.d.b)/e)));switch(n.d.g){case 1:return new xC(u/c,t.d.b);case 2:return new xC(t.d.a,o/c);default:return new xC(u/c,o/c)}}function nFn(n,t){var e,i,r,c;if(zsn(),c=BB(mMn(n.i,(HXn(),ept)),98),0!=n.j.g-t.j.g||c!=(QEn(),UCt)&&c!=WCt&&c!=XCt)return 0;if(c==(QEn(),UCt)&&(e=BB(mMn(n,ipt),19),i=BB(mMn(t,ipt),19),e&&i&&0!=(r=e.a-i.a)))return r;switch(n.j.g){case 1:return Pln(n.n.a,t.n.a);case 2:return Pln(n.n.b,t.n.b);case 3:return Pln(t.n.a,n.n.a);case 4:return Pln(t.n.b,n.n.b);default:throw Hp(new Fy(r1n))}}function tFn(n){var t,e,i,r,c;for(WB(c=new J6((!n.a&&(n.a=new $L(xOt,n,5)),n.a).i+2),new xC(n.j,n.k)),JT(new Rq(null,(!n.a&&(n.a=new $L(xOt,n,5)),new w1(n.a,16))),new Ig(c)),WB(c,new xC(n.b,n.c)),t=1;t<c.c.length-1;)l1(t-1,c.c.length),e=BB(c.c[t-1],8),l1(t,c.c.length),i=BB(c.c[t],8),l1(t+1,c.c.length),r=BB(c.c[t+1],8),e.a==i.a&&i.a==r.a||e.b==i.b&&i.b==r.b?s6(c,t):++t;return c}function eFn(n,t){var e,i,r,c,a,u,o;for(e=ON(iM(tM(eM(new Wv,t),new gY(t.e)),gst),n.a),0==t.j.c.length||V9(BB(xq(t.j,0),57).a,e),o=new Dp,VW(n.e,e,o),a=new Rv,u=new Rv,c=new Wb(t.k);c.a<c.c.c.length;)TU(a,(r=BB(n0(c),17)).c),TU(u,r.d);(i=a.a.gc()-u.a.gc())<0?(Uun(o,!0,(Ffn(),_Pt)),Uun(o,!1,FPt)):i>0&&(Uun(o,!1,(Ffn(),_Pt)),Uun(o,!0,FPt)),Otn(t.g,new sP(n,e)),VW(n.g,t,e)}function iFn(){var n;for(iFn=O,Ltt=Pun(Gk(ANt,1),hQn,25,15,[-1,-1,30,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5]),Ntt=x8(ANt,hQn,25,37,15,1),xtt=Pun(Gk(ANt,1),hQn,25,15,[-1,-1,63,40,32,28,25,23,21,20,19,19,18,18,17,17,16,16,16,15,15,15,15,14,14,14,14,14,14,13,13,13,13,13,13,13,13]),Dtt=x8(LNt,FQn,25,37,14,1),n=2;n<=36;n++)Ntt[n]=CJ(e.Math.pow(n,Ltt[n])),Dtt[n]=Ojn(bVn,Ntt[n])}function rFn(n){var t;if(1!=(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)throw Hp(new _y(B5n+(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i));return t=new km,bun(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82))&&Frn(t,zXn(n,bun(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)),!1)),bun(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))&&Frn(t,zXn(n,bun(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82)),!0)),t}function cFn(n,t){var e,i,r;for(r=!1,i=new oz(ZL((t.d?n.a.c==(gJ(),tyt)?fbn(t.b):lbn(t.b):n.a.c==(gJ(),nyt)?fbn(t.b):lbn(t.b)).a.Kc(),new h));dAn(i);)if(e=BB(U5(i),17),(qy(n.a.f[n.a.g[t.b.p].p])||b5(e)||e.c.i.c!=e.d.i.c)&&!qy(n.a.n[n.a.g[t.b.p].p])&&!qy(n.a.n[n.a.g[t.b.p].p])&&(r=!0,FT(n.b,n.a.g[Lmn(e,t.b).p])))return t.c=!0,t.a=e,t;return t.c=r,t.a=null,t}function aFn(n,t,e,i,r){var c,a,u,o,s,h,f;for(SQ(),m$(n,new Xu),u=new M2(n,0),f=new Np,c=0;u.b<u.d.gc();)Px(u.b<u.d.gc()),a=BB(u.d.Xb(u.c=u.b++),157),0!=f.c.length&&iG(a)*eG(a)>2*c?(h=new Gtn(f),s=iG(a)/eG(a),o=yXn(h,t,new bm,e,i,r,s),UR(kO(h.e),o),f.c=x8(Ant,HWn,1,0,5,1),c=0,f.c[f.c.length]=h,f.c[f.c.length]=a,c=iG(h)*eG(h)+iG(a)*eG(a)):(f.c[f.c.length]=a,c+=iG(a)*eG(a));return f}function uFn(n,t,e){var i,r,c,a,u,o,s;if(0==(i=e.gc()))return!1;if(n.ej())if(o=n.fj(),kwn(n,t,e),a=1==i?n.Zi(3,null,e.Kc().Pb(),t,o):n.Zi(5,null,e,t,o),n.bj()){for(u=i<100?null:new Fj(i),c=t+i,r=t;r<c;++r)s=n.Oi(r),u=n.cj(s,u);u?(u.Ei(a),u.Fi()):n.$i(a)}else n.$i(a);else if(kwn(n,t,e),n.bj()){for(u=i<100?null:new Fj(i),c=t+i,r=t;r<c;++r)u=n.cj(n.Oi(r),u);u&&u.Fi()}return!0}function oFn(n,t,e){var i,r,c,a;return n.ej()?(r=null,c=n.fj(),i=n.Zi(1,a=n.Ui(t,n.oi(t,e)),e,t,c),n.bj()&&!(n.ni()&&a?Nfn(a,e):GI(a)===GI(e))?(a&&(r=n.dj(a,r)),(r=n.cj(e,r))?(r.Ei(i),r.Fi()):n.$i(i)):r?(r.Ei(i),r.Fi()):n.$i(i),a):(a=n.Ui(t,n.oi(t,e)),n.bj()&&!(n.ni()&&a?Nfn(a,e):GI(a)===GI(e))&&(r=null,a&&(r=n.dj(a,null)),(r=n.cj(e,r))&&r.Fi()),a)}function sFn(n,t){var i,r,c,a,u,o,s,h;if(n.e=t,n.f=BB(mMn(t,(Mrn(),hat)),230),XTn(t),n.d=e.Math.max(16*t.e.c.length+t.c.c.length,256),!qy(TD(mMn(t,(fRn(),Hct)))))for(h=n.e.e.c.length,o=new Wb(t.e);o.a<o.c.c.length;)(s=BB(n0(o),144).d).a=OG(n.f)*h,s.b=OG(n.f)*h;for(i=t.b,a=new Wb(t.c);a.a<a.c.c.length;)if(c=BB(n0(a),282),(r=BB(mMn(c,eat),19).a)>0){for(u=0;u<r;u++)WB(i,new hX(c));BCn(c)}}function hFn(n,t){var i,r,c,a,u;if(n.k==(uSn(),Sut)&&(i=jE(AV(BB(mMn(n,(hWn(),Plt)),15).Oc(),new aw(new ri))).sd((dM(),tit))?t:(Xyn(),TCt),hon(n,ult,i),i!=(Xyn(),ECt)))for(r=BB(mMn(n,dlt),17),u=Gy(MD(mMn(r,(HXn(),agt)))),a=0,i==jCt?a=n.o.b-e.Math.ceil(u/2):i==TCt&&(n.o.b-=Gy(MD(mMn(vW(n),jpt))),a=(n.o.b-e.Math.ceil(u))/2),c=new Wb(n.j);c.a<c.c.c.length;)BB(n0(c),11).n.b=a}function fFn(){fFn=O,JM(),TNt=new Rh,Pun(Gk(A$t,2),sVn,368,0,[Pun(Gk(A$t,1),jnt,592,0,[new UE(z7n)])]),Pun(Gk(A$t,2),sVn,368,0,[Pun(Gk(A$t,1),jnt,592,0,[new UE(U7n)])]),Pun(Gk(A$t,2),sVn,368,0,[Pun(Gk(A$t,1),jnt,592,0,[new UE(X7n)]),Pun(Gk(A$t,1),jnt,592,0,[new UE(U7n)])]),new $A("-1"),Pun(Gk(A$t,2),sVn,368,0,[Pun(Gk(A$t,1),jnt,592,0,[new UE("\\c+")])]),new $A("0"),new $A("0"),new $A("1"),new $A("0"),new $A(int)}function lFn(n){var t,e;return n.c&&n.c.kh()&&(e=BB(n.c,49),n.c=BB(tfn(n,e),138),n.c!=e&&(0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,9,2,e,n.c)),cL(n.Cb,399)?n.Db>>16==-15&&n.Cb.nh()&&$7(new k9(n.Cb,9,13,e,n.c,uvn(H7(BB(n.Cb,59)),n))):cL(n.Cb,88)&&n.Db>>16==-23&&n.Cb.nh()&&(cL(t=n.c,88)||(gWn(),t=d$t),cL(e,88)||(gWn(),e=d$t),$7(new k9(n.Cb,9,10,e,t,uvn(a4(BB(n.Cb,26)),n)))))),n.c}function bFn(n,t){var e,i,r,c,a,u,o,s;for(OTn(t,"Hypernodes processing",1),i=new Wb(n.b);i.a<i.c.c.length;)for(a=new Wb(BB(n0(i),29).a);a.a<a.c.c.length;)if(qy(TD(mMn(c=BB(n0(a),10),(HXn(),bgt))))&&c.j.c.length<=2){for(s=0,o=0,e=0,r=0,u=new Wb(c.j);u.a<u.c.c.length;)switch(BB(n0(u),11).j.g){case 1:++s;break;case 2:++o;break;case 3:++e;break;case 4:++r}0==s&&0==e&&jXn(n,c,r<=o)}HSn(t)}function wFn(n,t){var e,i,r,c,a,u,o,s,h;for(OTn(t,"Layer constraint edge reversal",1),a=new Wb(n.b);a.a<a.c.c.length;){for(c=BB(n0(a),29),h=-1,e=new Np,s=n2(c.a),r=0;r<s.length;r++)i=BB(mMn(s[r],(hWn(),ilt)),303),-1==h?i!=(z7(),Cft)&&(h=r):i==(z7(),Cft)&&(PZ(s[r],null),Qyn(s[r],h++,c)),i==(z7(),Sft)&&WB(e,s[r]);for(o=new Wb(e);o.a<o.c.c.length;)PZ(u=BB(n0(o),10),null),PZ(u,c)}HSn(t)}function dFn(n,t,e){var i,r,c,a,u,o,s,h;for(OTn(e,"Hyperedge merging",1),xAn(n,t),u=new M2(t.b,0);u.b<u.d.gc();)if(Px(u.b<u.d.gc()),0!=(s=BB(u.d.Xb(u.c=u.b++),29).a).c.length)for(i=null,r=null,c=null,a=null,o=0;o<s.c.length;o++)l1(o,s.c.length),(r=(i=BB(s.c[o],10)).k)==(uSn(),Put)&&a==Put&&(h=hHn(i,c)).a&&(rDn(i,c,h.b,h.c),l1(o,s.c.length),PE(s.c,o,1),--o,i=c,r=a),c=i,a=r;HSn(e)}function gFn(n,t){var e,i,r;i=0!=H$n(n.d,1),!qy(TD(mMn(t.j,(hWn(),Jft))))&&!qy(TD(mMn(t.j,Ilt)))||GI(mMn(t.j,(HXn(),Ldt)))===GI((mon(),Nvt))?t.c.Tf(t.e,i):i=qy(TD(mMn(t.j,Jft))),DNn(n,t,i,!0),qy(TD(mMn(t.j,Ilt)))&&hon(t.j,Ilt,(hN(),!1)),qy(TD(mMn(t.j,Jft)))&&(hon(t.j,Jft,(hN(),!1)),hon(t.j,Ilt,!0)),e=eKn(n,t);do{if($rn(n),0==e)return 0;r=e,DNn(n,t,i=!i,!1),e=eKn(n,t)}while(r>e);return r}function pFn(n,t){var e,i,r;i=0!=H$n(n.d,1),!qy(TD(mMn(t.j,(hWn(),Jft))))&&!qy(TD(mMn(t.j,Ilt)))||GI(mMn(t.j,(HXn(),Ldt)))===GI((mon(),Nvt))?t.c.Tf(t.e,i):i=qy(TD(mMn(t.j,Jft))),DNn(n,t,i,!0),qy(TD(mMn(t.j,Ilt)))&&hon(t.j,Ilt,(hN(),!1)),qy(TD(mMn(t.j,Jft)))&&(hon(t.j,Jft,(hN(),!1)),hon(t.j,Ilt,!0)),e=nCn(n,t);do{if($rn(n),0==e)return 0;r=e,DNn(n,t,i=!i,!1),e=nCn(n,t)}while(r>e);return r}function vFn(n,t,e){var i,r,c,a,u,o,s;if(t==e)return!0;if(t=bAn(n,t),e=bAn(n,e),i=qvn(t)){if((o=qvn(e))!=i)return!!o&&(a=i.Dj())==o.Dj()&&null!=a;if(!t.d&&(t.d=new $L(VAt,t,1)),r=(c=t.d).i,!e.d&&(e.d=new $L(VAt,e,1)),r==(s=e.d).i)for(u=0;u<r;++u)if(!vFn(n,BB(Wtn(c,u),87),BB(Wtn(s,u),87)))return!1;return!0}return t.e==e.e}function mFn(n,t,e,i){var r,c,a,u,o,s,h,f;if($xn(n.e,t)){for(f=axn(n.e.Tg(),t),c=BB(n.g,119),h=null,o=-1,u=-1,r=0,s=0;s<n.i;++s)a=c[s],f.rl(a.ak())&&(r==e&&(o=s),r==i&&(u=s,h=a.dd()),++r);if(-1==o)throw Hp(new Ay(u8n+e+o8n+r));if(-1==u)throw Hp(new Ay(s8n+i+o8n+r));return Iln(n,o,u),mA(n.e)&&Lv(n,LY(n,7,t,iln(i),h,e,!0)),h}throw Hp(new _y("The feature must be many-valued to support move"))}function yFn(n,t,e,i){var r,c,a,u,o;switch((o=new wA(t.n)).a+=t.o.a/2,o.b+=t.o.b/2,u=Gy(MD(mMn(t,(HXn(),tpt)))),c=n.f,a=n.d,r=n.c,BB(mMn(t,(hWn(),Qft)),61).g){case 1:o.a+=a.b+r.a-e/2,o.b=-i-u,t.n.b=-(a.d+u+r.b);break;case 2:o.a=c.a+a.b+a.c+u,o.b+=a.d+r.b-i/2,t.n.a=c.a+a.c+u-r.a;break;case 3:o.a+=a.b+r.a-e/2,o.b=c.b+a.d+a.a+u,t.n.b=c.b+a.a+u-r.b;break;case 4:o.a=-e-u,o.b+=a.d+r.b-i/2,t.n.a=-(a.b+u+r.a)}return o}function kFn(n){var t,e,i,r,c,a;return qan(i=new min,n),GI(mMn(i,(HXn(),Udt)))===GI((Ffn(),BPt))&&hon(i,Udt,Wln(i)),null==mMn(i,(C6(),TMt))&&(a=BB($Mn(n),160),hon(i,TMt,iO(a.We(TMt)))),hon(i,(hWn(),dlt),n),hon(i,Zft,new YK(t=BB(Vj(Tft),9),BB(SR(t,t.length),9),0)),r=Pzn((JJ(n)&&(GM(),new Dy(JJ(n))),GM(),new JN(JJ(n)?new Dy(JJ(n)):null,n)),FPt),c=BB(mMn(i,zgt),116),eZ(e=i.d,c),eZ(e,r),i}function jFn(n,t,e){var i,r;i=t.c.i,r=e.d.i,i.k==(uSn(),Put)?(hon(n,(hWn(),hlt),BB(mMn(i,hlt),11)),hon(n,flt,BB(mMn(i,flt),11)),hon(n,slt,TD(mMn(i,slt)))):i.k==Sut?(hon(n,(hWn(),hlt),BB(mMn(i,hlt),11)),hon(n,flt,BB(mMn(i,flt),11)),hon(n,slt,(hN(),!0))):r.k==Sut?(hon(n,(hWn(),hlt),BB(mMn(r,hlt),11)),hon(n,flt,BB(mMn(r,flt),11)),hon(n,slt,(hN(),!0))):(hon(n,(hWn(),hlt),t.c),hon(n,flt,e.d))}function EFn(n){var t,e,i,r,c,a,u;for(n.o=new Lp,i=new YT,a=new Wb(n.e.a);a.a<a.c.c.length;)1==kbn(c=BB(n0(a),121)).c.length&&r5(i,c,i.c.b,i.c);for(;0!=i.b;)0!=kbn(c=BB(0==i.b?null:(Px(0!=i.b),Atn(i,i.a.a)),121)).c.length&&(t=BB(xq(kbn(c),0),213),e=c.g.a.c.length>0,u=Nbn(t,c),KN(e?u.b:u.g,t),1==kbn(u).c.length&&r5(i,u,i.c.b,i.c),r=new rI(c,t),d3(n.o,r),y7(n.e.a,c))}function TFn(n,t){var i,r,c,a;return r=e.Math.abs(qz(n.b).a-qz(t.b).a),a=e.Math.abs(qz(n.b).b-qz(t.b).b),i=1,c=1,r>n.b.b/2+t.b.b/2&&(i=1-e.Math.min(e.Math.abs(n.b.c-(t.b.c+t.b.b)),e.Math.abs(n.b.c+n.b.b-t.b.c))/r),a>n.b.a/2+t.b.a/2&&(c=1-e.Math.min(e.Math.abs(n.b.d-(t.b.d+t.b.a)),e.Math.abs(n.b.d+n.b.a-t.b.d))/a),(1-e.Math.min(i,c))*e.Math.sqrt(r*r+a*a)}function MFn(n){var t,e,i;for(nUn(n,n.e,n.f,(dJ(),Lyt),!0,n.c,n.i),nUn(n,n.e,n.f,Lyt,!1,n.c,n.i),nUn(n,n.e,n.f,Nyt,!0,n.c,n.i),nUn(n,n.e,n.f,Nyt,!1,n.c,n.i),IFn(n,n.c,n.e,n.f,n.i),e=new M2(n.i,0);e.b<e.d.gc();)for(Px(e.b<e.d.gc()),t=BB(e.d.Xb(e.c=e.b++),128),i=new M2(n.i,e.b);i.b<i.d.gc();)Px(i.b<i.d.gc()),Nqn(t,BB(i.d.Xb(i.c=i.b++),128));IXn(n.i,BB(mMn(n.d,(hWn(),Slt)),230)),GGn(n.i)}function SFn(n,t){var e,i;if(null!=t)if(i=iyn(n)){if(0==(1&i.i))return nS(),!(e=BB(RX(mAt,i),55))||e.wj(t);if(i==$Nt)return zI(t);if(i==ANt)return cL(t,19);if(i==DNt)return cL(t,155);if(i==NNt)return cL(t,217);if(i==ONt)return cL(t,172);if(i==xNt)return UI(t);if(i==RNt)return cL(t,184);if(i==LNt)return cL(t,162)}else if(cL(t,56))return n.uk(BB(t,56));return!1}function PFn(){var n,t,e,i,r,c,a,u,o;for(PFn=O,WLt=x8(NNt,v6n,25,255,15,1),VLt=x8(ONt,WVn,25,64,15,1),t=0;t<255;t++)WLt[t]=-1;for(e=90;e>=65;e--)WLt[e]=e-65<<24>>24;for(i=122;i>=97;i--)WLt[i]=i-97+26<<24>>24;for(r=57;r>=48;r--)WLt[r]=r-48+52<<24>>24;for(WLt[43]=62,WLt[47]=63,c=0;c<=25;c++)VLt[c]=65+c&QVn;for(a=26,o=0;a<=51;++a,o++)VLt[a]=97+o&QVn;for(n=52,u=0;n<=61;++n,u++)VLt[n]=48+u&QVn;VLt[62]=43,VLt[63]=47}function CFn(n,t){var i,r,c,a,u,o,s,h,f,l,b;if(n.dc())return new Gj;for(s=0,f=0,r=n.Kc();r.Ob();)c=BB(r.Pb(),37).f,s=e.Math.max(s,c.a),f+=c.a*c.b;for(s=e.Math.max(s,e.Math.sqrt(f)*Gy(MD(mMn(BB(n.Kc().Pb(),37),(HXn(),Edt))))),l=0,b=0,o=0,i=t,u=n.Kc();u.Ob();)l+(h=(a=BB(u.Pb(),37)).f).a>s&&(l=0,b+=o+t,o=0),ZRn(a,l,b),i=e.Math.max(i,l+h.a),o=e.Math.max(o,h.b),l+=h.a+t;return new xC(i+t,b+o+t)}function IFn(n,t,e,i,r){var c,a,u,o,s,h,f;for(a=new Wb(t);a.a<a.c.c.length;){if(o=(c=BB(n0(a),17)).c,e.a._b(o))dJ(),s=Lyt;else{if(!i.a._b(o))throw Hp(new _y("Source port must be in one of the port sets."));dJ(),s=Nyt}if(h=c.d,e.a._b(h))dJ(),f=Lyt;else{if(!i.a._b(h))throw Hp(new _y("Target port must be in one of the port sets."));dJ(),f=Nyt}u=new tCn(c,s,f),VW(n.b,c,u),r.c[r.c.length]=u}}function OFn(n,t){var e,i,r,c,a,u,o;if(!WJ(n))throw Hp(new Fy(F5n));if(c=(i=WJ(n)).g,r=i.f,c<=0&&r<=0)return kUn(),PIt;switch(u=n.i,o=n.j,t.g){case 2:case 1:if(u<0)return kUn(),CIt;if(u+n.g>c)return kUn(),oIt;break;case 4:case 3:if(o<0)return kUn(),sIt;if(o+n.f>r)return kUn(),SIt}return(a=(u+n.g/2)/c)+(e=(o+n.f/2)/r)<=1&&a-e<=0?(kUn(),CIt):a+e>=1&&a-e>=0?(kUn(),oIt):e<.5?(kUn(),sIt):(kUn(),SIt)}function AFn(n,t,e,i,r){var c,a;if(c=rbn(e0(t[0],UQn),e0(i[0],UQn)),n[0]=dG(c),c=kz(c,32),e>=r){for(a=1;a<r;a++)c=rbn(c,rbn(e0(t[a],UQn),e0(i[a],UQn))),n[a]=dG(c),c=kz(c,32);for(;a<e;a++)c=rbn(c,e0(t[a],UQn)),n[a]=dG(c),c=kz(c,32)}else{for(a=1;a<e;a++)c=rbn(c,rbn(e0(t[a],UQn),e0(i[a],UQn))),n[a]=dG(c),c=kz(c,32);for(;a<r;a++)c=rbn(c,e0(i[a],UQn)),n[a]=dG(c),c=kz(c,32)}0!=Vhn(c,0)&&(n[a]=dG(c))}function $Fn(n){var t,e,i,r,c,a;if(wWn(),4!=n.e&&5!=n.e)throw Hp(new _y("Token#complementRanges(): must be RANGE: "+n.e));for(T$n(c=n),qHn(c),i=c.b.length+2,0==c.b[0]&&(i-=2),(e=c.b[c.b.length-1])==unt&&(i-=2),(r=new M0(4)).b=x8(ANt,hQn,25,i,15,1),a=0,c.b[0]>0&&(r.b[a++]=0,r.b[a++]=c.b[0]-1),t=1;t<c.b.length-2;t+=2)r.b[a++]=c.b[t]+1,r.b[a++]=c.b[t+1]-1;return e!=unt&&(r.b[a++]=e+1,r.b[a]=unt),r.a=!0,r}function LFn(n,t,e){var i,r,c,a,u,o,s,h;if(0==(i=e.gc()))return!1;if(n.ej())if(s=n.fj(),BTn(n,t,e),a=1==i?n.Zi(3,null,e.Kc().Pb(),t,s):n.Zi(5,null,e,t,s),n.bj()){for(u=i<100?null:new Fj(i),c=t+i,r=t;r<c;++r)h=n.g[r],u=n.cj(h,u),u=n.jj(h,u);u?(u.Ei(a),u.Fi()):n.$i(a)}else n.$i(a);else if(BTn(n,t,e),n.bj()){for(u=i<100?null:new Fj(i),c=t+i,r=t;r<c;++r)o=n.g[r],u=n.cj(o,u);u&&u.Fi()}return!0}function NFn(n,t,e,i){var r,c,a,u,o;for(a=new Wb(n.k);a.a<a.c.c.length;)r=BB(n0(a),129),i&&r.c!=(O6(),Tyt)||(o=r.b).g<0&&r.d>0&&(Vl(o,o.d-r.d),r.c==(O6(),Tyt)&&Xl(o,o.a-r.d),o.d<=0&&o.i>0&&r5(t,o,t.c.b,t.c));for(c=new Wb(n.f);c.a<c.c.c.length;)r=BB(n0(c),129),i&&r.c!=(O6(),Tyt)||(u=r.a).g<0&&r.d>0&&(Ql(u,u.i-r.d),r.c==(O6(),Tyt)&&Wl(u,u.b-r.d),u.i<=0&&u.d>0&&r5(e,u,e.c.b,e.c))}function xFn(n,t,e){var i,r,c,a,u,o,s,h;for(OTn(e,"Processor compute fanout",1),$U(n.b),$U(n.a),u=null,c=spn(t.b,0);!u&&c.b!=c.d.c;)qy(TD(mMn(s=BB(b3(c),86),(qqn(),dkt))))&&(u=s);for(r5(o=new YT,u,o.c.b,o.c),jUn(n,o),h=spn(t.b,0);h.b!=h.d.c;)a=SD(mMn(s=BB(b3(h),86),(qqn(),rkt))),r=null!=SJ(n.b,a)?BB(SJ(n.b,a),19).a:0,hon(s,ikt,iln(r)),i=1+(null!=SJ(n.a,a)?BB(SJ(n.a,a),19).a:0),hon(s,tkt,iln(i));HSn(e)}function DFn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b;for(f=yEn(n,e),u=0;u<t;u++){for(yR(r,e),l=new Np,Px(i.b<i.d.gc()),b=BB(i.d.Xb(i.c=i.b++),407),s=f+u;s<n.b;s++)a=b,Px(i.b<i.d.gc()),WB(l,new Exn(a,b=BB(i.d.Xb(i.c=i.b++),407),e));for(h=f+u;h<n.b;h++)Px(i.b>0),i.a.Xb(i.c=--i.b),h>f+u&&fW(i);for(c=new Wb(l);c.a<c.c.c.length;)yR(i,BB(n0(c),407));if(u<t-1)for(o=f+u;o<n.b;o++)Px(i.b>0),i.a.Xb(i.c=--i.b)}}function RFn(){var n,t,e,i,r,c;if(wWn(),CNt)return CNt;for(sHn(n=new M0(4),ZUn(pnt,!0)),WGn(n,ZUn("M",!0)),WGn(n,ZUn("C",!0)),c=new M0(4),i=0;i<11;i++)Yxn(c,i,i);return sHn(t=new M0(4),ZUn("M",!0)),Yxn(t,4448,4607),Yxn(t,65438,65439),tqn(r=new r$(2),n),tqn(r,sNt),(e=new r$(2)).$l(gG(c,ZUn("L",!0))),e.$l(t),e=new h4(3,e),e=new UU(r,e),CNt=e}function KFn(n){var t,e;if(!Ycn(t=SD(ZAn(n,(sWn(),eSt))),n)&&!P8(n,mPt)&&(0!=(!n.a&&(n.a=new eU(UOt,n,10,11)),n.a).i||qy(TD(ZAn(n,SSt))))){if(null!=t&&0!=RMn(t).length)throw gzn(n,e=oO(oO(new lN("Layout algorithm '"),t),"' not found for ")),Hp(new rk(e.a));if(!Ycn(w1n,n))throw gzn(n,e=oO(oO(new lN("Unable to load default layout algorithm "),w1n)," for unconfigured node ")),Hp(new rk(e.a))}}function _Fn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w;if(i=n.i,t=n.n,0==n.b)for(w=i.c+t.b,b=i.b-t.b-t.c,s=0,f=(u=n.a).length;s<f;++s)UG(c=u[s],w,b);else r=Wvn(n,!1),UG(n.a[0],i.c+t.b,r[0]),UG(n.a[2],i.c+i.b-t.c-r[2],r[2]),l=i.b-t.b-t.c,r[0]>0&&(l-=r[0]+n.c,r[0]+=n.c),r[2]>0&&(l-=r[2]+n.c),r[1]=e.Math.max(r[1],l),UG(n.a[1],i.c+t.b+r[0]-(r[1]-l)/2,r[1]);for(o=0,h=(a=n.a).length;o<h;++o)cL(c=a[o],326)&&BB(c,326).Te()}function FFn(n){var t,e,i,r,c,a,u,o,s,h,f;for((f=new aa).d=0,a=new Wb(n.b);a.a<a.c.c.length;)c=BB(n0(a),29),f.d+=c.a.c.length;for(i=0,r=0,f.a=x8(ANt,hQn,25,n.b.c.length,15,1),s=0,h=0,f.e=x8(ANt,hQn,25,f.d,15,1),e=new Wb(n.b);e.a<e.c.c.length;)for((t=BB(n0(e),29)).p=i++,f.a[t.p]=r++,h=0,o=new Wb(t.a);o.a<o.c.c.length;)(u=BB(n0(o),10)).p=s++,f.e[u.p]=h++;return f.c=new fg(f),f.b=sx(f.d),H_n(f,n),f.f=sx(f.d),q_n(f,n),f}function BFn(n,t){var i,r,c;for(c=BB(xq(n.n,n.n.c.length-1),211).d,n.p=e.Math.min(n.p,t.g),n.r=e.Math.max(n.r,c),n.g=e.Math.max(n.g,t.g+(1==n.b.c.length?0:n.i)),n.o=e.Math.min(n.o,t.f),n.e+=t.f+(1==n.b.c.length?0:n.i),n.f=e.Math.max(n.f,t.f),r=n.n.c.length>0?(n.n.c.length-1)*n.i:0,i=new Wb(n.n);i.a<i.c.c.length;)r+=BB(n0(i),211).a;n.d=r,n.a=n.e/n.b.c.length-n.i*((n.b.c.length-1)/n.b.c.length),yyn(n.j)}function HFn(n,t){var e,i,r,c,a,u,o,s,h;if(null==(s=TD(mMn(t,(fRn(),iat))))||(kW(s),s)){for(h=x8($Nt,ZYn,25,t.e.c.length,16,1),a=kOn(t),r=new YT,o=new Wb(t.e);o.a<o.c.c.length;)(e=Y$n(n,BB(n0(o),144),null,null,h,a))&&(qan(e,t),r5(r,e,r.c.b,r.c));if(r.b>1)for(i=spn(r,0);i.b!=i.d.c;)for(c=0,u=new Wb((e=BB(b3(i),231)).e);u.a<u.c.c.length;)BB(n0(u),144).b=c++;return r}return u6(Pun(Gk(Kct,1),tZn,231,0,[t]))}function qFn(n){var t,e,i,r,c;if(!n.g){if(c=new To,null==(t=P$t).a.zc(n,t)){for(e=new AL(kY(n));e.e!=e.i.gc();)pX(c,qFn(BB(kpn(e),26)));t.a.Bc(n),t.a.gc()}for(i=c.i,!n.s&&(n.s=new eU(FAt,n,21,17)),r=new AL(n.s);r.e!=r.i.gc();++i)ub(BB(kpn(r),449),i);pX(c,(!n.s&&(n.s=new eU(FAt,n,21,17)),n.s)),chn(c),n.g=new don(n,c),n.i=BB(c.g,247),null==n.i&&(n.i=I$t),n.p=null,P5(n).b&=-5}return n.g}function GFn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w;if(r=n.i,i=n.n,0==n.b)t=Xvn(n,!1),XG(n.a[0],r.d+i.d,t[0]),XG(n.a[2],r.d+r.a-i.a-t[2],t[2]),l=r.a-i.d-i.a,t[0]>0&&(t[0]+=n.c,l-=t[0]),t[2]>0&&(l-=t[2]+n.c),t[1]=e.Math.max(t[1],l),XG(n.a[1],r.d+i.d+t[0]-(t[1]-l)/2,t[1]);else for(w=r.d+i.d,b=r.a-i.d-i.a,s=0,f=(u=n.a).length;s<f;++s)XG(c=u[s],w,b);for(o=0,h=(a=n.a).length;o<h;++o)cL(c=a[o],326)&&BB(c,326).Ue()}function zFn(n){var t,e,i,r,c,a,u,o,s;for(s=x8(ANt,hQn,25,n.b.c.length+1,15,1),o=new Rv,i=0,c=new Wb(n.b);c.a<c.c.c.length;){for(r=BB(n0(c),29),s[i++]=o.a.gc(),u=new Wb(r.a);u.a<u.c.c.length;)for(e=new oz(ZL(lbn(BB(n0(u),10)).a.Kc(),new h));dAn(e);)t=BB(U5(e),17),o.a.zc(t,o);for(a=new Wb(r.a);a.a<a.c.c.length;)for(e=new oz(ZL(fbn(BB(n0(a),10)).a.Kc(),new h));dAn(e);)t=BB(U5(e),17),o.a.Bc(t)}return s}function UFn(n,t,e,i){var r,c,a,u,o;if(o=axn(n.e.Tg(),t),r=BB(n.g,119),ZM(),BB(t,66).Oj()){for(a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak())&&Nfn(c,e))return!0}else if(null!=e){for(u=0;u<n.i;++u)if(c=r[u],o.rl(c.ak())&&Nfn(e,c.dd()))return!0;if(i)for(a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak())&&GI(e)===GI(hD(n,BB(c.dd(),56))))return!0}else for(a=0;a<n.i;++a)if(c=r[a],o.rl(c.ak())&&null==c.dd())return!1;return!1}function XFn(n,t,e,i){var r,c,a,u,o,s;if(s=axn(n.e.Tg(),t),a=BB(n.g,119),$xn(n.e,t)){if(t.hi()&&(c=pBn(n,t,i,cL(t,99)&&0!=(BB(t,18).Bb&BQn)))>=0&&c!=e)throw Hp(new _y(a8n));for(r=0,o=0;o<n.i;++o)if(u=a[o],s.rl(u.ak())){if(r==e)return BB(ovn(n,o,(ZM(),BB(t,66).Oj()?BB(i,72):Z3(t,i))),72);++r}throw Hp(new Ay(e9n+e+o8n+r))}for(o=0;o<n.i;++o)if(u=a[o],s.rl(u.ak()))return ZM(),BB(t,66).Oj()?u:u.dd();return null}function WFn(n,t,i,r){var c,a,u,o;for(o=i,u=new Wb(t.a);u.a<u.c.c.length;){if(a=BB(n0(u),221),c=BB(a.b,65),Ibn(n.b.c,c.b.c+c.b.b)<=0&&Ibn(c.b.c,n.b.c+n.b.b)<=0&&Ibn(n.b.d,c.b.d+c.b.a)<=0&&Ibn(c.b.d,n.b.d+n.b.a)<=0){if(0==Ibn(c.b.c,n.b.c+n.b.b)&&r.a<0||0==Ibn(c.b.c+c.b.b,n.b.c)&&r.a>0||0==Ibn(c.b.d,n.b.d+n.b.a)&&r.b<0||0==Ibn(c.b.d+c.b.a,n.b.d)&&r.b>0){o=0;break}}else o=e.Math.min(o,HCn(n,c,r));o=e.Math.min(o,WFn(n,a,o,r))}return o}function VFn(n,t){var e,i,r,c,a,u;if(n.b<2)throw Hp(new _y("The vector chain must contain at least a source and a target point."));for(Px(0!=n.b),CA(t,(i=BB(n.a.a.c,8)).a,i.b),u=new cx((!t.a&&(t.a=new $L(xOt,t,5)),t.a)),c=spn(n,1);c.a<n.b-1;)a=BB(b3(c),8),u.e!=u.i.gc()?e=BB(kpn(u),469):(tE(),odn(u,e=new ro)),TA(e,a.a,a.b);for(;u.e!=u.i.gc();)kpn(u),Qjn(u);Px(0!=n.b),PA(t,(r=BB(n.c.b.c,8)).a,r.b)}function QFn(n,t){var e,i,r,c,a,u,o,s;for(e=0,i=new Wb((l1(0,n.c.length),BB(n.c[0],101)).g.b.j);i.a<i.c.c.length;)BB(n0(i),11).p=e++;for(t==(kUn(),sIt)?m$(n,new nc):m$(n,new tc),a=0,s=n.c.length-1;a<s;)l1(a,n.c.length),c=BB(n.c[a],101),l1(s,n.c.length),o=BB(n.c[s],101),r=t==sIt?c.c:c.a,u=t==sIt?o.a:o.c,bU(c,t,(Oun(),yst),r),bU(o,t,mst,u),++a,--s;a==s&&bU((l1(a,n.c.length),BB(n.c[a],101)),t,(Oun(),vst),null)}function YFn(n,t,e){var i,r,c,a,u,o,s,h,f,l;return h=n.a.i+n.a.g/2,f=n.a.i+n.a.g/2,a=new xC(t.i+t.g/2,t.j+t.f/2),(o=BB(ZAn(t,(sWn(),gPt)),8)).a=o.a+h,o.b=o.b+f,r=(a.b-o.b)/(a.a-o.a),i=a.b-r*a.a,u=new xC(e.i+e.g/2,e.j+e.f/2),(s=BB(ZAn(e,gPt),8)).a=s.a+h,s.b=s.b+f,c=(u.b-s.b)/(u.a-s.a),l=(i-(u.b-c*u.a))/(c-r),!(o.a<l&&a.a<l||l<o.a&&l<a.a||s.a<l&&u.a<l||l<s.a&&l<u.a)}function JFn(n,t){var e,i,r,c,a,u;if(!(a=BB(RX(n.c,t),183)))throw Hp(new ek("Edge did not exist in input."));return i=Qdn(a),!WE((!t.a&&(t.a=new eU(FOt,t,6,6)),t.a))&&(e=new MB(n,i,u=new Cl),wO((!t.a&&(t.a=new eU(FOt,t,6,6)),t.a),e),rtn(a,x6n,u)),P8(t,(sWn(),OSt))&&!(!(r=BB(ZAn(t,OSt),74))||pW(r))&&(e5(r,new Qg(c=new Cl)),rtn(a,"junctionPoints",c)),AH(a,"container",XJ(t).k),null}function ZFn(n,t,e){var i,r,c,a,u,o;this.a=n,this.b=t,this.c=e,this.e=u6(Pun(Gk(uit,1),HWn,168,0,[new xS(n,t),new xS(t,e),new xS(e,n)])),this.f=u6(Pun(Gk(PMt,1),sVn,8,0,[n,t,e])),this.d=(i=XR(B$(this.b),this.a),r=XR(B$(this.c),this.a),c=XR(B$(this.c),this.b),a=i.a*(this.a.a+this.b.a)+i.b*(this.a.b+this.b.b),u=r.a*(this.a.a+this.c.a)+r.b*(this.a.b+this.c.b),o=2*(i.a*c.b-i.b*c.a),new xC((r.b*a-i.b*u)/o,(i.a*u-r.a*a)/o))}function nBn(n,t,e,i){var r,c,a,u,o,s,h,f,l;if(f=new GX(n.p),rtn(t,t8n,f),e&&!(n.f?rY(n.f):null).a.dc())for(rtn(t,"logs",s=new Cl),u=0,l=new qb((n.f?rY(n.f):null).b.Kc());l.b.Ob();)h=new GX(SD(l.b.Pb())),dnn(s,u),r4(s,u,h),++u;if(i&&rtn(t,"executionTime",new Sl(n.q)),!rY(n.a).a.dc())for(a=new Cl,rtn(t,A6n,a),u=0,c=new qb(rY(n.a).b.Kc());c.b.Ob();)r=BB(c.b.Pb(),1949),o=new py,dnn(a,u),r4(a,u,o),nBn(r,o,e,i),++u}function tBn(n,t){var e,i,r,c,a,u;for(c=n.c,a=n.d,SZ(n,null),MZ(n,null),t&&qy(TD(mMn(a,(hWn(),tlt))))?SZ(n,R_n(a.i,(ain(),qvt),(kUn(),oIt))):SZ(n,a),t&&qy(TD(mMn(c,(hWn(),klt))))?MZ(n,R_n(c.i,(ain(),Hvt),(kUn(),CIt))):MZ(n,c),i=new Wb(n.b);i.a<i.c.c.length;)e=BB(n0(i),70),(r=BB(mMn(e,(HXn(),Ydt)),272))==(Rtn(),XPt)?hon(e,Ydt,UPt):r==UPt&&hon(e,Ydt,XPt);u=qy(TD(mMn(n,(hWn(),Clt)))),hon(n,Clt,(hN(),!u)),n.a=Jon(n.a)}function eBn(n,t,i){var r,c,a,u,o;for(r=0,a=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));a.e!=a.i.gc();)u="",0==(!(c=BB(kpn(a),33)).n&&(c.n=new eU(zOt,c,1,7)),c.n).i||(u=BB(Wtn((!c.n&&(c.n=new eU(zOt,c,1,7)),c.n),0),137).a),qan(o=new qX(u),c),hon(o,(Mrn(),sat),c),o.b=r++,o.d.a=c.i+c.g/2,o.d.b=c.j+c.f/2,o.e.a=e.Math.max(c.g,1),o.e.b=e.Math.max(c.f,1),WB(t.e,o),jCn(i.f,c,o),BB(ZAn(c,(fRn(),Yct)),98),QEn()}function iBn(n,t){var i,r,c,a,u,o,s,h,f,l,b;i=AN(new qv,n.f),o=n.i[t.c.i.p],l=n.i[t.d.i.p],u=t.c,f=t.d,a=u.a.b,h=f.a.b,o.b||(a+=u.n.b),l.b||(h+=f.n.b),s=CJ(e.Math.max(0,a-h)),c=CJ(e.Math.max(0,h-a)),b=e.Math.max(1,BB(mMn(t,(HXn(),bpt)),19).a)*X3(t.c.i.k,t.d.i.k),r=new nC(UNn(aM(cM(rM(uM(new Hv,b),c),i),BB(RX(n.k,t.c),121))),UNn(aM(cM(rM(uM(new Hv,b),s),i),BB(RX(n.k,t.d),121)))),n.c[t.p]=r}function rBn(n,t,e,i){var r,c,a,u,o,s;for(a=new uGn(n,t,e),o=new M2(i,0),r=!1;o.b<o.d.gc();)Px(o.b<o.d.gc()),(u=BB(o.d.Xb(o.c=o.b++),233))==t||u==e?fW(o):!r&&Gy(lL(u.g,u.d[0]).a)>Gy(lL(a.g,a.d[0]).a)?(Px(o.b>0),o.a.Xb(o.c=--o.b),yR(o,a),r=!0):u.e&&u.e.gc()>0&&(c=(!u.e&&(u.e=new Np),u.e).Mc(t),s=(!u.e&&(u.e=new Np),u.e).Mc(e),(c||s)&&((!u.e&&(u.e=new Np),u.e).Fc(a),++a.c));r||(i.c[i.c.length]=a)}function cBn(n){var t,e,i;if(vA(BB(mMn(n,(HXn(),ept)),98)))for(e=new Wb(n.j);e.a<e.c.c.length;)(t=BB(n0(e),11)).j==(kUn(),PIt)&&((i=BB(mMn(t,(hWn(),Elt)),10))?qCn(t,BB(mMn(i,Qft),61)):t.e.c.length-t.g.c.length<0?qCn(t,oIt):qCn(t,CIt));else{for(e=new Wb(n.j);e.a<e.c.c.length;)t=BB(n0(e),11),(i=BB(mMn(t,(hWn(),Elt)),10))?qCn(t,BB(mMn(i,Qft),61)):t.e.c.length-t.g.c.length<0?qCn(t,(kUn(),oIt)):qCn(t,(kUn(),CIt));hon(n,ept,(QEn(),VCt))}}function aBn(n){var t,e;switch(n){case 91:case 93:case 45:case 94:case 44:case 92:e="\\"+String.fromCharCode(n&QVn);break;case 12:e="\\f";break;case 10:e="\\n";break;case 13:e="\\r";break;case 9:e="\\t";break;case 27:e="\\e";break;default:e=n<32?"\\x"+fx(t="0"+(n>>>0).toString(16),t.length-2,t.length):n>=BQn?"\\v"+fx(t="0"+(n>>>0).toString(16),t.length-6,t.length):""+String.fromCharCode(n&QVn)}return e}function uBn(n,t){var e,i,r,c,a,u,o,s,h,f;if(a=n.e,0==(o=t.e))return n;if(0==a)return 0==t.e?t:new lU(-t.e,t.d,t.a);if((c=n.d)+(u=t.d)==2)return e=e0(n.a[0],UQn),i=e0(t.a[0],UQn),a<0&&(e=j7(e)),o<0&&(i=j7(i)),npn(ibn(e,i));if(-1==(r=c!=u?c>u?1:-1:Msn(n.a,t.a,c)))f=-o,h=a==o?d6(t.a,u,n.a,c):N8(t.a,u,n.a,c);else if(f=a,a==o){if(0==r)return ODn(),eet;h=d6(n.a,c,t.a,u)}else h=N8(n.a,c,t.a,u);return X0(s=new lU(f,h.length,h)),s}function oBn(n){var t,e,i,r,c,a;for(this.e=new Np,this.a=new Np,e=n.b-1;e<3;e++)Kx(n,0,BB(Dpn(n,0),8));if(n.b<4)throw Hp(new _y("At (least dimension + 1) control points are necessary!"));for(this.b=3,this.d=!0,this.c=!1,I$n(this,n.b+this.b-1),a=new Np,c=new Wb(this.e),t=0;t<this.b-1;t++)WB(a,MD(n0(c)));for(r=spn(n,0);r.b!=r.d.c;)i=BB(b3(r),8),WB(a,MD(n0(c))),WB(this.a,new wJ(i,a)),l1(0,a.c.length),a.c.splice(0,1)}function sBn(n,t){var e,i,r,c,a,u,o;for(r=new Wb(n.b);r.a<r.c.c.length;)for(a=new Wb(BB(n0(r),29).a);a.a<a.c.c.length;)for((c=BB(n0(a),10)).k==(uSn(),Sut)&&(u=BB(U5(new oz(ZL(fbn(c).a.Kc(),new h))),17),o=BB(U5(new oz(ZL(lbn(c).a.Kc(),new h))),17),hFn(c,qy(TD(mMn(u,(hWn(),Clt))))&&qy(TD(mMn(o,Clt)))?Xun(t):t)),i=new oz(ZL(lbn(c).a.Kc(),new h));dAn(i);)vun(e=BB(U5(i),17),qy(TD(mMn(e,(hWn(),Clt))))?Xun(t):t)}function hBn(n,t,e,i,r){var c,a;if(e.f>=t.o&&e.f<=t.f||.5*t.a<=e.f&&1.5*t.a>=e.f){if((c=BB(xq(t.n,t.n.c.length-1),211)).e+c.d+e.g+r<=i&&(BB(xq(t.n,t.n.c.length-1),211).f-n.f+e.f<=n.b||1==n.a.c.length))return ybn(t,e),!0;if(t.s+e.g<=i&&(t.t+t.d+e.f+r<=n.b||1==n.a.c.length))return WB(t.b,e),a=BB(xq(t.n,t.n.c.length-1),211),WB(t.n,new RJ(t.s,a.f+a.a+t.i,t.i)),smn(BB(xq(t.n,t.n.c.length-1),211),e),BFn(t,e),!0}return!1}function fBn(n,t,e){var i,r,c,a;return n.ej()?(r=null,c=n.fj(),i=n.Zi(1,a=onn(n,t,e),e,t,c),n.bj()&&!(n.ni()&&null!=a?Nfn(a,e):GI(a)===GI(e))?(null!=a&&(r=n.dj(a,r)),r=n.cj(e,r),n.ij()&&(r=n.lj(a,e,r)),r?(r.Ei(i),r.Fi()):n.$i(i)):(n.ij()&&(r=n.lj(a,e,r)),r?(r.Ei(i),r.Fi()):n.$i(i)),a):(a=onn(n,t,e),n.bj()&&!(n.ni()&&null!=a?Nfn(a,e):GI(a)===GI(e))&&(r=null,null!=a&&(r=n.dj(a,null)),(r=n.cj(e,r))&&r.Fi()),a)}function lBn(n,t){var i,r,c,a,u,o,s;t%=24,n.q.getHours()!=t&&((i=new e.Date(n.q.getTime())).setDate(i.getDate()+1),(u=n.q.getTimezoneOffset()-i.getTimezoneOffset())>0&&(o=u/60|0,s=u%60,r=n.q.getDate(),n.q.getHours()+o>=24&&++r,c=new e.Date(n.q.getFullYear(),n.q.getMonth(),r,t+o,n.q.getMinutes()+s,n.q.getSeconds(),n.q.getMilliseconds()),n.q.setTime(c.getTime()))),a=n.q.getTime(),n.q.setTime(a+36e5),n.q.getHours()!=t&&n.q.setTime(a)}function bBn(n,t){var e,i,r,c;if(OTn(t,"Path-Like Graph Wrapping",1),0!=n.b.c.length)if(null==(r=new MAn(n)).i&&(r.i=Wrn(r,new kc)),e=Gy(r.i)*r.f/(null==r.i&&(r.i=Wrn(r,new kc)),Gy(r.i)),r.b>e)HSn(t);else{switch(BB(mMn(n,(HXn(),Bpt)),337).g){case 2:c=new Tc;break;case 0:c=new wc;break;default:c=new Mc}if(i=c.Vf(n,r),!c.Wf())switch(BB(mMn(n,Xpt),338).g){case 2:i=XCn(r,i);break;case 1:i=KTn(r,i)}iqn(n,r,i),HSn(t)}else HSn(t)}function wBn(n,t){var e,i,r,c;if(f1(n.d,n.e),n.c.a.$b(),0!=Gy(MD(mMn(t.j,(HXn(),Idt))))||0!=Gy(MD(mMn(t.j,Idt))))for(e=ZJn,GI(mMn(t.j,Ldt))!==GI((mon(),Nvt))&&hon(t.j,(hWn(),Jft),(hN(),!0)),c=BB(mMn(t.j,xpt),19).a,r=0;r<c&&!((i=gFn(n,t))<e&&(e=i,Lrn(n),0==e));r++);else for(e=DWn,GI(mMn(t.j,Ldt))!==GI((mon(),Nvt))&&hon(t.j,(hWn(),Jft),(hN(),!0)),c=BB(mMn(t.j,xpt),19).a,r=0;r<c&&!((i=pFn(n,t))<e&&(e=i,Lrn(n),0==e));r++);}function dBn(n,t){var e,i,r,c,a,u;for(r=new Np,c=0,e=0,a=0;c<t.c.length-1&&e<n.gc();){for(i=BB(n.Xb(e),19).a+a;(l1(c+1,t.c.length),BB(t.c[c+1],19)).a<i;)++c;for(u=0,i-(l1(c,t.c.length),BB(t.c[c],19)).a>(l1(c+1,t.c.length),BB(t.c[c+1],19)).a-i&&++u,WB(r,(l1(c+u,t.c.length),BB(t.c[c+u],19))),a+=(l1(c+u,t.c.length),BB(t.c[c+u],19)).a-i,++e;e<n.gc()&&BB(n.Xb(e),19).a+a<=(l1(c+u,t.c.length),BB(t.c[c+u],19)).a;)++e;c+=1+u}return r}function gBn(n){var t,e,i,r,c;if(!n.d){if(c=new Po,null==(t=P$t).a.zc(n,t)){for(e=new AL(kY(n));e.e!=e.i.gc();)pX(c,gBn(BB(kpn(e),26)));t.a.Bc(n),t.a.gc()}for(r=c.i,!n.q&&(n.q=new eU(QAt,n,11,10)),i=new AL(n.q);i.e!=i.i.gc();++r)BB(kpn(i),399);pX(c,(!n.q&&(n.q=new eU(QAt,n,11,10)),n.q)),chn(c),n.d=new NO((BB(Wtn(QQ((QX(),t$t).o),9),18),c.i),c.g),n.e=BB(c.g,673),null==n.e&&(n.e=C$t),P5(n).b&=-17}return n.d}function pBn(n,t,e,i){var r,c,a,u,o,s;if(s=axn(n.e.Tg(),t),o=0,r=BB(n.g,119),ZM(),BB(t,66).Oj()){for(a=0;a<n.i;++a)if(c=r[a],s.rl(c.ak())){if(Nfn(c,e))return o;++o}}else if(null!=e){for(u=0;u<n.i;++u)if(c=r[u],s.rl(c.ak())){if(Nfn(e,c.dd()))return o;++o}if(i)for(o=0,a=0;a<n.i;++a)if(c=r[a],s.rl(c.ak())){if(GI(e)===GI(hD(n,BB(c.dd(),56))))return o;++o}}else for(a=0;a<n.i;++a)if(c=r[a],s.rl(c.ak())){if(null==c.dd())return o;++o}return-1}function vBn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b;for(SQ(),m$(n,new zu),a=zB(n),b=new Np,l=new Np,u=null,o=0;0!=a.b;)c=BB(0==a.b?null:(Px(0!=a.b),Atn(a,a.a.a)),157),!u||iG(u)*eG(u)/2<iG(c)*eG(c)?(u=c,b.c[b.c.length]=c):(o+=iG(c)*eG(c),l.c[l.c.length]=c,l.c.length>1&&(o>iG(u)*eG(u)/2||0==a.b)&&(f=new Gtn(l),h=iG(u)/eG(u),s=yXn(f,t,new bm,e,i,r,h),UR(kO(f.e),s),u=f,b.c[b.c.length]=f,o=0,l.c=x8(Ant,HWn,1,0,5,1)));return gun(b,l),b}function mBn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d;if(e.mh(t)&&(h=(b=t)?BB(i,49).xh(b):null))if(d=e.bh(t,n.a),(w=t.t)>1||-1==w)if(f=BB(d,69),l=BB(h,69),f.dc())l.$b();else for(a=!!Cvn(t),c=0,u=n.a?f.Kc():f.Zh();u.Ob();)s=BB(u.Pb(),56),(r=BB(lnn(n,s),56))?(a?-1==(o=l.Xc(r))?l.Xh(c,r):c!=o&&l.ji(c,r):l.Xh(c,r),++c):n.b&&!a&&(l.Xh(c,s),++c);else null==d?h.Wb(null):null==(r=lnn(n,d))?n.b&&!Cvn(t)&&h.Wb(d):h.Wb(r)}function yBn(n,t){var i,r,c,a,u,o,s,f;for(i=new Le,c=new oz(ZL(fbn(t).a.Kc(),new h));dAn(c);)if(!b5(r=BB(U5(c),17))&&eTn(o=r.c.i,Xut)){if(-1==(f=VDn(n,o,Xut,Uut)))continue;i.b=e.Math.max(i.b,f),!i.a&&(i.a=new Np),WB(i.a,o)}for(u=new oz(ZL(lbn(t).a.Kc(),new h));dAn(u);)if(!b5(a=BB(U5(u),17))&&eTn(s=a.d.i,Uut)){if(-1==(f=VDn(n,s,Uut,Xut)))continue;i.d=e.Math.max(i.d,f),!i.c&&(i.c=new Np),WB(i.c,s)}return i}function kBn(n){var t,e,i,r;if($On(),t=CJ(n),n<uet.length)return uet[t];if(n<=50)return uOn((ODn(),net),t);if(n<=VVn)return G5(uOn(aet[1],t),t);if(n>1e6)throw Hp(new Oy("power of ten too big"));if(n<=DWn)return G5(uOn(aet[1],t),t);for(r=i=uOn(aet[1],DWn),e=fan(n-DWn),t=CJ(n%DWn);Vhn(e,DWn)>0;)r=Nnn(r,i),e=ibn(e,DWn);for(r=G5(r=Nnn(r,uOn(aet[1],t)),DWn),e=fan(n-DWn);Vhn(e,DWn)>0;)r=G5(r,DWn),e=ibn(e,DWn);return r=G5(r,t)}function jBn(n,t){var e,i,r,c,a,u,o,s;for(OTn(t,"Hierarchical port dummy size processing",1),u=new Np,s=new Np,e=2*Gy(MD(mMn(n,(HXn(),kpt)))),r=new Wb(n.b);r.a<r.c.c.length;){for(i=BB(n0(r),29),u.c=x8(Ant,HWn,1,0,5,1),s.c=x8(Ant,HWn,1,0,5,1),a=new Wb(i.a);a.a<a.c.c.length;)(c=BB(n0(a),10)).k==(uSn(),Mut)&&((o=BB(mMn(c,(hWn(),Qft)),61))==(kUn(),sIt)?u.c[u.c.length]=c:o==SIt&&(s.c[s.c.length]=c));HOn(u,!0,e),HOn(s,!1,e)}HSn(t)}function EBn(n,t){var e,i,r,c,a;OTn(t,"Layer constraint postprocessing",1),0!=(a=n.b).c.length&&(l1(0,a.c.length),_Kn(n,BB(a.c[0],29),BB(xq(a,a.c.length-1),29),e=new HX(n),r=new HX(n)),0==e.a.c.length||(LZ(0,a.c.length),MS(a.c,0,e)),0==r.a.c.length||(a.c[a.c.length]=r)),Lx(n,(hWn(),nlt))&&(yDn(n,i=new HX(n),c=new HX(n)),0==i.a.c.length||(LZ(0,a.c.length),MS(a.c,0,i)),0==c.a.c.length||(a.c[a.c.length]=c)),HSn(t)}function TBn(n){var t,e,i,r,c,a,u,o;for(a=new Wb(n.a);a.a<a.c.c.length;)if((c=BB(n0(a),10)).k==(uSn(),Mut)&&((r=BB(mMn(c,(hWn(),Qft)),61))==(kUn(),oIt)||r==CIt))for(i=new oz(ZL(hbn(c).a.Kc(),new h));dAn(i);)0!=(t=(e=BB(U5(i),17)).a).b&&((u=e.c).i==c&&(Px(0!=t.b),BB(t.a.a.c,8).b=Aon(Pun(Gk(PMt,1),sVn,8,0,[u.i.n,u.n,u.a])).b),(o=e.d).i==c&&(Px(0!=t.b),BB(t.c.b.c,8).b=Aon(Pun(Gk(PMt,1),sVn,8,0,[o.i.n,o.n,o.a])).b))}function MBn(n,t){var e,i,r,c,a,u,o;for(OTn(t,"Sort By Input Model "+mMn(n,(HXn(),Ldt)),1),r=0,i=new Wb(n.b);i.a<i.c.c.length;){for(e=BB(n0(i),29),o=0==r?0:r-1,u=BB(xq(n.b,o),29),a=new Wb(e.a);a.a<a.c.c.length;)GI(mMn(c=BB(n0(a),10),ept))!==GI((QEn(),UCt))&&GI(mMn(c,ept))!==GI(XCt)&&(SQ(),m$(c.j,new O7(u,okn(c))),OH(t,"Node "+c+" ports: "+c.j));SQ(),m$(e.a,new Grn(u,BB(mMn(n,Ldt),339),BB(mMn(n,Adt),378))),OH(t,"Layer "+r+": "+e),++r}HSn(t)}function SBn(n,t){var e,i,r;if(r=kFn(t),JT(new Rq(null,(!t.c&&(t.c=new eU(XOt,t,9,9)),new w1(t.c,16))),new Uw(r)),uzn(t,i=BB(mMn(r,(hWn(),Zft)),21)),i.Hc((bDn(),lft)))for(e=new AL((!t.c&&(t.c=new eU(XOt,t,9,9)),t.c));e.e!=e.i.gc();)Qzn(n,t,r,BB(kpn(e),118));return 0!=BB(ZAn(t,(HXn(),Fgt)),174).gc()&&mDn(t,r),qy(TD(mMn(r,Xgt)))&&i.Fc(pft),Lx(r,gpt)&&My(new uwn(Gy(MD(mMn(r,gpt)))),r),GI(ZAn(t,sgt))===GI((ufn(),pCt))?cWn(n,t,r):eXn(n,t,r),r}function PBn(n,t,i,r){var c,a,u;if(this.j=new Np,this.k=new Np,this.b=new Np,this.c=new Np,this.e=new bA,this.i=new km,this.f=new Dp,this.d=new Np,this.g=new Np,WB(this.b,n),WB(this.b,t),this.e.c=e.Math.min(n.a,t.a),this.e.d=e.Math.min(n.b,t.b),this.e.b=e.Math.abs(n.a-t.a),this.e.a=e.Math.abs(n.b-t.b),c=BB(mMn(r,(HXn(),vgt)),74))for(u=spn(c,0);u.b!=u.d.c;)aen((a=BB(b3(u),8)).a,n.a)&&DH(this.i,a);i&&WB(this.j,i),WB(this.k,r)}function CBn(n,t,e){var i,r,c,a,u,o,s,h,f,l;for(h=new Xz(new xw(e)),vU(u=x8($Nt,ZYn,25,n.f.e.c.length,16,1),u.length),e[t.b]=0,s=new Wb(n.f.e);s.a<s.c.c.length;)(o=BB(n0(s),144)).b!=t.b&&(e[o.b]=DWn),F8(eMn(h,o));for(;0!=h.b.c.length;)for(u[(f=BB(mnn(h),144)).b]=!0,c=vN(new mT(n.b,f),0);c.c;)u[(l=$mn(r=BB(EZ(c),282),f)).b]||(a=Lx(r,(rkn(),pat))?Gy(MD(mMn(r,pat))):n.c,(i=e[f.b]+a)<e[l.b]&&(e[l.b]=i,srn(h,l),F8(eMn(h,l))))}function IBn(n,t,e){var i,r,c,a,u,o,s,h,f;for(r=!0,a=new Wb(n.b);a.a<a.c.c.length;){for(c=BB(n0(a),29),s=KQn,h=null,o=new Wb(c.a);o.a<o.c.c.length;){if(u=BB(n0(o),10),f=Gy(t.p[u.p])+Gy(t.d[u.p])-u.d.d,i=Gy(t.p[u.p])+Gy(t.d[u.p])+u.o.b+u.d.a,!(f>s&&i>s)){r=!1,e.n&&OH(e,"bk node placement breaks on "+u+" which should have been after "+h);break}h=u,s=Gy(t.p[u.p])+Gy(t.d[u.p])+u.o.b+u.d.a}if(!r)break}return e.n&&OH(e,t+" is feasible: "+r),r}function OBn(n,t,e,i){var r,c,a,u,o,s,h;for(u=-1,h=new Wb(n);h.a<h.c.c.length;)(s=BB(n0(h),112)).g=u--,a=r=dG(E2(NV(AV(new Rq(null,new w1(s.f,16)),new sa),new ha)).d),o=c=dG(E2(NV(AV(new Rq(null,new w1(s.k,16)),new fa),new la)).d),i||(a=dG(E2(NV(new Rq(null,new w1(s.f,16)),new ba)).d),o=dG(E2(NV(new Rq(null,new w1(s.k,16)),new wa)).d)),s.d=a,s.a=r,s.i=o,s.b=c,0==o?r5(e,s,e.c.b,e.c):0==a&&r5(t,s,t.c.b,t.c)}function ABn(n,t,e,i){var r,c,a,u,o,s,h;if(e.d.i!=t.i){for(Bl(r=new $vn(n),(uSn(),Put)),hon(r,(hWn(),dlt),e),hon(r,(HXn(),ept),(QEn(),XCt)),i.c[i.c.length]=r,CZ(a=new CSn,r),qCn(a,(kUn(),CIt)),CZ(u=new CSn,r),qCn(u,oIt),h=e.d,MZ(e,a),qan(c=new wY,e),hon(c,vgt,null),SZ(c,u),MZ(c,h),s=new M2(e.b,0);s.b<s.d.gc();)Px(s.b<s.d.gc()),GI(mMn(o=BB(s.d.Xb(s.c=s.b++),70),Ydt))===GI((Rtn(),UPt))&&(hon(o,Uft,e),fW(s),WB(c.b,o));yAn(r,a,u)}}function $Bn(n,t,e,i){var r,c,a,u,o,s;if(e.c.i!=t.i)for(Bl(r=new $vn(n),(uSn(),Put)),hon(r,(hWn(),dlt),e),hon(r,(HXn(),ept),(QEn(),XCt)),i.c[i.c.length]=r,CZ(a=new CSn,r),qCn(a,(kUn(),CIt)),CZ(u=new CSn,r),qCn(u,oIt),MZ(e,a),qan(c=new wY,e),hon(c,vgt,null),SZ(c,u),MZ(c,t),yAn(r,a,u),s=new M2(e.b,0);s.b<s.d.gc();)Px(s.b<s.d.gc()),o=BB(s.d.Xb(s.c=s.b++),70),BB(mMn(o,Ydt),272)==(Rtn(),UPt)&&(Lx(o,Uft)||hon(o,Uft,e),fW(s),WB(c.b,o))}function LBn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(l=new Np,p=S4(r),g=t*n.a,w=0,a=new Rv,u=new Rv,o=new Np,v=0,m=0,b=0,d=0,h=0,f=0;0!=p.a.gc();)(s=tbn(p,c,u))&&(p.a.Bc(s),o.c[o.c.length]=s,a.a.zc(s,a),w=n.f[s.p],v+=n.e[s.p]-w*n.b,m+=n.c[s.p]*n.b,f+=w*n.b,d+=n.e[s.p]),(!s||0==p.a.gc()||v>=g&&n.e[s.p]>w*n.b||m>=i*g)&&(l.c[l.c.length]=o,o=new Np,Frn(u,a),a.a.$b(),h-=f,b=e.Math.max(b,h*n.b+d),h+=m,v=m,m=0,f=0,d=0);return new rI(b,l)}function NBn(n){var t,e,i,r,c,a,u,o,s,h,f,l;for(e=new Kb(new Ob(n.c.b).a.vc().Kc());e.a.Ob();)u=BB(e.a.Pb(),42),null==(r=(t=BB(u.dd(),149)).a)&&(r=""),!(i=_D(n.c,r))&&0==r.length&&(i=yfn(n)),i&&!ywn(i.c,t,!1)&&DH(i.c,t);for(a=spn(n.a,0);a.b!=a.d.c;)c=BB(b3(a),478),s=T5(n.c,c.a),l=T5(n.c,c.b),s&&l&&DH(s.c,new rI(l,c.c));for(yQ(n.a),f=spn(n.b,0);f.b!=f.d.c;)h=BB(b3(f),478),t=KD(n.c,h.a),o=T5(n.c,h.b),t&&o&&DM(t,o,h.c);yQ(n.b)}function xBn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;c=new Pl(n),d5((a=new dkn).g),d5(a.j),$U(a.b),d5(a.d),d5(a.i),$U(a.k),$U(a.c),$U(a.e),b=bIn(a,c,null),O$n(a,c),r=b,t&&(u=eHn(s=new Pl(t)),vSn(r,Pun(Gk(nMt,1),HWn,527,0,[u]))),l=!1,f=!1,e&&(s=new Pl(e),l8n in s.a&&(l=zJ(s,l8n).ge().a),b8n in s.a&&(f=zJ(s,b8n).ge().a)),h=$j(Fen(new Xm,l),f),BSn(new su,r,h),l8n in c.a&&rtn(c,l8n,null),(l||f)&&(nBn(h,o=new py,l,f),rtn(c,l8n,o)),i=new Xg(a),Uon(new OA(r),i)}function DBn(n,t,e){var i,r,c,a,u,o,s,h,f;for(a=new Ykn,s=Pun(Gk(ANt,1),hQn,25,15,[0]),r=-1,c=0,i=0,o=0;o<n.b.c.length;++o){if(!((h=BB(xq(n.b,o),434)).b>0)){if(r=-1,32==fV(h.c,0)){if(f=s[0],ynn(t,s),s[0]>f)continue}else if($Y(t,h.c,s[0])){s[0]+=h.c.length;continue}return 0}if(r<0&&h.a&&(r=o,c=s[0],i=0),r>=0){if(u=h.b,o==r&&0==(u-=i++))return 0;if(!LUn(t,s,h,u,a)){o=r-1,s[0]=c;continue}}else if(r=-1,!LUn(t,s,h,0,a))return 0}return dUn(a,e)?s[0]:0}function RBn(n){var t,e,i,r,c,a;if(!n.f){if(a=new Mo,c=new Mo,null==(t=P$t).a.zc(n,t)){for(r=new AL(kY(n));r.e!=r.i.gc();)pX(a,RBn(BB(kpn(r),26)));t.a.Bc(n),t.a.gc()}for(!n.s&&(n.s=new eU(FAt,n,21,17)),i=new AL(n.s);i.e!=i.i.gc();)cL(e=BB(kpn(i),170),99)&&f9(c,BB(e,18));chn(c),n.r=new TH(n,(BB(Wtn(QQ((QX(),t$t).o),6),18),c.i),c.g),pX(a,n.r),chn(a),n.f=new NO((BB(Wtn(QQ(t$t.o),5),18),a.i),a.g),P5(n).b&=-3}return n.f}function KBn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w;for(a=n.o,i=x8(ANt,hQn,25,a,15,1),r=x8(ANt,hQn,25,a,15,1),e=n.p,t=x8(ANt,hQn,25,e,15,1),c=x8(ANt,hQn,25,e,15,1),s=0;s<a;s++){for(f=0;f<e&&!vmn(n,s,f);)++f;i[s]=f}for(h=0;h<a;h++){for(f=e-1;f>=0&&!vmn(n,h,f);)--f;r[h]=f}for(b=0;b<e;b++){for(u=0;u<a&&!vmn(n,u,b);)++u;t[b]=u}for(w=0;w<e;w++){for(u=a-1;u>=0&&!vmn(n,u,w);)--u;c[w]=u}for(o=0;o<a;o++)for(l=0;l<e;l++)o<c[l]&&o>t[l]&&l<r[o]&&l>i[o]&&FRn(n,o,l,!1,!0)}function _Bn(n){var t,e,i,r,c,a,u,o;e=qy(TD(mMn(n,(fRn(),Bct)))),c=n.a.c.d,u=n.a.d.d,e?(a=kL(XR(new xC(u.a,u.b),c),.5),o=kL(B$(n.e),.5),t=XR(UR(new xC(c.a,c.b),a),o),Hx(n.d,t)):(r=Gy(MD(mMn(n.a,rat))),i=n.d,c.a>=u.a?c.b>=u.b?(i.a=u.a+(c.a-u.a)/2+r,i.b=u.b+(c.b-u.b)/2-r-n.e.b):(i.a=u.a+(c.a-u.a)/2+r,i.b=c.b+(u.b-c.b)/2+r):c.b>=u.b?(i.a=c.a+(u.a-c.a)/2+r,i.b=u.b+(c.b-u.b)/2+r):(i.a=c.a+(u.a-c.a)/2+r,i.b=c.b+(u.b-c.b)/2-r-n.e.b))}function FBn(n,t){var e,i,r,c,a,u,o;if(null==n)return null;if(0==(c=n.length))return"";for(o=x8(ONt,WVn,25,c,15,1),_8(0,c,n.length),_8(0,c,o.length),YU(n,0,c,o,0),e=null,u=t,r=0,a=0;r<c;r++)i=o[r],EWn(),i<=32&&0!=(2&JLt[i])?u?(!e&&(e=new fN(n)),aY(e,r-a++)):(u=t,32!=i&&(!e&&(e=new fN(n)),sV(e,r-a,r-a+1,String.fromCharCode(32)))):u=!1;return u?e?(c=e.a.length)>0?fx(e.a,0,c-1):"":n.substr(0,c-1):e?e.a:n}function BBn(n){NM(n,new MTn(vj(wj(pj(gj(new du,UJn),"ELK DisCo"),"Layouter for arranging unconnected subgraphs. The subgraphs themselves are, by default, not laid out."),new at))),u2(n,UJn,XJn,mpn(Ect)),u2(n,UJn,WJn,mpn(pct)),u2(n,UJn,VJn,mpn(lct)),u2(n,UJn,QJn,mpn(vct)),u2(n,UJn,XYn,mpn(kct)),u2(n,UJn,WYn,mpn(yct)),u2(n,UJn,UYn,mpn(jct)),u2(n,UJn,VYn,mpn(mct)),u2(n,UJn,BJn,mpn(wct)),u2(n,UJn,HJn,mpn(bct)),u2(n,UJn,qJn,mpn(dct)),u2(n,UJn,GJn,mpn(gct))}function HBn(n,t,e,i){var r,c,a,u,o,s,h;if(Bl(c=new $vn(n),(uSn(),Iut)),hon(c,(HXn(),ept),(QEn(),XCt)),r=0,t){for(hon(a=new CSn,(hWn(),dlt),t),hon(c,dlt,t.i),qCn(a,(kUn(),CIt)),CZ(a,c),s=0,h=(o=Z0(t.e)).length;s<h;++s)MZ(o[s],a);hon(t,Elt,c),++r}if(e){for(u=new CSn,hon(c,(hWn(),dlt),e.i),hon(u,dlt,e),qCn(u,(kUn(),oIt)),CZ(u,c),s=0,h=(o=Z0(e.g)).length;s<h;++s)SZ(o[s],u);hon(e,Elt,c),++r}return hon(c,(hWn(),Bft),iln(r)),i.c[i.c.length]=c,c}function qBn(){qBn=O,OOt=Pun(Gk(ONt,1),WVn,25,15,[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70]),AOt=new RegExp("[ \t\n\r\f]+");try{IOt=Pun(Gk(D$t,1),HWn,2015,0,[new vp((s$(),sdn("yyyy-MM-dd'T'HH:mm:ss'.'SSSZ",fR((fk(),fk(),rtt))))),new vp(sdn("yyyy-MM-dd'T'HH:mm:ss'.'SSS",fR(rtt))),new vp(sdn("yyyy-MM-dd'T'HH:mm:ss",fR(rtt))),new vp(sdn("yyyy-MM-dd'T'HH:mm",fR(rtt))),new vp(sdn("yyyy-MM-dd",fR(rtt)))])}catch(n){if(!cL(n=lun(n),78))throw Hp(n)}}function GBn(n){var t,i,r,c;if(r=qXn((!n.c&&(n.c=yhn(n.f)),n.c),0),0==n.e||0==n.a&&-1!=n.f&&n.e<0)return r;if(t=iin(n)<0?1:0,i=n.e,r.length,e.Math.abs(CJ(n.e)),c=new Ik,1==t&&(c.a+="-"),n.e>0)if((i-=r.length-t)>=0){for(c.a+="0.";i>qtt.length;i-=qtt.length)Nq(c,qtt);gR(c,qtt,CJ(i)),oO(c,r.substr(t))}else oO(c,fx(r,t,CJ(i=t-i))),c.a+=".",oO(c,nO(r,CJ(i)));else{for(oO(c,r.substr(t));i<-qtt.length;i+=qtt.length)Nq(c,qtt);gR(c,qtt,CJ(-i))}return c.a}function zBn(n,t,i,r){var c,a,u,o,s,h,f,l,b;return h=(s=XR(new xC(i.a,i.b),n)).a*t.b-s.b*t.a,f=t.a*r.b-t.b*r.a,l=(s.a*r.b-s.b*r.a)/f,b=h/f,0==f?0==h?(a=W8(n,c=UR(new xC(i.a,i.b),kL(new xC(r.a,r.b),.5))),u=W8(UR(new xC(n.a,n.b),t),c),o=.5*e.Math.sqrt(r.a*r.a+r.b*r.b),a<u&&a<=o?new xC(n.a,n.b):u<=o?UR(new xC(n.a,n.b),t):null):null:l>=0&&l<=1&&b>=0&&b<=1?UR(new xC(n.a,n.b),kL(new xC(t.a,t.b),l)):null}function UBn(n,t,e){var i,r,c,a,u;if(i=BB(mMn(n,(HXn(),Ndt)),21),e.a>t.a&&(i.Hc((wEn(),WMt))?n.c.a+=(e.a-t.a)/2:i.Hc(QMt)&&(n.c.a+=e.a-t.a)),e.b>t.b&&(i.Hc((wEn(),JMt))?n.c.b+=(e.b-t.b)/2:i.Hc(YMt)&&(n.c.b+=e.b-t.b)),BB(mMn(n,(hWn(),Zft)),21).Hc((bDn(),lft))&&(e.a>t.a||e.b>t.b))for(u=new Wb(n.a);u.a<u.c.c.length;)(a=BB(n0(u),10)).k==(uSn(),Mut)&&((r=BB(mMn(a,Qft),61))==(kUn(),oIt)?a.n.a+=e.a-t.a:r==SIt&&(a.n.b+=e.b-t.b));c=n.d,n.f.a=e.a-c.b-c.c,n.f.b=e.b-c.d-c.a}function XBn(n,t,e){var i,r,c,a,u;if(i=BB(mMn(n,(HXn(),Ndt)),21),e.a>t.a&&(i.Hc((wEn(),WMt))?n.c.a+=(e.a-t.a)/2:i.Hc(QMt)&&(n.c.a+=e.a-t.a)),e.b>t.b&&(i.Hc((wEn(),JMt))?n.c.b+=(e.b-t.b)/2:i.Hc(YMt)&&(n.c.b+=e.b-t.b)),BB(mMn(n,(hWn(),Zft)),21).Hc((bDn(),lft))&&(e.a>t.a||e.b>t.b))for(a=new Wb(n.a);a.a<a.c.c.length;)(c=BB(n0(a),10)).k==(uSn(),Mut)&&((r=BB(mMn(c,Qft),61))==(kUn(),oIt)?c.n.a+=e.a-t.a:r==SIt&&(c.n.b+=e.b-t.b));u=n.d,n.f.a=e.a-u.b-u.c,n.f.b=e.b-u.d-u.a}function WBn(n){var t,i,r,c,a,u,o,s,h,f;for(s=new Ib(new Cb(xOn(n)).a.vc().Kc());s.a.Ob();){for(r=BB(s.a.Pb(),42),h=0,f=0,h=(o=BB(r.cd(),10)).d.d,f=o.o.b+o.d.a,n.d[o.p]=0,t=o;(c=n.a[t.p])!=o;)i=Mgn(t,c),u=0,u=n.c==(gJ(),nyt)?i.d.n.b+i.d.a.b-i.c.n.b-i.c.a.b:i.c.n.b+i.c.a.b-i.d.n.b-i.d.a.b,a=Gy(n.d[t.p])+u,n.d[c.p]=a,h=e.Math.max(h,c.d.d-a),f=e.Math.max(f,a+c.o.b+c.d.a),t=c;t=o;do{n.d[t.p]=Gy(n.d[t.p])+h,t=n.a[t.p]}while(t!=o);n.b[o.p]=h+f}}function VBn(n){var t,i,r,c,a,u,o,s,h,f,l;for(n.b=!1,f=RQn,o=KQn,l=RQn,s=KQn,i=n.e.a.ec().Kc();i.Ob();)for(r=(t=BB(i.Pb(),266)).a,f=e.Math.min(f,r.c),o=e.Math.max(o,r.c+r.b),l=e.Math.min(l,r.d),s=e.Math.max(s,r.d+r.a),a=new Wb(t.c);a.a<a.c.c.length;)(c=BB(n0(a),395)).a.a?(u=(h=r.d+c.b.b)+c.c,l=e.Math.min(l,h),s=e.Math.max(s,u)):(u=(h=r.c+c.b.a)+c.c,f=e.Math.min(f,h),o=e.Math.max(o,u));n.a=new xC(o-f,s-l),n.c=new xC(f+n.d.a,l+n.d.b)}function QBn(n,t,e){var i,r,c,a,u,o,s,h;for(h=new Np,c=0,tin(s=new x0(0,e),new asn(0,0,s,e)),r=0,o=new AL(n);o.e!=o.i.gc();)u=BB(kpn(o),33),i=BB(xq(s.a,s.a.c.length-1),187),r+u.g+(0==BB(xq(s.a,0),187).b.c.length?0:e)>t&&(r=0,c+=s.b+e,h.c[h.c.length]=s,tin(s=new x0(c,e),i=new asn(0,s.f,s,e)),r=0),0==i.b.c.length||u.f>=i.o&&u.f<=i.f||.5*i.a<=u.f&&1.5*i.a>=u.f?ybn(i,u):(tin(s,a=new asn(i.s+i.r+e,s.f,s,e)),ybn(a,u)),r=u.i+u.g;return h.c[h.c.length]=s,h}function YBn(n){var t,e,i,r,c,a;if(!n.a){if(n.o=null,a=new gp(n),t=new So,null==(e=P$t).a.zc(n,e)){for(c=new AL(kY(n));c.e!=c.i.gc();)pX(a,YBn(BB(kpn(c),26)));e.a.Bc(n),e.a.gc()}for(!n.s&&(n.s=new eU(FAt,n,21,17)),r=new AL(n.s);r.e!=r.i.gc();)cL(i=BB(kpn(r),170),322)&&f9(t,BB(i,34));chn(t),n.k=new EH(n,(BB(Wtn(QQ((QX(),t$t).o),7),18),t.i),t.g),pX(a,n.k),chn(a),n.a=new NO((BB(Wtn(QQ(t$t.o),4),18),a.i),a.g),P5(n).b&=-2}return n.a}function JBn(n,t,e,i,r,c,a){var u,o,s,h,f;return h=!1,u=dNn(e.q,t.f+t.b-e.q.f),!((f=r-(e.q.e+u-a))<i.g)&&(o=c==n.c.length-1&&f>=(l1(c,n.c.length),BB(n.c[c],200)).e,!((s=cHn(i,f,!1).a)>t.b&&!o)&&((o||s<=t.b)&&(o&&s>t.b?(e.d=s,p9(e,FSn(e,s))):(aEn(e.q,u),e.c=!0),p9(i,r-(e.s+e.r)),Tvn(i,e.q.e+e.q.d,t.f),tin(t,i),n.c.length>c&&(Tkn((l1(c,n.c.length),BB(n.c[c],200)),i),0==(l1(c,n.c.length),BB(n.c[c],200)).a.c.length&&s6(n,c)),h=!0),h))}function ZBn(n,t,e,i){var r,c,a,u,o,s,h;if(h=axn(n.e.Tg(),t),r=0,c=BB(n.g,119),o=null,ZM(),BB(t,66).Oj()){for(u=0;u<n.i;++u)if(a=c[u],h.rl(a.ak())){if(Nfn(a,e)){o=a;break}++r}}else if(null!=e){for(u=0;u<n.i;++u)if(a=c[u],h.rl(a.ak())){if(Nfn(e,a.dd())){o=a;break}++r}}else for(u=0;u<n.i;++u)if(a=c[u],h.rl(a.ak())){if(null==a.dd()){o=a;break}++r}return o&&(mA(n.e)&&(s=t.$j()?new b4(n.e,4,t,e,null,r,!0):LY(n,t.Kj()?2:1,t,e,t.zj(),-1,!0),i?i.Ei(s):i=s),i=TKn(n,o,i)),i}function nHn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d;switch(w=0,d=0,s=c.c,o=c.b,f=i.f,b=i.g,t.g){case 0:w=r.i+r.g+u,d=n.c?gTn(w,a,r,u):r.j,l=e.Math.max(s,w+b),h=e.Math.max(o,d+f);break;case 1:d=r.j+r.f+u,w=n.c?dTn(d,a,r,u):r.i,l=e.Math.max(s,w+b),h=e.Math.max(o,d+f);break;case 2:w=s+u,d=0,l=s+u+b,h=e.Math.max(o,f);break;case 3:w=0,d=o+u,l=e.Math.max(s,b),h=o+u+f;break;default:throw Hp(new _y("IllegalPlacementOption."))}return new awn(n.a,l,h,t,w,d)}function tHn(n){var t,i,r,c,a,u,o,s,h,f,l,b;if(o=n.d,l=BB(mMn(n,(hWn(),Klt)),15),t=BB(mMn(n,Dft),15),l||t){if(a=Gy(MD(edn(n,(HXn(),ppt)))),u=Gy(MD(edn(n,vpt))),b=0,l){for(h=0,c=l.Kc();c.Ob();)r=BB(c.Pb(),10),h=e.Math.max(h,r.o.b),b+=r.o.a;b+=a*(l.gc()-1),o.d+=h+u}if(i=0,t){for(h=0,c=t.Kc();c.Ob();)r=BB(c.Pb(),10),h=e.Math.max(h,r.o.b),i+=r.o.a;i+=a*(t.gc()-1),o.a+=h+u}(s=e.Math.max(b,i))>n.o.a&&(f=(s-n.o.a)/2,o.b=e.Math.max(o.b,f),o.c=e.Math.max(o.c,f))}}function eHn(n){var t,e,i,r,c,a;for(cA(r=new R0,(Nun(),JTt)),i=new Sb(new Jy(new TT(n,jrn(n,x8(Qtt,sVn,2,0,6,1))).b));i.b<i.d.gc();)Px(i.b<i.d.gc()),e=SD(i.d.Xb(i.c=i.b++)),(c=pGn(lAt,e))&&null!=(a=Zqn(c,(t=zJ(n,e)).je()?t.je().a:t.ge()?""+t.ge().a:t.he()?""+t.he().a:t.Ib()))&&((SN(c.j,(rpn(),sMt))||SN(c.j,hMt))&&son(Ynn(r,UOt),c,a),SN(c.j,uMt)&&son(Ynn(r,_Ot),c,a),SN(c.j,fMt)&&son(Ynn(r,XOt),c,a),SN(c.j,oMt)&&son(Ynn(r,zOt),c,a));return r}function iHn(n,t,e,i){var r,c,a,u,o,s;if(o=axn(n.e.Tg(),t),c=BB(n.g,119),$xn(n.e,t)){for(r=0,u=0;u<n.i;++u)if(a=c[u],o.rl(a.ak())){if(r==e)return ZM(),BB(t,66).Oj()?a:(null!=(s=a.dd())&&i&&cL(t,99)&&0!=(BB(t,18).Bb&BQn)&&(s=FIn(n,t,u,r,s)),s);++r}throw Hp(new Ay(e9n+e+o8n+r))}for(r=0,u=0;u<n.i;++u){if(a=c[u],o.rl(a.ak()))return ZM(),BB(t,66).Oj()?a:(null!=(s=a.dd())&&i&&cL(t,99)&&0!=(BB(t,18).Bb&BQn)&&(s=FIn(n,t,u,r,s)),s);++r}return t.zj()}function rHn(n,t,e){var i,r,c,a,u,o,s,h;if(r=BB(n.g,119),$xn(n.e,t))return ZM(),BB(t,66).Oj()?new lq(t,n):new xI(t,n);for(s=axn(n.e.Tg(),t),i=0,u=0;u<n.i;++u){if(a=(c=r[u]).ak(),s.rl(a)){if(ZM(),BB(t,66).Oj())return c;if(a==(TOn(),lLt)||a==sLt){for(o=new lN(Bbn(c.dd()));++u<n.i;)((a=(c=r[u]).ak())==lLt||a==sLt)&&oO(o,Bbn(c.dd()));return gK(BB(t.Yj(),148),o.a)}return null!=(h=c.dd())&&e&&cL(t,99)&&0!=(BB(t,18).Bb&BQn)&&(h=FIn(n,t,u,i,h)),h}++i}return t.zj()}function cHn(n,t,i){var r,c,a,u,o,s,h,f,l,b;for(a=0,u=n.t,c=0,r=0,s=0,b=0,l=0,i&&(n.n.c=x8(Ant,HWn,1,0,5,1),WB(n.n,new RJ(n.s,n.t,n.i))),o=0,f=new Wb(n.b);f.a<f.c.c.length;)a+(h=BB(n0(f),33)).g+(o>0?n.i:0)>t&&s>0&&(a=0,u+=s+n.i,c=e.Math.max(c,b),r+=s+n.i,s=0,b=0,i&&(++l,WB(n.n,new RJ(n.s,u,n.i))),o=0),b+=h.g+(o>0?n.i:0),s=e.Math.max(s,h.f),i&&smn(BB(xq(n.n,l),211),h),a+=h.g+(o>0?n.i:0),++o;return c=e.Math.max(c,b),r+=s,i&&(n.r=c,n.d=r,yyn(n.j)),new UV(n.s,n.t,c,r)}function aHn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b;if($T(),SU(n,"src"),SU(e,"dest"),l=tsn(n),o=tsn(e),pH(0!=(4&l.i),"srcType is not an array"),pH(0!=(4&o.i),"destType is not an array"),f=l.c,a=o.c,pH(0!=(1&f.i)?f==a:0==(1&a.i),"Array types don't match"),b=n.length,s=e.length,t<0||i<0||r<0||t+r>b||i+r>s)throw Hp(new fv);if(0==(1&f.i)&&l!=o)if(h=een(n),c=een(e),GI(n)===GI(e)&&t<i)for(t+=r,u=i+r;u-- >i;)$X(c,u,h[--t]);else for(u=i+r;i<u;)$X(c,i++,h[t++]);else r>0&&_Cn(n,t,e,i,r,!0)}function uHn(){uHn=O,ret=Pun(Gk(ANt,1),hQn,25,15,[_Vn,1162261467,OVn,1220703125,362797056,1977326743,OVn,387420489,AQn,214358881,429981696,815730721,1475789056,170859375,268435456,410338673,612220032,893871739,128e7,1801088541,113379904,148035889,191102976,244140625,308915776,387420489,481890304,594823321,729e6,887503681,OVn,1291467969,1544804416,1838265625,60466176]),cet=Pun(Gk(ANt,1),hQn,25,15,[-1,-1,31,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5])}function oHn(n){var t,e,i,r,c,a,u;for(i=new Wb(n.b);i.a<i.c.c.length;)for(c=new Wb(a0(BB(n0(i),29).a));c.a<c.c.c.length;)if(Znn(r=BB(n0(c),10))&&!(e=BB(mMn(r,(hWn(),Rft)),305)).g&&e.d)for(t=e,u=e.d;u;)eRn(u.i,u.k,!1,!0),A7(t.a),A7(u.i),A7(u.k),A7(u.b),MZ(u.c,t.c.d),MZ(t.c,null),PZ(t.a,null),PZ(u.i,null),PZ(u.k,null),PZ(u.b,null),(a=new v3(t.i,u.a,t.e,u.j,u.f)).k=t.k,a.n=t.n,a.b=t.b,a.c=u.c,a.g=t.g,a.d=u.d,hon(t.i,Rft,a),hon(u.a,Rft,a),u=u.d,t=a}function sHn(n,t){var e,i,r,c,a;if(a=BB(t,136),T$n(n),T$n(a),null!=a.b){if(n.c=!0,null==n.b)return n.b=x8(ANt,hQn,25,a.b.length,15,1),void aHn(a.b,0,n.b,0,a.b.length);for(c=x8(ANt,hQn,25,n.b.length+a.b.length,15,1),e=0,i=0,r=0;e<n.b.length||i<a.b.length;)e>=n.b.length?(c[r++]=a.b[i++],c[r++]=a.b[i++]):i>=a.b.length?(c[r++]=n.b[e++],c[r++]=n.b[e++]):a.b[i]<n.b[e]||a.b[i]===n.b[e]&&a.b[i+1]<n.b[e+1]?(c[r++]=a.b[i++],c[r++]=a.b[i++]):(c[r++]=n.b[e++],c[r++]=n.b[e++]);n.b=c}}function hHn(n,t){var e,i,r,c,a,u,o,s,h,f;return e=qy(TD(mMn(n,(hWn(),slt)))),u=qy(TD(mMn(t,slt))),i=BB(mMn(n,hlt),11),o=BB(mMn(t,hlt),11),r=BB(mMn(n,flt),11),s=BB(mMn(t,flt),11),h=!!i&&i==o,f=!!r&&r==s,e||u?(c=(!qy(TD(mMn(n,slt)))||qy(TD(mMn(n,olt))))&&(!qy(TD(mMn(t,slt)))||qy(TD(mMn(t,olt)))),a=!(qy(TD(mMn(n,slt)))&&qy(TD(mMn(n,olt)))||qy(TD(mMn(t,slt)))&&qy(TD(mMn(t,olt)))),new R_(h&&c||f&&a,h,f)):new R_(BB(n0(new Wb(n.j)),11).p==BB(n0(new Wb(t.j)),11).p,h,f)}function fHn(n){var t,i,r,c,a,u,o,s;for(r=0,i=0,s=new YT,t=0,o=new Wb(n.n);o.a<o.c.c.length;)0==(u=BB(n0(o),211)).c.c.length?r5(s,u,s.c.b,s.c):(r=e.Math.max(r,u.d),i+=u.a+(t>0?n.i:0)),++t;for(nwn(n.n,s),n.d=i,n.r=r,n.g=0,n.f=0,n.e=0,n.o=RQn,n.p=RQn,a=new Wb(n.b);a.a<a.c.c.length;)c=BB(n0(a),33),n.p=e.Math.min(n.p,c.g),n.g=e.Math.max(n.g,c.g),n.f=e.Math.max(n.f,c.f),n.o=e.Math.min(n.o,c.f),n.e+=c.f+n.i;n.a=n.e/n.b.c.length-n.i*((n.b.c.length-1)/n.b.c.length),yyn(n.j)}function lHn(n){var t,e,i,r;return 0!=(64&n.Db)?Yln(n):(t=new lN(V5n),(i=n.k)?oO(oO((t.a+=' "',t),i),'"'):(!n.n&&(n.n=new eU(zOt,n,1,7)),n.n.i>0&&(!(r=(!n.n&&(n.n=new eU(zOt,n,1,7)),BB(Wtn(n.n,0),137)).a)||oO(oO((t.a+=' "',t),r),'"'))),!n.b&&(n.b=new hK(KOt,n,4,7)),e=!(n.b.i<=1&&(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c.i<=1)),t.a+=e?" [":" ",oO(t,JL(new mk,new AL(n.b))),e&&(t.a+="]"),t.a+=e1n,e&&(t.a+="["),oO(t,JL(new mk,new AL(n.c))),e&&(t.a+="]"),t.a)}function bHn(n,t){var e,i,r,c,a,u,o;if(n.a){if(o=null,null!=(u=n.a.ne())?t.a+=""+u:null!=(a=n.a.Dj())&&(-1!=(c=GO(a,YTn(91)))?(o=a.substr(c),t.a+=""+fx(null==a?zWn:(kW(a),a),0,c)):t.a+=""+a),n.d&&0!=n.d.i){for(r=!0,t.a+="<",i=new AL(n.d);i.e!=i.i.gc();)e=BB(kpn(i),87),r?r=!1:t.a+=FWn,bHn(e,t);t.a+=">"}null!=o&&(t.a+=""+o)}else n.e?null!=(u=n.e.zb)&&(t.a+=""+u):(t.a+="?",n.b?(t.a+=" super ",bHn(n.b,t)):n.f&&(t.a+=" extends ",bHn(n.f,t)))}function wHn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M;for(y=n.c,k=t.c,e=E7(y.a,n,0),i=E7(k.a,t,0),v=BB(xwn(n,(ain(),Hvt)).Kc().Pb(),11),T=BB(xwn(n,qvt).Kc().Pb(),11),m=BB(xwn(t,Hvt).Kc().Pb(),11),M=BB(xwn(t,qvt).Kc().Pb(),11),g=Z0(v.e),j=Z0(T.g),p=Z0(m.e),E=Z0(M.g),Qyn(n,i,k),s=0,b=(c=p).length;s<b;++s)MZ(c[s],v);for(h=0,w=(a=E).length;h<w;++h)SZ(a[h],T);for(Qyn(t,e,y),f=0,d=(u=g).length;f<d;++f)MZ(u[f],m);for(o=0,l=(r=j).length;o<l;++o)SZ(r[o],M)}function dHn(n,t,e,i){var r,c,a,u,o,s;if(c=Wln(i),!qy(TD(mMn(i,(HXn(),Igt))))&&!qy(TD(mMn(n,bgt)))||vA(BB(mMn(n,ept),98)))switch(CZ(u=new CSn,n),t?((s=u.n).a=t.a-n.n.a,s.b=t.b-n.n.b,WSn(s,0,0,n.o.a,n.o.b),qCn(u,z_n(u,c))):(r=hwn(c),qCn(u,e==(ain(),qvt)?r:Tln(r))),a=BB(mMn(i,(hWn(),Zft)),21),o=u.j,c.g){case 2:case 1:(o==(kUn(),sIt)||o==SIt)&&a.Fc((bDn(),gft));break;case 4:case 3:(o==(kUn(),oIt)||o==CIt)&&a.Fc((bDn(),gft))}else r=hwn(c),u=R_n(n,e,e==(ain(),qvt)?r:Tln(r));return u}function gHn(n,t,i){var r,c,a,u,o,s,h;return e.Math.abs(t.s-t.c)<lZn||e.Math.abs(i.s-i.c)<lZn?0:(r=WNn(n,t.j,i.e),c=WNn(n,i.j,t.e),a=0,-1==r||-1==c?(-1==r&&(new zZ((O6(),Tyt),i,t,1),++a),-1==c&&(new zZ((O6(),Tyt),t,i,1),++a)):(u=Tfn(t.j,i.s,i.c),u+=Tfn(i.e,t.s,t.c),o=Tfn(i.j,t.s,t.c),(s=r+16*u)<(h=c+16*(o+=Tfn(t.e,i.s,i.c)))?new zZ((O6(),Myt),t,i,h-s):s>h?new zZ((O6(),Myt),i,t,s-h):s>0&&h>0&&(new zZ((O6(),Myt),t,i,0),new zZ(Myt,i,t,0))),a)}function pHn(n,t){var i,r,c,a,u;for(u=new usn(new Pb(n.f.b).a);u.b;){if(c=BB((a=ten(u)).cd(),594),1==t){if(c.gf()!=(Ffn(),HPt)&&c.gf()!=KPt)continue}else if(c.gf()!=(Ffn(),_Pt)&&c.gf()!=FPt)continue;switch(r=BB(BB(a.dd(),46).b,81),i=BB(BB(a.dd(),46).a,189).c,c.gf().g){case 2:r.g.c=n.e.a,r.g.b=e.Math.max(1,r.g.b+i);break;case 1:r.g.c=r.g.c+i,r.g.b=e.Math.max(1,r.g.b-i);break;case 4:r.g.d=n.e.b,r.g.a=e.Math.max(1,r.g.a+i);break;case 3:r.g.d=r.g.d+i,r.g.a=e.Math.max(1,r.g.a-i)}}}function vHn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(o=x8(ANt,hQn,25,t.b.c.length,15,1),h=x8($ut,$Vn,267,t.b.c.length,0,1),s=x8(Out,a1n,10,t.b.c.length,0,1),b=0,w=(l=n.a).length;b<w;++b){for(g=0,u=new Wb((f=l[b]).e);u.a<u.c.c.length;)++o[r=tA((c=BB(n0(u),10)).c)],d=Gy(MD(mMn(t,(HXn(),ypt)))),o[r]>0&&s[r]&&(d=K$(n.b,s[r],c)),g=e.Math.max(g,c.c.c.b+d);for(a=new Wb(f.e);a.a<a.c.c.length;)(c=BB(n0(a),10)).n.b=g+c.d.d,(i=c.c).c.b=g+c.d.d+c.o.b+c.d.a,h[E7(i.b.b,i,0)]=c.k,s[E7(i.b.b,i,0)]=c}}function mHn(n,t){var e,i,r,c,a,u,o,s,f,l,b;for(i=new oz(ZL(dLn(t).a.Kc(),new h));dAn(i);)cL(Wtn((!(e=BB(U5(i),79)).b&&(e.b=new hK(KOt,e,4,7)),e.b),0),186)||(o=PTn(BB(Wtn((!e.c&&(e.c=new hK(KOt,e,5,8)),e.c),0),82)),nAn(e)||(a=t.i+t.g/2,u=t.j+t.f/2,f=o.i+o.g/2,l=o.j+o.f/2,(b=new Gj).a=f-a,b.b=l-u,Ukn(c=new xC(b.a,b.b),t.g,t.f),b.a-=c.a,b.b-=c.b,a=f-b.a,u=l-b.b,Ukn(s=new xC(b.a,b.b),o.g,o.f),b.a-=s.a,b.b-=s.b,f=a+b.a,l=u+b.b,Ien(r=cDn(e,!0,!0),a),Aen(r,u),Ten(r,f),Oen(r,l),mHn(n,o)))}function yHn(n){NM(n,new MTn(vj(wj(pj(gj(new du,R4n),"ELK SPOrE Compaction"),"ShrinkTree is a compaction algorithm that maintains the topology of a layout. The relocation of diagram elements is based on contracting a spanning tree."),new tu))),u2(n,R4n,K4n,mpn(kTt)),u2(n,R4n,_4n,mpn(vTt)),u2(n,R4n,F4n,mpn(pTt)),u2(n,R4n,B4n,mpn(dTt)),u2(n,R4n,H4n,mpn(gTt)),u2(n,R4n,QJn,wTt),u2(n,R4n,vZn,8),u2(n,R4n,q4n,mpn(yTt)),u2(n,R4n,G4n,mpn(hTt)),u2(n,R4n,z4n,mpn(fTt)),u2(n,R4n,X2n,(hN(),!1))}function kHn(n,t){var i,r,c,a,u,o,s,h,f,l;for(OTn(t,"Simple node placement",1),l=BB(mMn(n,(hWn(),Alt)),304),o=0,a=new Wb(n.b);a.a<a.c.c.length;){for((u=(r=BB(n0(a),29)).c).b=0,i=null,h=new Wb(r.a);h.a<h.c.c.length;)s=BB(n0(h),10),i&&(u.b+=Idn(s,i,l.c)),u.b+=s.d.d+s.o.b+s.d.a,i=s;o=e.Math.max(o,u.b)}for(c=new Wb(n.b);c.a<c.c.c.length;)for(f=(o-(u=(r=BB(n0(c),29)).c).b)/2,i=null,h=new Wb(r.a);h.a<h.c.c.length;)s=BB(n0(h),10),i&&(f+=Idn(s,i,l.c)),f+=s.d.d,s.n.b=f,f+=s.o.b+s.d.a,i=s;HSn(t)}function jHn(n,t,e,i){var r,c,a,u,o,s,h,f;if(0==i.gc())return!1;if(ZM(),a=(o=BB(t,66).Oj())?i:new gtn(i.gc()),$xn(n.e,t)){if(t.hi())for(h=i.Kc();h.Ob();)UFn(n,t,s=h.Pb(),cL(t,99)&&0!=(BB(t,18).Bb&BQn))||(c=Z3(t,s),a.Fc(c));else if(!o)for(h=i.Kc();h.Ob();)c=Z3(t,s=h.Pb()),a.Fc(c)}else{for(f=axn(n.e.Tg(),t),r=BB(n.g,119),u=0;u<n.i;++u)if(c=r[u],f.rl(c.ak()))throw Hp(new _y(I7n));if(i.gc()>1)throw Hp(new _y(I7n));o||(c=Z3(t,i.Kc().Pb()),a.Fc(c))}return oon(n,EPn(n,t,e),a)}function EHn(n,t){var e,i,r,c;for(Qtn(t.b.j),JT($V(new Rq(null,new w1(t.d,16)),new cc),new ac),c=new Wb(t.d);c.a<c.c.c.length;){switch((r=BB(n0(c),101)).e.g){case 0:e=BB(xq(r.j,0),113).d.j,Gl(r,BB($N(Oz(BB(h6(r.k,e),15).Oc(),Qst)),113)),ql(r,BB($N(Iz(BB(h6(r.k,e),15).Oc(),Qst)),113));break;case 1:i=Hyn(r),Gl(r,BB($N(Oz(BB(h6(r.k,i[0]),15).Oc(),Qst)),113)),ql(r,BB($N(Iz(BB(h6(r.k,i[1]),15).Oc(),Qst)),113));break;case 2:VPn(n,r);break;case 3:KNn(r);break;case 4:GNn(n,r)}Vtn(r)}n.a=null}function THn(n,t,e){var i,r,c,a,u,o,s,h;return i=n.a.o==(oZ(),cyt)?RQn:KQn,!(u=cFn(n,new aC(t,e))).a&&u.c?(DH(n.d,u),i):u.a?(r=u.a.c,o=u.a.d,e?(s=n.a.c==(gJ(),tyt)?o:r,c=n.a.c==tyt?r:o,a=n.a.g[c.i.p],h=Gy(n.a.p[a.p])+Gy(n.a.d[c.i.p])+c.n.b+c.a.b-Gy(n.a.d[s.i.p])-s.n.b-s.a.b):(s=n.a.c==(gJ(),nyt)?o:r,c=n.a.c==nyt?r:o,h=Gy(n.a.p[n.a.g[c.i.p].p])+Gy(n.a.d[c.i.p])+c.n.b+c.a.b-Gy(n.a.d[s.i.p])-s.n.b-s.a.b),n.a.n[n.a.g[r.i.p].p]=(hN(),!0),n.a.n[n.a.g[o.i.p].p]=!0,h):i}function MHn(n,t,e){var i,r,c,a,u,o,s;if($xn(n.e,t))ZM(),AOn((u=BB(t,66).Oj()?new lq(t,n):new xI(t,n)).c,u.b),Z$(u,BB(e,14));else{for(s=axn(n.e.Tg(),t),i=BB(n.g,119),c=0;c<n.i;++c)if(r=i[c].ak(),s.rl(r)){if(r==(TOn(),lLt)||r==sLt){for(a=c,(o=Ovn(n,t,e))?fDn(n,c):++c;c<n.i;)(r=i[c].ak())==lLt||r==sLt?fDn(n,c):++c;o||BB(ovn(n,a,Z3(t,e)),72)}else Ovn(n,t,e)?fDn(n,c):BB(ovn(n,c,(ZM(),BB(t,66).Oj()?BB(e,72):Z3(t,e))),72);return}Ovn(n,t,e)||f9(n,(ZM(),BB(t,66).Oj()?BB(e,72):Z3(t,e)))}}function SHn(n,t,e){var i,r,c,a,u,o,s,h;return Nfn(e,n.b)||(n.b=e,c=new Jn,a=BB(P4($V(new Rq(null,new w1(e.f,16)),c),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21),n.e=!0,n.f=!0,n.c=!0,n.d=!0,r=a.Hc((Hpn(),Brt)),i=a.Hc(Hrt),r&&!i&&(n.f=!1),!r&&i&&(n.d=!1),r=a.Hc(Frt),i=a.Hc(qrt),r&&!i&&(n.c=!1),!r&&i&&(n.e=!1)),h=BB(n.a.Ce(t,e),46),o=BB(h.a,19).a,s=BB(h.b,19).a,u=!1,o<0?n.c||(u=!0):n.e||(u=!0),s<0?n.d||(u=!0):n.f||(u=!0),u?SHn(n,h,e):h}function PHn(n){var t,i,r,c;c=n.o,qD(),n.A.dc()||Nfn(n.A,$rt)?t=c.b:(t=MIn(n.f),n.A.Hc((mdn(),RIt))&&!n.B.Hc((n_n(),XIt))&&(t=e.Math.max(t,MIn(BB(oV(n.p,(kUn(),oIt)),244))),t=e.Math.max(t,MIn(BB(oV(n.p,CIt),244)))),(i=oan(n))&&(t=e.Math.max(t,i.b)),n.A.Hc(KIt)&&(n.q!=(QEn(),WCt)&&n.q!=XCt||(t=e.Math.max(t,XH(BB(oV(n.b,(kUn(),oIt)),124))),t=e.Math.max(t,XH(BB(oV(n.b,CIt),124)))))),qy(TD(n.e.yf().We((sWn(),FSt))))?c.b=e.Math.max(c.b,t):c.b=t,(r=n.f.i).d=0,r.a=t,GFn(n.f)}function CHn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;for(h=0;h<t.length;h++){for(a=n.Kc();a.Ob();)BB(a.Pb(),225).Of(h,t);for(f=0;f<t[h].length;f++){for(u=n.Kc();u.Ob();)BB(u.Pb(),225).Pf(h,f,t);for(b=t[h][f].j,l=0;l<b.c.length;l++){for(o=n.Kc();o.Ob();)BB(o.Pb(),225).Qf(h,f,l,t);for(l1(l,b.c.length),e=0,r=new m6(BB(b.c[l],11).b);y$(r.a)||y$(r.b);)for(i=BB(y$(r.a)?n0(r.a):n0(r.b),17),s=n.Kc();s.Ob();)BB(s.Pb(),225).Nf(h,f,l,e++,i,t)}}}for(c=n.Kc();c.Ob();)BB(c.Pb(),225).Mf()}function IHn(n,t){var e,i,r,c,a;for(n.b=Gy(MD(mMn(t,(HXn(),kpt)))),n.c=Gy(MD(mMn(t,Tpt))),n.d=BB(mMn(t,rgt),336),n.a=BB(mMn(t,Pdt),275),fmn(t),r=(c=BB(P4(AV(AV(wnn(wnn(new Rq(null,new w1(t.b,16)),new ye),new ke),new je),new Ee),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15)).Kc();r.Ob();)e=BB(r.Pb(),17),BB(mMn(e,(hWn(),Nlt)),15).Jc(new ed(n)),hon(e,Nlt,null);for(i=c.Kc();i.Ob();)e=BB(i.Pb(),17),a=BB(mMn(e,(hWn(),xlt)),17),FXn(n,BB(mMn(e,$lt),15),a),hon(e,$lt,null)}function OHn(n){n.b=null,n.a=null,n.o=null,n.q=null,n.v=null,n.w=null,n.B=null,n.p=null,n.Q=null,n.R=null,n.S=null,n.T=null,n.U=null,n.V=null,n.W=null,n.bb=null,n.eb=null,n.ab=null,n.H=null,n.db=null,n.c=null,n.d=null,n.f=null,n.n=null,n.r=null,n.s=null,n.u=null,n.G=null,n.J=null,n.e=null,n.j=null,n.i=null,n.g=null,n.k=null,n.t=null,n.F=null,n.I=null,n.L=null,n.M=null,n.O=null,n.P=null,n.$=null,n.N=null,n.Z=null,n.cb=null,n.K=null,n.D=null,n.A=null,n.C=null,n._=null,n.fb=null,n.X=null,n.Y=null,n.gb=!1,n.hb=!1}function AHn(n){var t,e,i,r,c;if(n.k!=(uSn(),Cut))return!1;if(n.j.c.length<=1)return!1;if(BB(mMn(n,(HXn(),ept)),98)==(QEn(),XCt))return!1;if(bvn(),(i=(n.q?n.q:(SQ(),SQ(),het))._b(Rgt)?BB(mMn(n,Rgt),197):BB(mMn(vW(n),Kgt),197))==lvt)return!1;if(i!=fvt&&i!=hvt){if(r=Gy(MD(edn(n,Npt))),!(t=BB(mMn(n,Lpt),142))&&(t=new HR(r,r,r,r)),c=abn(n,(kUn(),CIt)),t.d+t.a+(c.gc()-1)*r>n.o.b)return!1;if(e=abn(n,oIt),t.d+t.a+(e.gc()-1)*r>n.o.b)return!1}return!0}function $Hn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;if(a=n.e,o=t.e,0==a)return t;if(0==o)return n;if((c=n.d)+(u=t.d)==2)return e=e0(n.a[0],UQn),i=e0(t.a[0],UQn),a==o?(w=dG(h=rbn(e,i)),0==(b=dG(jz(h,32)))?new X6(a,w):new lU(a,2,Pun(Gk(ANt,1),hQn,25,15,[w,b]))):npn(a<0?ibn(i,e):ibn(e,i));if(a==o)l=a,f=c>=u?N8(n.a,c,t.a,u):N8(t.a,u,n.a,c);else{if(0==(r=c!=u?c>u?1:-1:Msn(n.a,t.a,c)))return ODn(),eet;1==r?(l=a,f=d6(n.a,c,t.a,u)):(l=o,f=d6(t.a,u,n.a,c))}return X0(s=new lU(l,f.length,f)),s}function LHn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w;return l=qy(TD(mMn(t,(HXn(),Ogt)))),b=null,a==(ain(),Hvt)&&r.c.i==i?b=r.c:a==qvt&&r.d.i==i&&(b=r.d),(h=u)&&l&&!b?(WB(h.e,r),w=e.Math.max(Gy(MD(mMn(h.d,agt))),Gy(MD(mMn(r,agt)))),hon(h.d,agt,w)):(kUn(),f=PIt,b?f=b.j:vA(BB(mMn(i,ept),98))&&(f=a==Hvt?CIt:oIt),s=xHn(n,t,i,a,f,r),o=W5((vW(i),r)),a==Hvt?(SZ(o,BB(xq(s.j,0),11)),MZ(o,c)):(SZ(o,c),MZ(o,BB(xq(s.j,0),11))),h=new zfn(r,o,s,BB(mMn(s,(hWn(),dlt)),11),a,!b)),JIn(n.a,r,new L_(h.d,t,a)),h}function NHn(n,t){var e,i,r,c,a,u,o,s,h,f;if(h=null,n.d&&(h=BB(SJ(n.d,t),138)),!h){if(f=(c=n.a.Mh()).i,!n.d||NT(n.d)!=f){for(o=new xp,n.d&&Tcn(o,n.d),u=s=o.f.c+o.g.c;u<f;++u)i=BB(Wtn(c,u),138),(e=BB(null==(r=Cfn(n.e,i).ne())?jCn(o.f,null,i):ubn(o.g,r,i),138))&&e!=i&&(null==r?jCn(o.f,null,e):ubn(o.g,r,e));if(o.f.c+o.g.c!=f)for(a=0;a<s;++a)i=BB(Wtn(c,a),138),(e=BB(null==(r=Cfn(n.e,i).ne())?jCn(o.f,null,i):ubn(o.g,r,i),138))&&e!=i&&(null==r?jCn(o.f,null,e):ubn(o.g,r,e));n.d=o}h=BB(SJ(n.d,t),138)}return h}function xHn(n,t,e,i,r,c){var a,u,o,s,h,f;return a=null,s=i==(ain(),Hvt)?c.c:c.d,o=Wln(t),s.i==e?(a=BB(RX(n.b,s),10))||(hon(a=bXn(s,BB(mMn(e,(HXn(),ept)),98),r,HKn(s),null,s.n,s.o,o,t),(hWn(),dlt),s),VW(n.b,s,a)):(u=AEn(a=bXn((h=new Zn,f=Gy(MD(mMn(t,(HXn(),ypt))))/2,son(h,tpt,f),h),BB(mMn(e,ept),98),r,i==Hvt?-1:1,null,new Gj,new xC(0,0),o,t),e,i),hon(a,(hWn(),dlt),u),VW(n.b,u,a)),BB(mMn(t,(hWn(),Zft)),21).Fc((bDn(),lft)),vA(BB(mMn(t,(HXn(),ept)),98))?hon(t,ept,(QEn(),VCt)):hon(t,ept,(QEn(),QCt)),a}function DHn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d;OTn(t,"Orthogonal edge routing",1),s=Gy(MD(mMn(n,(HXn(),Apt)))),e=Gy(MD(mMn(n,kpt))),i=Gy(MD(mMn(n,Tpt))),l=new fX(0,e),d=0,a=new M2(n.b,0),u=null,h=null,o=null,f=null;do{f=(h=a.b<a.d.gc()?(Px(a.b<a.d.gc()),BB(a.d.Xb(a.c=a.b++),29)):null)?h.a:null,u&&(Tqn(u,d),d+=u.c.a),w=AGn(l,n,o,f,u?d+i:d),r=!u||VI(o,(dxn(),jyt)),c=!h||VI(f,(dxn(),jyt)),w>0?(b=(w-1)*e,u&&(b+=i),h&&(b+=i),b<s&&!r&&!c&&(b=s),d+=b):!r&&!c&&(d+=s),u=h,o=f}while(h);n.f.a=d,HSn(t)}function RHn(){var n;RHn=O,EAt=new Sm,kAt=x8(Qtt,sVn,2,0,6,1),SAt=i0(Bun(33,58),Bun(1,26)),PAt=i0(Bun(97,122),Bun(65,90)),CAt=Bun(48,57),TAt=i0(SAt,0),MAt=i0(PAt,CAt),IAt=i0(i0(0,Bun(1,6)),Bun(33,38)),OAt=i0(i0(CAt,Bun(65,70)),Bun(97,102)),xAt=i0(TAt,dpn("-_.!~*'()")),DAt=i0(MAt,Xwn("-_.!~*'()")),dpn(u9n),Xwn(u9n),i0(xAt,dpn(";:@&=+$,")),i0(DAt,Xwn(";:@&=+$,")),AAt=dpn(":/?#"),$At=Xwn(":/?#"),LAt=dpn("/?#"),NAt=Xwn("/?#"),(n=new Rv).a.zc("jar",n),n.a.zc("zip",n),n.a.zc("archive",n),SQ(),jAt=new Ak(n)}function KHn(n,t){var e,i,r,c,a;if(hon(t,(qqn(),okt),0),r=BB(mMn(t,akt),86),0==t.d.b)r?(a=Gy(MD(mMn(r,fkt)))+n.a+E5(r,t),hon(t,fkt,a)):hon(t,fkt,0);else{for(e=new wg(spn(new bg(t).a.d,0));EE(e.a);)KHn(n,BB(b3(e.a),188).c);i=BB(iL(new wg(spn(new bg(t).a.d,0))),86),c=(Gy(MD(mMn(BB(TN(new wg(spn(new bg(t).a.d,0))),86),fkt)))+Gy(MD(mMn(i,fkt))))/2,r?(a=Gy(MD(mMn(r,fkt)))+n.a+E5(r,t),hon(t,fkt,a),hon(t,okt,Gy(MD(mMn(t,fkt)))-c),IGn(n,t)):hon(t,fkt,c)}}function _Hn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;u=0,b=0,o=TJ(n.f,n.f.length),c=n.d,a=n.i,i=n.a,r=n.b;do{for(l=0,s=new Wb(n.p);s.a<s.c.c.length;)f=OGn(n,BB(n0(s),10)),e=!0,(n.q==(sNn(),Tvt)||n.q==Pvt)&&(e=qy(TD(f.b))),BB(f.a,19).a<0&&e?(++l,o=TJ(n.f,n.f.length),n.d=n.d+BB(f.a,19).a,b+=c-n.d,c=n.d+BB(f.a,19).a,a=n.i,i=a0(n.a),r=a0(n.b)):(n.f=TJ(o,o.length),n.d=c,n.a=(yX(i),i?new t_(i):HB(new Wb(i))),n.b=(yX(r),r?new t_(r):HB(new Wb(r))),n.i=a);++u,h=0!=l&&qy(TD(t.Kb(new rI(iln(b),iln(u)))))}while(h)}function FHn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;return a=n.f,l=t.f,u=a==(YLn(),xEt)||a==REt,o=a==DEt||a==KEt,b=l==DEt||l==KEt,s=a==DEt||a==xEt,w=l==DEt||l==xEt,!u||l!=xEt&&l!=REt?o&&b?n.f==KEt?n:t:s&&w?(a==DEt?(f=n,h=t):(f=t,h=n),d=i.j+i.f,g=f.e+r.f,p=e.Math.max(d,g)-e.Math.min(i.j,f.e),c=(f.d+r.g-i.i)*p,v=i.i+i.g,m=h.d+r.g,c<=(e.Math.max(v,m)-e.Math.min(i.i,h.d))*(h.e+r.f-i.j)?n.f==DEt?n:t:n.f==xEt?n:t):n:n.f==REt?n:t}function BHn(n){var t,e,i,r,c,a,u,o,s,h;for(s=n.e.a.c.length,c=new Wb(n.e.a);c.a<c.c.c.length;)BB(n0(c),121).j=!1;for(n.i=x8(ANt,hQn,25,s,15,1),n.g=x8(ANt,hQn,25,s,15,1),n.n=new Np,r=0,h=new Np,u=new Wb(n.e.a);u.a<u.c.c.length;)(a=BB(n0(u),121)).d=r++,0==a.b.a.c.length&&WB(n.n,a),gun(h,a.g);for(t=0,i=new Wb(h);i.a<i.c.c.length;)(e=BB(n0(i),213)).c=t++,e.f=!1;o=h.c.length,null==n.b||n.b.length<o?(n.b=x8(xNt,qQn,25,o,15,1),n.c=x8($Nt,ZYn,25,o,16,1)):nk(n.c),n.d=h,n.p=new LN(etn(n.d.c.length)),n.j=1}function HHn(n,t){var e,i,r,c,a,u,o,s,h;if(!(t.e.c.length<=1)){for(n.f=t,n.d=BB(mMn(n.f,(rkn(),vat)),379),n.g=BB(mMn(n.f,jat),19).a,n.e=Gy(MD(mMn(n.f,mat))),n.c=Gy(MD(mMn(n.f,pat))),cX(n.b),r=new Wb(n.f.c);r.a<r.c.c.length;)i=BB(n0(r),282),yKn(n.b,i.c,i,null),yKn(n.b,i.d,i,null);for(u=n.f.e.c.length,n.a=kq(xNt,[sVn,qQn],[104,25],15,[u,u],2),s=new Wb(n.f.e);s.a<s.c.c.length;)CBn(n,o=BB(n0(s),144),n.a[o.b]);for(n.i=kq(xNt,[sVn,qQn],[104,25],15,[u,u],2),c=0;c<u;++c)for(a=0;a<u;++a)h=1/((e=n.a[c][a])*e),n.i[c][a]=h}}function qHn(n){var t,e,i,r;if(!(null==n.b||n.b.length<=2||n.a)){for(t=0,r=0;r<n.b.length;){for(t!=r?(n.b[t]=n.b[r++],n.b[t+1]=n.b[r++]):r+=2,e=n.b[t+1];r<n.b.length&&!(e+1<n.b[r]);)if(e+1==n.b[r])n.b[t+1]=n.b[r+1],e=n.b[t+1],r+=2;else if(e>=n.b[r+1])r+=2;else{if(!(e<n.b[r+1]))throw Hp(new dy("Token#compactRanges(): Internel Error: ["+n.b[t]+","+n.b[t+1]+"] ["+n.b[r]+","+n.b[r+1]+"]"));n.b[t+1]=n.b[r+1],e=n.b[t+1],r+=2}t+=2}t!=n.b.length&&(i=x8(ANt,hQn,25,t,15,1),aHn(n.b,0,i,0,t),n.b=i),n.a=!0}}function GHn(n,t){var e,i,r,c,a,u,o;for(a=gz(n.a).Kc();a.Ob();){if((c=BB(a.Pb(),17)).b.c.length>0)for(i=new t_(BB(h6(n.a,c),21)),SQ(),m$(i,new _w(t)),r=new M2(c.b,0);r.b<r.d.gc();){switch(Px(r.b<r.d.gc()),e=BB(r.d.Xb(r.c=r.b++),70),u=-1,BB(mMn(e,(HXn(),Ydt)),272).g){case 1:u=i.c.length-1;break;case 0:u=Jjn(i);break;case 2:u=0}-1!=u&&(l1(u,i.c.length),WB((o=BB(i.c[u],243)).b.b,e),BB(mMn(vW(o.b.c.i),(hWn(),Zft)),21).Fc((bDn(),fft)),BB(mMn(vW(o.b.c.i),Zft),21).Fc(sft),fW(r),hon(e,vlt,c))}SZ(c,null),MZ(c,null)}}function zHn(n,t){var e,i,r,c;return e=new _n,1==(r=2==(r=(i=BB(P4($V(new Rq(null,new w1(n.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Xet),Uet]))),21)).gc())?1:0)&&QI(ldn(BB(P4(AV(i.Lc(),new Fn),Wcn(jgn(0),new en)),162).a,2),0)&&(r=0),1==(c=2==(c=(i=BB(P4($V(new Rq(null,new w1(t.f,16)),e),x7(new Q,new Y,new cn,new an,Pun(Gk(nit,1),$Vn,132,0,[Xet,Uet]))),21)).gc())?1:0)&&QI(ldn(BB(P4(AV(i.Lc(),new Bn),Wcn(jgn(0),new en)),162).a,2),0)&&(c=0),r<c?-1:r==c?0:1}function UHn(n){var t,e,i,r,c,a,u,o,s,h,f;if(o=new Np,!Lx(n,(hWn(),Wft)))return o;for(i=BB(mMn(n,Wft),15).Kc();i.Ob();)dqn(t=BB(i.Pb(),10),n),o.c[o.c.length]=t;for(r=new Wb(n.b);r.a<r.c.c.length;)for(a=new Wb(BB(n0(r),29).a);a.a<a.c.c.length;)(c=BB(n0(a),10)).k==(uSn(),Mut)&&(u=BB(mMn(c,Vft),10))&&(CZ(s=new CSn,c),qCn(s,BB(mMn(c,Qft),61)),h=BB(xq(u.j,0),11),SZ(f=new wY,s),MZ(f,h));for(e=new Wb(o);e.a<e.c.c.length;)PZ(t=BB(n0(e),10),BB(xq(n.b,n.b.c.length-1),29));return o}function XHn(n){var t,e,i,r,c,a,u,o,s,h,f,l;for(c=qy(TD(ZAn(t=WJ(n),(HXn(),wgt)))),h=0,r=0,s=new AL((!n.e&&(n.e=new hK(_Ot,n,7,4)),n.e));s.e!=s.i.gc();)a=(u=QIn(o=BB(kpn(s),79)))&&c&&qy(TD(ZAn(o,dgt))),l=PTn(BB(Wtn((!o.c&&(o.c=new hK(KOt,o,5,8)),o.c),0),82)),u&&a?++r:u&&!a?++h:JJ(l)==t||l==t?++r:++h;for(i=new AL((!n.d&&(n.d=new hK(_Ot,n,8,5)),n.d));i.e!=i.i.gc();)a=(u=QIn(e=BB(kpn(i),79)))&&c&&qy(TD(ZAn(e,dgt))),f=PTn(BB(Wtn((!e.b&&(e.b=new hK(KOt,e,4,7)),e.b),0),82)),u&&a?++h:u&&!a?++r:JJ(f)==t||f==t?++h:++r;return h-r}function WHn(n,t){var e,i,r,c,a,u,o,s,h;if(OTn(t,"Edge splitting",1),n.b.c.length<=2)HSn(t);else{for(Px((c=new M2(n.b,0)).b<c.d.gc()),a=BB(c.d.Xb(c.c=c.b++),29);c.b<c.d.gc();)for(r=a,Px(c.b<c.d.gc()),a=BB(c.d.Xb(c.c=c.b++),29),u=new Wb(r.a);u.a<u.c.c.length;)for(o=new Wb(BB(n0(u),10).j);o.a<o.c.c.length;)for(i=new Wb(BB(n0(o),11).g);i.a<i.c.c.length;)(s=(e=BB(n0(i),17)).d.i.c)!=r&&s!=a&&zxn(e,(Bl(h=new $vn(n),(uSn(),Put)),hon(h,(hWn(),dlt),e),hon(h,(HXn(),ept),(QEn(),XCt)),PZ(h,a),h));HSn(t)}}function VHn(n,t){var e,i,r,c,a,u,o,s,h;if((a=null!=t.p&&!t.b)||OTn(t,aZn,1),c=1/(e=BB(mMn(n,(hWn(),Mlt)),15)).gc(),t.n)for(OH(t,"ELK Layered uses the following "+e.gc()+" modules:"),h=0,s=e.Kc();s.Ob();)OH(t," Slot "+(h<10?"0":"")+h+++": "+nE(tsn(BB(s.Pb(),51))));for(o=e.Kc();o.Ob();)BB(o.Pb(),51).pf(n,mcn(t,c));for(r=new Wb(n.b);r.a<r.c.c.length;)i=BB(n0(r),29),gun(n.a,i.a),i.a.c=x8(Ant,HWn,1,0,5,1);for(u=new Wb(n.a);u.a<u.c.c.length;)PZ(BB(n0(u),10),null);n.b.c=x8(Ant,HWn,1,0,5,1),a||HSn(t)}function QHn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;r=Gy(MD(mMn(t,(HXn(),Dgt)))),l=4,c=3,j=20/(k=BB(mMn(t,xpt),19).a),b=!1,s=0,u=DWn;do{for(a=1!=s,f=0!=s,E=0,v=0,y=(g=n.a).length;v<y;++v)(w=g[v]).f=null,Bzn(n,w,a,f,r),E+=e.Math.abs(w.a);do{o=U_n(n,t)}while(o);for(p=0,m=(d=n.a).length;p<m;++p)if(0!=(i=wU(w=d[p]).a))for(h=new Wb(w.e);h.a<h.c.c.length;)BB(n0(h),10).n.b+=i;0==s||1==s?--l<=0&&(E<u||-l>k)?(s=2,u=DWn):0==s?(s=1,u=E):(s=0,u=E):(b=E>=u||u-E<j,u=E,b&&--c)}while(!(b&&c<=0))}function YHn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w;for(w=new xp,c=n.a.ec().Kc();c.Ob();)VW(w,i=BB(c.Pb(),168),e.Je(i));for(yX(n),m$(a=n?new t_(n):HB(n.a.ec().Kc()),new Ew(w)),u=S4(a),o=new C$(t),jCn((b=new xp).f,t,o);0!=u.a.gc();){for(s=null,h=null,f=null,r=u.a.ec().Kc();r.Ob();)if(i=BB(r.Pb(),168),Gy(MD(qI(AY(w.f,i))))<=RQn){if(hU(b,i.a)&&!hU(b,i.b)){h=i.b,f=i.a,s=i;break}if(hU(b,i.b)&&!hU(b,i.a)){h=i.a,f=i.b,s=i;break}}if(!s)break;l=new C$(h),WB(BB(qI(AY(b.f,f)),221).a,l),jCn(b.f,h,l),u.a.Bc(s)}return o}function JHn(n,t,e){var i,r,c,a,u,o,s,h;for(OTn(e,"Depth-first cycle removal",1),o=(s=t.a).c.length,n.c=new Np,n.d=x8($Nt,ZYn,25,o,16,1),n.a=x8($Nt,ZYn,25,o,16,1),n.b=new Np,c=0,u=new Wb(s);u.a<u.c.c.length;)(a=BB(n0(u),10)).p=c,h3(fbn(a))&&WB(n.c,a),++c;for(h=new Wb(n.c);h.a<h.c.c.length;)GPn(n,BB(n0(h),10));for(r=0;r<o;r++)n.d[r]||(l1(r,s.c.length),GPn(n,BB(s.c[r],10)));for(i=new Wb(n.b);i.a<i.c.c.length;)tBn(BB(n0(i),17),!0),hon(t,(hWn(),qft),(hN(),!0));n.c=null,n.d=null,n.a=null,n.b=null,HSn(e)}function ZHn(n,t){var e,i,r,c,a,u,o;for(n.a.c=x8(Ant,HWn,1,0,5,1),i=spn(t.b,0);i.b!=i.d.c;)0==(e=BB(b3(i),86)).b.b&&(hon(e,(qqn(),dkt),(hN(),!0)),WB(n.a,e));switch(n.a.c.length){case 0:hon(r=new csn(0,t,"DUMMY_ROOT"),(qqn(),dkt),(hN(),!0)),hon(r,ekt,!0),DH(t.b,r);break;case 1:break;default:for(c=new csn(0,t,"SUPER_ROOT"),u=new Wb(n.a);u.a<u.c.c.length;)hon(o=new UQ(c,a=BB(n0(u),86)),(qqn(),ekt),(hN(),!0)),DH(c.a.a,o),DH(c.d,o),DH(a.b,o),hon(a,dkt,!1);hon(c,(qqn(),dkt),(hN(),!0)),hon(c,ekt,!0),DH(t.b,c)}}function nqn(n,t){var i,r,c,a,u,o;return jDn(),a=t.c-(n.c+n.b),c=n.c-(t.c+t.b),u=n.d-(t.d+t.a),i=t.d-(n.d+n.a),r=e.Math.max(c,a),o=e.Math.max(u,i),h$(),rin(A3n),(e.Math.abs(r)<=A3n||0==r||isNaN(r)&&isNaN(0)?0:r<0?-1:r>0?1:zO(isNaN(r),isNaN(0)))>=0^(rin(A3n),(e.Math.abs(o)<=A3n||0==o||isNaN(o)&&isNaN(0)?0:o<0?-1:o>0?1:zO(isNaN(o),isNaN(0)))>=0)?e.Math.max(o,r):(rin(A3n),(e.Math.abs(r)<=A3n||0==r||isNaN(r)&&isNaN(0)?0:r<0?-1:r>0?1:zO(isNaN(r),isNaN(0)))>0?e.Math.sqrt(o*o+r*r):-e.Math.sqrt(o*o+r*r))}function tqn(n,t){var e,i,r,c,a;if(t)if(!n.a&&(n.a=new _v),2!=n.e)if(1!=t.e)0!=(a=n.a.a.c.length)?0!=(c=BB(bW(n.a,a-1),117)).e&&10!=c.e||0!=t.e&&10!=t.e?Cv(n.a,t):(0==t.e||t.bm().length,0==c.e?(e=new Pk,(i=c._l())>=BQn?cO(e,Xln(i)):NX(e,i&QVn),c=new vJ(10,null,0),kU(n.a,c,a-1)):(c.bm().length,cO(e=new Pk,c.bm())),0==t.e?(i=t._l())>=BQn?cO(e,Xln(i)):NX(e,i&QVn):cO(e,t.bm()),BB(c,521).b=e.a):Cv(n.a,t);else for(r=0;r<t.em();r++)tqn(n,t.am(r));else Cv(n.a,t)}function eqn(n){var t,e,i,r,c;return null!=n.g?n.g:n.a<32?(n.g=DUn(fan(n.f),CJ(n.e)),n.g):(r=qXn((!n.c&&(n.c=yhn(n.f)),n.c),0),0==n.e?r:(t=(!n.c&&(n.c=yhn(n.f)),n.c).e<0?2:1,e=r.length,i=-n.e+e-t,(c=new Ck).a+=""+r,n.e>0&&i>=-6?i>=0?kZ(c,e-CJ(n.e),String.fromCharCode(46)):(c.a=fx(c.a,0,t-1)+"0."+nO(c.a,t-1),kZ(c,t+1,Bdn(qtt,0,-CJ(i)-1))):(e-t>=1&&(kZ(c,t,String.fromCharCode(46)),++e),kZ(c,e,String.fromCharCode(69)),i>0&&kZ(c,++e,String.fromCharCode(43)),kZ(c,++e,""+vz(fan(i)))),n.g=c.a,n.g))}function iqn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;if(!e.dc()){for(a=0,h=0,l=BB((i=e.Kc()).Pb(),19).a;a<t.f;){if(a==l&&(h=0,l=i.Ob()?BB(i.Pb(),19).a:t.f+1),a!=h)for(b=BB(xq(n.b,a),29),f=BB(xq(n.b,h),29),s=new Wb(a0(b.a));s.a<s.c.c.length;)if(Qyn(o=BB(n0(s),10),f.a.c.length,f),0==h)for(c=new Wb(a0(fbn(o)));c.a<c.c.c.length;)tBn(r=BB(n0(c),17),!0),hon(n,(hWn(),qft),(hN(),!0)),iGn(n,r,1);++h,++a}for(u=new M2(n.b,0);u.b<u.d.gc();)Px(u.b<u.d.gc()),0==BB(u.d.Xb(u.c=u.b++),29).a.c.length&&fW(u)}}function rqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(h=(a=t.b).o,o=a.d,i=Gy(MD(gpn(a,(HXn(),ypt)))),r=Gy(MD(gpn(a,jpt))),s=Gy(MD(gpn(a,$pt))),rH(u=new fm,o.d,o.c,o.a,o.b),l=MRn(t,i,r,s),p=new Wb(t.d);p.a<p.c.c.length;){for(w=(g=BB(n0(p),101)).f.a.ec().Kc();w.Ob();)c=(b=BB(w.Pb(),409)).a,f=ETn(b),v=new km,bTn(b,b.c,l,v),FMn(b,f,l,v),bTn(b,b.d,l,v),e=v,e=n.Uf(b,f,e),yQ(c.a),Frn(c.a,e),JT(new Rq(null,new w1(e,16)),new wP(h,u));(d=g.i)&&(aTn(g,d,l,r),pgn(h,u,m=new wA(d.g)),UR(m,d.j),pgn(h,u,m))}rH(o,u.d,u.c,u.a,u.b)}function cqn(n,t,e){var i,r,c;if((r=BB(mMn(t,(HXn(),Pdt)),275))!=(JMn(),cft)){switch(OTn(e,"Horizontal Compaction",1),n.a=t,Vk(i=new yOn(((c=new I7).d=t,c.c=BB(mMn(c.d,Zdt),218),UDn(c),SGn(c),sRn(c),c.a)),n.b),1===BB(mMn(t,Sdt),422).g?Wk(i,new grn(n.a)):Wk(i,(CQ(),fit)),r.g){case 1:C$n(i);break;case 2:C$n(Tzn(i,(Ffn(),FPt)));break;case 3:C$n(Uk(Tzn(C$n(i),(Ffn(),FPt)),new gr));break;case 4:C$n(Uk(Tzn(C$n(i),(Ffn(),FPt)),new kd(c)));break;case 5:C$n(Xk(i,wst))}Tzn(i,(Ffn(),_Pt)),i.e=!0,Lzn(c),HSn(e)}}function aqn(n,t,e,i,r,c,a,u){var o,s,h,f;switch(o=u6(Pun(Gk(FEt,1),HWn,220,0,[t,e,i,r])),f=null,n.b.g){case 1:f=u6(Pun(Gk(tEt,1),HWn,526,0,[new Ja,new Qa,new Ya]));break;case 0:f=u6(Pun(Gk(tEt,1),HWn,526,0,[new Ya,new Qa,new Ja]));break;case 2:f=u6(Pun(Gk(tEt,1),HWn,526,0,[new Qa,new Ja,new Ya]))}for(h=new Wb(f);h.a<h.c.c.length;)s=BB(n0(h),526),o.c.length>1&&(o=s.mg(o,n.a,u));return 1==o.c.length?BB(xq(o,o.c.length-1),220):2==o.c.length?FHn((l1(0,o.c.length),BB(o.c[0],220)),(l1(1,o.c.length),BB(o.c[1],220)),a,c):null}function uqn(n){var t,i,r,c,a,u;for(Otn(n.a,new nt),i=new Wb(n.a);i.a<i.c.c.length;)t=BB(n0(i),221),r=XR(B$(BB(n.b,65).c),BB(t.b,65).c),ect?(u=BB(n.b,65).b,a=BB(t.b,65).b,e.Math.abs(r.a)>=e.Math.abs(r.b)?(r.b=0,a.d+a.a>u.d&&a.d<u.d+u.a&&NH(r,e.Math.max(u.c-(a.c+a.b),a.c-(u.c+u.b)))):(r.a=0,a.c+a.b>u.c&&a.c<u.c+u.b&&NH(r,e.Math.max(u.d-(a.d+a.a),a.d-(u.d+u.a))))):NH(r,TFn(BB(n.b,65),BB(t.b,65))),c=e.Math.sqrt(r.a*r.a+r.b*r.b),NH(r,c=HEn(Wrt,t,c,r)),LG(BB(t.b,65),r),Otn(t.a,new Aw(r)),BB(Wrt.b,65),K8(Wrt,Vrt,t)}function oqn(n){var t,i,r,c,a,u,o,s,f,l,b,w;for(n.f=new Fv,o=0,r=0,c=new Wb(n.e.b);c.a<c.c.c.length;)for(u=new Wb(BB(n0(c),29).a);u.a<u.c.c.length;){for((a=BB(n0(u),10)).p=o++,i=new oz(ZL(lbn(a).a.Kc(),new h));dAn(i);)BB(U5(i),17).p=r++;for(t=AHn(a),l=new Wb(a.j);l.a<l.c.c.length;)f=BB(n0(l),11),t&&(w=f.a.b)!=e.Math.floor(w)&&(s=w-j2(fan(e.Math.round(w))),f.a.b-=s),(b=f.n.b+f.a.b)!=e.Math.floor(b)&&(s=b-j2(fan(e.Math.round(b))),f.n.b-=s)}n.g=o,n.b=r,n.i=x8(eyt,HWn,401,o,0,1),n.c=x8(Jmt,HWn,649,r,0,1),n.d.a.$b()}function sqn(n){var t,e,i,r,c,a,u,o,s;if(n.ej())if(o=n.fj(),n.i>0){if(t=new DI(n.i,n.g),c=(e=n.i)<100?null:new Fj(e),n.ij())for(i=0;i<n.i;++i)a=n.g[i],c=n.kj(a,c);if(a6(n),r=1==e?n.Zi(4,Wtn(t,0),null,0,o):n.Zi(6,t,null,-1,o),n.bj()){for(i=new ax(t);i.e!=i.i.gc();)c=n.dj(jpn(i),c);c?(c.Ei(r),c.Fi()):n.$i(r)}else c?(c.Ei(r),c.Fi()):n.$i(r)}else a6(n),n.$i(n.Zi(6,(SQ(),set),null,-1,o));else if(n.bj())if(n.i>0){for(u=n.g,s=n.i,a6(n),c=s<100?null:new Fj(s),i=0;i<s;++i)a=u[i],c=n.dj(a,c);c&&c.Fi()}else a6(n);else a6(n)}function hqn(n,t,i){var r,c,a,u,o,s,h,f,l;for(_an(this),i==(dJ(),Lyt)?TU(this.r,n):TU(this.w,n),f=RQn,h=KQn,u=t.a.ec().Kc();u.Ob();)c=BB(u.Pb(),46),o=BB(c.a,455),(s=(r=BB(c.b,17)).c)==n&&(s=r.d),TU(o==Lyt?this.r:this.w,s),l=(kUn(),yIt).Hc(s.j)?Gy(MD(mMn(s,(hWn(),Llt)))):Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a])).b,f=e.Math.min(f,l),h=e.Math.max(h,l);for(XMn(this,(kUn(),yIt).Hc(n.j)?Gy(MD(mMn(n,(hWn(),Llt)))):Aon(Pun(Gk(PMt,1),sVn,8,0,[n.i.n,n.n,n.a])).b,f,h),a=t.a.ec().Kc();a.Ob();)c=BB(a.Pb(),46),tPn(this,BB(c.b,17));this.o=!1}function fqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;return e=8191&n.l,i=n.l>>13|(15&n.m)<<9,r=n.m>>4&8191,c=n.m>>17|(255&n.h)<<5,a=(1048320&n.h)>>8,g=i*(u=8191&t.l),p=r*u,v=c*u,m=a*u,0!=(o=t.l>>13|(15&t.m)<<9)&&(g+=e*o,p+=i*o,v+=r*o,m+=c*o),0!=(s=t.m>>4&8191)&&(p+=e*s,v+=i*s,m+=r*s),0!=(h=t.m>>17|(255&t.h)<<5)&&(v+=e*h,m+=i*h),0!=(f=(1048320&t.h)>>8)&&(m+=e*f),b=((d=e*u)>>22)+(g>>9)+((262143&p)<<4)+((31&v)<<17),w=(p>>18)+(v>>5)+((4095&m)<<8),w+=(b+=(l=(d&SQn)+((511&g)<<13))>>22)>>22,M$(l&=SQn,b&=SQn,w&=PQn)}function lqn(n){var t,i,r,c,a,u,o;if(0!=(o=BB(xq(n.j,0),11)).g.c.length&&0!=o.e.c.length)throw Hp(new Fy("Interactive layout does not support NORTH/SOUTH ports with incoming _and_ outgoing edges."));if(0!=o.g.c.length){for(a=RQn,i=new Wb(o.g);i.a<i.c.c.length;)t=BB(n0(i),17),r=BB(mMn(u=t.d.i,(HXn(),Cgt)),142),a=e.Math.min(a,u.n.a-r.b);return new qf(yX(a))}if(0!=o.e.c.length){for(c=KQn,i=new Wb(o.e);i.a<i.c.c.length;)t=BB(n0(i),17),r=BB(mMn(u=t.c.i,(HXn(),Cgt)),142),c=e.Math.max(c,u.n.a+u.o.a+r.c);return new qf(yX(c))}return iy(),iy(),Ont}function bqn(n,t){var e,i,r,c,a,u;if(n.Fk()){if(n.i>4){if(!n.wj(t))return!1;if(n.rk()){if(u=(e=(i=BB(t,49)).Ug())==n.e&&(n.Dk()?i.Og(i.Vg(),n.zk())==n.Ak():-1-i.Vg()==n.aj()),n.Ek()&&!u&&!e&&i.Zg())for(r=0;r<n.i;++r)if(GI(n.Gk(BB(n.g[r],56)))===GI(t))return!0;return u}if(n.Dk()&&!n.Ck()){if(GI(c=BB(t,56).ah(Cvn(BB(n.ak(),18))))===GI(n.e))return!0;if(null==c||!BB(c,56).kh())return!1}}if(a=Sjn(n,t),n.Ek()&&!a)for(r=0;r<n.i;++r)if(GI(i=n.Gk(BB(n.g[r],56)))===GI(t))return!0;return a}return Sjn(n,t)}function wqn(n,t){var e,i,r,c,a,u,o,s,h,f,l;for(h=new Np,l=new Rv,a=t.b,r=0;r<a.c.length;r++){for(s=(l1(r,a.c.length),BB(a.c[r],29)).a,h.c=x8(Ant,HWn,1,0,5,1),c=0;c<s.c.length;c++)(u=n.a[r][c]).p=c,u.k==(uSn(),Iut)&&(h.c[h.c.length]=u),c5(BB(xq(t.b,r),29).a,c,u),u.j.c=x8(Ant,HWn,1,0,5,1),gun(u.j,BB(BB(xq(n.b,r),15).Xb(c),14)),LK(BB(mMn(u,(HXn(),ept)),98))||hon(u,ept,(QEn(),UCt));for(i=new Wb(h);i.a<i.c.c.length;)f=QRn(e=BB(n0(i),10)),l.a.zc(f,l),l.a.zc(e,l)}for(o=l.a.ec().Kc();o.Ob();)u=BB(o.Pb(),10),SQ(),m$(u.j,(zsn(),sst)),u.i=!0,eIn(u)}function dqn(n,t){var e,i,r,c,a,u,o,s,h,f;if(h=BB(mMn(n,(hWn(),Qft)),61),i=BB(xq(n.j,0),11),h==(kUn(),sIt)?qCn(i,SIt):h==SIt&&qCn(i,sIt),BB(mMn(t,(HXn(),Fgt)),174).Hc((mdn(),_It))){if(o=Gy(MD(mMn(n,Cpt))),s=Gy(MD(mMn(n,Ipt))),a=Gy(MD(mMn(n,Spt))),(u=BB(mMn(t,cpt),21)).Hc((lIn(),eIt)))for(e=s,f=n.o.a/2-i.n.a,c=new Wb(i.f);c.a<c.c.c.length;)(r=BB(n0(c),70)).n.b=e,r.n.a=f-r.o.a/2,e+=r.o.b+a;else if(u.Hc(rIt))for(c=new Wb(i.f);c.a<c.c.c.length;)(r=BB(n0(c),70)).n.a=o+n.o.a-i.n.a;f0(new Pw((gM(),new HV(t,!1,!1,new Ft))),new __(null,n,!1))}}function gqn(n,t){var i,r,c,a,u,o,s;if(0!=t.c.length){for(SQ(),yG(t.c,t.c.length,null),r=BB(n0(c=new Wb(t)),145);c.a<c.c.c.length;)i=BB(n0(c),145),!aen(r.e.c,i.e.c)||Kdn(BD(r.e).b,i.e.d)||Kdn(BD(i.e).b,r.e.d)?(eFn(n,r),r=i):(gun(r.k,i.k),gun(r.b,i.b),gun(r.c,i.c),Frn(r.i,i.i),gun(r.d,i.d),gun(r.j,i.j),a=e.Math.min(r.e.c,i.e.c),u=e.Math.min(r.e.d,i.e.d),o=e.Math.max(r.e.c+r.e.b,i.e.c+i.e.b)-a,s=e.Math.max(r.e.d+r.e.a,i.e.d+i.e.a)-u,xH(r.e,a,u,o,s),t0(r.f,i.f),!r.a&&(r.a=i.a),gun(r.g,i.g),WB(r.g,i));eFn(n,r)}}function pqn(n,t,e,i){var r,c,a,u,o,s;if((u=n.j)==(kUn(),PIt)&&t!=(QEn(),QCt)&&t!=(QEn(),YCt)&&(qCn(n,u=z_n(n,e)),!(n.q?n.q:(SQ(),SQ(),het))._b((HXn(),tpt))&&u!=PIt&&(0!=n.n.a||0!=n.n.b)&&hon(n,tpt,jkn(n,u))),t==(QEn(),WCt)){switch(s=0,u.g){case 1:case 3:(c=n.i.o.a)>0&&(s=n.n.a/c);break;case 2:case 4:(r=n.i.o.b)>0&&(s=n.n.b/r)}hon(n,(hWn(),Tlt),s)}if(o=n.o,a=n.a,i)a.a=i.a,a.b=i.b,n.d=!0;else if(t!=QCt&&t!=YCt&&u!=PIt)switch(u.g){case 1:a.a=o.a/2;break;case 2:a.a=o.a,a.b=o.b/2;break;case 3:a.a=o.a/2,a.b=o.b;break;case 4:a.b=o.b/2}else a.a=o.a/2,a.b=o.b/2}function vqn(n){var t,e,i,r,c,a,u,o,s,h;if(n.ej())if(h=n.Vi(),o=n.fj(),h>0)if(t=new jcn(n.Gi()),c=(e=h)<100?null:new Fj(e),JD(n,e,t.g),r=1==e?n.Zi(4,Wtn(t,0),null,0,o):n.Zi(6,t,null,-1,o),n.bj()){for(i=new AL(t);i.e!=i.i.gc();)c=n.dj(kpn(i),c);c?(c.Ei(r),c.Fi()):n.$i(r)}else c?(c.Ei(r),c.Fi()):n.$i(r);else JD(n,n.Vi(),n.Wi()),n.$i(n.Zi(6,(SQ(),set),null,-1,o));else if(n.bj())if((h=n.Vi())>0){for(u=n.Wi(),s=h,JD(n,h,u),c=s<100?null:new Fj(s),i=0;i<s;++i)a=u[i],c=n.dj(a,c);c&&c.Fi()}else JD(n,n.Vi(),n.Wi());else JD(n,n.Vi(),n.Wi())}function mqn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;for(u=new Wb(t);u.a<u.c.c.length;)(c=BB(n0(u),233)).e=null,c.c=0;for(o=null,a=new Wb(t);a.a<a.c.c.length;)if(f=(c=BB(n0(a),233)).d[0],!e||f.k==(uSn(),Cut)){for(b=BB(mMn(f,(hWn(),clt)),15).Kc();b.Ob();)l=BB(b.Pb(),10),e&&l.k!=(uSn(),Cut)||((!c.e&&(c.e=new Np),c.e).Fc(n.b[l.c.p][l.p]),++n.b[l.c.p][l.p].c);if(!e&&f.k==(uSn(),Cut)){if(o)for(h=BB(h6(n.d,o),21).Kc();h.Ob();)for(s=BB(h.Pb(),10),r=BB(h6(n.d,f),21).Kc();r.Ob();)i=BB(r.Pb(),10),UB(n.b[s.c.p][s.p]).Fc(n.b[i.c.p][i.p]),++n.b[i.c.p][i.p].c;o=f}}}function yqn(n,t){var e,i,r,c,a,u,o;for(e=0,o=new Np,c=new Wb(t);c.a<c.c.c.length;){switch(r=BB(n0(c),11),nhn(n.b,n.d[r.p]),o.c=x8(Ant,HWn,1,0,5,1),r.i.k.g){case 0:Otn(BB(mMn(r,(hWn(),Elt)),10).j,new Zd(o));break;case 1:S$(Qon(AV(new Rq(null,new w1(r.i.j,16)),new ng(r))),new tg(o));break;case 3:WB(o,new rI(BB(mMn(r,(hWn(),dlt)),11),iln(r.e.c.length+r.g.c.length)))}for(u=new Wb(o);u.a<u.c.c.length;)a=BB(n0(u),46),(i=ME(n,BB(a.a,11)))>n.d[r.p]&&(e+=n5(n.b,i)*BB(a.b,19).a,d3(n.a,iln(i)));for(;!Wy(n.a);)Mnn(n.b,BB(dU(n.a),19).a)}return e}function kqn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w;for((f=new wA(BB(ZAn(n,(SMn(),HMt)),8))).a=e.Math.max(f.a-i.b-i.c,0),f.b=e.Math.max(f.b-i.d-i.a,0),(null==(c=MD(ZAn(n,DMt)))||(kW(c),c<=0))&&(c=1.3),u=new Np,l=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));l.e!=l.i.gc();)a=new zx(BB(kpn(l),33)),u.c[u.c.length]=a;switch(BB(ZAn(n,RMt),311).g){case 3:w=aFn(u,t,f.a,f.b,(s=r,kW(c),s));break;case 1:w=vBn(u,t,f.a,f.b,(h=r,kW(c),h));break;default:w=Mqn(u,t,f.a,f.b,(o=r,kW(c),o))}KUn(n,(b=yXn(new Gtn(w),t,i,f.a,f.b,r,(kW(c),c))).a,b.b,!1,!0)}function jqn(n,t){var e,i,r,c;c=new t_((e=t.b).j),r=0,(i=e.j).c=x8(Ant,HWn,1,0,5,1),eX(BB(gan(n.b,(kUn(),sIt),(Crn(),Rst)),15),e),r=Jmn(c,r,new xr,i),eX(BB(gan(n.b,sIt,Dst),15),e),r=Jmn(c,r,new Nr,i),eX(BB(gan(n.b,sIt,xst),15),e),eX(BB(gan(n.b,oIt,Rst),15),e),eX(BB(gan(n.b,oIt,Dst),15),e),r=Jmn(c,r,new Dr,i),eX(BB(gan(n.b,oIt,xst),15),e),eX(BB(gan(n.b,SIt,Rst),15),e),r=Jmn(c,r,new Rr,i),eX(BB(gan(n.b,SIt,Dst),15),e),r=Jmn(c,r,new Kr,i),eX(BB(gan(n.b,SIt,xst),15),e),eX(BB(gan(n.b,CIt,Rst),15),e),r=Jmn(c,r,new Qr,i),eX(BB(gan(n.b,CIt,Dst),15),e),eX(BB(gan(n.b,CIt,xst),15),e)}function Eqn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(OTn(t,"Layer size calculation",1),f=RQn,h=KQn,c=!1,o=new Wb(n.b);o.a<o.c.c.length;)if((s=(u=BB(n0(o),29)).c).a=0,s.b=0,0!=u.a.c.length){for(c=!0,b=new Wb(u.a);b.a<b.c.c.length;)d=(l=BB(n0(b),10)).o,w=l.d,s.a=e.Math.max(s.a,d.a+w.b+w.c);g=(r=BB(xq(u.a,0),10)).n.b-r.d.d,r.k==(uSn(),Mut)&&(g-=BB(mMn(n,(HXn(),Lpt)),142).d),i=(a=BB(xq(u.a,u.a.c.length-1),10)).n.b+a.o.b+a.d.a,a.k==Mut&&(i+=BB(mMn(n,(HXn(),Lpt)),142).a),s.b=i-g,f=e.Math.min(f,g),h=e.Math.max(h,i)}c||(f=0,h=0),n.f.b=h-f,n.c.b-=f,HSn(t)}function Tqn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;for(c=0,a=0,s=new Wb(n.a);s.a<s.c.c.length;)u=BB(n0(s),10),c=e.Math.max(c,u.d.b),a=e.Math.max(a,u.d.c);for(o=new Wb(n.a);o.a<o.c.c.length;){switch(u=BB(n0(o),10),BB(mMn(u,(HXn(),kdt)),248).g){case 1:w=0;break;case 2:w=1;break;case 5:w=.5;break;default:for(i=0,f=0,b=new Wb(u.j);b.a<b.c.c.length;)0==(l=BB(n0(b),11)).e.c.length||++i,0==l.g.c.length||++f;w=i+f==0?.5:f/(i+f)}g=n.c,h=u.o.a,p=(g.a-h)*w,w>.5?p-=2*a*(w-.5):w<.5&&(p+=2*c*(.5-w)),p<(r=u.d.b)&&(p=r),d=u.d.c,p>g.a-d-h&&(p=g.a-d-h),u.n.a=t+p}}function Mqn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b;for(u=x8(xNt,qQn,25,n.c.length,15,1),ikn(l=new Xz(new Uu),n),s=0,b=new Np;0!=l.b.c.length;)if(a=BB(0==l.b.c.length?null:xq(l.b,0),157),s>1&&iG(a)*eG(a)/2>u[0]){for(c=0;c<b.c.length-1&&iG(a)*eG(a)/2>u[c];)++c;f=new Gtn(new s1(b,0,c+1)),h=iG(a)/eG(a),o=yXn(f,t,new bm,e,i,r,h),UR(kO(f.e),o),F8(eMn(l,f)),ikn(l,new s1(b,c+1,b.c.length)),b.c=x8(Ant,HWn,1,0,5,1),s=0,jG(u,u.length,0)}else null!=(0==l.b.c.length?null:xq(l.b,0))&&hrn(l,0),s>0&&(u[s]=u[s-1]),u[s]+=iG(a)*eG(a),++s,b.c[b.c.length]=a;return b}function Sqn(n){var t,e,i;if((e=BB(mMn(n,(HXn(),kgt)),163))==(Tbn(),Flt)){for(t=new oz(ZL(fbn(n).a.Kc(),new h));dAn(t);)if(!X5(BB(U5(t),17)))throw Hp(new rk(P1n+gyn(n)+"' has its layer constraint set to FIRST_SEPARATE, but has at least one incoming edge. FIRST_SEPARATE nodes must not have incoming edges."))}else if(e==Hlt)for(i=new oz(ZL(lbn(n).a.Kc(),new h));dAn(i);)if(!X5(BB(U5(i),17)))throw Hp(new rk(P1n+gyn(n)+"' has its layer constraint set to LAST_SEPARATE, but has at least one outgoing edge. LAST_SEPARATE nodes must not have outgoing edges."))}function Pqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;for(OTn(t,"Label dummy removal",1),i=Gy(MD(mMn(n,(HXn(),jpt)))),r=Gy(MD(mMn(n,Spt))),o=BB(mMn(n,Udt),103),u=new Wb(n.b);u.a<u.c.c.length;)for(h=new M2(BB(n0(u),29).a,0);h.b<h.d.gc();)Px(h.b<h.d.gc()),(s=BB(h.d.Xb(h.c=h.b++),10)).k==(uSn(),Sut)&&(f=BB(mMn(s,(hWn(),dlt)),17),b=Gy(MD(mMn(f,agt))),a=GI(mMn(s,ult))===GI((Xyn(),ECt)),e=new wA(s.n),a&&(e.b+=b+i),c=new xC(s.o.a,s.o.b-b-i),l=BB(mMn(s,Plt),15),o==(Ffn(),HPt)||o==KPt?ADn(l,e,r,c,a,o):qhn(l,e,r,c),gun(f.b,l),rGn(s,GI(mMn(n,Zdt))===GI((Mbn(),YPt))),fW(h));HSn(t)}function Cqn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y;for(u=new Np,r=new Wb(t.a);r.a<r.c.c.length;)for(a=new Wb(BB(n0(r),10).j);a.a<a.c.c.length;){for(s=null,m=0,y=(v=Z0((c=BB(n0(a),11)).g)).length;m<y;++m)wan((p=v[m]).d.i,e)||((g=LHn(n,t,e,p,p.c,(ain(),qvt),s))!=s&&(u.c[u.c.length]=g),g.c&&(s=g));for(o=null,w=0,d=(b=Z0(c.e)).length;w<d;++w)wan((l=b[w]).c.i,e)||((g=LHn(n,t,e,l,l.d,(ain(),Hvt),o))!=o&&(u.c[u.c.length]=g),g.c&&(o=g))}for(f=new Wb(u);f.a<f.c.c.length;)h=BB(n0(f),441),-1!=E7(t.a,h.a,0)||WB(t.a,h.a),h.c&&(i.c[i.c.length]=h)}function Iqn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w;for(OTn(e,"Interactive cycle breaking",1),h=new Np,l=new Wb(t.a);l.a<l.c.c.length;)for((f=BB(n0(l),10)).p=1,b=Fjn(f).a,s=xwn(f,(ain(),qvt)).Kc();s.Ob();)for(c=new Wb(BB(s.Pb(),11).g);c.a<c.c.c.length;)(w=(i=BB(n0(c),17)).d.i)!=f&&Fjn(w).a<b&&(h.c[h.c.length]=i);for(a=new Wb(h);a.a<a.c.c.length;)tBn(i=BB(n0(a),17),!0);for(h.c=x8(Ant,HWn,1,0,5,1),o=new Wb(t.a);o.a<o.c.c.length;)(u=BB(n0(o),10)).p>0&&lPn(n,u,h);for(r=new Wb(h);r.a<r.c.c.length;)tBn(i=BB(n0(r),17),!0);h.c=x8(Ant,HWn,1,0,5,1),HSn(e)}function Oqn(n,t){var e,i,r,c,a,u,o,s,h;return s="",0==t.length?n.de(XVn,zVn,-1,-1):(mK((h=RMn(t)).substr(0,3),"at ")&&(h=h.substr(3)),-1==(a=(h=h.replace(/\[.*?\]/g,"")).indexOf("("))?-1==(a=h.indexOf("@"))?(s=h,h=""):(s=RMn(h.substr(a+1)),h=RMn(h.substr(0,a))):(e=h.indexOf(")",a),s=h.substr(a+1,e-(a+1)),h=RMn(h.substr(0,a))),-1!=(a=GO(h,YTn(46)))&&(h=h.substr(a+1)),(0==h.length||mK(h,"Anonymous function"))&&(h=zVn),u=mN(s,YTn(58)),r=MK(s,YTn(58),u-1),o=-1,i=-1,c=XVn,-1!=u&&-1!=r&&(c=s.substr(0,r),o=hx(s.substr(r+1,u-(r+1))),i=hx(s.substr(u+1))),n.de(c,h,o,i))}function Aqn(n,t,e){var i,r,c,a,u,o;if(0==t.l&&0==t.m&&0==t.h)throw Hp(new Oy("divide by zero"));if(0==n.l&&0==n.m&&0==n.h)return e&&(ltt=M$(0,0,0)),M$(0,0,0);if(t.h==CQn&&0==t.m&&0==t.l)return Fbn(n,e);if(o=!1,t.h>>19!=0&&(t=aon(t),o=!o),a=OLn(t),c=!1,r=!1,i=!1,n.h==CQn&&0==n.m&&0==n.l){if(r=!0,c=!0,-1!=a)return u=jAn(n,a),o&&Oon(u),e&&(ltt=M$(0,0,0)),u;n=WO((X7(),btt)),i=!0,o=!o}else n.h>>19!=0&&(c=!0,n=aon(n),i=!0,o=!o);return-1!=a?Bon(n,a,o,c,e):Kkn(n,t)<0?(e&&(ltt=c?aon(n):M$(n.l,n.m,n.h)),M$(0,0,0)):h_n(i?n:M$(n.l,n.m,n.h),t,o,c,r,e)}function $qn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;if(n.e&&n.c.c<n.f)throw Hp(new Fy("Expected "+n.f+" phases to be configured; only found "+n.c.c));for(h=BB(Vj(n.g),9),b=sx(n.f),u=0,s=(c=h).length;u<s;++u)(f=BB(D7(n,(i=c[u]).g),246))?WB(b,BB(own(n,f),123)):b.c[b.c.length]=null;for(w=new B2,JT(AV($V(AV(new Rq(null,new w1(b,16)),new hu),new Eg(t)),new fu),new Tg(w)),Jcn(w,n.a),e=new Np,a=0,o=(r=h).length;a<o;++a)gun(e,Eun(n,JQ(BB(D7(w,(i=r[a]).g),20)))),(l=BB(xq(b,i.g),123))&&(e.c[e.c.length]=l);return gun(e,Eun(n,JQ(BB(D7(w,h[h.length-1].g+1),20)))),e}function Lqn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w;for(OTn(i,"Model order cycle breaking",1),n.a=0,n.b=0,l=new Np,h=t.a.c.length,s=new Wb(t.a);s.a<s.c.c.length;)Lx(o=BB(n0(s),10),(hWn(),wlt))&&(h=e.Math.max(h,BB(mMn(o,wlt),19).a+1));for(w=new Wb(t.a);w.a<w.c.c.length;)for(u=zPn(n,b=BB(n0(w),10),h),f=xwn(b,(ain(),qvt)).Kc();f.Ob();)for(a=new Wb(BB(f.Pb(),11).g);a.a<a.c.c.length;)zPn(n,(r=BB(n0(a),17)).d.i,h)<u&&(l.c[l.c.length]=r);for(c=new Wb(l);c.a<c.c.c.length;)tBn(r=BB(n0(c),17),!0),hon(t,(hWn(),qft),(hN(),!0));l.c=x8(Ant,HWn,1,0,5,1),HSn(i)}function Nqn(n,t){var e,i,r,c,a,u,o;if(!(n.g>t.f||t.g>n.f)){for(e=0,i=0,a=n.w.a.ec().Kc();a.Ob();)r=BB(a.Pb(),11),phn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])).b,t.g,t.f)&&++e;for(u=n.r.a.ec().Kc();u.Ob();)r=BB(u.Pb(),11),phn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])).b,t.g,t.f)&&--e;for(o=t.w.a.ec().Kc();o.Ob();)r=BB(o.Pb(),11),phn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])).b,n.g,n.f)&&++i;for(c=t.r.a.ec().Kc();c.Ob();)r=BB(c.Pb(),11),phn(Aon(Pun(Gk(PMt,1),sVn,8,0,[r.i.n,r.n,r.a])).b,n.g,n.f)&&--i;e<i?new S6(n,t,i-e):i<e?new S6(t,n,e-i):(new S6(t,n,0),new S6(n,t,0))}}function xqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(s=t.c,r=QA(n.e),f=kL(Bx(B$(VA(n.e)),n.d*n.a,n.c*n.b),-.5),e=r.a-f.a,i=r.b-f.b,e=(a=t.a).c-e,i=a.d-i,o=new Wb(s);o.a<o.c.c.length;){switch(b=e+(l=(u=BB(n0(o),395)).b).a,g=i+l.b,w=CJ(b/n.a),p=CJ(g/n.b),(c=u.a).g){case 0:Hpn(),h=Brt;break;case 1:Hpn(),h=Frt;break;case 2:Hpn(),h=Hrt;break;default:Hpn(),h=qrt}c.a?(v=CJ((g+u.c)/n.b),WB(n.f,new x_(h,iln(p),iln(v))),c==(qpn(),tct)?won(n,0,p,w,v):won(n,w,p,n.d-1,v)):(d=CJ((b+u.c)/n.a),WB(n.f,new x_(h,iln(w),iln(d))),c==(qpn(),Zrt)?won(n,w,0,d,p):won(n,w,p,d,n.c-1))}}function Dqn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y;for(l=new Np,c=new Np,d=null,u=t.Kc();u.Ob();)a=new Hd(BB(u.Pb(),19).a),c.c[c.c.length]=a,d&&(a.d=d,d.e=a),d=a;for(m=zFn(n),h=0;h<c.c.length;++h){for(b=null,g=D6((l1(0,c.c.length),BB(c.c[0],652))),i=null,r=RQn,f=1;f<n.b.c.length;++f)p=g?e.Math.abs(g.b-f):e.Math.abs(f-b.b)+1,(w=b?e.Math.abs(f-b.b):p+1)<p?(s=b,o=w):(s=g,o=p),y=Gy(MD(mMn(n,(HXn(),Hpt)))),(v=m[f]+e.Math.pow(o,y))<r&&(r=v,(i=s).c=f),g&&f==g.b&&(b=g,g=xz(g));i&&(WB(l,iln(i.c)),i.a=!0,vln(i))}return SQ(),yG(l.c,l.c.length,null),l}function Rqn(n){var t,e,i,r,c,a,u,o,s,h;for(t=new To,e=new To,s=mK(K9n,(r=N_n(n.b,_9n))?SD(cdn((!r.b&&(r.b=new Jx((gWn(),k$t),X$t,r)),r.b),F9n)):null),o=0;o<n.i;++o)cL(u=BB(n.g[o],170),99)?0!=((a=BB(u,18)).Bb&h6n)?(0==(a.Bb&hVn)||!s&&null==((c=N_n(a,_9n))?SD(cdn((!c.b&&(c.b=new Jx((gWn(),k$t),X$t,c)),c.b),n8n)):null))&&f9(t,a):(h=Cvn(a))&&0!=(h.Bb&h6n)||(0==(a.Bb&hVn)||!s&&null==((i=N_n(a,_9n))?SD(cdn((!i.b&&(i.b=new Jx((gWn(),k$t),X$t,i)),i.b),n8n)):null))&&f9(e,a):(ZM(),BB(u,66).Oj()&&(u.Jj()||(f9(t,u),f9(e,u))));chn(t),chn(e),n.a=BB(t.g,247),BB(e.g,247)}function Kqn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;for(o=xSn(t),BB(mMn(t,(HXn(),qdt)),314)!=(Oin(),hht)&&e5(o,new vt),e5(o,new Dw(BB(mMn(t,Rdt),292))),b=0,s=new Np,r=new bV(o);r.a!=r.b;)i=BB(_hn(r),37),$Gn(n.c,i),b+=(f=BB(mMn(i,(hWn(),Mlt)),15)).gc(),WB(s,new rI(i,f.Kc()));for(OTn(e,"Recursive hierarchical layout",b),l=BB(BB(xq(s,s.c.length-1),46).b,47);l.Ob();)for(u=new Wb(s);u.a<u.c.c.length;)for(a=BB(n0(u),46),f=BB(a.b,47),c=BB(a.a,37);f.Ob();){if(cL(h=BB(f.Pb(),51),507)){if(c.e)break;h.pf(c,mcn(e,1));break}h.pf(c,mcn(e,1))}HSn(e)}function _qn(n,t){var e,i,r,c,a,u,o,s;if(b1(u=t.length-1,t.length),93==(a=t.charCodeAt(u))){if((c=GO(t,YTn(91)))>=0)return r=dbn(n,t.substr(1,c-1)),YUn(n,t.substr(c+1,u-(c+1)),r)}else{if(e=-1,null==Ett&&(Ett=new RegExp("\\d")),Ett.test(String.fromCharCode(a))&&(e=MK(t,YTn(46),u-1))>=0){i=BB(V5(n,Ptn(n,t.substr(1,e-1)),!1),58),o=0;try{o=l_n(t.substr(e+1),_Vn,DWn)}catch(h){throw cL(h=lun(h),127)?Hp(new L7(h)):Hp(h)}if(o<i.gc())return cL(s=i.Xb(o),72)&&(s=BB(s,72).dd()),BB(s,56)}if(e<0)return BB(V5(n,Ptn(n,t.substr(1)),!1),56)}return null}function Fqn(n,t,e){var i,r,c,a,u,o,s;if(Awn(t,e)>=0)return e;switch(DW(B7(n,e))){case 2:if(mK("",Cfn(n,e.Hj()).ne())){if(o=m$n(n,t,u=jV(B7(n,e)),kV(B7(n,e))))return o;for(a=0,s=(r=jKn(n,t)).gc();a<s;++a)if(aNn(OU(B7(n,o=BB(r.Xb(a),170))),u))return o}return null;case 4:if(mK("",Cfn(n,e.Hj()).ne())){for(i=e;i;i=J1(B7(n,i)))if(o=y$n(n,t,jV(B7(n,i)),kV(B7(n,i))))return o;if(u=jV(B7(n,e)),mK(S7n,u))return mjn(n,t);for(a=0,s=(c=EKn(n,t)).gc();a<s;++a)if(aNn(OU(B7(n,o=BB(c.Xb(a),170))),u))return o}return null;default:return null}}function Bqn(n,t,e){var i,r,c,a,u,o,s,h;if(0==e.gc())return!1;if(ZM(),c=(u=BB(t,66).Oj())?e:new gtn(e.gc()),$xn(n.e,t)){if(t.hi())for(s=e.Kc();s.Ob();)UFn(n,t,o=s.Pb(),cL(t,99)&&0!=(BB(t,18).Bb&BQn))||(r=Z3(t,o),c.Hc(r)||c.Fc(r));else if(!u)for(s=e.Kc();s.Ob();)r=Z3(t,o=s.Pb()),c.Fc(r)}else{if(e.gc()>1)throw Hp(new _y(I7n));for(h=axn(n.e.Tg(),t),i=BB(n.g,119),a=0;a<n.i;++a)if(r=i[a],h.rl(r.ak())){if(e.Hc(u?r:r.dd()))return!1;for(s=e.Kc();s.Ob();)o=s.Pb(),BB(ovn(n,a,u?BB(o,72):Z3(t,o)),72);return!0}u||(r=Z3(t,e.Kc().Pb()),c.Fc(r))}return pX(n,c)}function Hqn(n,t){var i,r,c,a,u,o,s;for(s=new YT,o=new Kb(new Ob(n.c).a.vc().Kc());o.a.Ob();)c=BB(o.a.Pb(),42),0==(a=BB(c.dd(),458)).b&&r5(s,a,s.c.b,s.c);for(;0!=s.b;)for(null==(a=BB(0==s.b?null:(Px(0!=s.b),Atn(s,s.a.a)),458)).a&&(a.a=0),r=new Wb(a.d);r.a<r.c.c.length;)null==(i=BB(n0(r),654)).b.a?i.b.a=Gy(a.a)+i.a:t.o==(oZ(),ryt)?i.b.a=e.Math.min(Gy(i.b.a),Gy(a.a)+i.a):i.b.a=e.Math.max(Gy(i.b.a),Gy(a.a)+i.a),--i.b.b,0==i.b.b&&DH(s,i.b);for(u=new Kb(new Ob(n.c).a.vc().Kc());u.a.Ob();)c=BB(u.a.Pb(),42),a=BB(c.dd(),458),t.i[a.c.p]=a.a}function qqn(){qqn=O,skt=new up(OZn),new up(AZn),new iR("DEPTH",iln(0)),ikt=new iR("FAN",iln(0)),tkt=new iR(U3n,iln(0)),dkt=new iR("ROOT",(hN(),!1)),ckt=new iR("LEFTNEIGHBOR",null),bkt=new iR("RIGHTNEIGHBOR",null),akt=new iR("LEFTSIBLING",null),wkt=new iR("RIGHTSIBLING",null),ekt=new iR("DUMMY",!1),new iR("LEVEL",iln(0)),lkt=new iR("REMOVABLE_EDGES",new YT),gkt=new iR("XCOOR",iln(0)),pkt=new iR("YCOOR",iln(0)),ukt=new iR("LEVELHEIGHT",0),rkt=new iR("ID",""),hkt=new iR("POSITION",iln(0)),fkt=new iR("PRELIM",0),okt=new iR("MODIFIER",0),nkt=new up($Zn),Zyt=new up(LZn)}function Gqn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w;for(f=i+t.c.c.a,w=new Wb(t.j);w.a<w.c.c.length;){if(b=BB(n0(w),11),c=Aon(Pun(Gk(PMt,1),sVn,8,0,[b.i.n,b.n,b.a])),t.k==(uSn(),Iut)&&(o=BB(mMn(b,(hWn(),dlt)),11),c.a=Aon(Pun(Gk(PMt,1),sVn,8,0,[o.i.n,o.n,o.a])).a,t.n.a=c.a),u=new xC(0,c.b),b.j==(kUn(),oIt))u.a=f;else{if(b.j!=CIt)continue;u.a=i}if(!(e.Math.abs(c.a-u.a)<=r)||Nkn(t))for(a=b.g.c.length+b.e.c.length>1,h=new m6(b.b);y$(h.a)||y$(h.b);)l=(s=BB(y$(h.a)?n0(h.a):n0(h.b),17)).c==b?s.d:s.c,e.Math.abs(Aon(Pun(Gk(PMt,1),sVn,8,0,[l.i.n,l.n,l.a])).b-u.b)>1&&pxn(n,s,u,a,b)}}function zqn(n){var t,i,r,c,a,u;if(c=new M2(n.e,0),r=new M2(n.a,0),n.d)for(i=0;i<n.b;i++)Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++);else for(i=0;i<n.b-1;i++)Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++),fW(c);for(t=Gy((Px(c.b<c.d.gc()),MD(c.d.Xb(c.c=c.b++))));n.f-t>D3n;){for(a=t,u=0;e.Math.abs(t-a)<D3n;)++u,t=Gy((Px(c.b<c.d.gc()),MD(c.d.Xb(c.c=c.b++)))),Px(r.b<r.d.gc()),r.d.Xb(r.c=r.b++);u<n.b&&(Px(c.b>0),c.a.Xb(c.c=--c.b),DFn(n,n.b-u,a,r,c),Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++)),Px(r.b>0),r.a.Xb(r.c=--r.b)}if(!n.d)for(i=0;i<n.b-1;i++)Px(c.b<c.d.gc()),c.d.Xb(c.c=c.b++),fW(c);n.d=!0,n.c=!0}function Uqn(){Uqn=O,pLt=(cE(),gLt).b,yLt=BB(Wtn(QQ(gLt.b),0),34),vLt=BB(Wtn(QQ(gLt.b),1),34),mLt=BB(Wtn(QQ(gLt.b),2),34),OLt=gLt.bb,BB(Wtn(QQ(gLt.bb),0),34),BB(Wtn(QQ(gLt.bb),1),34),$Lt=gLt.fb,LLt=BB(Wtn(QQ(gLt.fb),0),34),BB(Wtn(QQ(gLt.fb),1),34),BB(Wtn(QQ(gLt.fb),2),18),xLt=gLt.qb,KLt=BB(Wtn(QQ(gLt.qb),0),34),BB(Wtn(QQ(gLt.qb),1),18),BB(Wtn(QQ(gLt.qb),2),18),DLt=BB(Wtn(QQ(gLt.qb),3),34),RLt=BB(Wtn(QQ(gLt.qb),4),34),FLt=BB(Wtn(QQ(gLt.qb),6),34),_Lt=BB(Wtn(QQ(gLt.qb),5),18),kLt=gLt.j,jLt=gLt.k,ELt=gLt.q,TLt=gLt.w,MLt=gLt.B,SLt=gLt.A,PLt=gLt.C,CLt=gLt.D,ILt=gLt._,ALt=gLt.cb,NLt=gLt.hb}function Xqn(n,t,i){var r,c,a,u,o,s,h,f,l;n.c=0,n.b=0,r=2*t.c.a.c.length+1;n:for(h=i.Kc();h.Ob();){if(l=0,u=(s=BB(h.Pb(),11)).j==(kUn(),sIt)||s.j==SIt){if(!(f=BB(mMn(s,(hWn(),Elt)),10)))continue;l+=iRn(n,r,s,f)}else{for(o=new Wb(s.g);o.a<o.c.c.length;){if((c=BB(n0(o),17).d).i.c==t.c){WB(n.a,s);continue n}l+=n.g[c.p]}for(a=new Wb(s.e);a.a<a.c.c.length;){if((c=BB(n0(a),17).c).i.c==t.c){WB(n.a,s);continue n}l-=n.g[c.p]}}s.e.c.length+s.g.c.length>0?(n.f[s.p]=l/(s.e.c.length+s.g.c.length),n.c=e.Math.min(n.c,n.f[s.p]),n.b=e.Math.max(n.b,n.f[s.p])):u&&(n.f[s.p]=l)}}function Wqn(n){n.b=null,n.bb=null,n.fb=null,n.qb=null,n.a=null,n.c=null,n.d=null,n.e=null,n.f=null,n.n=null,n.M=null,n.L=null,n.Q=null,n.R=null,n.K=null,n.db=null,n.eb=null,n.g=null,n.i=null,n.j=null,n.k=null,n.gb=null,n.o=null,n.p=null,n.q=null,n.r=null,n.$=null,n.ib=null,n.S=null,n.T=null,n.t=null,n.s=null,n.u=null,n.v=null,n.w=null,n.B=null,n.A=null,n.C=null,n.D=null,n.F=null,n.G=null,n.H=null,n.I=null,n.J=null,n.P=null,n.Z=null,n.U=null,n.V=null,n.W=null,n.X=null,n.Y=null,n._=null,n.ab=null,n.cb=null,n.hb=null,n.nb=null,n.lb=null,n.mb=null,n.ob=null,n.pb=null,n.jb=null,n.kb=null,n.N=!1,n.O=!1}function Vqn(n,t,e){var i,r;for(OTn(e,"Graph transformation ("+n.a+")",1),r=a0(t.a),i=new Wb(t.b);i.a<i.c.c.length;)gun(r,BB(n0(i),29).a);if(BB(mMn(t,(HXn(),Xdt)),419)==(_nn(),Sht))switch(BB(mMn(t,Udt),103).g){case 2:L2(t,r);break;case 3:bdn(t,r);break;case 4:n.a==(Srn(),qut)?(bdn(t,r),$2(t,r)):($2(t,r),bdn(t,r))}else if(n.a==(Srn(),qut))switch(BB(mMn(t,Udt),103).g){case 2:L2(t,r),$2(t,r);break;case 3:bdn(t,r),L2(t,r);break;case 4:L2(t,r),bdn(t,r)}else switch(BB(mMn(t,Udt),103).g){case 2:L2(t,r),$2(t,r);break;case 3:L2(t,r),bdn(t,r);break;case 4:bdn(t,r),L2(t,r)}HSn(e)}function Qqn(n,t,e){var i,r,c,a,u,o,s,f,l,b,w;for(o=new fA,s=new fA,b=new fA,w=new fA,u=Gy(MD(mMn(t,(HXn(),Opt)))),r=Gy(MD(mMn(t,ypt))),a=new Wb(e);a.a<a.c.c.length;)if(c=BB(n0(a),10),(f=BB(mMn(c,(hWn(),Qft)),61))==(kUn(),sIt))for(s.a.zc(c,s),i=new oz(ZL(fbn(c).a.Kc(),new h));dAn(i);)TU(o,BB(U5(i),17).c.i);else if(f==SIt)for(w.a.zc(c,w),i=new oz(ZL(fbn(c).a.Kc(),new h));dAn(i);)TU(b,BB(U5(i),17).c.i);0!=o.a.gc()&&(l=AGn(new fX(2,r),t,o,s,-u-t.c.b))>0&&(n.a=u+(l-1)*r,t.c.b+=n.a,t.f.b+=n.a),0!=b.a.gc()&&(l=AGn(new fX(1,r),t,b,w,t.f.b+u-t.c.b))>0&&(t.f.b+=u+(l-1)*r)}function Yqn(n,t){var e,i,r,c;c=n.F,null==t?(n.F=null,Dsn(n,null)):(n.F=(kW(t),t),-1!=(i=GO(t,YTn(60)))?(r=t.substr(0,i),-1==GO(t,YTn(46))&&!mK(r,$Wn)&&!mK(r,S9n)&&!mK(r,P9n)&&!mK(r,C9n)&&!mK(r,I9n)&&!mK(r,O9n)&&!mK(r,A9n)&&!mK(r,$9n)&&(r=L9n),-1!=(e=mN(t,YTn(62)))&&(r+=""+t.substr(e+1)),Dsn(n,r)):(r=t,-1==GO(t,YTn(46))&&(-1!=(i=GO(t,YTn(91)))&&(r=t.substr(0,i)),mK(r,$Wn)||mK(r,S9n)||mK(r,P9n)||mK(r,C9n)||mK(r,I9n)||mK(r,O9n)||mK(r,A9n)||mK(r,$9n)?r=t:(r=L9n,-1!=i&&(r+=""+t.substr(i)))),Dsn(n,r),r==t&&(n.F=n.D))),0!=(4&n.Db)&&0==(1&n.Db)&&ban(n,new nU(n,1,5,c,t))}function Jqn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;if(!((d=t.b.c.length)<3)){for(b=x8(ANt,hQn,25,d,15,1),f=0,h=new Wb(t.b);h.a<h.c.c.length;)s=BB(n0(h),29),b[f++]=s.a.c.length;for(l=new M2(t.b,2),i=1;i<d-1;i++)for(Px(l.b<l.d.gc()),w=new Wb((e=BB(l.d.Xb(l.c=l.b++),29)).a),c=0,u=0,o=0;o<b[i+1];o++)if(m=BB(n0(w),10),o==b[i+1]-1||YSn(n,m,i+1,i)){for(a=b[i]-1,YSn(n,m,i+1,i)&&(a=n.c.e[BB(BB(BB(xq(n.c.b,m.p),15).Xb(0),46).a,10).p]);u<=o;){if(!YSn(n,v=BB(xq(e.a,u),10),i+1,i))for(p=BB(xq(n.c.b,v.p),15).Kc();p.Ob();)g=BB(p.Pb(),46),((r=n.c.e[BB(g.a,10).p])<c||r>a)&&TU(n.b,BB(g.b,17));++u}c=a}}}function Zqn(n,t){var e;if(null==t||mK(t,zWn))return null;if(0==t.length&&n.k!=(PPn(),pMt))return null;switch(n.k.g){case 1:return mgn(t,a5n)?(hN(),vtt):mgn(t,u5n)?(hN(),ptt):null;case 2:try{return iln(l_n(t,_Vn,DWn))}catch(i){if(cL(i=lun(i),127))return null;throw Hp(i)}case 4:try{return bSn(t)}catch(i){if(cL(i=lun(i),127))return null;throw Hp(i)}case 3:return t;case 5:return rhn(n),HIn(n,t);case 6:return rhn(n),K$n(n,n.a,t);case 7:try{return(e=rAn(n)).Jf(t),e}catch(i){if(cL(i=lun(i),32))return null;throw Hp(i)}default:throw Hp(new Fy("Invalid type set for this layout option."))}}function nGn(n){var t,e,i,r,c,a,u;for(Dnn(),u=new Vv,e=new Wb(n);e.a<e.c.c.length;)t=BB(n0(e),140),(!u.b||t.c>=u.b.c)&&(u.b=t),(!u.c||t.c<=u.c.c)&&(u.d=u.c,u.c=t),(!u.e||t.d>=u.e.d)&&(u.e=t),(!u.f||t.d<=u.f.d)&&(u.f=t);return i=new Tpn((Aun(),Zat)),i2(n,out,new Jy(Pun(Gk(Jat,1),HWn,369,0,[i]))),a=new Tpn(eut),i2(n,uut,new Jy(Pun(Gk(Jat,1),HWn,369,0,[a]))),r=new Tpn(nut),i2(n,aut,new Jy(Pun(Gk(Jat,1),HWn,369,0,[r]))),c=new Tpn(tut),i2(n,cut,new Jy(Pun(Gk(Jat,1),HWn,369,0,[c]))),xLn(i.c,Zat),xLn(r.c,nut),xLn(c.c,tut),xLn(a.c,eut),u.a.c=x8(Ant,HWn,1,0,5,1),gun(u.a,i.c),gun(u.a,ean(r.c)),gun(u.a,c.c),gun(u.a,ean(a.c)),u}function tGn(n){var t;switch(n.d){case 1:if(n.hj())return-2!=n.o;break;case 2:if(n.hj())return-2==n.o;break;case 3:case 5:case 4:case 6:case 7:return n.o>-2;default:return!1}switch(t=n.gj(),n.p){case 0:return null!=t&&qy(TD(t))!=JI(n.k,0);case 1:return null!=t&&BB(t,217).a!=dG(n.k)<<24>>24;case 2:return null!=t&&BB(t,172).a!=(dG(n.k)&QVn);case 6:return null!=t&&JI(BB(t,162).a,n.k);case 5:return null!=t&&BB(t,19).a!=dG(n.k);case 7:return null!=t&&BB(t,184).a!=dG(n.k)<<16>>16;case 3:return null!=t&&Gy(MD(t))!=n.j;case 4:return null!=t&&BB(t,155).a!=n.j;default:return null==t?null!=n.n:!Nfn(t,n.n)}}function eGn(n,t,e){var i,r,c,a;return n.Fk()&&n.Ek()&&GI(a=Gz(n,BB(e,56)))!==GI(e)?(n.Oi(t),n.Ui(t,B9(n,t,a)),n.rk()&&(r=BB(e,49),c=n.Dk()?n.Bk()?r.ih(n.b,Cvn(BB(itn(jY(n.b),n.aj()),18)).n,BB(itn(jY(n.b),n.aj()).Yj(),26).Bj(),null):r.ih(n.b,Awn(r.Tg(),Cvn(BB(itn(jY(n.b),n.aj()),18))),null,null):r.ih(n.b,-1-n.aj(),null,null),!BB(a,49).eh()&&(i=BB(a,49),c=n.Dk()?n.Bk()?i.gh(n.b,Cvn(BB(itn(jY(n.b),n.aj()),18)).n,BB(itn(jY(n.b),n.aj()).Yj(),26).Bj(),c):i.gh(n.b,Awn(i.Tg(),Cvn(BB(itn(jY(n.b),n.aj()),18))),null,c):i.gh(n.b,-1-n.aj(),null,c)),c&&c.Fi()),mA(n.b)&&n.$i(n.Zi(9,e,a,t,!1)),a):e}function iGn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(f=Gy(MD(mMn(n,(HXn(),Ept)))),r=Gy(MD(mMn(n,Rpt))),hon(b=new Yu,Ept,f+r),v=(h=t).d,g=h.c.i,m=h.d.i,p=tA(g.c),y=tA(m.c),c=new Np,l=p;l<=y;l++)Bl(o=new $vn(n),(uSn(),Put)),hon(o,(hWn(),dlt),h),hon(o,ept,(QEn(),XCt)),hon(o,Mpt,b),w=BB(xq(n.b,l),29),l==p?Qyn(o,w.a.c.length-i,w):PZ(o,w),(k=Gy(MD(mMn(h,agt))))<0&&hon(h,agt,k=0),o.o.b=k,d=e.Math.floor(k/2),qCn(u=new CSn,(kUn(),CIt)),CZ(u,o),u.n.b=d,qCn(s=new CSn,oIt),CZ(s,o),s.n.b=d,MZ(h,u),qan(a=new wY,h),hon(a,vgt,null),SZ(a,s),MZ(a,v),zkn(o,h,a),c.c[c.c.length]=a,h=a;return c}function rGn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(u=BB(DSn(n,(kUn(),CIt)).Kc().Pb(),11).e,f=BB(DSn(n,oIt).Kc().Pb(),11).g,a=u.c.length,g=g1(BB(xq(n.j,0),11));a-- >0;){for(l1(0,u.c.length),b=BB(u.c[0],17),l1(0,f.c.length),r=E7((i=BB(f.c[0],17)).d.e,i,0),A2(b,i.d,r),SZ(i,null),MZ(i,null),l=b.a,t&&DH(l,new wA(g)),e=spn(i.a,0);e.b!=e.d.c;)DH(l,new wA(BB(b3(e),8)));for(d=b.b,h=new Wb(i.b);h.a<h.c.c.length;)s=BB(n0(h),70),d.c[d.c.length]=s;if(w=BB(mMn(b,(HXn(),vgt)),74),c=BB(mMn(i,vgt),74))for(w||(w=new km,hon(b,vgt,w)),o=spn(c,0);o.b!=o.d.c;)DH(w,new wA(BB(b3(o),8)))}}function cGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w;if(i=BB(oV(n.b,t),124),(s=BB(BB(h6(n.r,t),21),84)).dc())return i.n.b=0,void(i.n.c=0);for(h=n.u.Hc((lIn(),eIt)),u=0,o=s.Kc(),f=null,l=0,b=0;o.Ob();)c=Gy(MD((r=BB(o.Pb(),111)).b.We((DN(),Lrt)))),a=r.b.rf().a,n.A.Hc((mdn(),_It))&&yRn(n,t),f?(w=b+f.d.c+n.w+r.d.b,u=e.Math.max(u,(h$(),rin(fJn),e.Math.abs(l-c)<=fJn||l==c||isNaN(l)&&isNaN(c)?0:w/(c-l)))):n.C&&n.C.b>0&&(u=e.Math.max(u,lcn(n.C.b+r.d.b,c))),f=r,l=c,b=a;n.C&&n.C.c>0&&(w=b+n.C.c,h&&(w+=f.d.c),u=e.Math.max(u,(h$(),rin(fJn),e.Math.abs(l-1)<=fJn||1==l||isNaN(l)&&isNaN(1)?0:w/(1-l)))),i.n.b=0,i.a.a=u}function aGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w;if(i=BB(oV(n.b,t),124),(s=BB(BB(h6(n.r,t),21),84)).dc())return i.n.d=0,void(i.n.a=0);for(h=n.u.Hc((lIn(),eIt)),u=0,n.A.Hc((mdn(),_It))&&kRn(n,t),o=s.Kc(),f=null,b=0,l=0;o.Ob();)a=Gy(MD((r=BB(o.Pb(),111)).b.We((DN(),Lrt)))),c=r.b.rf().b,f?(w=l+f.d.a+n.w+r.d.d,u=e.Math.max(u,(h$(),rin(fJn),e.Math.abs(b-a)<=fJn||b==a||isNaN(b)&&isNaN(a)?0:w/(a-b)))):n.C&&n.C.d>0&&(u=e.Math.max(u,lcn(n.C.d+r.d.d,a))),f=r,b=a,l=c;n.C&&n.C.a>0&&(w=l+n.C.a,h&&(w+=f.d.a),u=e.Math.max(u,(h$(),rin(fJn),e.Math.abs(b-1)<=fJn||1==b||isNaN(b)&&isNaN(1)?0:w/(1-b)))),i.n.d=0,i.a.b=u}function uGn(n,t,e){var i,r,c,a,u,o;for(this.g=n,u=t.d.length,o=e.d.length,this.d=x8(Out,a1n,10,u+o,0,1),a=0;a<u;a++)this.d[a]=t.d[a];for(c=0;c<o;c++)this.d[u+c]=e.d[c];if(t.e){if(this.e=zB(t.e),this.e.Mc(e),e.e)for(r=e.e.Kc();r.Ob();)(i=BB(r.Pb(),233))!=t&&(this.e.Hc(i)?--i.c:this.e.Fc(i))}else e.e&&(this.e=zB(e.e),this.e.Mc(t));this.f=t.f+e.f,this.a=t.a+e.a,this.a>0?Jtn(this,this.f/this.a):null!=lL(t.g,t.d[0]).a&&null!=lL(e.g,e.d[0]).a?Jtn(this,(Gy(lL(t.g,t.d[0]).a)+Gy(lL(e.g,e.d[0]).a))/2):null!=lL(t.g,t.d[0]).a?Jtn(this,lL(t.g,t.d[0]).a):null!=lL(e.g,e.d[0]).a&&Jtn(this,lL(e.g,e.d[0]).a)}function oGn(n,t){var e,i,r,c,a,u,o,s,h;for(n.a=new BX($cn(WPt)),i=new Wb(t.a);i.a<i.c.c.length;){for(e=BB(n0(i),841),a=new Pgn(Pun(Gk(Qat,1),HWn,81,0,[])),WB(n.a.a,a),o=new Wb(e.d);o.a<o.c.c.length;)FGn(s=new NN(n,u=BB(n0(o),110)),BB(mMn(e.c,(hWn(),Xft)),21)),hU(n.g,e)||(VW(n.g,e,new xC(u.c,u.d)),VW(n.f,e,s)),WB(n.a.b,s),g2(a,s);for(c=new Wb(e.b);c.a<c.c.c.length;)s=new NN(n,(r=BB(n0(c),594)).kf()),VW(n.b,r,new rI(a,s)),FGn(s,BB(mMn(e.c,(hWn(),Xft)),21)),r.hf()&&(FGn(h=new Sgn(n,r.hf(),1),BB(mMn(e.c,Xft),21)),g2(new Pgn(Pun(Gk(Qat,1),HWn,81,0,[])),h),JIn(n.c,r.gf(),new rI(a,h)))}return n.a}function sGn(n){var t;this.a=n,t=(uSn(),Pun(Gk($ut,1),$Vn,267,0,[Cut,Put,Mut,Iut,Sut,Tut])).length,this.b=kq(lMt,[sVn,k3n],[593,146],0,[t,t],2),this.c=kq(lMt,[sVn,k3n],[593,146],0,[t,t],2),FY(this,Cut,(HXn(),Opt),Apt),tun(this,Cut,Put,Ept,Tpt),_Y(this,Cut,Iut,Ept),_Y(this,Cut,Mut,Ept),tun(this,Cut,Sut,Opt,Apt),FY(this,Put,ypt,kpt),_Y(this,Put,Iut,ypt),_Y(this,Put,Mut,ypt),tun(this,Put,Sut,Ept,Tpt),ZA(this,Iut,ypt),_Y(this,Iut,Mut,ypt),_Y(this,Iut,Sut,Ppt),ZA(this,Mut,Npt),tun(this,Mut,Sut,Ipt,Cpt),FY(this,Sut,ypt,ypt),FY(this,Tut,ypt,kpt),tun(this,Tut,Cut,Ept,Tpt),tun(this,Tut,Sut,Ept,Tpt),tun(this,Tut,Put,Ept,Tpt)}function hGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;if(cL(a=e.ak(),99)&&0!=(BB(a,18).Bb&BQn)&&(l=BB(e.dd(),49),(d=tfn(n.e,l))!=l)){if(jL(n,t,sTn(n,t,h=Z3(a,d))),f=null,mA(n.e)&&(i=Fqn((IPn(),Z$t),n.e.Tg(),a))!=itn(n.e.Tg(),n.c)){for(g=axn(n.e.Tg(),a),u=0,c=BB(n.g,119),o=0;o<t;++o)r=c[o],g.rl(r.ak())&&++u;(f=new b4(n.e,9,i,l,d,u,!1)).Ei(new N7(n.e,9,n.c,e,h,t,!1))}return(b=Cvn(w=BB(a,18)))?(f=l.ih(n.e,Awn(l.Tg(),b),null,f),f=BB(d,49).gh(n.e,Awn(d.Tg(),b),null,f)):0!=(w.Bb&h6n)&&(s=-1-Awn(n.e.Tg(),w),f=l.ih(n.e,s,null,null),!BB(d,49).eh()&&(f=BB(d,49).gh(n.e,s,null,f))),f&&f.Fi(),h}return e}function fGn(n){var t,i,r,c,a,u,o,s;for(a=new Wb(n.a.b);a.a<a.c.c.length;)(c=BB(n0(a),81)).b.c=c.g.c,c.b.d=c.g.d;for(s=new xC(RQn,RQn),t=new xC(KQn,KQn),r=new Wb(n.a.b);r.a<r.c.c.length;)i=BB(n0(r),81),s.a=e.Math.min(s.a,i.g.c),s.b=e.Math.min(s.b,i.g.d),t.a=e.Math.max(t.a,i.g.c+i.g.b),t.b=e.Math.max(t.b,i.g.d+i.g.a);for(o=TX(n.c).a.nc();o.Ob();)u=BB(o.Pb(),46),i=BB(u.b,81),s.a=e.Math.min(s.a,i.g.c),s.b=e.Math.min(s.b,i.g.d),t.a=e.Math.max(t.a,i.g.c+i.g.b),t.b=e.Math.max(t.b,i.g.d+i.g.a);n.d=qx(new xC(s.a,s.b)),n.e=XR(new xC(t.a,t.b),s),n.a.a.c=x8(Ant,HWn,1,0,5,1),n.a.b.c=x8(Ant,HWn,1,0,5,1)}function lGn(n){var t,e,i;for(ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Nf])),e=new Tl(n),i=0;i<e.a.length;++i)mK(t=dnn(e,i).je().a,"layered")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new hf])):mK(t,"force")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new zh])):mK(t,"stress")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Xh])):mK(t,"mrtree")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Pf])):mK(t,"radial")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new yf])):mK(t,"disco")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Gh,new Hh])):mK(t,"sporeOverlap")||mK(t,"sporeCompaction")?ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Tf])):mK(t,"rectpacking")&&ksn(lAt,Pun(Gk(_it,1),HWn,130,0,[new Of]))}function bGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;if(l=new wA(n.o),p=t.a/l.a,u=t.b/l.b,d=t.a-l.a,c=t.b-l.b,e)for(r=GI(mMn(n,(HXn(),ept)))===GI((QEn(),XCt)),w=new Wb(n.j);w.a<w.c.c.length;)switch((b=BB(n0(w),11)).j.g){case 1:r||(b.n.a*=p);break;case 2:b.n.a+=d,r||(b.n.b*=u);break;case 3:r||(b.n.a*=p),b.n.b+=c;break;case 4:r||(b.n.b*=u)}for(s=new Wb(n.b);s.a<s.c.c.length;)h=(o=BB(n0(s),70)).n.a+o.o.a/2,f=o.n.b+o.o.b/2,(g=h/l.a)+(a=f/l.b)>=1&&(g-a>0&&f>=0?(o.n.a+=d,o.n.b+=c*a):g-a<0&&h>=0&&(o.n.a+=d*g,o.n.b+=c));n.o.a=t.a,n.o.b=t.b,hon(n,(HXn(),Fgt),(mdn(),new YK(i=BB(Vj(YIt),9),BB(SR(i,i.length),9),0)))}function wGn(n,t,e,i,r,c){if(null!=t&&Xbn(t,AAt,$At))throw Hp(new _y("invalid scheme: "+t));if(!(n||null!=e&&-1==GO(e,YTn(35))&&e.length>0&&(b1(0,e.length),47!=e.charCodeAt(0))))throw Hp(new _y("invalid opaquePart: "+e));if(n&&(null==t||!xT(jAt,t.toLowerCase()))&&null!=e&&Xbn(e,LAt,NAt))throw Hp(new _y(o9n+e));if(n&&null!=t&&xT(jAt,t.toLowerCase())&&!CEn(e))throw Hp(new _y(o9n+e));if(!Ubn(i))throw Hp(new _y("invalid device: "+i));if(!Rhn(r))throw Hp(new _y(null==r?"invalid segments: null":"invalid segment: "+shn(r)));if(null!=c&&-1!=GO(c,YTn(35)))throw Hp(new _y("invalid query: "+c))}function dGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(OTn(t,"Calculate Graph Size",1),t.n&&n&&y0(t,o2(n),(Bsn(),uOt)),o=ZJn,s=ZJn,a=n4n,u=n4n,l=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));l.e!=l.i.gc();)d=(h=BB(kpn(l),33)).i,g=h.j,v=h.g,r=h.f,c=BB(ZAn(h,(sWn(),$St)),142),o=e.Math.min(o,d-c.b),s=e.Math.min(s,g-c.d),a=e.Math.max(a,d+v+c.c),u=e.Math.max(u,g+r+c.a);for(b=new xC(o-(w=BB(ZAn(n,(sWn(),XSt)),116)).b,s-w.d),f=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));f.e!=f.i.gc();)Pen(h=BB(kpn(f),33),h.i-b.a),Cen(h,h.j-b.b);p=a-o+(w.b+w.c),i=u-s+(w.d+w.a),Sen(n,p),Men(n,i),t.n&&n&&y0(t,o2(n),(Bsn(),uOt))}function gGn(n){var t,e,i,r,c,a,u,o,s,h;for(i=new Np,a=new Wb(n.e.a);a.a<a.c.c.length;){for(h=0,(r=BB(n0(a),121)).k.c=x8(Ant,HWn,1,0,5,1),e=new Wb(kbn(r));e.a<e.c.c.length;)(t=BB(n0(e),213)).f&&(WB(r.k,t),++h);1==h&&(i.c[i.c.length]=r)}for(c=new Wb(i);c.a<c.c.c.length;)for(r=BB(n0(c),121);1==r.k.c.length;){for(s=BB(n0(new Wb(r.k)),213),n.b[s.c]=s.g,u=s.d,o=s.e,e=new Wb(kbn(r));e.a<e.c.c.length;)Nfn(t=BB(n0(e),213),s)||(t.f?u==t.d||o==t.e?n.b[s.c]-=n.b[t.c]-t.g:n.b[s.c]+=n.b[t.c]-t.g:r==u?t.d==r?n.b[s.c]+=t.g:n.b[s.c]-=t.g:t.d==r?n.b[s.c]-=t.g:n.b[s.c]+=t.g);y7(u.k,s),y7(o.k,s),r=u==r?s.e:s.d}}function pGn(n,t){var e,i,r,c,a,u,o,s,h,f,l;if(null==t||0==t.length)return null;if(!(c=BB(SJ(n.f,t),23))){for(r=new Kb(new Ob(n.d).a.vc().Kc());r.a.Ob();)if(a=BB(r.a.Pb(),42),u=(e=BB(a.dd(),23)).f,l=t.length,mK(u.substr(u.length-l,l),t)&&(t.length==u.length||46==fV(u,u.length-t.length-1))){if(c)return null;c=e}if(!c)for(i=new Kb(new Ob(n.d).a.vc().Kc());i.a.Ob();)if(a=BB(i.a.Pb(),42),null!=(f=(e=BB(a.dd(),23)).g))for(s=0,h=(o=f).length;s<h;++s)if(u=o[s],l=t.length,mK(u.substr(u.length-l,l),t)&&(t.length==u.length||46==fV(u,u.length-t.length-1))){if(c)return null;c=e}c&&mZ(n.f,t,c)}return c}function vGn(n,t){var e,i,r,c,a;for(e=new Ik,a=!1,c=0;c<t.length;c++)if(b1(c,t.length),32!=(i=t.charCodeAt(c)))a?39==i?c+1<t.length&&(b1(c+1,t.length),39==t.charCodeAt(c+1))?(e.a+=String.fromCharCode(i),++c):a=!1:e.a+=String.fromCharCode(i):GO("GyMLdkHmsSEcDahKzZv",YTn(i))>0?(Ppn(n,e,0),e.a+=String.fromCharCode(i),Ppn(n,e,r=cgn(t,c)),c+=r-1):39==i?c+1<t.length&&(b1(c+1,t.length),39==t.charCodeAt(c+1))?(e.a+="'",++c):a=!0:e.a+=String.fromCharCode(i);else for(Ppn(n,e,0),e.a+=" ",Ppn(n,e,0);c+1<t.length&&(b1(c+1,t.length),32==t.charCodeAt(c+1));)++c;Ppn(n,e,0),pTn(n)}function mGn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p;if(OTn(i,"Network simplex layering",1),n.b=t,p=4*BB(mMn(t,(HXn(),xpt)),19).a,(g=n.b.a).c.length<1)HSn(i);else{for(d=null,c=spn(a=IKn(n,g),0);c.b!=c.d.c;){for(r=BB(b3(c),15),o=p*CJ(e.Math.sqrt(r.gc())),WKn(Qk(Jk(Yk(B_(u=o_n(r)),o),d),!0),mcn(i,1)),l=n.b.b,w=new Wb(u.a);w.a<w.c.c.length;){for(b=BB(n0(w),121);l.c.length<=b.e;)kG(l,l.c.length,new HX(n.b));PZ(BB(b.f,10),BB(xq(l,b.e),29))}if(a.b>1)for(d=x8(ANt,hQn,25,n.b.b.c.length,15,1),f=0,h=new Wb(n.b.b);h.a<h.c.c.length;)s=BB(n0(h),29),d[f++]=s.a.c.length}g.c=x8(Ant,HWn,1,0,5,1),n.a=null,n.b=null,n.c=null,HSn(i)}}function yGn(n){var t,i,r,c,a,u,o;for(t=0,a=new Wb(n.b.a);a.a<a.c.c.length;)(r=BB(n0(a),189)).b=0,r.c=0;for(ESn(n,0),ewn(n,n.g),kNn(n.c),Zy(n.c),Ffn(),i=_Pt,DKn(eO(Mzn(DKn(eO(Mzn(DKn(Mzn(n.c,i)),jln(i)))),i))),Mzn(n.c,_Pt),Bln(n,n.g),kMn(n,0),pHn(n,0),M$n(n,1),ESn(n,1),ewn(n,n.d),kNn(n.c),u=new Wb(n.b.a);u.a<u.c.c.length;)r=BB(n0(u),189),t+=e.Math.abs(r.c);for(o=new Wb(n.b.a);o.a<o.c.c.length;)(r=BB(n0(o),189)).b=0,r.c=0;for(i=HPt,DKn(eO(Mzn(DKn(eO(Mzn(DKn(Zy(Mzn(n.c,i))),jln(i)))),i))),Mzn(n.c,_Pt),Bln(n,n.d),kMn(n,1),pHn(n,1),M$n(n,0),Zy(n.c),c=new Wb(n.b.a);c.a<c.c.c.length;)r=BB(n0(c),189),t+=e.Math.abs(r.c);return t}function kGn(n,t){var e,i,r,c,a,u,o,s,h;if(null!=(s=t).b&&null!=n.b){for(T$n(n),qHn(n),T$n(s),qHn(s),e=x8(ANt,hQn,25,n.b.length+s.b.length,15,1),h=0,i=0,a=0;i<n.b.length&&a<s.b.length;)if(r=n.b[i],c=n.b[i+1],u=s.b[a],o=s.b[a+1],c<u)i+=2;else if(c>=u&&r<=o)u<=r&&c<=o?(e[h++]=r,e[h++]=c,i+=2):u<=r?(e[h++]=r,e[h++]=o,n.b[i]=o+1,a+=2):c<=o?(e[h++]=u,e[h++]=c,i+=2):(e[h++]=u,e[h++]=o,n.b[i]=o+1);else{if(!(o<r))throw Hp(new dy("Token#intersectRanges(): Internal Error: ["+n.b[i]+","+n.b[i+1]+"] & ["+s.b[a]+","+s.b[a+1]+"]"));a+=2}for(;i<n.b.length;)e[h++]=n.b[i++],e[h++]=n.b[i++];n.b=x8(ANt,hQn,25,h,15,1),aHn(e,0,n.b,0,h)}}function jGn(n){var t,i,r,c,a,u,o;for(t=new Np,n.g=new Np,n.d=new Np,u=new usn(new Pb(n.f.b).a);u.b;)WB(t,BB(BB((a=ten(u)).dd(),46).b,81)),dA(BB(a.cd(),594).gf())?WB(n.d,BB(a.dd(),46)):WB(n.g,BB(a.dd(),46));for(ewn(n,n.d),ewn(n,n.g),n.c=new sOn(n.b),ej(n.c,(vM(),Gat)),Bln(n,n.d),Bln(n,n.g),gun(t,n.c.a.b),n.e=new xC(RQn,RQn),n.a=new xC(KQn,KQn),r=new Wb(t);r.a<r.c.c.length;)i=BB(n0(r),81),n.e.a=e.Math.min(n.e.a,i.g.c),n.e.b=e.Math.min(n.e.b,i.g.d),n.a.a=e.Math.max(n.a.a,i.g.c+i.g.b),n.a.b=e.Math.max(n.a.b,i.g.d+i.g.a);tj(n.c,new jt),o=0;do{c=yGn(n),++o}while((o<2||c>KVn)&&o<10);tj(n.c,new Et),yGn(n),IU(n.c),fGn(n.f)}function EGn(n,t,e){var i,r,c,a,u,o,s,h,f,l;if(qy(TD(mMn(e,(HXn(),wgt)))))for(r=new Wb(e.j);r.a<r.c.c.length;)for(u=0,o=(a=Z0(BB(n0(r),11).g)).length;u<o;++u)(c=a[u]).d.i==e&&qy(TD(mMn(c,dgt)))&&(h=c.c,(s=BB(RX(n.b,h),10))||(hon(s=bXn(h,(QEn(),QCt),h.j,-1,null,null,h.o,BB(mMn(t,Udt),103),t),(hWn(),dlt),h),VW(n.b,h,s),WB(t.a,s)),l=c.d,(f=BB(RX(n.b,l),10))||(hon(f=bXn(l,(QEn(),QCt),l.j,1,null,null,l.o,BB(mMn(t,Udt),103),t),(hWn(),dlt),l),VW(n.b,l,f),WB(t.a,f)),SZ(i=W5(c),BB(xq(s.j,0),11)),MZ(i,BB(xq(f.j,0),11)),JIn(n.a,c,new L_(i,t,(ain(),qvt))),BB(mMn(t,(hWn(),Zft)),21).Fc((bDn(),lft)))}function TGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w;for(OTn(e,"Label dummy switching",1),i=BB(mMn(t,(HXn(),Vdt)),227),pcn(t),r=j$n(t,i),n.a=x8(xNt,qQn,25,t.b.c.length,15,1),$Pn(),h=0,b=(u=Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])).length;h<b;++h)if(((c=u[h])==eht||c==Yst||c==nht)&&!BB(SN(r.a,c)?r.b[c.g]:null,15).dc()){Zcn(n,t);break}for(f=0,w=(o=Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])).length;f<w;++f)(c=o[f])==eht||c==Yst||c==nht||GKn(n,BB(SN(r.a,c)?r.b[c.g]:null,15));for(s=0,l=(a=Pun(Gk(uht,1),$Vn,227,0,[Zst,tht,Jst,nht,eht,Yst])).length;s<l;++s)((c=a[s])==eht||c==Yst||c==nht)&&GKn(n,BB(SN(r.a,c)?r.b[c.g]:null,15));n.a=null,HSn(e)}function MGn(n,t){var e,i,r,c,a,u,o,s,h,f,l;switch(n.k.g){case 1:if(i=BB(mMn(n,(hWn(),dlt)),17),(e=BB(mMn(i,glt),74))?qy(TD(mMn(i,Clt)))&&(e=Jon(e)):e=new km,s=BB(mMn(n,hlt),11)){if(t<=(h=Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a]))).a)return h.b;r5(e,h,e.a,e.a.a)}if(f=BB(mMn(n,flt),11)){if((l=Aon(Pun(Gk(PMt,1),sVn,8,0,[f.i.n,f.n,f.a]))).a<=t)return l.b;r5(e,l,e.c.b,e.c)}if(e.b>=2){for(a=BB(b3(o=spn(e,0)),8),u=BB(b3(o),8);u.a<t&&o.b!=o.d.c;)a=u,u=BB(b3(o),8);return a.b+(t-a.a)/(u.a-a.a)*(u.b-a.b)}break;case 3:switch(r=(c=BB(mMn(BB(xq(n.j,0),11),(hWn(),dlt)),11)).i,c.j.g){case 1:return r.n.b;case 3:return r.n.b+r.o.b}}return Fjn(n).b}function SGn(n){var t,e,i,r,c,a,u,o,s,f;for(c=new Wb(n.d.b);c.a<c.c.c.length;)for(u=new Wb(BB(n0(c),29).a);u.a<u.c.c.length;)!qy(TD(mMn(a=BB(n0(u),10),(HXn(),Tdt))))||h3(hbn(a))?(r=new UV(a.n.a-a.d.b,a.n.b-a.d.d,a.o.a+a.d.b+a.d.c,a.o.b+a.d.d+a.d.a),t=ON(iM(tM(eM(new Wv,a),r),dst),n.a),IN(nM(Xen(new Xv,Pun(Gk(bit,1),HWn,57,0,[t])),t),n.a),o=new Dp,VW(n.e,t,o),(e=F3(new oz(ZL(fbn(a).a.Kc(),new h)))-F3(new oz(ZL(lbn(a).a.Kc(),new h))))<0?Uun(o,!0,(Ffn(),_Pt)):e>0&&Uun(o,!0,(Ffn(),FPt)),a.k==(uSn(),Mut)&&wV(o),VW(n.f,a,t)):((s=(i=BB(iY(hbn(a)),17)).c.i)==a&&(s=i.d.i),f=new rI(s,XR(B$(a.n),s.n)),VW(n.b,a,f))}function PGn(n,t,i){var r,c,a,u,o,s,h,f;switch(OTn(i,"Node promotion heuristic",1),n.g=t,yUn(n),n.q=BB(mMn(t,(HXn(),Sgt)),260),f=BB(mMn(n.g,Mgt),19).a,a=new hi,n.q.g){case 2:case 1:default:_Hn(n,a);break;case 3:for(n.q=(sNn(),Ovt),_Hn(n,a),s=0,o=new Wb(n.a);o.a<o.c.c.length;)u=BB(n0(o),19),s=e.Math.max(s,u.a);s>n.j&&(n.q=Tvt,_Hn(n,a));break;case 4:for(n.q=(sNn(),Ovt),_Hn(n,a),h=0,c=new Wb(n.b);c.a<c.c.c.length;)r=MD(n0(c)),h=e.Math.max(h,(kW(r),r));h>n.k&&(n.q=Pvt,_Hn(n,a));break;case 6:_Hn(n,new od(CJ(e.Math.ceil(n.f.length*f/100))));break;case 5:_Hn(n,new sd(CJ(e.Math.ceil(n.d*f/100))))}oDn(n,t),HSn(i)}function CGn(n,t,e){var i,r,c,a;this.j=n,this.e=qEn(n),this.o=this.j.e,this.i=!!this.o,this.p=this.i?BB(xq(e,vW(this.o).p),214):null,r=BB(mMn(n,(hWn(),Zft)),21),this.g=r.Hc((bDn(),lft)),this.b=new Np,this.d=new wdn(this.e),a=BB(mMn(this.j,Slt),230),this.q=Han(t,a,this.e),this.k=new aZ(this),c=u6(Pun(Gk(jst,1),HWn,225,0,[this,this.d,this.k,this.q])),t!=(oin(),Omt)||qy(TD(mMn(n,(HXn(),xdt))))?t==Omt&&qy(TD(mMn(n,(HXn(),xdt))))?(i=new UEn(this.e),c.c[c.c.length]=i,this.c=new prn(i,a,BB(this.q,402))):this.c=new vP(t,this):(i=new UEn(this.e),c.c[c.c.length]=i,this.c=new G2(i,a,BB(this.q,402))),WB(c,this.c),CHn(c,this.e),this.s=wXn(this.k)}function IGn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(l=(s=BB(iL(new wg(spn(new bg(t).a.d,0))),86))?BB(mMn(s,(qqn(),ckt)),86):null,r=1;s&&l;){for(a=0,v=0,e=s,i=l,c=0;c<r;c++)e=G8(e),i=G8(i),v+=Gy(MD(mMn(e,(qqn(),okt)))),a+=Gy(MD(mMn(i,okt)));if(p=Gy(MD(mMn(l,(qqn(),fkt)))),g=Gy(MD(mMn(s,fkt))),h=E5(s,l),0<(f=p+a+n.a+h-g-v)){for(u=t,o=0;u&&u!=i;)++o,u=BB(mMn(u,akt),86);if(!u)return;for(d=f/o,u=t;u!=i;)w=Gy(MD(mMn(u,fkt)))+f,hon(u,fkt,w),b=Gy(MD(mMn(u,okt)))+f,hon(u,okt,b),f-=d,u=BB(mMn(u,akt),86)}++r,l=(s=0==s.d.b?ZKn(new bg(t),r):BB(iL(new wg(spn(new bg(s).a.d,0))),86))?BB(mMn(s,ckt),86):null}}function OGn(n,t){var e,i,r,c,a,u,o,s,f;for(u=!0,r=0,o=n.f[t.p],s=t.o.b+n.n,e=n.c[t.p][2],c5(n.a,o,iln(BB(xq(n.a,o),19).a-1+e)),c5(n.b,o,Gy(MD(xq(n.b,o)))-s+e*n.e),++o>=n.i?(++n.i,WB(n.a,iln(1)),WB(n.b,s)):(i=n.c[t.p][1],c5(n.a,o,iln(BB(xq(n.a,o),19).a+1-i)),c5(n.b,o,Gy(MD(xq(n.b,o)))+s-i*n.e)),(n.q==(sNn(),Tvt)&&(BB(xq(n.a,o),19).a>n.j||BB(xq(n.a,o-1),19).a>n.j)||n.q==Pvt&&(Gy(MD(xq(n.b,o)))>n.k||Gy(MD(xq(n.b,o-1)))>n.k))&&(u=!1),c=new oz(ZL(fbn(t).a.Kc(),new h));dAn(c);)a=BB(U5(c),17).c.i,n.f[a.p]==o&&(r+=BB((f=OGn(n,a)).a,19).a,u=u&&qy(TD(f.b)));return n.f[t.p]=o,new rI(iln(r+=n.c[t.p][0]),(hN(),!!u))}function AGn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v;for(l=new xp,u=new Np,rIn(n,i,n.d.fg(),u,l),rIn(n,r,n.d.gg(),u,l),n.b=.2*(g=BAn(wnn(new Rq(null,new w1(u,16)),new Sa)),p=BAn(wnn(new Rq(null,new w1(u,16)),new Pa)),e.Math.min(g,p)),a=0,o=0;o<u.c.length-1;o++)for(l1(o,u.c.length),s=BB(u.c[o],112),d=o+1;d<u.c.length;d++)a+=gHn(n,s,(l1(d,u.c.length),BB(u.c[d],112)));for(b=BB(mMn(t,(hWn(),Slt)),230),a>=2&&(v=QLn(u,!0,b),!n.e&&(n.e=new lg(n)),sgn(n.e,v,u,n.b)),iTn(u,b),czn(u),w=-1,f=new Wb(u);f.a<f.c.c.length;)h=BB(n0(f),112),e.Math.abs(h.s-h.c)<lZn||(w=e.Math.max(w,h.o),n.d.dg(h,c,n.c));return n.d.a.a.$b(),w+1}function $Gn(n,t){var e,i;Gy(MD(mMn(t,(HXn(),ypt))))<2&&hon(t,ypt,2),BB(mMn(t,Udt),103)==(Ffn(),BPt)&&hon(t,Udt,Wln(t)),0==(e=BB(mMn(t,wpt),19)).a?hon(t,(hWn(),Slt),new sbn):hon(t,(hWn(),Slt),new C4(e.a)),null==TD(mMn(t,xgt))&&hon(t,xgt,(hN(),GI(mMn(t,Zdt))===GI((Mbn(),QPt)))),JT(new Rq(null,new w1(t.a,16)),new Rw(n)),JT(wnn(new Rq(null,new w1(t.b,16)),new mt),new Kw(n)),i=new sGn(t),hon(t,(hWn(),Alt),i),h2(n.a),CU(n.a,(yMn(),Rat),BB(mMn(t,Gdt),246)),CU(n.a,Kat,BB(mMn(t,Pgt),246)),CU(n.a,_at,BB(mMn(t,qdt),246)),CU(n.a,Fat,BB(mMn(t,_gt),246)),CU(n.a,Bat,San(BB(mMn(t,Zdt),218))),aA(n.a,LXn(t)),hon(t,Mlt,$qn(n.a,t))}function LGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;return l=n.c[t],b=n.c[e],!((w=BB(mMn(l,(hWn(),clt)),15))&&0!=w.gc()&&w.Hc(b)||(d=l.k!=(uSn(),Put)&&b.k!=Put,v=(g=BB(mMn(l,rlt),10))!=(p=BB(mMn(b,rlt),10)),m=!!g&&g!=l||!!p&&p!=b,y=omn(l,(kUn(),sIt)),k=omn(b,SIt),m|=omn(l,SIt)||omn(b,sIt),d&&(m&&v||y||k))||l.k==(uSn(),Iut)&&b.k==Cut||b.k==(uSn(),Iut)&&l.k==Cut)&&(h=n.c[t],c=n.c[e],r=fjn(n.e,h,c,(kUn(),CIt)),o=fjn(n.i,h,c,oIt),TNn(n.f,h,c),s=Nsn(n.b,h,c)+BB(r.a,19).a+BB(o.a,19).a+n.f.d,u=Nsn(n.b,c,h)+BB(r.b,19).a+BB(o.b,19).a+n.f.b,n.a&&(f=BB(mMn(h,dlt),11),a=BB(mMn(c,dlt),11),s+=BB((i=qyn(n.g,f,a)).a,19).a,u+=BB(i.b,19).a),s>u)}function NGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(i=BB(mMn(n,(HXn(),ept)),98),u=n.f,a=n.d,o=u.a+a.b+a.c,s=0-a.d-n.c.b,f=u.b+a.d+a.a-n.c.b,h=new Np,l=new Np,c=new Wb(t);c.a<c.c.c.length;){switch(r=BB(n0(c),10),i.g){case 1:case 2:case 3:_Nn(r);break;case 4:w=(b=BB(mMn(r,npt),8))?b.a:0,r.n.a=o*Gy(MD(mMn(r,(hWn(),Tlt))))-w,Jan(r,!0,!1);break;case 5:g=(d=BB(mMn(r,npt),8))?d.a:0,r.n.a=Gy(MD(mMn(r,(hWn(),Tlt))))-g,Jan(r,!0,!1),u.a=e.Math.max(u.a,r.n.a+r.o.a/2)}switch(BB(mMn(r,(hWn(),Qft)),61).g){case 1:r.n.b=s,h.c[h.c.length]=r;break;case 3:r.n.b=f,l.c[l.c.length]=r}}switch(i.g){case 1:case 2:Rfn(h,n),Rfn(l,n);break;case 3:Kfn(h,n),Kfn(l,n)}}function xGn(n,t){var e,i,r,c,a,u,o,s,h,f;for(h=new Np,f=new Lp,c=null,r=0,i=0;i<t.length;++i)switch(Rsn(c,e=t[i])&&(r=Cdn(n,f,h,Kmt,r)),Lx(e,(hWn(),rlt))&&(c=BB(mMn(e,rlt),10)),e.k.g){case 0:for(o=qA(KB(abn(e,(kUn(),sIt)),new xc));Zin(o);)a=BB(P7(o),11),n.d[a.p]=r++,h.c[h.c.length]=a;for(r=Cdn(n,f,h,Kmt,r),s=qA(KB(abn(e,SIt),new xc));Zin(s);)a=BB(P7(s),11),n.d[a.p]=r++,h.c[h.c.length]=a;break;case 3:abn(e,Rmt).dc()||(a=BB(abn(e,Rmt).Xb(0),11),n.d[a.p]=r++,h.c[h.c.length]=a),abn(e,Kmt).dc()||d3(f,e);break;case 1:for(u=abn(e,(kUn(),CIt)).Kc();u.Ob();)a=BB(u.Pb(),11),n.d[a.p]=r++,h.c[h.c.length]=a;abn(e,oIt).Jc(new ZP(f,e))}return Cdn(n,f,h,Kmt,r),h}function DGn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(h=RQn,f=RQn,o=KQn,s=KQn,b=new Wb(t.i);b.a<b.c.c.length;)l=BB(n0(b),65),SA(c=BB(BB(RX(n.g,l.a),46).b,33),l.b.c,l.b.d),h=e.Math.min(h,c.i),f=e.Math.min(f,c.j),o=e.Math.max(o,c.i+c.g),s=e.Math.max(s,c.j+c.f);for(w=BB(ZAn(n.c,(MMn(),bTt)),116),KUn(n.c,o-h+(w.b+w.c),s-f+(w.d+w.a),!0,!0),lMn(n.c,-h+w.b,-f+w.d),r=new AL(iQ(n.c));r.e!=r.i.gc();)u=cDn(i=BB(kpn(r),79),!0,!0),d=PMn(i),p=OMn(i),g=new xC(d.i+d.g/2,d.j+d.f/2),a=new xC(p.i+p.g/2,p.j+p.f/2),Ukn(v=XR(new xC(a.a,a.b),g),d.g,d.f),UR(g,v),Ukn(m=XR(new xC(g.a,g.b),a),p.g,p.f),UR(a,m),CA(u,g.a,g.b),PA(u,a.a,a.b)}function RGn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b;if(n.c=n.d,l=null==(b=TD(mMn(t,(HXn(),dpt))))||(kW(b),b),c=BB(mMn(t,(hWn(),Zft)),21).Hc((bDn(),lft)),e=!((r=BB(mMn(t,ept),98))==(QEn(),UCt)||r==WCt||r==XCt),!l||!e&&c)f=new Jy(Pun(Gk(jut,1),JZn,37,0,[t]));else{for(h=new Wb(t.a);h.a<h.c.c.length;)BB(n0(h),10).p=0;for(f=new Np,s=new Wb(t.a);s.a<s.c.c.length;)if(i=L_n(n,BB(n0(s),10),null)){for(qan(o=new min,t),hon(o,Xft,BB(i.b,21)),kQ(o.d,t.d),hon(o,Hgt,null),u=BB(i.a,15).Kc();u.Ob();)a=BB(u.Pb(),10),WB(o.a,a),a.a=o;f.Fc(o)}c&&(GI(mMn(t,Cdt))===GI((Bfn(),lut))?n.c=n.b:n.c=n.a)}return GI(mMn(t,Cdt))!==GI((Bfn(),wut))&&(SQ(),f.ad(new xt)),f}function KGn(n){NM(n,new MTn(mj(dj(vj(wj(pj(gj(new du,Q3n),"ELK Mr. Tree"),"Tree-based algorithm provided by the Eclipse Layout Kernel. Computes a spanning tree of the input graph and arranges all nodes according to the resulting parent-children hierarchy. I pity the fool who doesn't use Mr. Tree Layout."),new Na),Y3n),nbn((hAn(),JOt))))),u2(n,Q3n,QJn,Okt),u2(n,Q3n,vZn,20),u2(n,Q3n,VJn,dZn),u2(n,Q3n,pZn,iln(1)),u2(n,Q3n,kZn,(hN(),!0)),u2(n,Q3n,X2n,mpn(Ekt)),u2(n,Q3n,PZn,mpn(Mkt)),u2(n,Q3n,BZn,mpn(Skt)),u2(n,Q3n,SZn,mpn(Pkt)),u2(n,Q3n,CZn,mpn(Tkt)),u2(n,Q3n,MZn,mpn(Ckt)),u2(n,Q3n,IZn,mpn(Akt)),u2(n,Q3n,X3n,mpn(Dkt)),u2(n,Q3n,W3n,mpn(Lkt))}function _Gn(n){n.q||(n.q=!0,n.p=kan(n,0),n.a=kan(n,1),Krn(n.a,0),n.f=kan(n,2),Krn(n.f,1),Rrn(n.f,2),n.n=kan(n,3),Rrn(n.n,3),Rrn(n.n,4),Rrn(n.n,5),Rrn(n.n,6),n.g=kan(n,4),Krn(n.g,7),Rrn(n.g,8),n.c=kan(n,5),Krn(n.c,7),Krn(n.c,8),n.i=kan(n,6),Krn(n.i,9),Krn(n.i,10),Krn(n.i,11),Krn(n.i,12),Rrn(n.i,13),n.j=kan(n,7),Krn(n.j,9),n.d=kan(n,8),Krn(n.d,3),Krn(n.d,4),Krn(n.d,5),Krn(n.d,6),Rrn(n.d,7),Rrn(n.d,8),Rrn(n.d,9),Rrn(n.d,10),n.b=kan(n,9),Rrn(n.b,0),Rrn(n.b,1),n.e=kan(n,10),Rrn(n.e,1),Rrn(n.e,2),Rrn(n.e,3),Rrn(n.e,4),Krn(n.e,5),Krn(n.e,6),Krn(n.e,7),Krn(n.e,8),Krn(n.e,9),Krn(n.e,10),Rrn(n.e,11),n.k=kan(n,11),Rrn(n.k,0),Rrn(n.k,1),n.o=jan(n,12),n.s=jan(n,13))}function FGn(n,t){t.dc()&&eH(n.j,!0,!0,!0,!0),Nfn(t,(kUn(),dIt))&&eH(n.j,!0,!0,!0,!1),Nfn(t,hIt)&&eH(n.j,!1,!0,!0,!0),Nfn(t,EIt)&&eH(n.j,!0,!0,!1,!0),Nfn(t,MIt)&&eH(n.j,!0,!1,!0,!0),Nfn(t,gIt)&&eH(n.j,!1,!0,!0,!1),Nfn(t,fIt)&&eH(n.j,!1,!0,!1,!0),Nfn(t,TIt)&&eH(n.j,!0,!1,!1,!0),Nfn(t,jIt)&&eH(n.j,!0,!1,!0,!1),Nfn(t,yIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,bIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,yIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,lIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,kIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,mIt)&&eH(n.j,!0,!0,!0,!0),Nfn(t,vIt)&&eH(n.j,!0,!0,!0,!0)}function BGn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g;for(c=new Np,s=new Wb(i);s.a<s.c.c.length;)if(a=null,(u=BB(n0(s),441)).f==(ain(),qvt))for(w=new Wb(u.e);w.a<w.c.c.length;)vW(g=(b=BB(n0(w),17)).d.i)==t?Stn(n,t,u,b,u.b,b.d):!e||wan(g,e)?GMn(n,t,u,i,b):((l=LHn(n,t,e,b,u.b,qvt,a))!=a&&(c.c[c.c.length]=l),l.c&&(a=l));else for(f=new Wb(u.e);f.a<f.c.c.length;)if(vW(d=(h=BB(n0(f),17)).c.i)==t)Stn(n,t,u,h,h.c,u.b);else{if(!e||wan(d,e))continue;(l=LHn(n,t,e,h,u.b,Hvt,a))!=a&&(c.c[c.c.length]=l),l.c&&(a=l)}for(o=new Wb(c);o.a<o.c.c.length;)u=BB(n0(o),441),-1!=E7(t.a,u.a,0)||WB(t.a,u.a),u.c&&(r.c[r.c.length]=u)}function HGn(n,t,e){var i,r,c,a,u,o,s,h;for(o=new Np,u=new Wb(t.a);u.a<u.c.c.length;)for(h=abn(BB(n0(u),10),(kUn(),oIt)).Kc();h.Ob();)for(r=new Wb(BB(h.Pb(),11).g);r.a<r.c.c.length;)!b5(i=BB(n0(r),17))&&i.c.i.c==i.d.i.c||b5(i)||i.d.i.c!=e||(o.c[o.c.length]=i);for(a=ean(e.a).Kc();a.Ob();)for(h=abn(BB(a.Pb(),10),(kUn(),CIt)).Kc();h.Ob();)for(r=new Wb(BB(h.Pb(),11).e);r.a<r.c.c.length;)if((b5(i=BB(n0(r),17))||i.c.i.c!=i.d.i.c)&&!b5(i)&&i.c.i.c==t){for(Px((s=new M2(o,o.c.length)).b>0),c=BB(s.a.Xb(s.c=--s.b),17);c!=i&&s.b>0;)n.a[c.p]=!0,n.a[i.p]=!0,Px(s.b>0),c=BB(s.a.Xb(s.c=--s.b),17);s.b>0&&fW(s)}}function qGn(n,t,e){var i,r,c,a,u,o,s,h,f;if(n.a!=t.Aj())throw Hp(new _y(d6n+t.ne()+g6n));if(i=Cfn((IPn(),Z$t),t).$k())return i.Aj().Nh().Ih(i,e);if(a=Cfn(Z$t,t).al()){if(null==e)return null;if((u=BB(e,15)).dc())return"";for(f=new Sk,c=u.Kc();c.Ob();)r=c.Pb(),cO(f,a.Aj().Nh().Ih(a,r)),f.a+=" ";return KO(f,f.a.length-1)}if(!(h=Cfn(Z$t,t).bl()).dc()){for(s=h.Kc();s.Ob();)if((o=BB(s.Pb(),148)).wj(e))try{if(null!=(f=o.Aj().Nh().Ih(o,e)))return f}catch(l){if(!cL(l=lun(l),102))throw Hp(l)}throw Hp(new _y("Invalid value: '"+e+"' for datatype :"+t.ne()))}return BB(t,834).Fj(),null==e?null:cL(e,172)?""+BB(e,172).a:tsn(e)==mtt?H$(IOt[0],BB(e,199)):Bbn(e)}function GGn(n){var t,i,r,c,a,u,o,s,h;for(s=new YT,u=new YT,c=new Wb(n);c.a<c.c.c.length;)(i=BB(n0(c),128)).v=0,i.n=i.i.c.length,i.u=i.t.c.length,0==i.n&&r5(s,i,s.c.b,s.c),0==i.u&&0==i.r.a.gc()&&r5(u,i,u.c.b,u.c);for(a=-1;0!=s.b;)for(t=new Wb((i=BB(tkn(s,0),128)).t);t.a<t.c.c.length;)(h=BB(n0(t),268).b).v=e.Math.max(h.v,i.v+1),a=e.Math.max(a,h.v),--h.n,0==h.n&&r5(s,h,s.c.b,s.c);if(a>-1){for(r=spn(u,0);r.b!=r.d.c;)(i=BB(b3(r),128)).v=a;for(;0!=u.b;)for(t=new Wb((i=BB(tkn(u,0),128)).i);t.a<t.c.c.length;)0==(o=BB(n0(t),268).a).r.a.gc()&&(o.v=e.Math.min(o.v,i.v-1),--o.u,0==o.u&&r5(u,o,u.c.b,u.c))}}function zGn(n,t,i,r,c){var a,u,o,s;return s=RQn,u=!1,a=!!(o=zBn(n,XR(new xC(t.a,t.b),n),UR(new xC(i.a,i.b),c),XR(new xC(r.a,r.b),i)))&&!(e.Math.abs(o.a-n.a)<=s5n&&e.Math.abs(o.b-n.b)<=s5n||e.Math.abs(o.a-t.a)<=s5n&&e.Math.abs(o.b-t.b)<=s5n),(o=zBn(n,XR(new xC(t.a,t.b),n),i,c))&&((e.Math.abs(o.a-n.a)<=s5n&&e.Math.abs(o.b-n.b)<=s5n)==(e.Math.abs(o.a-t.a)<=s5n&&e.Math.abs(o.b-t.b)<=s5n)||a?s=e.Math.min(s,lW(XR(o,i))):u=!0),(o=zBn(n,XR(new xC(t.a,t.b),n),r,c))&&(u||(e.Math.abs(o.a-n.a)<=s5n&&e.Math.abs(o.b-n.b)<=s5n)==(e.Math.abs(o.a-t.a)<=s5n&&e.Math.abs(o.b-t.b)<=s5n)||a)&&(s=e.Math.min(s,lW(XR(o,r)))),s}function UGn(n){NM(n,new MTn(dj(vj(wj(pj(gj(new du,_Zn),FZn),"Minimizes the stress within a layout using stress majorization. Stress exists if the euclidean distance between a pair of nodes doesn't match their graph theoretic distance, that is, the shortest path between the two nodes. The method allows to specify individual edge lengths."),new gt),gZn))),u2(n,_Zn,jZn,mpn(kat)),u2(n,_Zn,TZn,(hN(),!0)),u2(n,_Zn,PZn,mpn(Tat)),u2(n,_Zn,BZn,mpn(Mat)),u2(n,_Zn,SZn,mpn(Sat)),u2(n,_Zn,CZn,mpn(Eat)),u2(n,_Zn,MZn,mpn(Pat)),u2(n,_Zn,IZn,mpn(Cat)),u2(n,_Zn,NZn,mpn(yat)),u2(n,_Zn,DZn,mpn(vat)),u2(n,_Zn,RZn,mpn(mat)),u2(n,_Zn,KZn,mpn(jat)),u2(n,_Zn,xZn,mpn(pat))}function XGn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(OTn(t,"Interactive crossing minimization",1),a=0,c=new Wb(n.b);c.a<c.c.c.length;)(i=BB(n0(c),29)).p=a++;for(d=new Rj((l=qEn(n)).length),CHn(new Jy(Pun(Gk(jst,1),HWn,225,0,[d])),l),w=0,a=0,r=new Wb(n.b);r.a<r.c.c.length;){for(e=0,f=0,h=new Wb((i=BB(n0(r),29)).a);h.a<h.c.c.length;)for((o=BB(n0(h),10)).n.a>0&&(e+=o.n.a+o.o.a/2,++f),b=new Wb(o.j);b.a<b.c.c.length;)BB(n0(b),11).p=w++;for(f>0&&(e/=f),g=x8(xNt,qQn,25,i.a.c.length,15,1),u=0,s=new Wb(i.a);s.a<s.c.c.length;)(o=BB(n0(s),10)).p=u++,g[o.p]=MGn(o,e),o.k==(uSn(),Put)&&hon(o,(hWn(),plt),g[o.p]);SQ(),m$(i.a,new Gd(g)),r_n(d,l,a,!0),++a}HSn(t)}function WGn(n,t){var e,i,r,c,a,u,o,s,h;if(5!=t.e){if(null!=(s=t).b&&null!=n.b){for(T$n(n),qHn(n),T$n(s),qHn(s),e=x8(ANt,hQn,25,n.b.length+s.b.length,15,1),h=0,i=0,a=0;i<n.b.length&&a<s.b.length;)if(r=n.b[i],c=n.b[i+1],u=s.b[a],o=s.b[a+1],c<u)e[h++]=n.b[i++],e[h++]=n.b[i++];else if(c>=u&&r<=o)u<=r&&c<=o?i+=2:u<=r?(n.b[i]=o+1,a+=2):c<=o?(e[h++]=r,e[h++]=u-1,i+=2):(e[h++]=r,e[h++]=u-1,n.b[i]=o+1,a+=2);else{if(!(o<r))throw Hp(new dy("Token#subtractRanges(): Internal Error: ["+n.b[i]+","+n.b[i+1]+"] - ["+s.b[a]+","+s.b[a+1]+"]"));a+=2}for(;i<n.b.length;)e[h++]=n.b[i++],e[h++]=n.b[i++];n.b=x8(ANt,hQn,25,h,15,1),aHn(e,0,n.b,0,h)}}else kGn(n,t)}function VGn(n){var t,e,i,r,c,a,u;if(!n.A.dc()){if(n.A.Hc((mdn(),KIt))&&(BB(oV(n.b,(kUn(),sIt)),124).k=!0,BB(oV(n.b,SIt),124).k=!0,t=n.q!=(QEn(),WCt)&&n.q!=XCt,Nl(BB(oV(n.b,oIt),124),t),Nl(BB(oV(n.b,CIt),124),t),Nl(n.g,t),n.A.Hc(_It)&&(BB(oV(n.b,sIt),124).j=!0,BB(oV(n.b,SIt),124).j=!0,BB(oV(n.b,oIt),124).k=!0,BB(oV(n.b,CIt),124).k=!0,n.g.k=!0)),n.A.Hc(RIt))for(n.a.j=!0,n.a.k=!0,n.g.j=!0,n.g.k=!0,u=n.B.Hc((n_n(),XIt)),c=0,a=(r=tpn()).length;c<a;++c)i=r[c],(e=BB(oV(n.i,i),306))&&(agn(i)?(e.j=!0,e.k=!0):(e.j=!u,e.k=!u));n.A.Hc(DIt)&&n.B.Hc((n_n(),UIt))&&(n.g.j=!0,n.g.j=!0,n.a.j||(n.a.j=!0,n.a.k=!0,n.a.e=!0))}}function QGn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d;for(e=new Wb(n.e.b);e.a<e.c.c.length;)for(r=new Wb(BB(n0(e),29).a);r.a<r.c.c.length;)if(i=BB(n0(r),10),o=(f=n.i[i.p]).a.e,u=f.d.e,i.n.b=o,d=u-o-i.o.b,t=AHn(i),bvn(),h=(i.q?i.q:(SQ(),SQ(),het))._b((HXn(),Rgt))?BB(mMn(i,Rgt),197):BB(mMn(vW(i),Kgt),197),t&&(h==fvt||h==hvt)&&(i.o.b+=d),t&&(h==bvt||h==fvt||h==hvt)){for(b=new Wb(i.j);b.a<b.c.c.length;)l=BB(n0(b),11),(kUn(),bIt).Hc(l.j)&&(s=BB(RX(n.k,l),121),l.n.b=s.e-o);for(a=new Wb(i.b);a.a<a.c.c.length;)c=BB(n0(a),70),(w=BB(mMn(i,$gt),21)).Hc((n$n(),NCt))?c.n.b+=d:w.Hc(xCt)&&(c.n.b+=d/2);(h==fvt||h==hvt)&&abn(i,(kUn(),SIt)).Jc(new ag(d))}}function YGn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;if(!n.b)return!1;for(a=null,l=null,r=1,(o=new H8(null,null)).a[1]=n.b,f=o;f.a[r];)s=r,u=l,l=f,f=f.a[r],r=(i=n.a.ue(t,f.d))<0?0:1,0==i&&(!e.c||cV(f.e,e.d))&&(a=f),f&&f.b||Vy(f.a[r])||(Vy(f.a[1-r])?l=l.a[s]=wrn(f,r):Vy(f.a[1-r])||(b=l.a[1-s])&&(Vy(b.a[1-s])||Vy(b.a[s])?(c=u.a[1]==l?1:0,Vy(b.a[s])?u.a[c]=r2(l,s):Vy(b.a[1-s])&&(u.a[c]=wrn(l,s)),f.b=u.a[c].b=!0,u.a[c].a[0].b=!1,u.a[c].a[1].b=!1):(l.b=!1,b.b=!0,f.b=!0)));return a&&(e.b=!0,e.d=a.e,f!=a&&(bMn(n,o,a,h=new H8(f.d,f.e)),l==a&&(l=h)),l.a[l.a[1]==f?1:0]=f.a[f.a[0]?0:1],--n.c),n.b=o.a[1],n.b&&(n.b.b=!1),e.b}function JGn(n){var t,i,r,c,a,u,o,s,h,f,l,b;for(c=new Wb(n.a.a.b);c.a<c.c.c.length;)for(s=(r=BB(n0(c),57)).c.Kc();s.Ob();)o=BB(s.Pb(),57),r.a!=o.a&&(l=dA(n.a.d)?n.a.g.Oe(r,o):n.a.g.Pe(r,o),a=r.b.a+r.d.b+l-o.b.a,a=e.Math.ceil(a),a=e.Math.max(0,a),Z7(r,o)?(u=AN(new qv,n.d),t=(h=CJ(e.Math.ceil(o.b.a-r.b.a)))-(o.b.a-r.b.a),i=r,(f=f3(r).a)||(f=f3(o).a,t=-t,i=o),f&&(i.b.a-=t,f.n.a-=t),UNn(aM(cM(uM(rM(new Hv,e.Math.max(0,h)),1),u),n.c[r.a.d])),UNn(aM(cM(uM(rM(new Hv,e.Math.max(0,-h)),1),u),n.c[o.a.d]))):(b=1,(cL(r.g,145)&&cL(o.g,10)||cL(o.g,145)&&cL(r.g,10))&&(b=2),UNn(aM(cM(uM(rM(new Hv,CJ(a)),b),n.c[r.a.d]),n.c[o.a.d]))))}function ZGn(n,t,i){var r,c,a,u,o,s,h,f,l,b;if(i)for(r=-1,f=new M2(t,0);f.b<f.d.gc();){if(Px(f.b<f.d.gc()),o=BB(f.d.Xb(f.c=f.b++),10),null==(l=n.c[o.c.p][o.p].a)){for(u=r+1,a=new M2(t,f.b);a.b<a.d.gc();)if(null!=(b=wL(n,(Px(a.b<a.d.gc()),BB(a.d.Xb(a.c=a.b++),10))).a)){kW(b),u=b;break}l=(r+u)/2,n.c[o.c.p][o.p].a=l,n.c[o.c.p][o.p].d=(kW(l),l),n.c[o.c.p][o.p].b=1}kW(l),r=l}else{for(c=0,h=new Wb(t);h.a<h.c.c.length;)o=BB(n0(h),10),null!=n.c[o.c.p][o.p].a&&(c=e.Math.max(c,Gy(n.c[o.c.p][o.p].a)));for(c+=2,s=new Wb(t);s.a<s.c.c.length;)o=BB(n0(s),10),null==n.c[o.c.p][o.p].a&&(l=H$n(n.i,24)*uYn*c-1,n.c[o.c.p][o.p].a=l,n.c[o.c.p][o.p].d=l,n.c[o.c.p][o.p].b=1)}}function nzn(){RO(BAt,new ts),RO(KAt,new ls),RO(qAt,new Es),RO(HAt,new Is),RO(GAt,new Os),RO(XAt,new As),RO(WAt,new $s),RO(HOt,new Ls),RO(BOt,new zo),RO(qOt,new Uo),RO(LOt,new Xo),RO(QAt,new Wo),RO(GOt,new Vo),RO(YAt,new Qo),RO(JAt,new Yo),RO(FAt,new Jo),RO(_At,new Zo),RO(X$t,new ns),RO(VAt,new es),RO(O$t,new is),RO(ktt,new rs),RO(Gk(NNt,1),new cs),RO(Ttt,new as),RO(Stt,new us),RO(mtt,new os),RO(_Nt,new ss),RO(Ptt,new hs),RO(uAt,new fs),RO(yAt,new bs),RO(oLt,new ws),RO($$t,new ds),RO(Ctt,new gs),RO(Att,new ps),RO($nt,new vs),RO(Rtt,new ms),RO(Nnt,new ys),RO(iLt,new ks),RO(FNt,new js),RO(_tt,new Ts),RO(Qtt,new Ms),RO(sAt,new Ss),RO(BNt,new Ps)}function tzn(n,t,e){var i,r,c,a,u,o,s,h,f;for(!e&&(e=Gun(t.q.getTimezoneOffset())),r=6e4*(t.q.getTimezoneOffset()-e.a),o=u=new PD(rbn(fan(t.q.getTime()),r)),u.q.getTimezoneOffset()!=t.q.getTimezoneOffset()&&(r>0?r-=864e5:r+=864e5,o=new PD(rbn(fan(t.q.getTime()),r))),h=new Ik,s=n.a.length,c=0;c<s;)if((i=fV(n.a,c))>=97&&i<=122||i>=65&&i<=90){for(a=c+1;a<s&&fV(n.a,a)==i;++a);aWn(h,i,a-c,u,o,e),c=a}else if(39==i){if(++c<s&&39==fV(n.a,c)){h.a+="'",++c;continue}for(f=!1;!f;){for(a=c;a<s&&39!=fV(n.a,a);)++a;if(a>=s)throw Hp(new _y("Missing trailing '"));a+1<s&&39==fV(n.a,a+1)?++a:f=!0,oO(h,fx(n.a,c,a)),c=a+1}}else h.a+=String.fromCharCode(i),++c;return h.a}function ezn(n){var t,e,i,r,c,a,u,o;for(t=null,i=new Wb(n);i.a<i.c.c.length;)Gy(lL((e=BB(n0(i),233)).g,e.d[0]).a),e.b=null,e.e&&e.e.gc()>0&&0==e.c&&(!t&&(t=new Np),t.c[t.c.length]=e);if(t)for(;0!=t.c.length;){if((e=BB(s6(t,0),233)).b&&e.b.c.length>0)for(!e.b&&(e.b=new Np),c=new Wb(e.b);c.a<c.c.c.length;)if(zy(lL((r=BB(n0(c),233)).g,r.d[0]).a)==zy(lL(e.g,e.d[0]).a)){if(E7(n,r,0)>E7(n,e,0))return new rI(r,e)}else if(Gy(lL(r.g,r.d[0]).a)>Gy(lL(e.g,e.d[0]).a))return new rI(r,e);for(u=(!e.e&&(e.e=new Np),e.e).Kc();u.Ob();)!(a=BB(u.Pb(),233)).b&&(a.b=new Np),LZ(0,(o=a.b).c.length),MS(o.c,0,e),a.c==o.c.length&&(t.c[t.c.length]=a)}return null}function izn(n,t){var e,i,r,c,a,u;if(null==n)return zWn;if(null!=t.a.zc(n,t))return"[...]";for(e=new $an(FWn,"[","]"),c=0,a=(r=n).length;c<a;++c)null!=(i=r[c])&&0!=(4&tsn(i).i)?!Array.isArray(i)||(u=vnn(i))>=14&&u<=16?cL(i,177)?b6(e,RCn(BB(i,177))):cL(i,190)?b6(e,JEn(BB(i,190))):cL(i,195)?b6(e,kSn(BB(i,195))):cL(i,2012)?b6(e,ZEn(BB(i,2012))):cL(i,48)?b6(e,DCn(BB(i,48))):cL(i,364)?b6(e,gIn(BB(i,364))):cL(i,832)?b6(e,xCn(BB(i,832))):cL(i,104)&&b6(e,NCn(BB(i,104))):t.a._b(i)?(e.a?oO(e.a,e.b):e.a=new lN(e.d),aO(e.a,"[...]")):b6(e,izn(een(i),new $q(t))):b6(e,null==i?zWn:Bbn(i));return e.a?0==e.e.length?e.a.a:e.a.a+""+e.e:e.c}function rzn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g;for(w=qSn(cDn(t,!1,!1)),r&&(w=Jon(w)),g=Gy(MD(ZAn(t,(Epn(),pct)))),Px(0!=w.b),b=BB(w.a.a.c,8),h=BB(Dpn(w,1),8),w.b>2?(gun(s=new Np,new s1(w,1,w.b)),qan(d=new EAn(XXn(s,g+n.a)),t),i.c[i.c.length]=d):d=BB(RX(n.b,r?PMn(t):OMn(t)),266),u=PMn(t),r&&(u=OMn(t)),a=iPn(b,u),o=g+n.a,a.a?(o+=e.Math.abs(b.b-h.b),l=new xC(h.a,(h.b+b.b)/2)):(o+=e.Math.abs(b.a-h.a),l=new xC((h.a+b.a)/2,h.b)),VW(r?n.d:n.c,t,new Imn(d,a,l,o)),VW(n.b,t,d),!t.n&&(t.n=new eU(zOt,t,1,7)),f=new AL(t.n);f.e!=f.i.gc();)c=JRn(n,BB(kpn(f),137),!0,0,0),i.c[i.c.length]=c}function czn(n){var t,i,r,c,a,u,o,s,h;for(s=new Np,u=new Np,a=new Wb(n);a.a<a.c.c.length;)Vl(r=BB(n0(a),112),r.f.c.length),Ql(r,r.k.c.length),0==r.d&&(s.c[s.c.length]=r),0==r.i&&0==r.e.b&&(u.c[u.c.length]=r);for(i=-1;0!=s.c.length;)for(t=new Wb((r=BB(s6(s,0),112)).k);t.a<t.c.c.length;)Yl(h=BB(n0(t),129).b,e.Math.max(h.o,r.o+1)),i=e.Math.max(i,h.o),Vl(h,h.d-1),0==h.d&&(s.c[s.c.length]=h);if(i>-1){for(c=new Wb(u);c.a<c.c.c.length;)(r=BB(n0(c),112)).o=i;for(;0!=u.c.length;)for(t=new Wb((r=BB(s6(u,0),112)).f);t.a<t.c.c.length;)(o=BB(n0(t),129).a).e.b>0||(Yl(o,e.Math.min(o.o,r.o-1)),Ql(o,o.i-1),0==o.i&&(u.c[u.c.length]=o))}}function azn(n,t,e){var i,r,c,a,u;if(u=n.c,!t&&(t=L$t),n.c=t,0!=(4&n.Db)&&0==(1&n.Db)&&(a=new nU(n,1,2,u,n.c),e?e.Ei(a):e=a),u!=t)if(cL(n.Cb,284))n.Db>>16==-10?e=BB(n.Cb,284).nk(t,e):n.Db>>16==-15&&(!t&&(gWn(),t=l$t),!u&&(gWn(),u=l$t),n.Cb.nh()&&(a=new N7(n.Cb,1,13,u,t,uvn(H7(BB(n.Cb,59)),n),!1),e?e.Ei(a):e=a));else if(cL(n.Cb,88))n.Db>>16==-23&&(cL(t,88)||(gWn(),t=d$t),cL(u,88)||(gWn(),u=d$t),n.Cb.nh()&&(a=new N7(n.Cb,1,10,u,t,uvn(a4(BB(n.Cb,26)),n),!1),e?e.Ei(a):e=a));else if(cL(n.Cb,444))for(!(c=BB(n.Cb,836)).b&&(c.b=new Tp(new xm)),r=new Mp(new usn(new Pb(c.b.a).a));r.a.b;)e=azn(i=BB(ten(r.a).cd(),87),kLn(i,c),e);return e}function uzn(n,t){var e,i,r,c,a,u,o,s,h,f,l;for(a=qy(TD(ZAn(n,(HXn(),wgt)))),l=BB(ZAn(n,cpt),21),o=!1,s=!1,f=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));!(f.e==f.i.gc()||o&&s);){for(c=BB(kpn(f),118),u=0,r=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!c.d&&(c.d=new hK(_Ot,c,8,5)),c.d),(!c.e&&(c.e=new hK(_Ot,c,7,4)),c.e)])));dAn(r)&&(i=BB(U5(r),79),h=a&&QIn(i)&&qy(TD(ZAn(i,dgt))),e=bqn((!i.b&&(i.b=new hK(KOt,i,4,7)),i.b),c)?n==JJ(PTn(BB(Wtn((!i.c&&(i.c=new hK(KOt,i,5,8)),i.c),0),82))):n==JJ(PTn(BB(Wtn((!i.b&&(i.b=new hK(KOt,i,4,7)),i.b),0),82))),!((h||e)&&++u>1)););(u>0||l.Hc((lIn(),eIt))&&(!c.n&&(c.n=new eU(zOt,c,1,7)),c.n).i>0)&&(o=!0),u>1&&(s=!0)}o&&t.Fc((bDn(),lft)),s&&t.Fc((bDn(),bft))}function ozn(n){var t,i,r,c,a,u,o,s,h,f,l,b;if((b=BB(ZAn(n,(sWn(),KSt)),21)).dc())return null;if(o=0,u=0,b.Hc((mdn(),KIt))){for(f=BB(ZAn(n,uPt),98),r=2,i=2,c=2,a=2,t=JJ(n)?BB(ZAn(JJ(n),bSt),103):BB(ZAn(n,bSt),103),h=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));h.e!=h.i.gc();)if(s=BB(kpn(h),118),(l=BB(ZAn(s,wPt),61))==(kUn(),PIt)&&(l=OFn(s,t),Ypn(s,wPt,l)),f==(QEn(),XCt))switch(l.g){case 1:r=e.Math.max(r,s.i+s.g);break;case 2:i=e.Math.max(i,s.j+s.f);break;case 3:c=e.Math.max(c,s.i+s.g);break;case 4:a=e.Math.max(a,s.j+s.f)}else switch(l.g){case 1:r+=s.g+2;break;case 2:i+=s.f+2;break;case 3:c+=s.g+2;break;case 4:a+=s.f+2}o=e.Math.max(r,c),u=e.Math.max(i,a)}return KUn(n,o,u,!0,!0)}function szn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(m=BB(P4(ytn(AV(new Rq(null,new w1(t.d,16)),new $d(i)),new Ld(i)),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)]))),15),l=DWn,f=_Vn,s=new Wb(t.b.j);s.a<s.c.c.length;)(o=BB(n0(s),11)).j==i&&(l=e.Math.min(l,o.p),f=e.Math.max(f,o.p));if(l==DWn)for(u=0;u<m.gc();u++)g9(BB(m.Xb(u),101),i,u);else for(Zq(y=x8(ANt,hQn,25,c.length,15,1),y.length),v=m.Kc();v.Ob();){for(p=BB(v.Pb(),101),a=BB(RX(n.b,p),177),h=0,g=l;g<=f;g++)a[g]&&(h=e.Math.max(h,r[g]));if(p.i){for(w=p.i.c,k=new Rv,b=0;b<c.length;b++)c[w][b]&&TU(k,iln(y[b]));for(;FT(k,iln(h));)++h}for(g9(p,i,h),d=l;d<=f;d++)a[d]&&(r[d]=h+1);p.i&&(y[p.i.c]=h)}}function hzn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d;for(c=null,r=new Wb(t.a);r.a<r.c.c.length;)AHn(i=BB(n0(r),10))?(h=new GV(i,!0,o=AN(oM(new qv,i),n.f),s=AN(oM(new qv,i),n.f)),f=i.o.b,bvn(),b=1e4,(l=(i.q?i.q:(SQ(),SQ(),het))._b((HXn(),Rgt))?BB(mMn(i,Rgt),197):BB(mMn(vW(i),Kgt),197))==hvt&&(b=1),w=UNn(aM(cM(rM(uM(new Hv,b),CJ(e.Math.ceil(f))),o),s)),l==fvt&&TU(n.d,w),O_n(n,ean(abn(i,(kUn(),CIt))),h),O_n(n,abn(i,oIt),h),a=h):(d=AN(oM(new qv,i),n.f),JT(AV(new Rq(null,new w1(i.j,16)),new Bc),new tC(n,d)),a=new GV(i,!1,d,d)),n.i[i.p]=a,c&&(u=c.c.d.a+K$(n.n,c.c,i)+i.d.d,c.b||(u+=c.c.o.b),UNn(aM(cM(uM(rM(new Hv,CJ(e.Math.ceil(u))),0),c.d),a.a))),c=a}function fzn(n,t){var i,r,c,a,u,o,s,f,l,b,w,d,g;for(OTn(t,"Label dummy insertions",1),b=new Np,u=Gy(MD(mMn(n,(HXn(),jpt)))),f=Gy(MD(mMn(n,Spt))),l=BB(mMn(n,Udt),103),w=new Wb(n.a);w.a<w.c.c.length;)for(a=new oz(ZL(lbn(BB(n0(w),10)).a.Kc(),new h));dAn(a);)if((c=BB(U5(a),17)).c.i!=c.d.i&&tL(c.b,nst)){for(i=oLn(n,c,g=Etn(c),d=sx(c.b.c.length)),b.c[b.c.length]=i,r=i.o,o=new M2(c.b,0);o.b<o.d.gc();)Px(o.b<o.d.gc()),GI(mMn(s=BB(o.d.Xb(o.c=o.b++),70),Ydt))===GI((Rtn(),zPt))&&(l==(Ffn(),HPt)||l==KPt?(r.a+=s.o.a+f,r.b=e.Math.max(r.b,s.o.b)):(r.a=e.Math.max(r.a,s.o.a),r.b+=s.o.b+f),d.c[d.c.length]=s,fW(o));l==(Ffn(),HPt)||l==KPt?(r.a-=f,r.b+=u+g):r.b+=u-f+g}gun(n.a,b),HSn(t)}function lzn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w;for(l=XDn(n,t,a=new dOn(t)),w=e.Math.max(Gy(MD(mMn(t,(HXn(),agt)))),1),f=new Wb(l.a);f.a<f.c.c.length;)h=BB(n0(f),46),s=Bgn(BB(h.a,8),BB(h.b,8),w),zH(i,new xC(s.c,s.d)),zH(i,_x(new xC(s.c,s.d),s.b,0)),zH(i,_x(new xC(s.c,s.d),0,s.a)),zH(i,_x(new xC(s.c,s.d),s.b,s.a));switch(b=a.d,o=Bgn(BB(l.b.a,8),BB(l.b.b,8),w),b==(kUn(),CIt)||b==oIt?(r.c[b.g]=e.Math.min(r.c[b.g],o.d),r.b[b.g]=e.Math.max(r.b[b.g],o.d+o.a)):(r.c[b.g]=e.Math.min(r.c[b.g],o.c),r.b[b.g]=e.Math.max(r.b[b.g],o.c+o.b)),c=KQn,u=a.c.i.d,b.g){case 4:c=u.c;break;case 2:c=u.b;break;case 1:c=u.a;break;case 3:c=u.d}return r.a[b.g]=e.Math.max(r.a[b.g],c),a}function bzn(n){var t,e,i,r;if(-1!=(t=GO(e=null!=n.D?n.D:n.B,YTn(91)))){i=e.substr(0,t),r=new Sk;do{r.a+="["}while(-1!=(t=lx(e,91,++t)));mK(i,$Wn)?r.a+="Z":mK(i,S9n)?r.a+="B":mK(i,P9n)?r.a+="C":mK(i,C9n)?r.a+="D":mK(i,I9n)?r.a+="F":mK(i,O9n)?r.a+="I":mK(i,A9n)?r.a+="J":mK(i,$9n)?r.a+="S":(r.a+="L",r.a+=""+i,r.a+=";");try{return null}catch(c){if(!cL(c=lun(c),60))throw Hp(c)}}else if(-1==GO(e,YTn(46))){if(mK(e,$Wn))return $Nt;if(mK(e,S9n))return NNt;if(mK(e,P9n))return ONt;if(mK(e,C9n))return xNt;if(mK(e,I9n))return DNt;if(mK(e,O9n))return ANt;if(mK(e,A9n))return LNt;if(mK(e,$9n))return RNt}return null}function wzn(n,t,e){var i,r,c,a,u,o,s,h;for(qan(s=new $vn(e),t),hon(s,(hWn(),dlt),t),s.o.a=t.g,s.o.b=t.f,s.n.a=t.i,s.n.b=t.j,WB(e.a,s),VW(n.a,t,s),(0!=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i||qy(TD(ZAn(t,(HXn(),wgt)))))&&hon(s,_ft,(hN(),!0)),o=BB(mMn(e,Zft),21),(h=BB(mMn(s,(HXn(),ept)),98))==(QEn(),YCt)?hon(s,ept,QCt):h!=QCt&&o.Fc((bDn(),dft)),i=BB(mMn(e,Udt),103),u=new AL((!t.c&&(t.c=new eU(XOt,t,9,9)),t.c));u.e!=u.i.gc();)qy(TD(ZAn(a=BB(kpn(u),118),Ggt)))||Zzn(n,a,s,o,i,h);for(c=new AL((!t.n&&(t.n=new eU(zOt,t,1,7)),t.n));c.e!=c.i.gc();)!qy(TD(ZAn(r=BB(kpn(c),137),Ggt)))&&r.a&&WB(s.b,Hhn(r));return qy(TD(mMn(s,Tdt)))&&o.Fc((bDn(),hft)),qy(TD(mMn(s,bgt)))&&(o.Fc((bDn(),wft)),o.Fc(bft),hon(s,ept,QCt)),s}function dzn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;u=BB(RX(t.c,n),459),g=t.a.c,o=t.a.c+t.a.b,a=(E=u.f)<(T=u.a),b=new xC(g,E),p=new xC(o,T),w=new xC(r=(g+o)/2,E),v=new xC(r,T),c=eNn(n,E,T),y=g1(t.B),k=new xC(r,c),j=g1(t.D),e=lon(Pun(Gk(PMt,1),sVn,8,0,[y,k,j])),f=!1,(d=t.B.i)&&d.c&&u.d&&((s=a&&d.p<d.c.a.c.length-1||!a&&d.p>0)?s&&(h=d.p,a?++h:--h,f=!(cNn(i=ion(BB(xq(d.c.a,h),10)),y,e[0])||Bz(i,y,e[0]))):f=!0),l=!1,(m=t.D.i)&&m.c&&u.e&&(a&&m.p>0||!a&&m.p<m.c.a.c.length-1?(h=m.p,a?--h:++h,l=!(cNn(i=ion(BB(xq(m.c.a,h),10)),e[0],j)||Bz(i,e[0],j))):l=!0),f&&l&&DH(n.a,k),f||nin(n.a,Pun(Gk(PMt,1),sVn,8,0,[b,w])),l||nin(n.a,Pun(Gk(PMt,1),sVn,8,0,[v,p]))}function gzn(n,t){var e,i,r,c,a,u,o;if(cL(n.Ug(),160)?(gzn(BB(n.Ug(),160),t),t.a+=" > "):t.a+="Root ",mK((e=n.Tg().zb).substr(0,3),"Elk")?oO(t,e.substr(3)):t.a+=""+e,r=n.zg())oO((t.a+=" ",t),r);else if(cL(n,354)&&(o=BB(n,137).a))oO((t.a+=" ",t),o);else{for(c=new AL(n.Ag());c.e!=c.i.gc();)if(o=BB(kpn(c),137).a)return void oO((t.a+=" ",t),o);if(cL(n,352)&&(!(i=BB(n,79)).b&&(i.b=new hK(KOt,i,4,7)),0!=i.b.i&&(!i.c&&(i.c=new hK(KOt,i,5,8)),0!=i.c.i))){for(t.a+=" (",a=new cx((!i.b&&(i.b=new hK(KOt,i,4,7)),i.b));a.e!=a.i.gc();)a.e>0&&(t.a+=FWn),gzn(BB(kpn(a),160),t);for(t.a+=e1n,u=new cx((!i.c&&(i.c=new hK(KOt,i,5,8)),i.c));u.e!=u.i.gc();)u.e>0&&(t.a+=FWn),gzn(BB(kpn(u),160),t);t.a+=")"}}}function pzn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;if(c=BB(mMn(n,(hWn(),dlt)),79)){for(i=n.a,UR(r=new wA(e),$jn(n)),wan(n.d.i,n.c.i)?(l=n.c,XR(f=Aon(Pun(Gk(PMt,1),sVn,8,0,[l.n,l.a])),e)):f=g1(n.c),r5(i,f,i.a,i.a.a),b=g1(n.d),null!=mMn(n,Rlt)&&UR(b,BB(mMn(n,Rlt),8)),r5(i,b,i.c.b,i.c),Ztn(i,r),Lin(a=cDn(c,!0,!0),BB(Wtn((!c.b&&(c.b=new hK(KOt,c,4,7)),c.b),0),82)),Nin(a,BB(Wtn((!c.c&&(c.c=new hK(KOt,c,5,8)),c.c),0),82)),VFn(i,a),h=new Wb(n.b);h.a<h.c.c.length;)s=BB(n0(h),70),Sen(u=BB(mMn(s,dlt),137),s.o.a),Men(u,s.o.b),SA(u,s.n.a+r.a,s.n.b+r.b),Ypn(u,(Irn(),tst),TD(mMn(s,tst)));(o=BB(mMn(n,(HXn(),vgt)),74))?(Ztn(o,r),Ypn(c,vgt,o)):Ypn(c,vgt,null),t==(Mbn(),JPt)?Ypn(c,Zdt,JPt):Ypn(c,Zdt,null)}}function vzn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(b=t.c.length,l=0,f=new Wb(n.b);f.a<f.c.c.length;)if(0!=(p=(h=BB(n0(f),29)).a).c.length){for(s=0,v=null,r=BB(n0(g=new Wb(p)),10),c=null;r;){if((c=BB(xq(t,r.p),257)).c>=0){for(o=null,u=new M2(h.a,s+1);u.b<u.d.gc()&&(Px(u.b<u.d.gc()),a=BB(u.d.Xb(u.c=u.b++),10),!((o=BB(xq(t,a.p),257)).d==c.d&&o.c<c.c));)o=null;o&&(v&&(c5(i,r.p,iln(BB(xq(i,r.p),19).a-1)),BB(xq(e,v.p),15).Mc(c)),c=wTn(c,r,b++),t.c[t.c.length]=c,WB(e,new Np),v?(BB(xq(e,v.p),15).Fc(c),WB(i,iln(1))):WB(i,iln(0)))}w=null,g.a<g.c.c.length&&(w=BB(n0(g),10),d=BB(xq(t,w.p),257),BB(xq(e,r.p),15).Fc(d),c5(i,w.p,iln(BB(xq(i,w.p),19).a+1))),c.d=l,c.c=s++,v=r,r=w}++l}}function mzn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;return o=n,h=XR(new xC(t.a,t.b),n),s=i,f=XR(new xC(r.a,r.b),i),l=o.a,g=o.b,w=s.a,v=s.b,b=h.a,p=h.b,c=(d=f.a)*p-b*(m=f.b),h$(),rin(A3n),!(e.Math.abs(0-c)<=A3n||0==c||isNaN(0)&&isNaN(c))&&(a=1/c*((l-w)*p-(g-v)*b),u=1/c*-(-(l-w)*m+(g-v)*d),rin(A3n),(e.Math.abs(0-a)<=A3n||0==a||isNaN(0)&&isNaN(a)?0:0<a?-1:0>a?1:zO(isNaN(0),isNaN(a)))<0&&(rin(A3n),(e.Math.abs(a-1)<=A3n||1==a||isNaN(a)&&isNaN(1)?0:a<1?-1:a>1?1:zO(isNaN(a),isNaN(1)))<0)&&(rin(A3n),(e.Math.abs(0-u)<=A3n||0==u||isNaN(0)&&isNaN(u)?0:0<u?-1:0>u?1:zO(isNaN(0),isNaN(u)))<0)&&(rin(A3n),(e.Math.abs(u-1)<=A3n||1==u||isNaN(u)&&isNaN(1)?0:u<1?-1:u>1?1:zO(isNaN(u),isNaN(1)))<0))}function yzn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j;for(f=new hW(new iw(n));f.b!=f.c.a.d;)for(u=BB((h=s9(f)).d,56),t=BB(h.e,56),d=0,y=(null==(a=u.Tg()).i&&qFn(a),a.i).length;d<y;++d)if(null==a.i&&qFn(a),c=a.i,(s=d>=0&&d<c.length?c[d]:null).Ij()&&!s.Jj())if(cL(s,99))0==((o=BB(s,18)).Bb&h6n)&&(!(j=Cvn(o))||0==(j.Bb&h6n))&&mBn(n,o,u,t);else if(ZM(),BB(s,66).Oj()&&(e=BB((k=s)?BB(t,49).xh(k):null,153)))for(b=BB(u.ah(s),153),i=e.gc(),g=0,w=b.gc();g<w;++g)if(cL(l=b.il(g),99)){if(null==(r=lnn(n,m=b.jl(g)))&&null!=m){if(v=BB(l,18),!n.b||0!=(v.Bb&h6n)||Cvn(v))continue;r=m}if(!e.dl(l,r))for(p=0;p<i;++p)if(e.il(p)==l&&GI(e.jl(p))===GI(r)){e.ii(e.gc()-1,p),--i;break}}else e.dl(b.il(g),b.jl(g))}function kzn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d,g,p,v,m;if(p=QBn(t,i,n.g),c.n&&c.n&&a&&y0(c,o2(a),(Bsn(),uOt)),n.b)for(g=0;g<p.c.length;g++)l1(g,p.c.length),f=BB(p.c[g],200),0!=g&&(l1(g-1,p.c.length),ghn(f,(b=BB(p.c[g-1],200)).f+b.b+n.g)),mXn(g,p,i,n.g),Hkn(n,f),c.n&&a&&y0(c,o2(a),(Bsn(),uOt));else for(d=new Wb(p);d.a<d.c.c.length;)for(h=new Wb((w=BB(n0(d),200)).a);h.a<h.c.c.length;)xcn(v=new KJ((s=BB(n0(h),187)).s,s.t,n.g),s),WB(w.d,v);return zmn(n,p),c.n&&c.n&&a&&y0(c,o2(a),(Bsn(),uOt)),m=e.Math.max(n.d,r.a-(u.b+u.c)),o=(l=e.Math.max(n.c,r.b-(u.d+u.a)))-n.c,n.e&&n.f&&(m/l<n.a?m=l*n.a:o+=m/n.a-l),n.e&&Odn(p,m,o),c.n&&c.n&&a&&y0(c,o2(a),(Bsn(),uOt)),new eq(n.a,m,n.c+o,(YLn(),_Et))}function jzn(n){var t,i,r,c,a,u,o,s,h,f;for(n.j=x8(ANt,hQn,25,n.g,15,1),n.o=new Np,JT(wnn(new Rq(null,new w1(n.e.b,16)),new Wc),new ug(n)),n.a=x8($Nt,ZYn,25,n.b,16,1),$fn(new Rq(null,new w1(n.e.b,16)),new sg(n)),f=new Np,JT(AV(wnn(new Rq(null,new w1(n.e.b,16)),new Qc),new og(n)),new eC(n,f)),o=new Wb(f);o.a<o.c.c.length;)if(!((u=BB(n0(o),508)).c.length<=1))if(2!=u.c.length){if(!XEn(u)&&!NPn(u,new Vc))for(s=new Wb(u),r=null;s.a<s.c.c.length;)t=BB(n0(s),17),i=n.c[t.p],h=!r||s.a>=s.c.c.length?X3((uSn(),Cut),Put):X3((uSn(),Put),Put),h*=2,c=i.a.g,i.a.g=e.Math.max(c,c+(h-c)),a=i.b.g,i.b.g=e.Math.max(a,a+(h-a)),r=t}else zAn(u),AHn((l1(0,u.c.length),BB(u.c[0],17)).d.i)||WB(n.o,u)}function Ezn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(m=GB(n),o=new Np,s=(c=n.c.length)-1,h=c+1;0!=m.a.c;){for(;0!=e.b;)Px(0!=e.b),p=BB(Atn(e,e.a.a),112),$J(m.a,p),p.g=s--,NFn(p,t,e,i);for(;0!=t.b;)Px(0!=t.b),v=BB(Atn(t,t.a.a),112),$J(m.a,v),v.g=h++,NFn(v,t,e,i);for(u=_Vn,d=new Fb(new BR(new xN(new _b(m.a).a).b));aS(d.a.a);){if(w=BB(mx(d.a).cd(),112),!i&&w.b>0&&w.a<=0){o.c=x8(Ant,HWn,1,0,5,1),o.c[o.c.length]=w;break}(b=w.i-w.d)>=u&&(b>u&&(o.c=x8(Ant,HWn,1,0,5,1),u=b),o.c[o.c.length]=w)}0!=o.c.length&&(a=BB(xq(o,pvn(r,o.c.length)),112),$J(m.a,a),a.g=h++,NFn(a,t,e,i),o.c=x8(Ant,HWn,1,0,5,1))}for(g=n.c.length+1,l=new Wb(n);l.a<l.c.c.length;)(f=BB(n0(l),112)).g<c&&(f.g=f.g+g)}function Tzn(n,t){var e;if(n.e)throw Hp(new Fy((ED(git),AYn+git.k+$Yn)));if(!SS(n.a,t))throw Hp(new dy(LYn+t+NYn));if(t==n.d)return n;switch(e=n.d,n.d=t,e.g){case 0:switch(t.g){case 2:Hmn(n);break;case 1:Con(n),Hmn(n);break;case 4:nEn(n),Hmn(n);break;case 3:nEn(n),Con(n),Hmn(n)}break;case 2:switch(t.g){case 1:Con(n),RRn(n);break;case 4:nEn(n),Hmn(n);break;case 3:nEn(n),Con(n),Hmn(n)}break;case 1:switch(t.g){case 2:Con(n),RRn(n);break;case 4:Con(n),nEn(n),Hmn(n);break;case 3:Con(n),nEn(n),Con(n),Hmn(n)}break;case 4:switch(t.g){case 2:nEn(n),Hmn(n);break;case 1:nEn(n),Con(n),Hmn(n);break;case 3:Con(n),RRn(n)}break;case 3:switch(t.g){case 2:Con(n),nEn(n),Hmn(n);break;case 1:Con(n),nEn(n),Con(n),Hmn(n);break;case 4:Con(n),RRn(n)}}return n}function Mzn(n,t){var e;if(n.d)throw Hp(new Fy((ED(Yat),AYn+Yat.k+$Yn)));if(!PC(n.a,t))throw Hp(new dy(LYn+t+NYn));if(t==n.c)return n;switch(e=n.c,n.c=t,e.g){case 0:switch(t.g){case 2:Zon(n);break;case 1:Pon(n),Zon(n);break;case 4:tEn(n),Zon(n);break;case 3:tEn(n),Pon(n),Zon(n)}break;case 2:switch(t.g){case 1:Pon(n),KRn(n);break;case 4:tEn(n),Zon(n);break;case 3:tEn(n),Pon(n),Zon(n)}break;case 1:switch(t.g){case 2:Pon(n),KRn(n);break;case 4:Pon(n),tEn(n),Zon(n);break;case 3:Pon(n),tEn(n),Pon(n),Zon(n)}break;case 4:switch(t.g){case 2:tEn(n),Zon(n);break;case 1:tEn(n),Pon(n),Zon(n);break;case 3:Pon(n),KRn(n)}break;case 3:switch(t.g){case 2:Pon(n),tEn(n),Zon(n);break;case 1:Pon(n),tEn(n),Pon(n),Zon(n);break;case 4:Pon(n),KRn(n)}}return n}function Szn(n,t,i){var r,c,a,u,o,s,f,l;for(s=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));s.e!=s.i.gc();)for(c=new oz(ZL(dLn(o=BB(kpn(s),33)).a.Kc(),new h));dAn(c);){if(!(r=BB(U5(c),79)).b&&(r.b=new hK(KOt,r,4,7)),!(r.b.i<=1&&(!r.c&&(r.c=new hK(KOt,r,5,8)),r.c.i<=1)))throw Hp(new ck("Graph must not contain hyperedges."));if(!nAn(r)&&o!=PTn(BB(Wtn((!r.c&&(r.c=new hK(KOt,r,5,8)),r.c),0),82)))for(qan(f=new IR,r),hon(f,(Mrn(),sat),r),Rl(f,BB(qI(AY(i.f,o)),144)),Kl(f,BB(RX(i,PTn(BB(Wtn((!r.c&&(r.c=new hK(KOt,r,5,8)),r.c),0),82))),144)),WB(t.c,f),u=new AL((!r.n&&(r.n=new eU(zOt,r,1,7)),r.n));u.e!=u.i.gc();)qan(l=new m4(f,(a=BB(kpn(u),137)).a),a),hon(l,sat,a),l.e.a=e.Math.max(a.g,1),l.e.b=e.Math.max(a.f,1),_Bn(l),WB(t.d,l)}}function Pzn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(EJ(l=new eUn(n),!(t==(Ffn(),HPt)||t==KPt)),f=l.a,b=new bm,Dtn(),u=0,s=(c=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;u<s;++u)i=c[u],(h=fL(f,Git,i))&&(b.d=e.Math.max(b.d,h.Re()));for(a=0,o=(r=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;a<o;++a)i=r[a],(h=fL(f,Uit,i))&&(b.a=e.Math.max(b.a,h.Re()));for(p=0,m=(d=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;p<m;++p)(h=fL(f,d[p],Git))&&(b.b=e.Math.max(b.b,h.Se()));for(g=0,v=(w=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;g<v;++g)(h=fL(f,w[g],Uit))&&(b.c=e.Math.max(b.c,h.Se()));return b.d>0&&(b.d+=f.n.d,b.d+=f.d),b.a>0&&(b.a+=f.n.a,b.a+=f.d),b.b>0&&(b.b+=f.n.b,b.b+=f.d),b.c>0&&(b.c+=f.n.c,b.c+=f.d),b}function Czn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d;for(b=i.d,l=i.c,u=(a=new xC(i.f.a+i.d.b+i.d.c,i.f.b+i.d.d+i.d.a)).b,h=new Wb(n.a);h.a<h.c.c.length;)if((o=BB(n0(h),10)).k==(uSn(),Mut)){switch(r=BB(mMn(o,(hWn(),Qft)),61),c=BB(mMn(o,Yft),8),f=o.n,r.g){case 2:f.a=i.f.a+b.c-l.a;break;case 4:f.a=-l.a-b.b}switch(d=0,r.g){case 2:case 4:t==(QEn(),WCt)?(w=Gy(MD(mMn(o,Tlt))),f.b=a.b*w-BB(mMn(o,(HXn(),npt)),8).b,d=f.b+c.b,Jan(o,!1,!0)):t==XCt&&(f.b=Gy(MD(mMn(o,Tlt)))-BB(mMn(o,(HXn(),npt)),8).b,d=f.b+c.b,Jan(o,!1,!0))}u=e.Math.max(u,d)}for(i.f.b+=u-a.b,s=new Wb(n.a);s.a<s.c.c.length;)if((o=BB(n0(s),10)).k==(uSn(),Mut))switch(r=BB(mMn(o,(hWn(),Qft)),61),f=o.n,r.g){case 1:f.b=-l.b-b.d;break;case 3:f.b=i.f.b+b.a-l.b}}function Izn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j;for(r=BB(mMn(n,(qqn(),skt)),33),o=DWn,s=DWn,a=_Vn,u=_Vn,k=spn(n.b,0);k.b!=k.d.c;)w=(m=BB(b3(k),86)).e,d=m.f,o=e.Math.min(o,w.a-d.a/2),s=e.Math.min(s,w.b-d.b/2),a=e.Math.max(a,w.a+d.a/2),u=e.Math.max(u,w.b+d.b/2);for(l=new xC((b=BB(ZAn(r,(CAn(),Ikt)),116)).b-o,b.d-s),y=spn(n.b,0);y.b!=y.d.c;)cL(f=mMn(m=BB(b3(y),86),skt),239)&&SA(c=BB(f,33),(h=UR(m.e,l)).a-c.g/2,h.b-c.f/2);for(v=spn(n.a,0);v.b!=v.d.c;)p=BB(b3(v),188),(i=BB(mMn(p,skt),79))&&(r5(t=p.a,g=new wA(p.b.e),t.a,t.a.a),r5(t,j=new wA(p.c.e),t.c.b,t.c),ZMn(g,BB(Dpn(t,1),8),p.b.f),ZMn(j,BB(Dpn(t,t.b-2),8),p.c.f),VFn(t,cDn(i,!0,!0)));KUn(r,a-o+(b.b+b.c),u-s+(b.d+b.a),!1,!1)}function Ozn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;for(yR(o=new M2(s=n.b,0),new HX(n)),g=!1,c=1;o.b<o.d.gc();){for(Px(o.b<o.d.gc()),u=BB(o.d.Xb(o.c=o.b++),29),l1(c,s.c.length),b=BB(s.c[c],29),d=(w=a0(u.a)).c.length,l=new Wb(w);l.a<l.c.c.length;)PZ(h=BB(n0(l),10),b);if(g){for(f=W1(new fy(w),0);f.c.Sb();)for(r=new Wb(a0(fbn(h=BB(w5(f),10))));r.a<r.c.c.length;)tBn(i=BB(n0(r),17),!0),hon(n,(hWn(),qft),(hN(),!0)),e=iGn(n,i,d),t=BB(mMn(h,Rft),305),p=BB(xq(e,e.c.length-1),17),t.k=p.c.i,t.n=p,t.b=i.d.i,t.c=i;g=!1}else 0!=w.c.length&&(l1(0,w.c.length),BB(w.c[0],10).k==(uSn(),Tut)&&(g=!0,c=-1));++c}for(a=new M2(n.b,0);a.b<a.d.gc();)Px(a.b<a.d.gc()),0==BB(a.d.Xb(a.c=a.b++),29).a.c.length&&fW(a)}function Azn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if((f=BB(BB(h6(n.r,t),21),84)).gc()<=2||t==(kUn(),oIt)||t==(kUn(),CIt))JUn(n,t);else{for(g=n.u.Hc((lIn(),cIt)),i=t==(kUn(),sIt)?(Dan(),Rrt):(Dan(),Nrt),v=t==sIt?(G7(),irt):(G7(),crt),r=Zk(H_(i),n.s),p=t==sIt?RQn:KQn,h=f.Kc();h.Ob();)!(o=BB(h.Pb(),111)).c||o.c.d.c.length<=0||(d=o.b.rf(),w=o.e,(b=(l=o.c).i).b=(a=l.n,l.e.a+a.b+a.c),b.a=(u=l.n,l.e.b+u.d+u.a),g?(b.c=w.a-(c=l.n,l.e.a+c.b+c.c)-n.s,g=!1):b.c=w.a+d.a+n.s,OY(v,uJn),l.f=v,l9(l,(J9(),Jit)),WB(r.d,new xG(b,kln(r,b))),p=t==sIt?e.Math.min(p,w.b):e.Math.max(p,w.b+o.b.rf().b));for(p+=t==sIt?-n.t:n.t,Pwn((r.e=p,r)),s=f.Kc();s.Ob();)!(o=BB(s.Pb(),111)).c||o.c.d.c.length<=0||((b=o.c.i).c-=o.e.a,b.d-=o.e.b)}}function $zn(n,t,i){var r;if(OTn(i,"StretchWidth layering",1),0!=t.a.c.length){for(n.c=t,n.t=0,n.u=0,n.i=RQn,n.g=KQn,n.d=Gy(MD(mMn(t,(HXn(),ypt)))),zpn(n),PAn(n),SAn(n),xjn(n),ddn(n),n.i=e.Math.max(1,n.i),n.g=e.Math.max(1,n.g),n.d=n.d/n.i,n.f=n.g/n.i,n.s=_vn(n),r=new HX(n.c),WB(n.c.b,r),n.r=a0(n.p),n.n=TJ(n.k,n.k.length);0!=n.r.c.length;)n.o=zhn(n),!n.o||Ton(n)&&0!=n.b.a.gc()?(xEn(n,r),r=new HX(n.c),WB(n.c.b,r),Frn(n.a,n.b),n.b.a.$b(),n.t=n.u,n.u=0):Ton(n)?(n.c.b.c=x8(Ant,HWn,1,0,5,1),r=new HX(n.c),WB(n.c.b,r),n.t=0,n.u=0,n.b.a.$b(),n.a.a.$b(),++n.f,n.r=a0(n.p),n.n=TJ(n.k,n.k.length)):(PZ(n.o,r),y7(n.r,n.o),TU(n.b,n.o),n.t=n.t-n.k[n.o.p]*n.d+n.j[n.o.p],n.u+=n.e[n.o.p]*n.d);t.a.c=x8(Ant,HWn,1,0,5,1),JPn(t.b),HSn(i)}else HSn(i)}function Lzn(n){var t,i,r,c;for(JT(AV(new Rq(null,new w1(n.a.b,16)),new yr),new kr),fEn(n),JT(AV(new Rq(null,new w1(n.a.b,16)),new jr),new Er),n.c==(Mbn(),JPt)&&(JT(AV(wnn(new Rq(null,new w1(new Cb(n.f),1)),new Tr),new Mr),new Md(n)),JT(AV($V(wnn(wnn(new Rq(null,new w1(n.d.b,16)),new Sr),new Pr),new Cr),new Ir),new Pd(n))),c=new xC(RQn,RQn),t=new xC(KQn,KQn),r=new Wb(n.a.b);r.a<r.c.c.length;)i=BB(n0(r),57),c.a=e.Math.min(c.a,i.d.c),c.b=e.Math.min(c.b,i.d.d),t.a=e.Math.max(t.a,i.d.c+i.d.b),t.b=e.Math.max(t.b,i.d.d+i.d.a);UR(kO(n.d.c),qx(new xC(c.a,c.b))),UR(kO(n.d.f),XR(new xC(t.a,t.b),c)),oNn(n,c,t),$U(n.f),$U(n.b),$U(n.g),$U(n.e),n.a.a.c=x8(Ant,HWn,1,0,5,1),n.a.b.c=x8(Ant,HWn,1,0,5,1),n.a=null,n.d=null}function Nzn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(i=new Np,w=new Wb(t.a);w.a<w.c.c.length;)if((l=(b=BB(n0(w),10)).e)&&(gun(i,Nzn(n,l,b)),EGn(n,l,b),BB(mMn(l,(hWn(),Zft)),21).Hc((bDn(),lft))))for(p=BB(mMn(b,(HXn(),ept)),98),f=BB(mMn(b,cpt),174).Hc((lIn(),eIt)),g=new Wb(b.j);g.a<g.c.c.length;)for(d=BB(n0(g),11),(r=BB(RX(n.b,d),10))||(hon(r=bXn(d,p,d.j,-(d.e.c.length-d.g.c.length),null,new Gj,d.o,BB(mMn(l,Udt),103),l),dlt,d),VW(n.b,d,r),WB(l.a,r)),c=BB(xq(r.j,0),11),s=new Wb(d.f);s.a<s.c.c.length;)o=BB(n0(s),70),(a=new qj).o.a=o.o.a,a.o.b=o.o.b,WB(c.f,a),f||(v=d.j,h=0,Hz(BB(mMn(b,cpt),21))&&(h=$In(o.n,o.o,d.o,0,v)),p==(QEn(),QCt)||(kUn(),bIt).Hc(v)?a.o.a=h:a.o.b=h);return BGn(n,t,e,i,u=new Np),e&&Cqn(n,t,e,u),u}function xzn(n,t,e){var i,r,c,a,u,o,s,h;if(!n.c[t.c.p][t.p].e){for(n.c[t.c.p][t.p].e=!0,n.c[t.c.p][t.p].b=0,n.c[t.c.p][t.p].d=0,n.c[t.c.p][t.p].a=null,h=new Wb(t.j);h.a<h.c.c.length;)for(s=BB(n0(h),11),o=(e?new Hw(s):new Gw(s)).Kc();o.Ob();)(a=(u=BB(o.Pb(),11)).i).c==t.c?a!=t&&(xzn(n,a,e),n.c[t.c.p][t.p].b+=n.c[a.c.p][a.p].b,n.c[t.c.p][t.p].d+=n.c[a.c.p][a.p].d):(n.c[t.c.p][t.p].d+=n.g[u.p],++n.c[t.c.p][t.p].b);if(c=BB(mMn(t,(hWn(),xft)),15))for(r=c.Kc();r.Ob();)i=BB(r.Pb(),10),t.c==i.c&&(xzn(n,i,e),n.c[t.c.p][t.p].b+=n.c[i.c.p][i.p].b,n.c[t.c.p][t.p].d+=n.c[i.c.p][i.p].d);n.c[t.c.p][t.p].b>0&&(n.c[t.c.p][t.p].d+=H$n(n.i,24)*uYn*.07000000029802322-.03500000014901161,n.c[t.c.p][t.p].a=n.c[t.c.p][t.p].d/n.c[t.c.p][t.p].b)}}function Dzn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w;for(l=new Wb(n);l.a<l.c.c.length;){for(nx((f=BB(n0(l),10)).n),nx(f.o),V6(f.f),VRn(f),aRn(f),w=new Wb(f.j);w.a<w.c.c.length;){for(nx((b=BB(n0(w),11)).n),nx(b.a),nx(b.o),qCn(b,amn(b.j)),(r=BB(mMn(b,(HXn(),ipt)),19))&&hon(b,ipt,iln(-r.a)),i=new Wb(b.g);i.a<i.c.c.length;){for(t=spn((e=BB(n0(i),17)).a,0);t.b!=t.d.c;)nx(BB(b3(t),8));if(a=BB(mMn(e,vgt),74))for(c=spn(a,0);c.b!=c.d.c;)nx(BB(b3(c),8));for(s=new Wb(e.b);s.a<s.c.c.length;)nx((u=BB(n0(s),70)).n),nx(u.o)}for(h=new Wb(b.f);h.a<h.c.c.length;)nx((u=BB(n0(h),70)).n),nx(u.o)}for(f.k==(uSn(),Mut)&&(hon(f,(hWn(),Qft),amn(BB(mMn(f,Qft),61))),wxn(f)),o=new Wb(f.b);o.a<o.c.c.length;)VRn(u=BB(n0(o),70)),nx(u.o),nx(u.n)}}function Rzn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y;for(n.e=t,u=nOn(t),m=new Np,i=new Wb(u);i.a<i.c.c.length;){for(e=BB(n0(i),15),y=new Np,m.c[m.c.length]=y,o=new Rv,l=e.Kc();l.Ob();){for(c=JRn(n,f=BB(l.Pb(),33),!0,0,0),y.c[y.c.length]=c,new xC(b=f.i,w=f.j),!f.n&&(f.n=new eU(zOt,f,1,7)),h=new AL(f.n);h.e!=h.i.gc();)r=JRn(n,BB(kpn(h),137),!1,b,w),y.c[y.c.length]=r;for(!f.c&&(f.c=new eU(XOt,f,9,9)),g=new AL(f.c);g.e!=g.i.gc();)for(a=JRn(n,d=BB(kpn(g),118),!1,b,w),y.c[y.c.length]=a,p=d.i+b,v=d.j+w,!d.n&&(d.n=new eU(zOt,d,1,7)),s=new AL(d.n);s.e!=s.i.gc();)r=JRn(n,BB(kpn(s),137),!1,p,v),y.c[y.c.length]=r;Frn(o,JQ(Wen(Pun(Gk(xnt,1),HWn,20,0,[dLn(f),wLn(f)]))))}ULn(n,o,y)}return n.f=new _j(m),qan(n.f,t),n.f}function Kzn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g;null==(w=RX(n.e,i))&&(s=BB(w=new py,183),o=new GX(t+"_s"+r),rtn(s,q6n,o)),nW(e,b=BB(w,183)),qQ(g=new py,"x",i.j),qQ(g,"y",i.k),rtn(b,U6n,g),qQ(f=new py,"x",i.b),qQ(f,"y",i.c),rtn(b,"endPoint",f),!WE((!i.a&&(i.a=new $L(xOt,i,5)),i.a))&&(c=new Wg(h=new Cl),e5((!i.a&&(i.a=new $L(xOt,i,5)),i.a),c),rtn(b,D6n,h)),!!Svn(i)&&cMn(n.a,b,K6n,RPn(n,Svn(i))),!!Pvn(i)&&cMn(n.a,b,R6n,RPn(n,Pvn(i))),!(0==(!i.e&&(i.e=new hK(FOt,i,10,9)),i.e).i)&&(a=new SI(n,l=new Cl),e5((!i.e&&(i.e=new hK(FOt,i,10,9)),i.e),a),rtn(b,F6n,l)),0!=(!i.g&&(i.g=new hK(FOt,i,9,10)),i.g).i&&(u=new PI(n,d=new Cl),e5((!i.g&&(i.g=new hK(FOt,i,9,10)),i.g),u),rtn(b,_6n,d))}function _zn(n){var t,i,r,c,a,u,o;for(qD(),r=n.f.n,u=EX(n.r).a.nc();u.Ob();){if(c=0,(a=BB(u.Pb(),111)).b.Xe((sWn(),aPt))&&(c=Gy(MD(a.b.We(aPt))))<0)switch(a.b.Hf().g){case 1:r.d=e.Math.max(r.d,-c);break;case 3:r.a=e.Math.max(r.a,-c);break;case 2:r.c=e.Math.max(r.c,-c);break;case 4:r.b=e.Math.max(r.b,-c)}if(Hz(n.u))switch(t=vcn(a.b,c),o=!BB(n.e.We(qSt),174).Hc((n_n(),HIt)),i=!1,a.b.Hf().g){case 1:i=t>r.d,r.d=e.Math.max(r.d,t),o&&i&&(r.d=e.Math.max(r.d,r.a),r.a=r.d+c);break;case 3:i=t>r.a,r.a=e.Math.max(r.a,t),o&&i&&(r.a=e.Math.max(r.a,r.d),r.d=r.a+c);break;case 2:i=t>r.c,r.c=e.Math.max(r.c,t),o&&i&&(r.c=e.Math.max(r.b,r.c),r.b=r.c+c);break;case 4:i=t>r.b,r.b=e.Math.max(r.b,t),o&&i&&(r.b=e.Math.max(r.b,r.c),r.c=r.b+c)}}}function Fzn(n){var t,e,i,r,c,a,u,o,s,h,f;for(s=new Wb(n);s.a<s.c.c.length;){switch(o=BB(n0(s),10),c=null,(a=BB(mMn(o,(HXn(),kgt)),163)).g){case 1:case 2:Jun(),c=$ht;break;case 3:case 4:Jun(),c=Oht}if(c)hon(o,(hWn(),Gft),(Jun(),$ht)),c==Oht?RNn(o,a,(ain(),Hvt)):c==$ht&&RNn(o,a,(ain(),qvt));else if(vA(BB(mMn(o,ept),98))&&0!=o.j.c.length){for(t=!0,f=new Wb(o.j);f.a<f.c.c.length;){if(!((h=BB(n0(f),11)).j==(kUn(),oIt)&&h.e.c.length-h.g.c.length>0||h.j==CIt&&h.e.c.length-h.g.c.length<0)){t=!1;break}for(r=new Wb(h.g);r.a<r.c.c.length;)if(e=BB(n0(r),17),(u=BB(mMn(e.d.i,kgt),163))==(Tbn(),Blt)||u==Hlt){t=!1;break}for(i=new Wb(h.e);i.a<i.c.c.length;)if(e=BB(n0(i),17),(u=BB(mMn(e.c.i,kgt),163))==(Tbn(),_lt)||u==Flt){t=!1;break}}t&&RNn(o,a,(ain(),Gvt))}}}function Bzn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(E=0,w=0,l=new Wb(t.e);l.a<l.c.c.length;){for(f=BB(n0(l),10),b=0,o=0,s=i?BB(mMn(f,Xmt),19).a:_Vn,v=r?BB(mMn(f,Wmt),19).a:_Vn,h=e.Math.max(s,v),y=new Wb(f.j);y.a<y.c.c.length;){if(m=BB(n0(y),11),k=f.n.b+m.n.b+m.a.b,r)for(u=new Wb(m.g);u.a<u.c.c.length;)d=(g=(a=BB(n0(u),17)).d).i,t!=n.a[d.p]&&(p=e.Math.max(BB(mMn(d,Xmt),19).a,BB(mMn(d,Wmt),19).a),(j=BB(mMn(a,(HXn(),bpt)),19).a)>=h&&j>=p&&(b+=d.n.b+g.n.b+g.a.b-k,++o));if(i)for(u=new Wb(m.e);u.a<u.c.c.length;)d=(g=(a=BB(n0(u),17)).c).i,t!=n.a[d.p]&&(p=e.Math.max(BB(mMn(d,Xmt),19).a,BB(mMn(d,Wmt),19).a),(j=BB(mMn(a,(HXn(),bpt)),19).a)>=h&&j>=p&&(b+=d.n.b+g.n.b+g.a.b-k,++o))}o>0&&(E+=b/o,++w)}w>0?(t.a=c*E/w,t.g=w):(t.a=0,t.g=0)}function Hzn(n,t){var e,i,r,c,a,u,o,s,h,f;for(i=new Wb(n.a.b);i.a<i.c.c.length;)for(u=new Wb(BB(n0(i),29).a);u.a<u.c.c.length;)a=BB(n0(u),10),t.j[a.p]=a,t.i[a.p]=t.o==(oZ(),cyt)?KQn:RQn;for($U(n.c),c=n.a.b,t.c==(gJ(),nyt)&&(c=cL(c,152)?o6(BB(c,152)):cL(c,131)?BB(c,131).a:cL(c,54)?new fy(c):new CT(c)),R9(n.e,t,n.b),yS(t.p,null),r=c.Kc();r.Ob();)for(o=BB(r.Pb(),29).a,t.o==(oZ(),cyt)&&(o=cL(o,152)?o6(BB(o,152)):cL(o,131)?BB(o,131).a:cL(o,54)?new fy(o):new CT(o)),f=o.Kc();f.Ob();)h=BB(f.Pb(),10),t.g[h.p]==h&&oXn(n,h,t);for(Hqn(n,t),e=c.Kc();e.Ob();)for(f=new Wb(BB(e.Pb(),29).a);f.a<f.c.c.length;)h=BB(n0(f),10),t.p[h.p]=t.p[t.g[h.p].p],h==t.g[h.p]&&(s=Gy(t.i[t.j[h.p].p]),(t.o==(oZ(),cyt)&&s>KQn||t.o==ryt&&s<RQn)&&(t.p[h.p]=Gy(t.p[h.p])+s));n.e.cg()}function qzn(n,t,e,i){var r,c,a,u,o;return pNn(u=new eUn(t),i),r=!0,n&&n.Xe((sWn(),bSt))&&(r=(c=BB(n.We((sWn(),bSt)),103))==(Ffn(),BPt)||c==_Pt||c==FPt),oRn(u,!1),Otn(u.e.wf(),new $_(u,!1,r)),LJ(u,u.f,(Dtn(),Git),(kUn(),sIt)),LJ(u,u.f,Uit,SIt),LJ(u,u.g,Git,CIt),LJ(u,u.g,Uit,oIt),Bpn(u,sIt),Bpn(u,SIt),hV(u,oIt),hV(u,CIt),qD(),(a=u.A.Hc((mdn(),DIt))&&u.B.Hc((n_n(),UIt))?ndn(u):null)&&rj(u.a,a),_zn(u),ryn(u),cyn(u),VGn(u),MKn(u),mkn(u),_gn(u,sIt),_gn(u,SIt),CRn(u),PHn(u),e?(Gbn(u),ykn(u),_gn(u,oIt),_gn(u,CIt),o=u.B.Hc((n_n(),XIt)),MCn(u,o,sIt),MCn(u,o,SIt),SCn(u,o,oIt),SCn(u,o,CIt),JT(new Rq(null,new w1(new Ob(u.i),0)),new In),JT(AV(new Rq(null,EX(u.r).a.oc()),new On),new An),BEn(u),u.e.uf(u.o),JT(new Rq(null,EX(u.r).a.oc()),new Ln),u.o):u.o}function Gzn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(h=RQn,r=new Wb(n.a.b);r.a<r.c.c.length;)t=BB(n0(r),81),h=e.Math.min(h,t.d.f.g.c+t.e.a);for(w=new YT,u=new Wb(n.a.a);u.a<u.c.c.length;)(a=BB(n0(u),189)).i=h,0==a.e&&r5(w,a,w.c.b,w.c);for(;0!=w.b;){for(c=(a=BB(0==w.b?null:(Px(0!=w.b),Atn(w,w.a.a)),189)).f.g.c,b=a.a.a.ec().Kc();b.Ob();)f=BB(b.Pb(),81),g=a.i+f.e.a,f.d.g||f.g.c<g?f.o=g:f.o=f.g.c;for(c-=a.f.o,a.b+=c,n.c==(Ffn(),FPt)||n.c==KPt?a.c+=c:a.c-=c,l=a.a.a.ec().Kc();l.Ob();)for(s=(f=BB(l.Pb(),81)).f.Kc();s.Ob();)o=BB(s.Pb(),81),d=dA(n.c)?n.f.ef(f,o):n.f.ff(f,o),o.d.i=e.Math.max(o.d.i,f.o+f.g.b+d-o.e.a),o.k||(o.d.i=e.Math.max(o.d.i,o.g.c-o.e.a)),--o.d.e,0==o.d.e&&DH(w,o.d)}for(i=new Wb(n.a.b);i.a<i.c.c.length;)(t=BB(n0(i),81)).g.c=t.o}function zzn(n){var t,e,i,r,c,a,u,o;switch(u=n.b,t=n.a,0===BB(mMn(n,(_kn(),Mit)),427).g?m$(u,new nw(new Gn)):m$(u,new nw(new zn)),1===BB(mMn(n,Eit),428).g?(m$(u,new qn),m$(u,new Un),m$(u,new Kn)):(m$(u,new qn),m$(u,new Hn)),BB(mMn(n,Pit),250).g){case 0:o=new Yn;break;case 1:o=new Vn;break;case 2:o=new Qn;break;case 3:o=new Wn;break;case 5:o=new Ow(new Qn);break;case 4:o=new Ow(new Vn);break;case 7:o=new DS(new Ow(new Vn),new Ow(new Qn));break;case 8:o=new DS(new Ow(new Wn),new Ow(new Qn));break;default:o=new Ow(new Wn)}for(a=new Wb(u);a.a<a.c.c.length;){for(c=BB(n0(a),167),r=0,e=new rI(iln(i=0),iln(r));B_n(t,c,i,r);)e=BB(o.Ce(e,c),46),i=BB(e.a,19).a,r=BB(e.b,19).a;_Rn(t,c,i,r)}}function Uzn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(l=(c=n.f.b).a,h=c.b,w=n.e.g,b=n.e.f,MA(n.e,c.a,c.b),j=l/w,E=h/b,s=new AL(mV(n.e));s.e!=s.i.gc();)Pen(o=BB(kpn(s),137),o.i*j),Cen(o,o.j*E);for(v=new AL(yV(n.e));v.e!=v.i.gc();)y=(p=BB(kpn(v),118)).i,k=p.j,y>0&&Pen(p,y*j),k>0&&Cen(p,k*E);for(nan(n.b,new lt),t=new Np,u=new usn(new Pb(n.c).a);u.b;)i=BB((a=ten(u)).cd(),79),e=BB(a.dd(),395).a,r=cDn(i,!1,!1),VFn(f=lTn(PMn(i),qSn(r),e),r),(m=CMn(i))&&-1==E7(t,m,0)&&(t.c[t.c.length]=m,sQ(m,(Px(0!=f.b),BB(f.a.a.c,8)),e));for(g=new usn(new Pb(n.d).a);g.b;)i=BB((d=ten(g)).cd(),79),e=BB(d.dd(),395).a,r=cDn(i,!1,!1),f=lTn(OMn(i),Jon(qSn(r)),e),VFn(f=Jon(f),r),(m=IMn(i))&&-1==E7(t,m,0)&&(t.c[t.c.length]=m,sQ(m,(Px(0!=f.b),BB(f.c.b.c,8)),e))}function Xzn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;if(0!=i.c.length){for(w=new Np,b=new Wb(i);b.a<b.c.c.length;)WB(w,new xC((l=BB(n0(b),33)).i,l.j));for(r.n&&t&&y0(r,o2(t),(Bsn(),uOt));NMn(n,i);)E$n(n,i,!1);for(r.n&&t&&y0(r,o2(t),(Bsn(),uOt)),u=0,o=0,c=null,0!=i.c.length&&(l1(0,i.c.length),u=(c=BB(i.c[0],33)).i-(l1(0,w.c.length),BB(w.c[0],8)).a,o=c.j-(l1(0,w.c.length),BB(w.c[0],8)).b),a=e.Math.sqrt(u*u+o*o),f=Uhn(i);0!=f.a.gc();){for(h=f.a.ec().Kc();h.Ob();)s=BB(h.Pb(),33),g=(d=n.f).i+d.g/2,p=d.j+d.f/2,v=s.i+s.g/2,y=s.j+s.f/2-p,j=(m=v-g)/(k=e.Math.sqrt(m*m+y*y)),E=y/k,Pen(s,s.i+j*a),Cen(s,s.j+E*a);r.n&&t&&y0(r,o2(t),(Bsn(),uOt)),f=Uhn(new t_(f))}n.a&&n.a.lg(new t_(f)),r.n&&t&&y0(r,o2(t),(Bsn(),uOt)),Xzn(n,t,new t_(f),r)}}function Wzn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if(g=n.n,p=n.o,b=n.d,l=Gy(MD(edn(n,(HXn(),ppt)))),t){for(f=l*(t.gc()-1),w=0,s=t.Kc();s.Ob();)f+=(u=BB(s.Pb(),10)).o.a,w=e.Math.max(w,u.o.b);for(v=g.a-(f-p.a)/2,a=g.b-b.d+w,c=r=p.a/(t.gc()+1),o=t.Kc();o.Ob();)(u=BB(o.Pb(),10)).n.a=v,u.n.b=a-u.o.b,v+=u.o.a+l,(h=DLn(u)).n.a=u.o.a/2-h.a.a,h.n.b=u.o.b,(d=BB(mMn(u,(hWn(),Kft)),11)).e.c.length+d.g.c.length==1&&(d.n.a=c-d.a.a,d.n.b=0,CZ(d,n)),c+=r}if(i){for(f=l*(i.gc()-1),w=0,s=i.Kc();s.Ob();)f+=(u=BB(s.Pb(),10)).o.a,w=e.Math.max(w,u.o.b);for(v=g.a-(f-p.a)/2,a=g.b+p.b+b.a-w,c=r=p.a/(i.gc()+1),o=i.Kc();o.Ob();)(u=BB(o.Pb(),10)).n.a=v,u.n.b=a,v+=u.o.a+l,(h=DLn(u)).n.a=u.o.a/2-h.a.a,h.n.b=0,(d=BB(mMn(u,(hWn(),Kft)),11)).e.c.length+d.g.c.length==1&&(d.n.a=c-d.a.a,d.n.b=p.b,CZ(d,n)),c+=r}}function Vzn(n,t){var i,r,c,a,u,o;if(BB(mMn(t,(hWn(),Zft)),21).Hc((bDn(),lft))){for(o=new Wb(t.a);o.a<o.c.c.length;)(a=BB(n0(o),10)).k==(uSn(),Cut)&&(c=BB(mMn(a,(HXn(),Cgt)),142),n.c=e.Math.min(n.c,a.n.a-c.b),n.a=e.Math.max(n.a,a.n.a+a.o.a+c.c),n.d=e.Math.min(n.d,a.n.b-c.d),n.b=e.Math.max(n.b,a.n.b+a.o.b+c.a));for(u=new Wb(t.a);u.a<u.c.c.length;)if((a=BB(n0(u),10)).k!=(uSn(),Cut))switch(a.k.g){case 2:if((r=BB(mMn(a,(HXn(),kgt)),163))==(Tbn(),Flt)){a.n.a=n.c-10,Yyn(a,new Ge).Jb(new rd(a));break}if(r==Hlt){a.n.a=n.a+10,Yyn(a,new ze).Jb(new cd(a));break}if((i=BB(mMn(a,ilt),303))==(z7(),Cft)){lqn(a).Jb(new ad(a)),a.n.b=n.d-10;break}if(i==Sft){lqn(a).Jb(new ud(a)),a.n.b=n.b+10;break}break;default:throw Hp(new _y("The node type "+a.k+" is not supported by the "+Jot))}}}function Qzn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d;for(o=new xC(i.i+i.g/2,i.j+i.f/2),l=XHn(i),b=BB(ZAn(t,(HXn(),ept)),98),d=BB(ZAn(i,upt),61),BI(lpn(i),tpt)||(w=0==i.i&&0==i.j?0:tMn(i,d),Ypn(i,tpt,w)),hon(r=bXn(i,b,d,l,new xC(t.g,t.f),o,new xC(i.g,i.f),BB(mMn(e,Udt),103),e),(hWn(),dlt),i),Hl(c=BB(xq(r.j,0),11),j_n(i)),hon(r,cpt,(lIn(),nbn(rIt))),h=BB(ZAn(t,cpt),174).Hc(eIt),u=new AL((!i.n&&(i.n=new eU(zOt,i,1,7)),i.n));u.e!=u.i.gc();)if(!qy(TD(ZAn(a=BB(kpn(u),137),Ggt)))&&a.a&&(f=Hhn(a),WB(c.f,f),!h))switch(s=0,Hz(BB(ZAn(t,cpt),21))&&(s=$In(new xC(a.i,a.j),new xC(a.g,a.f),new xC(i.g,i.f),0,d)),d.g){case 2:case 4:f.o.a=s;break;case 1:case 3:f.o.b=s}hon(r,Cpt,MD(ZAn(JJ(t),Cpt))),hon(r,Ipt,MD(ZAn(JJ(t),Ipt))),hon(r,Spt,MD(ZAn(JJ(t),Spt))),WB(e.a,r),VW(n.a,i,r)}function Yzn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(OTn(e,"Processor arrange level",1),h=0,SQ(),_rn(t,new ap((qqn(),ikt))),c=t.b,u=spn(t,t.b),s=!0;s&&u.b.b!=u.d.a;)g=BB(U0(u),86),0==BB(mMn(g,ikt),19).a?--c:s=!1;if(a=new n_(new s1(t,0,c)),o=new n_(new s1(t,c,t.b)),0==a.b)for(b=spn(o,0);b.b!=b.d.c;)hon(BB(b3(b),86),hkt,iln(h++));else for(f=a.b,m=spn(a,0);m.b!=m.d.c;){for(hon(v=BB(b3(m),86),hkt,iln(h++)),Yzn(n,i=xun(v),mcn(e,1/f|0)),_rn(i,QW(new ap(hkt))),l=new YT,p=spn(i,0);p.b!=p.d.c;)for(g=BB(b3(p),86),d=spn(v.d,0);d.b!=d.d.c;)(w=BB(b3(d),188)).c==g&&r5(l,w,l.c.b,l.c);for(yQ(v.d),Frn(v.d,l),u=spn(o,o.b),r=v.d.b,s=!0;0<r&&s&&u.b.b!=u.d.a;)g=BB(U0(u),86),0==BB(mMn(g,ikt),19).a?(hon(g,hkt,iln(h++)),--r,mtn(u)):s=!1}HSn(e)}function Jzn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(OTn(t,"Inverted port preprocessing",1),u=new M2(n.b,0),e=null,g=new Np;u.b<u.d.gc();){for(d=e,Px(u.b<u.d.gc()),e=BB(u.d.Xb(u.c=u.b++),29),h=new Wb(g);h.a<h.c.c.length;)PZ(o=BB(n0(h),10),d);for(g.c=x8(Ant,HWn,1,0,5,1),f=new Wb(e.a);f.a<f.c.c.length;)if((o=BB(n0(f),10)).k==(uSn(),Cut)&&vA(BB(mMn(o,(HXn(),ept)),98))){for(w=cRn(o,(ain(),Hvt),(kUn(),oIt)).Kc();w.Ob();)for(l=BB(w.Pb(),11),r=0,c=(i=BB(Qgn(a=l.e,x8(yut,c1n,17,a.c.length,0,1)),474)).length;r<c;++r)$Bn(n,l,i[r],g);for(b=cRn(o,qvt,CIt).Kc();b.Ob();)for(l=BB(b.Pb(),11),r=0,c=(i=BB(Qgn(a=l.g,x8(yut,c1n,17,a.c.length,0,1)),474)).length;r<c;++r)ABn(n,l,i[r],g)}}for(s=new Wb(g);s.a<s.c.c.length;)PZ(o=BB(n0(s),10),e);HSn(t)}function Zzn(n,t,e,i,r,c){var a,u,o,s,h,f;for(qan(s=new CSn,t),qCn(s,BB(ZAn(t,(HXn(),upt)),61)),hon(s,(hWn(),dlt),t),CZ(s,e),(f=s.o).a=t.g,f.b=t.f,(h=s.n).a=t.i,h.b=t.j,VW(n.a,t,s),(a=o5($V(wnn(new Rq(null,(!t.e&&(t.e=new hK(_Ot,t,7,4)),new w1(t.e,16))),new Vt),new Xt),new Ww(t)))||(a=o5($V(wnn(new Rq(null,(!t.d&&(t.d=new hK(_Ot,t,8,5)),new w1(t.d,16))),new Qt),new Wt),new Vw(t))),a||(a=o5(new Rq(null,(!t.e&&(t.e=new hK(_Ot,t,7,4)),new w1(t.e,16))),new Yt)),hon(s,elt,(hN(),!!a)),pqn(s,c,r,BB(ZAn(t,npt),8)),o=new AL((!t.n&&(t.n=new eU(zOt,t,1,7)),t.n));o.e!=o.i.gc();)!qy(TD(ZAn(u=BB(kpn(o),137),Ggt)))&&u.a&&WB(s.f,Hhn(u));switch(r.g){case 2:case 1:(s.j==(kUn(),sIt)||s.j==SIt)&&i.Fc((bDn(),gft));break;case 4:case 3:(s.j==(kUn(),oIt)||s.j==CIt)&&i.Fc((bDn(),gft))}return s}function nUn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d,g,p,v,m;for(l=null,r==(dJ(),Lyt)?l=t:r==Nyt&&(l=i),d=l.a.ec().Kc();d.Ob();){for(w=BB(d.Pb(),11),g=Aon(Pun(Gk(PMt,1),sVn,8,0,[w.i.n,w.n,w.a])).b,m=new Rv,o=new Rv,h=new m6(w.b);y$(h.a)||y$(h.b);)if(qy(TD(mMn(s=BB(y$(h.a)?n0(h.a):n0(h.b),17),(hWn(),Clt))))==c&&-1!=E7(a,s,0)){if(p=s.d==w?s.c:s.d,v=Aon(Pun(Gk(PMt,1),sVn,8,0,[p.i.n,p.n,p.a])).b,e.Math.abs(v-g)<.2)continue;v<g?t.a._b(p)?TU(m,new rI(Lyt,s)):TU(m,new rI(Nyt,s)):t.a._b(p)?TU(o,new rI(Lyt,s)):TU(o,new rI(Nyt,s))}if(m.a.gc()>1)for(e5(m,new sC(n,b=new hqn(w,m,r))),u.c[u.c.length]=b,f=m.a.ec().Kc();f.Ob();)y7(a,BB(f.Pb(),46).b);if(o.a.gc()>1)for(e5(o,new hC(n,b=new hqn(w,o,r))),u.c[u.c.length]=b,f=o.a.ec().Kc();f.Ob();)y7(a,BB(f.Pb(),46).b)}}function tUn(n){NM(n,new MTn(dj(vj(wj(pj(gj(new du,w4n),"ELK Radial"),'A radial layout provider which is based on the algorithm of Peter Eades published in "Drawing free trees.", published by International Institute for Advanced Study of Social Information Science, Fujitsu Limited in 1991. The radial layouter takes a tree and places the nodes in radial order around the root. The nodes of the same tree level are placed on the same radius.'),new Ha),w4n))),u2(n,w4n,g3n,mpn(xjt)),u2(n,w4n,vZn,mpn(Kjt)),u2(n,w4n,PZn,mpn(Cjt)),u2(n,w4n,BZn,mpn(Ijt)),u2(n,w4n,SZn,mpn(Ojt)),u2(n,w4n,CZn,mpn(Pjt)),u2(n,w4n,MZn,mpn(Ajt)),u2(n,w4n,IZn,mpn(Njt)),u2(n,w4n,h4n,mpn(Mjt)),u2(n,w4n,s4n,mpn(Sjt)),u2(n,w4n,b4n,mpn($jt)),u2(n,w4n,u4n,mpn(Ljt)),u2(n,w4n,o4n,mpn(Djt)),u2(n,w4n,f4n,mpn(Rjt)),u2(n,w4n,l4n,mpn(_jt))}function eUn(n){var t;if(this.r=xV(new Pn,new Cn),this.b=new Hbn(BB(yX(FIt),290)),this.p=new Hbn(BB(yX(FIt),290)),this.i=new Hbn(BB(yX(Krt),290)),this.e=n,this.o=new wA(n.rf()),this.D=n.Df()||qy(TD(n.We((sWn(),SSt)))),this.A=BB(n.We((sWn(),KSt)),21),this.B=BB(n.We(qSt),21),this.q=BB(n.We(uPt),98),this.u=BB(n.We(fPt),21),!wMn(this.u))throw Hp(new rk("Invalid port label placement: "+this.u));if(this.v=qy(TD(n.We(bPt))),this.j=BB(n.We(DSt),21),!tLn(this.j))throw Hp(new rk("Invalid node label placement: "+this.j));this.n=BB(nkn(n,NSt),116),this.k=Gy(MD(nkn(n,OPt))),this.d=Gy(MD(nkn(n,IPt))),this.w=Gy(MD(nkn(n,RPt))),this.s=Gy(MD(nkn(n,APt))),this.t=Gy(MD(nkn(n,$Pt))),this.C=BB(nkn(n,xPt),142),this.c=2*this.d,t=!this.B.Hc((n_n(),HIt)),this.f=new Ign(0,t,0),this.g=new Ign(1,t,0),jy(this.f,(Dtn(),zit),this.g)}function iUn(n,t,i,r,c){var a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S;for(y=0,g=0,d=0,w=1,m=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));m.e!=m.i.gc();)w+=F3(new oz(ZL(dLn(p=BB(kpn(m),33)).a.Kc(),new h))),T=p.g,g=e.Math.max(g,T),b=p.f,d=e.Math.max(d,b),y+=T*b;for(u=y+2*r*r*w*(!n.a&&(n.a=new eU(UOt,n,10,11)),n.a).i,a=e.Math.sqrt(u),s=e.Math.max(a*i,g),o=e.Math.max(a/i,d),v=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));v.e!=v.i.gc();)p=BB(kpn(v),33),M=c.b+(H$n(t,26)*rYn+H$n(t,27)*cYn)*(s-p.g),S=c.b+(H$n(t,26)*rYn+H$n(t,27)*cYn)*(o-p.f),Pen(p,M),Cen(p,S);for(E=s+(c.b+c.c),j=o+(c.d+c.a),k=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));k.e!=k.i.gc();)for(l=new oz(ZL(dLn(BB(kpn(k),33)).a.Kc(),new h));dAn(l);)nAn(f=BB(U5(l),79))||BXn(f,t,E,j);KUn(n,E+=c.b+c.c,j+=c.d+c.a,!1,!0)}function rUn(n){var t,e,i,r,c,a,u,o,s,h,f;if(null==n)throw Hp(new Mk(zWn));if(s=n,o=!1,(c=n.length)>0&&(b1(0,n.length),45!=(t=n.charCodeAt(0))&&43!=t||(n=n.substr(1),--c,o=45==t)),0==c)throw Hp(new Mk(DQn+s+'"'));for(;n.length>0&&(b1(0,n.length),48==n.charCodeAt(0));)n=n.substr(1),--c;if(c>(iFn(),xtt)[10])throw Hp(new Mk(DQn+s+'"'));for(r=0;r<c;r++)if(-1==egn((b1(r,n.length),n.charCodeAt(r))))throw Hp(new Mk(DQn+s+'"'));for(f=0,a=Ltt[10],h=Ntt[10],u=j7(Dtt[10]),e=!0,(i=c%a)>0&&(f=-parseInt(n.substr(0,i),10),n=n.substr(i),c-=i,e=!1);c>=a;){if(i=parseInt(n.substr(0,a),10),n=n.substr(a),c-=a,e)e=!1;else{if(Vhn(f,u)<0)throw Hp(new Mk(DQn+s+'"'));f=cbn(f,h)}f=ibn(f,i)}if(Vhn(f,0)>0)throw Hp(new Mk(DQn+s+'"'));if(!o&&Vhn(f=j7(f),0)<0)throw Hp(new Mk(DQn+s+'"'));return f}function cUn(n,t){var e,i,r,c,a,u,o;if(ZH(),this.a=new X$(this),this.b=n,this.c=t,this.f=OU(B7((IPn(),Z$t),t)),this.f.dc())if((u=mjn(Z$t,n))==t)for(this.e=!0,this.d=new Np,this.f=new fo,this.f.Fc(S7n),BB(NHn(F7(Z$t,Utn(n)),""),26)==n&&this.f.Fc(az(Z$t,Utn(n))),r=EKn(Z$t,n).Kc();r.Ob();)switch(i=BB(r.Pb(),170),DW(B7(Z$t,i))){case 4:this.d.Fc(i);break;case 5:this.f.Gc(OU(B7(Z$t,i)))}else if(ZM(),BB(t,66).Oj())for(this.e=!0,this.f=null,this.d=new Np,a=0,o=(null==n.i&&qFn(n),n.i).length;a<o;++a)for(null==n.i&&qFn(n),e=n.i,i=a>=0&&a<e.length?e[a]:null,c=Z1(B7(Z$t,i));c;c=Z1(B7(Z$t,c)))c==t&&this.d.Fc(i);else 1==DW(B7(Z$t,t))&&u?(this.f=null,this.d=(TOn(),bLt)):(this.f=null,this.e=!0,this.d=(SQ(),new Gb(t)));else this.e=5==DW(B7(Z$t,t)),this.f.Fb(uLt)&&(this.f=uLt)}function aUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d;for(i=0,r=Pmn(n,t),b=n.s,w=n.t,h=BB(BB(h6(n.r,t),21),84).Kc();h.Ob();)if((s=BB(h.Pb(),111)).c&&!(s.c.d.c.length<=0)){switch(d=s.b.rf(),o=s.b.Xe((sWn(),aPt))?Gy(MD(s.b.We(aPt))):0,(l=(f=s.c).i).b=(u=f.n,f.e.a+u.b+u.c),l.a=(a=f.n,f.e.b+a.d+a.a),t.g){case 1:l.c=s.a?(d.a-l.b)/2:d.a+b,l.d=d.b+o+r,l9(f,(J9(),Qit)),WD(f,(G7(),crt));break;case 3:l.c=s.a?(d.a-l.b)/2:d.a+b,l.d=-o-r-l.a,l9(f,(J9(),Qit)),WD(f,(G7(),irt));break;case 2:l.c=-o-r-l.b,s.a?(c=n.v?l.a:BB(xq(f.d,0),181).rf().b,l.d=(d.b-c)/2):l.d=d.b+w,l9(f,(J9(),Jit)),WD(f,(G7(),rrt));break;case 4:l.c=d.a+o+r,s.a?(c=n.v?l.a:BB(xq(f.d,0),181).rf().b,l.d=(d.b-c)/2):l.d=d.b+w,l9(f,(J9(),Yit)),WD(f,(G7(),rrt))}(t==(kUn(),sIt)||t==SIt)&&(i=e.Math.max(i,l.a))}i>0&&(BB(oV(n.b,t),124).a.b=i)}function uUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(OTn(t,"Comment pre-processing",1),e=0,o=new Wb(n.a);o.a<o.c.c.length;)if(qy(TD(mMn(u=BB(n0(o),10),(HXn(),Tdt))))){for(++e,r=0,i=null,s=null,w=new Wb(u.j);w.a<w.c.c.length;)r+=(l=BB(n0(w),11)).e.c.length+l.g.c.length,1==l.e.c.length&&(s=(i=BB(xq(l.e,0),17)).c),1==l.g.c.length&&(s=(i=BB(xq(l.g,0),17)).d);if(1!=r||s.e.c.length+s.g.c.length!=1||qy(TD(mMn(s.i,Tdt)))){for(g=new Np,b=new Wb(u.j);b.a<b.c.c.length;){for(f=new Wb((l=BB(n0(b),11)).g);f.a<f.c.c.length;)0==(h=BB(n0(f),17)).d.g.c.length||(g.c[g.c.length]=h);for(a=new Wb(l.e);a.a<a.c.c.length;)0==(c=BB(n0(a),17)).c.e.c.length||(g.c[g.c.length]=c)}for(d=new Wb(g);d.a<d.c.c.length;)tBn(BB(n0(d),17),!0)}else nXn(u,i,s,s.i),AU(o)}t.n&&OH(t,"Found "+e+" comment boxes"),HSn(t)}function oUn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d;if(l=Gy(MD(mMn(n,(HXn(),Cpt)))),b=Gy(MD(mMn(n,Ipt))),f=Gy(MD(mMn(n,Spt))),u=n.o,a=(c=BB(xq(n.j,0),11)).n,d=TPn(c,f)){if(t.Hc((lIn(),eIt)))switch(BB(mMn(n,(hWn(),Qft)),61).g){case 1:d.c=(u.a-d.b)/2-a.a,d.d=b;break;case 3:d.c=(u.a-d.b)/2-a.a,d.d=-b-d.a;break;case 2:e&&0==c.e.c.length&&0==c.g.c.length?(h=i?d.a:BB(xq(c.f,0),70).o.b,d.d=(u.b-h)/2-a.b):d.d=u.b+b-a.b,d.c=-l-d.b;break;case 4:e&&0==c.e.c.length&&0==c.g.c.length?(h=i?d.a:BB(xq(c.f,0),70).o.b,d.d=(u.b-h)/2-a.b):d.d=u.b+b-a.b,d.c=l}else if(t.Hc(rIt))switch(BB(mMn(n,(hWn(),Qft)),61).g){case 1:case 3:d.c=a.a+l;break;case 2:case 4:e&&!c.c?(h=i?d.a:BB(xq(c.f,0),70).o.b,d.d=(u.b-h)/2-a.b):d.d=a.b+b}for(r=d.d,s=new Wb(c.f);s.a<s.c.c.length;)(w=(o=BB(n0(s),70)).n).a=d.c,w.b=r,r+=o.o.b+f}}function sUn(){RO(wLt,new Vs),RO(zLt,new ah),RO(ULt,new ph),RO(XLt,new Ch),RO(Qtt,new $h),RO(Gk(NNt,1),new Lh),RO(ktt,new Nh),RO(Ttt,new xh),RO(Qtt,new _s),RO(Qtt,new Fs),RO(Qtt,new Bs),RO(Ptt,new Hs),RO(Qtt,new qs),RO(Rnt,new Gs),RO(Rnt,new zs),RO(Qtt,new Us),RO(Ctt,new Xs),RO(Qtt,new Ws),RO(Qtt,new Qs),RO(Qtt,new Ys),RO(Qtt,new Js),RO(Qtt,new Zs),RO(Gk(NNt,1),new nh),RO(Qtt,new th),RO(Qtt,new eh),RO(Rnt,new ih),RO(Rnt,new rh),RO(Qtt,new ch),RO(Att,new uh),RO(Qtt,new oh),RO(Rtt,new sh),RO(Qtt,new hh),RO(Qtt,new fh),RO(Qtt,new lh),RO(Qtt,new bh),RO(Rnt,new wh),RO(Rnt,new dh),RO(Qtt,new gh),RO(Qtt,new vh),RO(Qtt,new mh),RO(Qtt,new yh),RO(Qtt,new kh),RO(Qtt,new jh),RO(_tt,new Eh),RO(Qtt,new Th),RO(Qtt,new Mh),RO(Qtt,new Sh),RO(_tt,new Ph),RO(Rtt,new Ih),RO(Qtt,new Oh),RO(Att,new Ah)}function hUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if((f=t.length)>0&&(b1(0,t.length),64!=(u=t.charCodeAt(0)))){if(37==u&&(o=!1,0!=(h=t.lastIndexOf("%"))&&(h==f-1||(b1(h+1,t.length),o=46==t.charCodeAt(h+1))))){if(v=mK("%",a=t.substr(1,h-1))?null:$Un(a),i=0,o)try{i=l_n(t.substr(h+2),_Vn,DWn)}catch(m){throw cL(m=lun(m),127)?Hp(new L7(m)):Hp(m)}for(d=Ern(n.Wg());d.Ob();)if(cL(b=Man(d),510)&&(p=(r=BB(b,590)).d,(null==v?null==p:mK(v,p))&&0==i--))return r;return null}if(l=-1==(s=t.lastIndexOf("."))?t:t.substr(0,s),e=0,-1!=s)try{e=l_n(t.substr(s+1),_Vn,DWn)}catch(m){if(!cL(m=lun(m),127))throw Hp(m);l=t}for(l=mK("%",l)?null:$Un(l),w=Ern(n.Wg());w.Ob();)if(cL(b=Man(w),191)&&(g=(c=BB(b,191)).ne(),(null==l?null==g:mK(l,g))&&0==e--))return c;return null}return _qn(n,t)}function fUn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;for(m=new Np,f=new Wb(n.b);f.a<f.c.c.length;)for(w=new Wb(BB(n0(f),29).a);w.a<w.c.c.length;)if((l=BB(n0(w),10)).k==(uSn(),Mut)&&Lx(l,(hWn(),Vft))){for(d=null,p=null,g=null,j=new Wb(l.j);j.a<j.c.c.length;)switch((k=BB(n0(j),11)).j.g){case 4:d=k;break;case 2:p=k;break;default:g=k}for(s=new Kj((v=BB(xq(g.g,0),17)).a),UR(o=new wA(g.n),l.n),nX(spn(s,0),o),y=Jon(v.a),UR(h=new wA(g.n),l.n),r5(y,h,y.c.b,y.c),E=BB(mMn(l,Vft),10),T=BB(xq(E.j,0),11),c=0,u=(i=BB(Qgn(d.e,x8(yut,c1n,17,0,0,1)),474)).length;c<u;++c)MZ(t=i[c],T),Wsn(t.a,t.a.b,s);for(r=0,a=(e=Z0(p.g)).length;r<a;++r)SZ(t=e[r],T),Wsn(t.a,0,y);SZ(v,null),MZ(v,null),m.c[m.c.length]=l}for(b=new Wb(m);b.a<b.c.c.length;)PZ(l=BB(n0(b),10),null)}function lUn(){var n,t,e;for(lUn=O,new knn(1,0),new knn(10,0),new knn(0,0),Htt=x8(iet,sVn,240,11,0,1),qtt=x8(ONt,WVn,25,100,15,1),Gtt=Pun(Gk(xNt,1),qQn,25,15,[1,5,25,125,625,3125,15625,78125,390625,1953125,9765625,48828125,244140625,1220703125,6103515625,30517578125,152587890625,762939453125,3814697265625,19073486328125,95367431640625,476837158203125,0x878678326eac9]),ztt=x8(ANt,hQn,25,Gtt.length,15,1),Utt=Pun(Gk(xNt,1),qQn,25,15,[1,10,100,VVn,1e4,GQn,1e6,1e7,1e8,AQn,1e10,1e11,1e12,1e13,1e14,1e15,1e16]),Xtt=x8(ANt,hQn,25,Utt.length,15,1),Wtt=x8(iet,sVn,240,11,0,1),n=0;n<Wtt.length;n++)Htt[n]=new knn(n,0),Wtt[n]=new knn(0,n),qtt[n]=48;for(;n<qtt.length;n++)qtt[n]=48;for(e=0;e<ztt.length;e++)ztt[e]=aIn(Gtt[e]);for(t=0;t<Xtt.length;t++)Xtt[t]=aIn(Utt[t]);$On()}function bUn(){function n(){this.obj=this.createObject()}return n.prototype.createObject=function(n){return Object.create(null)},n.prototype.get=function(n){return this.obj[n]},n.prototype.set=function(n,t){this.obj[n]=t},n.prototype[iYn]=function(n){delete this.obj[n]},n.prototype.keys=function(){return Object.getOwnPropertyNames(this.obj)},n.prototype.entries=function(){var n=this.keys(),t=this,e=0;return{next:function(){if(e>=n.length)return{done:!0};var i=n[e++];return{value:[i,t.get(i)],done:!1}}}},zDn()||(n.prototype.createObject=function(){return{}},n.prototype.get=function(n){return this.obj[":"+n]},n.prototype.set=function(n,t){this.obj[":"+n]=t},n.prototype[iYn]=function(n){delete this.obj[":"+n]},n.prototype.keys=function(){var n=[];for(var t in this.obj)58==t.charCodeAt(0)&&n.push(t.substring(1));return n}),n}function wUn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d;if(PFn(),null==n)return null;if(0==(f=8*n.length))return"";for(l=f/24|0,c=null,c=x8(ONt,WVn,25,4*(0!=(u=f%24)?l+1:l),15,1),s=0,h=0,t=0,e=0,i=0,a=0,r=0,o=0;o<l;o++)t=n[r++],h=(15&(e=n[r++]))<<24>>24,s=(3&t)<<24>>24,b=0==(-128&t)?t>>2<<24>>24:(t>>2^192)<<24>>24,w=0==(-128&e)?e>>4<<24>>24:(e>>4^240)<<24>>24,d=0==(-128&(i=n[r++]))?i>>6<<24>>24:(i>>6^252)<<24>>24,c[a++]=VLt[b],c[a++]=VLt[w|s<<4],c[a++]=VLt[h<<2|d],c[a++]=VLt[63&i];return 8==u?(s=(3&(t=n[r]))<<24>>24,b=0==(-128&t)?t>>2<<24>>24:(t>>2^192)<<24>>24,c[a++]=VLt[b],c[a++]=VLt[s<<4],c[a++]=61,c[a++]=61):16==u&&(t=n[r],h=(15&(e=n[r+1]))<<24>>24,s=(3&t)<<24>>24,b=0==(-128&t)?t>>2<<24>>24:(t>>2^192)<<24>>24,w=0==(-128&e)?e>>4<<24>>24:(e>>4^240)<<24>>24,c[a++]=VLt[b],c[a++]=VLt[w|s<<4],c[a++]=VLt[h<<2],c[a++]=61),Bdn(c,0,c.length)}function dUn(n,t){var i,r,c,a,u,o;if(0==n.e&&n.p>0&&(n.p=-(n.p-1)),n.p>_Vn&&e4(t,n.p-sQn),u=t.q.getDate(),FJ(t,1),n.k>=0&&vZ(t,n.k),n.c>=0?FJ(t,n.c):n.k>=0?(r=35-new von(t.q.getFullYear()-sQn,t.q.getMonth(),35).q.getDate(),FJ(t,e.Math.min(r,u))):FJ(t,u),n.f<0&&(n.f=t.q.getHours()),n.b>0&&n.f<12&&(n.f+=12),aL(t,24==n.f&&n.g?0:n.f),n.j>=0&&g6(t,n.j),n.n>=0&&U8(t,n.n),n.i>=0&&dO(t,rbn(cbn(Ojn(fan(t.q.getTime()),VVn),VVn),n.i)),n.a&&(e4(c=new AT,c.q.getFullYear()-sQn-80),sS(fan(t.q.getTime()),fan(c.q.getTime()))&&e4(t,c.q.getFullYear()-sQn+100)),n.d>=0)if(-1==n.c)(i=(7+n.d-t.q.getDay())%7)>3&&(i-=7),o=t.q.getMonth(),FJ(t,t.q.getDate()+i),t.q.getMonth()!=o&&FJ(t,t.q.getDate()+(i>0?-7:7));else if(t.q.getDay()!=n.d)return!1;return n.o>_Vn&&(a=t.q.getTimezoneOffset(),dO(t,rbn(fan(t.q.getTime()),60*(n.o-a)*VVn))),!0}function gUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;if(cL(r=mMn(t,(hWn(),dlt)),239)){for(b=BB(r,33),w=t.e,f=new wA(t.c),c=t.d,f.a+=c.b,f.b+=c.d,SN(BB(ZAn(b,(HXn(),qgt)),174),(n_n(),qIt))&&(Ol(l=BB(ZAn(b,zgt),116),c.a),_l(l,c.d),Al(l,c.b),Fl(l,c.c)),e=new Np,s=new Wb(t.a);s.a<s.c.c.length;)for(cL(mMn(u=BB(n0(s),10),dlt),239)?CUn(u,f):cL(mMn(u,dlt),186)&&!w&&SA(i=BB(mMn(u,dlt),118),(g=yFn(t,u,i.g,i.f)).a,g.b),d=new Wb(u.j);d.a<d.c.c.length;)JT(AV(new Rq(null,new w1(BB(n0(d),11).g,16)),new Qw(u)),new Yw(e));if(w)for(d=new Wb(w.j);d.a<d.c.c.length;)JT(AV(new Rq(null,new w1(BB(n0(d),11).g,16)),new Jw(w)),new Zw(e));for(p=BB(ZAn(b,Zdt),218),a=new Wb(e);a.a<a.c.c.length;)pzn(BB(n0(a),17),p,f);for(m_n(t),o=new Wb(t.a);o.a<o.c.c.length;)(h=(u=BB(n0(o),10)).e)&&gUn(n,h)}}function pUn(n){NM(n,new MTn(mj(dj(vj(wj(pj(gj(new du,gZn),"ELK Force"),"Force-based algorithm provided by the Eclipse Layout Kernel. Implements methods that follow physical analogies by simulating forces that move the nodes into a balanced distribution. Currently the original Eades model and the Fruchterman - Reingold model are supported."),new dt),gZn),EG((hAn(),tAt),Pun(Gk(aAt,1),$Vn,237,0,[ZOt]))))),u2(n,gZn,pZn,iln(1)),u2(n,gZn,vZn,80),u2(n,gZn,mZn,5),u2(n,gZn,VJn,dZn),u2(n,gZn,yZn,iln(1)),u2(n,gZn,kZn,(hN(),!0)),u2(n,gZn,QJn,Qct),u2(n,gZn,jZn,mpn(Hct)),u2(n,gZn,EZn,mpn(Yct)),u2(n,gZn,TZn,!1),u2(n,gZn,MZn,mpn(Wct)),u2(n,gZn,SZn,mpn(Xct)),u2(n,gZn,PZn,mpn(Uct)),u2(n,gZn,CZn,mpn(zct)),u2(n,gZn,IZn,mpn(Jct)),u2(n,gZn,oZn,mpn(Gct)),u2(n,gZn,fZn,mpn(aat)),u2(n,gZn,sZn,mpn(qct)),u2(n,gZn,bZn,mpn(tat)),u2(n,gZn,hZn,mpn(eat))}function vUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w;if(!BB(BB(h6(n.r,t),21),84).dc()){if(s=(u=BB(oV(n.b,t),124)).i,o=u.n,f=PDn(n,t),r=s.b-o.b-o.c,c=u.a.a,a=s.c+o.b,w=n.w,f!=(cpn(),BCt)&&f!=qCt||1!=BB(BB(h6(n.r,t),21),84).gc()||(c=f==BCt?c-2*n.w:c,f=FCt),r<c&&!n.B.Hc((n_n(),WIt)))f==BCt?a+=w+=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()+1):w+=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()-1);else switch(r<c&&(c=f==BCt?c-2*n.w:c,f=FCt),f.g){case 3:a+=(r-c)/2;break;case 4:a+=r-c;break;case 0:i=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()+1),a+=w+=e.Math.max(0,i);break;case 1:i=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()-1),w+=e.Math.max(0,i)}for(b=BB(BB(h6(n.r,t),21),84).Kc();b.Ob();)(l=BB(b.Pb(),111)).e.a=a+l.d.b,l.e.b=(h=l.b).Xe((sWn(),aPt))?h.Hf()==(kUn(),sIt)?-h.rf().b-Gy(MD(h.We(aPt))):Gy(MD(h.We(aPt))):h.Hf()==(kUn(),sIt)?-h.rf().b:0,a+=l.d.b+l.b.rf().a+l.d.c+w}}function mUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d;if(!BB(BB(h6(n.r,t),21),84).dc()){if(s=(u=BB(oV(n.b,t),124)).i,o=u.n,l=PDn(n,t),r=s.a-o.d-o.a,c=u.a.b,a=s.d+o.d,d=n.w,h=n.o.a,l!=(cpn(),BCt)&&l!=qCt||1!=BB(BB(h6(n.r,t),21),84).gc()||(c=l==BCt?c-2*n.w:c,l=FCt),r<c&&!n.B.Hc((n_n(),WIt)))l==BCt?a+=d+=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()+1):d+=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()-1);else switch(r<c&&(c=l==BCt?c-2*n.w:c,l=FCt),l.g){case 3:a+=(r-c)/2;break;case 4:a+=r-c;break;case 0:i=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()+1),a+=d+=e.Math.max(0,i);break;case 1:i=(r-c)/(BB(BB(h6(n.r,t),21),84).gc()-1),d+=e.Math.max(0,i)}for(w=BB(BB(h6(n.r,t),21),84).Kc();w.Ob();)(b=BB(w.Pb(),111)).e.a=(f=b.b).Xe((sWn(),aPt))?f.Hf()==(kUn(),CIt)?-f.rf().a-Gy(MD(f.We(aPt))):h+Gy(MD(f.We(aPt))):f.Hf()==(kUn(),CIt)?-f.rf().a:h,b.e.b=a+b.d.d,a+=b.d.d+b.b.rf().b+b.d.a+d}}function yUn(n){var t,i,r,c,a,u,o,s,f,l,b,w,d,g,p;for(n.n=Gy(MD(mMn(n.g,(HXn(),Opt)))),n.e=Gy(MD(mMn(n.g,Tpt))),n.i=n.g.b.c.length,o=n.i-1,w=0,n.j=0,n.k=0,n.a=u6(x8(Att,sVn,19,n.i,0,1)),n.b=u6(x8(Ptt,sVn,333,n.i,7,1)),u=new Wb(n.g.b);u.a<u.c.c.length;){for((c=BB(n0(u),29)).p=o,b=new Wb(c.a);b.a<b.c.c.length;)(l=BB(n0(b),10)).p=w,++w;--o}for(n.f=x8(ANt,hQn,25,w,15,1),n.c=kq(ANt,[sVn,hQn],[48,25],15,[w,3],2),n.o=new Np,n.p=new Np,t=0,n.d=0,a=new Wb(n.g.b);a.a<a.c.c.length;){for(o=(c=BB(n0(a),29)).p,r=0,p=0,s=c.a.c.length,f=0,b=new Wb(c.a);b.a<b.c.c.length;)w=(l=BB(n0(b),10)).p,n.f[w]=l.c.p,f+=l.o.b+n.n,i=F3(new oz(ZL(fbn(l).a.Kc(),new h))),g=F3(new oz(ZL(lbn(l).a.Kc(),new h))),n.c[w][0]=g-i,n.c[w][1]=i,n.c[w][2]=g,r+=i,p+=g,i>0&&WB(n.p,l),WB(n.o,l);d=s+(t-=r),f+=t*n.e,c5(n.a,o,iln(d)),c5(n.b,o,f),n.j=e.Math.max(n.j,d),n.k=e.Math.max(n.k,f),n.d+=t,t+=p}}function kUn(){var n;kUn=O,PIt=new WC(hJn,0),sIt=new WC(mJn,1),oIt=new WC(yJn,2),SIt=new WC(kJn,3),CIt=new WC(jJn,4),SQ(),wIt=new Ak(new YK(n=BB(Vj(FIt),9),BB(SR(n,n.length),9),0)),dIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[]))),hIt=ffn(EG(oIt,Pun(Gk(FIt,1),YZn,61,0,[]))),EIt=ffn(EG(SIt,Pun(Gk(FIt,1),YZn,61,0,[]))),MIt=ffn(EG(CIt,Pun(Gk(FIt,1),YZn,61,0,[]))),yIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[SIt]))),bIt=ffn(EG(oIt,Pun(Gk(FIt,1),YZn,61,0,[CIt]))),jIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[CIt]))),gIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[oIt]))),TIt=ffn(EG(SIt,Pun(Gk(FIt,1),YZn,61,0,[CIt]))),fIt=ffn(EG(oIt,Pun(Gk(FIt,1),YZn,61,0,[SIt]))),mIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[oIt,CIt]))),lIt=ffn(EG(oIt,Pun(Gk(FIt,1),YZn,61,0,[SIt,CIt]))),kIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[SIt,CIt]))),pIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[oIt,SIt]))),vIt=ffn(EG(sIt,Pun(Gk(FIt,1),YZn,61,0,[oIt,SIt,CIt])))}function jUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if(0!=t.b){for(l=new YT,a=null,b=null,i=CJ(e.Math.floor(e.Math.log(t.b)*e.Math.LOG10E)+1),u=0,v=spn(t,0);v.b!=v.d.c;)for(g=BB(b3(v),86),GI(b)!==GI(mMn(g,(qqn(),rkt)))&&(b=SD(mMn(g,rkt)),u=0),a=null!=b?b+d0(u++,i):d0(u++,i),hon(g,rkt,a),d=new wg(spn(new bg(g).a.d,0));EE(d.a);)r5(l,w=BB(b3(d.a),188).c,l.c.b,l.c),hon(w,rkt,a);for(f=new xp,c=0;c<a.length-i;c++)for(p=spn(t,0);p.b!=p.d.c;)mZ(f,o=fx(SD(mMn(g=BB(b3(p),86),(qqn(),rkt))),0,c+1),iln(null!=(null==o?qI(AY(f.f,null)):hS(f.g,o))?BB(null==o?qI(AY(f.f,null)):hS(f.g,o),19).a+1:1));for(h=new usn(new Pb(f).a);h.b;)s=ten(h),r=iln(null!=RX(n.a,s.cd())?BB(RX(n.a,s.cd()),19).a:0),mZ(n.a,SD(s.cd()),iln(BB(s.dd(),19).a+r.a)),(!(r=BB(RX(n.b,s.cd()),19))||r.a<BB(s.dd(),19).a)&&mZ(n.b,SD(s.cd()),BB(s.dd(),19));jUn(n,l)}}function EUn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(OTn(i,"Interactive node layering",1),r=new Np,w=new Wb(t.a);w.a<w.c.c.length;){for(s=(h=(l=BB(n0(w),10)).n.a)+l.o.a,s=e.Math.max(h+1,s),v=new M2(r,0),c=null;v.b<v.d.gc();){if(Px(v.b<v.d.gc()),(g=BB(v.d.Xb(v.c=v.b++),569)).c>=s){Px(v.b>0),v.a.Xb(v.c=--v.b);break}g.a>h&&(c?(gun(c.b,g.b),c.a=e.Math.max(c.a,g.a),fW(v)):(WB(g.b,l),g.c=e.Math.min(g.c,h),g.a=e.Math.max(g.a,s),c=g))}c||((c=new im).c=h,c.a=s,yR(v,c),WB(c.b,l))}for(o=t.b,f=0,p=new Wb(r);p.a<p.c.c.length;)for(g=BB(n0(p),569),(a=new HX(t)).p=f++,o.c[o.c.length]=a,d=new Wb(g.b);d.a<d.c.c.length;)PZ(l=BB(n0(d),10),a),l.p=0;for(b=new Wb(t.a);b.a<b.c.c.length;)0==(l=BB(n0(b),10)).p&&CDn(n,l,t);for(u=new M2(o,0);u.b<u.d.gc();)0==(Px(u.b<u.d.gc()),BB(u.d.Xb(u.c=u.b++),29)).a.c.length&&fW(u);t.a.c=x8(Ant,HWn,1,0,5,1),HSn(i)}function TUn(n,t,e){var i,r,c,a,u,o,s,h,f,l;if(0!=t.e.c.length&&0!=e.e.c.length){if((i=BB(xq(t.e,0),17).c.i)==(a=BB(xq(e.e,0),17).c.i))return E$(BB(mMn(BB(xq(t.e,0),17),(hWn(),wlt)),19).a,BB(mMn(BB(xq(e.e,0),17),wlt),19).a);for(f=0,l=(h=n.a).length;f<l;++f){if((s=h[f])==i)return 1;if(s==a)return-1}}return 0!=t.g.c.length&&0!=e.g.c.length?(c=BB(mMn(t,(hWn(),llt)),10),o=BB(mMn(e,llt),10),r=0,u=0,Lx(BB(xq(t.g,0),17),wlt)&&(r=BB(mMn(BB(xq(t.g,0),17),wlt),19).a),Lx(BB(xq(e.g,0),17),wlt)&&(u=BB(mMn(BB(xq(t.g,0),17),wlt),19).a),c&&c==o?qy(TD(mMn(BB(xq(t.g,0),17),Clt)))&&!qy(TD(mMn(BB(xq(e.g,0),17),Clt)))?1:!qy(TD(mMn(BB(xq(t.g,0),17),Clt)))&&qy(TD(mMn(BB(xq(e.g,0),17),Clt)))||r<u?-1:r>u?1:0:(n.b&&(n.b._b(c)&&(r=BB(n.b.xc(c),19).a),n.b._b(o)&&(u=BB(n.b.xc(o),19).a)),r<u?-1:r>u?1:0)):0!=t.e.c.length&&0!=e.g.c.length?1:-1}function MUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(OTn(t,O1n,1),w=new Np,y=new Np,s=new Wb(n.b);s.a<s.c.c.length;)for(g=-1,l=0,b=(f=n2((o=BB(n0(s),29)).a)).length;l<b;++l)if(++g,(h=f[l]).k==(uSn(),Cut)&&vA(BB(mMn(h,(HXn(),ept)),98))){for(LK(BB(mMn(h,(HXn(),ept)),98))||HNn(h),hon(h,(hWn(),rlt),h),w.c=x8(Ant,HWn,1,0,5,1),y.c=x8(Ant,HWn,1,0,5,1),e=new Np,qrn(v=new YT,DSn(h,(kUn(),sIt))),AXn(n,v,w,y,e),u=g,k=h,c=new Wb(w);c.a<c.c.c.length;)Qyn(i=BB(n0(c),10),u,o),++g,hon(i,rlt,h),a=BB(xq(i.j,0),11),d=BB(mMn(a,dlt),11),qy(TD(mMn(d,jdt)))||BB(mMn(i,clt),15).Fc(k);for(yQ(v),p=DSn(h,SIt).Kc();p.Ob();)r5(v,BB(p.Pb(),11),v.a,v.a.a);for(AXn(n,v,y,null,e),m=h,r=new Wb(y);r.a<r.c.c.length;)Qyn(i=BB(n0(r),10),++g,o),hon(i,rlt,h),a=BB(xq(i.j,0),11),d=BB(mMn(a,dlt),11),qy(TD(mMn(d,jdt)))||BB(mMn(m,clt),15).Fc(i);0==e.c.length||hon(h,xft,e)}HSn(t)}function SUn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P;for(h=BB(mMn(n,(Mrn(),sat)),33),d=DWn,g=DWn,b=_Vn,w=_Vn,v=new Wb(n.e);v.a<v.c.c.length;)E=(p=BB(n0(v),144)).d,T=p.e,d=e.Math.min(d,E.a-T.a/2),g=e.Math.min(g,E.b-T.b/2),b=e.Math.max(b,E.a+T.a/2),w=e.Math.max(w,E.b+T.b/2);for(k=new xC((j=BB(ZAn(h,(fRn(),Vct)),116)).b-d,j.d-g),o=new Wb(n.e);o.a<o.c.c.length;)cL(y=mMn(u=BB(n0(o),144),sat),239)&&SA(f=BB(y,33),(m=UR(u.d,k)).a-f.g/2,m.b-f.f/2);for(r=new Wb(n.c);r.a<r.c.c.length;)i=BB(n0(r),282),s=cDn(BB(mMn(i,sat),79),!0,!0),Ukn(S=XR(B$(i.d.d),i.c.d),i.c.e.a,i.c.e.b),CA(s,(M=UR(S,i.c.d)).a,M.b),Ukn(P=XR(B$(i.c.d),i.d.d),i.d.e.a,i.d.e.b),PA(s,(t=UR(P,i.d.d)).a,t.b);for(a=new Wb(n.d);a.a<a.c.c.length;)c=BB(n0(a),447),SA(BB(mMn(c,sat),137),(l=UR(c.d,k)).a,l.b);KUn(h,b-d+(j.b+j.c),w-g+(j.d+j.a),!1,!0)}function PUn(n){var t,e,i,r,c,a,u,o,s,h,f;for(e=null,u=null,(r=BB(mMn(n.b,(HXn(),igt)),376))==(A6(),Jvt)&&(e=new Np,u=new Np),a=new Wb(n.d);a.a<a.c.c.length;)if((c=BB(n0(a),101)).i)switch(c.e.g){case 0:t=BB(u4(new QT(c.b)),61),r==Jvt&&t==(kUn(),sIt)?e.c[e.c.length]=c:r==Jvt&&t==(kUn(),SIt)?u.c[u.c.length]=c:Nmn(c,t);break;case 1:o=c.a.d.j,s=c.c.d.j,o==(kUn(),sIt)?bU(c,sIt,(Oun(),mst),c.a):s==sIt?bU(c,sIt,(Oun(),yst),c.c):o==SIt?bU(c,SIt,(Oun(),yst),c.a):s==SIt&&bU(c,SIt,(Oun(),mst),c.c);break;case 2:case 3:SN(i=c.b,(kUn(),sIt))?SN(i,SIt)?SN(i,CIt)?SN(i,oIt)||bU(c,sIt,(Oun(),yst),c.c):bU(c,sIt,(Oun(),mst),c.a):bU(c,sIt,(Oun(),vst),null):bU(c,SIt,(Oun(),vst),null);break;case 4:h=c.a.d.j,f=c.a.d.j,h==(kUn(),sIt)||f==sIt?bU(c,SIt,(Oun(),vst),null):bU(c,sIt,(Oun(),vst),null)}e&&(0==e.c.length||QFn(e,(kUn(),sIt)),0==u.c.length||QFn(u,(kUn(),SIt)))}function CUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;for(i=BB(mMn(n,(hWn(),dlt)),33),b=BB(mMn(n,(HXn(),Bdt)),19).a,c=BB(mMn(n,jgt),19).a,Ypn(i,Bdt,iln(b)),Ypn(i,jgt,iln(c)),Pen(i,n.n.a+t.a),Cen(i,n.n.b+t.b),(0!=BB(ZAn(i,Fgt),174).gc()||n.e||GI(mMn(vW(n),_gt))===GI((Nvn(),mvt))&&pA((bvn(),(n.q?n.q:(SQ(),SQ(),het))._b(Rgt)?BB(mMn(n,Rgt),197):BB(mMn(vW(n),Kgt),197))))&&(Sen(i,n.o.a),Men(i,n.o.b)),f=new Wb(n.j);f.a<f.c.c.length;)cL(w=mMn(s=BB(n0(f),11),dlt),186)&&(SA(r=BB(w,118),s.n.a,s.n.b),Ypn(r,upt,s.j));for(l=0!=BB(mMn(n,$gt),174).gc(),o=new Wb(n.b);o.a<o.c.c.length;)a=BB(n0(o),70),(l||0!=BB(mMn(a,$gt),174).gc())&&(MA(e=BB(mMn(a,dlt),137),a.o.a,a.o.b),SA(e,a.n.a,a.n.b));if(!Hz(BB(mMn(n,cpt),21)))for(h=new Wb(n.j);h.a<h.c.c.length;)for(u=new Wb((s=BB(n0(h),11)).f);u.a<u.c.c.length;)a=BB(n0(u),70),Sen(e=BB(mMn(a,dlt),137),a.o.a),Men(e,a.o.b),SA(e,a.n.a,a.n.b)}function IUn(n){var t,e,i,r,c;switch(OY(n,i8n),(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i+(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i){case 0:throw Hp(new _y("The edge must have at least one source or target."));case 1:return 0==(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i?JJ(PTn(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))):JJ(PTn(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)))}if(1==(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b).i&&1==(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c).i){if(r=PTn(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)),c=PTn(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82)),JJ(r)==JJ(c))return JJ(r);if(r==JJ(c))return r;if(c==JJ(r))return c}for(t=PTn(BB(U5(i=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),(!n.c&&(n.c=new hK(KOt,n,5,8)),n.c)])))),82));dAn(i);)if((e=PTn(BB(U5(i),82)))!=t&&!Ctn(e,t))if(JJ(e)==JJ(t))t=JJ(e);else if(!(t=B$n(t,e)))return null;return t}function OUn(n,t,i){var r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j;for(OTn(i,"Polyline edge routing",1),v=Gy(MD(mMn(t,(HXn(),tgt)))),d=Gy(MD(mMn(t,Apt))),c=Gy(MD(mMn(t,kpt))),r=e.Math.min(1,c/d),k=0,s=0,0!=t.b.c.length&&(k=.4*r*(j=hLn(BB(xq(t.b,0),29)))),o=new M2(t.b,0);o.b<o.d.gc();){for(Px(o.b<o.d.gc()),(a=VI(u=BB(o.d.Xb(o.c=o.b++),29),jyt))&&k>0&&(k-=d),Tqn(u,k),l=0,w=new Wb(u.a);w.a<w.c.c.length;){for(f=0,p=new oz(ZL(lbn(b=BB(n0(w),10)).a.Kc(),new h));dAn(p);)m=g1((g=BB(U5(p),17)).c).b,y=g1(g.d).b,u!=g.d.i.c||b5(g)||(VIn(g,k,.4*r*e.Math.abs(m-y)),g.c.j==(kUn(),CIt)&&(m=0,y=0)),f=e.Math.max(f,e.Math.abs(y-m));switch(b.k.g){case 0:case 4:case 1:case 3:case 5:Gqn(n,b,k,v)}l=e.Math.max(l,f)}o.b<o.d.gc()&&(j=hLn((Px(o.b<o.d.gc()),BB(o.d.Xb(o.c=o.b++),29))),l=e.Math.max(l,j),Px(o.b>0),o.a.Xb(o.c=--o.b)),s=.4*r*l,!a&&o.b<o.d.gc()&&(s+=d),k+=u.c.a+s}n.a.a.$b(),t.f.a=k,HSn(i)}function AUn(n){var t,e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v;for(s=new xp,u=new pJ,i=new Wb(n.a.a.b);i.a<i.c.c.length;)if(o=f2(t=BB(n0(i),57)))jCn(s.f,o,t);else if(v=f3(t))for(r=new Wb(v.k);r.a<r.c.c.length;)JIn(u,BB(n0(r),17),t);for(e=new Wb(n.a.a.b);e.a<e.c.c.length;)if(o=f2(t=BB(n0(e),57)))for(a=new oz(ZL(lbn(o).a.Kc(),new h));dAn(a);)if(!b5(c=BB(U5(a),17))&&(w=c.c,p=c.d,!(kUn(),yIt).Hc(c.c.j)||!yIt.Hc(c.d.j))){if(d=BB(RX(s,c.d.i),57),UNn(aM(cM(uM(rM(new Hv,0),100),n.c[t.a.d]),n.c[d.a.d])),w.j==CIt&&$z((gcn(),w)))for(l=BB(h6(u,c),21).Kc();l.Ob();)if((f=BB(l.Pb(),57)).d.c<t.d.c){if((b=n.c[f.a.d])==(g=n.c[t.a.d]))continue;UNn(aM(cM(uM(rM(new Hv,1),100),b),g))}if(p.j==oIt&&Az((gcn(),p)))for(l=BB(h6(u,c),21).Kc();l.Ob();)if((f=BB(l.Pb(),57)).d.c>t.d.c){if((b=n.c[t.a.d])==(g=n.c[f.a.d]))continue;UNn(aM(cM(uM(rM(new Hv,1),100),b),g))}}}function $Un(n){var t,e,i,r,c,a,u,o;if(RHn(),null==n)return null;if((r=GO(n,YTn(37)))<0)return n;for(o=new lN(n.substr(0,r)),t=x8(NNt,v6n,25,4,15,1),u=0,i=0,a=n.length;r<a;r++)if(b1(r,n.length),37==n.charCodeAt(r)&&n.length>r+2&&ton((b1(r+1,n.length),n.charCodeAt(r+1)),IAt,OAt)&&ton((b1(r+2,n.length),n.charCodeAt(r+2)),IAt,OAt))if(e=CH((b1(r+1,n.length),n.charCodeAt(r+1)),(b1(r+2,n.length),n.charCodeAt(r+2))),r+=2,i>0?128==(192&e)?t[u++]=e<<24>>24:i=0:e>=128&&(192==(224&e)?(t[u++]=e<<24>>24,i=2):224==(240&e)?(t[u++]=e<<24>>24,i=3):240==(248&e)&&(t[u++]=e<<24>>24,i=4)),i>0){if(u==i){switch(u){case 2:xX(o,((31&t[0])<<6|63&t[1])&QVn);break;case 3:xX(o,((15&t[0])<<12|(63&t[1])<<6|63&t[2])&QVn)}u=0,i=0}}else{for(c=0;c<u;++c)xX(o,t[c]&QVn);u=0,o.a+=String.fromCharCode(e)}else{for(c=0;c<u;++c)xX(o,t[c]&QVn);u=0,xX(o,(b1(r,n.length),n.charCodeAt(r)))}return o.a}function LUn(n,t,e,i,r){var c,a,u;if(ynn(n,t),a=t[0],c=fV(e.c,0),u=-1,Yon(e))if(i>0){if(a+i>n.length)return!1;u=UIn(n.substr(0,a+i),t)}else u=UIn(n,t);switch(c){case 71:return u=zTn(n,a,Pun(Gk(Qtt,1),sVn,2,6,[fQn,lQn]),t),r.e=u,!0;case 77:return gDn(n,t,r,u,a);case 76:return pDn(n,t,r,u,a);case 69:return rCn(n,t,a,r);case 99:return cCn(n,t,a,r);case 97:return u=zTn(n,a,Pun(Gk(Qtt,1),sVn,2,6,["AM","PM"]),t),r.b=u,!0;case 121:return vDn(n,t,a,u,e,r);case 100:return!(u<=0||(r.c=u,0));case 83:return!(u<0)&&jwn(u,a,t[0],r);case 104:12==u&&(u=0);case 75:case 72:return!(u<0||(r.f=u,r.g=!1,0));case 107:return!(u<0||(r.f=u,r.g=!0,0));case 109:return!(u<0||(r.j=u,0));case 115:return!(u<0||(r.n=u,0));case 90:if(a<n.length&&(b1(a,n.length),90==n.charCodeAt(a)))return++t[0],r.o=0,!0;case 122:case 118:return CTn(n,a,t,r);default:return!1}}function NUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;if(b=BB(BB(h6(n.r,t),21),84),t!=(kUn(),oIt)&&t!=CIt){for(a=t==sIt?(Dan(),Nrt):(Dan(),Rrt),k=t==sIt?(G7(),crt):(G7(),irt),c=(r=(i=BB(oV(n.b,t),124)).i).c+Lon(Pun(Gk(xNt,1),qQn,25,15,[i.n.b,n.C.b,n.k])),v=r.c+r.b-Lon(Pun(Gk(xNt,1),qQn,25,15,[i.n.c,n.C.c,n.k])),u=Zk(H_(a),n.t),m=t==sIt?KQn:RQn,l=b.Kc();l.Ob();)!(h=BB(l.Pb(),111)).c||h.c.d.c.length<=0||(p=h.b.rf(),g=h.e,(d=(w=h.c).i).b=(s=w.n,w.e.a+s.b+s.c),d.a=(o=w.n,w.e.b+o.d+o.a),OY(k,uJn),w.f=k,l9(w,(J9(),Jit)),d.c=g.a-(d.b-p.a)/2,j=e.Math.min(c,g.a),E=e.Math.max(v,g.a+p.a),d.c<j?d.c=j:d.c+d.b>E&&(d.c=E-d.b),WB(u.d,new xG(d,kln(u,d))),m=t==sIt?e.Math.max(m,g.b+h.b.rf().b):e.Math.min(m,g.b));for(m+=t==sIt?n.t:-n.t,(y=Pwn((u.e=m,u)))>0&&(BB(oV(n.b,t),124).a.b=y),f=b.Kc();f.Ob();)!(h=BB(f.Pb(),111)).c||h.c.d.c.length<=0||((d=h.c.i).c-=h.e.a,d.d-=h.e.b)}else aUn(n,t)}function xUn(n){var t,e,i,r,c,a,u,o,s,f;for(t=new xp,a=new AL(n);a.e!=a.i.gc();){for(c=BB(kpn(a),33),e=new Rv,VW(Mct,c,e),f=new ut,i=BB(P4(new Rq(null,new zU(new oz(ZL(wLn(c).a.Kc(),new h)))),SG(f,m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[(qsn(),Uet)])))),83),Jen(e,BB(i.xc((hN(),!0)),14),new ot),r=BB(P4(AV(BB(i.xc(!1),15).Lc(),new st),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[Uet]))),15).Kc();r.Ob();)(s=CMn(BB(r.Pb(),79)))&&((u=BB(qI(AY(t.f,s)),21))||(u=Oxn(s),jCn(t.f,s,u)),Frn(e,u));for(i=BB(P4(new Rq(null,new zU(new oz(ZL(dLn(c).a.Kc(),new h)))),SG(f,m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[Uet])))),83),Jen(e,BB(i.xc(!0),14),new ht),o=BB(P4(AV(BB(i.xc(!1),15).Lc(),new ft),m9(new H,new B,new rn,Pun(Gk(nit,1),$Vn,132,0,[Uet]))),15).Kc();o.Ob();)(s=IMn(BB(o.Pb(),79)))&&((u=BB(qI(AY(t.f,s)),21))||(u=Oxn(s),jCn(t.f,s,u)),Frn(e,u))}}function DUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d;if(uHn(),(o=Vhn(n,0)<0)&&(n=j7(n)),0==Vhn(n,0))switch(t){case 0:return"0";case 1:return WQn;case 2:return"0.00";case 3:return"0.000";case 4:return"0.0000";case 5:return"0.00000";case 6:return"0.000000";default:return(b=new Ck).a+=t<0?"0E+":"0E",b.a+=t==_Vn?"2147483648":""+-t,b.a}f=x8(ONt,WVn,25,1+(h=18),15,1),e=h,d=n;do{s=d,d=Ojn(d,10),f[--e]=dG(rbn(48,ibn(s,cbn(d,10))))&QVn}while(0!=Vhn(d,0));if(r=ibn(ibn(ibn(h,e),t),1),0==t)return o&&(f[--e]=45),Bdn(f,e,h-e);if(t>0&&Vhn(r,-6)>=0){if(Vhn(r,0)>=0){for(c=e+dG(r),u=h-1;u>=c;u--)f[u+1]=f[u];return f[++c]=46,o&&(f[--e]=45),Bdn(f,e,h-e+1)}for(a=2;sS(a,rbn(j7(r),1));a++)f[--e]=48;return f[--e]=46,f[--e]=48,o&&(f[--e]=45),Bdn(f,e,h-e)}return w=e+1,i=h,l=new Ik,o&&(l.a+="-"),i-w>=1?(xX(l,f[e]),l.a+=".",l.a+=Bdn(f,e+1,h-e-1)):l.a+=Bdn(f,e,h-e),l.a+="E",Vhn(r,0)>0&&(l.a+="+"),l.a+=""+vz(r),l.a}function RUn(n,t,e){var i,r,c,a,u,o,s,h,f,l;if(n.e.a.$b(),n.f.a.$b(),n.c.c=x8(Ant,HWn,1,0,5,1),n.i.c=x8(Ant,HWn,1,0,5,1),n.g.a.$b(),t)for(a=new Wb(t.a);a.a<a.c.c.length;)for(h=DSn(c=BB(n0(a),10),(kUn(),oIt)).Kc();h.Ob();)for(s=BB(h.Pb(),11),TU(n.e,s),r=new Wb(s.g);r.a<r.c.c.length;)b5(i=BB(n0(r),17))||(WB(n.c,i),ppn(n,i),((u=i.c.i.k)==(uSn(),Cut)||u==Iut||u==Mut||u==Tut)&&WB(n.j,i),(f=(l=i.d).i.c)==e?TU(n.f,l):f==t?TU(n.e,l):y7(n.c,i));if(e)for(a=new Wb(e.a);a.a<a.c.c.length;){for(o=new Wb((c=BB(n0(a),10)).j);o.a<o.c.c.length;)for(r=new Wb(BB(n0(o),11).g);r.a<r.c.c.length;)b5(i=BB(n0(r),17))&&TU(n.g,i);for(h=DSn(c,(kUn(),CIt)).Kc();h.Ob();)for(s=BB(h.Pb(),11),TU(n.f,s),r=new Wb(s.g);r.a<r.c.c.length;)b5(i=BB(n0(r),17))||(WB(n.c,i),ppn(n,i),((u=i.c.i.k)==(uSn(),Cut)||u==Iut||u==Mut||u==Tut)&&WB(n.j,i),(f=(l=i.d).i.c)==e?TU(n.f,l):f==t?TU(n.e,l):y7(n.c,i))}}function KUn(n,t,i,r,c){var a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;if(p=new xC(n.g,n.f),(g=XPn(n)).a=e.Math.max(g.a,t),g.b=e.Math.max(g.b,i),E=g.a/p.a,f=g.b/p.b,k=g.a-p.a,s=g.b-p.b,r)for(u=JJ(n)?BB(ZAn(JJ(n),(sWn(),bSt)),103):BB(ZAn(n,(sWn(),bSt)),103),o=GI(ZAn(n,(sWn(),uPt)))===GI((QEn(),XCt)),m=new AL((!n.c&&(n.c=new eU(XOt,n,9,9)),n.c));m.e!=m.i.gc();)switch(v=BB(kpn(m),118),(y=BB(ZAn(v,wPt),61))==(kUn(),PIt)&&(y=OFn(v,u),Ypn(v,wPt,y)),y.g){case 1:o||Pen(v,v.i*E);break;case 2:Pen(v,v.i+k),o||Cen(v,v.j*f);break;case 3:o||Pen(v,v.i*E),Cen(v,v.j+s);break;case 4:o||Cen(v,v.j*f)}if(MA(n,g.a,g.b),c)for(b=new AL((!n.n&&(n.n=new eU(zOt,n,1,7)),n.n));b.e!=b.i.gc();)w=(l=BB(kpn(b),137)).i+l.g/2,d=l.j+l.f/2,(j=w/p.a)+(h=d/p.b)>=1&&(j-h>0&&d>=0?(Pen(l,l.i+k),Cen(l,l.j+s*h)):j-h<0&&w>=0&&(Pen(l,l.i+k*j),Cen(l,l.j+s)));return Ypn(n,(sWn(),KSt),(mdn(),new YK(a=BB(Vj(YIt),9),BB(SR(a,a.length),9),0))),new xC(E,f)}function _Un(n){var t,i,r,c,a,u,o,s,h,f,l;if(f=JJ(PTn(BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)))==JJ(PTn(BB(Wtn((!n.c&&(n.c=new hK(KOt,n,5,8)),n.c),0),82))),u=new Gj,(t=BB(ZAn(n,(Xsn(),hCt)),74))&&t.b>=2){if(0==(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)tE(),i=new co,f9((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),i);else if((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i>1)for(l=new cx((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a));l.e!=l.i.gc();)Qjn(l);VFn(t,BB(Wtn((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),0),202))}if(f)for(r=new AL((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a));r.e!=r.i.gc();)for(s=new AL((!(i=BB(kpn(r),202)).a&&(i.a=new $L(xOt,i,5)),i.a));s.e!=s.i.gc();)o=BB(kpn(s),469),u.a=e.Math.max(u.a,o.a),u.b=e.Math.max(u.b,o.b);for(a=new AL((!n.n&&(n.n=new eU(zOt,n,1,7)),n.n));a.e!=a.i.gc();)c=BB(kpn(a),137),(h=BB(ZAn(c,gCt),8))&&SA(c,h.a,h.b),f&&(u.a=e.Math.max(u.a,c.i+c.g),u.b=e.Math.max(u.b,c.j+c.f));return u}function FUn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(v=t.c.length,c=new qKn(n.a,i,null,null),E=x8(xNt,qQn,25,v,15,1),w=x8(xNt,qQn,25,v,15,1),b=x8(xNt,qQn,25,v,15,1),d=0,o=0;o<v;o++)w[o]=DWn,b[o]=_Vn;for(s=0;s<v;s++)for(l1(s,t.c.length),r=BB(t.c[s],180),E[s]=v$n(r),E[d]>E[s]&&(d=s),f=new Wb(n.a.b);f.a<f.c.c.length;)for(p=new Wb(BB(n0(f),29).a);p.a<p.c.c.length;)g=BB(n0(p),10),k=Gy(r.p[g.p])+Gy(r.d[g.p]),w[s]=e.Math.min(w[s],k),b[s]=e.Math.max(b[s],k+g.o.b);for(j=x8(xNt,qQn,25,v,15,1),h=0;h<v;h++)(l1(h,t.c.length),BB(t.c[h],180)).o==(oZ(),ryt)?j[h]=w[d]-w[h]:j[h]=b[d]-b[h];for(a=x8(xNt,qQn,25,v,15,1),l=new Wb(n.a.b);l.a<l.c.c.length;)for(y=new Wb(BB(n0(l),29).a);y.a<y.c.c.length;){for(m=BB(n0(y),10),u=0;u<v;u++)a[u]=Gy((l1(u,t.c.length),BB(t.c[u],180)).p[m.p])+Gy((l1(u,t.c.length),BB(t.c[u],180)).d[m.p])+j[u];a.sort(ien(T.prototype.te,T,[])),c.p[m.p]=(a[1]+a[2])/2,c.d[m.p]=0}return c}function BUn(n,t,e){var i,r,c,a,u;switch(i=t.i,c=n.i.o,r=n.i.d,u=n.n,a=Aon(Pun(Gk(PMt,1),sVn,8,0,[u,n.a])),n.j.g){case 1:WD(t,(G7(),irt)),i.d=-r.d-e-i.a,BB(BB(xq(t.d,0),181).We((hWn(),ult)),285)==(Xyn(),jCt)?(l9(t,(J9(),Jit)),i.c=a.a-Gy(MD(mMn(n,blt)))-e-i.b):(l9(t,(J9(),Yit)),i.c=a.a+Gy(MD(mMn(n,blt)))+e);break;case 2:l9(t,(J9(),Yit)),i.c=c.a+r.c+e,BB(BB(xq(t.d,0),181).We((hWn(),ult)),285)==(Xyn(),jCt)?(WD(t,(G7(),irt)),i.d=a.b-Gy(MD(mMn(n,blt)))-e-i.a):(WD(t,(G7(),crt)),i.d=a.b+Gy(MD(mMn(n,blt)))+e);break;case 3:WD(t,(G7(),crt)),i.d=c.b+r.a+e,BB(BB(xq(t.d,0),181).We((hWn(),ult)),285)==(Xyn(),jCt)?(l9(t,(J9(),Jit)),i.c=a.a-Gy(MD(mMn(n,blt)))-e-i.b):(l9(t,(J9(),Yit)),i.c=a.a+Gy(MD(mMn(n,blt)))+e);break;case 4:l9(t,(J9(),Jit)),i.c=-r.b-e-i.b,BB(BB(xq(t.d,0),181).We((hWn(),ult)),285)==(Xyn(),jCt)?(WD(t,(G7(),irt)),i.d=a.b-Gy(MD(mMn(n,blt)))-e-i.a):(WD(t,(G7(),crt)),i.d=a.b+Gy(MD(mMn(n,blt)))+e)}}function HUn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O;for(w=0,S=0,s=new Wb(n);s.a<s.c.c.length;)ozn(o=BB(n0(s),33)),w=e.Math.max(w,o.g),S+=o.g*o.f;for(M=Zyn(n,S/n.c.length),S+=n.c.length*M,w=e.Math.max(w,e.Math.sqrt(S*u))+i.b,I=i.b,O=i.d,b=0,f=i.b+i.c,DH(T=new YT,iln(0)),j=new YT,h=new M2(n,0);h.b<h.d.gc();)Px(h.b<h.d.gc()),C=(o=BB(h.d.Xb(h.c=h.b++),33)).g,l=o.f,I+C>w&&(a&&(fO(j,b),fO(T,iln(h.b-1))),I=i.b,O+=b+t,b=0,f=e.Math.max(f,i.b+i.c+C)),Pen(o,I),Cen(o,O),f=e.Math.max(f,I+C+i.c),b=e.Math.max(b,l),I+=C+t;if(f=e.Math.max(f,r),(P=O+b+i.a)<c&&(b+=c-P,P=c),a)for(I=i.b,h=new M2(n,0),fO(T,iln(n.c.length)),p=BB(b3(E=spn(T,0)),19).a,fO(j,b),k=spn(j,0),y=0;h.b<h.d.gc();)h.b==p&&(I=i.b,y=Gy(MD(b3(k))),p=BB(b3(E),19).a),Px(h.b<h.d.gc()),v=(o=BB(h.d.Xb(h.c=h.b++),33)).f,Men(o,y),d=y,h.b==p&&(g=f-I-i.c,m=o.g,Sen(o,g),lCn(o,new xC(g,d),new xC(m,v))),I+=o.g+t;return new xC(f,P)}function qUn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S;for(OTn(t,"Compound graph postprocessor",1),i=qy(TD(mMn(n,(HXn(),Dpt)))),o=BB(mMn(n,(hWn(),Hft)),224),f=new Rv,v=o.ec().Kc();v.Ob();){for(p=BB(v.Pb(),17),u=new t_(o.cc(p)),SQ(),m$(u,new _w(n)),j=ccn((l1(0,u.c.length),BB(u.c[0],243))),T=acn(BB(xq(u,u.c.length-1),243)),y=j.i,m=wan(T.i,y)?y.e:vW(y),l=Apn(p,u),yQ(p.a),b=null,a=new Wb(u);a.a<a.c.c.length;)c=BB(n0(a),243),OPn(g=new Gj,c.a,m),w=c.b,Wsn(r=new km,0,w.a),Ztn(r,g),k=new wA(g1(w.c)),E=new wA(g1(w.d)),UR(k,g),UR(E,g),b&&(0==r.b?d=E:(Px(0!=r.b),d=BB(r.a.a.c,8)),M=e.Math.abs(b.a-d.a)>lZn,S=e.Math.abs(b.b-d.b)>lZn,(!i&&M&&S||i&&(M||S))&&DH(p.a,k)),Frn(p.a,r),0==r.b?b=k:(Px(0!=r.b),b=BB(r.c.b.c,8)),Yan(w,l,g),acn(c)==T&&(vW(T.i)!=c.a&&OPn(g=new Gj,vW(T.i),m),hon(p,Rlt,g)),MSn(w,p,m),f.a.zc(w,f);SZ(p,j),MZ(p,T)}for(h=f.a.ec().Kc();h.Ob();)SZ(s=BB(h.Pb(),17),null),MZ(s,null);HSn(t)}function GUn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;if(1==n.gc())return BB(n.Xb(0),231);if(n.gc()<=0)return new y6;for(c=n.Kc();c.Ob();){for(i=BB(c.Pb(),231),d=0,f=DWn,l=DWn,s=_Vn,h=_Vn,w=new Wb(i.e);w.a<w.c.c.length;)b=BB(n0(w),144),d+=BB(mMn(b,(fRn(),Zct)),19).a,f=e.Math.min(f,b.d.a-b.e.a/2),l=e.Math.min(l,b.d.b-b.e.b/2),s=e.Math.max(s,b.d.a+b.e.a/2),h=e.Math.max(h,b.d.b+b.e.b/2);hon(i,(fRn(),Zct),iln(d)),hon(i,(Mrn(),oat),new xC(f,l)),hon(i,uat,new xC(s,h))}for(SQ(),n.ad(new wt),qan(g=new y6,BB(n.Xb(0),94)),o=0,m=0,a=n.Kc();a.Ob();)i=BB(a.Pb(),231),p=XR(B$(BB(mMn(i,(Mrn(),uat)),8)),BB(mMn(i,oat),8)),o=e.Math.max(o,p.a),m+=p.a*p.b;for(o=e.Math.max(o,e.Math.sqrt(m)*Gy(MD(mMn(g,(fRn(),Fct))))),y=0,k=0,u=0,t=v=Gy(MD(mMn(g,cat))),r=n.Kc();r.Ob();)i=BB(r.Pb(),231),y+(p=XR(B$(BB(mMn(i,(Mrn(),uat)),8)),BB(mMn(i,oat),8))).a>o&&(y=0,k+=u+v,u=0),VKn(g,i,y,k),t=e.Math.max(t,y+p.a),u=e.Math.max(u,p.b),y+=p.a+v;return g}function zUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;switch(h=new km,n.a.g){case 3:l=BB(mMn(t.e,(hWn(),Nlt)),15),b=BB(mMn(t.j,Nlt),15),w=BB(mMn(t.f,Nlt),15),e=BB(mMn(t.e,$lt),15),i=BB(mMn(t.j,$lt),15),r=BB(mMn(t.f,$lt),15),gun(a=new Np,l),b.Jc(new yc),gun(a,cL(b,152)?o6(BB(b,152)):cL(b,131)?BB(b,131).a:cL(b,54)?new fy(b):new CT(b)),gun(a,w),gun(c=new Np,e),gun(c,cL(i,152)?o6(BB(i,152)):cL(i,131)?BB(i,131).a:cL(i,54)?new fy(i):new CT(i)),gun(c,r),hon(t.f,Nlt,a),hon(t.f,$lt,c),hon(t.f,xlt,t.f),hon(t.e,Nlt,null),hon(t.e,$lt,null),hon(t.j,Nlt,null),hon(t.j,$lt,null);break;case 1:Frn(h,t.e.a),DH(h,t.i.n),Frn(h,ean(t.j.a)),DH(h,t.a.n),Frn(h,t.f.a);break;default:Frn(h,t.e.a),Frn(h,ean(t.j.a)),Frn(h,t.f.a)}yQ(t.f.a),Frn(t.f.a,h),SZ(t.f,t.e.c),u=BB(mMn(t.e,(HXn(),vgt)),74),s=BB(mMn(t.j,vgt),74),o=BB(mMn(t.f,vgt),74),(u||s||o)&&(PU(f=new km,o),PU(f,s),PU(f,u),hon(t.f,vgt,f)),SZ(t.j,null),MZ(t.j,null),SZ(t.e,null),MZ(t.e,null),PZ(t.a,null),PZ(t.i,null),t.g&&zUn(n,t.g)}function UUn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b,w,d,g;if(PFn(),null==n)return null;if((w=bln(c=V7(n)))%4!=0)return null;if(0==(d=w/4|0))return x8(NNt,v6n,25,0,15,1);for(f=null,t=0,e=0,i=0,r=0,a=0,u=0,o=0,s=0,b=0,l=0,h=0,f=x8(NNt,v6n,25,3*d,15,1);b<d-1;b++){if(!(VE(a=c[h++])&&VE(u=c[h++])&&VE(o=c[h++])&&VE(s=c[h++])))return null;t=WLt[a],e=WLt[u],i=WLt[o],r=WLt[s],f[l++]=(t<<2|e>>4)<<24>>24,f[l++]=((15&e)<<4|i>>2&15)<<24>>24,f[l++]=(i<<6|r)<<24>>24}return VE(a=c[h++])&&VE(u=c[h++])?(t=WLt[a],e=WLt[u],o=c[h++],s=c[h++],-1==WLt[o]||-1==WLt[s]?61==o&&61==s?0!=(15&e)?null:(aHn(f,0,g=x8(NNt,v6n,25,3*b+1,15,1),0,3*b),g[l]=(t<<2|e>>4)<<24>>24,g):61!=o&&61==s?0!=(3&(i=WLt[o]))?null:(aHn(f,0,g=x8(NNt,v6n,25,3*b+2,15,1),0,3*b),g[l++]=(t<<2|e>>4)<<24>>24,g[l]=((15&e)<<4|i>>2&15)<<24>>24,g):null:(i=WLt[o],r=WLt[s],f[l++]=(t<<2|e>>4)<<24>>24,f[l++]=((15&e)<<4|i>>2&15)<<24>>24,f[l++]=(i<<6|r)<<24>>24,f)):null}function XUn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;for(OTn(t,O1n,1),l=BB(mMn(n,(HXn(),Zdt)),218),i=new Wb(n.b);i.a<i.c.c.length;)for(a=0,u=(c=n2(BB(n0(i),29).a)).length;a<u;++a)if((r=c[a]).k==(uSn(),Iut)){if(l==(Mbn(),JPt))for(s=new Wb(r.j);s.a<s.c.c.length;)0==(o=BB(n0(s),11)).e.c.length||Agn(o),0==o.g.c.length||$gn(o);else if(cL(mMn(r,(hWn(),dlt)),17))w=BB(mMn(r,dlt),17),d=BB(DSn(r,(kUn(),CIt)).Kc().Pb(),11),g=BB(DSn(r,oIt).Kc().Pb(),11),p=BB(mMn(d,dlt),11),SZ(w,v=BB(mMn(g,dlt),11)),MZ(w,p),(m=new wA(g.i.n)).a=Aon(Pun(Gk(PMt,1),sVn,8,0,[v.i.n,v.n,v.a])).a,DH(w.a,m),(m=new wA(d.i.n)).a=Aon(Pun(Gk(PMt,1),sVn,8,0,[p.i.n,p.n,p.a])).a,DH(w.a,m);else{if(r.j.c.length>=2){for(b=!0,e=BB(n0(h=new Wb(r.j)),11),f=null;h.a<h.c.c.length;)if(f=e,e=BB(n0(h),11),!Nfn(mMn(f,dlt),mMn(e,dlt))){b=!1;break}}else b=!1;for(s=new Wb(r.j);s.a<s.c.c.length;)0==(o=BB(n0(s),11)).e.c.length||uxn(o,b),0==o.g.c.length||oxn(o,b)}PZ(r,null)}HSn(t)}function WUn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M;return y=n.c[(l1(0,t.c.length),BB(t.c[0],17)).p],T=n.c[(l1(1,t.c.length),BB(t.c[1],17)).p],!(y.a.e.e-y.a.a-(y.b.e.e-y.b.a)==0&&T.a.e.e-T.a.a-(T.b.e.e-T.b.a)==0||!cL(v=y.b.e.f,10)||(p=BB(v,10),j=n.i[p.p],E=p.c?E7(p.c.a,p,0):-1,a=RQn,E>0&&(c=BB(xq(p.c.a,E-1),10),u=n.i[c.p],M=e.Math.ceil(K$(n.n,c,p)),a=j.a.e-p.d.d-(u.a.e+c.o.b+c.d.a)-M),h=RQn,E<p.c.a.c.length-1&&(s=BB(xq(p.c.a,E+1),10),f=n.i[s.p],M=e.Math.ceil(K$(n.n,s,p)),h=f.a.e-s.d.d-(j.a.e+p.o.b+p.d.a)-M),!(i&&(h$(),rin(A3n),e.Math.abs(a-h)<=A3n||a==h||isNaN(a)&&isNaN(h)))&&(r=aX(y.a),o=-aX(y.b),l=-aX(T.a),m=aX(T.b),g=y.a.e.e-y.a.a-(y.b.e.e-y.b.a)>0&&T.a.e.e-T.a.a-(T.b.e.e-T.b.a)<0,d=y.a.e.e-y.a.a-(y.b.e.e-y.b.a)<0&&T.a.e.e-T.a.a-(T.b.e.e-T.b.a)>0,w=y.a.e.e+y.b.a<T.b.e.e+T.a.a,b=y.a.e.e+y.b.a>T.b.e.e+T.a.a,k=0,!g&&!d&&(b?a+l>0?k=l:h-r>0&&(k=r):w&&(a+o>0?k=o:h-m>0&&(k=m))),j.a.e+=k,j.b&&(j.d.e+=k),1)))}function VUn(n,t,i){var r,c,a,u,o,s,h,f,l,b;if(r=new UV(t.qf().a,t.qf().b,t.rf().a,t.rf().b),c=new bA,n.c)for(u=new Wb(t.wf());u.a<u.c.c.length;)a=BB(n0(u),181),c.c=a.qf().a+t.qf().a,c.d=a.qf().b+t.qf().b,c.b=a.rf().a,c.a=a.rf().b,CPn(r,c);for(h=new Wb(t.Cf());h.a<h.c.c.length;){if(f=(s=BB(n0(h),838)).qf().a+t.qf().a,l=s.qf().b+t.qf().b,n.e&&(c.c=f,c.d=l,c.b=s.rf().a,c.a=s.rf().b,CPn(r,c)),n.d)for(u=new Wb(s.wf());u.a<u.c.c.length;)a=BB(n0(u),181),c.c=a.qf().a+f,c.d=a.qf().b+l,c.b=a.rf().a,c.a=a.rf().b,CPn(r,c);if(n.b){if(b=new xC(-i,-i),BB(t.We((sWn(),fPt)),174).Hc((lIn(),rIt)))for(u=new Wb(s.wf());u.a<u.c.c.length;)a=BB(n0(u),181),b.a+=a.rf().a+i,b.b+=a.rf().b+i;b.a=e.Math.max(b.a,0),b.b=e.Math.max(b.b,0),X_n(r,s.Bf(),s.zf(),t,s,b,i)}}n.b&&X_n(r,t.Bf(),t.zf(),t,null,null,i),(o=new A_(t.Af())).d=e.Math.max(0,t.qf().b-r.d),o.a=e.Math.max(0,r.d+r.a-(t.qf().b+t.rf().b)),o.b=e.Math.max(0,t.qf().a-r.c),o.c=e.Math.max(0,r.c+r.b-(t.qf().a+t.rf().a)),t.Ef(o)}function QUn(){var n=["\\u0000","\\u0001","\\u0002","\\u0003","\\u0004","\\u0005","\\u0006","\\u0007","\\b","\\t","\\n","\\u000B","\\f","\\r","\\u000E","\\u000F","\\u0010","\\u0011","\\u0012","\\u0013","\\u0014","\\u0015","\\u0016","\\u0017","\\u0018","\\u0019","\\u001A","\\u001B","\\u001C","\\u001D","\\u001E","\\u001F"];return n[34]='\\"',n[92]="\\\\",n[173]="\\u00ad",n[1536]="\\u0600",n[1537]="\\u0601",n[1538]="\\u0602",n[1539]="\\u0603",n[1757]="\\u06dd",n[1807]="\\u070f",n[6068]="\\u17b4",n[6069]="\\u17b5",n[8203]="\\u200b",n[8204]="\\u200c",n[8205]="\\u200d",n[8206]="\\u200e",n[8207]="\\u200f",n[8232]="\\u2028",n[8233]="\\u2029",n[8234]="\\u202a",n[8235]="\\u202b",n[8236]="\\u202c",n[8237]="\\u202d",n[8238]="\\u202e",n[8288]="\\u2060",n[8289]="\\u2061",n[8290]="\\u2062",n[8291]="\\u2063",n[8292]="\\u2064",n[8298]="\\u206a",n[8299]="\\u206b",n[8300]="\\u206c",n[8301]="\\u206d",n[8302]="\\u206e",n[8303]="\\u206f",n[65279]="\\ufeff",n[65529]="\\ufff9",n[65530]="\\ufffa",n[65531]="\\ufffb",n}function YUn(n,t,e){var i,r,c,a,u,o,s,h,f,l;for(o=new Np,f=t.length,a=Ion(e),s=0;s<f;++s){switch(h=yN(t,YTn(61),s),c=(r=uun(i=fln(a,t.substr(s,h-s)))).Aj().Nh(),fV(t,++h)){case 39:u=lx(t,39,++h),WB(o,new CI(i,YV(t.substr(h,u-h),c,r))),s=u+1;break;case 34:u=lx(t,34,++h),WB(o,new CI(i,YV(t.substr(h,u-h),c,r))),s=u+1;break;case 91:WB(o,new CI(i,l=new Np));n:for(;;){switch(fV(t,++h)){case 39:u=lx(t,39,++h),WB(l,YV(t.substr(h,u-h),c,r)),h=u+1;break;case 34:u=lx(t,34,++h),WB(l,YV(t.substr(h,u-h),c,r)),h=u+1;break;case 110:if(++h,t.indexOf("ull",h)!=h)throw Hp(new dy(a6n));l.c[l.c.length]=null,h+=3}if(!(h<f))break;switch(b1(h,t.length),t.charCodeAt(h)){case 44:break;case 93:break n;default:throw Hp(new dy("Expecting , or ]"))}}s=h+1;break;case 110:if(++h,t.indexOf("ull",h)!=h)throw Hp(new dy(a6n));WB(o,new CI(i,null)),s=h+3}if(!(s<f))break;if(b1(s,t.length),44!=t.charCodeAt(s))throw Hp(new dy("Expecting ,"))}return iDn(n,o,e)}function JUn(n,t){var e,i,r,c,a,u,o,s,h,f,l;for(s=BB(BB(h6(n.r,t),21),84),a=JTn(n,t),e=n.u.Hc((lIn(),nIt)),o=s.Kc();o.Ob();)if((u=BB(o.Pb(),111)).c&&!(u.c.d.c.length<=0)){switch(l=u.b.rf(),(f=(h=u.c).i).b=(c=h.n,h.e.a+c.b+c.c),f.a=(r=h.n,h.e.b+r.d+r.a),t.g){case 1:u.a?(f.c=(l.a-f.b)/2,l9(h,(J9(),Qit))):a||e?(f.c=-f.b-n.s,l9(h,(J9(),Jit))):(f.c=l.a+n.s,l9(h,(J9(),Yit))),f.d=-f.a-n.t,WD(h,(G7(),irt));break;case 3:u.a?(f.c=(l.a-f.b)/2,l9(h,(J9(),Qit))):a||e?(f.c=-f.b-n.s,l9(h,(J9(),Jit))):(f.c=l.a+n.s,l9(h,(J9(),Yit))),f.d=l.b+n.t,WD(h,(G7(),crt));break;case 2:u.a?(i=n.v?f.a:BB(xq(h.d,0),181).rf().b,f.d=(l.b-i)/2,WD(h,(G7(),rrt))):a||e?(f.d=-f.a-n.t,WD(h,(G7(),irt))):(f.d=l.b+n.t,WD(h,(G7(),crt))),f.c=l.a+n.s,l9(h,(J9(),Yit));break;case 4:u.a?(i=n.v?f.a:BB(xq(h.d,0),181).rf().b,f.d=(l.b-i)/2,WD(h,(G7(),rrt))):a||e?(f.d=-f.a-n.t,WD(h,(G7(),irt))):(f.d=l.b+n.t,WD(h,(G7(),crt))),f.c=-f.b-n.s,l9(h,(J9(),Jit))}a=!1}}function ZUn(n,t){var e,i,r,c,a,u,o,s,h,f,l;if(wWn(),0==NT(iNt)){for(f=x8(INt,sVn,117,cNt.length,0,1),a=0;a<f.length;a++)f[a]=new M0(4);for(i=new Pk,c=0;c<eNt.length;c++){if(h=new M0(4),c<84?(b1(u=2*c,vnt.length),l=vnt.charCodeAt(u),b1(u+1,vnt.length),Yxn(h,l,vnt.charCodeAt(u+1))):Yxn(h,aNt[u=2*(c-84)],aNt[u+1]),mK(o=eNt[c],"Specials")&&Yxn(h,65520,65533),mK(o,gnt)&&(Yxn(h,983040,1048573),Yxn(h,1048576,1114109)),mZ(iNt,o,h),mZ(rNt,o,$Fn(h)),0<(s=i.a.length)?i.a=i.a.substr(0,0):0>s&&(i.a+=rL(x8(ONt,WVn,25,-s,15,1))),i.a+="Is",GO(o,YTn(32))>=0)for(r=0;r<o.length;r++)b1(r,o.length),32!=o.charCodeAt(r)&&NX(i,(b1(r,o.length),o.charCodeAt(r)));else i.a+=""+o;Tdn(i.a,o,!0)}Tdn(pnt,"Cn",!1),Tdn(mnt,"Cn",!0),Yxn(e=new M0(4),0,unt),mZ(iNt,"ALL",e),mZ(rNt,"ALL",$Fn(e)),!SNt&&(SNt=new xp),mZ(SNt,pnt,pnt),!SNt&&(SNt=new xp),mZ(SNt,mnt,mnt),!SNt&&(SNt=new xp),mZ(SNt,"ALL","ALL")}return BB(SJ(t?iNt:rNt,n),136)}function nXn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p;if(l=!1,f=!1,vA(BB(mMn(i,(HXn(),ept)),98))){a=!1,u=!1;n:for(w=new Wb(i.j);w.a<w.c.c.length;)for(b=BB(n0(w),11),d=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[new Hw(b),new Gw(b)])));dAn(d);)if(!qy(TD(mMn(BB(U5(d),11).i,Tdt)))){if(b.j==(kUn(),sIt)){a=!0;break n}if(b.j==SIt){u=!0;break n}}l=u&&!a,f=a&&!u}if(l||f||0==i.b.c.length)p=!f;else{for(h=0,s=new Wb(i.b);s.a<s.c.c.length;)h+=(o=BB(n0(s),70)).n.b+o.o.b/2;p=(h/=i.b.c.length)>=i.o.b/2}p?(g=BB(mMn(i,(hWn(),Klt)),15))?l?c=g:(r=BB(mMn(i,Dft),15))?c=g.gc()<=r.gc()?g:r:(c=new Np,hon(i,Dft,c)):(c=new Np,hon(i,Klt,c)):(r=BB(mMn(i,(hWn(),Dft)),15))?f?c=r:(g=BB(mMn(i,Klt),15))?c=r.gc()<=g.gc()?r:g:(c=new Np,hon(i,Klt,c)):(c=new Np,hon(i,Dft,c)),c.Fc(n),hon(n,(hWn(),Kft),e),t.d==e?(MZ(t,null),e.e.c.length+e.g.c.length==0&&CZ(e,null),gsn(e)):(SZ(t,null),e.e.c.length+e.g.c.length==0&&CZ(e,null)),yQ(t.a)}function tXn(n,t){var e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I;for(v=new M2(n.b,0),d=0,s=BB((f=t.Kc()).Pb(),19).a,k=0,e=new Rv,E=new fA;v.b<v.d.gc();){for(Px(v.b<v.d.gc()),y=new Wb(BB(v.d.Xb(v.c=v.b++),29).a);y.a<y.c.c.length;){for(w=new oz(ZL(lbn(m=BB(n0(y),10)).a.Kc(),new h));dAn(w);)l=BB(U5(w),17),E.a.zc(l,E);for(b=new oz(ZL(fbn(m).a.Kc(),new h));dAn(b);)l=BB(U5(b),17),E.a.Bc(l)}if(d+1==s){for(yR(v,r=new HX(n)),yR(v,c=new HX(n)),M=E.a.ec().Kc();M.Ob();)T=BB(M.Pb(),17),e.a._b(T)||(++k,e.a.zc(T,e)),hon(a=new $vn(n),(HXn(),ept),(QEn(),VCt)),PZ(a,r),Bl(a,(uSn(),Tut)),CZ(g=new CSn,a),qCn(g,(kUn(),CIt)),CZ(S=new CSn,a),qCn(S,oIt),hon(i=new $vn(n),ept,VCt),PZ(i,c),Bl(i,Tut),CZ(p=new CSn,i),qCn(p,CIt),CZ(P=new CSn,i),qCn(P,oIt),SZ(j=new wY,T.c),MZ(j,g),SZ(I=new wY,S),MZ(I,p),SZ(T,P),u=new v3(a,i,j,I,T),hon(a,(hWn(),Rft),u),hon(i,Rft,u),(C=j.c.i).k==Tut&&((o=BB(mMn(C,Rft),305)).d=u,u.g=o);if(!f.Ob())break;s=BB(f.Pb(),19).a}++d}return iln(k)}function eXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d;for(f=0,r=new AL((!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));r.e!=r.i.gc();)qy(TD(ZAn(i=BB(kpn(r),33),(HXn(),Ggt))))||(GI(ZAn(t,Ldt))===GI((mon(),Nvt))&&GI(ZAn(t,Gdt))!==GI((Vvn(),Eht))&&GI(ZAn(t,Gdt))!==GI((Vvn(),kht))&&!qy(TD(ZAn(t,xdt)))&&GI(ZAn(t,Cdt))===GI((Bfn(),wut))||qy(TD(ZAn(i,$dt)))||(Ypn(i,(hWn(),wlt),iln(f)),++f),wzn(n,i,e));for(f=0,s=new AL((!t.b&&(t.b=new eU(_Ot,t,12,3)),t.b));s.e!=s.i.gc();)u=BB(kpn(s),79),(GI(ZAn(t,(HXn(),Ldt)))!==GI((mon(),Nvt))||GI(ZAn(t,Gdt))===GI((Vvn(),Eht))||GI(ZAn(t,Gdt))===GI((Vvn(),kht))||qy(TD(ZAn(t,xdt)))||GI(ZAn(t,Cdt))!==GI((Bfn(),wut)))&&(Ypn(u,(hWn(),wlt),iln(f)),++f),w=PMn(u),d=OMn(u),h=qy(TD(ZAn(w,wgt))),b=!qy(TD(ZAn(u,Ggt))),l=h&&QIn(u)&&qy(TD(ZAn(u,dgt))),c=JJ(w)==t&&JJ(w)==JJ(d),a=(JJ(w)==t&&d==t)^(JJ(d)==t&&w==t),b&&!l&&(a||c)&&uWn(n,u,t,e);if(JJ(t))for(o=new AL(iQ(JJ(t)));o.e!=o.i.gc();)(w=PMn(u=BB(kpn(o),79)))==t&&QIn(u)&&(l=qy(TD(ZAn(w,(HXn(),wgt))))&&qy(TD(ZAn(u,dgt))))&&uWn(n,u,t,e)}function iXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A;for(OTn(i,"MinWidth layering",1),w=t.b,T=t.a,A=BB(mMn(t,(HXn(),Egt)),19).a,o=BB(mMn(t,Tgt),19).a,n.b=Gy(MD(mMn(t,ypt))),n.d=RQn,k=new Wb(T);k.a<k.c.c.length;)(m=BB(n0(k),10)).k==(uSn(),Cut)&&(P=m.o.b,n.d=e.Math.min(n.d,P));for(n.d=e.Math.max(1,n.d),M=T.c.length,n.c=x8(ANt,hQn,25,M,15,1),n.f=x8(ANt,hQn,25,M,15,1),n.e=x8(xNt,qQn,25,M,15,1),h=0,n.a=0,j=new Wb(T);j.a<j.c.c.length;)(m=BB(n0(j),10)).p=h++,n.c[m.p]=whn(fbn(m)),n.f[m.p]=whn(lbn(m)),n.e[m.p]=m.o.b/n.d,n.a+=n.e[m.p];for(n.b/=n.d,n.a/=M,E=jOn(T),m$(T,QW(new Kd(n))),g=RQn,d=DWn,u=null,O=A,I=A,a=o,c=o,A<0&&(O=BB(Tmt.a.zd(),19).a,I=BB(Tmt.b.zd(),19).a),o<0&&(a=BB(Emt.a.zd(),19).a,c=BB(Emt.b.zd(),19).a),C=O;C<=I;C++)for(r=a;r<=c;r++)v=Gy(MD((S=LBn(n,C,r,T,E)).a)),p=(b=BB(S.b,15)).gc(),(v<g||v==g&&p<d)&&(g=v,d=p,u=b);for(l=u.Kc();l.Ob();){for(f=BB(l.Pb(),15),s=new HX(t),y=f.Kc();y.Ob();)PZ(m=BB(y.Pb(),10),s);w.c[w.c.length]=s}JPn(w),T.c=x8(Ant,HWn,1,0,5,1),HSn(i)}function rXn(n,t){var i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M;for(n.b=t,n.a=BB(mMn(t,(HXn(),hgt)),19).a,n.c=BB(mMn(t,lgt),19).a,0==n.c&&(n.c=DWn),g=new M2(t.b,0);g.b<g.d.gc();){for(Px(g.b<g.d.gc()),d=BB(g.d.Xb(g.c=g.b++),29),o=new Np,l=-1,y=-1,m=new Wb(d.a);m.a<m.c.c.length;)v=BB(n0(m),10),F3((q_(),new oz(ZL(hbn(v).a.Kc(),new h))))>=n.a&&(r=yBn(n,v),l=e.Math.max(l,r.b),y=e.Math.max(y,r.d),WB(o,new rI(v,r)));for(E=new Np,f=0;f<l;++f)kG(E,0,(Px(g.b>0),g.a.Xb(g.c=--g.b),yR(g,T=new HX(n.b)),Px(g.b<g.d.gc()),g.d.Xb(g.c=g.b++),T));for(u=new Wb(o);u.a<u.c.c.length;)if(c=BB(n0(u),46),w=BB(c.b,571).a)for(b=new Wb(w);b.a<b.c.c.length;)ukn(n,BB(n0(b),10),Uut,E);for(i=new Np,s=0;s<y;++s)WB(i,(yR(g,M=new HX(n.b)),M));for(a=new Wb(o);a.a<a.c.c.length;)if(c=BB(n0(a),46),j=BB(c.b,571).c)for(k=new Wb(j);k.a<k.c.c.length;)ukn(n,BB(n0(k),10),Xut,i)}for(p=new M2(t.b,0);p.b<p.d.gc();)Px(p.b<p.d.gc()),0==BB(p.d.Xb(p.c=p.b++),29).a.c.length&&fW(p)}function cXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C;if(OTn(i,"Spline edge routing",1),0==t.b.c.length)return t.f.a=0,void HSn(i);v=Gy(MD(mMn(t,(HXn(),Apt)))),o=Gy(MD(mMn(t,Tpt))),u=Gy(MD(mMn(t,kpt))),T=BB(mMn(t,rgt),336)==(Usn(),rmt),E=Gy(MD(mMn(t,cgt))),n.d=t,n.j.c=x8(Ant,HWn,1,0,5,1),n.a.c=x8(Ant,HWn,1,0,5,1),$U(n.k),f=VI((s=BB(xq(t.b,0),29)).a,(dxn(),jyt)),l=VI((d=BB(xq(t.b,t.b.c.length-1),29)).a,jyt),g=new Wb(t.b),p=null,C=0;do{for(RUn(n,p,m=g.a<g.c.c.length?BB(n0(g),29):null),MFn(n),P=0,y=C,b=!p||f&&p==s,w=!m||l&&m==d,(M=_k(rcn(NV(AV(new Rq(null,new w1(n.i,16)),new ya),new ma))))>0?(h=0,p&&(h+=o),h+=(M-1)*u,m&&(h+=o),T&&m&&(h=e.Math.max(h,nxn(m,u,v,E))),h<v&&!b&&!w&&(P=(v-h)/2,h=v),y+=h):!b&&!w&&(y+=v),m&&Tqn(m,y),j=new Wb(n.i);j.a<j.c.c.length;)(k=BB(n0(j),128)).a.c=C,k.a.b=y-C,k.F=P,k.p=!p;gun(n.a,n.i),C=y,m&&(C+=m.c.a),p=m,b=w}while(m);for(c=new Wb(n.j);c.a<c.c.c.length;)a=man(n,r=BB(n0(c),17)),hon(r,(hWn(),$lt),a),S=Dxn(n,r),hon(r,Nlt,S);t.f.a=C,n.d=null,HSn(i)}function aXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m;if(d=0!=n.i,v=!1,g=null,mA(n.e)){if((h=t.gc())>0){for(l=h<100?null:new Fj(h),w=(s=new jcn(t)).g,g=x8(ANt,hQn,25,h,15,1),i=0,m=new gtn(h),r=0;r<n.i;++r){b=u=n.g[r];n:for(p=0;p<2;++p){for(o=h;--o>=0;)if(null!=b?Nfn(b,w[o]):GI(b)===GI(w[o])){g.length<=i&&aHn(g,0,g=x8(ANt,hQn,25,2*g.length,15,1),0,i),g[i++]=r,f9(m,w[o]);break n}if(GI(b)===GI(u))break}}if(s=m,w=m.g,h=i,i>g.length&&aHn(g,0,g=x8(ANt,hQn,25,i,15,1),0,i),i>0){for(v=!0,c=0;c<i;++c)l=zK(n,BB(b=w[c],72),l);for(a=i;--a>=0;)Lyn(n,g[a]);if(i!=h){for(r=h;--r>=i;)Lyn(s,r);aHn(g,0,g=x8(ANt,hQn,25,i,15,1),0,i)}t=s}}}else for(t=jyn(n,t),r=n.i;--r>=0;)t.Hc(n.g[r])&&(Lyn(n,r),v=!0);if(v){if(null!=g){for(f=1==(e=t.gc())?yZ(n,4,t.Kc().Pb(),null,g[0],d):yZ(n,6,t,g,g[0],d),l=e<100?null:new Fj(e),r=t.Kc();r.Ob();)l=qK(n,BB(b=r.Pb(),72),l);l?(l.Ei(f),l.Fi()):ban(n.e,f)}else{for(l=$K(t.gc()),r=t.Kc();r.Ob();)l=qK(n,BB(b=r.Pb(),72),l);l&&l.Fi()}return!0}return!1}function uXn(n,t){var e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m;for((e=new hvn(t)).a||g_n(t),s=lRn(t),o=new pJ,g=new Qxn,d=new Wb(t.a);d.a<d.c.c.length;)for(r=new oz(ZL(lbn(BB(n0(d),10)).a.Kc(),new h));dAn(r);)(i=BB(U5(r),17)).c.i.k!=(uSn(),Mut)&&i.d.i.k!=Mut||JIn(o,upn((f=lzn(n,i,s,g)).d),f.a);for(a=new Np,m=BB(mMn(e.c,(hWn(),Xft)),21).Kc();m.Ob();){switch(v=BB(m.Pb(),61),w=g.c[v.g],b=g.b[v.g],u=g.a[v.g],c=null,p=null,v.g){case 4:c=new UV(n.d.a,w,s.b.a-n.d.a,b-w),p=new UV(n.d.a,w,u,b-w),zH(s,new xC(c.c+c.b,c.d)),zH(s,new xC(c.c+c.b,c.d+c.a));break;case 2:c=new UV(s.a.a,w,n.c.a-s.a.a,b-w),p=new UV(n.c.a-u,w,u,b-w),zH(s,new xC(c.c,c.d)),zH(s,new xC(c.c,c.d+c.a));break;case 1:c=new UV(w,n.d.b,b-w,s.b.b-n.d.b),p=new UV(w,n.d.b,b-w,u),zH(s,new xC(c.c,c.d+c.a)),zH(s,new xC(c.c+c.b,c.d+c.a));break;case 3:c=new UV(w,s.a.b,b-w,n.c.b-s.a.b),p=new UV(w,n.c.b-u,b-w,u),zH(s,new xC(c.c,c.d)),zH(s,new xC(c.c+c.b,c.d))}c&&((l=new nm).d=v,l.b=c,l.c=p,l.a=JQ(BB(h6(o,upn(v)),21)),a.c[a.c.length]=l)}return gun(e.b,a),e.d=Bhn(nGn(s)),e}function oXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d;if(null==i.p[t.p]){o=!0,i.p[t.p]=0,u=t,d=i.o==(oZ(),ryt)?KQn:RQn;do{c=n.b.e[u.p],a=u.c.a.c.length,i.o==ryt&&c>0||i.o==cyt&&c<a-1?(s=null,h=null,s=i.o==cyt?BB(xq(u.c.a,c+1),10):BB(xq(u.c.a,c-1),10),oXn(n,h=i.g[s.p],i),d=n.e.bg(d,t,u),i.j[t.p]==t&&(i.j[t.p]=i.j[h.p]),i.j[t.p]==i.j[h.p]?(w=K$(n.d,u,s),i.o==cyt?(r=Gy(i.p[t.p]),l=Gy(i.p[h.p])+Gy(i.d[s.p])-s.d.d-w-u.d.a-u.o.b-Gy(i.d[u.p]),o?(o=!1,i.p[t.p]=e.Math.min(l,d)):i.p[t.p]=e.Math.min(r,e.Math.min(l,d))):(r=Gy(i.p[t.p]),l=Gy(i.p[h.p])+Gy(i.d[s.p])+s.o.b+s.d.a+w+u.d.d-Gy(i.d[u.p]),o?(o=!1,i.p[t.p]=e.Math.max(l,d)):i.p[t.p]=e.Math.max(r,e.Math.max(l,d)))):(w=Gy(MD(mMn(n.a,(HXn(),Opt)))),b=krn(n,i.j[t.p]),f=krn(n,i.j[h.p]),i.o==cyt?U1(b,f,Gy(i.p[t.p])+Gy(i.d[u.p])+u.o.b+u.d.a+w-(Gy(i.p[h.p])+Gy(i.d[s.p])-s.d.d)):U1(b,f,Gy(i.p[t.p])+Gy(i.d[u.p])-u.d.d-Gy(i.p[h.p])-Gy(i.d[s.p])-s.o.b-s.d.a-w))):d=n.e.bg(d,t,u),u=i.a[u.p]}while(u!=t);Ov(n.e,t)}}function sXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;for(f=t,h=new pJ,l=new pJ,c=N2(f,x6n),GSn((i=new fQ(n,e,h,l)).a,i.b,i.c,i.d,c),d=(h.i||(h.i=new HL(h,h.c))).Kc();d.Ob();)for(w=BB(d.Pb(),202),u=BB(h6(h,w),21).Kc();u.Ob();){if(a=u.Pb(),!(b=BB(sen(n.d,a),202)))throw r=R2(f,q6n),Hp(new ek(V6n+a+Q6n+r+W6n));!w.e&&(w.e=new hK(FOt,w,10,9)),f9(w.e,b)}for(p=(l.i||(l.i=new HL(l,l.c))).Kc();p.Ob();)for(g=BB(p.Pb(),202),s=BB(h6(l,g),21).Kc();s.Ob();){if(o=s.Pb(),!(b=BB(sen(n.d,o),202)))throw r=R2(f,q6n),Hp(new ek(V6n+o+Q6n+r+W6n));!g.g&&(g.g=new hK(FOt,g,9,10)),f9(g.g,b)}!e.b&&(e.b=new hK(KOt,e,4,7)),0!=e.b.i&&(!e.c&&(e.c=new hK(KOt,e,5,8)),0!=e.c.i)&&(!e.b&&(e.b=new hK(KOt,e,4,7)),e.b.i<=1&&(!e.c&&(e.c=new hK(KOt,e,5,8)),e.c.i<=1))&&1==(!e.a&&(e.a=new eU(FOt,e,6,6)),e.a).i&&(Svn(v=BB(Wtn((!e.a&&(e.a=new eU(FOt,e,6,6)),e.a),0),202))||Pvn(v)||(Lin(v,BB(Wtn((!e.b&&(e.b=new hK(KOt,e,4,7)),e.b),0),82)),Nin(v,BB(Wtn((!e.c&&(e.c=new hK(KOt,e,5,8)),e.c),0),82))))}function hXn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S;for(y=0,k=(m=n.a).length;y<k;++y){for(v=m[y],s=DWn,h=DWn,w=new Wb(v.e);w.a<w.c.c.length;)(a=(l=BB(n0(w),10)).c?E7(l.c.a,l,0):-1)>0?(f=BB(xq(l.c.a,a-1),10),T=K$(n.b,l,f),g=l.n.b-l.d.d-(f.n.b+f.o.b+f.d.a+T)):g=l.n.b-l.d.d,s=e.Math.min(g,s),a<l.c.a.c.length-1?(f=BB(xq(l.c.a,a+1),10),T=K$(n.b,l,f),p=f.n.b-f.d.d-(l.n.b+l.o.b+l.d.a+T)):p=2*l.n.b,h=e.Math.min(p,h);for(o=DWn,c=!1,S=new Wb((r=BB(xq(v.e,0),10)).j);S.a<S.c.c.length;)for(M=BB(n0(S),11),d=r.n.b+M.n.b+M.a.b,i=new Wb(M.e);i.a<i.c.c.length;)t=(j=BB(n0(i),17).c).i.n.b+j.n.b+j.a.b-d,e.Math.abs(t)<e.Math.abs(o)&&e.Math.abs(t)<(t<0?s:h)&&(o=t,c=!0);for(E=new Wb((u=BB(xq(v.e,v.e.c.length-1),10)).j);E.a<E.c.c.length;)for(j=BB(n0(E),11),d=u.n.b+j.n.b+j.a.b,i=new Wb(j.g);i.a<i.c.c.length;)t=(M=BB(n0(i),17).d).i.n.b+M.n.b+M.a.b-d,e.Math.abs(t)<e.Math.abs(o)&&e.Math.abs(t)<(t<0?s:h)&&(o=t,c=!0);if(c&&0!=o)for(b=new Wb(v.e);b.a<b.c.c.length;)(l=BB(n0(b),10)).n.b+=o}}function fXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g;if(hU(n.a,t)){if(FT(BB(RX(n.a,t),53),e))return 1}else VW(n.a,t,new Rv);if(hU(n.a,e)){if(FT(BB(RX(n.a,e),53),t))return-1}else VW(n.a,e,new Rv);if(hU(n.e,t)){if(FT(BB(RX(n.e,t),53),e))return-1}else VW(n.e,t,new Rv);if(hU(n.e,e)){if(FT(BB(RX(n.a,e),53),t))return 1}else VW(n.e,e,new Rv);if(n.c==(mon(),xvt)||!Lx(t,(hWn(),wlt))||!Lx(e,(hWn(),wlt))){if(o=BB(EN(M4(Qon(AV(new Rq(null,new w1(t.j,16)),new sc)),new hc)),11),h=BB(EN(M4(Qon(AV(new Rq(null,new w1(e.j,16)),new fc)),new lc)),11),o&&h){if(u=o.i,s=h.i,u&&u==s){for(l=new Wb(u.j);l.a<l.c.c.length;){if((f=BB(n0(l),11))==o)return aKn(n,e,t),-1;if(f==h)return aKn(n,t,e),1}return E$(iEn(n,t),iEn(n,e))}for(d=0,g=(w=n.d).length;d<g;++d){if((b=w[d])==u)return aKn(n,e,t),-1;if(b==s)return aKn(n,t,e),1}}if(!Lx(t,(hWn(),wlt))||!Lx(e,wlt))return(r=iEn(n,t))>(a=iEn(n,e))?aKn(n,t,e):aKn(n,e,t),r<a?-1:r>a?1:0}return(i=BB(mMn(t,(hWn(),wlt)),19).a)>(c=BB(mMn(e,wlt),19).a)?aKn(n,t,e):aKn(n,e,t),i<c?-1:i>c?1:0}function lXn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d;if(qy(TD(ZAn(t,(sWn(),zSt)))))return SQ(),SQ(),set;if(o=0!=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i,s=!(h=yIn(t)).dc(),o||s){if(!(r=BB(ZAn(t,mPt),149)))throw Hp(new rk("Resolved algorithm is not set; apply a LayoutAlgorithmResolver before computing layout."));if(d=OC(r,(hAn(),nAt)),Ngn(t),!o&&s&&!d)return SQ(),SQ(),set;if(u=new Np,GI(ZAn(t,ESt))===GI((ufn(),pCt))&&(OC(r,YOt)||OC(r,QOt)))for(l=pRn(n,t),Frn(b=new YT,(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));0!=b.b;)Ngn(f=BB(0==b.b?null:(Px(0!=b.b),Atn(b,b.a.a)),33)),GI(ZAn(f,ESt))===GI(mCt)||P8(f,eSt)&&!j5(r,ZAn(f,mPt))?(gun(u,lXn(n,f,e,i)),Ypn(f,ESt,mCt),KKn(f)):Frn(b,(!f.a&&(f.a=new eU(UOt,f,10,11)),f.a));else for(l=(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a).i,a=new AL((!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));a.e!=a.i.gc();)gun(u,lXn(n,c=BB(kpn(a),33),e,i)),KKn(c);for(w=new Wb(u);w.a<w.c.c.length;)Ypn(BB(n0(w),79),zSt,(hN(),!0));return Ugn(t,r,mcn(i,l)),w_n(u),s&&d?h:(SQ(),SQ(),set)}return SQ(),SQ(),set}function bXn(n,t,e,i,r,c,a,u,o){var s,h,f,l,b,w,d;switch(b=e,Bl(h=new $vn(o),(uSn(),Mut)),hon(h,(hWn(),Yft),a),hon(h,(HXn(),ept),(QEn(),XCt)),d=Gy(MD(n.We(tpt))),hon(h,tpt,d),CZ(f=new CSn,h),t!=QCt&&t!=YCt||(b=i>=0?hwn(u):Tln(hwn(u)),n.Ye(upt,b)),s=new Gj,l=!1,n.Xe(npt)?(Hx(s,BB(n.We(npt),8)),l=!0):yL(s,a.a/2,a.b/2),b.g){case 4:hon(h,kgt,(Tbn(),Flt)),hon(h,Gft,(Jun(),$ht)),h.o.b=a.b,d<0&&(h.o.a=-d),qCn(f,(kUn(),oIt)),l||(s.a=a.a),s.a-=a.a;break;case 2:hon(h,kgt,(Tbn(),Hlt)),hon(h,Gft,(Jun(),Oht)),h.o.b=a.b,d<0&&(h.o.a=-d),qCn(f,(kUn(),CIt)),l||(s.a=0);break;case 1:hon(h,ilt,(z7(),Cft)),h.o.a=a.a,d<0&&(h.o.b=-d),qCn(f,(kUn(),SIt)),l||(s.b=a.b),s.b-=a.b;break;case 3:hon(h,ilt,(z7(),Sft)),h.o.a=a.a,d<0&&(h.o.b=-d),qCn(f,(kUn(),sIt)),l||(s.b=0)}if(Hx(f.n,s),hon(h,npt,s),t==UCt||t==WCt||t==XCt){if(w=0,t==UCt&&n.Xe(ipt))switch(b.g){case 1:case 2:w=BB(n.We(ipt),19).a;break;case 3:case 4:w=-BB(n.We(ipt),19).a}else switch(b.g){case 4:case 2:w=c.b,t==WCt&&(w/=r.b);break;case 1:case 3:w=c.a,t==WCt&&(w/=r.a)}hon(h,Tlt,w)}return hon(h,Qft,b),h}function wXn(n){var t,e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E;if((e=Gy(MD(mMn(n.a.j,(HXn(),_dt)))))<-1||!n.a.i||LK(BB(mMn(n.a.o,ept),98))||abn(n.a.o,(kUn(),oIt)).gc()<2&&abn(n.a.o,CIt).gc()<2)return!0;if(n.a.c.Rf())return!1;for(y=0,m=0,v=new Np,o=0,s=(u=n.a.e).length;o<s;++o){for(b=0,d=(l=u[o]).length;b<d;++b)if((f=l[b]).k!=(uSn(),Iut)){for(i=n.b[f.c.p][f.p],f.k==Mut?(i.b=1,BB(mMn(f,(hWn(),dlt)),11).j==(kUn(),oIt)&&(m+=i.a)):(E=abn(f,(kUn(),CIt))).dc()||!tL(E,new Nc)?i.c=1:((r=abn(f,oIt)).dc()||!tL(r,new Lc))&&(y+=i.a),a=new oz(ZL(lbn(f).a.Kc(),new h));dAn(a);)c=BB(U5(a),17),y+=i.c,m+=i.b,X8(n,i,c.d.i);for(j=new oz(new WL((g=Wen(Pun(Gk(xnt,1),HWn,20,0,[abn(f,(kUn(),sIt)),abn(f,SIt)]))).a.length,g.a));dAn(j);)k=BB(U5(j),11),(p=BB(mMn(k,(hWn(),Elt)),10))&&(y+=i.c,m+=i.b,X8(n,i,p))}else v.c[v.c.length]=f;for(w=new Wb(v);w.a<w.c.c.length;)for(f=BB(n0(w),10),i=n.b[f.c.p][f.p],a=new oz(ZL(lbn(f).a.Kc(),new h));dAn(a);)c=BB(U5(a),17),y+=i.c,m+=i.b,X8(n,i,c.d.i);v.c=x8(Ant,HWn,1,0,5,1)}return(0==(t=y+m)?RQn:(y-m)/t)>=e}function dXn(){function n(n){var t=this;this.dispatch=function(t){var e=t.data;switch(e.cmd){case"algorithms":var i=Swn((SQ(),new Hb(new Ob(lAt.b))));n.postMessage({id:e.id,data:i});break;case"categories":var r=Swn((SQ(),new Hb(new Ob(lAt.c))));n.postMessage({id:e.id,data:r});break;case"options":var c=Swn((SQ(),new Hb(new Ob(lAt.d))));n.postMessage({id:e.id,data:c});break;case"register":lGn(e.algorithms),n.postMessage({id:e.id});break;case"layout":xBn(e.graph,e.layoutOptions||{},e.options||{}),n.postMessage({id:e.id,data:e.graph})}},this.saveDispatch=function(e){try{t.dispatch(e)}catch(i){n.postMessage({id:e.data.id,error:i})}}}function e(t){var e=this;this.dispatcher=new n({postMessage:function(n){e.onmessage({data:n})}}),this.postMessage=function(n){setTimeout((function(){e.dispatcher.saveDispatch({data:n})}),0)}}if(aE(),typeof document===gYn&&typeof self!==gYn){var r=new n(self);self.onmessage=r.saveDispatch}else typeof t!==gYn&&t.exports&&(Object.defineProperty(i,"__esModule",{value:!0}),t.exports={default:e,Worker:e})}function gXn(n){n.N||(n.N=!0,n.b=kan(n,0),Rrn(n.b,0),Rrn(n.b,1),Rrn(n.b,2),n.bb=kan(n,1),Rrn(n.bb,0),Rrn(n.bb,1),n.fb=kan(n,2),Rrn(n.fb,3),Rrn(n.fb,4),Krn(n.fb,5),n.qb=kan(n,3),Rrn(n.qb,0),Krn(n.qb,1),Krn(n.qb,2),Rrn(n.qb,3),Rrn(n.qb,4),Krn(n.qb,5),Rrn(n.qb,6),n.a=jan(n,4),n.c=jan(n,5),n.d=jan(n,6),n.e=jan(n,7),n.f=jan(n,8),n.g=jan(n,9),n.i=jan(n,10),n.j=jan(n,11),n.k=jan(n,12),n.n=jan(n,13),n.o=jan(n,14),n.p=jan(n,15),n.q=jan(n,16),n.s=jan(n,17),n.r=jan(n,18),n.t=jan(n,19),n.u=jan(n,20),n.v=jan(n,21),n.w=jan(n,22),n.B=jan(n,23),n.A=jan(n,24),n.C=jan(n,25),n.D=jan(n,26),n.F=jan(n,27),n.G=jan(n,28),n.H=jan(n,29),n.J=jan(n,30),n.I=jan(n,31),n.K=jan(n,32),n.M=jan(n,33),n.L=jan(n,34),n.P=jan(n,35),n.Q=jan(n,36),n.R=jan(n,37),n.S=jan(n,38),n.T=jan(n,39),n.U=jan(n,40),n.V=jan(n,41),n.X=jan(n,42),n.W=jan(n,43),n.Y=jan(n,44),n.Z=jan(n,45),n.$=jan(n,46),n._=jan(n,47),n.ab=jan(n,48),n.cb=jan(n,49),n.db=jan(n,50),n.eb=jan(n,51),n.gb=jan(n,52),n.hb=jan(n,53),n.ib=jan(n,54),n.jb=jan(n,55),n.kb=jan(n,56),n.lb=jan(n,57),n.mb=jan(n,58),n.nb=jan(n,59),n.ob=jan(n,60),n.pb=jan(n,61))}function pXn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;if(m=0,0==t.f.a)for(p=new Wb(n);p.a<p.c.c.length;)d=BB(n0(p),10),m=e.Math.max(m,d.n.a+d.o.a+d.d.c);else m=t.f.a-t.c.a;for(m-=t.c.a,g=new Wb(n);g.a<g.c.c.length;){switch(Zp((d=BB(n0(g),10)).n,m-d.o.a),cH(d.f),Vmn(d),(d.q?d.q:(SQ(),SQ(),het))._b((HXn(),spt))&&Zp(BB(mMn(d,spt),8),m-d.o.a),BB(mMn(d,kdt),248).g){case 1:hon(d,kdt,(wvn(),$Mt));break;case 2:hon(d,kdt,(wvn(),AMt))}for(v=d.o,k=new Wb(d.j);k.a<k.c.c.length;){for(Zp((y=BB(n0(k),11)).n,v.a-y.o.a),Zp(y.a,y.o.a),qCn(y,Icn(y.j)),(u=BB(mMn(y,ipt),19))&&hon(y,ipt,iln(-u.a)),a=new Wb(y.g);a.a<a.c.c.length;){for(r=spn((c=BB(n0(a),17)).a,0);r.b!=r.d.c;)(i=BB(b3(r),8)).a=m-i.a;if(h=BB(mMn(c,vgt),74))for(s=spn(h,0);s.b!=s.d.c;)(o=BB(b3(s),8)).a=m-o.a;for(b=new Wb(c.b);b.a<b.c.c.length;)Zp((f=BB(n0(b),70)).n,m-f.o.a)}for(w=new Wb(y.f);w.a<w.c.c.length;)Zp((f=BB(n0(w),70)).n,y.o.a-f.o.a)}for(d.k==(uSn(),Mut)&&(hon(d,(hWn(),Qft),Icn(BB(mMn(d,Qft),61))),YMn(d)),l=new Wb(d.b);l.a<l.c.c.length;)Vmn(f=BB(n0(l),70)),Zp(f.n,v.a-f.o.a)}}function vXn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;if(m=0,0==t.f.b)for(p=new Wb(n);p.a<p.c.c.length;)d=BB(n0(p),10),m=e.Math.max(m,d.n.b+d.o.b+d.d.a);else m=t.f.b-t.c.b;for(m-=t.c.b,g=new Wb(n);g.a<g.c.c.length;){switch(Jp((d=BB(n0(g),10)).n,m-d.o.b),aH(d.f),Qmn(d),(d.q?d.q:(SQ(),SQ(),het))._b((HXn(),spt))&&Jp(BB(mMn(d,spt),8),m-d.o.b),BB(mMn(d,kdt),248).g){case 3:hon(d,kdt,(wvn(),IMt));break;case 4:hon(d,kdt,(wvn(),LMt))}for(v=d.o,k=new Wb(d.j);k.a<k.c.c.length;){for(Jp((y=BB(n0(k),11)).n,v.b-y.o.b),Jp(y.a,y.o.b),qCn(y,Ocn(y.j)),(u=BB(mMn(y,ipt),19))&&hon(y,ipt,iln(-u.a)),a=new Wb(y.g);a.a<a.c.c.length;){for(r=spn((c=BB(n0(a),17)).a,0);r.b!=r.d.c;)(i=BB(b3(r),8)).b=m-i.b;if(h=BB(mMn(c,vgt),74))for(s=spn(h,0);s.b!=s.d.c;)(o=BB(b3(s),8)).b=m-o.b;for(b=new Wb(c.b);b.a<b.c.c.length;)Jp((f=BB(n0(b),70)).n,m-f.o.b)}for(w=new Wb(y.f);w.a<w.c.c.length;)Jp((f=BB(n0(w),70)).n,y.o.b-f.o.b)}for(d.k==(uSn(),Mut)&&(hon(d,(hWn(),Qft),Ocn(BB(mMn(d,Qft),61))),gln(d)),l=new Wb(d.b);l.a<l.c.c.length;)Qmn(f=BB(n0(l),70)),Jp(f.n,v.b-f.o.b)}}function mXn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b;for(f=!1,s=n+1,l1(n,t.c.length),a=(h=BB(t.c[n],200)).a,u=null,c=0;c<h.a.c.length;c++)if(l1(c,a.c.length),!(r=BB(a.c[c],187)).c)if(0!=r.b.c.length){if(r.k||(u&&Gmn(u),Tvn(r,(u=new KJ(u?u.e+u.d+i:0,h.f,i)).e+u.d,h.f),WB(h.d,u),xcn(u,r),r.k=!0),o=null,b=null,c<h.a.c.length-1?b=BB(xq(h.a,c+1),187):s<t.c.length&&0!=(l1(s,t.c.length),BB(t.c[s],200)).a.c.length&&(b=BB(xq((l1(s,t.c.length),BB(t.c[s],200)).a,0),187)),l=!1,(o=b)&&(l=!Nfn(o.j,h)),o){if(0==o.b.c.length){Tkn(h,o);break}if(p9(r,e-r.s),Gmn(r.q),f|=nSn(h,r,o,e,i),0==o.b.c.length)for(Tkn((l1(s,t.c.length),BB(t.c[s],200)),o),o=null;t.c.length>s&&0==(l1(s,t.c.length),BB(t.c[s],200)).a.c.length;)y7(t,(l1(s,t.c.length),t.c[s]));if(!o){--c;continue}if(A_n(t,h,r,o,l,e,s,i)){f=!0;continue}if(l){if(JBn(t,h,r,o,e,s,i)){f=!0;continue}if(Ahn(h,r)){r.c=!0,f=!0;continue}}else if(Ahn(h,r)){r.c=!0,f=!0;continue}if(f)continue}Ahn(h,r)?(r.c=!0,f=!0,o&&(o.k=!1)):Gmn(r.q)}else $T(),Tkn(h,r),--c,f=!0;return f}function yXn(n,t,i,r,c,a,u){var o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A;for(g=0,P=0,h=new Wb(n.b);h.a<h.c.c.length;)(s=BB(n0(h),157)).c&&ozn(s.c),g=e.Math.max(g,iG(s)),P+=iG(s)*eG(s);for(p=P/n.b.c.length,S=hjn(n.b,p),P+=n.b.c.length*S,g=e.Math.max(g,e.Math.sqrt(P*u))+i.b,O=i.b,A=i.d,w=0,l=i.b+i.c,DH(M=new YT,iln(0)),E=new YT,f=new M2(n.b,0),d=null,o=new Np;f.b<f.d.gc();)Px(f.b<f.d.gc()),I=iG(s=BB(f.d.Xb(f.c=f.b++),157)),b=eG(s),O+I>g&&(a&&(fO(E,w),fO(M,iln(f.b-1)),WB(n.d,d),o.c=x8(Ant,HWn,1,0,5,1)),O=i.b,A+=w+t,w=0,l=e.Math.max(l,i.b+i.c+I)),o.c[o.c.length]=s,Mpn(s,O,A),l=e.Math.max(l,O+I+i.c),w=e.Math.max(w,b),O+=I+t,d=s;if(gun(n.a,o),WB(n.d,BB(xq(o,o.c.length-1),157)),l=e.Math.max(l,r),(C=A+w+i.a)<c&&(w+=c-C,C=c),a)for(O=i.b,f=new M2(n.b,0),fO(M,iln(n.b.c.length)),m=BB(b3(T=spn(M,0)),19).a,fO(E,w),j=spn(E,0),k=0;f.b<f.d.gc();)f.b==m&&(O=i.b,k=Gy(MD(b3(j))),m=BB(b3(T),19).a),Px(f.b<f.d.gc()),Udn(s=BB(f.d.Xb(f.c=f.b++),157),k),f.b==m&&(v=l-O-i.c,y=iG(s),zdn(s,v),Fln(s,(v-y)/2,0)),O+=iG(s)+t;return new xC(l,C)}function kXn(n){var t,e,i,r;switch(r=null,n.c){case 6:return n.Vl();case 13:return n.Wl();case 23:return n.Nl();case 22:return n.Sl();case 18:return n.Pl();case 8:QXn(n),wWn(),r=oNt;break;case 9:return n.vl(!0);case 19:return n.wl();case 10:switch(n.a){case 100:case 68:case 119:case 87:case 115:case 83:return r=n.ul(n.a),QXn(n),r;case 101:case 102:case 110:case 114:case 116:case 117:case 118:case 120:(t=n.tl())<BQn?(wWn(),wWn(),r=new oG(0,t)):r=pz(Xln(t));break;case 99:return n.Fl();case 67:return n.Al();case 105:return n.Il();case 73:return n.Bl();case 103:return n.Gl();case 88:return n.Cl();case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return n.xl();case 80:case 112:if(!(r=DIn(n,n.a)))throw Hp(new ak(kWn((u$(),O8n))));break;default:r=QH(n.a)}QXn(n);break;case 0:if(93==n.a||123==n.a||125==n.a)throw Hp(new ak(kWn((u$(),I8n))));r=QH(n.a),e=n.a,QXn(n),(64512&e)==HQn&&0==n.c&&56320==(64512&n.a)&&((i=x8(ONt,WVn,25,2,15,1))[0]=e&QVn,i[1]=n.a&QVn,r=oU(pz(Bdn(i,0,i.length)),0),QXn(n));break;default:throw Hp(new ak(kWn((u$(),I8n))))}return r}function jXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g;if(r=new Np,c=DWn,a=DWn,u=DWn,i)for(c=n.f.a,d=new Wb(t.j);d.a<d.c.c.length;)for(s=new Wb(BB(n0(d),11).g);s.a<s.c.c.length;)0!=(o=BB(n0(s),17)).a.b&&((f=BB(gx(o.a),8)).a<c&&(a=c-f.a,u=DWn,r.c=x8(Ant,HWn,1,0,5,1),c=f.a),f.a<=c&&(r.c[r.c.length]=o,o.a.b>1&&(u=e.Math.min(u,e.Math.abs(BB(Dpn(o.a,1),8).b-f.b)))));else for(d=new Wb(t.j);d.a<d.c.c.length;)for(s=new Wb(BB(n0(d),11).e);s.a<s.c.c.length;)0!=(o=BB(n0(s),17)).a.b&&((b=BB(px(o.a),8)).a>c&&(a=b.a-c,u=DWn,r.c=x8(Ant,HWn,1,0,5,1),c=b.a),b.a>=c&&(r.c[r.c.length]=o,o.a.b>1&&(u=e.Math.min(u,e.Math.abs(BB(Dpn(o.a,o.a.b-2),8).b-b.b)))));if(0!=r.c.length&&a>t.o.a/2&&u>t.o.b/2){for(CZ(w=new CSn,t),qCn(w,(kUn(),sIt)),w.n.a=t.o.a/2,CZ(g=new CSn,t),qCn(g,SIt),g.n.a=t.o.a/2,g.n.b=t.o.b,s=new Wb(r);s.a<s.c.c.length;)o=BB(n0(s),17),i?(h=BB(dH(o.a),8),(0==o.a.b?g1(o.d):BB(gx(o.a),8)).b>=h.b?SZ(o,g):SZ(o,w)):(h=BB(gH(o.a),8),(0==o.a.b?g1(o.c):BB(px(o.a),8)).b>=h.b?MZ(o,g):MZ(o,w)),(l=BB(mMn(o,(HXn(),vgt)),74))&&ywn(l,h,!0);t.n.a=c-t.o.a/2}}function EXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;if(s=t,$in(o=Q3(n,L3(e),s),R2(s,q6n)),h=BB(sen(n.g,kIn(zJ(s,T6n))),33),i=null,(a=zJ(s,"sourcePort"))&&(i=kIn(a)),f=BB(sen(n.j,i),118),!h)throw Hp(new ek("An edge must have a source node (edge id: '"+Qdn(s)+W6n));if(f&&!wW(WJ(f),h))throw Hp(new ek("The source port of an edge must be a port of the edge's source node (edge id: '"+R2(s,q6n)+W6n));if(!o.b&&(o.b=new hK(KOt,o,4,7)),f9(o.b,f||h),l=BB(sen(n.g,kIn(zJ(s,Y6n))),33),r=null,(u=zJ(s,"targetPort"))&&(r=kIn(u)),b=BB(sen(n.j,r),118),!l)throw Hp(new ek("An edge must have a target node (edge id: '"+Qdn(s)+W6n));if(b&&!wW(WJ(b),l))throw Hp(new ek("The target port of an edge must be a port of the edge's target node (edge id: '"+R2(s,q6n)+W6n));if(!o.c&&(o.c=new hK(KOt,o,5,8)),f9(o.c,b||l),0==(!o.b&&(o.b=new hK(KOt,o,4,7)),o.b).i||0==(!o.c&&(o.c=new hK(KOt,o,5,8)),o.c).i)throw c=R2(s,q6n),Hp(new ek(X6n+c+W6n));return STn(s,o),s$n(s,o),xon(n,s,o)}function TXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S;return f=CFn(HN(n,(kUn(),wIt)),t),w=ayn(HN(n,dIt),t),y=ayn(HN(n,EIt),t),T=uyn(HN(n,MIt),t),l=uyn(HN(n,hIt),t),v=ayn(HN(n,jIt),t),d=ayn(HN(n,gIt),t),j=ayn(HN(n,TIt),t),k=ayn(HN(n,fIt),t),M=uyn(HN(n,bIt),t),p=ayn(HN(n,yIt),t),m=ayn(HN(n,mIt),t),E=ayn(HN(n,lIt),t),S=uyn(HN(n,kIt),t),b=uyn(HN(n,pIt),t),g=ayn(HN(n,vIt),t),e=Lon(Pun(Gk(xNt,1),qQn,25,15,[v.a,T.a,j.a,S.a])),i=Lon(Pun(Gk(xNt,1),qQn,25,15,[w.a,f.a,y.a,g.a])),r=p.a,c=Lon(Pun(Gk(xNt,1),qQn,25,15,[d.a,l.a,k.a,b.a])),s=Lon(Pun(Gk(xNt,1),qQn,25,15,[v.b,w.b,d.b,m.b])),o=Lon(Pun(Gk(xNt,1),qQn,25,15,[T.b,f.b,l.b,g.b])),h=M.b,u=Lon(Pun(Gk(xNt,1),qQn,25,15,[j.b,y.b,k.b,E.b])),w9(HN(n,wIt),e+r,s+h),w9(HN(n,vIt),e+r,s+h),w9(HN(n,dIt),e+r,0),w9(HN(n,EIt),e+r,s+h+o),w9(HN(n,MIt),0,s+h),w9(HN(n,hIt),e+r+i,s+h),w9(HN(n,gIt),e+r+i,0),w9(HN(n,TIt),0,s+h+o),w9(HN(n,fIt),e+r+i,s+h+o),w9(HN(n,bIt),0,s),w9(HN(n,yIt),e,0),w9(HN(n,lIt),0,s+h+o),w9(HN(n,pIt),e+r+i,0),(a=new Gj).a=Lon(Pun(Gk(xNt,1),qQn,25,15,[e+i+r+c,M.a,m.a,E.a])),a.b=Lon(Pun(Gk(xNt,1),qQn,25,15,[s+o+h+u,p.b,S.b,b.b])),a}function MXn(n){var t,e,i,r,c,a,u,o,s,f,l,b,w,d,g;for(d=new Np,l=new Wb(n.d.b);l.a<l.c.c.length;)for(w=new Wb(BB(n0(l),29).a);w.a<w.c.c.length;){for(b=BB(n0(w),10),r=BB(RX(n.f,b),57),o=new oz(ZL(lbn(b).a.Kc(),new h));dAn(o);)if(s=!0,f=null,(i=spn((a=BB(U5(o),17)).a,0)).b!=i.d.c){for(t=BB(b3(i),8),e=null,a.c.j==(kUn(),sIt)&&((g=new PBn(t,new xC(t.a,r.d.d),r,a)).f.a=!0,g.a=a.c,d.c[d.c.length]=g),a.c.j==SIt&&((g=new PBn(t,new xC(t.a,r.d.d+r.d.a),r,a)).f.d=!0,g.a=a.c,d.c[d.c.length]=g);i.b!=i.d.c;)e=BB(b3(i),8),aen(t.b,e.b)||(f=new PBn(t,e,null,a),d.c[d.c.length]=f,s&&(s=!1,e.b<r.d.d?f.f.a=!0:e.b>r.d.d+r.d.a?f.f.d=!0:(f.f.d=!0,f.f.a=!0))),i.b!=i.d.c&&(t=e);f&&(c=BB(RX(n.f,a.d.i),57),t.b<c.d.d?f.f.a=!0:t.b>c.d.d+c.d.a?f.f.d=!0:(f.f.d=!0,f.f.a=!0))}for(u=new oz(ZL(fbn(b).a.Kc(),new h));dAn(u);)0!=(a=BB(U5(u),17)).a.b&&(t=BB(px(a.a),8),a.d.j==(kUn(),sIt)&&((g=new PBn(t,new xC(t.a,r.d.d),r,a)).f.a=!0,g.a=a.d,d.c[d.c.length]=g),a.d.j==SIt&&((g=new PBn(t,new xC(t.a,r.d.d+r.d.a),r,a)).f.d=!0,g.a=a.d,d.c[d.c.length]=g))}return d}function SXn(n,t,e){var i,r,c,a,u,o,s;if(OTn(e,"Network simplex node placement",1),n.e=t,n.n=BB(mMn(t,(hWn(),Alt)),304),oqn(n),REn(n),JT(wnn(new Rq(null,new w1(n.e.b,16)),new Hc),new cg(n)),JT(AV(wnn(AV(wnn(new Rq(null,new w1(n.e.b,16)),new ta),new ea),new ia),new ra),new rg(n)),qy(TD(mMn(n.e,(HXn(),xgt))))&&(OTn(c=mcn(e,1),"Straight Edges Pre-Processing",1),jzn(n),HSn(c)),Mvn(n.f),r=BB(mMn(t,xpt),19).a*n.f.a.c.length,WKn(Qk(Yk(B_(n.f),r),!1),mcn(e,1)),0!=n.d.a.gc()){for(OTn(c=mcn(e,1),"Flexible Where Space Processing",1),a=BB($N(Oz($V(new Rq(null,new w1(n.f.a,16)),new qc),new Dc)),19).a,u=BB($N(Iz($V(new Rq(null,new w1(n.f.a,16)),new Gc),new Rc)),19).a-a,o=AN(new qv,n.f),s=AN(new qv,n.f),UNn(aM(cM(rM(uM(new Hv,2e4),u),o),s)),JT(AV(AV(LU(n.i),new zc),new Uc),new zV(a,o,u,s)),i=n.d.a.ec().Kc();i.Ob();)BB(i.Pb(),213).g=1;WKn(Qk(Yk(B_(n.f),r),!1),mcn(c,1)),HSn(c)}qy(TD(mMn(t,xgt)))&&(OTn(c=mcn(e,1),"Straight Edges Post-Processing",1),SPn(n),HSn(c)),QGn(n),n.e=null,n.f=null,n.i=null,n.c=null,$U(n.k),n.j=null,n.a=null,n.o=null,n.d.a.$b(),HSn(e)}function PXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(u=new Wb(n.a.b);u.a<u.c.c.length;)for(m=new Wb(BB(n0(u),29).a);m.a<m.c.c.length;)v=BB(n0(m),10),t.g[v.p]=v,t.a[v.p]=v,t.d[v.p]=0;for(o=n.a.b,t.c==(gJ(),nyt)&&(o=cL(o,152)?o6(BB(o,152)):cL(o,131)?BB(o,131).a:cL(o,54)?new fy(o):new CT(o)),a=o.Kc();a.Ob();)for(b=-1,l=BB(a.Pb(),29).a,t.o==(oZ(),cyt)&&(b=DWn,l=cL(l,152)?o6(BB(l,152)):cL(l,131)?BB(l,131).a:cL(l,54)?new fy(l):new CT(l)),k=l.Kc();k.Ob();)if(y=BB(k.Pb(),10),f=null,(f=t.c==nyt?BB(xq(n.b.f,y.p),15):BB(xq(n.b.b,y.p),15)).gc()>0)if(r=f.gc(),s=CJ(e.Math.floor((r+1)/2))-1,c=CJ(e.Math.ceil((r+1)/2))-1,t.o==cyt)for(h=c;h>=s;h--)t.a[y.p]==y&&(d=BB(f.Xb(h),46),w=BB(d.a,10),!FT(i,d.b)&&b>n.b.e[w.p]&&(t.a[w.p]=y,t.g[y.p]=t.g[w.p],t.a[y.p]=t.g[y.p],t.f[t.g[y.p].p]=(hN(),!!(qy(t.f[t.g[y.p].p])&y.k==(uSn(),Put))),b=n.b.e[w.p]));else for(h=s;h<=c;h++)t.a[y.p]==y&&(p=BB(f.Xb(h),46),g=BB(p.a,10),!FT(i,p.b)&&b<n.b.e[g.p]&&(t.a[g.p]=y,t.g[y.p]=t.g[g.p],t.a[y.p]=t.g[y.p],t.f[t.g[y.p].p]=(hN(),!!(qy(t.f[t.g[y.p].p])&y.k==(uSn(),Put))),b=n.b.e[g.p]))}function CXn(){CXn=O,eE(),POt=gOt.a,BB(Wtn(QQ(gOt.a),0),18),kOt=gOt.f,BB(Wtn(QQ(gOt.f),0),18),BB(Wtn(QQ(gOt.f),1),34),SOt=gOt.n,BB(Wtn(QQ(gOt.n),0),34),BB(Wtn(QQ(gOt.n),1),34),BB(Wtn(QQ(gOt.n),2),34),BB(Wtn(QQ(gOt.n),3),34),jOt=gOt.g,BB(Wtn(QQ(gOt.g),0),18),BB(Wtn(QQ(gOt.g),1),34),vOt=gOt.c,BB(Wtn(QQ(gOt.c),0),18),BB(Wtn(QQ(gOt.c),1),18),EOt=gOt.i,BB(Wtn(QQ(gOt.i),0),18),BB(Wtn(QQ(gOt.i),1),18),BB(Wtn(QQ(gOt.i),2),18),BB(Wtn(QQ(gOt.i),3),18),BB(Wtn(QQ(gOt.i),4),34),TOt=gOt.j,BB(Wtn(QQ(gOt.j),0),18),mOt=gOt.d,BB(Wtn(QQ(gOt.d),0),18),BB(Wtn(QQ(gOt.d),1),18),BB(Wtn(QQ(gOt.d),2),18),BB(Wtn(QQ(gOt.d),3),18),BB(Wtn(QQ(gOt.d),4),34),BB(Wtn(QQ(gOt.d),5),34),BB(Wtn(QQ(gOt.d),6),34),BB(Wtn(QQ(gOt.d),7),34),pOt=gOt.b,BB(Wtn(QQ(gOt.b),0),34),BB(Wtn(QQ(gOt.b),1),34),yOt=gOt.e,BB(Wtn(QQ(gOt.e),0),34),BB(Wtn(QQ(gOt.e),1),34),BB(Wtn(QQ(gOt.e),2),34),BB(Wtn(QQ(gOt.e),3),34),BB(Wtn(QQ(gOt.e),4),18),BB(Wtn(QQ(gOt.e),5),18),BB(Wtn(QQ(gOt.e),6),18),BB(Wtn(QQ(gOt.e),7),18),BB(Wtn(QQ(gOt.e),8),18),BB(Wtn(QQ(gOt.e),9),18),BB(Wtn(QQ(gOt.e),10),34),MOt=gOt.k,BB(Wtn(QQ(gOt.k),0),34),BB(Wtn(QQ(gOt.k),1),34)}function IXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P;for(M=new YT,j=new YT,g=-1,o=new Wb(n);o.a<o.c.c.length;){for((a=BB(n0(o),128)).s=g--,h=0,m=0,c=new Wb(a.t);c.a<c.c.c.length;)m+=(i=BB(n0(c),268)).c;for(r=new Wb(a.i);r.a<r.c.c.length;)h+=(i=BB(n0(r),268)).c;a.n=h,a.u=m,0==m?r5(j,a,j.c.b,j.c):0==h&&r5(M,a,M.c.b,M.c)}for(P=S4(n),d=(f=n.c.length)+1,p=f-1,b=new Np;0!=P.a.gc();){for(;0!=j.b;)Px(0!=j.b),k=BB(Atn(j,j.a.a),128),P.a.Bc(k),k.s=p--,cLn(k,M,j);for(;0!=M.b;)Px(0!=M.b),E=BB(Atn(M,M.a.a),128),P.a.Bc(E),E.s=d++,cLn(E,M,j);for(w=_Vn,s=P.a.ec().Kc();s.Ob();)(v=(a=BB(s.Pb(),128)).u-a.n)>=w&&(v>w&&(b.c=x8(Ant,HWn,1,0,5,1),w=v),b.c[b.c.length]=a);0!=b.c.length&&(l=BB(xq(b,pvn(t,b.c.length)),128),P.a.Bc(l),l.s=d++,cLn(l,M,j),b.c=x8(Ant,HWn,1,0,5,1))}for(y=n.c.length+1,u=new Wb(n);u.a<u.c.c.length;)(a=BB(n0(u),128)).s<f&&(a.s+=y);for(T=new Wb(n);T.a<T.c.c.length;)for(e=new M2((E=BB(n0(T),128)).t,0);e.b<e.d.gc();)Px(e.b<e.d.gc()),S=(i=BB(e.d.Xb(e.c=e.b++),268)).b,E.s>S.s&&(fW(e),y7(S.i,i),i.c>0&&(i.a=S,WB(S.t,i),i.b=E,WB(E.i,i)))}function OXn(n){var t,e,i,r,c;switch(t=n.c){case 11:return n.Ml();case 12:return n.Ol();case 14:return n.Ql();case 15:return n.Tl();case 16:return n.Rl();case 17:return n.Ul();case 21:return QXn(n),wWn(),wWn(),sNt;case 10:switch(n.a){case 65:return n.yl();case 90:return n.Dl();case 122:return n.Kl();case 98:return n.El();case 66:return n.zl();case 60:return n.Jl();case 62:return n.Hl()}}switch(c=kXn(n),t=n.c){case 3:return n.Zl(c);case 4:return n.Xl(c);case 5:return n.Yl(c);case 0:if(123==n.a&&n.d<n.j){if(r=n.d,i=0,e=-1,!((t=fV(n.i,r++))>=48&&t<=57))throw Hp(new ak(kWn((u$(),X8n))));for(i=t-48;r<n.j&&(t=fV(n.i,r++))>=48&&t<=57;)if((i=10*i+t-48)<0)throw Hp(new ak(kWn((u$(),Y8n))));if(e=i,44==t){if(r>=n.j)throw Hp(new ak(kWn((u$(),V8n))));if((t=fV(n.i,r++))>=48&&t<=57){for(e=t-48;r<n.j&&(t=fV(n.i,r++))>=48&&t<=57;)if((e=10*e+t-48)<0)throw Hp(new ak(kWn((u$(),Y8n))));if(i>e)throw Hp(new ak(kWn((u$(),Q8n))))}else e=-1}if(125!=t)throw Hp(new ak(kWn((u$(),W8n))));n.sl(r)?(wWn(),wWn(),c=new h4(9,c),n.d=r+1):(wWn(),wWn(),c=new h4(3,c),n.d=r),c.dm(i),c.cm(e),QXn(n)}}return c}function AXn(n,t,e,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M;for(w=new J6(t.b),v=new J6(t.b),l=new J6(t.b),j=new J6(t.b),d=new J6(t.b),k=spn(t,0);k.b!=k.d.c;)for(u=new Wb((m=BB(b3(k),11)).g);u.a<u.c.c.length;)if((c=BB(n0(u),17)).c.i==c.d.i){if(m.j==c.d.j){j.c[j.c.length]=c;continue}if(m.j==(kUn(),sIt)&&c.d.j==SIt){d.c[d.c.length]=c;continue}}for(o=new Wb(d);o.a<o.c.c.length;)__n(n,c=BB(n0(o),17),e,i,(kUn(),oIt));for(a=new Wb(j);a.a<a.c.c.length;)c=BB(n0(a),17),Bl(E=new $vn(n),(uSn(),Iut)),hon(E,(HXn(),ept),(QEn(),XCt)),hon(E,(hWn(),dlt),c),hon(T=new CSn,dlt,c.d),qCn(T,(kUn(),CIt)),CZ(T,E),hon(M=new CSn,dlt,c.c),qCn(M,oIt),CZ(M,E),hon(c.c,Elt,E),hon(c.d,Elt,E),SZ(c,null),MZ(c,null),e.c[e.c.length]=E,hon(E,Bft,iln(2));for(y=spn(t,0);y.b!=y.d.c;)s=(m=BB(b3(y),11)).e.c.length>0,g=m.g.c.length>0,s&&g?l.c[l.c.length]=m:s?w.c[w.c.length]=m:g&&(v.c[v.c.length]=m);for(b=new Wb(w);b.a<b.c.c.length;)WB(r,HBn(n,BB(n0(b),11),null,e));for(p=new Wb(v);p.a<p.c.c.length;)WB(r,HBn(n,null,BB(n0(p),11),e));for(f=new Wb(l);f.a<f.c.c.length;)WB(r,HBn(n,h=BB(n0(f),11),h,e))}function $Xn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(d=new xC(RQn,RQn),t=new xC(KQn,KQn),k=new Wb(n);k.a<k.c.c.length;)y=BB(n0(k),8),d.a=e.Math.min(d.a,y.a),d.b=e.Math.min(d.b,y.b),t.a=e.Math.max(t.a,y.a),t.b=e.Math.max(t.b,y.b);for(s=new xC(t.a-d.a,t.b-d.b),h=new ZFn(new xC(d.a-50,d.b-s.a-50),new xC(d.a-50,t.b+s.a+50),new xC(t.a+s.b/2+50,d.b+s.b/2)),m=new Rv,c=new Np,i=new Np,m.a.zc(h,m),E=new Wb(n);E.a<E.c.c.length;){for(j=BB(n0(E),8),c.c=x8(Ant,HWn,1,0,5,1),v=m.a.ec().Kc();v.Ob();)W8((g=BB(v.Pb(),308)).d,g.a),Ibn(W8(g.d,j),W8(g.d,g.a))<0&&(c.c[c.c.length]=g);for(i.c=x8(Ant,HWn,1,0,5,1),p=new Wb(c);p.a<p.c.c.length;)for(b=new Wb((g=BB(n0(p),308)).e);b.a<b.c.c.length;){for(f=BB(n0(b),168),a=!0,o=new Wb(c);o.a<o.c.c.length;)(u=BB(n0(o),308))!=g&&(cV(f,xq(u.e,0))||cV(f,xq(u.e,1))||cV(f,xq(u.e,2)))&&(a=!1);a&&(i.c[i.c.length]=f)}for(oMn(m,c),e5(m,new bn),l=new Wb(i);l.a<l.c.c.length;)TU(m,new ZFn(j,(f=BB(n0(l),168)).a,f.b))}for(e5(m,new jw(w=new Rv)),r=w.a.ec().Kc();r.Ob();)(K7(h,(f=BB(r.Pb(),168)).a)||K7(h,f.b))&&r.Qb();return e5(w,new wn),w}function LXn(n){var t,e,i;switch(e=BB(mMn(n,(hWn(),Zft)),21),t=kA(Nat),BB(mMn(n,(HXn(),sgt)),334)==(ufn(),pCt)&&Jcn(t,xat),qy(TD(mMn(n,ugt)))?dq(t,(yMn(),Rat),(lWn(),Hot)):dq(t,(yMn(),_at),(lWn(),Hot)),null!=mMn(n,(C6(),TMt))&&Jcn(t,Dat),(qy(TD(mMn(n,ggt)))||qy(TD(mMn(n,ogt))))&&WG(t,(yMn(),Bat),(lWn(),eot)),BB(mMn(n,Udt),103).g){case 2:case 3:case 4:WG(dq(t,(yMn(),Rat),(lWn(),rot)),Bat,iot)}switch(e.Hc((bDn(),hft))&&WG(dq(dq(t,(yMn(),Rat),(lWn(),tot)),Fat,Zut),Bat,not),GI(mMn(n,Sgt))!==GI((sNn(),Ivt))&&dq(t,(yMn(),_at),(lWn(),Not)),e.Hc(pft)&&(dq(t,(yMn(),Rat),(lWn(),Fot)),dq(t,Kat,Kot),dq(t,_at,_ot)),GI(mMn(n,Pdt))!==GI((JMn(),cft))&&GI(mMn(n,Zdt))!==GI((Mbn(),YPt))&&WG(t,(yMn(),Bat),(lWn(),pot)),qy(TD(mMn(n,fgt)))&&dq(t,(yMn(),_at),(lWn(),got)),qy(TD(mMn(n,Hdt)))&&dq(t,(yMn(),_at),(lWn(),Wot)),KLn(n)&&(i=(GI(mMn(n,sgt))===GI(pCt)?BB(mMn(n,Rdt),292):BB(mMn(n,Kdt),292))==(Kan(),jft)?(lWn(),Rot):(lWn(),Yot),dq(t,(yMn(),Fat),i)),BB(mMn(n,zpt),377).g){case 1:dq(t,(yMn(),Fat),(lWn(),Vot));break;case 2:WG(dq(dq(t,(yMn(),_at),(lWn(),Vut)),Fat,Qut),Bat,Yut)}return GI(mMn(n,Ldt))!==GI((mon(),Nvt))&&dq(t,(yMn(),_at),(lWn(),Qot)),t}function NXn(n){NM(n,new MTn(vj(wj(pj(gj(new du,$4n),"ELK Rectangle Packing"),"Algorithm for packing of unconnected boxes, i.e. graphs without edges. The given order of the boxes is always preserved and the main reading direction of the boxes is left to right. The algorithm is divided into two phases. One phase approximates the width in which the rectangles can be placed. The next phase places the rectangles in rows using the previously calculated width as bounding width and bundles rectangles with a similar height in blocks. A compaction step reduces the size of the drawing. Finally, the rectangles are expanded to fill their bounding box and eliminate empty unused spaces."),new Za))),u2(n,$4n,VJn,1.3),u2(n,$4n,A4n,mpn(gEt)),u2(n,$4n,QJn,IEt),u2(n,$4n,vZn,15),u2(n,$4n,u3n,mpn(bEt)),u2(n,$4n,PZn,mpn(jEt)),u2(n,$4n,BZn,mpn(EEt)),u2(n,$4n,SZn,mpn(TEt)),u2(n,$4n,CZn,mpn(kEt)),u2(n,$4n,MZn,mpn(MEt)),u2(n,$4n,IZn,mpn(OEt)),u2(n,$4n,E4n,mpn(PEt)),u2(n,$4n,T4n,mpn(yEt)),u2(n,$4n,P4n,mpn(SEt)),u2(n,$4n,C4n,mpn(AEt)),u2(n,$4n,I4n,mpn(pEt)),u2(n,$4n,jZn,mpn(vEt)),u2(n,$4n,m3n,mpn(mEt)),u2(n,$4n,S4n,mpn(dEt)),u2(n,$4n,M4n,mpn(wEt)),u2(n,$4n,O4n,mpn(LEt))}function xXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d;if(null==e)return null;if(n.a!=t.Aj())throw Hp(new _y(d6n+t.ne()+g6n));if(cL(t,457)){if(!(d=SDn(BB(t,671),e)))throw Hp(new _y(p6n+e+"' is not a valid enumerator of '"+t.ne()+"'"));return d}switch(Cfn((IPn(),Z$t),t).cl()){case 2:e=FBn(e,!1);break;case 3:e=FBn(e,!0)}if(i=Cfn(Z$t,t).$k())return i.Aj().Nh().Kh(i,e);if(f=Cfn(Z$t,t).al()){for(d=new Np,s=0,h=(o=ysn(e)).length;s<h;++s)u=o[s],WB(d,f.Aj().Nh().Kh(f,u));return d}if(!(w=Cfn(Z$t,t).bl()).dc()){for(b=w.Kc();b.Ob();){l=BB(b.Pb(),148);try{if(null!=(d=l.Aj().Nh().Kh(l,e)))return d}catch(g){if(!cL(g=lun(g),60))throw Hp(g)}}throw Hp(new _y(p6n+e+"' does not match any member types of the union datatype '"+t.ne()+"'"))}if(BB(t,834).Fj(),!(r=xfn(t.Bj())))return null;if(r==Stt){c=0;try{c=l_n(e,_Vn,DWn)&QVn}catch(g){if(!cL(g=lun(g),127))throw Hp(g);c=V7(e)[0]}return fun(c)}if(r==mtt){for(a=0;a<IOt.length;++a)try{return BM(IOt[a],e)}catch(g){if(!cL(g=lun(g),32))throw Hp(g)}throw Hp(new _y(p6n+e+"' is not a date formatted string of the form yyyy-MM-dd'T'HH:mm:ss'.'SSSZ or a valid subset thereof"))}throw Hp(new _y(p6n+e+"' is invalid. "))}function DXn(n,t){var e,i,r,c,a,u,o,s;if(e=0,a=0,c=t.length,u=null,s=new Ik,a<c&&(b1(a,t.length),43==t.charCodeAt(a))&&(++e,++a<c&&(b1(a,t.length),43==t.charCodeAt(a)||(b1(a,t.length),45==t.charCodeAt(a)))))throw Hp(new Mk(DQn+t+'"'));for(;a<c&&(b1(a,t.length),46!=t.charCodeAt(a))&&(b1(a,t.length),101!=t.charCodeAt(a))&&(b1(a,t.length),69!=t.charCodeAt(a));)++a;if(s.a+=""+fx(null==t?zWn:(kW(t),t),e,a),a<c&&(b1(a,t.length),46==t.charCodeAt(a))){for(e=++a;a<c&&(b1(a,t.length),101!=t.charCodeAt(a))&&(b1(a,t.length),69!=t.charCodeAt(a));)++a;n.e=a-e,s.a+=""+fx(null==t?zWn:(kW(t),t),e,a)}else n.e=0;if(a<c&&(b1(a,t.length),101==t.charCodeAt(a)||(b1(a,t.length),69==t.charCodeAt(a)))&&(e=++a,a<c&&(b1(a,t.length),43==t.charCodeAt(a))&&++a<c&&(b1(a,t.length),45!=t.charCodeAt(a))&&++e,u=t.substr(e,c-e),n.e=n.e-l_n(u,_Vn,DWn),n.e!=CJ(n.e)))throw Hp(new Mk("Scale out of range."));if((o=s.a).length<16){if(n.f=(null==Vtt&&(Vtt=new RegExp("^[+-]?\\d*$","i")),Vtt.test(o)?parseInt(o,10):NaN),isNaN(n.f))throw Hp(new Mk(DQn+t+'"'));n.a=aIn(n.f)}else fdn(n,new $A(o));for(n.d=s.a.length,r=0;r<s.a.length&&(45==(i=fV(s.a,r))||48==i);++r)--n.d;0==n.d&&(n.d=1)}function RXn(){RXn=O,JIn(fut=new pJ,(kUn(),wIt),vIt),JIn(fut,MIt,vIt),JIn(fut,MIt,kIt),JIn(fut,hIt,pIt),JIn(fut,hIt,vIt),JIn(fut,dIt,vIt),JIn(fut,dIt,mIt),JIn(fut,EIt,lIt),JIn(fut,EIt,vIt),JIn(fut,yIt,bIt),JIn(fut,yIt,vIt),JIn(fut,yIt,mIt),JIn(fut,yIt,lIt),JIn(fut,bIt,yIt),JIn(fut,bIt,kIt),JIn(fut,bIt,pIt),JIn(fut,bIt,vIt),JIn(fut,jIt,jIt),JIn(fut,jIt,mIt),JIn(fut,jIt,kIt),JIn(fut,gIt,gIt),JIn(fut,gIt,mIt),JIn(fut,gIt,pIt),JIn(fut,TIt,TIt),JIn(fut,TIt,lIt),JIn(fut,TIt,kIt),JIn(fut,fIt,fIt),JIn(fut,fIt,lIt),JIn(fut,fIt,pIt),JIn(fut,mIt,dIt),JIn(fut,mIt,yIt),JIn(fut,mIt,jIt),JIn(fut,mIt,gIt),JIn(fut,mIt,vIt),JIn(fut,mIt,mIt),JIn(fut,mIt,kIt),JIn(fut,mIt,pIt),JIn(fut,lIt,EIt),JIn(fut,lIt,yIt),JIn(fut,lIt,TIt),JIn(fut,lIt,fIt),JIn(fut,lIt,lIt),JIn(fut,lIt,kIt),JIn(fut,lIt,pIt),JIn(fut,lIt,vIt),JIn(fut,kIt,MIt),JIn(fut,kIt,bIt),JIn(fut,kIt,jIt),JIn(fut,kIt,TIt),JIn(fut,kIt,mIt),JIn(fut,kIt,lIt),JIn(fut,kIt,kIt),JIn(fut,kIt,vIt),JIn(fut,pIt,hIt),JIn(fut,pIt,bIt),JIn(fut,pIt,gIt),JIn(fut,pIt,fIt),JIn(fut,pIt,mIt),JIn(fut,pIt,lIt),JIn(fut,pIt,pIt),JIn(fut,pIt,vIt),JIn(fut,vIt,wIt),JIn(fut,vIt,MIt),JIn(fut,vIt,hIt),JIn(fut,vIt,dIt),JIn(fut,vIt,EIt),JIn(fut,vIt,yIt),JIn(fut,vIt,bIt),JIn(fut,vIt,mIt),JIn(fut,vIt,lIt),JIn(fut,vIt,kIt),JIn(fut,vIt,pIt),JIn(fut,vIt,vIt)}function KXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;for(n.d=new xC(RQn,RQn),n.c=new xC(KQn,KQn),l=t.Kc();l.Ob();)for(m=new Wb(BB(l.Pb(),37).a);m.a<m.c.c.length;)v=BB(n0(m),10),n.d.a=e.Math.min(n.d.a,v.n.a-v.d.b),n.d.b=e.Math.min(n.d.b,v.n.b-v.d.d),n.c.a=e.Math.max(n.c.a,v.n.a+v.o.a+v.d.c),n.c.b=e.Math.max(n.c.b,v.n.b+v.o.b+v.d.a);for(o=new Yv,f=t.Kc();f.Ob();)r=uXn(n,BB(f.Pb(),37)),WB(o.a,r),r.a=r.a|!BB(mMn(r.c,(hWn(),Xft)),21).dc();for(n.b=(Shn(),(T=new kt).f=new vin(i),T.b=oGn(T.f,o),T),jGn((w=n.b,new Xm,w)),n.e=new Gj,n.a=n.b.f.e,u=new Wb(o.a);u.a<u.c.c.length;)for(c=BB(n0(u),841),y=AJ(n.b,c),nKn(c.c,y.a,y.b),g=new Wb(c.c.a);g.a<g.c.c.length;)(d=BB(n0(g),10)).k==(uSn(),Mut)&&(p=lLn(n,d.n,BB(mMn(d,(hWn(),Qft)),61)),UR(kO(d.n),p));for(a=new Wb(o.a);a.a<a.c.c.length;)for(h=new Wb(wln(c=BB(n0(a),841)));h.a<h.c.c.length;)for(Kx(E=new Kj((s=BB(n0(h),17)).a),0,g1(s.c)),DH(E,g1(s.d)),b=null,j=spn(E,0);j.b!=j.d.c;)k=BB(b3(j),8),b?(uen(b.a,k.a)?(n.e.a=e.Math.min(n.e.a,b.a),n.a.a=e.Math.max(n.a.a,b.a)):uen(b.b,k.b)&&(n.e.b=e.Math.min(n.e.b,b.b),n.a.b=e.Math.max(n.a.b,b.b)),b=k):b=k;qx(n.e),UR(n.a,n.e)}function _Xn(n){V$n(n.b,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ConsistentTransient"])),V$n(n.a,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"WellFormedSourceURI"])),V$n(n.o,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"InterfaceIsAbstract AtMostOneID UniqueFeatureNames UniqueOperationSignatures NoCircularSuperTypes WellFormedMapEntryClass ConsistentSuperTypes DisjointFeatureAndOperationSignatures"])),V$n(n.p,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"WellFormedInstanceTypeName UniqueTypeParameterNames"])),V$n(n.v,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"UniqueEnumeratorNames UniqueEnumeratorLiterals"])),V$n(n.R,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"WellFormedName"])),V$n(n.T,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"UniqueParameterNames UniqueTypeParameterNames NoRepeatingVoid"])),V$n(n.U,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"WellFormedNsURI WellFormedNsPrefix UniqueSubpackageNames UniqueClassifierNames UniqueNsURIs"])),V$n(n.W,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ConsistentOpposite SingleContainer ConsistentKeys ConsistentUnique ConsistentContainer"])),V$n(n.bb,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ValidDefaultValueLiteral"])),V$n(n.eb,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ValidLowerBound ValidUpperBound ConsistentBounds ValidType"])),V$n(n.H,V9n,Pun(Gk(Qtt,1),sVn,2,6,[Y9n,"ConsistentType ConsistentBounds ConsistentArguments"]))}function FXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;if(!t.dc()){if(r=new km,f=(a=e||BB(t.Xb(0),17)).c,gxn(),(s=f.i.k)!=(uSn(),Cut)&&s!=Iut&&s!=Mut&&s!=Tut)throw Hp(new _y("The target node of the edge must be a normal node or a northSouthPort."));for(fO(r,Aon(Pun(Gk(PMt,1),sVn,8,0,[f.i.n,f.n,f.a]))),(kUn(),yIt).Hc(f.j)&&(b=Gy(MD(mMn(f,(hWn(),Llt)))),r5(r,new xC(Aon(Pun(Gk(PMt,1),sVn,8,0,[f.i.n,f.n,f.a])).a,b),r.c.b,r.c)),o=null,i=!1,u=t.Kc();u.Ob();)0!=(c=BB(u.Pb(),17).a).b&&(i?(r5(r,kL(UR(o,(Px(0!=c.b),BB(c.a.a.c,8))),.5),r.c.b,r.c),i=!1):i=!0,o=B$((Px(0!=c.b),BB(c.c.b.c,8))),Frn(r,c),yQ(c));l=a.d,yIt.Hc(l.j)&&(b=Gy(MD(mMn(l,(hWn(),Llt)))),r5(r,new xC(Aon(Pun(Gk(PMt,1),sVn,8,0,[l.i.n,l.n,l.a])).a,b),r.c.b,r.c)),fO(r,Aon(Pun(Gk(PMt,1),sVn,8,0,[l.i.n,l.n,l.a]))),n.d==(Usn(),emt)&&(Px(0!=r.b),w=BB(r.a.a.c,8),d=BB(Dpn(r,1),8),(g=new XZ(hsn(f.j))).a*=5,g.b*=5,p=XR(new xC(d.a,d.b),w),UR(v=new xC(iZ(g.a,p.a),iZ(g.b,p.b)),w),nX(spn(r,1),v),Px(0!=r.b),m=BB(r.c.b.c,8),y=BB(Dpn(r,r.b-2),8),(g=new XZ(hsn(l.j))).a*=5,g.b*=5,p=XR(new xC(y.a,y.b),m),UR(k=new xC(iZ(g.a,p.a),iZ(g.b,p.b)),m),Kx(r,r.b-1,k)),h=new oBn(r),Frn(a.a,Fvn(h))}}function BXn(n,t,i,r){var c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A,$,L,N,x;if(y=(v=BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)).Dg(),k=v.Eg(),m=v.Cg()/2,w=v.Bg()/2,cL(v,186)&&(y+=WJ(p=BB(v,118)).i,y+=WJ(p).i),y+=m,k+=w,C=(S=BB(Wtn((!n.b&&(n.b=new hK(KOt,n,4,7)),n.b),0),82)).Dg(),I=S.Eg(),P=S.Cg()/2,j=S.Bg()/2,cL(S,186)&&(C+=WJ(M=BB(S,118)).i,C+=WJ(M).i),C+=P,I+=j,0==(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)tE(),o=new co,f9((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),o);else if((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i>1)for(b=new cx((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a));b.e!=b.i.gc();)Qjn(b);for(d=C,C>y+m?d=y+m:C<y-m&&(d=y-m),g=I,I>k+w?g=k+w:I<k-w&&(g=k-w),d>y-m&&d<y+m&&g>k-w&&g<k+w&&(d=y+m),Ien(u=BB(Wtn((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),0),202),d),Aen(u,g),E=y,y>C+P?E=C+P:y<C-P&&(E=C-P),T=k,k>I+j?T=I+j:k<I-j&&(T=I-j),E>C-P&&E<C+P&&T>I-j&&T<I+j&&(T=I+j),Ten(u,E),Oen(u,T),sqn((!u.a&&(u.a=new $L(xOt,u,5)),u.a)),a=pvn(t,5),v==S&&++a,A=E-d,N=T-g,h=.20000000298023224*e.Math.sqrt(A*A+N*N),$=A/(a+1),x=N/(a+1),O=d,L=g,s=0;s<a;s++)L+=x,(f=(O+=$)+H$n(t,24)*uYn*h-h/2)<0?f=1:f>i&&(f=i-1),(l=L+H$n(t,24)*uYn*h-h/2)<0?l=1:l>r&&(l=r-1),tE(),jen(c=new ro,f),Een(c,l),f9((!u.a&&(u.a=new $L(xOt,u,5)),u.a),c)}function HXn(){HXn=O,sWn(),ppt=jPt,vpt=EPt,mpt=TPt,ypt=MPt,jpt=SPt,Ept=PPt,Spt=IPt,Cpt=APt,Ipt=$Pt,Ppt=OPt,Opt=LPt,$pt=NPt,Npt=RPt,Mpt=CPt,fWn(),gpt=_wt,kpt=Fwt,Tpt=Bwt,Apt=Hwt,hpt=new XA(pPt,iln(0)),fpt=Dwt,lpt=Rwt,bpt=Kwt,zpt=ldt,Rpt=zwt,Kpt=Wwt,Bpt=edt,_pt=Ywt,Fpt=Zwt,Xpt=pdt,Upt=wdt,qpt=odt,Hpt=adt,Gpt=hdt,Rgt=Pwt,Kgt=Cwt,rgt=Kbt,cgt=Bbt,Ugt=new WA(12),zgt=new XA(XSt,Ugt),Mbn(),Zdt=new XA(vSt,ngt=QPt),tpt=new XA(aPt,0),wpt=new XA(vPt,iln(1)),Edt=new XA(cSt,dZn),Ggt=zSt,ept=uPt,upt=wPt,zdt=lSt,kdt=iSt,sgt=ESt,dpt=new XA(kPt,(hN(),!0)),wgt=SSt,dgt=PSt,Fgt=KSt,qgt=qSt,Bgt=FSt,Ffn(),Udt=new XA(bSt,Wdt=BPt),$gt=DSt,Agt=NSt,cpt=fPt,rpt=hPt,apt=bPt,cpn(),new XA(ZSt,Vgt=qCt),Ygt=ePt,Jgt=iPt,Zgt=rPt,Qgt=tPt,Dpt=Gwt,Pgt=lwt,Sgt=hwt,xpt=qwt,kgt=ewt,Gdt=Tbt,qdt=jbt,xdt=ubt,Ddt=obt,Kdt=bbt,Rdt=sbt,Hdt=ybt,Igt=wwt,Ogt=dwt,pgt=Vbt,_gt=$wt,Ngt=mwt,ugt=Gbt,Dgt=Mwt,egt=Nbt,igt=Dbt,Ndt=hSt,Lgt=gwt,Pdt=Qlt,Sdt=Wlt,Mdt=Xlt,fgt=Xbt,hgt=Ubt,lgt=Wbt,Hgt=BSt,vgt=OSt,agt=ySt,Ydt=gSt,Qdt=dSt,_dt=gbt,ipt=sPt,Tdt=sSt,bgt=MSt,npt=cPt,Xgt=VSt,Wgt=YSt,Egt=cwt,Tgt=uwt,spt=gPt,jdt=Ult,Mgt=swt,Jdt=Obt,Vdt=Cbt,Cgt=$St,mgt=Zbt,xgt=jwt,Lpt=xPt,Xdt=Sbt,opt=Nwt,tgt=$bt,ygt=twt,Fdt=vbt,ggt=ISt,jgt=rwt,Bdt=mbt,Ldt=cbt,Adt=ebt,Idt=nbt,Odt=tbt,$dt=rbt,Cdt=Jlt,ogt=zbt}function qXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C;if(uHn(),T=n.e,w=n.d,r=n.a,0==T)switch(t){case 0:return"0";case 1:return WQn;case 2:return"0.00";case 3:return"0.000";case 4:return"0.0000";case 5:return"0.00000";case 6:return"0.000000";default:return(j=new Ck).a+=t<0?"0E+":"0E",j.a+=-t,j.a}if(y=x8(ONt,WVn,25,1+(m=10*w+1+7),15,1),e=m,1==w)if((u=r[0])<0){C=e0(u,UQn);do{d=C,C=Ojn(C,10),y[--e]=48+dG(ibn(d,cbn(C,10)))&QVn}while(0!=Vhn(C,0))}else{C=u;do{d=C,C=C/10|0,y[--e]=d-10*C+48&QVn}while(0!=C)}else{aHn(r,0,S=x8(ANt,hQn,25,w,15,1),0,P=w);n:for(;;){for(E=0,s=P-1;s>=0;s--)p=fTn(rbn(yz(E,32),e0(S[s],UQn))),S[s]=dG(p),E=dG(kz(p,32));v=dG(E),g=e;do{y[--e]=48+v%10&QVn}while(0!=(v=v/10|0)&&0!=e);for(i=9-g+e,o=0;o<i&&e>0;o++)y[--e]=48;for(f=P-1;0==S[f];f--)if(0==f)break n;P=f+1}for(;48==y[e];)++e}if(b=T<0,a=m-e-t-1,0==t)return b&&(y[--e]=45),Bdn(y,e,m-e);if(t>0&&a>=-6){if(a>=0){for(h=e+a,l=m-1;l>=h;l--)y[l+1]=y[l];return y[++h]=46,b&&(y[--e]=45),Bdn(y,e,m-e+1)}for(f=2;f<1-a;f++)y[--e]=48;return y[--e]=46,y[--e]=48,b&&(y[--e]=45),Bdn(y,e,m-e)}return M=e+1,c=m,k=new Ik,b&&(k.a+="-"),c-M>=1?(xX(k,y[e]),k.a+=".",k.a+=Bdn(y,e+1,m-e-1)):k.a+=Bdn(y,e,m-e),k.a+="E",a>0&&(k.a+="+"),k.a+=""+a,k.a}function GXn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;switch(n.c=t,n.g=new xp,GM(),twn(new Pw(new Dy(n.c))),v=SD(ZAn(n.c,(MMn(),dTt))),u=BB(ZAn(n.c,pTt),316),y=BB(ZAn(n.c,vTt),429),c=BB(ZAn(n.c,hTt),482),m=BB(ZAn(n.c,gTt),430),n.j=Gy(MD(ZAn(n.c,mTt))),a=n.a,u.g){case 0:a=n.a;break;case 1:a=n.b;break;case 2:a=n.i;break;case 3:a=n.e;break;case 4:a=n.f;break;default:throw Hp(new _y(N4n+(null!=u.f?u.f:""+u.g)))}if(n.d=new DJ(a,y,c),hon(n.d,(Xcn(),Qrt),TD(ZAn(n.c,lTt))),n.d.c=qy(TD(ZAn(n.c,fTt))),0==YQ(n.c).i)return n.d;for(h=new AL(YQ(n.c));h.e!=h.i.gc();){for(l=(s=BB(kpn(h),33)).g/2,f=s.f/2,k=new xC(s.i+l,s.j+f);hU(n.g,k);)_x(k,(e.Math.random()-.5)*lZn,(e.Math.random()-.5)*lZn);w=BB(ZAn(s,(sWn(),$St)),142),d=new AZ(k,new UV(k.a-l-n.j/2-w.b,k.b-f-n.j/2-w.d,s.g+n.j+(w.b+w.c),s.f+n.j+(w.d+w.a))),WB(n.d.i,d),VW(n.g,k,new rI(d,s))}switch(m.g){case 0:if(null==v)n.d.d=BB(xq(n.d.i,0),65);else for(p=new Wb(n.d.i);p.a<p.c.c.length;)d=BB(n0(p),65),null!=(b=BB(BB(RX(n.g,d.a),46).b,33).zg())&&mK(b,v)&&(n.d.d=d);break;case 1:for((i=new xC(n.c.g,n.c.f)).a*=.5,i.b*=.5,_x(i,n.c.i,n.c.j),r=RQn,g=new Wb(n.d.i);g.a<g.c.c.length;)(o=W8((d=BB(n0(g),65)).a,i))<r&&(r=o,n.d.d=d);break;default:throw Hp(new _y(N4n+(null!=m.f?m.f:""+m.g)))}return n.d}function zXn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E;for(j=BB(Wtn((!n.a&&(n.a=new eU(FOt,n,6,6)),n.a),0),202),f=new km,k=new xp,E=tFn(j),jCn(k.f,j,E),b=new xp,r=new YT,d=NU(Wen(Pun(Gk(xnt,1),HWn,20,0,[(!t.d&&(t.d=new hK(_Ot,t,8,5)),t.d),(!t.e&&(t.e=new hK(_Ot,t,7,4)),t.e)])));dAn(d);){if(w=BB(U5(d),79),1!=(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i)throw Hp(new _y(B5n+(!n.a&&(n.a=new eU(FOt,n,6,6)),n.a).i));w!=n&&(r5(r,p=BB(Wtn((!w.a&&(w.a=new eU(FOt,w,6,6)),w.a),0),202),r.c.b,r.c),(g=BB(qI(AY(k.f,p)),12))||(g=tFn(p),jCn(k.f,p,g)),l=i?XR(new wA(BB(xq(E,E.c.length-1),8)),BB(xq(g,g.c.length-1),8)):XR(new wA((l1(0,E.c.length),BB(E.c[0],8))),(l1(0,g.c.length),BB(g.c[0],8))),jCn(b.f,p,l))}if(0!=r.b)for(v=BB(xq(E,i?E.c.length-1:0),8),h=1;h<E.c.length;h++){for(m=BB(xq(E,i?E.c.length-1-h:h),8),c=spn(r,0);c.b!=c.d.c;)p=BB(b3(c),202),(g=BB(qI(AY(k.f,p)),12)).c.length<=h?mtn(c):(y=UR(new wA(BB(xq(g,i?g.c.length-1-h:h),8)),BB(qI(AY(b.f,p)),8)),m.a==y.a&&m.b==y.b||(a=m.a-v.a,o=m.b-v.b,(u=y.a-v.a)*o==(s=y.b-v.b)*a&&(0==a||isNaN(a)?a:a<0?-1:1)==(0==u||isNaN(u)?u:u<0?-1:1)&&(0==o||isNaN(o)?o:o<0?-1:1)==(0==s||isNaN(s)?s:s<0?-1:1)?(e.Math.abs(a)<e.Math.abs(u)||e.Math.abs(o)<e.Math.abs(s))&&r5(f,m,f.c.b,f.c):h>1&&r5(f,v,f.c.b,f.c),mtn(c)));v=m}return f}function UXn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A;for(OTn(e,"Greedy cycle removal",1),A=(m=t.a).c.length,n.a=x8(ANt,hQn,25,A,15,1),n.c=x8(ANt,hQn,25,A,15,1),n.b=x8(ANt,hQn,25,A,15,1),s=0,p=new Wb(m);p.a<p.c.c.length;){for((d=BB(n0(p),10)).p=s,T=new Wb(d.j);T.a<T.c.c.length;){for(u=new Wb((k=BB(n0(T),11)).e);u.a<u.c.c.length;)(i=BB(n0(u),17)).c.i!=d&&(S=BB(mMn(i,(HXn(),fpt)),19).a,n.a[s]+=S>0?S+1:1);for(a=new Wb(k.g);a.a<a.c.c.length;)(i=BB(n0(a),17)).d.i!=d&&(S=BB(mMn(i,(HXn(),fpt)),19).a,n.c[s]+=S>0?S+1:1)}0==n.c[s]?DH(n.e,d):0==n.a[s]&&DH(n.f,d),++s}for(w=-1,b=1,f=new Np,n.d=BB(mMn(t,(hWn(),Slt)),230);A>0;){for(;0!=n.e.b;)C=BB(dH(n.e),10),n.b[C.p]=w--,QKn(n,C),--A;for(;0!=n.f.b;)I=BB(dH(n.f),10),n.b[I.p]=b++,QKn(n,I),--A;if(A>0){for(l=_Vn,v=new Wb(m);v.a<v.c.c.length;)d=BB(n0(v),10),0==n.b[d.p]&&(y=n.c[d.p]-n.a[d.p])>=l&&(y>l&&(f.c=x8(Ant,HWn,1,0,5,1),l=y),f.c[f.c.length]=d);h=n.Zf(f),n.b[h.p]=b++,QKn(n,h),--A}}for(P=m.c.length+1,s=0;s<m.c.length;s++)n.b[s]<0&&(n.b[s]+=P);for(g=new Wb(m);g.a<g.c.c.length;)for(E=0,M=(j=I2((d=BB(n0(g),10)).j)).length;E<M;++E)for(c=0,o=(r=Z0((k=j[E]).g)).length;c<o;++c)O=(i=r[c]).d.i.p,n.b[d.p]>n.b[O]&&(tBn(i,!0),hon(t,qft,(hN(),!0)));n.a=null,n.c=null,n.b=null,yQ(n.f),yQ(n.e),HSn(e)}function XXn(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;for(i=new Np,u=new Np,g=t/2,b=n.gc(),r=BB(n.Xb(0),8),p=BB(n.Xb(1),8),WB(i,(l1(0,(w=QAn(r.a,r.b,p.a,p.b,g)).c.length),BB(w.c[0],8))),WB(u,(l1(1,w.c.length),BB(w.c[1],8))),s=2;s<b;s++)d=r,r=p,p=BB(n.Xb(s),8),WB(i,(l1(1,(w=QAn(r.a,r.b,d.a,d.b,g)).c.length),BB(w.c[1],8))),WB(u,(l1(0,w.c.length),BB(w.c[0],8))),WB(i,(l1(0,(w=QAn(r.a,r.b,p.a,p.b,g)).c.length),BB(w.c[0],8))),WB(u,(l1(1,w.c.length),BB(w.c[1],8)));for(WB(i,(l1(1,(w=QAn(p.a,p.b,r.a,r.b,g)).c.length),BB(w.c[1],8))),WB(u,(l1(0,w.c.length),BB(w.c[0],8))),e=new km,a=new Np,DH(e,(l1(0,i.c.length),BB(i.c[0],8))),h=1;h<i.c.length-2;h+=2)l1(h,i.c.length),c=BB(i.c[h],8),l=qPn((l1(h-1,i.c.length),BB(i.c[h-1],8)),c,(l1(h+1,i.c.length),BB(i.c[h+1],8)),(l1(h+2,i.c.length),BB(i.c[h+2],8))),isFinite(l.a)&&isFinite(l.b)?r5(e,l,e.c.b,e.c):r5(e,c,e.c.b,e.c);for(DH(e,BB(xq(i,i.c.length-1),8)),WB(a,(l1(0,u.c.length),BB(u.c[0],8))),f=1;f<u.c.length-2;f+=2)l1(f,u.c.length),c=BB(u.c[f],8),l=qPn((l1(f-1,u.c.length),BB(u.c[f-1],8)),c,(l1(f+1,u.c.length),BB(u.c[f+1],8)),(l1(f+2,u.c.length),BB(u.c[f+2],8))),isFinite(l.a)&&isFinite(l.b)?a.c[a.c.length]=l:a.c[a.c.length]=c;for(WB(a,BB(xq(u,u.c.length-1),8)),o=a.c.length-1;o>=0;o--)DH(e,(l1(o,a.c.length),BB(a.c[o],8)));return e}function WXn(n){var t,e,i,r,c,a,u,o,s,h,f,l,b;if(a=!0,f=null,i=null,r=null,t=!1,b=kAt,s=null,c=null,(o=Vgn(n,u=0,AAt,$At))<n.length&&(b1(o,n.length),58==n.charCodeAt(o))&&(f=n.substr(u,o-u),u=o+1),e=null!=f&&xT(jAt,f.toLowerCase())){if(-1==(o=n.lastIndexOf("!/")))throw Hp(new _y("no archive separator"));a=!0,i=fx(n,u,++o),u=o}else u>=0&&mK(n.substr(u,2),"//")?(o=Vgn(n,u+=2,LAt,NAt),i=n.substr(u,o-u),u=o):null==f||u!=n.length&&(b1(u,n.length),47==n.charCodeAt(u))||(a=!1,-1==(o=yN(n,YTn(35),u))&&(o=n.length),i=n.substr(u,o-u),u=o);if(!e&&u<n.length&&(b1(u,n.length),47==n.charCodeAt(u))&&(o=Vgn(n,u+1,LAt,NAt),(h=n.substr(u+1,o-(u+1))).length>0&&58==fV(h,h.length-1)&&(r=h,u=o)),u<n.length&&(b1(u,n.length),47==n.charCodeAt(u))&&(++u,t=!0),u<n.length&&(b1(u,n.length),63!=n.charCodeAt(u))&&(b1(u,n.length),35!=n.charCodeAt(u))){for(l=new Np;u<n.length&&(b1(u,n.length),63!=n.charCodeAt(u))&&(b1(u,n.length),35!=n.charCodeAt(u));)o=Vgn(n,u,LAt,NAt),WB(l,n.substr(u,o-u)),(u=o)<n.length&&(b1(u,n.length),47==n.charCodeAt(u))&&(Qhn(n,++u)||(l.c[l.c.length]=""));Qgn(l,b=x8(Qtt,sVn,2,l.c.length,6,1))}return u<n.length&&(b1(u,n.length),63==n.charCodeAt(u))&&(-1==(o=lx(n,35,++u))&&(o=n.length),s=n.substr(u,o-u),u=o),u<n.length&&(c=nO(n,++u)),wGn(a,f,i,r,b,s),new rRn(a,f,i,r,t,b,s,c)}function VXn(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A,$;for(O=new Np,w=new Wb(t.b);w.a<w.c.c.length;)for(k=new Wb(BB(n0(w),29).a);k.a<k.c.c.length;){for((y=BB(n0(k),10)).p=-1,l=_Vn,T=_Vn,S=new Wb(y.j);S.a<S.c.c.length;){for(c=new Wb((M=BB(n0(S),11)).e);c.a<c.c.c.length;)i=BB(n0(c),17),P=BB(mMn(i,(HXn(),bpt)),19).a,l=e.Math.max(l,P);for(r=new Wb(M.g);r.a<r.c.c.length;)i=BB(n0(r),17),P=BB(mMn(i,(HXn(),bpt)),19).a,T=e.Math.max(T,P)}hon(y,Xmt,iln(l)),hon(y,Wmt,iln(T))}for(p=0,b=new Wb(t.b);b.a<b.c.c.length;)for(k=new Wb(BB(n0(b),29).a);k.a<k.c.c.length;)(y=BB(n0(k),10)).p<0&&((I=new rm).b=p++,jRn(n,y,I),O.c[O.c.length]=I);for(E=sx(O.c.length),f=sx(O.c.length),u=0;u<O.c.length;u++)WB(E,new Np),WB(f,iln(0));for(vzn(t,O,E,f),A=BB(Qgn(O,x8(Ymt,O3n,257,O.c.length,0,1)),840),j=BB(Qgn(E,x8(Rnt,nZn,15,E.c.length,0,1)),192),h=x8(ANt,hQn,25,f.c.length,15,1),o=0;o<h.length;o++)h[o]=(l1(o,f.c.length),BB(f.c[o],19)).a;for(v=0,m=new Np,s=0;s<A.length;s++)0==h[s]&&WB(m,A[s]);for(g=x8(ANt,hQn,25,A.length,15,1);0!=m.c.length;)for(g[(I=BB(s6(m,0),257)).b]=v++;!j[I.b].dc();)--h[($=BB(j[I.b].$c(0),257)).b],0==h[$.b]&&(m.c[m.c.length]=$);for(n.a=x8(Ymt,O3n,257,A.length,0,1),a=0;a<A.length;a++)for(d=A[a],C=g[a],n.a[C]=d,d.b=C,k=new Wb(d.e);k.a<k.c.c.length;)(y=BB(n0(k),10)).p=C;return n.a}function QXn(n){var t,e,i;if(n.d>=n.j)return n.a=-1,void(n.c=1);if(t=fV(n.i,n.d++),n.a=t,1!=n.b){switch(t){case 124:i=2;break;case 42:i=3;break;case 43:i=4;break;case 63:i=5;break;case 41:i=7;break;case 46:i=8;break;case 91:i=9;break;case 94:i=11;break;case 36:i=12;break;case 40:if(i=6,n.d>=n.j)break;if(63!=fV(n.i,n.d))break;if(++n.d>=n.j)throw Hp(new ak(kWn((u$(),p8n))));switch(t=fV(n.i,n.d++)){case 58:i=13;break;case 61:i=14;break;case 33:i=15;break;case 91:i=19;break;case 62:i=18;break;case 60:if(n.d>=n.j)throw Hp(new ak(kWn((u$(),p8n))));if(61==(t=fV(n.i,n.d++)))i=16;else{if(33!=t)throw Hp(new ak(kWn((u$(),v8n))));i=17}break;case 35:for(;n.d<n.j&&41!=(t=fV(n.i,n.d++)););if(41!=t)throw Hp(new ak(kWn((u$(),m8n))));i=21;break;default:if(45==t||97<=t&&t<=122||65<=t&&t<=90){--n.d,i=22;break}if(40==t){i=23;break}throw Hp(new ak(kWn((u$(),p8n))))}break;case 92:if(i=10,n.d>=n.j)throw Hp(new ak(kWn((u$(),g8n))));n.a=fV(n.i,n.d++);break;default:i=0}n.c=i}else{switch(t){case 92:if(i=10,n.d>=n.j)throw Hp(new ak(kWn((u$(),g8n))));n.a=fV(n.i,n.d++);break;case 45:512==(512&n.e)&&n.d<n.j&&91==fV(n.i,n.d)?(++n.d,i=24):i=0;break;case 91:if(512!=(512&n.e)&&n.d<n.j&&58==fV(n.i,n.d)){++n.d,i=20;break}default:(64512&t)==HQn&&n.d<n.j&&56320==(64512&(e=fV(n.i,n.d)))&&(n.a=BQn+(t-HQn<<10)+e-56320,++n.d),i=0}n.c=i}}function YXn(n){var t,e,i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P;if((j=BB(mMn(n,(HXn(),ept)),98))!=(QEn(),QCt)&&j!=YCt){for(s=new J6((lin((b=(w=n.b).c.length)+2,NVn),ttn(rbn(rbn(5,b+2),(b+2)/10|0)))),d=new J6((lin(b+2,NVn),ttn(rbn(rbn(5,b+2),(b+2)/10|0)))),WB(s,new xp),WB(s,new xp),WB(d,new Np),WB(d,new Np),k=new Np,t=0;t<b;t++)for(l1(t,w.c.length),e=BB(w.c[t],29),l1(t,s.c.length),E=BB(s.c[t],83),g=new xp,s.c[s.c.length]=g,l1(t,d.c.length),M=BB(d.c[t],15),v=new Np,d.c[d.c.length]=v,r=new Wb(e.a);r.a<r.c.c.length;)if(cln(i=BB(n0(r),10)))k.c[k.c.length]=i;else{for(o=new oz(ZL(fbn(i).a.Kc(),new h));dAn(o);)cln(S=(a=BB(U5(o),17)).c.i)&&((T=BB(E.xc(mMn(S,(hWn(),dlt))),10))||(T=oIn(n,S),E.zc(mMn(S,dlt),T),M.Fc(T)),SZ(a,BB(xq(T.j,1),11)));for(u=new oz(ZL(lbn(i).a.Kc(),new h));dAn(u);)cln(P=(a=BB(U5(u),17)).d.i)&&((p=BB(RX(g,mMn(P,(hWn(),dlt))),10))||(p=oIn(n,P),VW(g,mMn(P,dlt),p),v.c[v.c.length]=p),MZ(a,BB(xq(p.j,0),11)))}for(f=0;f<d.c.length;f++)if(l1(f,d.c.length),!(m=BB(d.c[f],15)).dc())for(l=null,0==f?(l=new HX(n),LZ(0,w.c.length),MS(w.c,0,l)):f==s.c.length-1?(l=new HX(n),w.c[w.c.length]=l):(l1(f-1,w.c.length),l=BB(w.c[f-1],29)),c=m.Kc();c.Ob();)PZ(BB(c.Pb(),10),l);for(y=new Wb(k);y.a<y.c.c.length;)PZ(BB(n0(y),10),null);hon(n,(hWn(),Wft),k)}}function JXn(n,t,e){var i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j;if(OTn(e,"Coffman-Graham Layering",1),0!=t.a.c.length){for(j=BB(mMn(t,(HXn(),mgt)),19).a,o=0,a=0,b=new Wb(t.a);b.a<b.c.c.length;)for((l=BB(n0(b),10)).p=o++,c=new oz(ZL(lbn(l).a.Kc(),new h));dAn(c);)(r=BB(U5(c),17)).p=a++;for(n.d=x8($Nt,ZYn,25,o,16,1),n.a=x8($Nt,ZYn,25,a,16,1),n.b=x8(ANt,hQn,25,o,15,1),n.e=x8(ANt,hQn,25,o,15,1),n.f=x8(ANt,hQn,25,o,15,1),win(n.c),rEn(n,t),d=new Xz(new Dd(n)),k=new Wb(t.a);k.a<k.c.c.length;){for(c=new oz(ZL(fbn(m=BB(n0(k),10)).a.Kc(),new h));dAn(c);)r=BB(U5(c),17),n.a[r.p]||++n.b[m.p];0==n.b[m.p]&&F8(eMn(d,m))}for(u=0;0!=d.b.c.length;)for(m=BB(mnn(d),10),n.f[m.p]=u++,c=new oz(ZL(lbn(m).a.Kc(),new h));dAn(c);)r=BB(U5(c),17),n.a[r.p]||(p=r.d.i,--n.b[p.p],JIn(n.c,p,iln(n.f[m.p])),0==n.b[p.p]&&F8(eMn(d,p)));for(w=new Xz(new Rd(n)),y=new Wb(t.a);y.a<y.c.c.length;){for(c=new oz(ZL(lbn(m=BB(n0(y),10)).a.Kc(),new h));dAn(c);)r=BB(U5(c),17),n.a[r.p]||++n.e[m.p];0==n.e[m.p]&&F8(eMn(w,m))}for(i=r1(t,f=new Np);0!=w.b.c.length;)for(v=BB(mnn(w),10),(i.a.c.length>=j||!Ndn(v,i))&&(i=r1(t,f)),PZ(v,i),c=new oz(ZL(fbn(v).a.Kc(),new h));dAn(c);)r=BB(U5(c),17),n.a[r.p]||(g=r.c.i,--n.e[g.p],0==n.e[g.p]&&F8(eMn(w,g)));for(s=f.c.length-1;s>=0;--s)WB(t.b,(l1(s,f.c.length),BB(f.c[s],29)));t.a.c=x8(Ant,HWn,1,0,5,1),HSn(e)}else HSn(e)}function ZXn(n){var t,e,i,r,c,a,u,o;for(n.b=1,QXn(n),t=null,0==n.c&&94==n.a?(QXn(n),wWn(),wWn(),Yxn(t=new M0(4),0,unt),a=new M0(4)):(wWn(),wWn(),a=new M0(4)),r=!0;1!=(o=n.c);){if(0==o&&93==n.a&&!r){t&&(WGn(t,a),a=t);break}if(e=n.a,i=!1,10==o)switch(e){case 100:case 68:case 119:case 87:case 115:case 83:sHn(a,d_n(e)),i=!0;break;case 105:case 73:case 99:case 67:sHn(a,d_n(e)),(e=-1)<0&&(i=!0);break;case 112:case 80:if(!(u=DIn(n,e)))throw Hp(new ak(kWn((u$(),O8n))));sHn(a,u),i=!0;break;default:e=qDn(n)}else if(24==o&&!r){if(t&&(WGn(t,a),a=t),WGn(a,ZXn(n)),0!=n.c||93!=n.a)throw Hp(new ak(kWn((u$(),N8n))));break}if(QXn(n),!i){if(0==o){if(91==e)throw Hp(new ak(kWn((u$(),x8n))));if(93==e)throw Hp(new ak(kWn((u$(),D8n))));if(45==e&&!r&&93!=n.a)throw Hp(new ak(kWn((u$(),R8n))))}if(0!=n.c||45!=n.a||45==e&&r)Yxn(a,e,e);else{if(QXn(n),1==(o=n.c))throw Hp(new ak(kWn((u$(),$8n))));if(0==o&&93==n.a)Yxn(a,e,e),Yxn(a,45,45);else{if(0==o&&93==n.a||24==o)throw Hp(new ak(kWn((u$(),R8n))));if(c=n.a,0==o){if(91==c)throw Hp(new ak(kWn((u$(),x8n))));if(93==c)throw Hp(new ak(kWn((u$(),D8n))));if(45==c)throw Hp(new ak(kWn((u$(),R8n))))}else 10==o&&(c=qDn(n));if(QXn(n),e>c)throw Hp(new ak(kWn((u$(),F8n))));Yxn(a,e,c)}}}r=!1}if(1==n.c)throw Hp(new ak(kWn((u$(),$8n))));return T$n(a),qHn(a),n.b=0,QXn(n),a}function nWn(n){V$n(n.c,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#decimal"])),V$n(n.d,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#integer"])),V$n(n.e,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#boolean"])),V$n(n.f,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EBoolean",t8n,"EBoolean:Object"])),V$n(n.i,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#byte"])),V$n(n.g,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#hexBinary"])),V$n(n.j,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EByte",t8n,"EByte:Object"])),V$n(n.n,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EChar",t8n,"EChar:Object"])),V$n(n.t,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#double"])),V$n(n.u,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EDouble",t8n,"EDouble:Object"])),V$n(n.F,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#float"])),V$n(n.G,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EFloat",t8n,"EFloat:Object"])),V$n(n.I,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#int"])),V$n(n.J,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EInt",t8n,"EInt:Object"])),V$n(n.N,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#long"])),V$n(n.O,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"ELong",t8n,"ELong:Object"])),V$n(n.Z,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#short"])),V$n(n.$,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"EShort",t8n,"EShort:Object"])),V$n(n._,_9n,Pun(Gk(Qtt,1),sVn,2,6,[J9n,"http://www.w3.org/2001/XMLSchema#string"]))}function tWn(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C;if(1==n.c.length)return l1(0,n.c.length),BB(n.c[0],135);if(n.c.length<=0)return new P6;for(s=new Wb(n);s.a<s.c.c.length;){for(u=BB(n0(s),135),m=0,d=DWn,g=DWn,b=_Vn,w=_Vn,v=spn(u.b,0);v.b!=v.d.c;)p=BB(b3(v),86),m+=BB(mMn(p,(CAn(),$kt)),19).a,d=e.Math.min(d,p.e.a),g=e.Math.min(g,p.e.b),b=e.Math.max(b,p.e.a+p.f.a),w=e.Math.max(w,p.e.b+p.f.b);hon(u,(CAn(),$kt),iln(m)),hon(u,(qqn(),nkt),new xC(d,g)),hon(u,Zyt,new xC(b,w))}for(SQ(),m$(n,new ga),qan(k=new P6,(l1(0,n.c.length),BB(n.c[0],94))),l=0,S=0,h=new Wb(n);h.a<h.c.c.length;)u=BB(n0(h),135),j=XR(B$(BB(mMn(u,(qqn(),Zyt)),8)),BB(mMn(u,nkt),8)),l=e.Math.max(l,j.a),S+=j.a*j.b;for(l=e.Math.max(l,e.Math.sqrt(S)*Gy(MD(mMn(k,(CAn(),jkt))))),P=0,C=0,f=0,t=E=Gy(MD(mMn(k,xkt))),o=new Wb(n);o.a<o.c.c.length;)u=BB(n0(o),135),P+(j=XR(B$(BB(mMn(u,(qqn(),Zyt)),8)),BB(mMn(u,nkt),8))).a>l&&(P=0,C+=f+E,f=0),ELn(k,u,P,C),t=e.Math.max(t,P+j.a),f=e.Math.max(f,j.b),P+=j.a+E;for(y=new xp,i=new xp,M=new Wb(n);M.a<M.c.c.length;)for(r=qy(TD(mMn(T=BB(n0(M),135),(sWn(),lSt)))),a=(T.q?T.q:het).vc().Kc();a.Ob();)hU(y,(c=BB(a.Pb(),42)).cd())?GI(BB(c.cd(),146).wg())!==GI(c.dd())&&(r&&hU(i,c.cd())?($T(),BB(c.cd(),146).tg()):(VW(y,BB(c.cd(),146),c.dd()),hon(k,BB(c.cd(),146),c.dd()),r&&VW(i,BB(c.cd(),146),c.dd()))):(VW(y,BB(c.cd(),146),c.dd()),hon(k,BB(c.cd(),146),c.dd()));return k}function eWn(){eWn=O,RXn(),JIn(put=new pJ,(kUn(),dIt),wIt),JIn(put,MIt,wIt),JIn(put,gIt,wIt),JIn(put,jIt,wIt),JIn(put,kIt,wIt),JIn(put,mIt,wIt),JIn(put,jIt,dIt),JIn(put,wIt,hIt),JIn(put,dIt,hIt),JIn(put,MIt,hIt),JIn(put,gIt,hIt),JIn(put,yIt,hIt),JIn(put,jIt,hIt),JIn(put,kIt,hIt),JIn(put,mIt,hIt),JIn(put,bIt,hIt),JIn(put,wIt,EIt),JIn(put,dIt,EIt),JIn(put,hIt,EIt),JIn(put,MIt,EIt),JIn(put,gIt,EIt),JIn(put,yIt,EIt),JIn(put,jIt,EIt),JIn(put,bIt,EIt),JIn(put,TIt,EIt),JIn(put,kIt,EIt),JIn(put,pIt,EIt),JIn(put,mIt,EIt),JIn(put,dIt,MIt),JIn(put,gIt,MIt),JIn(put,jIt,MIt),JIn(put,mIt,MIt),JIn(put,dIt,gIt),JIn(put,MIt,gIt),JIn(put,jIt,gIt),JIn(put,gIt,gIt),JIn(put,kIt,gIt),JIn(put,wIt,fIt),JIn(put,dIt,fIt),JIn(put,hIt,fIt),JIn(put,EIt,fIt),JIn(put,MIt,fIt),JIn(put,gIt,fIt),JIn(put,yIt,fIt),JIn(put,jIt,fIt),JIn(put,TIt,fIt),JIn(put,bIt,fIt),JIn(put,mIt,fIt),JIn(put,kIt,fIt),JIn(put,vIt,fIt),JIn(put,wIt,TIt),JIn(put,dIt,TIt),JIn(put,hIt,TIt),JIn(put,MIt,TIt),JIn(put,gIt,TIt),JIn(put,yIt,TIt),JIn(put,jIt,TIt),JIn(put,bIt,TIt),JIn(put,mIt,TIt),JIn(put,pIt,TIt),JIn(put,vIt,TIt),JIn(put,dIt,bIt),JIn(put,MIt,bIt),JIn(put,gIt,bIt),JIn(put,jIt,bIt),JIn(put,TIt,bIt),JIn(put,mIt,bIt),JIn(put,kIt,bIt),JIn(put,wIt,lIt),JIn(put,dIt,lIt),JIn(put,hIt,lIt),JIn(put,MIt,lIt),JIn(put,gIt,lIt),JIn(put,yIt,lIt),JIn(put,jIt,lIt),JIn(put,bIt,lIt),JIn(put,mIt,lIt),JIn(put,dIt,kIt),JIn(put,hIt,kIt),JIn(put,EIt,kIt),JIn(put,gIt,kIt),JIn(put,wIt,pIt),JIn(put,dIt,pIt),JIn(put,EIt,pIt),JIn(put,MIt,pIt),JIn(put,gIt,pIt),JIn(put,yIt,pIt),JIn(put,jIt,pIt),JIn(put,jIt,vIt),JIn(put,gIt,vIt),JIn(put,bIt,wIt),JIn(put,bIt,MIt),JIn(put,bIt,hIt),JIn(put,yIt,wIt),JIn(put,yIt,dIt),JIn(put,yIt,EIt)}function iWn(n,t){switch(n.e){case 0:case 2:case 4:case 6:case 42:case 44:case 46:case 48:case 8:case 10:case 12:case 14:case 16:case 18:case 20:case 22:case 24:case 26:case 28:case 30:case 32:case 34:case 36:case 38:return new zQ(n.b,n.a,t,n.c);case 1:return new LL(n.a,t,Awn(t.Tg(),n.c));case 43:return new xL(n.a,t,Awn(t.Tg(),n.c));case 3:return new $L(n.a,t,Awn(t.Tg(),n.c));case 45:return new NL(n.a,t,Awn(t.Tg(),n.c));case 41:return new y9(BB(Ikn(n.c),26),n.a,t,Awn(t.Tg(),n.c));case 50:return new yin(BB(Ikn(n.c),26),n.a,t,Awn(t.Tg(),n.c));case 5:return new iK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 47:return new rK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 7:return new eU(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 49:return new eK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 9:return new FL(n.a,t,Awn(t.Tg(),n.c));case 11:return new _L(n.a,t,Awn(t.Tg(),n.c));case 13:return new KL(n.a,t,Awn(t.Tg(),n.c));case 15:return new MH(n.a,t,Awn(t.Tg(),n.c));case 17:return new BL(n.a,t,Awn(t.Tg(),n.c));case 19:return new RL(n.a,t,Awn(t.Tg(),n.c));case 21:return new DL(n.a,t,Awn(t.Tg(),n.c));case 23:return new yH(n.a,t,Awn(t.Tg(),n.c));case 25:return new fK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 27:return new hK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 29:return new oK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 31:return new cK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 33:return new sK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 35:return new uK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 37:return new aK(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 39:return new iU(n.a,t,Awn(t.Tg(),n.c),n.d.n);case 40:return new Ecn(t,Awn(t.Tg(),n.c));default:throw Hp(new dy("Unknown feature style: "+n.e))}}function rWn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;switch(OTn(e,"Brandes & Koepf node placement",1),n.a=t,n.c=FFn(t),i=BB(mMn(t,(HXn(),Ngt)),274),b=qy(TD(mMn(t,xgt))),n.d=i==(Bjn(),Qht)&&!b||i==Xht,Jqn(n,t),y=null,k=null,g=null,p=null,lin(4,AVn),d=new J6(4),BB(mMn(t,Ngt),274).g){case 3:g=new qKn(t,n.c.d,(oZ(),ryt),(gJ(),nyt)),d.c[d.c.length]=g;break;case 1:p=new qKn(t,n.c.d,(oZ(),cyt),(gJ(),nyt)),d.c[d.c.length]=p;break;case 4:y=new qKn(t,n.c.d,(oZ(),ryt),(gJ(),tyt)),d.c[d.c.length]=y;break;case 2:k=new qKn(t,n.c.d,(oZ(),cyt),(gJ(),tyt)),d.c[d.c.length]=k;break;default:g=new qKn(t,n.c.d,(oZ(),ryt),(gJ(),nyt)),p=new qKn(t,n.c.d,cyt,nyt),y=new qKn(t,n.c.d,ryt,tyt),k=new qKn(t,n.c.d,cyt,tyt),d.c[d.c.length]=y,d.c[d.c.length]=k,d.c[d.c.length]=g,d.c[d.c.length]=p}for(r=new iC(t,n.c),u=new Wb(d);u.a<u.c.c.length;)PXn(r,c=BB(n0(u),180),n.b),WBn(c);for(l=new Jyn(t,n.c),o=new Wb(d);o.a<o.c.c.length;)Hzn(l,c=BB(n0(o),180));if(e.n)for(s=new Wb(d);s.a<s.c.c.length;)OH(e,(c=BB(n0(s),180))+" size is "+v$n(c));if(f=null,n.d&&IBn(t,h=FUn(n,d,n.c.d),e)&&(f=h),!f)for(s=new Wb(d);s.a<s.c.c.length;)IBn(t,c=BB(n0(s),180),e)&&(!f||v$n(f)>v$n(c))&&(f=c);for(!f&&(l1(0,d.c.length),f=BB(d.c[0],180)),w=new Wb(t.b);w.a<w.c.c.length;)for(m=new Wb(BB(n0(w),29).a);m.a<m.c.c.length;)(v=BB(n0(m),10)).n.b=Gy(f.p[v.p])+Gy(f.d[v.p]);for(e.n&&(OH(e,"Chosen node placement: "+f),OH(e,"Blocks: "+xOn(f)),OH(e,"Classes: "+UAn(f,e)),OH(e,"Marked edges: "+n.b)),a=new Wb(d);a.a<a.c.c.length;)(c=BB(n0(a),180)).g=null,c.b=null,c.a=null,c.d=null,c.j=null,c.i=null,c.p=null;zrn(n.c),n.b.a.$b(),HSn(e)}function cWn(n,t,e){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;for(a=new YT,v=BB(mMn(e,(HXn(),Udt)),103),w=0,Frn(a,(!t.a&&(t.a=new eU(UOt,t,10,11)),t.a));0!=a.b;)s=BB(0==a.b?null:(Px(0!=a.b),Atn(a,a.a.a)),33),(GI(ZAn(t,Ldt))!==GI((mon(),Nvt))||GI(ZAn(t,Gdt))===GI((Vvn(),Eht))||GI(ZAn(t,Gdt))===GI((Vvn(),kht))||qy(TD(ZAn(t,xdt)))||GI(ZAn(t,Cdt))!==GI((Bfn(),wut)))&&!qy(TD(ZAn(s,$dt)))&&Ypn(s,(hWn(),wlt),iln(w++)),!qy(TD(ZAn(s,Ggt)))&&(f=0!=(!s.a&&(s.a=new eU(UOt,s,10,11)),s.a).i,b=kTn(s),l=GI(ZAn(s,sgt))===GI((ufn(),pCt)),g=null,(T=!P8(s,(sWn(),eSt))||mK(SD(ZAn(s,eSt)),w1n))&&l&&(f||b)&&(hon(g=kFn(s),Udt,v),Lx(g,gpt)&&My(new uwn(Gy(MD(mMn(g,gpt)))),g),0!=BB(ZAn(s,Fgt),174).gc()&&(h=g,JT(new Rq(null,(!s.c&&(s.c=new eU(XOt,s,9,9)),new w1(s.c,16))),new Xw(h)),mDn(s,g))),m=e,(y=BB(RX(n.a,JJ(s)),10))&&(m=y.e),d=wzn(n,s,m),g&&(d.e=g,g.e=d,Frn(a,(!s.a&&(s.a=new eU(UOt,s,10,11)),s.a))));for(w=0,r5(a,t,a.c.b,a.c);0!=a.b;){for(o=new AL((!(c=BB(0==a.b?null:(Px(0!=a.b),Atn(a,a.a.a)),33)).b&&(c.b=new eU(_Ot,c,12,3)),c.b));o.e!=o.i.gc();)tKn(u=BB(kpn(o),79)),(GI(ZAn(t,Ldt))!==GI((mon(),Nvt))||GI(ZAn(t,Gdt))===GI((Vvn(),Eht))||GI(ZAn(t,Gdt))===GI((Vvn(),kht))||qy(TD(ZAn(t,xdt)))||GI(ZAn(t,Cdt))!==GI((Bfn(),wut)))&&Ypn(u,(hWn(),wlt),iln(w++)),j=PTn(BB(Wtn((!u.b&&(u.b=new hK(KOt,u,4,7)),u.b),0),82)),E=PTn(BB(Wtn((!u.c&&(u.c=new hK(KOt,u,5,8)),u.c),0),82)),qy(TD(ZAn(u,Ggt)))||qy(TD(ZAn(j,Ggt)))||qy(TD(ZAn(E,Ggt)))||(p=c,QIn(u)&&qy(TD(ZAn(j,wgt)))&&qy(TD(ZAn(u,dgt)))||Ctn(E,j)?p=j:Ctn(j,E)&&(p=E),m=e,(y=BB(RX(n.a,p),10))&&(m=y.e),hon(uWn(n,u,p,m),(hWn(),Fft),Lxn(n,u,t,e)));if(l=GI(ZAn(c,sgt))===GI((ufn(),pCt)))for(r=new AL((!c.a&&(c.a=new eU(UOt,c,10,11)),c.a));r.e!=r.i.gc();)T=!P8(i=BB(kpn(r),33),(sWn(),eSt))||mK(SD(ZAn(i,eSt)),w1n),k=GI(ZAn(i,sgt))===GI(pCt),T&&k&&r5(a,i,a.c.b,a.c)}}function aWn(n,t,e,i,r,c){var a,u,o,s,h,f,l;switch(t){case 71:a=i.q.getFullYear()-sQn>=-1900?1:0,oO(n,e>=4?Pun(Gk(Qtt,1),sVn,2,6,[fQn,lQn])[a]:Pun(Gk(Qtt,1),sVn,2,6,["BC","AD"])[a]);break;case 121:opn(n,e,i);break;case 77:XKn(n,e,i);break;case 107:Enn(n,0==(u=r.q.getHours())?24:u,e);break;case 83:RLn(n,e,r);break;case 69:o=i.q.getDay(),oO(n,5==e?Pun(Gk(Qtt,1),sVn,2,6,["S","M","T","W","T","F","S"])[o]:4==e?Pun(Gk(Qtt,1),sVn,2,6,[bQn,wQn,dQn,gQn,pQn,vQn,mQn])[o]:Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"])[o]);break;case 97:r.q.getHours()>=12&&r.q.getHours()<24?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["AM","PM"])[1]):oO(n,Pun(Gk(Qtt,1),sVn,2,6,["AM","PM"])[0]);break;case 104:Enn(n,0==(s=r.q.getHours()%12)?12:s,e);break;case 75:Enn(n,r.q.getHours()%12,e);break;case 72:Enn(n,r.q.getHours(),e);break;case 99:h=i.q.getDay(),5==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["S","M","T","W","T","F","S"])[h]):4==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,[bQn,wQn,dQn,gQn,pQn,vQn,mQn])[h]):3==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"])[h]):Enn(n,h,1);break;case 76:f=i.q.getMonth(),5==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["J","F","M","A","M","J","J","A","S","O","N","D"])[f]):4==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,[YVn,JVn,ZVn,nQn,tQn,eQn,iQn,rQn,cQn,aQn,uQn,oQn])[f]):3==e?oO(n,Pun(Gk(Qtt,1),sVn,2,6,["Jan","Feb","Mar","Apr",tQn,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"])[f]):Enn(n,f+1,e);break;case 81:l=i.q.getMonth()/3|0,oO(n,e<4?Pun(Gk(Qtt,1),sVn,2,6,["Q1","Q2","Q3","Q4"])[l]:Pun(Gk(Qtt,1),sVn,2,6,["1st quarter","2nd quarter","3rd quarter","4th quarter"])[l]);break;case 100:Enn(n,i.q.getDate(),e);break;case 109:Enn(n,r.q.getMinutes(),e);break;case 115:Enn(n,r.q.getSeconds(),e);break;case 122:oO(n,e<4?c.c[0]:c.c[1]);break;case 118:oO(n,c.b);break;case 90:oO(n,e<3?nIn(c):3==e?wIn(c):dIn(c.a));break;default:return!1}return!0}function uWn(n,t,e,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C;if(tKn(t),o=BB(Wtn((!t.b&&(t.b=new hK(KOt,t,4,7)),t.b),0),82),h=BB(Wtn((!t.c&&(t.c=new hK(KOt,t,5,8)),t.c),0),82),u=PTn(o),s=PTn(h),a=0==(!t.a&&(t.a=new eU(FOt,t,6,6)),t.a).i?null:BB(Wtn((!t.a&&(t.a=new eU(FOt,t,6,6)),t.a),0),202),j=BB(RX(n.a,u),10),S=BB(RX(n.a,s),10),E=null,P=null,cL(o,186)&&(cL(k=BB(RX(n.a,o),299),11)?E=BB(k,11):cL(k,10)&&(j=BB(k,10),E=BB(xq(j.j,0),11))),cL(h,186)&&(cL(M=BB(RX(n.a,h),299),11)?P=BB(M,11):cL(M,10)&&(S=BB(M,10),P=BB(xq(S.j,0),11))),!j||!S)throw Hp(new ck("The source or the target of edge "+t+" could not be found. This usually happens when an edge connects a node laid out by ELK Layered to a node in another level of hierarchy laid out by either another instance of ELK Layered or another layout algorithm alltogether. The former can be solved by setting the hierarchyHandling option to INCLUDE_CHILDREN."));for(qan(d=new wY,t),hon(d,(hWn(),dlt),t),hon(d,(HXn(),vgt),null),b=BB(mMn(i,Zft),21),j==S&&b.Fc((bDn(),vft)),E||(ain(),y=qvt,T=null,a&&vA(BB(mMn(j,ept),98))&&(Y3(T=new xC(a.j,a.k),XJ(t)),t5(T,e),Ctn(s,u)&&(y=Hvt,UR(T,j.n))),E=dHn(j,T,y,i)),P||(ain(),y=Hvt,C=null,a&&vA(BB(mMn(S,ept),98))&&(Y3(C=new xC(a.b,a.c),XJ(t)),t5(C,e)),P=dHn(S,C,y,vW(S))),SZ(d,E),MZ(d,P),(E.e.c.length>1||E.g.c.length>1||P.e.c.length>1||P.g.c.length>1)&&b.Fc((bDn(),bft)),l=new AL((!t.n&&(t.n=new eU(zOt,t,1,7)),t.n));l.e!=l.i.gc();)if(!qy(TD(ZAn(f=BB(kpn(l),137),Ggt)))&&f.a)switch(g=Hhn(f),WB(d.b,g),BB(mMn(g,Ydt),272).g){case 1:case 2:b.Fc((bDn(),fft));break;case 0:b.Fc((bDn(),sft)),hon(g,Ydt,(Rtn(),zPt))}if(c=BB(mMn(i,qdt),314),p=BB(mMn(i,_gt),315),r=c==(Oin(),sht)||p==(Nvn(),pvt),a&&0!=(!a.a&&(a.a=new $L(xOt,a,5)),a.a).i&&r){for(v=qSn(a),w=new km,m=spn(v,0);m.b!=m.d.c;)DH(w,new wA(BB(b3(m),8)));hon(d,glt,w)}return d}function oWn(n){n.gb||(n.gb=!0,n.b=kan(n,0),Rrn(n.b,18),Krn(n.b,19),n.a=kan(n,1),Rrn(n.a,1),Krn(n.a,2),Krn(n.a,3),Krn(n.a,4),Krn(n.a,5),n.o=kan(n,2),Rrn(n.o,8),Rrn(n.o,9),Krn(n.o,10),Krn(n.o,11),Krn(n.o,12),Krn(n.o,13),Krn(n.o,14),Krn(n.o,15),Krn(n.o,16),Krn(n.o,17),Krn(n.o,18),Krn(n.o,19),Krn(n.o,20),Krn(n.o,21),Krn(n.o,22),Krn(n.o,23),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),otn(n.o),n.p=kan(n,3),Rrn(n.p,2),Rrn(n.p,3),Rrn(n.p,4),Rrn(n.p,5),Krn(n.p,6),Krn(n.p,7),otn(n.p),otn(n.p),n.q=kan(n,4),Rrn(n.q,8),n.v=kan(n,5),Krn(n.v,9),otn(n.v),otn(n.v),otn(n.v),n.w=kan(n,6),Rrn(n.w,2),Rrn(n.w,3),Rrn(n.w,4),Krn(n.w,5),n.B=kan(n,7),Krn(n.B,1),otn(n.B),otn(n.B),otn(n.B),n.Q=kan(n,8),Krn(n.Q,0),otn(n.Q),n.R=kan(n,9),Rrn(n.R,1),n.S=kan(n,10),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),otn(n.S),n.T=kan(n,11),Krn(n.T,10),Krn(n.T,11),Krn(n.T,12),Krn(n.T,13),Krn(n.T,14),otn(n.T),otn(n.T),n.U=kan(n,12),Rrn(n.U,2),Rrn(n.U,3),Krn(n.U,4),Krn(n.U,5),Krn(n.U,6),Krn(n.U,7),otn(n.U),n.V=kan(n,13),Krn(n.V,10),n.W=kan(n,14),Rrn(n.W,18),Rrn(n.W,19),Rrn(n.W,20),Krn(n.W,21),Krn(n.W,22),Krn(n.W,23),n.bb=kan(n,15),Rrn(n.bb,10),Rrn(n.bb,11),Rrn(n.bb,12),Rrn(n.bb,13),Rrn(n.bb,14),Rrn(n.bb,15),Rrn(n.bb,16),Krn(n.bb,17),otn(n.bb),otn(n.bb),n.eb=kan(n,16),Rrn(n.eb,2),Rrn(n.eb,3),Rrn(n.eb,4),Rrn(n.eb,5),Rrn(n.eb,6),Rrn(n.eb,7),Krn(n.eb,8),Krn(n.eb,9),n.ab=kan(n,17),Rrn(n.ab,0),Rrn(n.ab,1),n.H=kan(n,18),Krn(n.H,0),Krn(n.H,1),Krn(n.H,2),Krn(n.H,3),Krn(n.H,4),Krn(n.H,5),otn(n.H),n.db=kan(n,19),Krn(n.db,2),n.c=jan(n,20),n.d=jan(n,21),n.e=jan(n,22),n.f=jan(n,23),n.i=jan(n,24),n.g=jan(n,25),n.j=jan(n,26),n.k=jan(n,27),n.n=jan(n,28),n.r=jan(n,29),n.s=jan(n,30),n.t=jan(n,31),n.u=jan(n,32),n.fb=jan(n,33),n.A=jan(n,34),n.C=jan(n,35),n.D=jan(n,36),n.F=jan(n,37),n.G=jan(n,38),n.I=jan(n,39),n.J=jan(n,40),n.L=jan(n,41),n.M=jan(n,42),n.N=jan(n,43),n.O=jan(n,44),n.P=jan(n,45),n.X=jan(n,46),n.Y=jan(n,47),n.Z=jan(n,48),n.$=jan(n,49),n._=jan(n,50),n.cb=jan(n,51),n.K=jan(n,52))}function sWn(){var n,t;sWn=O,eSt=new up(w5n),mPt=new up(d5n),wvn(),iSt=new $O(W2n,rSt=CMt),new $p,cSt=new $O(VJn,null),aSt=new up(g5n),wEn(),fSt=EG(ZMt,Pun(Gk(qPt,1),$Vn,291,0,[VMt])),hSt=new $O(u3n,fSt),lSt=new $O(X2n,(hN(),!1)),Ffn(),bSt=new $O(J2n,wSt=BPt),Mbn(),vSt=new $O(y2n,mSt=ZPt),jSt=new $O(A4n,!1),ufn(),ESt=new $O(d2n,TSt=vCt),WSt=new WA(12),XSt=new $O(QJn,WSt),CSt=new $O(jZn,!1),ISt=new $O(m3n,!1),USt=new $O(MZn,!1),QEn(),uPt=new $O(EZn,oPt=YCt),gPt=new up(g3n),pPt=new up(pZn),vPt=new up(yZn),kPt=new up(kZn),ASt=new km,OSt=new $O(o3n,ASt),sSt=new $O(f3n,!1),MSt=new $O(l3n,!1),new up(p5n),LSt=new lm,$St=new $O(p3n,LSt),zSt=new $O(z2n,!1),new $p,yPt=new $O(v5n,1),new $O(m5n,!0),iln(0),new $O(y5n,iln(100)),new $O(k5n,!1),iln(0),new $O(j5n,iln(4e3)),iln(0),new $O(E5n,iln(400)),new $O(T5n,!1),new $O(M5n,!1),new $O(S5n,!0),new $O(P5n,!1),Fwn(),uSt=new $O(b5n,oSt=eOt),jPt=new $O(L2n,10),EPt=new $O(N2n,10),TPt=new $O(XJn,20),MPt=new $O(x2n,10),SPt=new $O(mZn,2),PPt=new $O(D2n,10),IPt=new $O(R2n,0),OPt=new $O(F2n,5),APt=new $O(K2n,1),$Pt=new $O(_2n,1),LPt=new $O(vZn,20),NPt=new $O(B2n,10),RPt=new $O(H2n,10),CPt=new up(q2n),DPt=new lA,xPt=new $O(v3n,DPt),YSt=new up(d3n),VSt=new $O(w3n,QSt=!1),xSt=new WA(5),NSt=new $O(Z2n,xSt),n$n(),t=BB(Vj(GCt),9),RSt=new YK(t,BB(SR(t,t.length),9),0),DSt=new $O(CZn,RSt),cpn(),ZSt=new $O(e3n,nPt=BCt),ePt=new up(i3n),iPt=new up(r3n),rPt=new up(c3n),tPt=new up(a3n),n=BB(Vj(YIt),9),_St=new YK(n,BB(SR(n,n.length),9),0),KSt=new $O(PZn,_St),GSt=nbn((n_n(),GIt)),qSt=new $O(SZn,GSt),HSt=new xC(0,0),BSt=new $O(BZn,HSt),FSt=new $O(Y2n,!1),Rtn(),gSt=new $O(s3n,pSt=zPt),dSt=new $O(TZn,!1),new up(C5n),iln(1),new $O(I5n,null),cPt=new up(b3n),sPt=new up(h3n),kUn(),wPt=new $O(U2n,dPt=PIt),aPt=new up(G2n),lIn(),lPt=nbn(rIt),fPt=new $O(IZn,lPt),hPt=new $O(n3n,!1),bPt=new $O(t3n,!0),SSt=new $O(V2n,!1),PSt=new $O(Q2n,!1),ySt=new $O(WJn,1),nMn(),new $O(O5n,kSt=aCt),JSt=!0}function hWn(){var n,t;hWn=O,dlt=new up(OZn),Fft=new up("coordinateOrigin"),Mlt=new up("processors"),_ft=new iR("compoundNode",(hN(),!1)),elt=new iR("insideConnections",!1),glt=new up("originalBendpoints"),plt=new up("originalDummyNodePosition"),vlt=new up("originalLabelEdge"),Plt=new up("representedLabels"),zft=new up("endLabels"),Uft=new up("endLabel.origin"),ult=new iR("labelSide",(Xyn(),MCt)),blt=new iR("maxEdgeThickness",0),Clt=new iR("reversed",!1),Slt=new up(AZn),hlt=new iR("longEdgeSource",null),flt=new iR("longEdgeTarget",null),slt=new iR("longEdgeHasLabelDummies",!1),olt=new iR("longEdgeBeforeLabelDummy",!1),Gft=new iR("edgeConstraint",(Jun(),Aht)),rlt=new up("inLayerLayoutUnit"),ilt=new iR("inLayerConstraint",(z7(),Pft)),clt=new iR("inLayerSuccessorConstraint",new Np),alt=new iR("inLayerSuccessorConstraintBetweenNonDummies",!1),Elt=new up("portDummy"),Bft=new iR("crossingHint",iln(0)),Zft=new iR("graphProperties",new YK(t=BB(Vj(Tft),9),BB(SR(t,t.length),9),0)),Qft=new iR("externalPortSide",(kUn(),PIt)),Yft=new iR("externalPortSize",new Gj),Wft=new up("externalPortReplacedDummies"),Vft=new up("externalPortReplacedDummy"),Xft=new iR("externalPortConnections",new YK(n=BB(Vj(FIt),9),BB(SR(n,n.length),9),0)),Tlt=new iR(dJn,0),xft=new up("barycenterAssociates"),Klt=new up("TopSideComments"),Dft=new up("BottomSideComments"),Kft=new up("CommentConnectionPort"),tlt=new iR("inputCollect",!1),klt=new iR("outputCollect",!1),qft=new iR("cyclic",!1),Hft=new up("crossHierarchyMap"),Rlt=new up("targetOffset"),new iR("splineLabelSize",new Gj),Alt=new up("spacings"),jlt=new iR("partitionConstraint",!1),Rft=new up("breakingPoint.info"),xlt=new up("splines.survivingEdge"),Nlt=new up("splines.route.start"),$lt=new up("splines.edgeChain"),ylt=new up("originalPortConstraints"),Olt=new up("selfLoopHolder"),Llt=new up("splines.nsPortY"),wlt=new up("modelOrder"),llt=new up("longEdgeTargetNode"),Jft=new iR(z1n,!1),Ilt=new iR(z1n,!1),nlt=new up("layerConstraints.hiddenNodes"),mlt=new up("layerConstraints.opposidePort"),Dlt=new up("targetNode.modelOrder")}function fWn(){fWn=O,_nn(),Sbt=new $O(U1n,Pbt=Sht),Gbt=new $O(X1n,(hN(),!1)),z2(),Vbt=new $O(W1n,Qbt=Aft),wwt=new $O(V1n,!1),dwt=new $O(Q1n,!0),Ult=new $O(Y1n,!1),U7(),Nwt=new $O(J1n,xwt=Kvt),iln(1),qwt=new $O(Z1n,iln(7)),Gwt=new $O(n0n,!1),zbt=new $O(t0n,!1),Vvn(),Tbt=new $O(e0n,Mbt=yht),TTn(),lwt=new $O(i0n,bwt=tvt),Tbn(),ewt=new $O(r0n,iwt=qlt),iln(-1),twt=new $O(c0n,iln(-1)),iln(-1),rwt=new $O(a0n,iln(-1)),iln(-1),cwt=new $O(u0n,iln(4)),iln(-1),uwt=new $O(o0n,iln(2)),sNn(),hwt=new $O(s0n,fwt=Ivt),iln(0),swt=new $O(h0n,iln(0)),Zbt=new $O(f0n,iln(DWn)),Oin(),jbt=new $O(l0n,Ebt=hht),ubt=new $O(b0n,!1),gbt=new $O(w0n,.1),ybt=new $O(d0n,!1),iln(-1),vbt=new $O(g0n,iln(-1)),iln(-1),mbt=new $O(p0n,iln(-1)),iln(0),obt=new $O(v0n,iln(40)),Kan(),bbt=new $O(m0n,wbt=Eft),sbt=new $O(y0n,hbt=kft),Nvn(),$wt=new $O(k0n,Lwt=gvt),jwt=new up(j0n),g7(),gwt=new $O(E0n,pwt=qht),Bjn(),mwt=new $O(T0n,ywt=Qht),new $p,Mwt=new $O(M0n,.3),Pwt=new up(S0n),bvn(),Cwt=new $O(P0n,Iwt=lvt),Hcn(),Nbt=new $O(C0n,xbt=Wvt),A6(),Dbt=new $O(I0n,Rbt=Zvt),Usn(),Kbt=new $O(O0n,_bt=rmt),Bbt=new $O(A0n,.2),$bt=new $O($0n,2),_wt=new $O(L0n,null),Bwt=new $O(N0n,10),Fwt=new $O(x0n,10),Hwt=new $O(D0n,20),iln(0),Dwt=new $O(R0n,iln(0)),iln(0),Rwt=new $O(K0n,iln(0)),iln(0),Kwt=new $O(_0n,iln(0)),Xlt=new $O(F0n,!1),JMn(),Qlt=new $O(B0n,Ylt=cft),V8(),Wlt=new $O(H0n,Vlt=aht),Xbt=new $O(q0n,!1),iln(0),Ubt=new $O(G0n,iln(16)),iln(0),Wbt=new $O(z0n,iln(5)),$un(),ldt=new $O(U0n,bdt=bmt),zwt=new $O(X0n,10),Wwt=new $O(W0n,1),uin(),edt=new $O(V0n,idt=ght),Ywt=new up(Q0n),ndt=iln(1),iln(0),Zwt=new $O(Y0n,ndt),dcn(),pdt=new $O(J0n,vdt=umt),wdt=new up(Z0n),odt=new $O(n2n,!0),adt=new $O(t2n,2),hdt=new $O(e2n,!0),gSn(),Obt=new $O(i2n,Abt=_ht),$Pn(),Cbt=new $O(r2n,Ibt=Zst),mon(),cbt=new $O(c2n,abt=Nvt),rbt=new $O(a2n,!1),Bfn(),Jlt=new $O(u2n,Zlt=wut),Mhn(),ebt=new $O(o2n,ibt=cvt),nbt=new $O(s2n,0),tbt=new $O(h2n,0),Jbt=jht,Ybt=sht,awt=nvt,owt=nvt,nwt=Ypt,ufn(),pbt=pCt,kbt=hht,dbt=hht,fbt=hht,lbt=pCt,Ewt=mvt,Twt=gvt,vwt=gvt,kwt=gvt,Swt=vvt,Awt=mvt,Owt=mvt,Mbn(),Fbt=JPt,Hbt=JPt,qbt=rmt,Lbt=YPt,Uwt=wmt,Xwt=lmt,Vwt=wmt,Qwt=lmt,rdt=wmt,cdt=lmt,Jwt=dht,tdt=ght,mdt=wmt,ydt=lmt,ddt=wmt,gdt=lmt,sdt=lmt,udt=lmt,fdt=lmt}function lWn(){lWn=O,rot=new nP("DIRECTION_PREPROCESSOR",0),tot=new nP("COMMENT_PREPROCESSOR",1),cot=new nP("EDGE_AND_LAYER_CONSTRAINT_EDGE_REVERSER",2),kot=new nP("INTERACTIVE_EXTERNAL_PORT_POSITIONER",3),Fot=new nP("PARTITION_PREPROCESSOR",4),Mot=new nP("LABEL_DUMMY_INSERTER",5),Uot=new nP("SELF_LOOP_PREPROCESSOR",6),Oot=new nP("LAYER_CONSTRAINT_PREPROCESSOR",7),Kot=new nP("PARTITION_MIDPROCESSOR",8),got=new nP("HIGH_DEGREE_NODE_LAYER_PROCESSOR",9),Not=new nP("NODE_PROMOTION",10),Iot=new nP("LAYER_CONSTRAINT_POSTPROCESSOR",11),_ot=new nP("PARTITION_POSTPROCESSOR",12),lot=new nP("HIERARCHICAL_PORT_CONSTRAINT_PROCESSOR",13),Wot=new nP("SEMI_INTERACTIVE_CROSSMIN_PROCESSOR",14),Vut=new nP("BREAKING_POINT_INSERTER",15),Lot=new nP("LONG_EDGE_SPLITTER",16),Hot=new nP("PORT_SIDE_PROCESSOR",17),jot=new nP("INVERTED_PORT_PROCESSOR",18),Bot=new nP("PORT_LIST_SORTER",19),Qot=new nP("SORT_BY_INPUT_ORDER_OF_MODEL",20),Dot=new nP("NORTH_SOUTH_PORT_PREPROCESSOR",21),Qut=new nP("BREAKING_POINT_PROCESSOR",22),Rot=new nP(E1n,23),Yot=new nP(T1n,24),Got=new nP("SELF_LOOP_PORT_RESTORER",25),Vot=new nP("SINGLE_EDGE_GRAPH_WRAPPER",26),Eot=new nP("IN_LAYER_CONSTRAINT_PROCESSOR",27),sot=new nP("END_NODE_PORT_LABEL_MANAGEMENT_PROCESSOR",28),Tot=new nP("LABEL_AND_NODE_SIZE_PROCESSOR",29),yot=new nP("INNERMOST_NODE_MARGIN_CALCULATOR",30),Xot=new nP("SELF_LOOP_ROUTER",31),Zut=new nP("COMMENT_NODE_MARGIN_CALCULATOR",32),uot=new nP("END_LABEL_PREPROCESSOR",33),Pot=new nP("LABEL_DUMMY_SWITCHER",34),Jut=new nP("CENTER_LABEL_MANAGEMENT_PROCESSOR",35),Cot=new nP("LABEL_SIDE_SELECTOR",36),vot=new nP("HYPEREDGE_DUMMY_MERGER",37),bot=new nP("HIERARCHICAL_PORT_DUMMY_SIZE_PROCESSOR",38),Aot=new nP("LAYER_SIZE_AND_GRAPH_HEIGHT_CALCULATOR",39),dot=new nP("HIERARCHICAL_PORT_POSITION_PROCESSOR",40),eot=new nP("CONSTRAINTS_POSTPROCESSOR",41),not=new nP("COMMENT_POSTPROCESSOR",42),mot=new nP("HYPERNODE_PROCESSOR",43),wot=new nP("HIERARCHICAL_PORT_ORTHOGONAL_EDGE_ROUTER",44),$ot=new nP("LONG_EDGE_JOINER",45),zot=new nP("SELF_LOOP_POSTPROCESSOR",46),Yut=new nP("BREAKING_POINT_REMOVER",47),xot=new nP("NORTH_SOUTH_PORT_POSTPROCESSOR",48),pot=new nP("HORIZONTAL_COMPACTOR",49),Sot=new nP("LABEL_DUMMY_REMOVER",50),hot=new nP("FINAL_SPLINE_BENDPOINTS_CALCULATOR",51),oot=new nP("END_LABEL_SORTER",52),qot=new nP("REVERSED_EDGE_RESTORER",53),aot=new nP("END_LABEL_POSTPROCESSOR",54),fot=new nP("HIERARCHICAL_NODE_RESIZER",55),iot=new nP("DIRECTION_POSTPROCESSOR",56)}function bWn(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T,M,S,P,C,I,O,A,$,L,N,x,D,R,K,_,F,B,H,q,G,z,U,X,W,V,Q,Y,J,Z,nn,tn,en,rn,cn,an,un,on;for(J=0,L=0,D=(O=t).length;L<D;++L)for(G=new Wb((C=O[L]).j);G.a<G.c.c.length;){for(U=0,o=new Wb((q=BB(n0(G),11)).g);o.a<o.c.c.length;)u=BB(n0(o),17),C.c!=u.d.i.c&&++U;U>0&&(n.a[q.p]=J++)}for(rn=0,N=0,R=(A=i).length;N<R;++N){for(K=0,G=new Wb((C=A[N]).j);G.a<G.c.c.length&&(q=BB(n0(G),11)).j==(kUn(),sIt);)for(o=new Wb(q.e);o.a<o.c.c.length;)if(u=BB(n0(o),17),C.c!=u.c.i.c){++K;break}for(F=0,X=new M2(C.j,C.j.c.length);X.b>0;){for(Px(X.b>0),U=0,o=new Wb((q=BB(X.a.Xb(X.c=--X.b),11)).e);o.a<o.c.c.length;)u=BB(n0(o),17),C.c!=u.c.i.c&&++U;U>0&&(q.j==(kUn(),sIt)?(n.a[q.p]=rn,++rn):(n.a[q.p]=rn+K+F,++F))}rn+=F}for(z=new xp,d=new fA,$=0,x=(I=t).length;$<x;++$)for(tn=new Wb((C=I[$]).j);tn.a<tn.c.c.length;)for(o=new Wb((nn=BB(n0(tn),11)).g);o.a<o.c.c.length;)if(an=(u=BB(n0(o),17)).d,C.c!=an.i.c)if(Z=BB(qI(AY(z.f,nn)),467),cn=BB(qI(AY(z.f,an)),467),Z||cn)if(Z)if(cn)if(Z==cn)WB(Z.a,u);else{for(WB(Z.a,u),H=new Wb(cn.d);H.a<H.c.c.length;)B=BB(n0(H),11),jCn(z.f,B,Z);gun(Z.a,cn.a),gun(Z.d,cn.d),d.a.Bc(cn)}else WB(Z.a,u),WB(Z.d,an),jCn(z.f,an,Z);else WB(cn.a,u),WB(cn.d,nn),jCn(z.f,nn,cn);else w=new DR,d.a.zc(w,d),WB(w.a,u),WB(w.d,nn),jCn(z.f,nn,w),WB(w.d,an),jCn(z.f,an,w);for(g=BB(Emn(d,x8(Fmt,{3:1,4:1,5:1,1946:1},467,d.a.gc(),0,1)),1946),P=t[0].c,Y=i[0].c,l=0,b=(f=g).length;l<b;++l)for((h=f[l]).e=J,h.f=rn,G=new Wb(h.d);G.a<G.c.c.length;)q=BB(n0(G),11),W=n.a[q.p],q.i.c==P?(W<h.e&&(h.e=W),W>h.b&&(h.b=W)):q.i.c==Y&&(W<h.f&&(h.f=W),W>h.c&&(h.c=W));for(z9(g,0,g.length,null),en=x8(ANt,hQn,25,g.length,15,1),r=x8(ANt,hQn,25,rn+1,15,1),v=0;v<g.length;v++)en[v]=g[v].f,r[en[v]]=1;for(a=0,m=0;m<r.length;m++)1==r[m]?r[m]=a:--a;for(V=0,y=0;y<en.length;y++)en[y]+=r[en[y]],V=e.Math.max(V,en[y]+1);for(s=1;s<V;)s*=2;for(on=2*s-1,s-=1,un=x8(ANt,hQn,25,on,15,1),c=0,M=0;M<en.length;M++)for(++un[T=en[M]+s];T>0;)T%2>0&&(c+=un[T+1]),++un[T=(T-1)/2|0];for(S=x8(qmt,HWn,362,2*g.length,0,1),k=0;k<g.length;k++)S[2*k]=new qV(g[k],g[k].e,g[k].b,(Q4(),Hmt)),S[2*k+1]=new qV(g[k],g[k].b,g[k].e,Bmt);for(z9(S,0,S.length,null),_=0,j=0;j<S.length;j++)switch(S[j].d.g){case 0:++_;break;case 1:c+=--_}for(Q=x8(qmt,HWn,362,2*g.length,0,1),E=0;E<g.length;E++)Q[2*E]=new qV(g[E],g[E].f,g[E].c,(Q4(),Hmt)),Q[2*E+1]=new qV(g[E],g[E].c,g[E].f,Bmt);for(z9(Q,0,Q.length,null),_=0,p=0;p<Q.length;p++)switch(Q[p].d.g){case 0:++_;break;case 1:c+=--_}return c}function wWn(){wWn=O,sNt=new Ap(7),hNt=new oG(8,94),new oG(8,64),fNt=new oG(8,36),pNt=new oG(8,65),vNt=new oG(8,122),mNt=new oG(8,90),jNt=new oG(8,98),dNt=new oG(8,66),yNt=new oG(8,60),ENt=new oG(8,62),oNt=new Ap(11),Yxn(uNt=new M0(4),48,57),Yxn(kNt=new M0(4),48,57),Yxn(kNt,65,90),Yxn(kNt,95,95),Yxn(kNt,97,122),Yxn(gNt=new M0(4),9,9),Yxn(gNt,10,10),Yxn(gNt,12,12),Yxn(gNt,13,13),Yxn(gNt,32,32),lNt=$Fn(uNt),wNt=$Fn(kNt),bNt=$Fn(gNt),iNt=new xp,rNt=new xp,cNt=Pun(Gk(Qtt,1),sVn,2,6,["Cn","Lu","Ll","Lt","Lm","Lo","Mn","Me","Mc","Nd","Nl","No","Zs","Zl","Zp","Cc","Cf",null,"Co","Cs","Pd","Ps","Pe","Pc","Po","Sm","Sc","Sk","So","Pi","Pf","L","M","N","Z","C","P","S"]),eNt=Pun(Gk(Qtt,1),sVn,2,6,["Basic Latin","Latin-1 Supplement","Latin Extended-A","Latin Extended-B","IPA Extensions","Spacing Modifier Letters","Combining Diacritical Marks","Greek","Cyrillic","Armenian","Hebrew","Arabic","Syriac","Thaana","Devanagari","Bengali","Gurmukhi","Gujarati","Oriya","Tamil","Telugu","Kannada","Malayalam","Sinhala","Thai","Lao","Tibetan","Myanmar","Georgian","Hangul Jamo","Ethiopic","Cherokee","Unified Canadian Aboriginal Syllabics","Ogham","Runic","Khmer","Mongolian","Latin Extended Additional","Greek Extended","General Punctuation","Superscripts and Subscripts","Currency Symbols","Combining Marks for Symbols","Letterlike Symbols","Number Forms","Arrows","Mathematical Operators","Miscellaneous Technical","Control Pictures","Optical Character Recognition","Enclosed Alphanumerics","Box Drawing","Block Elements","Geometric Shapes","Miscellaneous Symbols","Dingbats","Braille Patterns","CJK Radicals Supplement","Kangxi Radicals","Ideographic Description Characters","CJK Symbols and Punctuation","Hiragana","Katakana","Bopomofo","Hangul Compatibility Jamo","Kanbun","Bopomofo Extended","Enclosed CJK Letters and Months","CJK Compatibility","CJK Unified Ideographs Extension A","CJK Unified Ideographs","Yi Syllables","Yi Radicals","Hangul Syllables",gnt,"CJK Compatibility Ideographs","Alphabetic Presentation Forms","Arabic Presentation Forms-A","Combining Half Marks","CJK Compatibility Forms","Small Form Variants","Arabic Presentation Forms-B","Specials","Halfwidth and Fullwidth Forms","Old Italic","Gothic","Deseret","Byzantine Musical Symbols","Musical Symbols","Mathematical Alphanumeric Symbols","CJK Unified Ideographs Extension B","CJK Compatibility Ideographs Supplement","Tags"]),aNt=Pun(Gk(ANt,1),hQn,25,15,[66304,66351,66352,66383,66560,66639,118784,119039,119040,119295,119808,120831,131072,173782,194560,195103,917504,917631])}function dWn(){dWn=O,Prt=new ocn("OUT_T_L",0,(J9(),Yit),(G7(),irt),(Dtn(),Git),Git,Pun(Gk(Dnt,1),HWn,21,0,[EG((n$n(),LCt),Pun(Gk(GCt,1),$Vn,93,0,[DCt,ICt]))])),Srt=new ocn("OUT_T_C",1,Qit,irt,Git,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[DCt,CCt])),EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[DCt,CCt,OCt]))])),Crt=new ocn("OUT_T_R",2,Jit,irt,Git,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ACt]))])),vrt=new ocn("OUT_B_L",3,Yit,crt,Uit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ICt]))])),prt=new ocn("OUT_B_C",4,Qit,crt,Uit,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[NCt,CCt])),EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[NCt,CCt,OCt]))])),mrt=new ocn("OUT_B_R",5,Jit,crt,Uit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ACt]))])),jrt=new ocn("OUT_L_T",6,Jit,crt,Git,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ICt,DCt,OCt]))])),krt=new ocn("OUT_L_C",7,Jit,rrt,zit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ICt,xCt])),EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ICt,xCt,OCt]))])),yrt=new ocn("OUT_L_B",8,Jit,irt,Uit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ICt,NCt,OCt]))])),Mrt=new ocn("OUT_R_T",9,Yit,crt,Git,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ACt,DCt,OCt]))])),Trt=new ocn("OUT_R_C",10,Yit,rrt,zit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ACt,xCt])),EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ACt,xCt,OCt]))])),Ert=new ocn("OUT_R_B",11,Yit,irt,Uit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG(LCt,Pun(Gk(GCt,1),$Vn,93,0,[ACt,NCt,OCt]))])),drt=new ocn("IN_T_L",12,Yit,crt,Git,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ICt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ICt,OCt]))])),wrt=new ocn("IN_T_C",13,Qit,crt,Git,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,CCt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,CCt,OCt]))])),grt=new ocn("IN_T_R",14,Jit,crt,Git,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ACt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[DCt,ACt,OCt]))])),lrt=new ocn("IN_C_L",15,Yit,rrt,zit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,ICt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,ICt,OCt]))])),frt=new ocn("IN_C_C",16,Qit,rrt,zit,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,CCt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,CCt,OCt]))])),brt=new ocn("IN_C_R",17,Jit,rrt,zit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,ACt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[xCt,ACt,OCt]))])),srt=new ocn("IN_B_L",18,Yit,irt,Uit,Git,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ICt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ICt,OCt]))])),ort=new ocn("IN_B_C",19,Qit,irt,Uit,zit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,CCt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,CCt,OCt]))])),hrt=new ocn("IN_B_R",20,Jit,irt,Uit,Uit,Pun(Gk(Dnt,1),HWn,21,0,[EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ACt])),EG($Ct,Pun(Gk(GCt,1),$Vn,93,0,[NCt,ACt,OCt]))])),Irt=new ocn(hJn,21,null,null,null,null,Pun(Gk(Dnt,1),HWn,21,0,[]))}function gWn(){gWn=O,i$t=(QX(),t$t).b,BB(Wtn(QQ(t$t.b),0),34),BB(Wtn(QQ(t$t.b),1),18),e$t=t$t.a,BB(Wtn(QQ(t$t.a),0),34),BB(Wtn(QQ(t$t.a),1),18),BB(Wtn(QQ(t$t.a),2),18),BB(Wtn(QQ(t$t.a),3),18),BB(Wtn(QQ(t$t.a),4),18),r$t=t$t.o,BB(Wtn(QQ(t$t.o),0),34),BB(Wtn(QQ(t$t.o),1),34),a$t=BB(Wtn(QQ(t$t.o),2),18),BB(Wtn(QQ(t$t.o),3),18),BB(Wtn(QQ(t$t.o),4),18),BB(Wtn(QQ(t$t.o),5),18),BB(Wtn(QQ(t$t.o),6),18),BB(Wtn(QQ(t$t.o),7),18),BB(Wtn(QQ(t$t.o),8),18),BB(Wtn(QQ(t$t.o),9),18),BB(Wtn(QQ(t$t.o),10),18),BB(Wtn(QQ(t$t.o),11),18),BB(Wtn(QQ(t$t.o),12),18),BB(Wtn(QQ(t$t.o),13),18),BB(Wtn(QQ(t$t.o),14),18),BB(Wtn(QQ(t$t.o),15),18),BB(Wtn(VQ(t$t.o),0),59),BB(Wtn(VQ(t$t.o),1),59),BB(Wtn(VQ(t$t.o),2),59),BB(Wtn(VQ(t$t.o),3),59),BB(Wtn(VQ(t$t.o),4),59),BB(Wtn(VQ(t$t.o),5),59),BB(Wtn(VQ(t$t.o),6),59),BB(Wtn(VQ(t$t.o),7),59),BB(Wtn(VQ(t$t.o),8),59),BB(Wtn(VQ(t$t.o),9),59),c$t=t$t.p,BB(Wtn(QQ(t$t.p),0),34),BB(Wtn(QQ(t$t.p),1),34),BB(Wtn(QQ(t$t.p),2),34),BB(Wtn(QQ(t$t.p),3),34),BB(Wtn(QQ(t$t.p),4),18),BB(Wtn(QQ(t$t.p),5),18),BB(Wtn(VQ(t$t.p),0),59),BB(Wtn(VQ(t$t.p),1),59),u$t=t$t.q,BB(Wtn(QQ(t$t.q),0),34),o$t=t$t.v,BB(Wtn(QQ(t$t.v),0),18),BB(Wtn(VQ(t$t.v),0),59),BB(Wtn(VQ(t$t.v),1),59),BB(Wtn(VQ(t$t.v),2),59),s$t=t$t.w,BB(Wtn(QQ(t$t.w),0),34),BB(Wtn(QQ(t$t.w),1),34),BB(Wtn(QQ(t$t.w),2),34),BB(Wtn(QQ(t$t.w),3),18),h$t=t$t.B,BB(Wtn(QQ(t$t.B),0),18),BB(Wtn(VQ(t$t.B),0),59),BB(Wtn(VQ(t$t.B),1),59),BB(Wtn(VQ(t$t.B),2),59),b$t=t$t.Q,BB(Wtn(QQ(t$t.Q),0),18),BB(Wtn(VQ(t$t.Q),0),59),w$t=t$t.R,BB(Wtn(QQ(t$t.R),0),34),d$t=t$t.S,BB(Wtn(VQ(t$t.S),0),59),BB(Wtn(VQ(t$t.S),1),59),BB(Wtn(VQ(t$t.S),2),59),BB(Wtn(VQ(t$t.S),3),59),BB(Wtn(VQ(t$t.S),4),59),BB(Wtn(VQ(t$t.S),5),59),BB(Wtn(VQ(t$t.S),6),59),BB(Wtn(VQ(t$t.S),7),59),BB(Wtn(VQ(t$t.S),8),59),BB(Wtn(VQ(t$t.S),9),59),BB(Wtn(VQ(t$t.S),10),59),BB(Wtn(VQ(t$t.S),11),59),BB(Wtn(VQ(t$t.S),12),59),BB(Wtn(VQ(t$t.S),13),59),BB(Wtn(VQ(t$t.S),14),59),g$t=t$t.T,BB(Wtn(QQ(t$t.T),0),18),BB(Wtn(QQ(t$t.T),2),18),p$t=BB(Wtn(QQ(t$t.T),3),18),BB(Wtn(QQ(t$t.T),4),18),BB(Wtn(VQ(t$t.T),0),59),BB(Wtn(VQ(t$t.T),1),59),BB(Wtn(QQ(t$t.T),1),18),v$t=t$t.U,BB(Wtn(QQ(t$t.U),0),34),BB(Wtn(QQ(t$t.U),1),34),BB(Wtn(QQ(t$t.U),2),18),BB(Wtn(QQ(t$t.U),3),18),BB(Wtn(QQ(t$t.U),4),18),BB(Wtn(QQ(t$t.U),5),18),BB(Wtn(VQ(t$t.U),0),59),m$t=t$t.V,BB(Wtn(QQ(t$t.V),0),18),y$t=t$t.W,BB(Wtn(QQ(t$t.W),0),34),BB(Wtn(QQ(t$t.W),1),34),BB(Wtn(QQ(t$t.W),2),34),BB(Wtn(QQ(t$t.W),3),18),BB(Wtn(QQ(t$t.W),4),18),BB(Wtn(QQ(t$t.W),5),18),j$t=t$t.bb,BB(Wtn(QQ(t$t.bb),0),34),BB(Wtn(QQ(t$t.bb),1),34),BB(Wtn(QQ(t$t.bb),2),34),BB(Wtn(QQ(t$t.bb),3),34),BB(Wtn(QQ(t$t.bb),4),34),BB(Wtn(QQ(t$t.bb),5),34),BB(Wtn(QQ(t$t.bb),6),34),BB(Wtn(QQ(t$t.bb),7),18),BB(Wtn(VQ(t$t.bb),0),59),BB(Wtn(VQ(t$t.bb),1),59),E$t=t$t.eb,BB(Wtn(QQ(t$t.eb),0),34),BB(Wtn(QQ(t$t.eb),1),34),BB(Wtn(QQ(t$t.eb),2),34),BB(Wtn(QQ(t$t.eb),3),34),BB(Wtn(QQ(t$t.eb),4),34),BB(Wtn(QQ(t$t.eb),5),34),BB(Wtn(QQ(t$t.eb),6),18),BB(Wtn(QQ(t$t.eb),7),18),k$t=t$t.ab,BB(Wtn(QQ(t$t.ab),0),34),BB(Wtn(QQ(t$t.ab),1),34),f$t=t$t.H,BB(Wtn(QQ(t$t.H),0),18),BB(Wtn(QQ(t$t.H),1),18),BB(Wtn(QQ(t$t.H),2),18),BB(Wtn(QQ(t$t.H),3),18),BB(Wtn(QQ(t$t.H),4),18),BB(Wtn(QQ(t$t.H),5),18),BB(Wtn(VQ(t$t.H),0),59),T$t=t$t.db,BB(Wtn(QQ(t$t.db),0),18),l$t=t$t.M}function pWn(n){var t;n.O||(n.O=!0,Nrn(n,"type"),xrn(n,"ecore.xml.type"),Drn(n,S7n),t=BB($$n((WM(),zAt),S7n),1945),f9(kY(n.fb),n.b),z0(n.b,wLt,"AnyType",!1,!1,!0),ucn(BB(Wtn(QQ(n.b),0),34),n.wb.D,K9n,null,0,-1,wLt,!1,!1,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.b),1),34),n.wb.D,"any",null,0,-1,wLt,!0,!0,!0,!1,!1,!0),ucn(BB(Wtn(QQ(n.b),2),34),n.wb.D,"anyAttribute",null,0,-1,wLt,!1,!1,!0,!1,!1,!1),z0(n.bb,zLt,A7n,!1,!1,!0),ucn(BB(Wtn(QQ(n.bb),0),34),n.gb,"data",null,0,1,zLt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),1),34),n.gb,Y6n,null,1,1,zLt,!1,!1,!0,!1,!0,!1),z0(n.fb,ULt,$7n,!1,!1,!0),ucn(BB(Wtn(QQ(n.fb),0),34),t.gb,"rawValue",null,0,1,ULt,!0,!0,!0,!1,!0,!0),ucn(BB(Wtn(QQ(n.fb),1),34),t.a,E6n,null,0,1,ULt,!0,!0,!0,!1,!0,!0),Myn(BB(Wtn(QQ(n.fb),2),18),n.wb.q,null,"instanceType",1,1,ULt,!1,!1,!0,!1,!1,!1,!1),z0(n.qb,XLt,L7n,!1,!1,!0),ucn(BB(Wtn(QQ(n.qb),0),34),n.wb.D,K9n,null,0,-1,null,!1,!1,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.qb),1),18),n.wb.ab,null,"xMLNSPrefixMap",0,-1,null,!0,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.qb),2),18),n.wb.ab,null,"xSISchemaLocation",0,-1,null,!0,!1,!0,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.qb),3),34),n.gb,"cDATA",null,0,-2,null,!0,!0,!0,!1,!1,!0),ucn(BB(Wtn(QQ(n.qb),4),34),n.gb,"comment",null,0,-2,null,!0,!0,!0,!1,!1,!0),Myn(BB(Wtn(QQ(n.qb),5),18),n.bb,null,cnt,0,-2,null,!0,!0,!0,!0,!1,!1,!0),ucn(BB(Wtn(QQ(n.qb),6),34),n.gb,O6n,null,0,-2,null,!0,!0,!0,!1,!1,!0),dV(n.a,Ant,"AnySimpleType",!0),dV(n.c,Qtt,"AnyURI",!0),dV(n.d,Gk(NNt,1),"Base64Binary",!0),dV(n.e,$Nt,"Boolean",!0),dV(n.f,ktt,"BooleanObject",!0),dV(n.g,NNt,"Byte",!0),dV(n.i,Ttt,"ByteObject",!0),dV(n.j,Qtt,"Date",!0),dV(n.k,Qtt,"DateTime",!0),dV(n.n,iet,"Decimal",!0),dV(n.o,xNt,"Double",!0),dV(n.p,Ptt,"DoubleObject",!0),dV(n.q,Qtt,"Duration",!0),dV(n.s,Rnt,"ENTITIES",!0),dV(n.r,Rnt,"ENTITIESBase",!0),dV(n.t,Qtt,_7n,!0),dV(n.u,DNt,"Float",!0),dV(n.v,Ctt,"FloatObject",!0),dV(n.w,Qtt,"GDay",!0),dV(n.B,Qtt,"GMonth",!0),dV(n.A,Qtt,"GMonthDay",!0),dV(n.C,Qtt,"GYear",!0),dV(n.D,Qtt,"GYearMonth",!0),dV(n.F,Gk(NNt,1),"HexBinary",!0),dV(n.G,Qtt,"ID",!0),dV(n.H,Qtt,"IDREF",!0),dV(n.J,Rnt,"IDREFS",!0),dV(n.I,Rnt,"IDREFSBase",!0),dV(n.K,ANt,"Int",!0),dV(n.M,oet,"Integer",!0),dV(n.L,Att,"IntObject",!0),dV(n.P,Qtt,"Language",!0),dV(n.Q,LNt,"Long",!0),dV(n.R,Rtt,"LongObject",!0),dV(n.S,Qtt,"Name",!0),dV(n.T,Qtt,F7n,!0),dV(n.U,oet,"NegativeInteger",!0),dV(n.V,Qtt,Q7n,!0),dV(n.X,Rnt,"NMTOKENS",!0),dV(n.W,Rnt,"NMTOKENSBase",!0),dV(n.Y,oet,"NonNegativeInteger",!0),dV(n.Z,oet,"NonPositiveInteger",!0),dV(n.$,Qtt,"NormalizedString",!0),dV(n._,Qtt,"NOTATION",!0),dV(n.ab,Qtt,"PositiveInteger",!0),dV(n.cb,Qtt,"QName",!0),dV(n.db,RNt,"Short",!0),dV(n.eb,_tt,"ShortObject",!0),dV(n.gb,Qtt,qVn,!0),dV(n.hb,Qtt,"Time",!0),dV(n.ib,Qtt,"Token",!0),dV(n.jb,RNt,"UnsignedByte",!0),dV(n.kb,_tt,"UnsignedByteObject",!0),dV(n.lb,LNt,"UnsignedInt",!0),dV(n.mb,Rtt,"UnsignedIntObject",!0),dV(n.nb,oet,"UnsignedLong",!0),dV(n.ob,ANt,"UnsignedShort",!0),dV(n.pb,Att,"UnsignedShortObject",!0),Lhn(n,S7n),yWn(n))}function vWn(n){NM(n,new MTn(mj(dj(vj(wj(pj(gj(new du,w1n),"ELK Layered"),"Layer-based algorithm provided by the Eclipse Layout Kernel. Arranges as many edges as possible into one direction by placing nodes into subsequent layers. This implementation supports different routing styles (straight, orthogonal, splines); if orthogonal routing is selected, arbitrary port constraints are respected, thus enabling the layout of block diagrams such as actor-oriented models or circuit schematics. Furthermore, full layout of compound graphs with cross-hierarchy edges is supported when the respective option is activated on the top level."),new Cc),w1n),EG((hAn(),iAt),Pun(Gk(aAt,1),$Vn,237,0,[nAt,tAt,ZOt,eAt,YOt,QOt]))))),u2(n,w1n,L2n,mpn(ppt)),u2(n,w1n,N2n,mpn(vpt)),u2(n,w1n,XJn,mpn(mpt)),u2(n,w1n,x2n,mpn(ypt)),u2(n,w1n,mZn,mpn(jpt)),u2(n,w1n,D2n,mpn(Ept)),u2(n,w1n,R2n,mpn(Spt)),u2(n,w1n,K2n,mpn(Cpt)),u2(n,w1n,_2n,mpn(Ipt)),u2(n,w1n,F2n,mpn(Ppt)),u2(n,w1n,vZn,mpn(Opt)),u2(n,w1n,B2n,mpn($pt)),u2(n,w1n,H2n,mpn(Npt)),u2(n,w1n,q2n,mpn(Mpt)),u2(n,w1n,L0n,mpn(gpt)),u2(n,w1n,x0n,mpn(kpt)),u2(n,w1n,N0n,mpn(Tpt)),u2(n,w1n,D0n,mpn(Apt)),u2(n,w1n,pZn,iln(0)),u2(n,w1n,R0n,mpn(fpt)),u2(n,w1n,K0n,mpn(lpt)),u2(n,w1n,_0n,mpn(bpt)),u2(n,w1n,U0n,mpn(zpt)),u2(n,w1n,X0n,mpn(Rpt)),u2(n,w1n,W0n,mpn(Kpt)),u2(n,w1n,V0n,mpn(Bpt)),u2(n,w1n,Q0n,mpn(_pt)),u2(n,w1n,Y0n,mpn(Fpt)),u2(n,w1n,J0n,mpn(Xpt)),u2(n,w1n,Z0n,mpn(Upt)),u2(n,w1n,n2n,mpn(qpt)),u2(n,w1n,t2n,mpn(Hpt)),u2(n,w1n,e2n,mpn(Gpt)),u2(n,w1n,S0n,mpn(Rgt)),u2(n,w1n,P0n,mpn(Kgt)),u2(n,w1n,O0n,mpn(rgt)),u2(n,w1n,A0n,mpn(cgt)),u2(n,w1n,QJn,Ugt),u2(n,w1n,y2n,ngt),u2(n,w1n,G2n,0),u2(n,w1n,yZn,iln(1)),u2(n,w1n,VJn,dZn),u2(n,w1n,z2n,mpn(Ggt)),u2(n,w1n,EZn,mpn(ept)),u2(n,w1n,U2n,mpn(upt)),u2(n,w1n,X2n,mpn(zdt)),u2(n,w1n,W2n,mpn(kdt)),u2(n,w1n,d2n,mpn(sgt)),u2(n,w1n,kZn,(hN(),!0)),u2(n,w1n,V2n,mpn(wgt)),u2(n,w1n,Q2n,mpn(dgt)),u2(n,w1n,PZn,mpn(Fgt)),u2(n,w1n,SZn,mpn(qgt)),u2(n,w1n,Y2n,mpn(Bgt)),u2(n,w1n,J2n,Wdt),u2(n,w1n,CZn,mpn($gt)),u2(n,w1n,Z2n,mpn(Agt)),u2(n,w1n,IZn,mpn(cpt)),u2(n,w1n,n3n,mpn(rpt)),u2(n,w1n,t3n,mpn(apt)),u2(n,w1n,e3n,Vgt),u2(n,w1n,i3n,mpn(Ygt)),u2(n,w1n,r3n,mpn(Jgt)),u2(n,w1n,c3n,mpn(Zgt)),u2(n,w1n,a3n,mpn(Qgt)),u2(n,w1n,n0n,mpn(Dpt)),u2(n,w1n,i0n,mpn(Pgt)),u2(n,w1n,s0n,mpn(Sgt)),u2(n,w1n,Z1n,mpn(xpt)),u2(n,w1n,r0n,mpn(kgt)),u2(n,w1n,e0n,mpn(Gdt)),u2(n,w1n,l0n,mpn(qdt)),u2(n,w1n,b0n,mpn(xdt)),u2(n,w1n,v0n,mpn(Ddt)),u2(n,w1n,m0n,mpn(Kdt)),u2(n,w1n,y0n,mpn(Rdt)),u2(n,w1n,d0n,mpn(Hdt)),u2(n,w1n,V1n,mpn(Igt)),u2(n,w1n,Q1n,mpn(Ogt)),u2(n,w1n,W1n,mpn(pgt)),u2(n,w1n,k0n,mpn(_gt)),u2(n,w1n,T0n,mpn(Ngt)),u2(n,w1n,X1n,mpn(ugt)),u2(n,w1n,M0n,mpn(Dgt)),u2(n,w1n,C0n,mpn(egt)),u2(n,w1n,I0n,mpn(igt)),u2(n,w1n,u3n,mpn(Ndt)),u2(n,w1n,E0n,mpn(Lgt)),u2(n,w1n,B0n,mpn(Pdt)),u2(n,w1n,H0n,mpn(Sdt)),u2(n,w1n,F0n,mpn(Mdt)),u2(n,w1n,q0n,mpn(fgt)),u2(n,w1n,G0n,mpn(hgt)),u2(n,w1n,z0n,mpn(lgt)),u2(n,w1n,BZn,mpn(Hgt)),u2(n,w1n,o3n,mpn(vgt)),u2(n,w1n,WJn,mpn(agt)),u2(n,w1n,s3n,mpn(Ydt)),u2(n,w1n,TZn,mpn(Qdt)),u2(n,w1n,w0n,mpn(_dt)),u2(n,w1n,h3n,mpn(ipt)),u2(n,w1n,f3n,mpn(Tdt)),u2(n,w1n,l3n,mpn(bgt)),u2(n,w1n,b3n,mpn(npt)),u2(n,w1n,w3n,mpn(Xgt)),u2(n,w1n,d3n,mpn(Wgt)),u2(n,w1n,u0n,mpn(Egt)),u2(n,w1n,o0n,mpn(Tgt)),u2(n,w1n,g3n,mpn(spt)),u2(n,w1n,Y1n,mpn(jdt)),u2(n,w1n,h0n,mpn(Mgt)),u2(n,w1n,i2n,mpn(Jdt)),u2(n,w1n,r2n,mpn(Vdt)),u2(n,w1n,p3n,mpn(Cgt)),u2(n,w1n,f0n,mpn(mgt)),u2(n,w1n,j0n,mpn(xgt)),u2(n,w1n,v3n,mpn(Lpt)),u2(n,w1n,U1n,mpn(Xdt)),u2(n,w1n,J1n,mpn(opt)),u2(n,w1n,$0n,mpn(tgt)),u2(n,w1n,c0n,mpn(ygt)),u2(n,w1n,g0n,mpn(Fdt)),u2(n,w1n,m3n,mpn(ggt)),u2(n,w1n,a0n,mpn(jgt)),u2(n,w1n,p0n,mpn(Bdt)),u2(n,w1n,c2n,mpn(Ldt)),u2(n,w1n,o2n,mpn(Adt)),u2(n,w1n,s2n,mpn(Idt)),u2(n,w1n,h2n,mpn(Odt)),u2(n,w1n,a2n,mpn($dt)),u2(n,w1n,u2n,mpn(Cdt)),u2(n,w1n,t0n,mpn(ogt))}function mWn(n,t){var e;return nNt||(nNt=new xp,tNt=new xp,wWn(),wWn(),ydn(e=new M0(4),"\t\n\r\r "),mZ(nNt,fnt,e),mZ(tNt,fnt,$Fn(e)),ydn(e=new M0(4),wnt),mZ(nNt,snt,e),mZ(tNt,snt,$Fn(e)),ydn(e=new M0(4),wnt),mZ(nNt,snt,e),mZ(tNt,snt,$Fn(e)),ydn(e=new M0(4),dnt),sHn(e,BB(SJ(nNt,snt),117)),mZ(nNt,hnt,e),mZ(tNt,hnt,$Fn(e)),ydn(e=new M0(4),"-.0:AZ__az\xb7\xb7\xc0\xd6\xd8\xf6\xf8\u0131\u0134\u013e\u0141\u0148\u014a\u017e\u0180\u01c3\u01cd\u01f0\u01f4\u01f5\u01fa\u0217\u0250\u02a8\u02bb\u02c1\u02d0\u02d1\u0300\u0345\u0360\u0361\u0386\u038a\u038c\u038c\u038e\u03a1\u03a3\u03ce\u03d0\u03d6\u03da\u03da\u03dc\u03dc\u03de\u03de\u03e0\u03e0\u03e2\u03f3\u0401\u040c\u040e\u044f\u0451\u045c\u045e\u0481\u0483\u0486\u0490\u04c4\u04c7\u04c8\u04cb\u04cc\u04d0\u04eb\u04ee\u04f5\u04f8\u04f9\u0531\u0556\u0559\u0559\u0561\u0586\u0591\u05a1\u05a3\u05b9\u05bb\u05bd\u05bf\u05bf\u05c1\u05c2\u05c4\u05c4\u05d0\u05ea\u05f0\u05f2\u0621\u063a\u0640\u0652\u0660\u0669\u0670\u06b7\u06ba\u06be\u06c0\u06ce\u06d0\u06d3\u06d5\u06e8\u06ea\u06ed\u06f0\u06f9\u0901\u0903\u0905\u0939\u093c\u094d\u0951\u0954\u0958\u0963\u0966\u096f\u0981\u0983\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bc\u09bc\u09be\u09c4\u09c7\u09c8\u09cb\u09cd\u09d7\u09d7\u09dc\u09dd\u09df\u09e3\u09e6\u09f1\u0a02\u0a02\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3c\u0a3e\u0a42\u0a47\u0a48\u0a4b\u0a4d\u0a59\u0a5c\u0a5e\u0a5e\u0a66\u0a74\u0a81\u0a83\u0a85\u0a8b\u0a8d\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abc\u0ac5\u0ac7\u0ac9\u0acb\u0acd\u0ae0\u0ae0\u0ae6\u0aef\u0b01\u0b03\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b36\u0b39\u0b3c\u0b43\u0b47\u0b48\u0b4b\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f\u0b61\u0b66\u0b6f\u0b82\u0b83\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb5\u0bb7\u0bb9\u0bbe\u0bc2\u0bc6\u0bc8\u0bca\u0bcd\u0bd7\u0bd7\u0be7\u0bef\u0c01\u0c03\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c33\u0c35\u0c39\u0c3e\u0c44\u0c46\u0c48\u0c4a\u0c4d\u0c55\u0c56\u0c60\u0c61\u0c66\u0c6f\u0c82\u0c83\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cbe\u0cc4\u0cc6\u0cc8\u0cca\u0ccd\u0cd5\u0cd6\u0cde\u0cde\u0ce0\u0ce1\u0ce6\u0cef\u0d02\u0d03\u0d05\u0d0c\u0d0e\u0d10\u0d12\u0d28\u0d2a\u0d39\u0d3e\u0d43\u0d46\u0d48\u0d4a\u0d4d\u0d57\u0d57\u0d60\u0d61\u0d66\u0d6f\u0e01\u0e2e\u0e30\u0e3a\u0e40\u0e4e\u0e50\u0e59\u0e81\u0e82\u0e84\u0e84\u0e87\u0e88\u0e8a\u0e8a\u0e8d\u0e8d\u0e94\u0e97\u0e99\u0e9f\u0ea1\u0ea3\u0ea5\u0ea5\u0ea7\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eb0\u0eb9\u0ebb\u0ebd\u0ec0\u0ec4\u0ec6\u0ec6\u0ec8\u0ecd\u0ed0\u0ed9\u0f18\u0f19\u0f20\u0f29\u0f35\u0f35\u0f37\u0f37\u0f39\u0f39\u0f3e\u0f47\u0f49\u0f69\u0f71\u0f84\u0f86\u0f8b\u0f90\u0f95\u0f97\u0f97\u0f99\u0fad\u0fb1\u0fb7\u0fb9\u0fb9\u10a0\u10c5\u10d0\u10f6\u1100\u1100\u1102\u1103\u1105\u1107\u1109\u1109\u110b\u110c\u110e\u1112\u113c\u113c\u113e\u113e\u1140\u1140\u114c\u114c\u114e\u114e\u1150\u1150\u1154\u1155\u1159\u1159\u115f\u1161\u1163\u1163\u1165\u1165\u1167\u1167\u1169\u1169\u116d\u116e\u1172\u1173\u1175\u1175\u119e\u119e\u11a8\u11a8\u11ab\u11ab\u11ae\u11af\u11b7\u11b8\u11ba\u11ba\u11bc\u11c2\u11eb\u11eb\u11f0\u11f0\u11f9\u11f9\u1e00\u1e9b\u1ea0\u1ef9\u1f00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u20d0\u20dc\u20e1\u20e1\u2126\u2126\u212a\u212b\u212e\u212e\u2180\u2182\u3005\u3005\u3007\u3007\u3021\u302f\u3031\u3035\u3041\u3094\u3099\u309a\u309d\u309e\u30a1\u30fa\u30fc\u30fe\u3105\u312c\u4e00\u9fa5\uac00\ud7a3"),mZ(nNt,lnt,e),mZ(tNt,lnt,$Fn(e)),ydn(e=new M0(4),dnt),Yxn(e,95,95),Yxn(e,58,58),mZ(nNt,bnt,e),mZ(tNt,bnt,$Fn(e))),BB(SJ(t?nNt:tNt,n),136)}function yWn(n){V$n(n.a,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"anySimpleType"])),V$n(n.b,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"anyType",F9n,K9n])),V$n(BB(Wtn(QQ(n.b),0),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,m7n,t8n,":mixed"])),V$n(BB(Wtn(QQ(n.b),1),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,m7n,M7n,P7n,t8n,":1",D7n,"lax"])),V$n(BB(Wtn(QQ(n.b),2),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,p7n,M7n,P7n,t8n,":2",D7n,"lax"])),V$n(n.c,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"anyURI",T7n,y7n])),V$n(n.d,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"base64Binary",T7n,y7n])),V$n(n.e,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,$Wn,T7n,y7n])),V$n(n.f,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"boolean:Object",J9n,$Wn])),V$n(n.g,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,S9n])),V$n(n.i,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"byte:Object",J9n,S9n])),V$n(n.j,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"date",T7n,y7n])),V$n(n.k,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"dateTime",T7n,y7n])),V$n(n.n,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"decimal",T7n,y7n])),V$n(n.o,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,C9n,T7n,y7n])),V$n(n.p,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"double:Object",J9n,C9n])),V$n(n.q,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"duration",T7n,y7n])),V$n(n.s,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"ENTITIES",J9n,R7n,K7n,"1"])),V$n(n.r,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,R7n,k7n,_7n])),V$n(n.t,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,_7n,J9n,F7n])),V$n(n.u,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,I9n,T7n,y7n])),V$n(n.v,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"float:Object",J9n,I9n])),V$n(n.w,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gDay",T7n,y7n])),V$n(n.B,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gMonth",T7n,y7n])),V$n(n.A,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gMonthDay",T7n,y7n])),V$n(n.C,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gYear",T7n,y7n])),V$n(n.D,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"gYearMonth",T7n,y7n])),V$n(n.F,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"hexBinary",T7n,y7n])),V$n(n.G,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"ID",J9n,F7n])),V$n(n.H,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"IDREF",J9n,F7n])),V$n(n.J,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"IDREFS",J9n,B7n,K7n,"1"])),V$n(n.I,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,B7n,k7n,"IDREF"])),V$n(n.K,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,O9n])),V$n(n.M,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,H7n])),V$n(n.L,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"int:Object",J9n,O9n])),V$n(n.P,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"language",J9n,q7n,G7n,z7n])),V$n(n.Q,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,A9n])),V$n(n.R,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"long:Object",J9n,A9n])),V$n(n.S,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"Name",J9n,q7n,G7n,U7n])),V$n(n.T,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,F7n,J9n,"Name",G7n,X7n])),V$n(n.U,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"negativeInteger",J9n,W7n,V7n,"-1"])),V$n(n.V,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,Q7n,J9n,q7n,G7n,"\\c+"])),V$n(n.X,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"NMTOKENS",J9n,Y7n,K7n,"1"])),V$n(n.W,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,Y7n,k7n,Q7n])),V$n(n.Y,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,J7n,J9n,H7n,Z7n,"0"])),V$n(n.Z,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,W7n,J9n,H7n,V7n,"0"])),V$n(n.$,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,nnt,J9n,NWn,T7n,"replace"])),V$n(n._,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"NOTATION",T7n,y7n])),V$n(n.ab,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"positiveInteger",J9n,J7n,Z7n,"1"])),V$n(n.bb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"processingInstruction_._type",F9n,"empty"])),V$n(BB(Wtn(QQ(n.bb),0),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,g7n,t8n,"data"])),V$n(BB(Wtn(QQ(n.bb),1),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,g7n,t8n,Y6n])),V$n(n.cb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"QName",T7n,y7n])),V$n(n.db,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,$9n])),V$n(n.eb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"short:Object",J9n,$9n])),V$n(n.fb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"simpleAnyType",F9n,d7n])),V$n(BB(Wtn(QQ(n.fb),0),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,":3",F9n,d7n])),V$n(BB(Wtn(QQ(n.fb),1),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,":4",F9n,d7n])),V$n(BB(Wtn(QQ(n.fb),2),18),_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,":5",F9n,d7n])),V$n(n.gb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,NWn,T7n,"preserve"])),V$n(n.hb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"time",T7n,y7n])),V$n(n.ib,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,q7n,J9n,nnt,T7n,y7n])),V$n(n.jb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,tnt,V7n,"255",Z7n,"0"])),V$n(n.kb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"unsignedByte:Object",J9n,tnt])),V$n(n.lb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,ent,V7n,"4294967295",Z7n,"0"])),V$n(n.mb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"unsignedInt:Object",J9n,ent])),V$n(n.nb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"unsignedLong",J9n,J7n,V7n,int,Z7n,"0"])),V$n(n.ob,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,rnt,V7n,"65535",Z7n,"0"])),V$n(n.pb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"unsignedShort:Object",J9n,rnt])),V$n(n.qb,_9n,Pun(Gk(Qtt,1),sVn,2,6,[t8n,"",F9n,K9n])),V$n(BB(Wtn(QQ(n.qb),0),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,m7n,t8n,":mixed"])),V$n(BB(Wtn(QQ(n.qb),1),18),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,g7n,t8n,"xmlns:prefix"])),V$n(BB(Wtn(QQ(n.qb),2),18),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,g7n,t8n,"xsi:schemaLocation"])),V$n(BB(Wtn(QQ(n.qb),3),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,v7n,t8n,"cDATA",j7n,E7n])),V$n(BB(Wtn(QQ(n.qb),4),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,v7n,t8n,"comment",j7n,E7n])),V$n(BB(Wtn(QQ(n.qb),5),18),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,v7n,t8n,cnt,j7n,E7n])),V$n(BB(Wtn(QQ(n.qb),6),34),_9n,Pun(Gk(Qtt,1),sVn,2,6,[F9n,v7n,t8n,O6n,j7n,E7n]))}function kWn(n){return mK("_UI_EMFDiagnostic_marker",n)?"EMF Problem":mK("_UI_CircularContainment_diagnostic",n)?"An object may not circularly contain itself":mK(w8n,n)?"Wrong character.":mK(d8n,n)?"Invalid reference number.":mK(g8n,n)?"A character is required after \\.":mK(p8n,n)?"'?' is not expected. '(?:' or '(?=' or '(?!' or '(?<' or '(?#' or '(?>'?":mK(v8n,n)?"'(?<' or '(?<!' is expected.":mK(m8n,n)?"A comment is not terminated.":mK(y8n,n)?"')' is expected.":mK(k8n,n)?"Unexpected end of the pattern in a modifier group.":mK(j8n,n)?"':' is expected.":mK(E8n,n)?"Unexpected end of the pattern in a conditional group.":mK(T8n,n)?"A back reference or an anchor or a lookahead or a look-behind is expected in a conditional pattern.":mK(M8n,n)?"There are more than three choices in a conditional group.":mK(S8n,n)?"A character in U+0040-U+005f must follow \\c.":mK(P8n,n)?"A '{' is required before a character category.":mK(C8n,n)?"A property name is not closed by '}'.":mK(I8n,n)?"Unexpected meta character.":mK(O8n,n)?"Unknown property.":mK(A8n,n)?"A POSIX character class must be closed by ':]'.":mK($8n,n)?"Unexpected end of the pattern in a character class.":mK(L8n,n)?"Unknown name for a POSIX character class.":mK("parser.cc.4",n)?"'-' is invalid here.":mK(N8n,n)?"']' is expected.":mK(x8n,n)?"'[' is invalid in a character class. Write '\\['.":mK(D8n,n)?"']' is invalid in a character class. Write '\\]'.":mK(R8n,n)?"'-' is an invalid character range. Write '\\-'.":mK(K8n,n)?"'[' is expected.":mK(_8n,n)?"')' or '-[' or '+[' or '&[' is expected.":mK(F8n,n)?"The range end code point is less than the start code point.":mK(B8n,n)?"Invalid Unicode hex notation.":mK(H8n,n)?"Overflow in a hex notation.":mK(q8n,n)?"'\\x{' must be closed by '}'.":mK(G8n,n)?"Invalid Unicode code point.":mK(z8n,n)?"An anchor must not be here.":mK(U8n,n)?"This expression is not supported in the current option setting.":mK(X8n,n)?"Invalid quantifier. A digit is expected.":mK(W8n,n)?"Invalid quantifier. Invalid quantity or a '}' is missing.":mK(V8n,n)?"Invalid quantifier. A digit or '}' is expected.":mK(Q8n,n)?"Invalid quantifier. A min quantity must be <= a max quantity.":mK(Y8n,n)?"Invalid quantifier. A quantity value overflow.":mK("_UI_PackageRegistry_extensionpoint",n)?"Ecore Package Registry for Generated Packages":mK("_UI_DynamicPackageRegistry_extensionpoint",n)?"Ecore Package Registry for Dynamic Packages":mK("_UI_FactoryRegistry_extensionpoint",n)?"Ecore Factory Override Registry":mK("_UI_URIExtensionParserRegistry_extensionpoint",n)?"URI Extension Parser Registry":mK("_UI_URIProtocolParserRegistry_extensionpoint",n)?"URI Protocol Parser Registry":mK("_UI_URIContentParserRegistry_extensionpoint",n)?"URI Content Parser Registry":mK("_UI_ContentHandlerRegistry_extensionpoint",n)?"Content Handler Registry":mK("_UI_URIMappingRegistry_extensionpoint",n)?"URI Converter Mapping Registry":mK("_UI_PackageRegistryImplementation_extensionpoint",n)?"Ecore Package Registry Implementation":mK("_UI_ValidationDelegateRegistry_extensionpoint",n)?"Validation Delegate Registry":mK("_UI_SettingDelegateRegistry_extensionpoint",n)?"Feature Setting Delegate Factory Registry":mK("_UI_InvocationDelegateRegistry_extensionpoint",n)?"Operation Invocation Delegate Factory Registry":mK("_UI_EClassInterfaceNotAbstract_diagnostic",n)?"A class that is an interface must also be abstract":mK("_UI_EClassNoCircularSuperTypes_diagnostic",n)?"A class may not be a super type of itself":mK("_UI_EClassNotWellFormedMapEntryNoInstanceClassName_diagnostic",n)?"A class that inherits from a map entry class must have instance class name 'java.util.Map$Entry'":mK("_UI_EReferenceOppositeOfOppositeInconsistent_diagnostic",n)?"The opposite of the opposite may not be a reference different from this one":mK("_UI_EReferenceOppositeNotFeatureOfType_diagnostic",n)?"The opposite must be a feature of the reference's type":mK("_UI_EReferenceTransientOppositeNotTransient_diagnostic",n)?"The opposite of a transient reference must be transient if it is proxy resolving":mK("_UI_EReferenceOppositeBothContainment_diagnostic",n)?"The opposite of a containment reference must not be a containment reference":mK("_UI_EReferenceConsistentUnique_diagnostic",n)?"A containment or bidirectional reference must be unique if its upper bound is different from 1":mK("_UI_ETypedElementNoType_diagnostic",n)?"The typed element must have a type":mK("_UI_EAttributeNoDataType_diagnostic",n)?"The generic attribute type must not refer to a class":mK("_UI_EReferenceNoClass_diagnostic",n)?"The generic reference type must not refer to a data type":mK("_UI_EGenericTypeNoTypeParameterAndClassifier_diagnostic",n)?"A generic type can't refer to both a type parameter and a classifier":mK("_UI_EGenericTypeNoClass_diagnostic",n)?"A generic super type must refer to a class":mK("_UI_EGenericTypeNoTypeParameterOrClassifier_diagnostic",n)?"A generic type in this context must refer to a classifier or a type parameter":mK("_UI_EGenericTypeBoundsOnlyForTypeArgument_diagnostic",n)?"A generic type may have bounds only when used as a type argument":mK("_UI_EGenericTypeNoUpperAndLowerBound_diagnostic",n)?"A generic type must not have both a lower and an upper bound":mK("_UI_EGenericTypeNoTypeParameterOrClassifierAndBound_diagnostic",n)?"A generic type with bounds must not also refer to a type parameter or classifier":mK("_UI_EGenericTypeNoArguments_diagnostic",n)?"A generic type may have arguments only if it refers to a classifier":mK("_UI_EGenericTypeOutOfScopeTypeParameter_diagnostic",n)?"A generic type may only refer to a type parameter that is in scope":n}function jWn(n){var t,e,i,r,c,a,u;n.r||(n.r=!0,Nrn(n,"graph"),xrn(n,"graph"),Drn(n,y6n),cun(n.o,"T"),f9(kY(n.a),n.p),f9(kY(n.f),n.a),f9(kY(n.n),n.f),f9(kY(n.g),n.n),f9(kY(n.c),n.n),f9(kY(n.i),n.c),f9(kY(n.j),n.c),f9(kY(n.d),n.f),f9(kY(n.e),n.a),z0(n.p,Xrt,OJn,!0,!0,!1),u=Tun(a=msn(n.p,n.p,"setProperty")),t=ZV(n.o),e=new Kp,f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),kEn(e,i=nQ(u)),Ujn(a,t,j6n),Ujn(a,t=nQ(u),E6n),u=Tun(a=msn(n.p,null,"getProperty")),t=ZV(n.o),e=nQ(u),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),Ujn(a,t,j6n),(c=HTn(a,t=nQ(u),null))&&c.Fi(),a=msn(n.p,n.wb.e,"hasProperty"),t=ZV(n.o),e=new Kp,f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),Ujn(a,t,j6n),$yn(a=msn(n.p,n.p,"copyProperties"),n.p,T6n),a=msn(n.p,null,"getAllProperties"),t=ZV(n.wb.P),e=ZV(n.o),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),i=new Kp,f9((!e.d&&(e.d=new $L(VAt,e,1)),e.d),i),e=ZV(n.wb.M),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(r=HTn(a,t,null))&&r.Fi(),z0(n.a,NOt,z5n,!0,!1,!0),Myn(BB(Wtn(QQ(n.a),0),18),n.k,null,M6n,0,-1,NOt,!1,!1,!0,!0,!1,!1,!1),z0(n.f,DOt,X5n,!0,!1,!0),Myn(BB(Wtn(QQ(n.f),0),18),n.g,BB(Wtn(QQ(n.g),0),18),"labels",0,-1,DOt,!1,!1,!0,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.f),1),34),n.wb._,S6n,null,0,1,DOt,!1,!1,!0,!1,!0,!1),z0(n.n,ROt,"ElkShape",!0,!1,!0),ucn(BB(Wtn(QQ(n.n),0),34),n.wb.t,P6n,WQn,1,1,ROt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.n),1),34),n.wb.t,C6n,WQn,1,1,ROt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.n),2),34),n.wb.t,"x",WQn,1,1,ROt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.n),3),34),n.wb.t,"y",WQn,1,1,ROt,!1,!1,!0,!1,!0,!1),$yn(a=msn(n.n,null,"setDimensions"),n.wb.t,C6n),$yn(a,n.wb.t,P6n),$yn(a=msn(n.n,null,"setLocation"),n.wb.t,"x"),$yn(a,n.wb.t,"y"),z0(n.g,zOt,Z5n,!1,!1,!0),Myn(BB(Wtn(QQ(n.g),0),18),n.f,BB(Wtn(QQ(n.f),0),18),I6n,0,1,zOt,!1,!1,!0,!1,!1,!1,!1),ucn(BB(Wtn(QQ(n.g),1),34),n.wb._,O6n,"",0,1,zOt,!1,!1,!0,!1,!0,!1),z0(n.c,KOt,W5n,!0,!1,!0),Myn(BB(Wtn(QQ(n.c),0),18),n.d,BB(Wtn(QQ(n.d),1),18),"outgoingEdges",0,-1,KOt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.c),1),18),n.d,BB(Wtn(QQ(n.d),2),18),"incomingEdges",0,-1,KOt,!1,!1,!0,!1,!0,!1,!1),z0(n.i,UOt,n6n,!1,!1,!0),Myn(BB(Wtn(QQ(n.i),0),18),n.j,BB(Wtn(QQ(n.j),0),18),"ports",0,-1,UOt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.i),1),18),n.i,BB(Wtn(QQ(n.i),2),18),A6n,0,-1,UOt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.i),2),18),n.i,BB(Wtn(QQ(n.i),1),18),I6n,0,1,UOt,!1,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.i),3),18),n.d,BB(Wtn(QQ(n.d),0),18),"containedEdges",0,-1,UOt,!1,!1,!0,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.i),4),34),n.wb.e,$6n,null,0,1,UOt,!0,!0,!1,!1,!0,!0),z0(n.j,XOt,t6n,!1,!1,!0),Myn(BB(Wtn(QQ(n.j),0),18),n.i,BB(Wtn(QQ(n.i),0),18),I6n,0,1,XOt,!1,!1,!0,!1,!1,!1,!1),z0(n.d,_Ot,V5n,!1,!1,!0),Myn(BB(Wtn(QQ(n.d),0),18),n.i,BB(Wtn(QQ(n.i),3),18),"containingNode",0,1,_Ot,!1,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.d),1),18),n.c,BB(Wtn(QQ(n.c),0),18),L6n,0,-1,_Ot,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.d),2),18),n.c,BB(Wtn(QQ(n.c),1),18),N6n,0,-1,_Ot,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.d),3),18),n.e,BB(Wtn(QQ(n.e),5),18),x6n,0,-1,_Ot,!1,!1,!0,!0,!1,!1,!1),ucn(BB(Wtn(QQ(n.d),4),34),n.wb.e,"hyperedge",null,0,1,_Ot,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.d),5),34),n.wb.e,$6n,null,0,1,_Ot,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.d),6),34),n.wb.e,"selfloop",null,0,1,_Ot,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.d),7),34),n.wb.e,"connected",null,0,1,_Ot,!0,!0,!1,!1,!0,!0),z0(n.b,xOt,U5n,!1,!1,!0),ucn(BB(Wtn(QQ(n.b),0),34),n.wb.t,"x",WQn,1,1,xOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.b),1),34),n.wb.t,"y",WQn,1,1,xOt,!1,!1,!0,!1,!0,!1),$yn(a=msn(n.b,null,"set"),n.wb.t,"x"),$yn(a,n.wb.t,"y"),z0(n.e,FOt,Q5n,!1,!1,!0),ucn(BB(Wtn(QQ(n.e),0),34),n.wb.t,"startX",null,0,1,FOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.e),1),34),n.wb.t,"startY",null,0,1,FOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.e),2),34),n.wb.t,"endX",null,0,1,FOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.e),3),34),n.wb.t,"endY",null,0,1,FOt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.e),4),18),n.b,null,D6n,0,-1,FOt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.e),5),18),n.d,BB(Wtn(QQ(n.d),3),18),I6n,0,1,FOt,!1,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.e),6),18),n.c,null,R6n,0,1,FOt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.e),7),18),n.c,null,K6n,0,1,FOt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.e),8),18),n.e,BB(Wtn(QQ(n.e),9),18),_6n,0,-1,FOt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.e),9),18),n.e,BB(Wtn(QQ(n.e),8),18),F6n,0,-1,FOt,!1,!1,!0,!1,!0,!1,!1),ucn(BB(Wtn(QQ(n.e),10),34),n.wb._,S6n,null,0,1,FOt,!1,!1,!0,!1,!0,!1),$yn(a=msn(n.e,null,"setStartLocation"),n.wb.t,"x"),$yn(a,n.wb.t,"y"),$yn(a=msn(n.e,null,"setEndLocation"),n.wb.t,"x"),$yn(a,n.wb.t,"y"),z0(n.k,Hnt,"ElkPropertyToValueMapEntry",!1,!1,!1),t=ZV(n.o),e=new Kp,f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),_On(BB(Wtn(QQ(n.k),0),34),t,"key",Hnt,!1,!1,!0,!1),ucn(BB(Wtn(QQ(n.k),1),34),n.s,E6n,null,0,1,Hnt,!1,!1,!0,!1,!0,!1),dV(n.o,lMt,"IProperty",!0),dV(n.s,Ant,"PropertyValue",!0),Lhn(n,y6n))}function EWn(){EWn=O,(JLt=x8(NNt,v6n,25,BQn,15,1))[9]=35,JLt[10]=19,JLt[13]=19,JLt[32]=51,JLt[33]=49,JLt[34]=33,yU(JLt,35,38,49),JLt[38]=1,yU(JLt,39,45,49),yU(JLt,45,47,-71),JLt[47]=49,yU(JLt,48,58,-71),JLt[58]=61,JLt[59]=49,JLt[60]=1,JLt[61]=49,JLt[62]=33,yU(JLt,63,65,49),yU(JLt,65,91,-3),yU(JLt,91,93,33),JLt[93]=1,JLt[94]=33,JLt[95]=-3,JLt[96]=33,yU(JLt,97,123,-3),yU(JLt,123,183,33),JLt[183]=-87,yU(JLt,184,192,33),yU(JLt,192,215,-19),JLt[215]=33,yU(JLt,216,247,-19),JLt[247]=33,yU(JLt,248,306,-19),yU(JLt,306,308,33),yU(JLt,308,319,-19),yU(JLt,319,321,33),yU(JLt,321,329,-19),JLt[329]=33,yU(JLt,330,383,-19),JLt[383]=33,yU(JLt,384,452,-19),yU(JLt,452,461,33),yU(JLt,461,497,-19),yU(JLt,497,500,33),yU(JLt,500,502,-19),yU(JLt,502,506,33),yU(JLt,506,536,-19),yU(JLt,536,592,33),yU(JLt,592,681,-19),yU(JLt,681,699,33),yU(JLt,699,706,-19),yU(JLt,706,720,33),yU(JLt,720,722,-87),yU(JLt,722,768,33),yU(JLt,768,838,-87),yU(JLt,838,864,33),yU(JLt,864,866,-87),yU(JLt,866,902,33),JLt[902]=-19,JLt[903]=-87,yU(JLt,904,907,-19),JLt[907]=33,JLt[908]=-19,JLt[909]=33,yU(JLt,910,930,-19),JLt[930]=33,yU(JLt,931,975,-19),JLt[975]=33,yU(JLt,976,983,-19),yU(JLt,983,986,33),JLt[986]=-19,JLt[987]=33,JLt[988]=-19,JLt[989]=33,JLt[990]=-19,JLt[991]=33,JLt[992]=-19,JLt[993]=33,yU(JLt,994,1012,-19),yU(JLt,1012,1025,33),yU(JLt,1025,1037,-19),JLt[1037]=33,yU(JLt,1038,1104,-19),JLt[1104]=33,yU(JLt,1105,1117,-19),JLt[1117]=33,yU(JLt,1118,1154,-19),JLt[1154]=33,yU(JLt,1155,1159,-87),yU(JLt,1159,1168,33),yU(JLt,1168,1221,-19),yU(JLt,1221,1223,33),yU(JLt,1223,1225,-19),yU(JLt,1225,1227,33),yU(JLt,1227,1229,-19),yU(JLt,1229,1232,33),yU(JLt,1232,1260,-19),yU(JLt,1260,1262,33),yU(JLt,1262,1270,-19),yU(JLt,1270,1272,33),yU(JLt,1272,1274,-19),yU(JLt,1274,1329,33),yU(JLt,1329,1367,-19),yU(JLt,1367,1369,33),JLt[1369]=-19,yU(JLt,1370,1377,33),yU(JLt,1377,1415,-19),yU(JLt,1415,1425,33),yU(JLt,1425,1442,-87),JLt[1442]=33,yU(JLt,1443,1466,-87),JLt[1466]=33,yU(JLt,1467,1470,-87),JLt[1470]=33,JLt[1471]=-87,JLt[1472]=33,yU(JLt,1473,1475,-87),JLt[1475]=33,JLt[1476]=-87,yU(JLt,1477,1488,33),yU(JLt,1488,1515,-19),yU(JLt,1515,1520,33),yU(JLt,1520,1523,-19),yU(JLt,1523,1569,33),yU(JLt,1569,1595,-19),yU(JLt,1595,1600,33),JLt[1600]=-87,yU(JLt,1601,1611,-19),yU(JLt,1611,1619,-87),yU(JLt,1619,1632,33),yU(JLt,1632,1642,-87),yU(JLt,1642,1648,33),JLt[1648]=-87,yU(JLt,1649,1720,-19),yU(JLt,1720,1722,33),yU(JLt,1722,1727,-19),JLt[1727]=33,yU(JLt,1728,1743,-19),JLt[1743]=33,yU(JLt,1744,1748,-19),JLt[1748]=33,JLt[1749]=-19,yU(JLt,1750,1765,-87),yU(JLt,1765,1767,-19),yU(JLt,1767,1769,-87),JLt[1769]=33,yU(JLt,1770,1774,-87),yU(JLt,1774,1776,33),yU(JLt,1776,1786,-87),yU(JLt,1786,2305,33),yU(JLt,2305,2308,-87),JLt[2308]=33,yU(JLt,2309,2362,-19),yU(JLt,2362,2364,33),JLt[2364]=-87,JLt[2365]=-19,yU(JLt,2366,2382,-87),yU(JLt,2382,2385,33),yU(JLt,2385,2389,-87),yU(JLt,2389,2392,33),yU(JLt,2392,2402,-19),yU(JLt,2402,2404,-87),yU(JLt,2404,2406,33),yU(JLt,2406,2416,-87),yU(JLt,2416,2433,33),yU(JLt,2433,2436,-87),JLt[2436]=33,yU(JLt,2437,2445,-19),yU(JLt,2445,2447,33),yU(JLt,2447,2449,-19),yU(JLt,2449,2451,33),yU(JLt,2451,2473,-19),JLt[2473]=33,yU(JLt,2474,2481,-19),JLt[2481]=33,JLt[2482]=-19,yU(JLt,2483,2486,33),yU(JLt,2486,2490,-19),yU(JLt,2490,2492,33),JLt[2492]=-87,JLt[2493]=33,yU(JLt,2494,2501,-87),yU(JLt,2501,2503,33),yU(JLt,2503,2505,-87),yU(JLt,2505,2507,33),yU(JLt,2507,2510,-87),yU(JLt,2510,2519,33),JLt[2519]=-87,yU(JLt,2520,2524,33),yU(JLt,2524,2526,-19),JLt[2526]=33,yU(JLt,2527,2530,-19),yU(JLt,2530,2532,-87),yU(JLt,2532,2534,33),yU(JLt,2534,2544,-87),yU(JLt,2544,2546,-19),yU(JLt,2546,2562,33),JLt[2562]=-87,yU(JLt,2563,2565,33),yU(JLt,2565,2571,-19),yU(JLt,2571,2575,33),yU(JLt,2575,2577,-19),yU(JLt,2577,2579,33),yU(JLt,2579,2601,-19),JLt[2601]=33,yU(JLt,2602,2609,-19),JLt[2609]=33,yU(JLt,2610,2612,-19),JLt[2612]=33,yU(JLt,2613,2615,-19),JLt[2615]=33,yU(JLt,2616,2618,-19),yU(JLt,2618,2620,33),JLt[2620]=-87,JLt[2621]=33,yU(JLt,2622,2627,-87),yU(JLt,2627,2631,33),yU(JLt,2631,2633,-87),yU(JLt,2633,2635,33),yU(JLt,2635,2638,-87),yU(JLt,2638,2649,33),yU(JLt,2649,2653,-19),JLt[2653]=33,JLt[2654]=-19,yU(JLt,2655,2662,33),yU(JLt,2662,2674,-87),yU(JLt,2674,2677,-19),yU(JLt,2677,2689,33),yU(JLt,2689,2692,-87),JLt[2692]=33,yU(JLt,2693,2700,-19),JLt[2700]=33,JLt[2701]=-19,JLt[2702]=33,yU(JLt,2703,2706,-19),JLt[2706]=33,yU(JLt,2707,2729,-19),JLt[2729]=33,yU(JLt,2730,2737,-19),JLt[2737]=33,yU(JLt,2738,2740,-19),JLt[2740]=33,yU(JLt,2741,2746,-19),yU(JLt,2746,2748,33),JLt[2748]=-87,JLt[2749]=-19,yU(JLt,2750,2758,-87),JLt[2758]=33,yU(JLt,2759,2762,-87),JLt[2762]=33,yU(JLt,2763,2766,-87),yU(JLt,2766,2784,33),JLt[2784]=-19,yU(JLt,2785,2790,33),yU(JLt,2790,2800,-87),yU(JLt,2800,2817,33),yU(JLt,2817,2820,-87),JLt[2820]=33,yU(JLt,2821,2829,-19),yU(JLt,2829,2831,33),yU(JLt,2831,2833,-19),yU(JLt,2833,2835,33),yU(JLt,2835,2857,-19),JLt[2857]=33,yU(JLt,2858,2865,-19),JLt[2865]=33,yU(JLt,2866,2868,-19),yU(JLt,2868,2870,33),yU(JLt,2870,2874,-19),yU(JLt,2874,2876,33),JLt[2876]=-87,JLt[2877]=-19,yU(JLt,2878,2884,-87),yU(JLt,2884,2887,33),yU(JLt,2887,2889,-87),yU(JLt,2889,2891,33),yU(JLt,2891,2894,-87),yU(JLt,2894,2902,33),yU(JLt,2902,2904,-87),yU(JLt,2904,2908,33),yU(JLt,2908,2910,-19),JLt[2910]=33,yU(JLt,2911,2914,-19),yU(JLt,2914,2918,33),yU(JLt,2918,2928,-87),yU(JLt,2928,2946,33),yU(JLt,2946,2948,-87),JLt[2948]=33,yU(JLt,2949,2955,-19),yU(JLt,2955,2958,33),yU(JLt,2958,2961,-19),JLt[2961]=33,yU(JLt,2962,2966,-19),yU(JLt,2966,2969,33),yU(JLt,2969,2971,-19),JLt[2971]=33,JLt[2972]=-19,JLt[2973]=33,yU(JLt,2974,2976,-19),yU(JLt,2976,2979,33),yU(JLt,2979,2981,-19),yU(JLt,2981,2984,33),yU(JLt,2984,2987,-19),yU(JLt,2987,2990,33),yU(JLt,2990,2998,-19),JLt[2998]=33,yU(JLt,2999,3002,-19),yU(JLt,3002,3006,33),yU(JLt,3006,3011,-87),yU(JLt,3011,3014,33),yU(JLt,3014,3017,-87),JLt[3017]=33,yU(JLt,3018,3022,-87),yU(JLt,3022,3031,33),JLt[3031]=-87,yU(JLt,3032,3047,33),yU(JLt,3047,3056,-87),yU(JLt,3056,3073,33),yU(JLt,3073,3076,-87),JLt[3076]=33,yU(JLt,3077,3085,-19),JLt[3085]=33,yU(JLt,3086,3089,-19),JLt[3089]=33,yU(JLt,3090,3113,-19),JLt[3113]=33,yU(JLt,3114,3124,-19),JLt[3124]=33,yU(JLt,3125,3130,-19),yU(JLt,3130,3134,33),yU(JLt,3134,3141,-87),JLt[3141]=33,yU(JLt,3142,3145,-87),JLt[3145]=33,yU(JLt,3146,3150,-87),yU(JLt,3150,3157,33),yU(JLt,3157,3159,-87),yU(JLt,3159,3168,33),yU(JLt,3168,3170,-19),yU(JLt,3170,3174,33),yU(JLt,3174,3184,-87),yU(JLt,3184,3202,33),yU(JLt,3202,3204,-87),JLt[3204]=33,yU(JLt,3205,3213,-19),JLt[3213]=33,yU(JLt,3214,3217,-19),JLt[3217]=33,yU(JLt,3218,3241,-19),JLt[3241]=33,yU(JLt,3242,3252,-19),JLt[3252]=33,yU(JLt,3253,3258,-19),yU(JLt,3258,3262,33),yU(JLt,3262,3269,-87),JLt[3269]=33,yU(JLt,3270,3273,-87),JLt[3273]=33,yU(JLt,3274,3278,-87),yU(JLt,3278,3285,33),yU(JLt,3285,3287,-87),yU(JLt,3287,3294,33),JLt[3294]=-19,JLt[3295]=33,yU(JLt,3296,3298,-19),yU(JLt,3298,3302,33),yU(JLt,3302,3312,-87),yU(JLt,3312,3330,33),yU(JLt,3330,3332,-87),JLt[3332]=33,yU(JLt,3333,3341,-19),JLt[3341]=33,yU(JLt,3342,3345,-19),JLt[3345]=33,yU(JLt,3346,3369,-19),JLt[3369]=33,yU(JLt,3370,3386,-19),yU(JLt,3386,3390,33),yU(JLt,3390,3396,-87),yU(JLt,3396,3398,33),yU(JLt,3398,3401,-87),JLt[3401]=33,yU(JLt,3402,3406,-87),yU(JLt,3406,3415,33),JLt[3415]=-87,yU(JLt,3416,3424,33),yU(JLt,3424,3426,-19),yU(JLt,3426,3430,33),yU(JLt,3430,3440,-87),yU(JLt,3440,3585,33),yU(JLt,3585,3631,-19),JLt[3631]=33,JLt[3632]=-19,JLt[3633]=-87,yU(JLt,3634,3636,-19),yU(JLt,3636,3643,-87),yU(JLt,3643,3648,33),yU(JLt,3648,3654,-19),yU(JLt,3654,3663,-87),JLt[3663]=33,yU(JLt,3664,3674,-87),yU(JLt,3674,3713,33),yU(JLt,3713,3715,-19),JLt[3715]=33,JLt[3716]=-19,yU(JLt,3717,3719,33),yU(JLt,3719,3721,-19),JLt[3721]=33,JLt[3722]=-19,yU(JLt,3723,3725,33),JLt[3725]=-19,yU(JLt,3726,3732,33),yU(JLt,3732,3736,-19),JLt[3736]=33,yU(JLt,3737,3744,-19),JLt[3744]=33,yU(JLt,3745,3748,-19),JLt[3748]=33,JLt[3749]=-19,JLt[3750]=33,JLt[3751]=-19,yU(JLt,3752,3754,33),yU(JLt,3754,3756,-19),JLt[3756]=33,yU(JLt,3757,3759,-19),JLt[3759]=33,JLt[3760]=-19,JLt[3761]=-87,yU(JLt,3762,3764,-19),yU(JLt,3764,3770,-87),JLt[3770]=33,yU(JLt,3771,3773,-87),JLt[3773]=-19,yU(JLt,3774,3776,33),yU(JLt,3776,3781,-19),JLt[3781]=33,JLt[3782]=-87,JLt[3783]=33,yU(JLt,3784,3790,-87),yU(JLt,3790,3792,33),yU(JLt,3792,3802,-87),yU(JLt,3802,3864,33),yU(JLt,3864,3866,-87),yU(JLt,3866,3872,33),yU(JLt,3872,3882,-87),yU(JLt,3882,3893,33),JLt[3893]=-87,JLt[3894]=33,JLt[3895]=-87,JLt[3896]=33,JLt[3897]=-87,yU(JLt,3898,3902,33),yU(JLt,3902,3904,-87),yU(JLt,3904,3912,-19),JLt[3912]=33,yU(JLt,3913,3946,-19),yU(JLt,3946,3953,33),yU(JLt,3953,3973,-87),JLt[3973]=33,yU(JLt,3974,3980,-87),yU(JLt,3980,3984,33),yU(JLt,3984,3990,-87),JLt[3990]=33,JLt[3991]=-87,JLt[3992]=33,yU(JLt,3993,4014,-87),yU(JLt,4014,4017,33),yU(JLt,4017,4024,-87),JLt[4024]=33,JLt[4025]=-87,yU(JLt,4026,4256,33),yU(JLt,4256,4294,-19),yU(JLt,4294,4304,33),yU(JLt,4304,4343,-19),yU(JLt,4343,4352,33),JLt[4352]=-19,JLt[4353]=33,yU(JLt,4354,4356,-19),JLt[4356]=33,yU(JLt,4357,4360,-19),JLt[4360]=33,JLt[4361]=-19,JLt[4362]=33,yU(JLt,4363,4365,-19),JLt[4365]=33,yU(JLt,4366,4371,-19),yU(JLt,4371,4412,33),JLt[4412]=-19,JLt[4413]=33,JLt[4414]=-19,JLt[4415]=33,JLt[4416]=-19,yU(JLt,4417,4428,33),JLt[4428]=-19,JLt[4429]=33,JLt[4430]=-19,JLt[4431]=33,JLt[4432]=-19,yU(JLt,4433,4436,33),yU(JLt,4436,4438,-19),yU(JLt,4438,4441,33),JLt[4441]=-19,yU(JLt,4442,4447,33),yU(JLt,4447,4450,-19),JLt[4450]=33,JLt[4451]=-19,JLt[4452]=33,JLt[4453]=-19,JLt[4454]=33,JLt[4455]=-19,JLt[4456]=33,JLt[4457]=-19,yU(JLt,4458,4461,33),yU(JLt,4461,4463,-19),yU(JLt,4463,4466,33),yU(JLt,4466,4468,-19),JLt[4468]=33,JLt[4469]=-19,yU(JLt,4470,4510,33),JLt[4510]=-19,yU(JLt,4511,4520,33),JLt[4520]=-19,yU(JLt,4521,4523,33),JLt[4523]=-19,yU(JLt,4524,4526,33),yU(JLt,4526,4528,-19),yU(JLt,4528,4535,33),yU(JLt,4535,4537,-19),JLt[4537]=33,JLt[4538]=-19,JLt[4539]=33,yU(JLt,4540,4547,-19),yU(JLt,4547,4587,33),JLt[4587]=-19,yU(JLt,4588,4592,33),JLt[4592]=-19,yU(JLt,4593,4601,33),JLt[4601]=-19,yU(JLt,4602,7680,33),yU(JLt,7680,7836,-19),yU(JLt,7836,7840,33),yU(JLt,7840,7930,-19),yU(JLt,7930,7936,33),yU(JLt,7936,7958,-19),yU(JLt,7958,7960,33),yU(JLt,7960,7966,-19),yU(JLt,7966,7968,33),yU(JLt,7968,8006,-19),yU(JLt,8006,8008,33),yU(JLt,8008,8014,-19),yU(JLt,8014,8016,33),yU(JLt,8016,8024,-19),JLt[8024]=33,JLt[8025]=-19,JLt[8026]=33,JLt[8027]=-19,JLt[8028]=33,JLt[8029]=-19,JLt[8030]=33,yU(JLt,8031,8062,-19),yU(JLt,8062,8064,33),yU(JLt,8064,8117,-19),JLt[8117]=33,yU(JLt,8118,8125,-19),JLt[8125]=33,JLt[8126]=-19,yU(JLt,8127,8130,33),yU(JLt,8130,8133,-19),JLt[8133]=33,yU(JLt,8134,8141,-19),yU(JLt,8141,8144,33),yU(JLt,8144,8148,-19),yU(JLt,8148,8150,33),yU(JLt,8150,8156,-19),yU(JLt,8156,8160,33),yU(JLt,8160,8173,-19),yU(JLt,8173,8178,33),yU(JLt,8178,8181,-19),JLt[8181]=33,yU(JLt,8182,8189,-19),yU(JLt,8189,8400,33),yU(JLt,8400,8413,-87),yU(JLt,8413,8417,33),JLt[8417]=-87,yU(JLt,8418,8486,33),JLt[8486]=-19,yU(JLt,8487,8490,33),yU(JLt,8490,8492,-19),yU(JLt,8492,8494,33),JLt[8494]=-19,yU(JLt,8495,8576,33),yU(JLt,8576,8579,-19),yU(JLt,8579,12293,33),JLt[12293]=-87,JLt[12294]=33,JLt[12295]=-19,yU(JLt,12296,12321,33),yU(JLt,12321,12330,-19),yU(JLt,12330,12336,-87),JLt[12336]=33,yU(JLt,12337,12342,-87),yU(JLt,12342,12353,33),yU(JLt,12353,12437,-19),yU(JLt,12437,12441,33),yU(JLt,12441,12443,-87),yU(JLt,12443,12445,33),yU(JLt,12445,12447,-87),yU(JLt,12447,12449,33),yU(JLt,12449,12539,-19),JLt[12539]=33,yU(JLt,12540,12543,-87),yU(JLt,12543,12549,33),yU(JLt,12549,12589,-19),yU(JLt,12589,19968,33),yU(JLt,19968,40870,-19),yU(JLt,40870,44032,33),yU(JLt,44032,55204,-19),yU(JLt,55204,HQn,33),yU(JLt,57344,65534,33)}function TWn(n){var t,e,i,r,c,a,u;n.hb||(n.hb=!0,Nrn(n,"ecore"),xrn(n,"ecore"),Drn(n,V9n),cun(n.fb,"E"),cun(n.L,"T"),cun(n.P,"K"),cun(n.P,"V"),cun(n.cb,"E"),f9(kY(n.b),n.bb),f9(kY(n.a),n.Q),f9(kY(n.o),n.p),f9(kY(n.p),n.R),f9(kY(n.q),n.p),f9(kY(n.v),n.q),f9(kY(n.w),n.R),f9(kY(n.B),n.Q),f9(kY(n.R),n.Q),f9(kY(n.T),n.eb),f9(kY(n.U),n.R),f9(kY(n.V),n.eb),f9(kY(n.W),n.bb),f9(kY(n.bb),n.eb),f9(kY(n.eb),n.R),f9(kY(n.db),n.R),z0(n.b,BAt,l9n,!1,!1,!0),ucn(BB(Wtn(QQ(n.b),0),34),n.e,"iD",null,0,1,BAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.b),1),18),n.q,null,"eAttributeType",1,1,BAt,!0,!0,!1,!1,!0,!1,!0),z0(n.a,KAt,s9n,!1,!1,!0),ucn(BB(Wtn(QQ(n.a),0),34),n._,T6n,null,0,1,KAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.a),1),18),n.ab,null,"details",0,-1,KAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.a),2),18),n.Q,BB(Wtn(QQ(n.Q),0),18),"eModelElement",0,1,KAt,!0,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.a),3),18),n.S,null,"contents",0,-1,KAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.a),4),18),n.S,null,"references",0,-1,KAt,!1,!1,!0,!1,!0,!1,!1),z0(n.o,qAt,"EClass",!1,!1,!0),ucn(BB(Wtn(QQ(n.o),0),34),n.e,"abstract",null,0,1,qAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.o),1),34),n.e,"interface",null,0,1,qAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.o),2),18),n.o,null,"eSuperTypes",0,-1,qAt,!1,!1,!0,!1,!0,!0,!1),Myn(BB(Wtn(QQ(n.o),3),18),n.T,BB(Wtn(QQ(n.T),0),18),"eOperations",0,-1,qAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.o),4),18),n.b,null,"eAllAttributes",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),5),18),n.W,null,"eAllReferences",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),6),18),n.W,null,"eReferences",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),7),18),n.b,null,"eAttributes",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),8),18),n.W,null,"eAllContainments",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),9),18),n.T,null,"eAllOperations",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),10),18),n.bb,null,"eAllStructuralFeatures",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),11),18),n.o,null,"eAllSuperTypes",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.o),12),18),n.b,null,"eIDAttribute",0,1,qAt,!0,!0,!1,!1,!1,!1,!0),Myn(BB(Wtn(QQ(n.o),13),18),n.bb,BB(Wtn(QQ(n.bb),7),18),"eStructuralFeatures",0,-1,qAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.o),14),18),n.H,null,"eGenericSuperTypes",0,-1,qAt,!1,!1,!0,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.o),15),18),n.H,null,"eAllGenericSuperTypes",0,-1,qAt,!0,!0,!1,!1,!0,!1,!0),$yn(u=fin(BB(Wtn(VQ(n.o),0),59),n.e,"isSuperTypeOf"),n.o,"someClass"),fin(BB(Wtn(VQ(n.o),1),59),n.I,"getFeatureCount"),$yn(u=fin(BB(Wtn(VQ(n.o),2),59),n.bb,Z9n),n.I,"featureID"),$yn(u=fin(BB(Wtn(VQ(n.o),3),59),n.I,n7n),n.bb,t7n),$yn(u=fin(BB(Wtn(VQ(n.o),4),59),n.bb,Z9n),n._,"featureName"),fin(BB(Wtn(VQ(n.o),5),59),n.I,"getOperationCount"),$yn(u=fin(BB(Wtn(VQ(n.o),6),59),n.T,"getEOperation"),n.I,"operationID"),$yn(u=fin(BB(Wtn(VQ(n.o),7),59),n.I,e7n),n.T,i7n),$yn(u=fin(BB(Wtn(VQ(n.o),8),59),n.T,"getOverride"),n.T,i7n),$yn(u=fin(BB(Wtn(VQ(n.o),9),59),n.H,"getFeatureType"),n.bb,t7n),z0(n.p,HAt,b9n,!0,!1,!0),ucn(BB(Wtn(QQ(n.p),0),34),n._,"instanceClassName",null,0,1,HAt,!1,!0,!0,!0,!0,!1),t=ZV(n.L),e=s2(),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),_On(BB(Wtn(QQ(n.p),1),34),t,"instanceClass",HAt,!0,!0,!1,!0),ucn(BB(Wtn(QQ(n.p),2),34),n.M,r7n,null,0,1,HAt,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.p),3),34),n._,"instanceTypeName",null,0,1,HAt,!1,!0,!0,!0,!0,!1),Myn(BB(Wtn(QQ(n.p),4),18),n.U,BB(Wtn(QQ(n.U),3),18),"ePackage",0,1,HAt,!0,!1,!1,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.p),5),18),n.db,null,c7n,0,-1,HAt,!1,!1,!0,!0,!0,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.p),0),59),n.e,a7n),n.M,AWn),fin(BB(Wtn(VQ(n.p),1),59),n.I,"getClassifierID"),z0(n.q,GAt,"EDataType",!1,!1,!0),ucn(BB(Wtn(QQ(n.q),0),34),n.e,"serializable",a5n,0,1,GAt,!1,!1,!0,!1,!0,!1),z0(n.v,XAt,"EEnum",!1,!1,!0),Myn(BB(Wtn(QQ(n.v),0),18),n.w,BB(Wtn(QQ(n.w),3),18),"eLiterals",0,-1,XAt,!1,!1,!0,!0,!1,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.v),0),59),n.w,u7n),n._,t8n),$yn(u=fin(BB(Wtn(VQ(n.v),1),59),n.w,u7n),n.I,E6n),$yn(u=fin(BB(Wtn(VQ(n.v),2),59),n.w,"getEEnumLiteralByLiteral"),n._,"literal"),z0(n.w,WAt,w9n,!1,!1,!0),ucn(BB(Wtn(QQ(n.w),0),34),n.I,E6n,null,0,1,WAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.w),1),34),n.A,"instance",null,0,1,WAt,!0,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.w),2),34),n._,"literal",null,0,1,WAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.w),3),18),n.v,BB(Wtn(QQ(n.v),0),18),"eEnum",0,1,WAt,!0,!1,!1,!1,!1,!1,!1),z0(n.B,HOt,"EFactory",!1,!1,!0),Myn(BB(Wtn(QQ(n.B),0),18),n.U,BB(Wtn(QQ(n.U),2),18),"ePackage",1,1,HOt,!0,!1,!0,!1,!1,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.B),0),59),n.S,"create"),n.o,"eClass"),$yn(u=fin(BB(Wtn(VQ(n.B),1),59),n.M,"createFromString"),n.q,"eDataType"),$yn(u,n._,"literalValue"),$yn(u=fin(BB(Wtn(VQ(n.B),2),59),n._,"convertToString"),n.q,"eDataType"),$yn(u,n.M,"instanceValue"),z0(n.Q,BOt,Y5n,!0,!1,!0),Myn(BB(Wtn(QQ(n.Q),0),18),n.a,BB(Wtn(QQ(n.a),2),18),"eAnnotations",0,-1,BOt,!1,!1,!0,!0,!1,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.Q),0),59),n.a,"getEAnnotation"),n._,T6n),z0(n.R,qOt,J5n,!0,!1,!0),ucn(BB(Wtn(QQ(n.R),0),34),n._,t8n,null,0,1,qOt,!1,!1,!0,!1,!0,!1),z0(n.S,LOt,"EObject",!1,!1,!0),fin(BB(Wtn(VQ(n.S),0),59),n.o,"eClass"),fin(BB(Wtn(VQ(n.S),1),59),n.e,"eIsProxy"),fin(BB(Wtn(VQ(n.S),2),59),n.X,"eResource"),fin(BB(Wtn(VQ(n.S),3),59),n.S,"eContainer"),fin(BB(Wtn(VQ(n.S),4),59),n.bb,"eContainingFeature"),fin(BB(Wtn(VQ(n.S),5),59),n.W,"eContainmentFeature"),u=fin(BB(Wtn(VQ(n.S),6),59),null,"eContents"),t=ZV(n.fb),e=ZV(n.S),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(r=HTn(u,t,null))&&r.Fi(),u=fin(BB(Wtn(VQ(n.S),7),59),null,"eAllContents"),t=ZV(n.cb),e=ZV(n.S),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(c=HTn(u,t,null))&&c.Fi(),u=fin(BB(Wtn(VQ(n.S),8),59),null,"eCrossReferences"),t=ZV(n.fb),e=ZV(n.S),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(a=HTn(u,t,null))&&a.Fi(),$yn(u=fin(BB(Wtn(VQ(n.S),9),59),n.M,"eGet"),n.bb,t7n),$yn(u=fin(BB(Wtn(VQ(n.S),10),59),n.M,"eGet"),n.bb,t7n),$yn(u,n.e,"resolve"),$yn(u=fin(BB(Wtn(VQ(n.S),11),59),null,"eSet"),n.bb,t7n),$yn(u,n.M,"newValue"),$yn(u=fin(BB(Wtn(VQ(n.S),12),59),n.e,"eIsSet"),n.bb,t7n),$yn(u=fin(BB(Wtn(VQ(n.S),13),59),null,"eUnset"),n.bb,t7n),$yn(u=fin(BB(Wtn(VQ(n.S),14),59),n.M,"eInvoke"),n.T,i7n),t=ZV(n.fb),e=s2(),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),Ujn(u,t,"arguments"),_W(u,n.K),z0(n.T,QAt,g9n,!1,!1,!0),Myn(BB(Wtn(QQ(n.T),0),18),n.o,BB(Wtn(QQ(n.o),3),18),o7n,0,1,QAt,!0,!1,!1,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.T),1),18),n.db,null,c7n,0,-1,QAt,!1,!1,!0,!0,!0,!1,!1),Myn(BB(Wtn(QQ(n.T),2),18),n.V,BB(Wtn(QQ(n.V),0),18),"eParameters",0,-1,QAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.T),3),18),n.p,null,"eExceptions",0,-1,QAt,!1,!1,!0,!1,!0,!0,!1),Myn(BB(Wtn(QQ(n.T),4),18),n.H,null,"eGenericExceptions",0,-1,QAt,!1,!1,!0,!0,!1,!0,!1),fin(BB(Wtn(VQ(n.T),0),59),n.I,e7n),$yn(u=fin(BB(Wtn(VQ(n.T),1),59),n.e,"isOverrideOf"),n.T,"someOperation"),z0(n.U,GOt,"EPackage",!1,!1,!0),ucn(BB(Wtn(QQ(n.U),0),34),n._,"nsURI",null,0,1,GOt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.U),1),34),n._,"nsPrefix",null,0,1,GOt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.U),2),18),n.B,BB(Wtn(QQ(n.B),0),18),"eFactoryInstance",1,1,GOt,!0,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.U),3),18),n.p,BB(Wtn(QQ(n.p),4),18),"eClassifiers",0,-1,GOt,!1,!1,!0,!0,!0,!1,!1),Myn(BB(Wtn(QQ(n.U),4),18),n.U,BB(Wtn(QQ(n.U),5),18),"eSubpackages",0,-1,GOt,!1,!1,!0,!0,!0,!1,!1),Myn(BB(Wtn(QQ(n.U),5),18),n.U,BB(Wtn(QQ(n.U),4),18),"eSuperPackage",0,1,GOt,!0,!1,!1,!1,!0,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.U),0),59),n.p,"getEClassifier"),n._,t8n),z0(n.V,YAt,p9n,!1,!1,!0),Myn(BB(Wtn(QQ(n.V),0),18),n.T,BB(Wtn(QQ(n.T),2),18),"eOperation",0,1,YAt,!0,!1,!1,!1,!1,!1,!1),z0(n.W,JAt,v9n,!1,!1,!0),ucn(BB(Wtn(QQ(n.W),0),34),n.e,"containment",null,0,1,JAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.W),1),34),n.e,"container",null,0,1,JAt,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.W),2),34),n.e,"resolveProxies",a5n,0,1,JAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.W),3),18),n.W,null,"eOpposite",0,1,JAt,!1,!1,!0,!1,!0,!1,!1),Myn(BB(Wtn(QQ(n.W),4),18),n.o,null,"eReferenceType",1,1,JAt,!0,!0,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.W),5),18),n.b,null,"eKeys",0,-1,JAt,!1,!1,!0,!1,!0,!1,!1),z0(n.bb,FAt,f9n,!0,!1,!0),ucn(BB(Wtn(QQ(n.bb),0),34),n.e,"changeable",a5n,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),1),34),n.e,"volatile",null,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),2),34),n.e,"transient",null,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),3),34),n._,"defaultValueLiteral",null,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),4),34),n.M,r7n,null,0,1,FAt,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.bb),5),34),n.e,"unsettable",null,0,1,FAt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.bb),6),34),n.e,"derived",null,0,1,FAt,!1,!1,!0,!1,!0,!1),Myn(BB(Wtn(QQ(n.bb),7),18),n.o,BB(Wtn(QQ(n.o),13),18),o7n,0,1,FAt,!0,!1,!1,!1,!1,!1,!1),fin(BB(Wtn(VQ(n.bb),0),59),n.I,n7n),u=fin(BB(Wtn(VQ(n.bb),1),59),null,"getContainerClass"),t=ZV(n.L),e=s2(),f9((!t.d&&(t.d=new $L(VAt,t,1)),t.d),e),(i=HTn(u,t,null))&&i.Fi(),z0(n.eb,_At,h9n,!0,!1,!0),ucn(BB(Wtn(QQ(n.eb),0),34),n.e,"ordered",a5n,0,1,_At,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.eb),1),34),n.e,"unique",a5n,0,1,_At,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.eb),2),34),n.I,"lowerBound",null,0,1,_At,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.eb),3),34),n.I,"upperBound","1",0,1,_At,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.eb),4),34),n.e,"many",null,0,1,_At,!0,!0,!1,!1,!0,!0),ucn(BB(Wtn(QQ(n.eb),5),34),n.e,"required",null,0,1,_At,!0,!0,!1,!1,!0,!0),Myn(BB(Wtn(QQ(n.eb),6),18),n.p,null,"eType",0,1,_At,!1,!0,!0,!1,!0,!0,!1),Myn(BB(Wtn(QQ(n.eb),7),18),n.H,null,"eGenericType",0,1,_At,!1,!0,!0,!0,!1,!0,!1),z0(n.ab,Hnt,"EStringToStringMapEntry",!1,!1,!1),ucn(BB(Wtn(QQ(n.ab),0),34),n._,"key",null,0,1,Hnt,!1,!1,!0,!1,!0,!1),ucn(BB(Wtn(QQ(n.ab),1),34),n._,E6n,null,0,1,Hnt,!1,!1,!0,!1,!0,!1),z0(n.H,VAt,d9n,!1,!1,!0),Myn(BB(Wtn(QQ(n.H),0),18),n.H,null,"eUpperBound",0,1,VAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.H),1),18),n.H,null,"eTypeArguments",0,-1,VAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.H),2),18),n.p,null,"eRawType",1,1,VAt,!0,!1,!1,!1,!0,!1,!0),Myn(BB(Wtn(QQ(n.H),3),18),n.H,null,"eLowerBound",0,1,VAt,!1,!1,!0,!0,!1,!1,!1),Myn(BB(Wtn(QQ(n.H),4),18),n.db,null,"eTypeParameter",0,1,VAt,!1,!1,!0,!1,!1,!1,!1),Myn(BB(Wtn(QQ(n.H),5),18),n.p,null,"eClassifier",0,1,VAt,!1,!1,!0,!1,!0,!1,!1),$yn(u=fin(BB(Wtn(VQ(n.H),0),59),n.e,a7n),n.M,AWn),z0(n.db,O$t,m9n,!1,!1,!0),Myn(BB(Wtn(QQ(n.db),0),18),n.H,null,"eBounds",0,-1,O$t,!1,!1,!0,!0,!1,!1,!1),dV(n.c,iet,"EBigDecimal",!0),dV(n.d,oet,"EBigInteger",!0),dV(n.e,$Nt,"EBoolean",!0),dV(n.f,ktt,"EBooleanObject",!0),dV(n.i,NNt,"EByte",!0),dV(n.g,Gk(NNt,1),"EByteArray",!0),dV(n.j,Ttt,"EByteObject",!0),dV(n.k,ONt,"EChar",!0),dV(n.n,Stt,"ECharacterObject",!0),dV(n.r,mtt,"EDate",!0),dV(n.s,_Nt,"EDiagnosticChain",!1),dV(n.t,xNt,"EDouble",!0),dV(n.u,Ptt,"EDoubleObject",!0),dV(n.fb,uAt,"EEList",!1),dV(n.A,yAt,"EEnumerator",!1),dV(n.C,oLt,"EFeatureMap",!1),dV(n.D,$$t,"EFeatureMapEntry",!1),dV(n.F,DNt,"EFloat",!0),dV(n.G,Ctt,"EFloatObject",!0),dV(n.I,ANt,"EInt",!0),dV(n.J,Att,"EIntegerObject",!0),dV(n.L,$nt,"EJavaClass",!0),dV(n.M,Ant,"EJavaObject",!0),dV(n.N,LNt,"ELong",!0),dV(n.O,Rtt,"ELongObject",!0),dV(n.P,Nnt,"EMap",!1),dV(n.X,iLt,"EResource",!1),dV(n.Y,FNt,"EResourceSet",!1),dV(n.Z,RNt,"EShort",!0),dV(n.$,_tt,"EShortObject",!0),dV(n._,Qtt,"EString",!0),dV(n.cb,sAt,"ETreeIterator",!1),dV(n.K,BNt,"EInvocationTargetException",!1),Lhn(n,V9n))}"undefined"!=typeof window?e=window:void 0!==n?e=n:"undefined"!=typeof self&&(e=self);var MWn,SWn,PWn,CWn,IWn,OWn,AWn="object",$Wn="boolean",LWn="number",NWn="string",xWn="function",DWn=2147483647,RWn="java.lang",KWn={3:1},_Wn="com.google.common.base",FWn=", ",BWn="%s (%s) must not be negative",HWn={3:1,4:1,5:1},qWn="negative size: ",GWn="Optional.of(",zWn="null",UWn={198:1,47:1},XWn="com.google.common.collect",WWn={198:1,47:1,125:1},VWn={224:1,3:1},QWn={47:1},YWn="java.util",JWn={83:1},ZWn={20:1,28:1,14:1},nVn=1965,tVn={20:1,28:1,14:1,21:1},eVn={83:1,171:1,161:1},iVn={20:1,28:1,14:1,21:1,84:1},rVn={20:1,28:1,14:1,271:1,21:1,84:1},cVn={47:1,125:1},aVn={345:1,42:1},uVn="AbstractMapEntry",oVn="expectedValuesPerKey",sVn={3:1,6:1,4:1,5:1},hVn=16384,fVn={164:1},lVn={38:1},bVn={l:4194303,m:4194303,h:524287},wVn={196:1},dVn={245:1,3:1,35:1},gVn="range unbounded on this side",pVn={20:1},vVn={20:1,14:1},mVn={3:1,20:1,28:1,14:1},yVn={152:1,3:1,20:1,28:1,14:1,15:1,54:1},kVn={3:1,4:1,5:1,165:1},jVn={3:1,83:1},EVn={20:1,14:1,21:1},TVn={3:1,20:1,28:1,14:1,21:1},MVn={20:1,14:1,21:1,84:1},SVn=461845907,PVn=-862048943,CVn={3:1,6:1,4:1,5:1,165:1},IVn="expectedSize",OVn=1073741824,AVn="initialArraySize",$Vn={3:1,6:1,4:1,9:1,5:1},LVn={20:1,28:1,52:1,14:1,15:1},NVn="arraySize",xVn={20:1,28:1,52:1,14:1,15:1,54:1},DVn={45:1},RVn={365:1},KVn=1e-4,_Vn=-2147483648,FVn="__noinit__",BVn={3:1,102:1,60:1,78:1},HVn="com.google.gwt.core.client.impl",qVn="String",GVn="com.google.gwt.core.client",zVn="anonymous",UVn="fnStack",XVn="Unknown",WVn={195:1,3:1,4:1},VVn=1e3,QVn=65535,YVn="January",JVn="February",ZVn="March",nQn="April",tQn="May",eQn="June",iQn="July",rQn="August",cQn="September",aQn="October",uQn="November",oQn="December",sQn=1900,hQn={48:1,3:1,4:1},fQn="Before Christ",lQn="Anno Domini",bQn="Sunday",wQn="Monday",dQn="Tuesday",gQn="Wednesday",pQn="Thursday",vQn="Friday",mQn="Saturday",yQn="com.google.gwt.i18n.shared",kQn="DateTimeFormat",jQn="com.google.gwt.i18n.client",EQn="DefaultDateTimeFormatInfo",TQn={3:1,4:1,35:1,199:1},MQn="com.google.gwt.json.client",SQn=4194303,PQn=1048575,CQn=524288,IQn=4194304,OQn=17592186044416,AQn=1e9,$Qn=-17592186044416,LQn="java.io",NQn={3:1,102:1,73:1,60:1,78:1},xQn={3:1,289:1,78:1},DQn='For input string: "',RQn=1/0,KQn=-1/0,_Qn=4096,FQn={3:1,4:1,364:1},BQn=65536,HQn=55296,qQn={104:1,3:1,4:1},GQn=1e5,zQn=.3010299956639812,UQn=4294967295,XQn=4294967296,WQn="0.0",VQn={42:1},QQn={3:1,4:1,20:1,28:1,52:1,12:1,14:1,15:1,54:1},YQn={3:1,20:1,28:1,52:1,14:1,15:1,54:1},JQn={20:1,14:1,15:1},ZQn={3:1,62:1},nYn={182:1},tYn={3:1,4:1,83:1},eYn={3:1,4:1,20:1,28:1,14:1,53:1,21:1},iYn="delete",rYn=1.4901161193847656e-8,cYn=11102230246251565e-32,aYn=15525485,uYn=5.960464477539063e-8,oYn=16777216,sYn=16777215,hYn=", length: ",fYn={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1},lYn={3:1,35:1,22:1,297:1},bYn="java.util.function",wYn="java.util.logging",dYn={3:1,4:1,5:1,842:1},gYn="undefined",pYn="java.util.stream",vYn={525:1,670:1},mYn="fromIndex: ",yYn=" > toIndex: ",kYn=", toIndex: ",jYn="Index: ",EYn=", Size: ",TYn="org.eclipse.elk.alg.common",MYn={62:1},SYn="org.eclipse.elk.alg.common.compaction",PYn="Scanline/EventHandler",CYn="org.eclipse.elk.alg.common.compaction.oned",IYn="CNode belongs to another CGroup.",OYn="ISpacingsHandler/1",AYn="The ",$Yn=" instance has been finished already.",LYn="The direction ",NYn=" is not supported by the CGraph instance.",xYn="OneDimensionalCompactor",DYn="OneDimensionalCompactor/lambda$0$Type",RYn="Quadruplet",KYn="ScanlineConstraintCalculator",_Yn="ScanlineConstraintCalculator/ConstraintsScanlineHandler",FYn="ScanlineConstraintCalculator/ConstraintsScanlineHandler/lambda$0$Type",BYn="ScanlineConstraintCalculator/Timestamp",HYn="ScanlineConstraintCalculator/lambda$0$Type",qYn={169:1,45:1},GYn="org.eclipse.elk.alg.common.compaction.options",zYn="org.eclipse.elk.core.data",UYn="org.eclipse.elk.polyomino.traversalStrategy",XYn="org.eclipse.elk.polyomino.lowLevelSort",WYn="org.eclipse.elk.polyomino.highLevelSort",VYn="org.eclipse.elk.polyomino.fill",QYn={130:1},YYn="polyomino",JYn="org.eclipse.elk.alg.common.networksimplex",ZYn={177:1,3:1,4:1},nJn="org.eclipse.elk.alg.common.nodespacing",tJn="org.eclipse.elk.alg.common.nodespacing.cellsystem",eJn="CENTER",iJn={212:1,326:1},rJn={3:1,4:1,5:1,595:1},cJn="LEFT",aJn="RIGHT",uJn="Vertical alignment cannot be null",oJn="BOTTOM",sJn="org.eclipse.elk.alg.common.nodespacing.internal",hJn="UNDEFINED",fJn=.01,lJn="org.eclipse.elk.alg.common.nodespacing.internal.algorithm",bJn="LabelPlacer/lambda$0$Type",wJn="LabelPlacer/lambda$1$Type",dJn="portRatioOrPosition",gJn="org.eclipse.elk.alg.common.overlaps",pJn="DOWN",vJn="org.eclipse.elk.alg.common.polyomino",mJn="NORTH",yJn="EAST",kJn="SOUTH",jJn="WEST",EJn="org.eclipse.elk.alg.common.polyomino.structures",TJn="Direction",MJn="Grid is only of size ",SJn=". Requested point (",PJn=") is out of bounds.",CJn=" Given center based coordinates were (",IJn="org.eclipse.elk.graph.properties",OJn="IPropertyHolder",AJn={3:1,94:1,134:1},$Jn="org.eclipse.elk.alg.common.spore",LJn="org.eclipse.elk.alg.common.utils",NJn={209:1},xJn="org.eclipse.elk.core",DJn="Connected Components Compaction",RJn="org.eclipse.elk.alg.disco",KJn="org.eclipse.elk.alg.disco.graph",_Jn="org.eclipse.elk.alg.disco.options",FJn="CompactionStrategy",BJn="org.eclipse.elk.disco.componentCompaction.strategy",HJn="org.eclipse.elk.disco.componentCompaction.componentLayoutAlgorithm",qJn="org.eclipse.elk.disco.debug.discoGraph",GJn="org.eclipse.elk.disco.debug.discoPolys",zJn="componentCompaction",UJn="org.eclipse.elk.disco",XJn="org.eclipse.elk.spacing.componentComponent",WJn="org.eclipse.elk.edge.thickness",VJn="org.eclipse.elk.aspectRatio",QJn="org.eclipse.elk.padding",YJn="org.eclipse.elk.alg.disco.transform",JJn=1.5707963267948966,ZJn=17976931348623157e292,nZn={3:1,4:1,5:1,192:1},tZn={3:1,6:1,4:1,5:1,106:1,120:1},eZn="org.eclipse.elk.alg.force",iZn="ComponentsProcessor",rZn="ComponentsProcessor/1",cZn="org.eclipse.elk.alg.force.graph",aZn="Component Layout",uZn="org.eclipse.elk.alg.force.model",oZn="org.eclipse.elk.force.model",sZn="org.eclipse.elk.force.iterations",hZn="org.eclipse.elk.force.repulsivePower",fZn="org.eclipse.elk.force.temperature",lZn=.001,bZn="org.eclipse.elk.force.repulsion",wZn="org.eclipse.elk.alg.force.options",dZn=1.600000023841858,gZn="org.eclipse.elk.force",pZn="org.eclipse.elk.priority",vZn="org.eclipse.elk.spacing.nodeNode",mZn="org.eclipse.elk.spacing.edgeLabel",yZn="org.eclipse.elk.randomSeed",kZn="org.eclipse.elk.separateConnectedComponents",jZn="org.eclipse.elk.interactive",EZn="org.eclipse.elk.portConstraints",TZn="org.eclipse.elk.edgeLabels.inline",MZn="org.eclipse.elk.omitNodeMicroLayout",SZn="org.eclipse.elk.nodeSize.options",PZn="org.eclipse.elk.nodeSize.constraints",CZn="org.eclipse.elk.nodeLabels.placement",IZn="org.eclipse.elk.portLabels.placement",OZn="origin",AZn="random",$Zn="boundingBox.upLeft",LZn="boundingBox.lowRight",NZn="org.eclipse.elk.stress.fixed",xZn="org.eclipse.elk.stress.desiredEdgeLength",DZn="org.eclipse.elk.stress.dimension",RZn="org.eclipse.elk.stress.epsilon",KZn="org.eclipse.elk.stress.iterationLimit",_Zn="org.eclipse.elk.stress",FZn="ELK Stress",BZn="org.eclipse.elk.nodeSize.minimum",HZn="org.eclipse.elk.alg.force.stress",qZn="Layered layout",GZn="org.eclipse.elk.alg.layered",zZn="org.eclipse.elk.alg.layered.compaction.components",UZn="org.eclipse.elk.alg.layered.compaction.oned",XZn="org.eclipse.elk.alg.layered.compaction.oned.algs",WZn="org.eclipse.elk.alg.layered.compaction.recthull",VZn="org.eclipse.elk.alg.layered.components",QZn="NONE",YZn={3:1,6:1,4:1,9:1,5:1,122:1},JZn={3:1,6:1,4:1,5:1,141:1,106:1,120:1},ZZn="org.eclipse.elk.alg.layered.compound",n1n={51:1},t1n="org.eclipse.elk.alg.layered.graph",e1n=" -> ",i1n="Not supported by LGraph",r1n="Port side is undefined",c1n={3:1,6:1,4:1,5:1,474:1,141:1,106:1,120:1},a1n={3:1,6:1,4:1,5:1,141:1,193:1,203:1,106:1,120:1},u1n={3:1,6:1,4:1,5:1,141:1,1943:1,203:1,106:1,120:1},o1n="([{\"' \t\r\n",s1n=")]}\"' \t\r\n",h1n="The given string contains parts that cannot be parsed as numbers.",f1n="org.eclipse.elk.core.math",l1n={3:1,4:1,142:1,207:1,414:1},b1n={3:1,4:1,116:1,207:1,414:1},w1n="org.eclipse.elk.layered",d1n="org.eclipse.elk.alg.layered.graph.transform",g1n="ElkGraphImporter",p1n="ElkGraphImporter/lambda$0$Type",v1n="ElkGraphImporter/lambda$1$Type",m1n="ElkGraphImporter/lambda$2$Type",y1n="ElkGraphImporter/lambda$4$Type",k1n="Node margin calculation",j1n="org.eclipse.elk.alg.layered.intermediate",E1n="ONE_SIDED_GREEDY_SWITCH",T1n="TWO_SIDED_GREEDY_SWITCH",M1n="No implementation is available for the layout processor ",S1n="IntermediateProcessorStrategy",P1n="Node '",C1n="FIRST_SEPARATE",I1n="LAST_SEPARATE",O1n="Odd port side processing",A1n="org.eclipse.elk.alg.layered.intermediate.compaction",$1n="org.eclipse.elk.alg.layered.intermediate.greedyswitch",L1n="org.eclipse.elk.alg.layered.p3order.counting",N1n={225:1},x1n="org.eclipse.elk.alg.layered.intermediate.loops",D1n="org.eclipse.elk.alg.layered.intermediate.loops.ordering",R1n="org.eclipse.elk.alg.layered.intermediate.loops.routing",K1n="org.eclipse.elk.alg.layered.intermediate.preserveorder",_1n="org.eclipse.elk.alg.layered.intermediate.wrapping",F1n="org.eclipse.elk.alg.layered.options",B1n="INTERACTIVE",H1n="DEPTH_FIRST",q1n="EDGE_LENGTH",G1n="SELF_LOOPS",z1n="firstTryWithInitialOrder",U1n="org.eclipse.elk.layered.directionCongruency",X1n="org.eclipse.elk.layered.feedbackEdges",W1n="org.eclipse.elk.layered.interactiveReferencePoint",V1n="org.eclipse.elk.layered.mergeEdges",Q1n="org.eclipse.elk.layered.mergeHierarchyEdges",Y1n="org.eclipse.elk.layered.allowNonFlowPortsToSwitchSides",J1n="org.eclipse.elk.layered.portSortingStrategy",Z1n="org.eclipse.elk.layered.thoroughness",n0n="org.eclipse.elk.layered.unnecessaryBendpoints",t0n="org.eclipse.elk.layered.generatePositionAndLayerIds",e0n="org.eclipse.elk.layered.cycleBreaking.strategy",i0n="org.eclipse.elk.layered.layering.strategy",r0n="org.eclipse.elk.layered.layering.layerConstraint",c0n="org.eclipse.elk.layered.layering.layerChoiceConstraint",a0n="org.eclipse.elk.layered.layering.layerId",u0n="org.eclipse.elk.layered.layering.minWidth.upperBoundOnWidth",o0n="org.eclipse.elk.layered.layering.minWidth.upperLayerEstimationScalingFactor",s0n="org.eclipse.elk.layered.layering.nodePromotion.strategy",h0n="org.eclipse.elk.layered.layering.nodePromotion.maxIterations",f0n="org.eclipse.elk.layered.layering.coffmanGraham.layerBound",l0n="org.eclipse.elk.layered.crossingMinimization.strategy",b0n="org.eclipse.elk.layered.crossingMinimization.forceNodeModelOrder",w0n="org.eclipse.elk.layered.crossingMinimization.hierarchicalSweepiness",d0n="org.eclipse.elk.layered.crossingMinimization.semiInteractive",g0n="org.eclipse.elk.layered.crossingMinimization.positionChoiceConstraint",p0n="org.eclipse.elk.layered.crossingMinimization.positionId",v0n="org.eclipse.elk.layered.crossingMinimization.greedySwitch.activationThreshold",m0n="org.eclipse.elk.layered.crossingMinimization.greedySwitch.type",y0n="org.eclipse.elk.layered.crossingMinimization.greedySwitchHierarchical.type",k0n="org.eclipse.elk.layered.nodePlacement.strategy",j0n="org.eclipse.elk.layered.nodePlacement.favorStraightEdges",E0n="org.eclipse.elk.layered.nodePlacement.bk.edgeStraightening",T0n="org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment",M0n="org.eclipse.elk.layered.nodePlacement.linearSegments.deflectionDampening",S0n="org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility",P0n="org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.default",C0n="org.eclipse.elk.layered.edgeRouting.selfLoopDistribution",I0n="org.eclipse.elk.layered.edgeRouting.selfLoopOrdering",O0n="org.eclipse.elk.layered.edgeRouting.splines.mode",A0n="org.eclipse.elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor",$0n="org.eclipse.elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth",L0n="org.eclipse.elk.layered.spacing.baseValue",N0n="org.eclipse.elk.layered.spacing.edgeNodeBetweenLayers",x0n="org.eclipse.elk.layered.spacing.edgeEdgeBetweenLayers",D0n="org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers",R0n="org.eclipse.elk.layered.priority.direction",K0n="org.eclipse.elk.layered.priority.shortness",_0n="org.eclipse.elk.layered.priority.straightness",F0n="org.eclipse.elk.layered.compaction.connectedComponents",B0n="org.eclipse.elk.layered.compaction.postCompaction.strategy",H0n="org.eclipse.elk.layered.compaction.postCompaction.constraints",q0n="org.eclipse.elk.layered.highDegreeNodes.treatment",G0n="org.eclipse.elk.layered.highDegreeNodes.threshold",z0n="org.eclipse.elk.layered.highDegreeNodes.treeHeight",U0n="org.eclipse.elk.layered.wrapping.strategy",X0n="org.eclipse.elk.layered.wrapping.additionalEdgeSpacing",W0n="org.eclipse.elk.layered.wrapping.correctionFactor",V0n="org.eclipse.elk.layered.wrapping.cutting.strategy",Q0n="org.eclipse.elk.layered.wrapping.cutting.cuts",Y0n="org.eclipse.elk.layered.wrapping.cutting.msd.freedom",J0n="org.eclipse.elk.layered.wrapping.validify.strategy",Z0n="org.eclipse.elk.layered.wrapping.validify.forbiddenIndices",n2n="org.eclipse.elk.layered.wrapping.multiEdge.improveCuts",t2n="org.eclipse.elk.layered.wrapping.multiEdge.distancePenalty",e2n="org.eclipse.elk.layered.wrapping.multiEdge.improveWrappedEdges",i2n="org.eclipse.elk.layered.edgeLabels.sideSelection",r2n="org.eclipse.elk.layered.edgeLabels.centerLabelPlacementStrategy",c2n="org.eclipse.elk.layered.considerModelOrder.strategy",a2n="org.eclipse.elk.layered.considerModelOrder.noModelOrder",u2n="org.eclipse.elk.layered.considerModelOrder.components",o2n="org.eclipse.elk.layered.considerModelOrder.longEdgeStrategy",s2n="org.eclipse.elk.layered.considerModelOrder.crossingCounterNodeInfluence",h2n="org.eclipse.elk.layered.considerModelOrder.crossingCounterPortInfluence",f2n="layering",l2n="layering.minWidth",b2n="layering.nodePromotion",w2n="crossingMinimization",d2n="org.eclipse.elk.hierarchyHandling",g2n="crossingMinimization.greedySwitch",p2n="nodePlacement",v2n="nodePlacement.bk",m2n="edgeRouting",y2n="org.eclipse.elk.edgeRouting",k2n="spacing",j2n="priority",E2n="compaction",T2n="compaction.postCompaction",M2n="Specifies whether and how post-process compaction is applied.",S2n="highDegreeNodes",P2n="wrapping",C2n="wrapping.cutting",I2n="wrapping.validify",O2n="wrapping.multiEdge",A2n="edgeLabels",$2n="considerModelOrder",L2n="org.eclipse.elk.spacing.commentComment",N2n="org.eclipse.elk.spacing.commentNode",x2n="org.eclipse.elk.spacing.edgeEdge",D2n="org.eclipse.elk.spacing.edgeNode",R2n="org.eclipse.elk.spacing.labelLabel",K2n="org.eclipse.elk.spacing.labelPortHorizontal",_2n="org.eclipse.elk.spacing.labelPortVertical",F2n="org.eclipse.elk.spacing.labelNode",B2n="org.eclipse.elk.spacing.nodeSelfLoop",H2n="org.eclipse.elk.spacing.portPort",q2n="org.eclipse.elk.spacing.individual",G2n="org.eclipse.elk.port.borderOffset",z2n="org.eclipse.elk.noLayout",U2n="org.eclipse.elk.port.side",X2n="org.eclipse.elk.debugMode",W2n="org.eclipse.elk.alignment",V2n="org.eclipse.elk.insideSelfLoops.activate",Q2n="org.eclipse.elk.insideSelfLoops.yo",Y2n="org.eclipse.elk.nodeSize.fixedGraphSize",J2n="org.eclipse.elk.direction",Z2n="org.eclipse.elk.nodeLabels.padding",n3n="org.eclipse.elk.portLabels.nextToPortIfPossible",t3n="org.eclipse.elk.portLabels.treatAsGroup",e3n="org.eclipse.elk.portAlignment.default",i3n="org.eclipse.elk.portAlignment.north",r3n="org.eclipse.elk.portAlignment.south",c3n="org.eclipse.elk.portAlignment.west",a3n="org.eclipse.elk.portAlignment.east",u3n="org.eclipse.elk.contentAlignment",o3n="org.eclipse.elk.junctionPoints",s3n="org.eclipse.elk.edgeLabels.placement",h3n="org.eclipse.elk.port.index",f3n="org.eclipse.elk.commentBox",l3n="org.eclipse.elk.hypernode",b3n="org.eclipse.elk.port.anchor",w3n="org.eclipse.elk.partitioning.activate",d3n="org.eclipse.elk.partitioning.partition",g3n="org.eclipse.elk.position",p3n="org.eclipse.elk.margins",v3n="org.eclipse.elk.spacing.portsSurrounding",m3n="org.eclipse.elk.interactiveLayout",y3n="org.eclipse.elk.core.util",k3n={3:1,4:1,5:1,593:1},j3n="NETWORK_SIMPLEX",E3n={123:1,51:1},T3n="org.eclipse.elk.alg.layered.p1cycles",M3n="org.eclipse.elk.alg.layered.p2layers",S3n={402:1,225:1},P3n={832:1,3:1,4:1},C3n="org.eclipse.elk.alg.layered.p3order",I3n="org.eclipse.elk.alg.layered.p4nodes",O3n={3:1,4:1,5:1,840:1},A3n=1e-5,$3n="org.eclipse.elk.alg.layered.p4nodes.bk",L3n="org.eclipse.elk.alg.layered.p5edges",N3n="org.eclipse.elk.alg.layered.p5edges.orthogonal",x3n="org.eclipse.elk.alg.layered.p5edges.orthogonal.direction",D3n=1e-6,R3n="org.eclipse.elk.alg.layered.p5edges.splines",K3n=.09999999999999998,_3n=1e-8,F3n=4.71238898038469,B3n=3.141592653589793,H3n="org.eclipse.elk.alg.mrtree",q3n="org.eclipse.elk.alg.mrtree.graph",G3n="org.eclipse.elk.alg.mrtree.intermediate",z3n="Set neighbors in level",U3n="DESCENDANTS",X3n="org.eclipse.elk.mrtree.weighting",W3n="org.eclipse.elk.mrtree.searchOrder",V3n="org.eclipse.elk.alg.mrtree.options",Q3n="org.eclipse.elk.mrtree",Y3n="org.eclipse.elk.tree",J3n="org.eclipse.elk.alg.radial",Z3n=6.283185307179586,n4n=5e-324,t4n="org.eclipse.elk.alg.radial.intermediate",e4n="org.eclipse.elk.alg.radial.intermediate.compaction",i4n={3:1,4:1,5:1,106:1},r4n="org.eclipse.elk.alg.radial.intermediate.optimization",c4n="No implementation is available for the layout option ",a4n="org.eclipse.elk.alg.radial.options",u4n="org.eclipse.elk.radial.orderId",o4n="org.eclipse.elk.radial.radius",s4n="org.eclipse.elk.radial.compactor",h4n="org.eclipse.elk.radial.compactionStepSize",f4n="org.eclipse.elk.radial.sorter",l4n="org.eclipse.elk.radial.wedgeCriteria",b4n="org.eclipse.elk.radial.optimizationCriteria",w4n="org.eclipse.elk.radial",d4n="org.eclipse.elk.alg.radial.p1position.wedge",g4n="org.eclipse.elk.alg.radial.sorting",p4n=5.497787143782138,v4n=3.9269908169872414,m4n=2.356194490192345,y4n="org.eclipse.elk.alg.rectpacking",k4n="org.eclipse.elk.alg.rectpacking.firstiteration",j4n="org.eclipse.elk.alg.rectpacking.options",E4n="org.eclipse.elk.rectpacking.optimizationGoal",T4n="org.eclipse.elk.rectpacking.lastPlaceShift",M4n="org.eclipse.elk.rectpacking.currentPosition",S4n="org.eclipse.elk.rectpacking.desiredPosition",P4n="org.eclipse.elk.rectpacking.onlyFirstIteration",C4n="org.eclipse.elk.rectpacking.rowCompaction",I4n="org.eclipse.elk.rectpacking.expandToAspectRatio",O4n="org.eclipse.elk.rectpacking.targetWidth",A4n="org.eclipse.elk.expandNodes",$4n="org.eclipse.elk.rectpacking",L4n="org.eclipse.elk.alg.rectpacking.util",N4n="No implementation available for ",x4n="org.eclipse.elk.alg.spore",D4n="org.eclipse.elk.alg.spore.options",R4n="org.eclipse.elk.sporeCompaction",K4n="org.eclipse.elk.underlyingLayoutAlgorithm",_4n="org.eclipse.elk.processingOrder.treeConstruction",F4n="org.eclipse.elk.processingOrder.spanningTreeCostFunction",B4n="org.eclipse.elk.processingOrder.preferredRoot",H4n="org.eclipse.elk.processingOrder.rootSelection",q4n="org.eclipse.elk.structure.structureExtractionStrategy",G4n="org.eclipse.elk.compaction.compactionStrategy",z4n="org.eclipse.elk.compaction.orthogonal",U4n="org.eclipse.elk.overlapRemoval.maxIterations",X4n="org.eclipse.elk.overlapRemoval.runScanline",W4n="processingOrder",V4n="overlapRemoval",Q4n="org.eclipse.elk.sporeOverlap",Y4n="org.eclipse.elk.alg.spore.p1structure",J4n="org.eclipse.elk.alg.spore.p2processingorder",Z4n="org.eclipse.elk.alg.spore.p3execution",n5n="Invalid index: ",t5n="org.eclipse.elk.core.alg",e5n={331:1},i5n={288:1},r5n="Make sure its type is registered with the ",c5n=" utility class.",a5n="true",u5n="false",o5n="Couldn't clone property '",s5n=.05,h5n="org.eclipse.elk.core.options",f5n=1.2999999523162842,l5n="org.eclipse.elk.box",b5n="org.eclipse.elk.box.packingMode",w5n="org.eclipse.elk.algorithm",d5n="org.eclipse.elk.resolvedAlgorithm",g5n="org.eclipse.elk.bendPoints",p5n="org.eclipse.elk.labelManager",v5n="org.eclipse.elk.scaleFactor",m5n="org.eclipse.elk.animate",y5n="org.eclipse.elk.animTimeFactor",k5n="org.eclipse.elk.layoutAncestors",j5n="org.eclipse.elk.maxAnimTime",E5n="org.eclipse.elk.minAnimTime",T5n="org.eclipse.elk.progressBar",M5n="org.eclipse.elk.validateGraph",S5n="org.eclipse.elk.validateOptions",P5n="org.eclipse.elk.zoomToFit",C5n="org.eclipse.elk.font.name",I5n="org.eclipse.elk.font.size",O5n="org.eclipse.elk.edge.type",A5n="partitioning",$5n="nodeLabels",L5n="portAlignment",N5n="nodeSize",x5n="port",D5n="portLabels",R5n="insideSelfLoops",K5n="org.eclipse.elk.fixed",_5n="org.eclipse.elk.random",F5n="port must have a parent node to calculate the port side",B5n="The edge needs to have exactly one edge section. Found: ",H5n="org.eclipse.elk.core.util.adapters",q5n="org.eclipse.emf.ecore",G5n="org.eclipse.elk.graph",z5n="EMapPropertyHolder",U5n="ElkBendPoint",X5n="ElkGraphElement",W5n="ElkConnectableShape",V5n="ElkEdge",Q5n="ElkEdgeSection",Y5n="EModelElement",J5n="ENamedElement",Z5n="ElkLabel",n6n="ElkNode",t6n="ElkPort",e6n={92:1,90:1},i6n="org.eclipse.emf.common.notify.impl",r6n="The feature '",c6n="' is not a valid changeable feature",a6n="Expecting null",u6n="' is not a valid feature",o6n="The feature ID",s6n=" is not a valid feature ID",h6n=32768,f6n={105:1,92:1,90:1,56:1,49:1,97:1},l6n="org.eclipse.emf.ecore.impl",b6n="org.eclipse.elk.graph.impl",w6n="Recursive containment not allowed for ",d6n="The datatype '",g6n="' is not a valid classifier",p6n="The value '",v6n={190:1,3:1,4:1},m6n="The class '",y6n="http://www.eclipse.org/elk/ElkGraph",k6n=1024,j6n="property",E6n="value",T6n="source",M6n="properties",S6n="identifier",P6n="height",C6n="width",I6n="parent",O6n="text",A6n="children",$6n="hierarchical",L6n="sources",N6n="targets",x6n="sections",D6n="bendPoints",R6n="outgoingShape",K6n="incomingShape",_6n="outgoingSections",F6n="incomingSections",B6n="org.eclipse.emf.common.util",H6n="Severe implementation error in the Json to ElkGraph importer.",q6n="id",G6n="org.eclipse.elk.graph.json",z6n="Unhandled parameter types: ",U6n="startPoint",X6n="An edge must have at least one source and one target (edge id: '",W6n="').",V6n="Referenced edge section does not exist: ",Q6n=" (edge id: '",Y6n="target",J6n="sourcePoint",Z6n="targetPoint",n8n="group",t8n="name",e8n="connectableShape cannot be null",i8n="edge cannot be null",r8n="Passed edge is not 'simple'.",c8n="org.eclipse.elk.graph.util",a8n="The 'no duplicates' constraint is violated",u8n="targetIndex=",o8n=", size=",s8n="sourceIndex=",h8n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1},f8n={3:1,4:1,20:1,28:1,52:1,14:1,47:1,15:1,54:1,67:1,63:1,58:1,588:1},l8n="logging",b8n="measureExecutionTime",w8n="parser.parse.1",d8n="parser.parse.2",g8n="parser.next.1",p8n="parser.next.2",v8n="parser.next.3",m8n="parser.next.4",y8n="parser.factor.1",k8n="parser.factor.2",j8n="parser.factor.3",E8n="parser.factor.4",T8n="parser.factor.5",M8n="parser.factor.6",S8n="parser.atom.1",P8n="parser.atom.2",C8n="parser.atom.3",I8n="parser.atom.4",O8n="parser.atom.5",A8n="parser.cc.1",$8n="parser.cc.2",L8n="parser.cc.3",N8n="parser.cc.5",x8n="parser.cc.6",D8n="parser.cc.7",R8n="parser.cc.8",K8n="parser.ope.1",_8n="parser.ope.2",F8n="parser.ope.3",B8n="parser.descape.1",H8n="parser.descape.2",q8n="parser.descape.3",G8n="parser.descape.4",z8n="parser.descape.5",U8n="parser.process.1",X8n="parser.quantifier.1",W8n="parser.quantifier.2",V8n="parser.quantifier.3",Q8n="parser.quantifier.4",Y8n="parser.quantifier.5",J8n="org.eclipse.emf.common.notify",Z8n={415:1,672:1},n9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1},t9n={366:1,143:1},e9n="index=",i9n={3:1,4:1,5:1,126:1},r9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,58:1},c9n={3:1,6:1,4:1,5:1,192:1},a9n={3:1,4:1,5:1,165:1,367:1},u9n=";/?:@&=+$,",o9n="invalid authority: ",s9n="EAnnotation",h9n="ETypedElement",f9n="EStructuralFeature",l9n="EAttribute",b9n="EClassifier",w9n="EEnumLiteral",d9n="EGenericType",g9n="EOperation",p9n="EParameter",v9n="EReference",m9n="ETypeParameter",y9n="org.eclipse.emf.ecore.util",k9n={76:1},j9n={3:1,20:1,14:1,15:1,58:1,589:1,76:1,69:1,95:1},E9n="org.eclipse.emf.ecore.util.FeatureMap$Entry",T9n=8192,M9n=2048,S9n="byte",P9n="char",C9n="double",I9n="float",O9n="int",A9n="long",$9n="short",L9n="java.lang.Object",N9n={3:1,4:1,5:1,247:1},x9n={3:1,4:1,5:1,673:1},D9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,69:1},R9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,69:1,95:1},K9n="mixed",_9n="http:///org/eclipse/emf/ecore/util/ExtendedMetaData",F9n="kind",B9n={3:1,4:1,5:1,674:1},H9n={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1,76:1,69:1,95:1},q9n={20:1,28:1,52:1,14:1,15:1,58:1,69:1},G9n={47:1,125:1,279:1},z9n={72:1,332:1},U9n="The value of type '",X9n="' must be of type '",W9n=1316,V9n="http://www.eclipse.org/emf/2002/Ecore",Q9n=-32768,Y9n="constraints",J9n="baseType",Z9n="getEStructuralFeature",n7n="getFeatureID",t7n="feature",e7n="getOperationID",i7n="operation",r7n="defaultValue",c7n="eTypeParameters",a7n="isInstance",u7n="getEEnumLiteral",o7n="eContainingClass",s7n={55:1},h7n={3:1,4:1,5:1,119:1},f7n="org.eclipse.emf.ecore.resource",l7n={92:1,90:1,591:1,1935:1},b7n="org.eclipse.emf.ecore.resource.impl",w7n="unspecified",d7n="simple",g7n="attribute",p7n="attributeWildcard",v7n="element",m7n="elementWildcard",y7n="collapse",k7n="itemType",j7n="namespace",E7n="##targetNamespace",T7n="whiteSpace",M7n="wildcards",S7n="http://www.eclipse.org/emf/2003/XMLType",P7n="##any",C7n="uninitialized",I7n="The multiplicity constraint is violated",O7n="org.eclipse.emf.ecore.xml.type",A7n="ProcessingInstruction",$7n="SimpleAnyType",L7n="XMLTypeDocumentRoot",N7n="org.eclipse.emf.ecore.xml.type.impl",x7n="INF",D7n="processing",R7n="ENTITIES_._base",K7n="minLength",_7n="ENTITY",F7n="NCName",B7n="IDREFS_._base",H7n="integer",q7n="token",G7n="pattern",z7n="[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*",U7n="\\i\\c*",X7n="[\\i-[:]][\\c-[:]]*",W7n="nonPositiveInteger",V7n="maxInclusive",Q7n="NMTOKEN",Y7n="NMTOKENS_._base",J7n="nonNegativeInteger",Z7n="minInclusive",nnt="normalizedString",tnt="unsignedByte",ent="unsignedInt",int="18446744073709551615",rnt="unsignedShort",cnt="processingInstruction",ant="org.eclipse.emf.ecore.xml.type.internal",unt=1114111,ont="Internal Error: shorthands: \\u",snt="xml:isDigit",hnt="xml:isWord",fnt="xml:isSpace",lnt="xml:isNameChar",bnt="xml:isInitialNameChar",wnt="09\u0660\u0669\u06f0\u06f9\u0966\u096f\u09e6\u09ef\u0a66\u0a6f\u0ae6\u0aef\u0b66\u0b6f\u0be7\u0bef\u0c66\u0c6f\u0ce6\u0cef\u0d66\u0d6f\u0e50\u0e59\u0ed0\u0ed9\u0f20\u0f29",dnt="AZaz\xc0\xd6\xd8\xf6\xf8\u0131\u0134\u013e\u0141\u0148\u014a\u017e\u0180\u01c3\u01cd\u01f0\u01f4\u01f5\u01fa\u0217\u0250\u02a8\u02bb\u02c1\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1\u03a3\u03ce\u03d0\u03d6\u03da\u03da\u03dc\u03dc\u03de\u03de\u03e0\u03e0\u03e2\u03f3\u0401\u040c\u040e\u044f\u0451\u045c\u045e\u0481\u0490\u04c4\u04c7\u04c8\u04cb\u04cc\u04d0\u04eb\u04ee\u04f5\u04f8\u04f9\u0531\u0556\u0559\u0559\u0561\u0586\u05d0\u05ea\u05f0\u05f2\u0621\u063a\u0641\u064a\u0671\u06b7\u06ba\u06be\u06c0\u06ce\u06d0\u06d3\u06d5\u06d5\u06e5\u06e6\u0905\u0939\u093d\u093d\u0958\u0961\u0985\u098c\u098f\u0990\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09dc\u09dd\u09df\u09e1\u09f0\u09f1\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8b\u0a8d\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ae0\u0ae0\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33\u0b36\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb5\u0bb7\u0bb9\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c33\u0c35\u0c39\u0c60\u0c61\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cde\u0cde\u0ce0\u0ce1\u0d05\u0d0c\u0d0e\u0d10\u0d12\u0d28\u0d2a\u0d39\u0d60\u0d61\u0e01\u0e2e\u0e30\u0e30\u0e32\u0e33\u0e40\u0e45\u0e81\u0e82\u0e84\u0e84\u0e87\u0e88\u0e8a\u0e8a\u0e8d\u0e8d\u0e94\u0e97\u0e99\u0e9f\u0ea1\u0ea3\u0ea5\u0ea5\u0ea7\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eb0\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4\u0f40\u0f47\u0f49\u0f69\u10a0\u10c5\u10d0\u10f6\u1100\u1100\u1102\u1103\u1105\u1107\u1109\u1109\u110b\u110c\u110e\u1112\u113c\u113c\u113e\u113e\u1140\u1140\u114c\u114c\u114e\u114e\u1150\u1150\u1154\u1155\u1159\u1159\u115f\u1161\u1163\u1163\u1165\u1165\u1167\u1167\u1169\u1169\u116d\u116e\u1172\u1173\u1175\u1175\u119e\u119e\u11a8\u11a8\u11ab\u11ab\u11ae\u11af\u11b7\u11b8\u11ba\u11ba\u11bc\u11c2\u11eb\u11eb\u11f0\u11f0\u11f9\u11f9\u1e00\u1e9b\u1ea0\u1ef9\u1f00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2126\u2126\u212a\u212b\u212e\u212e\u2180\u2182\u3007\u3007\u3021\u3029\u3041\u3094\u30a1\u30fa\u3105\u312c\u4e00\u9fa5\uac00\ud7a3",gnt="Private Use",pnt="ASSIGNED",vnt="\0\x7f\x80\xff\u0100\u017f\u0180\u024f\u0250\u02af\u02b0\u02ff\u0300\u036f\u0370\u03ff\u0400\u04ff\u0530\u058f\u0590\u05ff\u0600\u06ff\u0700\u074f\u0780\u07bf\u0900\u097f\u0980\u09ff\u0a00\u0a7f\u0a80\u0aff\u0b00\u0b7f\u0b80\u0bff\u0c00\u0c7f\u0c80\u0cff\u0d00\u0d7f\u0d80\u0dff\u0e00\u0e7f\u0e80\u0eff\u0f00\u0fff\u1000\u109f\u10a0\u10ff\u1100\u11ff\u1200\u137f\u13a0\u13ff\u1400\u167f\u1680\u169f\u16a0\u16ff\u1780\u17ff\u1800\u18af\u1e00\u1eff\u1f00\u1fff\u2000\u206f\u2070\u209f\u20a0\u20cf\u20d0\u20ff\u2100\u214f\u2150\u218f\u2190\u21ff\u2200\u22ff\u2300\u23ff\u2400\u243f\u2440\u245f\u2460\u24ff\u2500\u257f\u2580\u259f\u25a0\u25ff\u2600\u26ff\u2700\u27bf\u2800\u28ff\u2e80\u2eff\u2f00\u2fdf\u2ff0\u2fff\u3000\u303f\u3040\u309f\u30a0\u30ff\u3100\u312f\u3130\u318f\u3190\u319f\u31a0\u31bf\u3200\u32ff\u3300\u33ff\u3400\u4db5\u4e00\u9fff\ua000\ua48f\ua490\ua4cf\uac00\ud7a3\ue000\uf8ff\uf900\ufaff\ufb00\ufb4f\ufb50\ufdff\ufe20\ufe2f\ufe30\ufe4f\ufe50\ufe6f\ufe70\ufefe\ufeff\ufeff\uff00\uffef",mnt="UNASSIGNED",ynt={3:1,117:1},knt="org.eclipse.emf.ecore.xml.type.util",jnt={3:1,4:1,5:1,368:1},Ent="org.eclipse.xtext.xbase.lib",Tnt="Cannot add elements to a Range",Mnt="Cannot set elements in a Range",Snt="Cannot remove elements from a Range",Pnt="locale",Cnt="default",Int="user.agent";e.goog=e.goog||{},e.goog.global=e.goog.global||e,WMn(),wAn(1,null,{},r),MWn.Fb=function(n){return FO(this,n)},MWn.Gb=function(){return this.gm},MWn.Hb=function(){return PN(this)},MWn.Ib=function(){return nE(tsn(this))+"@"+(nsn(this)>>>0).toString(16)},MWn.equals=function(n){return this.Fb(n)},MWn.hashCode=function(){return this.Hb()},MWn.toString=function(){return this.Ib()},wAn(290,1,{290:1,2026:1},pon),MWn.le=function(n){var t;return(t=new pon).i=4,t.c=n>1?gZ(this,n-1):this,t},MWn.me=function(){return ED(this),this.b},MWn.ne=function(){return nE(this)},MWn.oe=function(){return ED(this),this.k},MWn.pe=function(){return 0!=(4&this.i)},MWn.qe=function(){return 0!=(1&this.i)},MWn.Ib=function(){return utn(this)},MWn.i=0;var Ont,Ant=vX(RWn,"Object",1),$nt=vX(RWn,"Class",290);wAn(1998,1,KWn),vX(_Wn,"Optional",1998),wAn(1170,1998,KWn,c),MWn.Fb=function(n){return n===this},MWn.Hb=function(){return 2040732332},MWn.Ib=function(){return"Optional.absent()"},MWn.Jb=function(n){return yX(n),iy(),Ont},vX(_Wn,"Absent",1170),wAn(628,1,{},mk),vX(_Wn,"Joiner",628);var Lnt=bq(_Wn,"Predicate");wAn(582,1,{169:1,582:1,3:1,45:1},Hf),MWn.Mb=function(n){return Kon(this,n)},MWn.Lb=function(n){return Kon(this,n)},MWn.Fb=function(n){var t;return!!cL(n,582)&&(t=BB(n,582),NAn(this.a,t.a))},MWn.Hb=function(){return Fon(this.a)+306654252},MWn.Ib=function(){return wPn(this.a)},vX(_Wn,"Predicates/AndPredicate",582),wAn(408,1998,{408:1,3:1},qf),MWn.Fb=function(n){var t;return!!cL(n,408)&&(t=BB(n,408),Nfn(this.a,t.a))},MWn.Hb=function(){return 1502476572+nsn(this.a)},MWn.Ib=function(){return GWn+this.a+")"},MWn.Jb=function(n){return new qf(WQ(n.Kb(this.a),"the Function passed to Optional.transform() must not return null."))},vX(_Wn,"Present",408),wAn(198,1,UWn),MWn.Nb=function(n){fU(this,n)},MWn.Qb=function(){bk()},vX(XWn,"UnmodifiableIterator",198),wAn(1978,198,WWn),MWn.Qb=function(){bk()},MWn.Rb=function(n){throw Hp(new pv)},MWn.Wb=function(n){throw Hp(new pv)},vX(XWn,"UnmodifiableListIterator",1978),wAn(386,1978,WWn),MWn.Ob=function(){return this.c<this.d},MWn.Sb=function(){return this.c>0},MWn.Pb=function(){if(this.c>=this.d)throw Hp(new yv);return this.Xb(this.c++)},MWn.Tb=function(){return this.c},MWn.Ub=function(){if(this.c<=0)throw Hp(new yv);return this.Xb(--this.c)},MWn.Vb=function(){return this.c-1},MWn.c=0,MWn.d=0,vX(XWn,"AbstractIndexedListIterator",386),wAn(699,198,UWn),MWn.Ob=function(){return Zin(this)},MWn.Pb=function(){return P7(this)},MWn.e=1,vX(XWn,"AbstractIterator",699),wAn(1986,1,{224:1}),MWn.Zb=function(){return this.f||(this.f=this.ac())},MWn.Fb=function(n){return jsn(this,n)},MWn.Hb=function(){return nsn(this.Zb())},MWn.dc=function(){return 0==this.gc()},MWn.ec=function(){return gz(this)},MWn.Ib=function(){return Bbn(this.Zb())},vX(XWn,"AbstractMultimap",1986),wAn(726,1986,VWn),MWn.$b=function(){win(this)},MWn._b=function(n){return Wj(this,n)},MWn.ac=function(){return new pT(this,this.c)},MWn.ic=function(n){return this.hc()},MWn.bc=function(){return new HL(this,this.c)},MWn.jc=function(){return this.mc(this.hc())},MWn.kc=function(){return new Hm(this)},MWn.lc=function(){return qTn(this.c.vc().Nc(),new u,64,this.d)},MWn.cc=function(n){return h6(this,n)},MWn.fc=function(n){return Nhn(this,n)},MWn.gc=function(){return this.d},MWn.mc=function(n){return SQ(),new Hb(n)},MWn.nc=function(){return new Bm(this)},MWn.oc=function(){return qTn(this.c.Cc().Nc(),new a,64,this.d)},MWn.pc=function(n,t){return new W6(this,n,t,null)},MWn.d=0,vX(XWn,"AbstractMapBasedMultimap",726),wAn(1631,726,VWn),MWn.hc=function(){return new J6(this.a)},MWn.jc=function(){return SQ(),SQ(),set},MWn.cc=function(n){return BB(h6(this,n),15)},MWn.fc=function(n){return BB(Nhn(this,n),15)},MWn.Zb=function(){return OQ(this)},MWn.Fb=function(n){return jsn(this,n)},MWn.qc=function(n){return BB(h6(this,n),15)},MWn.rc=function(n){return BB(Nhn(this,n),15)},MWn.mc=function(n){return rY(BB(n,15))},MWn.pc=function(n,t){return i3(this,n,BB(t,15),null)},vX(XWn,"AbstractListMultimap",1631),wAn(732,1,QWn),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.c.Ob()||this.e.Ob()},MWn.Pb=function(){var n;return this.e.Ob()||(n=BB(this.c.Pb(),42),this.b=n.cd(),this.a=BB(n.dd(),14),this.e=this.a.Kc()),this.sc(this.b,this.e.Pb())},MWn.Qb=function(){this.e.Qb(),this.a.dc()&&this.c.Qb(),--this.d.d},vX(XWn,"AbstractMapBasedMultimap/Itr",732),wAn(1099,732,QWn,Bm),MWn.sc=function(n,t){return t},vX(XWn,"AbstractMapBasedMultimap/1",1099),wAn(1100,1,{},a),MWn.Kb=function(n){return BB(n,14).Nc()},vX(XWn,"AbstractMapBasedMultimap/1methodref$spliterator$Type",1100),wAn(1101,732,QWn,Hm),MWn.sc=function(n,t){return new vT(n,t)},vX(XWn,"AbstractMapBasedMultimap/2",1101);var Nnt=bq(YWn,"Map");wAn(1967,1,JWn),MWn.wc=function(n){nan(this,n)},MWn.yc=function(n,t,e){return Zln(this,n,t,e)},MWn.$b=function(){this.vc().$b()},MWn.tc=function(n){return Mmn(this,n)},MWn._b=function(n){return!!FEn(this,n,!1)},MWn.uc=function(n){var t,e;for(t=this.vc().Kc();t.Ob();)if(e=BB(t.Pb(),42).dd(),GI(n)===GI(e)||null!=n&&Nfn(n,e))return!0;return!1},MWn.Fb=function(n){var t,e,i;if(n===this)return!0;if(!cL(n,83))return!1;if(i=BB(n,83),this.gc()!=i.gc())return!1;for(e=i.vc().Kc();e.Ob();)if(t=BB(e.Pb(),42),!this.tc(t))return!1;return!0},MWn.xc=function(n){return qI(FEn(this,n,!1))},MWn.Hb=function(){return Hun(this.vc())},MWn.dc=function(){return 0==this.gc()},MWn.ec=function(){return new Cb(this)},MWn.zc=function(n,t){throw Hp(new tk("Put not supported on this map"))},MWn.Ac=function(n){Tcn(this,n)},MWn.Bc=function(n){return qI(FEn(this,n,!0))},MWn.gc=function(){return this.vc().gc()},MWn.Ib=function(){return nTn(this)},MWn.Cc=function(){return new Ob(this)},vX(YWn,"AbstractMap",1967),wAn(1987,1967,JWn),MWn.bc=function(){return new ST(this)},MWn.vc=function(){return dz(this)},MWn.ec=function(){return this.g||(this.g=this.bc())},MWn.Cc=function(){return this.i||(this.i=new PT(this))},vX(XWn,"Maps/ViewCachingAbstractMap",1987),wAn(389,1987,JWn,pT),MWn.xc=function(n){return ktn(this,n)},MWn.Bc=function(n){return Zsn(this,n)},MWn.$b=function(){this.d==this.e.c?this.e.$b():Cq(new Oq(this))},MWn._b=function(n){return gfn(this.d,n)},MWn.Ec=function(){return new Xf(this)},MWn.Dc=function(){return this.Ec()},MWn.Fb=function(n){return this===n||Nfn(this.d,n)},MWn.Hb=function(){return nsn(this.d)},MWn.ec=function(){return this.e.ec()},MWn.gc=function(){return this.d.gc()},MWn.Ib=function(){return Bbn(this.d)},vX(XWn,"AbstractMapBasedMultimap/AsMap",389);var xnt=bq(RWn,"Iterable");wAn(28,1,ZWn),MWn.Jc=function(n){e5(this,n)},MWn.Lc=function(){return this.Oc()},MWn.Nc=function(){return new w1(this,0)},MWn.Oc=function(){return new Rq(null,this.Nc())},MWn.Fc=function(n){throw Hp(new tk("Add not supported on this collection"))},MWn.Gc=function(n){return Frn(this,n)},MWn.$b=function(){TV(this)},MWn.Hc=function(n){return ywn(this,n,!1)},MWn.Ic=function(n){return oun(this,n)},MWn.dc=function(){return 0==this.gc()},MWn.Mc=function(n){return ywn(this,n,!0)},MWn.Pc=function(){return cz(this)},MWn.Qc=function(n){return Emn(this,n)},MWn.Ib=function(){return LMn(this)},vX(YWn,"AbstractCollection",28);var Dnt=bq(YWn,"Set");wAn(nVn,28,tVn),MWn.Nc=function(){return new w1(this,1)},MWn.Fb=function(n){return ign(this,n)},MWn.Hb=function(){return Hun(this)},vX(YWn,"AbstractSet",nVn),wAn(1970,nVn,tVn),vX(XWn,"Sets/ImprovedAbstractSet",1970),wAn(1971,1970,tVn),MWn.$b=function(){this.Rc().$b()},MWn.Hc=function(n){return idn(this,n)},MWn.dc=function(){return this.Rc().dc()},MWn.Mc=function(n){var t;return!!this.Hc(n)&&(t=BB(n,42),this.Rc().ec().Mc(t.cd()))},MWn.gc=function(){return this.Rc().gc()},vX(XWn,"Maps/EntrySet",1971),wAn(1097,1971,tVn,Xf),MWn.Hc=function(n){return wfn(this.a.d.vc(),n)},MWn.Kc=function(){return new Oq(this.a)},MWn.Rc=function(){return this.a},MWn.Mc=function(n){var t;return!!wfn(this.a.d.vc(),n)&&(t=BB(n,42),H5(this.a.e,t.cd()),!0)},MWn.Nc=function(){return RB(this.a.d.vc().Nc(),new Wf(this.a))},vX(XWn,"AbstractMapBasedMultimap/AsMap/AsMapEntries",1097),wAn(1098,1,{},Wf),MWn.Kb=function(n){return i5(this.a,BB(n,42))},vX(XWn,"AbstractMapBasedMultimap/AsMap/AsMapEntries/0methodref$wrapEntry$Type",1098),wAn(730,1,QWn,Oq),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){var n;return n=BB(this.b.Pb(),42),this.a=BB(n.dd(),14),i5(this.c,n)},MWn.Ob=function(){return this.b.Ob()},MWn.Qb=function(){han(!!this.a),this.b.Qb(),this.c.e.d-=this.a.gc(),this.a.$b(),this.a=null},vX(XWn,"AbstractMapBasedMultimap/AsMap/AsMapIterator",730),wAn(532,1970,tVn,ST),MWn.$b=function(){this.b.$b()},MWn.Hc=function(n){return this.b._b(n)},MWn.Jc=function(n){yX(n),this.b.wc(new vl(n))},MWn.dc=function(){return this.b.dc()},MWn.Kc=function(){return new ly(this.b.vc().Kc())},MWn.Mc=function(n){return!!this.b._b(n)&&(this.b.Bc(n),!0)},MWn.gc=function(){return this.b.gc()},vX(XWn,"Maps/KeySet",532),wAn(318,532,tVn,HL),MWn.$b=function(){Cq(new eT(this,this.b.vc().Kc()))},MWn.Ic=function(n){return this.b.ec().Ic(n)},MWn.Fb=function(n){return this===n||Nfn(this.b.ec(),n)},MWn.Hb=function(){return nsn(this.b.ec())},MWn.Kc=function(){return new eT(this,this.b.vc().Kc())},MWn.Mc=function(n){var t,e;return e=0,(t=BB(this.b.Bc(n),14))&&(e=t.gc(),t.$b(),this.a.d-=e),e>0},MWn.Nc=function(){return this.b.ec().Nc()},vX(XWn,"AbstractMapBasedMultimap/KeySet",318),wAn(731,1,QWn,eT),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.c.Ob()},MWn.Pb=function(){return this.a=BB(this.c.Pb(),42),this.a.cd()},MWn.Qb=function(){var n;han(!!this.a),n=BB(this.a.dd(),14),this.c.Qb(),this.b.a.d-=n.gc(),n.$b(),this.a=null},vX(XWn,"AbstractMapBasedMultimap/KeySet/1",731),wAn(491,389,{83:1,161:1},CD),MWn.bc=function(){return this.Sc()},MWn.ec=function(){return this.Tc()},MWn.Sc=function(){return new nT(this.c,this.Uc())},MWn.Tc=function(){return this.b||(this.b=this.Sc())},MWn.Uc=function(){return BB(this.d,161)},vX(XWn,"AbstractMapBasedMultimap/SortedAsMap",491),wAn(542,491,eVn,ID),MWn.bc=function(){return new tT(this.a,BB(BB(this.d,161),171))},MWn.Sc=function(){return new tT(this.a,BB(BB(this.d,161),171))},MWn.ec=function(){return BB(this.b||(this.b=new tT(this.a,BB(BB(this.d,161),171))),271)},MWn.Tc=function(){return BB(this.b||(this.b=new tT(this.a,BB(BB(this.d,161),171))),271)},MWn.Uc=function(){return BB(BB(this.d,161),171)},vX(XWn,"AbstractMapBasedMultimap/NavigableAsMap",542),wAn(490,318,iVn,nT),MWn.Nc=function(){return this.b.ec().Nc()},vX(XWn,"AbstractMapBasedMultimap/SortedKeySet",490),wAn(388,490,rVn,tT),vX(XWn,"AbstractMapBasedMultimap/NavigableKeySet",388),wAn(541,28,ZWn,W6),MWn.Fc=function(n){var t,e;return zbn(this),e=this.d.dc(),(t=this.d.Fc(n))&&(++this.f.d,e&&jR(this)),t},MWn.Gc=function(n){var t,e,i;return!n.dc()&&(zbn(this),i=this.d.gc(),(t=this.d.Gc(n))&&(e=this.d.gc(),this.f.d+=e-i,0==i&&jR(this)),t)},MWn.$b=function(){var n;zbn(this),0!=(n=this.d.gc())&&(this.d.$b(),this.f.d-=n,$G(this))},MWn.Hc=function(n){return zbn(this),this.d.Hc(n)},MWn.Ic=function(n){return zbn(this),this.d.Ic(n)},MWn.Fb=function(n){return n===this||(zbn(this),Nfn(this.d,n))},MWn.Hb=function(){return zbn(this),nsn(this.d)},MWn.Kc=function(){return zbn(this),new QB(this)},MWn.Mc=function(n){var t;return zbn(this),(t=this.d.Mc(n))&&(--this.f.d,$G(this)),t},MWn.gc=function(){return tO(this)},MWn.Nc=function(){return zbn(this),this.d.Nc()},MWn.Ib=function(){return zbn(this),Bbn(this.d)},vX(XWn,"AbstractMapBasedMultimap/WrappedCollection",541);var Rnt=bq(YWn,"List");wAn(728,541,{20:1,28:1,14:1,15:1},sz),MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return zbn(this),this.d.Nc()},MWn.Vc=function(n,t){var e;zbn(this),e=this.d.dc(),BB(this.d,15).Vc(n,t),++this.a.d,e&&jR(this)},MWn.Wc=function(n,t){var e,i,r;return!t.dc()&&(zbn(this),r=this.d.gc(),(e=BB(this.d,15).Wc(n,t))&&(i=this.d.gc(),this.a.d+=i-r,0==r&&jR(this)),e)},MWn.Xb=function(n){return zbn(this),BB(this.d,15).Xb(n)},MWn.Xc=function(n){return zbn(this),BB(this.d,15).Xc(n)},MWn.Yc=function(){return zbn(this),new g$(this)},MWn.Zc=function(n){return zbn(this),new gQ(this,n)},MWn.$c=function(n){var t;return zbn(this),t=BB(this.d,15).$c(n),--this.a.d,$G(this),t},MWn._c=function(n,t){return zbn(this),BB(this.d,15)._c(n,t)},MWn.bd=function(n,t){return zbn(this),i3(this.a,this.e,BB(this.d,15).bd(n,t),this.b?this.b:this)},vX(XWn,"AbstractMapBasedMultimap/WrappedList",728),wAn(1096,728,{20:1,28:1,14:1,15:1,54:1},Ox),vX(XWn,"AbstractMapBasedMultimap/RandomAccessWrappedList",1096),wAn(620,1,QWn,QB),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return MV(this),this.b.Ob()},MWn.Pb=function(){return MV(this),this.b.Pb()},MWn.Qb=function(){eN(this)},vX(XWn,"AbstractMapBasedMultimap/WrappedCollection/WrappedIterator",620),wAn(729,620,cVn,g$,gQ),MWn.Qb=function(){eN(this)},MWn.Rb=function(n){var t;t=0==tO(this.a),(MV(this),BB(this.b,125)).Rb(n),++this.a.a.d,t&&jR(this.a)},MWn.Sb=function(){return(MV(this),BB(this.b,125)).Sb()},MWn.Tb=function(){return(MV(this),BB(this.b,125)).Tb()},MWn.Ub=function(){return(MV(this),BB(this.b,125)).Ub()},MWn.Vb=function(){return(MV(this),BB(this.b,125)).Vb()},MWn.Wb=function(n){(MV(this),BB(this.b,125)).Wb(n)},vX(XWn,"AbstractMapBasedMultimap/WrappedList/WrappedListIterator",729),wAn(727,541,iVn,ND),MWn.Nc=function(){return zbn(this),this.d.Nc()},vX(XWn,"AbstractMapBasedMultimap/WrappedSortedSet",727),wAn(1095,727,rVn,AA),vX(XWn,"AbstractMapBasedMultimap/WrappedNavigableSet",1095),wAn(1094,541,tVn,xD),MWn.Nc=function(){return zbn(this),this.d.Nc()},vX(XWn,"AbstractMapBasedMultimap/WrappedSet",1094),wAn(1103,1,{},u),MWn.Kb=function(n){return F6(BB(n,42))},vX(XWn,"AbstractMapBasedMultimap/lambda$1$Type",1103),wAn(1102,1,{},Vf),MWn.Kb=function(n){return new vT(this.a,n)},vX(XWn,"AbstractMapBasedMultimap/lambda$2$Type",1102);var Knt,_nt,Fnt,Bnt,Hnt=bq(YWn,"Map/Entry");wAn(345,1,aVn),MWn.Fb=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),wW(this.cd(),t.cd())&&wW(this.dd(),t.dd()))},MWn.Hb=function(){var n,t;return n=this.cd(),t=this.dd(),(null==n?0:nsn(n))^(null==t?0:nsn(t))},MWn.ed=function(n){throw Hp(new pv)},MWn.Ib=function(){return this.cd()+"="+this.dd()},vX(XWn,uVn,345),wAn(1988,28,ZWn),MWn.$b=function(){this.fd().$b()},MWn.Hc=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),H0(this.fd(),t.cd(),t.dd()))},MWn.Mc=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),q0(this.fd(),t.cd(),t.dd()))},MWn.gc=function(){return this.fd().d},vX(XWn,"Multimaps/Entries",1988),wAn(733,1988,ZWn,Qf),MWn.Kc=function(){return this.a.kc()},MWn.fd=function(){return this.a},MWn.Nc=function(){return this.a.lc()},vX(XWn,"AbstractMultimap/Entries",733),wAn(734,733,tVn,qm),MWn.Nc=function(){return this.a.lc()},MWn.Fb=function(n){return zSn(this,n)},MWn.Hb=function(){return Brn(this)},vX(XWn,"AbstractMultimap/EntrySet",734),wAn(735,28,ZWn,Yf),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return Isn(this.a,n)},MWn.Kc=function(){return this.a.nc()},MWn.gc=function(){return this.a.d},MWn.Nc=function(){return this.a.oc()},vX(XWn,"AbstractMultimap/Values",735),wAn(1989,28,{835:1,20:1,28:1,14:1}),MWn.Jc=function(n){yX(n),EV(this).Jc(new pl(n))},MWn.Nc=function(){var n;return qTn(n=EV(this).Nc(),new y,64|1296&n.qd(),this.a.d)},MWn.Fc=function(n){return wk(),!0},MWn.Gc=function(n){return yX(this),yX(n),cL(n,543)?l2(BB(n,835)):!n.dc()&&fnn(this,n.Kc())},MWn.Hc=function(n){var t;return((t=BB(lfn(OQ(this.a),n),14))?t.gc():0)>0},MWn.Fb=function(n){return h$n(this,n)},MWn.Hb=function(){return nsn(EV(this))},MWn.dc=function(){return EV(this).dc()},MWn.Mc=function(n){return EIn(this,n,1)>0},MWn.Ib=function(){return Bbn(EV(this))},vX(XWn,"AbstractMultiset",1989),wAn(1991,1970,tVn),MWn.$b=function(){win(this.a.a)},MWn.Hc=function(n){var t;return!(!cL(n,492)||(t=BB(n,416),BB(t.a.dd(),14).gc()<=0||c1(this.a,t.a.cd())!=BB(t.a.dd(),14).gc()))},MWn.Mc=function(n){var t,e,i;return!(!cL(n,492)||(t=(e=BB(n,416)).a.cd(),0==(i=BB(e.a.dd(),14).gc())))&&TIn(this.a,t,i)},vX(XWn,"Multisets/EntrySet",1991),wAn(1109,1991,tVn,Jf),MWn.Kc=function(){return new wy(dz(OQ(this.a.a)).Kc())},MWn.gc=function(){return OQ(this.a.a).gc()},vX(XWn,"AbstractMultiset/EntrySet",1109),wAn(619,726,VWn),MWn.hc=function(){return this.gd()},MWn.jc=function(){return this.hd()},MWn.cc=function(n){return this.jd(n)},MWn.fc=function(n){return this.kd(n)},MWn.Zb=function(){return this.f||(this.f=this.ac())},MWn.hd=function(){return SQ(),SQ(),fet},MWn.Fb=function(n){return jsn(this,n)},MWn.jd=function(n){return BB(h6(this,n),21)},MWn.kd=function(n){return BB(Nhn(this,n),21)},MWn.mc=function(n){return SQ(),new Ak(BB(n,21))},MWn.pc=function(n,t){return new xD(this,n,BB(t,21))},vX(XWn,"AbstractSetMultimap",619),wAn(1657,619,VWn),MWn.hc=function(){return new dE(this.b)},MWn.gd=function(){return new dE(this.b)},MWn.jc=function(){return IX(new dE(this.b))},MWn.hd=function(){return IX(new dE(this.b))},MWn.cc=function(n){return BB(BB(h6(this,n),21),84)},MWn.jd=function(n){return BB(BB(h6(this,n),21),84)},MWn.fc=function(n){return BB(BB(Nhn(this,n),21),84)},MWn.kd=function(n){return BB(BB(Nhn(this,n),21),84)},MWn.mc=function(n){return cL(n,271)?IX(BB(n,271)):(SQ(),new dN(BB(n,84)))},MWn.Zb=function(){return this.f||(this.f=cL(this.c,171)?new ID(this,BB(this.c,171)):cL(this.c,161)?new CD(this,BB(this.c,161)):new pT(this,this.c))},MWn.pc=function(n,t){return cL(t,271)?new AA(this,n,BB(t,271)):new ND(this,n,BB(t,84))},vX(XWn,"AbstractSortedSetMultimap",1657),wAn(1658,1657,VWn),MWn.Zb=function(){return BB(BB(this.f||(this.f=cL(this.c,171)?new ID(this,BB(this.c,171)):cL(this.c,161)?new CD(this,BB(this.c,161)):new pT(this,this.c)),161),171)},MWn.ec=function(){return BB(BB(this.i||(this.i=cL(this.c,171)?new tT(this,BB(this.c,171)):cL(this.c,161)?new nT(this,BB(this.c,161)):new HL(this,this.c)),84),271)},MWn.bc=function(){return cL(this.c,171)?new tT(this,BB(this.c,171)):cL(this.c,161)?new nT(this,BB(this.c,161)):new HL(this,this.c)},vX(XWn,"AbstractSortedKeySortedSetMultimap",1658),wAn(2010,1,{1947:1}),MWn.Fb=function(n){return Cjn(this,n)},MWn.Hb=function(){return Hun(this.g||(this.g=new Zf(this)))},MWn.Ib=function(){return nTn(this.f||(this.f=new UL(this)))},vX(XWn,"AbstractTable",2010),wAn(665,nVn,tVn,Zf),MWn.$b=function(){dk()},MWn.Hc=function(n){var t,e;return!!cL(n,468)&&(t=BB(n,682),!!(e=BB(lfn(jX(this.a),WI(t.c.e,t.b)),83))&&wfn(e.vc(),new vT(WI(t.c.c,t.a),U6(t.c,t.b,t.a))))},MWn.Kc=function(){return ZQ(this.a)},MWn.Mc=function(n){var t,e;return!!cL(n,468)&&(t=BB(n,682),!!(e=BB(lfn(jX(this.a),WI(t.c.e,t.b)),83))&&dfn(e.vc(),new vT(WI(t.c.c,t.a),U6(t.c,t.b,t.a))))},MWn.gc=function(){return zq(this.a)},MWn.Nc=function(){return P2(this.a)},vX(XWn,"AbstractTable/CellSet",665),wAn(1928,28,ZWn,nl),MWn.$b=function(){dk()},MWn.Hc=function(n){return hTn(this.a,n)},MWn.Kc=function(){return nY(this.a)},MWn.gc=function(){return zq(this.a)},MWn.Nc=function(){return Y0(this.a)},vX(XWn,"AbstractTable/Values",1928),wAn(1632,1631,VWn),vX(XWn,"ArrayListMultimapGwtSerializationDependencies",1632),wAn(513,1632,VWn,ok,o1),MWn.hc=function(){return new J6(this.a)},MWn.a=0,vX(XWn,"ArrayListMultimap",513),wAn(664,2010,{664:1,1947:1,3:1},vOn),vX(XWn,"ArrayTable",664),wAn(1924,386,WWn,qL),MWn.Xb=function(n){return new gon(this.a,n)},vX(XWn,"ArrayTable/1",1924),wAn(1925,1,{},Gf),MWn.ld=function(n){return new gon(this.a,n)},vX(XWn,"ArrayTable/1methodref$getCell$Type",1925),wAn(2011,1,{682:1}),MWn.Fb=function(n){var t;return n===this||!!cL(n,468)&&(t=BB(n,682),wW(WI(this.c.e,this.b),WI(t.c.e,t.b))&&wW(WI(this.c.c,this.a),WI(t.c.c,t.a))&&wW(U6(this.c,this.b,this.a),U6(t.c,t.b,t.a)))},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[WI(this.c.e,this.b),WI(this.c.c,this.a),U6(this.c,this.b,this.a)]))},MWn.Ib=function(){return"("+WI(this.c.e,this.b)+","+WI(this.c.c,this.a)+")="+U6(this.c,this.b,this.a)},vX(XWn,"Tables/AbstractCell",2011),wAn(468,2011,{468:1,682:1},gon),MWn.a=0,MWn.b=0,MWn.d=0,vX(XWn,"ArrayTable/2",468),wAn(1927,1,{},zf),MWn.ld=function(n){return Y9(this.a,n)},vX(XWn,"ArrayTable/2methodref$getValue$Type",1927),wAn(1926,386,WWn,GL),MWn.Xb=function(n){return Y9(this.a,n)},vX(XWn,"ArrayTable/3",1926),wAn(1979,1967,JWn),MWn.$b=function(){Cq(this.kc())},MWn.vc=function(){return new ml(this)},MWn.lc=function(){return new CV(this.kc(),this.gc())},vX(XWn,"Maps/IteratorBasedAbstractMap",1979),wAn(828,1979,JWn),MWn.$b=function(){throw Hp(new pv)},MWn._b=function(n){return Yj(this.c,n)},MWn.kc=function(){return new zL(this,this.c.b.c.gc())},MWn.lc=function(){return yq(this.c.b.c.gc(),16,new Uf(this))},MWn.xc=function(n){var t;return(t=BB(UK(this.c,n),19))?this.nd(t.a):null},MWn.dc=function(){return this.c.b.c.dc()},MWn.ec=function(){return bz(this.c)},MWn.zc=function(n,t){var e;if(!(e=BB(UK(this.c,n),19)))throw Hp(new _y(this.md()+" "+n+" not in "+bz(this.c)));return this.od(e.a,t)},MWn.Bc=function(n){throw Hp(new pv)},MWn.gc=function(){return this.c.b.c.gc()},vX(XWn,"ArrayTable/ArrayMap",828),wAn(1923,1,{},Uf),MWn.ld=function(n){return OX(this.a,n)},vX(XWn,"ArrayTable/ArrayMap/0methodref$getEntry$Type",1923),wAn(1921,345,aVn,sT),MWn.cd=function(){return YL(this.a,this.b)},MWn.dd=function(){return this.a.nd(this.b)},MWn.ed=function(n){return this.a.od(this.b,n)},MWn.b=0,vX(XWn,"ArrayTable/ArrayMap/1",1921),wAn(1922,386,WWn,zL),MWn.Xb=function(n){return OX(this.a,n)},vX(XWn,"ArrayTable/ArrayMap/2",1922),wAn(1920,828,JWn,cU),MWn.md=function(){return"Column"},MWn.nd=function(n){return U6(this.b,this.a,n)},MWn.od=function(n,t){return Sun(this.b,this.a,n,t)},MWn.a=0,vX(XWn,"ArrayTable/Row",1920),wAn(829,828,JWn,UL),MWn.nd=function(n){return new cU(this.a,n)},MWn.zc=function(n,t){return BB(t,83),gk()},MWn.od=function(n,t){return BB(t,83),pk()},MWn.md=function(){return"Row"},vX(XWn,"ArrayTable/RowMap",829),wAn(1120,1,fVn,hT),MWn.qd=function(){return-262&this.a.qd()},MWn.rd=function(){return this.a.rd()},MWn.Nb=function(n){this.a.Nb(new cT(n,this.b))},MWn.sd=function(n){return this.a.sd(new rT(n,this.b))},vX(XWn,"CollectSpliterators/1",1120),wAn(1121,1,lVn,rT),MWn.td=function(n){this.a.td(this.b.Kb(n))},vX(XWn,"CollectSpliterators/1/lambda$0$Type",1121),wAn(1122,1,lVn,cT),MWn.td=function(n){this.a.td(this.b.Kb(n))},vX(XWn,"CollectSpliterators/1/lambda$1$Type",1122),wAn(1123,1,fVn,q2),MWn.qd=function(){return this.a},MWn.rd=function(){return this.d&&(this.b=T$(this.b,this.d.rd())),T$(this.b,0)},MWn.Nb=function(n){this.d&&(this.d.Nb(n),this.d=null),this.c.Nb(new iT(this.e,n)),this.b=0},MWn.sd=function(n){for(;;){if(this.d&&this.d.sd(n))return JI(this.b,bVn)&&(this.b=ibn(this.b,1)),!0;if(this.d=null,!this.c.sd(new aT(this,this.e)))return!1}},MWn.a=0,MWn.b=0,vX(XWn,"CollectSpliterators/1FlatMapSpliterator",1123),wAn(1124,1,lVn,aT),MWn.td=function(n){dK(this.a,this.b,n)},vX(XWn,"CollectSpliterators/1FlatMapSpliterator/lambda$0$Type",1124),wAn(1125,1,lVn,iT),MWn.td=function(n){oL(this.b,this.a,n)},vX(XWn,"CollectSpliterators/1FlatMapSpliterator/lambda$1$Type",1125),wAn(1117,1,fVn,wK),MWn.qd=function(){return 16464|this.b},MWn.rd=function(){return this.a.rd()},MWn.Nb=function(n){this.a.xe(new oT(n,this.c))},MWn.sd=function(n){return this.a.ye(new uT(n,this.c))},MWn.b=0,vX(XWn,"CollectSpliterators/1WithCharacteristics",1117),wAn(1118,1,wVn,uT),MWn.ud=function(n){this.a.td(this.b.ld(n))},vX(XWn,"CollectSpliterators/1WithCharacteristics/lambda$0$Type",1118),wAn(1119,1,wVn,oT),MWn.ud=function(n){this.a.td(this.b.ld(n))},vX(XWn,"CollectSpliterators/1WithCharacteristics/lambda$1$Type",1119),wAn(245,1,dVn),MWn.wd=function(n){return this.vd(BB(n,245))},MWn.vd=function(n){var t;return n==(ty(),_nt)?1:n==(ey(),Knt)?-1:(nq(),0!=(t=Ncn(this.a,n.a))?t:cL(this,519)==cL(n,519)?0:cL(this,519)?1:-1)},MWn.zd=function(){return this.a},MWn.Fb=function(n){return xdn(this,n)},vX(XWn,"Cut",245),wAn(1761,245,dVn,Nk),MWn.vd=function(n){return n==this?0:1},MWn.xd=function(n){throw Hp(new hv)},MWn.yd=function(n){n.a+="+\u221e)"},MWn.zd=function(){throw Hp(new Fy(gVn))},MWn.Hb=function(){return $T(),evn(this)},MWn.Ad=function(n){return!1},MWn.Ib=function(){return"+\u221e"},vX(XWn,"Cut/AboveAll",1761),wAn(519,245,{245:1,519:1,3:1,35:1},iN),MWn.xd=function(n){uO((n.a+="(",n),this.a)},MWn.yd=function(n){xX(uO(n,this.a),93)},MWn.Hb=function(){return~nsn(this.a)},MWn.Ad=function(n){return nq(),Ncn(this.a,n)<0},MWn.Ib=function(){return"/"+this.a+"\\"},vX(XWn,"Cut/AboveValue",519),wAn(1760,245,dVn,xk),MWn.vd=function(n){return n==this?0:-1},MWn.xd=function(n){n.a+="(-\u221e"},MWn.yd=function(n){throw Hp(new hv)},MWn.zd=function(){throw Hp(new Fy(gVn))},MWn.Hb=function(){return $T(),evn(this)},MWn.Ad=function(n){return!0},MWn.Ib=function(){return"-\u221e"},vX(XWn,"Cut/BelowAll",1760),wAn(1762,245,dVn,rN),MWn.xd=function(n){uO((n.a+="[",n),this.a)},MWn.yd=function(n){xX(uO(n,this.a),41)},MWn.Hb=function(){return nsn(this.a)},MWn.Ad=function(n){return nq(),Ncn(this.a,n)<=0},MWn.Ib=function(){return"\\"+this.a+"/"},vX(XWn,"Cut/BelowValue",1762),wAn(537,1,pVn),MWn.Jc=function(n){e5(this,n)},MWn.Ib=function(){return Hln(BB(WQ(this,"use Optional.orNull() instead of Optional.or(null)"),20).Kc())},vX(XWn,"FluentIterable",537),wAn(433,537,pVn,OO),MWn.Kc=function(){return new oz(ZL(this.a.Kc(),new h))},vX(XWn,"FluentIterable/2",433),wAn(1046,537,pVn,AO),MWn.Kc=function(){return NU(this)},vX(XWn,"FluentIterable/3",1046),wAn(708,386,WWn,WL),MWn.Xb=function(n){return this.a[n].Kc()},vX(XWn,"FluentIterable/3/1",708),wAn(1972,1,{}),MWn.Ib=function(){return Bbn(this.Bd().b)},vX(XWn,"ForwardingObject",1972),wAn(1973,1972,vVn),MWn.Bd=function(){return this.Cd()},MWn.Jc=function(n){e5(this,n)},MWn.Lc=function(){return this.Oc()},MWn.Nc=function(){return new w1(this,0)},MWn.Oc=function(){return new Rq(null,this.Nc())},MWn.Fc=function(n){return this.Cd(),oE()},MWn.Gc=function(n){return this.Cd(),sE()},MWn.$b=function(){this.Cd(),hE()},MWn.Hc=function(n){return this.Cd().Hc(n)},MWn.Ic=function(n){return this.Cd().Ic(n)},MWn.dc=function(){return this.Cd().b.dc()},MWn.Kc=function(){return this.Cd().Kc()},MWn.Mc=function(n){return this.Cd(),fE()},MWn.gc=function(){return this.Cd().b.gc()},MWn.Pc=function(){return this.Cd().Pc()},MWn.Qc=function(n){return this.Cd().Qc(n)},vX(XWn,"ForwardingCollection",1973),wAn(1980,28,mVn),MWn.Kc=function(){return this.Ed()},MWn.Fc=function(n){throw Hp(new pv)},MWn.Gc=function(n){throw Hp(new pv)},MWn.$b=function(){throw Hp(new pv)},MWn.Hc=function(n){return null!=n&&ywn(this,n,!1)},MWn.Dd=function(){switch(this.gc()){case 0:return WX(),WX(),Fnt;case 1:return WX(),new Pq(yX(this.Ed().Pb()));default:return new aU(this,this.Pc())}},MWn.Mc=function(n){throw Hp(new pv)},vX(XWn,"ImmutableCollection",1980),wAn(712,1980,mVn,rv),MWn.Kc=function(){return L9(this.a.Kc())},MWn.Hc=function(n){return null!=n&&this.a.Hc(n)},MWn.Ic=function(n){return this.a.Ic(n)},MWn.dc=function(){return this.a.dc()},MWn.Ed=function(){return L9(this.a.Kc())},MWn.gc=function(){return this.a.gc()},MWn.Pc=function(){return this.a.Pc()},MWn.Qc=function(n){return this.a.Qc(n)},MWn.Ib=function(){return Bbn(this.a)},vX(XWn,"ForwardingImmutableCollection",712),wAn(152,1980,yVn),MWn.Kc=function(){return this.Ed()},MWn.Yc=function(){return this.Fd(0)},MWn.Zc=function(n){return this.Fd(n)},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.bd=function(n,t){return this.Gd(n,t)},MWn.Vc=function(n,t){throw Hp(new pv)},MWn.Wc=function(n,t){throw Hp(new pv)},MWn.Fb=function(n){return qAn(this,n)},MWn.Hb=function(){return Ian(this)},MWn.Xc=function(n){return null==n?-1:Tmn(this,n)},MWn.Ed=function(){return this.Fd(0)},MWn.Fd=function(n){return ix(this,n)},MWn.$c=function(n){throw Hp(new pv)},MWn._c=function(n,t){throw Hp(new pv)},MWn.Gd=function(n,t){return sfn(new s1(new IT(this),n,t))},vX(XWn,"ImmutableList",152),wAn(2006,152,yVn),MWn.Kc=function(){return L9(this.Hd().Kc())},MWn.bd=function(n,t){return sfn(this.Hd().bd(n,t))},MWn.Hc=function(n){return null!=n&&this.Hd().Hc(n)},MWn.Ic=function(n){return this.Hd().Ic(n)},MWn.Fb=function(n){return Nfn(this.Hd(),n)},MWn.Xb=function(n){return WI(this,n)},MWn.Hb=function(){return nsn(this.Hd())},MWn.Xc=function(n){return this.Hd().Xc(n)},MWn.dc=function(){return this.Hd().dc()},MWn.Ed=function(){return L9(this.Hd().Kc())},MWn.gc=function(){return this.Hd().gc()},MWn.Gd=function(n,t){return sfn(this.Hd().bd(n,t))},MWn.Pc=function(){return this.Hd().Qc(x8(Ant,HWn,1,this.Hd().gc(),5,1))},MWn.Qc=function(n){return this.Hd().Qc(n)},MWn.Ib=function(){return Bbn(this.Hd())},vX(XWn,"ForwardingImmutableList",2006),wAn(714,1,jVn),MWn.vc=function(){return lz(this)},MWn.wc=function(n){nan(this,n)},MWn.ec=function(){return bz(this)},MWn.yc=function(n,t,e){return Zln(this,n,t,e)},MWn.Cc=function(){return this.Ld()},MWn.$b=function(){throw Hp(new pv)},MWn._b=function(n){return null!=this.xc(n)},MWn.uc=function(n){return this.Ld().Hc(n)},MWn.Jd=function(){return new cv(this)},MWn.Kd=function(){return new av(this)},MWn.Fb=function(n){return $sn(this,n)},MWn.Hb=function(){return lz(this).Hb()},MWn.dc=function(){return 0==this.gc()},MWn.zc=function(n,t){return vk()},MWn.Bc=function(n){throw Hp(new pv)},MWn.Ib=function(){return fSn(this)},MWn.Ld=function(){return this.e?this.e:this.e=this.Kd()},MWn.c=null,MWn.d=null,MWn.e=null,vX(XWn,"ImmutableMap",714),wAn(715,714,jVn),MWn._b=function(n){return Yj(this,n)},MWn.uc=function(n){return _T(this.b,n)},MWn.Id=function(){return hfn(new el(this))},MWn.Jd=function(){return hfn(iV(this.b))},MWn.Kd=function(){return s_(),new rv(tV(this.b))},MWn.Fb=function(n){return BT(this.b,n)},MWn.xc=function(n){return UK(this,n)},MWn.Hb=function(){return nsn(this.b.c)},MWn.dc=function(){return this.b.c.dc()},MWn.gc=function(){return this.b.c.gc()},MWn.Ib=function(){return Bbn(this.b.c)},vX(XWn,"ForwardingImmutableMap",715),wAn(1974,1973,EVn),MWn.Bd=function(){return this.Md()},MWn.Cd=function(){return this.Md()},MWn.Nc=function(){return new w1(this,1)},MWn.Fb=function(n){return n===this||this.Md().Fb(n)},MWn.Hb=function(){return this.Md().Hb()},vX(XWn,"ForwardingSet",1974),wAn(1069,1974,EVn,el),MWn.Bd=function(){return eV(this.a.b)},MWn.Cd=function(){return eV(this.a.b)},MWn.Hc=function(n){if(cL(n,42)&&null==BB(n,42).cd())return!1;try{return KT(eV(this.a.b),n)}catch(t){if(cL(t=lun(t),205))return!1;throw Hp(t)}},MWn.Md=function(){return eV(this.a.b)},MWn.Qc=function(n){var t;return t=IY(eV(this.a.b),n),eV(this.a.b).b.gc()<t.length&&$X(t,eV(this.a.b).b.gc(),null),t},vX(XWn,"ForwardingImmutableMap/1",1069),wAn(1981,1980,TVn),MWn.Kc=function(){return this.Ed()},MWn.Nc=function(){return new w1(this,1)},MWn.Fb=function(n){return zSn(this,n)},MWn.Hb=function(){return Brn(this)},vX(XWn,"ImmutableSet",1981),wAn(703,1981,TVn),MWn.Kc=function(){return L9(new qb(this.a.b.Kc()))},MWn.Hc=function(n){return null!=n&&xT(this.a,n)},MWn.Ic=function(n){return DT(this.a,n)},MWn.Hb=function(){return nsn(this.a.b)},MWn.dc=function(){return this.a.b.dc()},MWn.Ed=function(){return L9(new qb(this.a.b.Kc()))},MWn.gc=function(){return this.a.b.gc()},MWn.Pc=function(){return this.a.b.Pc()},MWn.Qc=function(n){return RT(this.a,n)},MWn.Ib=function(){return Bbn(this.a.b)},vX(XWn,"ForwardingImmutableSet",703),wAn(1975,1974,MVn),MWn.Bd=function(){return this.b},MWn.Cd=function(){return this.b},MWn.Md=function(){return this.b},MWn.Nc=function(){return new wS(this)},vX(XWn,"ForwardingSortedSet",1975),wAn(533,1979,jVn,Avn),MWn.Ac=function(n){Tcn(this,n)},MWn.Cc=function(){return new p$(this.d||(this.d=new il(this)))},MWn.$b=function(){d5(this)},MWn._b=function(n){return!!Jrn(this,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))))},MWn.uc=function(n){return Ltn(this,n)},MWn.kc=function(){return new VL(this,this)},MWn.wc=function(n){BJ(this,n)},MWn.xc=function(n){return sen(this,n)},MWn.ec=function(){return new v$(this)},MWn.zc=function(n,t){return wKn(this,n,t)},MWn.Bc=function(n){var t;return(t=Jrn(this,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15)))))?(LLn(this,t),t.e=null,t.c=null,t.i):null},MWn.gc=function(){return this.i},MWn.pd=function(){return new p$(this.d||(this.d=new il(this)))},MWn.f=0,MWn.g=0,MWn.i=0,vX(XWn,"HashBiMap",533),wAn(534,1,QWn),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return l3(this)},MWn.Pb=function(){var n;if(!l3(this))throw Hp(new yv);return n=this.c,this.c=n.c,this.f=n,--this.d,this.Nd(n)},MWn.Qb=function(){if(this.e.g!=this.b)throw Hp(new vv);han(!!this.f),LLn(this.e,this.f),this.b=this.e.g,this.f=null},MWn.b=0,MWn.d=0,MWn.f=null,vX(XWn,"HashBiMap/Itr",534),wAn(1011,534,QWn,VL),MWn.Nd=function(n){return new bT(this,n)},vX(XWn,"HashBiMap/1",1011),wAn(1012,345,aVn,bT),MWn.cd=function(){return this.a.g},MWn.dd=function(){return this.a.i},MWn.ed=function(n){var t,e,i;return e=this.a.i,(i=dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))))==this.a.f&&(GI(n)===GI(e)||null!=n&&Nfn(n,e))?n:(yun(!Zrn(this.b.a,n,i),n),LLn(this.b.a,this.a),t=new qW(this.a.g,this.a.a,n,i),YCn(this.b.a,t,this.a),this.a.e=null,this.a.c=null,this.b.b=this.b.a.g,this.b.f==this.a&&(this.b.f=t),this.a=t,e)},vX(XWn,"HashBiMap/1/MapEntry",1012),wAn(238,345,{345:1,238:1,3:1,42:1},vT),MWn.cd=function(){return this.g},MWn.dd=function(){return this.i},MWn.ed=function(n){throw Hp(new pv)},vX(XWn,"ImmutableEntry",238),wAn(317,238,{345:1,317:1,238:1,3:1,42:1},qW),MWn.a=0,MWn.f=0;var qnt,Gnt=vX(XWn,"HashBiMap/BiEntry",317);wAn(610,1979,jVn,il),MWn.Ac=function(n){Tcn(this,n)},MWn.Cc=function(){return new v$(this.a)},MWn.$b=function(){d5(this.a)},MWn._b=function(n){return Ltn(this.a,n)},MWn.kc=function(){return new QL(this,this.a)},MWn.wc=function(n){yX(n),BJ(this.a,new rl(n))},MWn.xc=function(n){return Uin(this,n)},MWn.ec=function(){return new p$(this)},MWn.zc=function(n,t){return C_n(this.a,n,t,!1)},MWn.Bc=function(n){var t;return(t=Zrn(this.a,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15)))))?(LLn(this.a,t),t.e=null,t.c=null,t.g):null},MWn.gc=function(){return this.a.i},MWn.pd=function(){return new v$(this.a)},vX(XWn,"HashBiMap/Inverse",610),wAn(1008,534,QWn,QL),MWn.Nd=function(n){return new wT(this,n)},vX(XWn,"HashBiMap/Inverse/1",1008),wAn(1009,345,aVn,wT),MWn.cd=function(){return this.a.i},MWn.dd=function(){return this.a.g},MWn.ed=function(n){var t,e,i;return i=this.a.g,(t=dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))))==this.a.a&&(GI(n)===GI(i)||null!=n&&Nfn(n,i))?n:(yun(!Jrn(this.b.a.a,n,t),n),LLn(this.b.a.a,this.a),e=new qW(n,t,this.a.i,this.a.f),this.a=e,YCn(this.b.a.a,e,null),this.b.b=this.b.a.a.g,i)},vX(XWn,"HashBiMap/Inverse/1/InverseEntry",1009),wAn(611,532,tVn,p$),MWn.Kc=function(){return new uy(this.a.a)},MWn.Mc=function(n){var t;return!!(t=Zrn(this.a.a,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15)))))&&(LLn(this.a.a,t),!0)},vX(XWn,"HashBiMap/Inverse/InverseKeySet",611),wAn(1007,534,QWn,uy),MWn.Nd=function(n){return n.i},vX(XWn,"HashBiMap/Inverse/InverseKeySet/1",1007),wAn(1010,1,{},rl),MWn.Od=function(n,t){ev(this.a,n,t)},vX(XWn,"HashBiMap/Inverse/lambda$0$Type",1010),wAn(609,532,tVn,v$),MWn.Kc=function(){return new oy(this.a)},MWn.Mc=function(n){var t;return!!(t=Jrn(this.a,n,dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15)))))&&(LLn(this.a,t),t.e=null,t.c=null,!0)},vX(XWn,"HashBiMap/KeySet",609),wAn(1006,534,QWn,oy),MWn.Nd=function(n){return n.g},vX(XWn,"HashBiMap/KeySet/1",1006),wAn(1093,619,VWn),vX(XWn,"HashMultimapGwtSerializationDependencies",1093),wAn(265,1093,VWn,pJ),MWn.hc=function(){return new bE(etn(this.a))},MWn.gd=function(){return new bE(etn(this.a))},MWn.a=2,vX(XWn,"HashMultimap",265),wAn(1999,152,yVn),MWn.Hc=function(n){return this.Pd().Hc(n)},MWn.dc=function(){return this.Pd().dc()},MWn.gc=function(){return this.Pd().gc()},vX(XWn,"ImmutableAsList",1999),wAn(1931,715,jVn),MWn.Ld=function(){return s_(),new yk(this.a)},MWn.Cc=function(){return s_(),new yk(this.a)},MWn.pd=function(){return s_(),new yk(this.a)},vX(XWn,"ImmutableBiMap",1931),wAn(1977,1,{}),vX(XWn,"ImmutableCollection/Builder",1977),wAn(1022,703,TVn,sy),vX(XWn,"ImmutableEnumSet",1022),wAn(969,386,WWn,bK),MWn.Xb=function(n){return this.a.Xb(n)},vX(XWn,"ImmutableList/1",969),wAn(968,1977,{},sR),vX(XWn,"ImmutableList/Builder",968),wAn(614,198,UWn,cl),MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return BB(this.a.Pb(),42).cd()},vX(XWn,"ImmutableMap/1",614),wAn(1041,1,{},o),MWn.Kb=function(n){return BB(n,42).cd()},vX(XWn,"ImmutableMap/2methodref$getKey$Type",1041),wAn(1040,1,{},hR),vX(XWn,"ImmutableMap/Builder",1040),wAn(2e3,1981,TVn),MWn.Kc=function(){return new cl(lz(this.a).Ed())},MWn.Dd=function(){return new uv(this)},MWn.Jc=function(n){var t,e;for(yX(n),e=this.gc(),t=0;t<e;t++)n.td(BB(wz(lz(this.a)).Xb(t),42).cd())},MWn.Ed=function(){var n;return(n=this.c,n||(this.c=new uv(this))).Ed()},MWn.Nc=function(){return yq(this.gc(),1296,new ul(this))},vX(XWn,"IndexedImmutableSet",2e3),wAn(1180,2e3,TVn,cv),MWn.Kc=function(){return new cl(lz(this.a).Ed())},MWn.Hc=function(n){return this.a._b(n)},MWn.Jc=function(n){yX(n),nan(this.a,new al(n))},MWn.Ed=function(){return new cl(lz(this.a).Ed())},MWn.gc=function(){return this.a.gc()},MWn.Nc=function(){return RB(lz(this.a).Nc(),new o)},vX(XWn,"ImmutableMapKeySet",1180),wAn(1181,1,{},al),MWn.Od=function(n,t){s_(),this.a.td(n)},vX(XWn,"ImmutableMapKeySet/lambda$0$Type",1181),wAn(1178,1980,mVn,av),MWn.Kc=function(){return new KH(this)},MWn.Hc=function(n){return null!=n&&Pjn(new KH(this),n)},MWn.Ed=function(){return new KH(this)},MWn.gc=function(){return this.a.gc()},MWn.Nc=function(){return RB(lz(this.a).Nc(),new s)},vX(XWn,"ImmutableMapValues",1178),wAn(1179,1,{},s),MWn.Kb=function(n){return BB(n,42).dd()},vX(XWn,"ImmutableMapValues/0methodref$getValue$Type",1179),wAn(626,198,UWn,KH),MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return BB(this.a.Pb(),42).dd()},vX(XWn,"ImmutableMapValues/1",626),wAn(1182,1,{},ul),MWn.ld=function(n){return HU(this.a,n)},vX(XWn,"IndexedImmutableSet/0methodref$get$Type",1182),wAn(752,1999,yVn,uv),MWn.Pd=function(){return this.a},MWn.Xb=function(n){return HU(this.a,n)},MWn.gc=function(){return this.a.a.gc()},vX(XWn,"IndexedImmutableSet/1",752),wAn(44,1,{},h),MWn.Kb=function(n){return BB(n,20).Kc()},MWn.Fb=function(n){return this===n},vX(XWn,"Iterables/10",44),wAn(1042,537,pVn,_H),MWn.Jc=function(n){yX(n),this.b.Jc(new dT(this.a,n))},MWn.Kc=function(){return qA(this)},vX(XWn,"Iterables/4",1042),wAn(1043,1,lVn,dT),MWn.td=function(n){TS(this.b,this.a,n)},vX(XWn,"Iterables/4/lambda$0$Type",1043),wAn(1044,537,pVn,FH),MWn.Jc=function(n){yX(n),e5(this.a,new fT(n,this.b))},MWn.Kc=function(){return ZL(new AL(this.a),this.b)},vX(XWn,"Iterables/5",1044),wAn(1045,1,lVn,fT),MWn.td=function(n){this.a.td(yA(n))},vX(XWn,"Iterables/5/lambda$0$Type",1045),wAn(1071,198,UWn,ol),MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return this.a.Pb()},vX(XWn,"Iterators/1",1071),wAn(1072,699,UWn,lT),MWn.Yb=function(){for(var n;this.b.Ob();)if(n=this.b.Pb(),this.a.Lb(n))return n;return this.e=2,null},vX(XWn,"Iterators/5",1072),wAn(487,1,QWn),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.b.Ob()},MWn.Pb=function(){return this.Qd(this.b.Pb())},MWn.Qb=function(){this.b.Qb()},vX(XWn,"TransformedIterator",487),wAn(1073,487,QWn,nN),MWn.Qd=function(n){return this.a.Kb(n)},vX(XWn,"Iterators/6",1073),wAn(717,198,UWn,sl),MWn.Ob=function(){return!this.a},MWn.Pb=function(){if(this.a)throw Hp(new yv);return this.a=!0,this.b},MWn.a=!1,vX(XWn,"Iterators/9",717),wAn(1070,386,WWn,fG),MWn.Xb=function(n){return this.a[this.b+n]},MWn.b=0,vX(XWn,"Iterators/ArrayItr",1070),wAn(39,1,{39:1,47:1},oz),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return dAn(this)},MWn.Pb=function(){return U5(this)},MWn.Qb=function(){han(!!this.c),this.c.Qb(),this.c=null},vX(XWn,"Iterators/ConcatenatedIterator",39),wAn(22,1,{3:1,35:1,22:1}),MWn.wd=function(n){return Py(this,BB(n,22))},MWn.Fb=function(n){return this===n},MWn.Hb=function(){return PN(this)},MWn.Ib=function(){return dx(this)},MWn.g=0;var znt,Unt=vX(RWn,"Enum",22);wAn(538,22,{538:1,3:1,35:1,22:1,47:1},cN),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return!1},MWn.Pb=function(){throw Hp(new yv)},MWn.Qb=function(){han(!1)};var Xnt,Wnt=Ben(XWn,"Iterators/EmptyModifiableIterator",538,Unt,oX,rx);wAn(1834,619,VWn),vX(XWn,"LinkedHashMultimapGwtSerializationDependencies",1834),wAn(1835,1834,VWn,Thn),MWn.hc=function(){return new LN(etn(this.b))},MWn.$b=function(){win(this),iv(this.a,this.a)},MWn.gd=function(){return new LN(etn(this.b))},MWn.ic=function(n){return new Tsn(this,n,this.b)},MWn.kc=function(){return new tN(this)},MWn.lc=function(){return new w1(BB(this.g||(this.g=new qm(this)),21),17)},MWn.ec=function(){return this.i||(this.i=new HL(this,this.c))},MWn.nc=function(){return new by(new tN(this))},MWn.oc=function(){return RB(new w1(BB(this.g||(this.g=new qm(this)),21),17),new f)},MWn.b=2,vX(XWn,"LinkedHashMultimap",1835),wAn(1838,1,{},f),MWn.Kb=function(n){return BB(n,42).dd()},vX(XWn,"LinkedHashMultimap/0methodref$getValue$Type",1838),wAn(824,1,QWn,tN),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return vtn(this)},MWn.Ob=function(){return this.a!=this.b.a},MWn.Qb=function(){han(!!this.c),q0(this.b,this.c.g,this.c.i),this.c=null},vX(XWn,"LinkedHashMultimap/1",824),wAn(330,238,{345:1,238:1,330:1,2020:1,3:1,42:1},HW),MWn.Rd=function(){return this.f},MWn.Sd=function(n){this.c=n},MWn.Td=function(n){this.f=n},MWn.d=0;var Vnt,Qnt=vX(XWn,"LinkedHashMultimap/ValueEntry",330);wAn(1836,1970,{2020:1,20:1,28:1,14:1,21:1},Tsn),MWn.Fc=function(n){var t,e,i,r,c;for(t=(c=dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))))&this.b.length-1,e=r=this.b[t];e;e=e.a)if(e.d==c&&wW(e.i,n))return!1;return i=new HW(this.c,n,c,r),kk(this.d,i),i.f=this,this.d=i,iv(this.g.a.b,i),iv(i,this.g.a),this.b[t]=i,++this.f,++this.e,yjn(this),!0},MWn.$b=function(){var n,t;for(yS(this.b,null),this.f=0,n=this.a;n!=this;n=n.Rd())iv((t=BB(n,330)).b,t.e);this.a=this,this.d=this,++this.e},MWn.Hc=function(n){var t,e;for(e=dG(cbn(SVn,rV(dG(cbn(null==n?0:nsn(n),PVn)),15))),t=this.b[e&this.b.length-1];t;t=t.a)if(t.d==e&&wW(t.i,n))return!0;return!1},MWn.Jc=function(n){var t;for(yX(n),t=this.a;t!=this;t=t.Rd())n.td(BB(t,330).i)},MWn.Rd=function(){return this.a},MWn.Kc=function(){return new sW(this)},MWn.Mc=function(n){return kAn(this,n)},MWn.Sd=function(n){this.d=n},MWn.Td=function(n){this.a=n},MWn.gc=function(){return this.f},MWn.e=0,MWn.f=0,vX(XWn,"LinkedHashMultimap/ValueSet",1836),wAn(1837,1,QWn,sW),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return wG(this),this.b!=this.c},MWn.Pb=function(){var n,t;if(wG(this),this.b==this.c)throw Hp(new yv);return t=(n=BB(this.b,330)).i,this.d=n,this.b=n.f,t},MWn.Qb=function(){wG(this),han(!!this.d),kAn(this.c,this.d.i),this.a=this.c.e,this.d=null},MWn.a=0,vX(XWn,"LinkedHashMultimap/ValueSet/1",1837),wAn(766,1986,VWn,PO),MWn.Zb=function(){return this.f||(this.f=new rS(this))},MWn.Fb=function(n){return jsn(this,n)},MWn.cc=function(n){return new mT(this,n)},MWn.fc=function(n){return J3(this,n)},MWn.$b=function(){cX(this)},MWn._b=function(n){return HT(this,n)},MWn.ac=function(){return new rS(this)},MWn.bc=function(){return new yl(this)},MWn.qc=function(n){return new mT(this,n)},MWn.dc=function(){return!this.a},MWn.rc=function(n){return J3(this,n)},MWn.gc=function(){return this.d},MWn.c=0,MWn.d=0,vX(XWn,"LinkedListMultimap",766),wAn(52,28,LVn),MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Vc=function(n,t){throw Hp(new tk("Add not supported on this list"))},MWn.Fc=function(n){return this.Vc(this.gc(),n),!0},MWn.Wc=function(n,t){var e,i,r;for(kW(t),e=!1,r=t.Kc();r.Ob();)i=r.Pb(),this.Vc(n++,i),e=!0;return e},MWn.$b=function(){this.Ud(0,this.gc())},MWn.Fb=function(n){return NAn(this,n)},MWn.Hb=function(){return Fon(this)},MWn.Xc=function(n){return bin(this,n)},MWn.Kc=function(){return new Sb(this)},MWn.Yc=function(){return this.Zc(0)},MWn.Zc=function(n){return new M2(this,n)},MWn.$c=function(n){throw Hp(new tk("Remove not supported on this list"))},MWn.Ud=function(n,t){var e,i;for(i=this.Zc(n),e=n;e<t;++e)i.Pb(),i.Qb()},MWn._c=function(n,t){throw Hp(new tk("Set not supported on this list"))},MWn.bd=function(n,t){return new s1(this,n,t)},MWn.j=0,vX(YWn,"AbstractList",52),wAn(1964,52,LVn),MWn.Vc=function(n,t){Kx(this,n,t)},MWn.Wc=function(n,t){return Asn(this,n,t)},MWn.Xb=function(n){return Dpn(this,n)},MWn.Kc=function(){return this.Zc(0)},MWn.$c=function(n){return tkn(this,n)},MWn._c=function(n,t){var e,i;e=this.Zc(n);try{return i=e.Pb(),e.Wb(t),i}catch(r){throw cL(r=lun(r),109)?Hp(new Ay("Can't set element "+n)):Hp(r)}},vX(YWn,"AbstractSequentialList",1964),wAn(636,1964,LVn,mT),MWn.Zc=function(n){return vN(this,n)},MWn.gc=function(){var n;return(n=BB(RX(this.a.b,this.b),283))?n.a:0},vX(XWn,"LinkedListMultimap/1",636),wAn(1297,1970,tVn,yl),MWn.Hc=function(n){return HT(this.a,n)},MWn.Kc=function(){return new vrn(this.a)},MWn.Mc=function(n){return!J3(this.a,n).a.dc()},MWn.gc=function(){return NT(this.a.b)},vX(XWn,"LinkedListMultimap/1KeySetImpl",1297),wAn(1296,1,QWn,vrn),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return bG(this),!!this.c},MWn.Pb=function(){bG(this),oN(this.c),this.a=this.c,TU(this.d,this.a.a);do{this.c=this.c.b}while(this.c&&!TU(this.d,this.c.a));return this.a.a},MWn.Qb=function(){bG(this),han(!!this.a),Cq(new C7(this.e,this.a.a)),this.a=null,this.b=this.e.c},MWn.b=0,vX(XWn,"LinkedListMultimap/DistinctKeyIterator",1296),wAn(283,1,{283:1},sY),MWn.a=0,vX(XWn,"LinkedListMultimap/KeyList",283),wAn(1295,345,aVn,yT),MWn.cd=function(){return this.a},MWn.dd=function(){return this.f},MWn.ed=function(n){var t;return t=this.f,this.f=n,t},vX(XWn,"LinkedListMultimap/Node",1295),wAn(560,1,cVn,C7,KPn),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){this.e=yKn(this.f,this.b,n,this.c),++this.d,this.a=null},MWn.Ob=function(){return!!this.c},MWn.Sb=function(){return!!this.e},MWn.Pb=function(){return EZ(this)},MWn.Tb=function(){return this.d},MWn.Ub=function(){return TZ(this)},MWn.Vb=function(){return this.d-1},MWn.Qb=function(){han(!!this.a),this.a!=this.c?(this.e=this.a.e,--this.d):this.c=this.a.c,ZCn(this.f,this.a),this.a=null},MWn.Wb=function(n){uN(!!this.a),this.a.f=n},MWn.d=0,vX(XWn,"LinkedListMultimap/ValueForKeyIterator",560),wAn(1018,52,LVn),MWn.Vc=function(n,t){this.a.Vc(n,t)},MWn.Wc=function(n,t){return this.a.Wc(n,t)},MWn.Hc=function(n){return this.a.Hc(n)},MWn.Xb=function(n){return this.a.Xb(n)},MWn.$c=function(n){return this.a.$c(n)},MWn._c=function(n,t){return this.a._c(n,t)},MWn.gc=function(){return this.a.gc()},vX(XWn,"Lists/AbstractListWrapper",1018),wAn(1019,1018,xVn),vX(XWn,"Lists/RandomAccessListWrapper",1019),wAn(1021,1019,xVn,IT),MWn.Zc=function(n){return this.a.Zc(n)},vX(XWn,"Lists/1",1021),wAn(131,52,{131:1,20:1,28:1,52:1,14:1,15:1},CT),MWn.Vc=function(n,t){this.a.Vc(pU(this,n),t)},MWn.$b=function(){this.a.$b()},MWn.Xb=function(n){return this.a.Xb(LX(this,n))},MWn.Kc=function(){return W1(this,0)},MWn.Zc=function(n){return W1(this,n)},MWn.$c=function(n){return this.a.$c(LX(this,n))},MWn.Ud=function(n,t){(d2(n,t,this.a.gc()),ean(this.a.bd(pU(this,t),pU(this,n)))).$b()},MWn._c=function(n,t){return this.a._c(LX(this,n),t)},MWn.gc=function(){return this.a.gc()},MWn.bd=function(n,t){return d2(n,t,this.a.gc()),ean(this.a.bd(pU(this,t),pU(this,n)))},vX(XWn,"Lists/ReverseList",131),wAn(280,131,{131:1,20:1,28:1,52:1,14:1,15:1,54:1},fy),vX(XWn,"Lists/RandomAccessReverseList",280),wAn(1020,1,cVn,kT),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){this.c.Rb(n),this.c.Ub(),this.a=!1},MWn.Ob=function(){return this.c.Sb()},MWn.Sb=function(){return this.c.Ob()},MWn.Pb=function(){return w5(this)},MWn.Tb=function(){return pU(this.b,this.c.Tb())},MWn.Ub=function(){if(!this.c.Ob())throw Hp(new yv);return this.a=!0,this.c.Pb()},MWn.Vb=function(){return pU(this.b,this.c.Tb())-1},MWn.Qb=function(){han(this.a),this.c.Qb(),this.a=!1},MWn.Wb=function(n){uN(this.a),this.c.Wb(n)},MWn.a=!1,vX(XWn,"Lists/ReverseList/1",1020),wAn(432,487,QWn,ly),MWn.Qd=function(n){return cS(n)},vX(XWn,"Maps/1",432),wAn(698,487,QWn,by),MWn.Qd=function(n){return BB(n,42).dd()},vX(XWn,"Maps/2",698),wAn(962,487,QWn,pN),MWn.Qd=function(n){return new vT(n,_O(this.a,n))},vX(XWn,"Maps/3",962),wAn(959,1971,tVn,ml),MWn.Jc=function(n){xv(this.a,n)},MWn.Kc=function(){return this.a.kc()},MWn.Rc=function(){return this.a},MWn.Nc=function(){return this.a.lc()},vX(XWn,"Maps/IteratorBasedAbstractMap/1",959),wAn(960,1,{},vl),MWn.Od=function(n,t){this.a.td(n)},vX(XWn,"Maps/KeySet/lambda$0$Type",960),wAn(958,28,ZWn,PT),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return this.a.uc(n)},MWn.Jc=function(n){yX(n),this.a.wc(new ll(n))},MWn.dc=function(){return this.a.dc()},MWn.Kc=function(){return new by(this.a.vc().Kc())},MWn.Mc=function(n){var t,e;try{return ywn(this,n,!0)}catch(i){if(cL(i=lun(i),41)){for(e=this.a.vc().Kc();e.Ob();)if(wW(n,(t=BB(e.Pb(),42)).dd()))return this.a.Bc(t.cd()),!0;return!1}throw Hp(i)}},MWn.gc=function(){return this.a.gc()},vX(XWn,"Maps/Values",958),wAn(961,1,{},ll),MWn.Od=function(n,t){this.a.td(t)},vX(XWn,"Maps/Values/lambda$0$Type",961),wAn(736,1987,JWn,rS),MWn.xc=function(n){return this.a._b(n)?this.a.cc(n):null},MWn.Bc=function(n){return this.a._b(n)?this.a.fc(n):null},MWn.$b=function(){this.a.$b()},MWn._b=function(n){return this.a._b(n)},MWn.Ec=function(){return new fl(this)},MWn.Dc=function(){return this.Ec()},MWn.dc=function(){return this.a.dc()},MWn.ec=function(){return this.a.ec()},MWn.gc=function(){return this.a.ec().gc()},vX(XWn,"Multimaps/AsMap",736),wAn(1104,1971,tVn,fl),MWn.Kc=function(){return nL(this.a.a.ec(),new bl(this))},MWn.Rc=function(){return this.a},MWn.Mc=function(n){var t;return!!idn(this,n)&&(t=BB(n,42),jk(this.a,t.cd()),!0)},vX(XWn,"Multimaps/AsMap/EntrySet",1104),wAn(1108,1,{},bl),MWn.Kb=function(n){return _O(this,n)},MWn.Fb=function(n){return this===n},vX(XWn,"Multimaps/AsMap/EntrySet/1",1108),wAn(543,1989,{543:1,835:1,20:1,28:1,14:1},wl),MWn.$b=function(){win(this.a)},MWn.Hc=function(n){return Wj(this.a,n)},MWn.Jc=function(n){yX(n),e5(MX(this.a),new gl(n))},MWn.Kc=function(){return new ly(MX(this.a).a.kc())},MWn.gc=function(){return this.a.d},MWn.Nc=function(){return RB(MX(this.a).Nc(),new l)},vX(XWn,"Multimaps/Keys",543),wAn(1106,1,{},l),MWn.Kb=function(n){return BB(n,42).cd()},vX(XWn,"Multimaps/Keys/0methodref$getKey$Type",1106),wAn(1105,487,QWn,wy),MWn.Qd=function(n){return new dl(BB(n,42))},vX(XWn,"Multimaps/Keys/1",1105),wAn(1990,1,{416:1}),MWn.Fb=function(n){var t;return!!cL(n,492)&&(t=BB(n,416),BB(this.a.dd(),14).gc()==BB(t.a.dd(),14).gc()&&wW(this.a.cd(),t.a.cd()))},MWn.Hb=function(){var n;return(null==(n=this.a.cd())?0:nsn(n))^BB(this.a.dd(),14).gc()},MWn.Ib=function(){var n,t;return t=kN(this.a.cd()),1==(n=BB(this.a.dd(),14).gc())?t:t+" x "+n},vX(XWn,"Multisets/AbstractEntry",1990),wAn(492,1990,{492:1,416:1},dl),vX(XWn,"Multimaps/Keys/1/1",492),wAn(1107,1,lVn,gl),MWn.td=function(n){this.a.td(BB(n,42).cd())},vX(XWn,"Multimaps/Keys/lambda$1$Type",1107),wAn(1110,1,lVn,b),MWn.td=function(n){Iq(BB(n,416))},vX(XWn,"Multiset/lambda$0$Type",1110),wAn(737,1,lVn,pl),MWn.td=function(n){Itn(this.a,BB(n,416))},vX(XWn,"Multiset/lambda$1$Type",737),wAn(1111,1,{},m),vX(XWn,"Multisets/0methodref$add$Type",1111),wAn(738,1,{},y),MWn.Kb=function(n){return s3(BB(n,416))},vX(XWn,"Multisets/lambda$3$Type",738),wAn(2008,1,KWn),vX(XWn,"RangeGwtSerializationDependencies",2008),wAn(514,2008,{169:1,514:1,3:1,45:1},svn),MWn.Lb=function(n){return Mz(this,BB(n,35))},MWn.Mb=function(n){return Mz(this,BB(n,35))},MWn.Fb=function(n){var t;return!!cL(n,514)&&(t=BB(n,514),xdn(this.a,t.a)&&xdn(this.b,t.b))},MWn.Hb=function(){return 31*this.a.Hb()+this.b.Hb()},MWn.Ib=function(){return B3(this.a,this.b)},vX(XWn,"Range",514),wAn(778,1999,yVn,aU),MWn.Zc=function(n){return ix(this.b,n)},MWn.Pd=function(){return this.a},MWn.Xb=function(n){return WI(this.b,n)},MWn.Fd=function(n){return ix(this.b,n)},vX(XWn,"RegularImmutableAsList",778),wAn(646,2006,yVn,SY),MWn.Hd=function(){return this.a},vX(XWn,"RegularImmutableList",646),wAn(616,715,jVn,hy),vX(XWn,"RegularImmutableMap",616),wAn(716,703,TVn,vS),vX(XWn,"RegularImmutableSet",716),wAn(1976,nVn,tVn),MWn.Kc=function(){return new SV(this.a,this.b)},MWn.Fc=function(n){throw Hp(new pv)},MWn.Gc=function(n){throw Hp(new pv)},MWn.$b=function(){throw Hp(new pv)},MWn.Mc=function(n){throw Hp(new pv)},vX(XWn,"Sets/SetView",1976),wAn(963,1976,tVn,ET),MWn.Kc=function(){return new SV(this.a,this.b)},MWn.Hc=function(n){return CG(this.a,n)&&this.b.Hc(n)},MWn.Ic=function(n){return oun(this.a,n)&&this.b.Ic(n)},MWn.dc=function(){return Kpn(this.b,this.a)},MWn.Lc=function(){return AV(new Rq(null,new w1(this.a,1)),new jl(this.b))},MWn.gc=function(){return Can(this)},MWn.Oc=function(){return AV(new Rq(null,new w1(this.a,1)),new kl(this.b))},vX(XWn,"Sets/2",963),wAn(700,699,UWn,SV),MWn.Yb=function(){for(var n;k$(this.a);)if(n=u4(this.a),this.c.Hc(n))return n;return this.e=2,null},vX(XWn,"Sets/2/1",700),wAn(964,1,DVn,kl),MWn.Mb=function(n){return this.a.Hc(n)},vX(XWn,"Sets/2/4methodref$contains$Type",964),wAn(965,1,DVn,jl),MWn.Mb=function(n){return this.a.Hc(n)},vX(XWn,"Sets/2/5methodref$contains$Type",965),wAn(607,1975,{607:1,3:1,20:1,14:1,271:1,21:1,84:1},bJ),MWn.Bd=function(){return this.b},MWn.Cd=function(){return this.b},MWn.Md=function(){return this.b},MWn.Jc=function(n){this.a.Jc(n)},MWn.Lc=function(){return this.a.Lc()},MWn.Oc=function(){return this.a.Oc()},vX(XWn,"Sets/UnmodifiableNavigableSet",607),wAn(1932,1931,jVn,GW),MWn.Ld=function(){return s_(),new yk(this.a)},MWn.Cc=function(){return s_(),new yk(this.a)},MWn.pd=function(){return s_(),new yk(this.a)},vX(XWn,"SingletonImmutableBiMap",1932),wAn(647,2006,yVn,Pq),MWn.Hd=function(){return this.a},vX(XWn,"SingletonImmutableList",647),wAn(350,1981,TVn,yk),MWn.Kc=function(){return new sl(this.a)},MWn.Hc=function(n){return Nfn(this.a,n)},MWn.Ed=function(){return new sl(this.a)},MWn.gc=function(){return 1},vX(XWn,"SingletonImmutableSet",350),wAn(1115,1,{},k),MWn.Kb=function(n){return BB(n,164)},vX(XWn,"Streams/lambda$0$Type",1115),wAn(1116,1,RVn,El),MWn.Vd=function(){B5(this.a)},vX(XWn,"Streams/lambda$1$Type",1116),wAn(1659,1658,VWn,pY),MWn.Zb=function(){return BB(BB(this.f||(this.f=cL(this.c,171)?new ID(this,BB(this.c,171)):cL(this.c,161)?new CD(this,BB(this.c,161)):new pT(this,this.c)),161),171)},MWn.hc=function(){return new dE(this.b)},MWn.gd=function(){return new dE(this.b)},MWn.ec=function(){return BB(BB(this.i||(this.i=cL(this.c,171)?new tT(this,BB(this.c,171)):cL(this.c,161)?new nT(this,BB(this.c,161)):new HL(this,this.c)),84),271)},MWn.ac=function(){return cL(this.c,171)?new ID(this,BB(this.c,171)):cL(this.c,161)?new CD(this,BB(this.c,161)):new pT(this,this.c)},MWn.ic=function(n){return null==n&&this.a.ue(n,n),new dE(this.b)},vX(XWn,"TreeMultimap",1659),wAn(78,1,{3:1,78:1}),MWn.Wd=function(n){return new Error(n)},MWn.Xd=function(){return this.e},MWn.Yd=function(){return _wn($V(LU((null==this.k&&(this.k=x8(Jnt,sVn,78,0,0,1)),this.k)),new x),new on)},MWn.Zd=function(){return this.f},MWn.$d=function(){return this.g},MWn._d=function(){yy(this,b2(this.Wd(CY(this,this.g)))),ov(this)},MWn.Ib=function(){return CY(this,this.$d())},MWn.e=FVn,MWn.i=!1,MWn.n=!0;var Ynt,Jnt=vX(RWn,"Throwable",78);wAn(102,78,{3:1,102:1,78:1}),vX(RWn,"Exception",102),wAn(60,102,BVn,sv,dy),vX(RWn,"RuntimeException",60),wAn(598,60,BVn),vX(RWn,"JsException",598),wAn(863,598,BVn),vX(HVn,"JavaScriptExceptionBase",863),wAn(477,863,{477:1,3:1,102:1,60:1,78:1},jhn),MWn.$d=function(){return pEn(this),this.c},MWn.ae=function(){return GI(this.b)===GI(Ynt)?null:this.b},vX(GVn,"JavaScriptException",477);var Znt,ntt=vX(GVn,"JavaScriptObject$",0);wAn(1948,1,{}),vX(GVn,"Scheduler",1948);var ttt,ett,itt,rtt,ctt=0,att=0,utt=-1;wAn(890,1948,{},j),vX(HVn,"SchedulerImpl",890),wAn(1960,1,{}),vX(HVn,"StackTraceCreator/Collector",1960),wAn(864,1960,{},E),MWn.be=function(n){var t={},e=[];n[UVn]=e;for(var i=arguments.callee.caller;i;){var r=(PY(),i.name||(i.name=Ven(i.toString())));e.push(r);var c,a,u=":"+r,o=t[u];if(o)for(c=0,a=o.length;c<a;c++)if(o[c]===i)return;(o||(t[u]=[])).push(i),i=i.caller}},MWn.ce=function(n){var t,e,i,r;for(PY(),e=(i=n&&n[UVn]?n[UVn]:[]).length,r=x8(Ftt,sVn,310,e,0,1),t=0;t<e;t++)r[t]=new PV(i[t],null,-1);return r},vX(HVn,"StackTraceCreator/CollectorLegacy",864),wAn(1961,1960,{}),MWn.be=function(n){},MWn.de=function(n,t,e,i){return new PV(t,n+"@"+i,e<0?-1:e)},MWn.ce=function(n){var t,e,i,r,c,a;if(r=lyn(n),c=x8(Ftt,sVn,310,0,0,1),t=0,0==(i=r.length))return c;for(mK((a=Oqn(this,r[0])).d,zVn)||(c[t++]=a),e=1;e<i;e++)c[t++]=Oqn(this,r[e]);return c},vX(HVn,"StackTraceCreator/CollectorModern",1961),wAn(865,1961,{},d),MWn.de=function(n,t,e,i){return new PV(t,n,-1)},vX(HVn,"StackTraceCreator/CollectorModernNoSourceMap",865),wAn(1050,1,{}),vX(yQn,kQn,1050),wAn(615,1050,{615:1},zX),vX(jQn,kQn,615),wAn(2001,1,{}),vX(yQn,EQn,2001),wAn(2002,2001,{}),vX(jQn,EQn,2002),wAn(1090,1,{},g),vX(jQn,"LocaleInfo",1090),wAn(1918,1,{},p),MWn.a=0,vX(jQn,"TimeZone",1918),wAn(1258,2002,{},w),vX("com.google.gwt.i18n.client.impl.cldr","DateTimeFormatInfoImpl",1258),wAn(434,1,{434:1},VB),MWn.a=!1,MWn.b=0,vX(yQn,"DateTimeFormat/PatternPart",434),wAn(199,1,TQn,AT,von,PD),MWn.wd=function(n){return J0(this,BB(n,199))},MWn.Fb=function(n){return cL(n,199)&&QI(fan(this.q.getTime()),fan(BB(n,199).q.getTime()))},MWn.Hb=function(){var n;return dG(r0(n=fan(this.q.getTime()),jz(n,32)))},MWn.Ib=function(){var n,t,i;return n=((i=-this.q.getTimezoneOffset())>=0?"+":"")+(i/60|0),t=UO(e.Math.abs(i)%60),(pMn(),pet)[this.q.getDay()]+" "+vet[this.q.getMonth()]+" "+UO(this.q.getDate())+" "+UO(this.q.getHours())+":"+UO(this.q.getMinutes())+":"+UO(this.q.getSeconds())+" GMT"+n+t+" "+this.q.getFullYear()};var ott,stt,htt,ftt,ltt,btt,wtt,dtt,gtt,ptt,vtt,mtt=vX(YWn,"Date",199);wAn(1915,199,TQn,Ykn),MWn.a=!1,MWn.b=0,MWn.c=0,MWn.d=0,MWn.e=0,MWn.f=0,MWn.g=!1,MWn.i=0,MWn.j=0,MWn.k=0,MWn.n=0,MWn.o=0,MWn.p=0,vX("com.google.gwt.i18n.shared.impl","DateRecord",1915),wAn(1966,1,{}),MWn.fe=function(){return null},MWn.ge=function(){return null},MWn.he=function(){return null},MWn.ie=function(){return null},MWn.je=function(){return null},vX(MQn,"JSONValue",1966),wAn(216,1966,{216:1},Cl,Tl),MWn.Fb=function(n){return!!cL(n,216)&&v0(this.a,BB(n,216).a)},MWn.ee=function(){return qp},MWn.Hb=function(){return tY(this.a)},MWn.fe=function(){return this},MWn.Ib=function(){var n,t,e;for(e=new lN("["),t=0,n=this.a.length;t<n;t++)t>0&&(e.a+=","),uO(e,dnn(this,t));return e.a+="]",e.a},vX(MQn,"JSONArray",216),wAn(483,1966,{483:1},Ml),MWn.ee=function(){return Gp},MWn.ge=function(){return this},MWn.Ib=function(){return hN(),""+this.a},MWn.a=!1,vX(MQn,"JSONBoolean",483),wAn(985,60,BVn,gy),vX(MQn,"JSONException",985),wAn(1023,1966,{},v),MWn.ee=function(){return Vp},MWn.Ib=function(){return zWn},vX(MQn,"JSONNull",1023),wAn(258,1966,{258:1},Sl),MWn.Fb=function(n){return!!cL(n,258)&&this.a==BB(n,258).a},MWn.ee=function(){return zp},MWn.Hb=function(){return VO(this.a)},MWn.he=function(){return this},MWn.Ib=function(){return this.a+""},MWn.a=0,vX(MQn,"JSONNumber",258),wAn(183,1966,{183:1},py,Pl),MWn.Fb=function(n){return!!cL(n,183)&&v0(this.a,BB(n,183).a)},MWn.ee=function(){return Up},MWn.Hb=function(){return tY(this.a)},MWn.ie=function(){return this},MWn.Ib=function(){var n,t,e,i,r,c;for(c=new lN("{"),n=!0,i=0,r=(e=jrn(this,x8(Qtt,sVn,2,0,6,1))).length;i<r;++i)t=e[i],n?n=!1:c.a+=FWn,oO(c,mOn(t)),c.a+=":",uO(c,zJ(this,t));return c.a+="}",c.a},vX(MQn,"JSONObject",183),wAn(596,nVn,tVn,TT),MWn.Hc=function(n){return XI(n)&&zk(this.a,SD(n))},MWn.Kc=function(){return new Sb(new Jy(this.b))},MWn.gc=function(){return this.b.length},vX(MQn,"JSONObject/1",596),wAn(204,1966,{204:1},GX),MWn.Fb=function(n){return!!cL(n,204)&&mK(this.a,BB(n,204).a)},MWn.ee=function(){return Xp},MWn.Hb=function(){return vvn(this.a)},MWn.je=function(){return this},MWn.Ib=function(){return mOn(this.a)},vX(MQn,"JSONString",204),wAn(1962,1,{525:1}),vX(LQn,"OutputStream",1962),wAn(1963,1962,{525:1}),vX(LQn,"FilterOutputStream",1963),wAn(866,1963,{525:1},A),vX(LQn,"PrintStream",866),wAn(418,1,{475:1}),MWn.Ib=function(){return this.a},vX(RWn,"AbstractStringBuilder",418),wAn(529,60,BVn,Oy),vX(RWn,"ArithmeticException",529),wAn(73,60,NQn,fv,Ay),vX(RWn,"IndexOutOfBoundsException",73),wAn(320,73,{3:1,320:1,102:1,73:1,60:1,78:1},Sv,Tk),vX(RWn,"ArrayIndexOutOfBoundsException",320),wAn(528,60,BVn,lv,$y),vX(RWn,"ArrayStoreException",528),wAn(289,78,xQn,Ly),vX(RWn,"Error",289),wAn(194,289,xQn,hv,g5),vX(RWn,"AssertionError",194),CWn={3:1,476:1,35:1};var ytt,ktt=vX(RWn,"Boolean",476);wAn(236,1,{3:1,236:1}),vX(RWn,"Number",236),wAn(217,236,{3:1,217:1,35:1,236:1},$b),MWn.wd=function(n){return Fk(this,BB(n,217))},MWn.ke=function(){return this.a},MWn.Fb=function(n){return cL(n,217)&&BB(n,217).a==this.a},MWn.Hb=function(){return this.a},MWn.Ib=function(){return""+this.a},MWn.a=0;var jtt,Ett,Ttt=vX(RWn,"Byte",217);wAn(172,1,{3:1,172:1,35:1},Lb),MWn.wd=function(n){return Bk(this,BB(n,172))},MWn.Fb=function(n){return cL(n,172)&&BB(n,172).a==this.a},MWn.Hb=function(){return this.a},MWn.Ib=function(){return String.fromCharCode(this.a)},MWn.a=0;var Mtt,Stt=vX(RWn,"Character",172);wAn(205,60,{3:1,205:1,102:1,60:1,78:1},bv,Ky),vX(RWn,"ClassCastException",205),IWn={3:1,35:1,333:1,236:1};var Ptt=vX(RWn,"Double",333);wAn(155,236,{3:1,35:1,155:1,236:1},Nb,Dv),MWn.wd=function(n){return BO(this,BB(n,155))},MWn.ke=function(){return this.a},MWn.Fb=function(n){return cL(n,155)&&vK(this.a,BB(n,155).a)},MWn.Hb=function(){return CJ(this.a)},MWn.Ib=function(){return""+this.a},MWn.a=0;var Ctt=vX(RWn,"Float",155);wAn(32,60,{3:1,102:1,32:1,60:1,78:1},wv,_y,Fsn),vX(RWn,"IllegalArgumentException",32),wAn(71,60,BVn,dv,Fy),vX(RWn,"IllegalStateException",71),wAn(19,236,{3:1,35:1,19:1,236:1},xb),MWn.wd=function(n){return HO(this,BB(n,19))},MWn.ke=function(){return this.a},MWn.Fb=function(n){return cL(n,19)&&BB(n,19).a==this.a},MWn.Hb=function(){return this.a},MWn.Ib=function(){return""+this.a},MWn.a=0;var Itt,Ott,Att=vX(RWn,"Integer",19);wAn(162,236,{3:1,35:1,162:1,236:1},Db),MWn.wd=function(n){return qO(this,BB(n,162))},MWn.ke=function(){return j2(this.a)},MWn.Fb=function(n){return cL(n,162)&&QI(BB(n,162).a,this.a)},MWn.Hb=function(){return dG(this.a)},MWn.Ib=function(){return""+vz(this.a)},MWn.a=0;var $tt,Ltt,Ntt,xtt,Dtt,Rtt=vX(RWn,"Long",162);wAn(2039,1,{}),wAn(1831,60,BVn,By),vX(RWn,"NegativeArraySizeException",1831),wAn(173,598,{3:1,102:1,173:1,60:1,78:1},gv,Hy),MWn.Wd=function(n){return new TypeError(n)},vX(RWn,"NullPointerException",173),wAn(127,32,{3:1,102:1,32:1,127:1,60:1,78:1},Mk),vX(RWn,"NumberFormatException",127),wAn(184,236,{3:1,35:1,236:1,184:1},Rb),MWn.wd=function(n){return Hk(this,BB(n,184))},MWn.ke=function(){return this.a},MWn.Fb=function(n){return cL(n,184)&&BB(n,184).a==this.a},MWn.Hb=function(){return this.a},MWn.Ib=function(){return""+this.a},MWn.a=0;var Ktt,_tt=vX(RWn,"Short",184);wAn(310,1,{3:1,310:1},PV),MWn.Fb=function(n){var t;return!!cL(n,310)&&(t=BB(n,310),this.c==t.c&&this.d==t.d&&this.a==t.a&&this.b==t.b)},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[iln(this.c),this.a,this.d,this.b]))},MWn.Ib=function(){return this.a+"."+this.d+"("+(null!=this.b?this.b:"Unknown Source")+(this.c>=0?":"+this.c:"")+")"},MWn.c=0;var Ftt=vX(RWn,"StackTraceElement",310);OWn={3:1,475:1,35:1,2:1};var Btt,Htt,qtt,Gtt,ztt,Utt,Xtt,Wtt,Vtt,Qtt=vX(RWn,qVn,2);wAn(107,418,{475:1},Sk,Pk,fN),vX(RWn,"StringBuffer",107),wAn(100,418,{475:1},Ck,Ik,lN),vX(RWn,"StringBuilder",100),wAn(687,73,NQn,Ok),vX(RWn,"StringIndexOutOfBoundsException",687),wAn(2043,1,{}),wAn(844,1,{},x),MWn.Kb=function(n){return BB(n,78).e},vX(RWn,"Throwable/lambda$0$Type",844),wAn(41,60,{3:1,102:1,60:1,78:1,41:1},pv,tk),vX(RWn,"UnsupportedOperationException",41),wAn(240,236,{3:1,35:1,236:1,240:1},knn,wE),MWn.wd=function(n){return J_n(this,BB(n,240))},MWn.ke=function(){return bSn(eqn(this))},MWn.Fb=function(n){var t;return this===n||!!cL(n,240)&&(t=BB(n,240),this.e==t.e&&0==J_n(this,t))},MWn.Hb=function(){var n;return 0!=this.b?this.b:this.a<54?(n=fan(this.f),this.b=dG(e0(n,-1)),this.b=33*this.b+dG(e0(kz(n,32),-1)),this.b=17*this.b+CJ(this.e),this.b):(this.b=17*Khn(this.c)+CJ(this.e),this.b)},MWn.Ib=function(){return eqn(this)},MWn.a=0,MWn.b=0,MWn.d=0,MWn.e=0,MWn.f=0;var Ytt,Jtt,Ztt,net,tet,eet,iet=vX("java.math","BigDecimal",240);wAn(91,236,{3:1,35:1,236:1,91:1},Rpn,X6,lU,vEn,Cgn,$A),MWn.wd=function(n){return tgn(this,BB(n,91))},MWn.ke=function(){return bSn(qXn(this,0))},MWn.Fb=function(n){return swn(this,n)},MWn.Hb=function(){return Khn(this)},MWn.Ib=function(){return qXn(this,0)},MWn.b=-2,MWn.c=0,MWn.d=0,MWn.e=0;var ret,cet,aet,uet,oet=vX("java.math","BigInteger",91);wAn(488,1967,JWn),MWn.$b=function(){$U(this)},MWn._b=function(n){return hU(this,n)},MWn.uc=function(n){return Lsn(this,n,this.g)||Lsn(this,n,this.f)},MWn.vc=function(){return new Pb(this)},MWn.xc=function(n){return RX(this,n)},MWn.zc=function(n,t){return VW(this,n,t)},MWn.Bc=function(n){return v6(this,n)},MWn.gc=function(){return NT(this)},vX(YWn,"AbstractHashMap",488),wAn(261,nVn,tVn,Pb),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return m2(this,n)},MWn.Kc=function(){return new usn(this.a)},MWn.Mc=function(n){var t;return!!m2(this,n)&&(t=BB(n,42).cd(),this.a.Bc(t),!0)},MWn.gc=function(){return this.a.gc()},vX(YWn,"AbstractHashMap/EntrySet",261),wAn(262,1,QWn,usn),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return ten(this)},MWn.Ob=function(){return this.b},MWn.Qb=function(){o9(this)},MWn.b=!1,vX(YWn,"AbstractHashMap/EntrySetIterator",262),wAn(417,1,QWn,Sb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return aS(this)},MWn.Pb=function(){return mQ(this)},MWn.Qb=function(){fW(this)},MWn.b=0,MWn.c=-1,vX(YWn,"AbstractList/IteratorImpl",417),wAn(96,417,cVn,M2),MWn.Qb=function(){fW(this)},MWn.Rb=function(n){yR(this,n)},MWn.Sb=function(){return this.b>0},MWn.Tb=function(){return this.b},MWn.Ub=function(){return Px(this.b>0),this.a.Xb(this.c=--this.b)},MWn.Vb=function(){return this.b-1},MWn.Wb=function(n){Mx(-1!=this.c),this.a._c(this.c,n)},vX(YWn,"AbstractList/ListIteratorImpl",96),wAn(219,52,LVn,s1),MWn.Vc=function(n,t){LZ(n,this.b),this.c.Vc(this.a+n,t),++this.b},MWn.Xb=function(n){return l1(n,this.b),this.c.Xb(this.a+n)},MWn.$c=function(n){var t;return l1(n,this.b),t=this.c.$c(this.a+n),--this.b,t},MWn._c=function(n,t){return l1(n,this.b),this.c._c(this.a+n,t)},MWn.gc=function(){return this.b},MWn.a=0,MWn.b=0,vX(YWn,"AbstractList/SubList",219),wAn(384,nVn,tVn,Cb),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return this.a._b(n)},MWn.Kc=function(){return new Ib(this.a.vc().Kc())},MWn.Mc=function(n){return!!this.a._b(n)&&(this.a.Bc(n),!0)},MWn.gc=function(){return this.a.gc()},vX(YWn,"AbstractMap/1",384),wAn(691,1,QWn,Ib),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return BB(this.a.Pb(),42).cd()},MWn.Qb=function(){this.a.Qb()},vX(YWn,"AbstractMap/1/1",691),wAn(226,28,ZWn,Ob),MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return this.a.uc(n)},MWn.Kc=function(){return new Kb(this.a.vc().Kc())},MWn.gc=function(){return this.a.gc()},vX(YWn,"AbstractMap/2",226),wAn(294,1,QWn,Kb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.a.Ob()},MWn.Pb=function(){return BB(this.a.Pb(),42).dd()},MWn.Qb=function(){this.a.Qb()},vX(YWn,"AbstractMap/2/1",294),wAn(484,1,{484:1,42:1}),MWn.Fb=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),cV(this.d,t.cd())&&cV(this.e,t.dd()))},MWn.cd=function(){return this.d},MWn.dd=function(){return this.e},MWn.Hb=function(){return KA(this.d)^KA(this.e)},MWn.ed=function(n){return pR(this,n)},MWn.Ib=function(){return this.d+"="+this.e},vX(YWn,"AbstractMap/AbstractEntry",484),wAn(383,484,{484:1,383:1,42:1},PS),vX(YWn,"AbstractMap/SimpleEntry",383),wAn(1984,1,VQn),MWn.Fb=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),cV(this.cd(),t.cd())&&cV(this.dd(),t.dd()))},MWn.Hb=function(){return KA(this.cd())^KA(this.dd())},MWn.Ib=function(){return this.cd()+"="+this.dd()},vX(YWn,uVn,1984),wAn(1992,1967,eVn),MWn.tc=function(n){return q5(this,n)},MWn._b=function(n){return DK(this,n)},MWn.vc=function(){return new Bb(this)},MWn.xc=function(n){return qI(lsn(this,n))},MWn.ec=function(){return new _b(this)},vX(YWn,"AbstractNavigableMap",1992),wAn(739,nVn,tVn,Bb),MWn.Hc=function(n){return cL(n,42)&&q5(this.b,BB(n,42))},MWn.Kc=function(){return new BR(this.b)},MWn.Mc=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),z8(this.b,t))},MWn.gc=function(){return this.b.c},vX(YWn,"AbstractNavigableMap/EntrySet",739),wAn(493,nVn,rVn,_b),MWn.Nc=function(){return new wS(this)},MWn.$b=function(){my(this.a)},MWn.Hc=function(n){return DK(this.a,n)},MWn.Kc=function(){return new Fb(new BR(new xN(this.a).b))},MWn.Mc=function(n){return!!DK(this.a,n)&&($J(this.a,n),!0)},MWn.gc=function(){return this.a.c},vX(YWn,"AbstractNavigableMap/NavigableKeySet",493),wAn(494,1,QWn,Fb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return aS(this.a.a)},MWn.Pb=function(){return mx(this.a).cd()},MWn.Qb=function(){e_(this.a)},vX(YWn,"AbstractNavigableMap/NavigableKeySet/1",494),wAn(2004,28,ZWn),MWn.Fc=function(n){return F8(eMn(this,n)),!0},MWn.Gc=function(n){return kW(n),vH(n!=this,"Can't add a queue to itself"),Frn(this,n)},MWn.$b=function(){for(;null!=mnn(this););},vX(YWn,"AbstractQueue",2004),wAn(302,28,{4:1,20:1,28:1,14:1},Lp,d1),MWn.Fc=function(n){return w3(this,n),!0},MWn.$b=function(){o4(this)},MWn.Hc=function(n){return wun(new bV(this),n)},MWn.dc=function(){return Wy(this)},MWn.Kc=function(){return new bV(this)},MWn.Mc=function(n){return GJ(new bV(this),n)},MWn.gc=function(){return this.c-this.b&this.a.length-1},MWn.Nc=function(){return new w1(this,272)},MWn.Qc=function(n){var t;return t=this.c-this.b&this.a.length-1,n.length<t&&(n=qk(new Array(t),n)),urn(this,n,t),n.length>t&&$X(n,t,null),n},MWn.b=0,MWn.c=0,vX(YWn,"ArrayDeque",302),wAn(446,1,QWn,bV),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.a!=this.b},MWn.Pb=function(){return _hn(this)},MWn.Qb=function(){ein(this)},MWn.a=0,MWn.b=0,MWn.c=-1,vX(YWn,"ArrayDeque/IteratorImpl",446),wAn(12,52,QQn,Np,J6,t_),MWn.Vc=function(n,t){kG(this,n,t)},MWn.Fc=function(n){return WB(this,n)},MWn.Wc=function(n,t){return ohn(this,n,t)},MWn.Gc=function(n){return gun(this,n)},MWn.$b=function(){this.c=x8(Ant,HWn,1,0,5,1)},MWn.Hc=function(n){return-1!=E7(this,n,0)},MWn.Jc=function(n){Otn(this,n)},MWn.Xb=function(n){return xq(this,n)},MWn.Xc=function(n){return E7(this,n,0)},MWn.dc=function(){return 0==this.c.length},MWn.Kc=function(){return new Wb(this)},MWn.$c=function(n){return s6(this,n)},MWn.Mc=function(n){return y7(this,n)},MWn.Ud=function(n,t){h1(this,n,t)},MWn._c=function(n,t){return c5(this,n,t)},MWn.gc=function(){return this.c.length},MWn.ad=function(n){m$(this,n)},MWn.Pc=function(){return bx(this)},MWn.Qc=function(n){return Qgn(this,n)};var set,het,fet,bet,wet,det,get,pet,vet,met=vX(YWn,"ArrayList",12);wAn(7,1,QWn,Wb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return y$(this)},MWn.Pb=function(){return n0(this)},MWn.Qb=function(){AU(this)},MWn.a=0,MWn.b=-1,vX(YWn,"ArrayList/1",7),wAn(2013,e.Function,{},T),MWn.te=function(n,t){return Pln(n,t)},wAn(154,52,YQn,Jy),MWn.Hc=function(n){return-1!=bin(this,n)},MWn.Jc=function(n){var t,e,i,r;for(kW(n),i=0,r=(e=this.a).length;i<r;++i)t=e[i],n.td(t)},MWn.Xb=function(n){return Dq(this,n)},MWn._c=function(n,t){var e;return l1(n,this.a.length),e=this.a[n],$X(this.a,n,t),e},MWn.gc=function(){return this.a.length},MWn.ad=function(n){yG(this.a,this.a.length,n)},MWn.Pc=function(){return Ygn(this,x8(Ant,HWn,1,this.a.length,5,1))},MWn.Qc=function(n){return Ygn(this,n)},vX(YWn,"Arrays/ArrayList",154),wAn(940,52,YQn,S),MWn.Hc=function(n){return!1},MWn.Xb=function(n){return yO(n)},MWn.Kc=function(){return SQ(),LT(),bet},MWn.Yc=function(){return SQ(),LT(),bet},MWn.gc=function(){return 0},vX(YWn,"Collections/EmptyList",940),wAn(941,1,cVn,P),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){throw Hp(new pv)},MWn.Ob=function(){return!1},MWn.Sb=function(){return!1},MWn.Pb=function(){throw Hp(new yv)},MWn.Tb=function(){return 0},MWn.Ub=function(){throw Hp(new yv)},MWn.Vb=function(){return-1},MWn.Qb=function(){throw Hp(new dv)},MWn.Wb=function(n){throw Hp(new dv)},vX(YWn,"Collections/EmptyListIterator",941),wAn(943,1967,jVn,C),MWn._b=function(n){return!1},MWn.uc=function(n){return!1},MWn.vc=function(){return SQ(),fet},MWn.xc=function(n){return null},MWn.ec=function(){return SQ(),fet},MWn.gc=function(){return 0},MWn.Cc=function(){return SQ(),set},vX(YWn,"Collections/EmptyMap",943),wAn(942,nVn,TVn,M),MWn.Hc=function(n){return!1},MWn.Kc=function(){return SQ(),LT(),bet},MWn.gc=function(){return 0},vX(YWn,"Collections/EmptySet",942),wAn(599,52,{3:1,20:1,28:1,52:1,14:1,15:1},Gb),MWn.Hc=function(n){return cV(this.a,n)},MWn.Xb=function(n){return l1(n,1),this.a},MWn.gc=function(){return 1},vX(YWn,"Collections/SingletonList",599),wAn(372,1,vVn,Hb),MWn.Jc=function(n){e5(this,n)},MWn.Lc=function(){return new Rq(null,this.Nc())},MWn.Nc=function(){return new w1(this,0)},MWn.Oc=function(){return new Rq(null,this.Nc())},MWn.Fc=function(n){return oE()},MWn.Gc=function(n){return sE()},MWn.$b=function(){hE()},MWn.Hc=function(n){return xT(this,n)},MWn.Ic=function(n){return DT(this,n)},MWn.dc=function(){return this.b.dc()},MWn.Kc=function(){return new qb(this.b.Kc())},MWn.Mc=function(n){return fE()},MWn.gc=function(){return this.b.gc()},MWn.Pc=function(){return this.b.Pc()},MWn.Qc=function(n){return RT(this,n)},MWn.Ib=function(){return Bbn(this.b)},vX(YWn,"Collections/UnmodifiableCollection",372),wAn(371,1,QWn,qb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.b.Ob()},MWn.Pb=function(){return this.b.Pb()},MWn.Qb=function(){lE()},vX(YWn,"Collections/UnmodifiableCollectionIterator",371),wAn(531,372,JQn,bN),MWn.Nc=function(){return new w1(this,16)},MWn.Vc=function(n,t){throw Hp(new pv)},MWn.Wc=function(n,t){throw Hp(new pv)},MWn.Fb=function(n){return Nfn(this.a,n)},MWn.Xb=function(n){return this.a.Xb(n)},MWn.Hb=function(){return nsn(this.a)},MWn.Xc=function(n){return this.a.Xc(n)},MWn.dc=function(){return this.a.dc()},MWn.Yc=function(){return new wN(this.a.Zc(0))},MWn.Zc=function(n){return new wN(this.a.Zc(n))},MWn.$c=function(n){throw Hp(new pv)},MWn._c=function(n,t){throw Hp(new pv)},MWn.ad=function(n){throw Hp(new pv)},MWn.bd=function(n,t){return new bN(this.a.bd(n,t))},vX(YWn,"Collections/UnmodifiableList",531),wAn(690,371,cVn,wN),MWn.Qb=function(){lE()},MWn.Rb=function(n){throw Hp(new pv)},MWn.Sb=function(){return this.a.Sb()},MWn.Tb=function(){return this.a.Tb()},MWn.Ub=function(){return this.a.Ub()},MWn.Vb=function(){return this.a.Vb()},MWn.Wb=function(n){throw Hp(new pv)},vX(YWn,"Collections/UnmodifiableListIterator",690),wAn(600,1,JWn,Xb),MWn.wc=function(n){nan(this,n)},MWn.yc=function(n,t,e){return Zln(this,n,t,e)},MWn.$b=function(){throw Hp(new pv)},MWn._b=function(n){return this.c._b(n)},MWn.uc=function(n){return _T(this,n)},MWn.vc=function(){return eV(this)},MWn.Fb=function(n){return BT(this,n)},MWn.xc=function(n){return this.c.xc(n)},MWn.Hb=function(){return nsn(this.c)},MWn.dc=function(){return this.c.dc()},MWn.ec=function(){return iV(this)},MWn.zc=function(n,t){throw Hp(new pv)},MWn.Bc=function(n){throw Hp(new pv)},MWn.gc=function(){return this.c.gc()},MWn.Ib=function(){return Bbn(this.c)},MWn.Cc=function(){return tV(this)},vX(YWn,"Collections/UnmodifiableMap",600),wAn(382,372,EVn,Ak),MWn.Nc=function(){return new w1(this,1)},MWn.Fb=function(n){return Nfn(this.b,n)},MWn.Hb=function(){return nsn(this.b)},vX(YWn,"Collections/UnmodifiableSet",382),wAn(944,382,EVn,Lk),MWn.Hc=function(n){return KT(this,n)},MWn.Ic=function(n){return this.b.Ic(n)},MWn.Kc=function(){return new zb(this.b.Kc())},MWn.Pc=function(){var n;return j4(n=this.b.Pc(),n.length),n},MWn.Qc=function(n){return IY(this,n)},vX(YWn,"Collections/UnmodifiableMap/UnmodifiableEntrySet",944),wAn(945,1,QWn,zb),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return new Ub(BB(this.a.Pb(),42))},MWn.Ob=function(){return this.a.Ob()},MWn.Qb=function(){throw Hp(new pv)},vX(YWn,"Collections/UnmodifiableMap/UnmodifiableEntrySet/1",945),wAn(688,1,VQn,Ub),MWn.Fb=function(n){return this.a.Fb(n)},MWn.cd=function(){return this.a.cd()},MWn.dd=function(){return this.a.dd()},MWn.Hb=function(){return this.a.Hb()},MWn.ed=function(n){throw Hp(new pv)},MWn.Ib=function(){return Bbn(this.a)},vX(YWn,"Collections/UnmodifiableMap/UnmodifiableEntrySet/UnmodifiableEntry",688),wAn(601,531,{20:1,14:1,15:1,54:1},$k),vX(YWn,"Collections/UnmodifiableRandomAccessList",601),wAn(689,382,MVn,dN),MWn.Nc=function(){return new wS(this)},MWn.Fb=function(n){return Nfn(this.a,n)},MWn.Hb=function(){return nsn(this.a)},vX(YWn,"Collections/UnmodifiableSortedSet",689),wAn(847,1,ZQn,D),MWn.ue=function(n,t){var e;return 0!=(e=T4(BB(n,11),BB(t,11)))?e:nFn(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(YWn,"Comparator/lambda$0$Type",847),wAn(751,1,ZQn,R),MWn.ue=function(n,t){return _q(BB(n,35),BB(t,35))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return PQ(),get},vX(YWn,"Comparators/NaturalOrderComparator",751),wAn(1177,1,ZQn,K),MWn.ue=function(n,t){return Fq(BB(n,35),BB(t,35))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return PQ(),det},vX(YWn,"Comparators/ReverseNaturalOrderComparator",1177),wAn(64,1,ZQn,nw),MWn.Fb=function(n){return this===n},MWn.ue=function(n,t){return this.a.ue(t,n)},MWn.ve=function(){return this.a},vX(YWn,"Comparators/ReversedComparator",64),wAn(166,60,BVn,vv),vX(YWn,"ConcurrentModificationException",166),wAn(1904,1,nYn,_),MWn.we=function(n){hdn(this,n)},MWn.Ib=function(){return"DoubleSummaryStatistics[count = "+vz(this.a)+", avg = "+(oS(this.a,0)?l6(this)/j2(this.a):0)+", min = "+this.c+", max = "+this.b+", sum = "+l6(this)+"]"},MWn.a=0,MWn.b=KQn,MWn.c=RQn,MWn.d=0,MWn.e=0,MWn.f=0,vX(YWn,"DoubleSummaryStatistics",1904),wAn(1805,60,BVn,mv),vX(YWn,"EmptyStackException",1805),wAn(451,1967,JWn,Hbn),MWn.zc=function(n,t){return wR(this,n,t)},MWn.$b=function(){TW(this)},MWn._b=function(n){return uS(this,n)},MWn.uc=function(n){var t,e;for(e=new QT(this.a);e.a<e.c.a.length;)if(t=u4(e),cV(n,this.b[t.g]))return!0;return!1},MWn.vc=function(){return new tw(this)},MWn.xc=function(n){return oV(this,n)},MWn.Bc=function(n){return NZ(this,n)},MWn.gc=function(){return this.a.c},vX(YWn,"EnumMap",451),wAn(1352,nVn,tVn,tw),MWn.$b=function(){TW(this.a)},MWn.Hc=function(n){return v2(this,n)},MWn.Kc=function(){return new Aq(this.a)},MWn.Mc=function(n){var t;return!!v2(this,n)&&(t=BB(n,42).cd(),NZ(this.a,t),!0)},MWn.gc=function(){return this.a.a.c},vX(YWn,"EnumMap/EntrySet",1352),wAn(1353,1,QWn,Aq),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return this.b=u4(this.a),new CS(this.c,this.b)},MWn.Ob=function(){return k$(this.a)},MWn.Qb=function(){Mx(!!this.b),NZ(this.c,this.b),this.b=null},vX(YWn,"EnumMap/EntrySetIterator",1353),wAn(1354,1984,VQn,CS),MWn.cd=function(){return this.a},MWn.dd=function(){return this.b.b[this.a.g]},MWn.ed=function(n){return EU(this.b,this.a.g,n)},vX(YWn,"EnumMap/MapEntry",1354),wAn(174,nVn,{20:1,28:1,14:1,174:1,21:1});var yet=vX(YWn,"EnumSet",174);wAn(156,174,{20:1,28:1,14:1,174:1,156:1,21:1},YK),MWn.Fc=function(n){return orn(this,BB(n,22))},MWn.Hc=function(n){return CG(this,n)},MWn.Kc=function(){return new QT(this)},MWn.Mc=function(n){return IG(this,n)},MWn.gc=function(){return this.c},MWn.c=0,vX(YWn,"EnumSet/EnumSetImpl",156),wAn(343,1,QWn,QT),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return u4(this)},MWn.Ob=function(){return k$(this)},MWn.Qb=function(){Mx(-1!=this.b),$X(this.c.b,this.b,null),--this.c.c,this.b=-1},MWn.a=-1,MWn.b=-1,vX(YWn,"EnumSet/EnumSetImpl/IteratorImpl",343),wAn(43,488,tYn,xp,XT,mO),MWn.re=function(n,t){return GI(n)===GI(t)||null!=n&&Nfn(n,t)},MWn.se=function(n){return 0|nsn(n)},vX(YWn,"HashMap",43),wAn(53,nVn,eYn,Rv,bE,$q),MWn.Fc=function(n){return TU(this,n)},MWn.$b=function(){this.a.$b()},MWn.Hc=function(n){return FT(this,n)},MWn.dc=function(){return 0==this.a.gc()},MWn.Kc=function(){return this.a.ec().Kc()},MWn.Mc=function(n){return eL(this,n)},MWn.gc=function(){return this.a.gc()};var ket,jet=vX(YWn,"HashSet",53);wAn(1781,1,wVn,F),MWn.ud=function(n){ran(this,n)},MWn.Ib=function(){return"IntSummaryStatistics[count = "+vz(this.a)+", avg = "+(oS(this.a,0)?j2(this.d)/j2(this.a):0)+", min = "+this.c+", max = "+this.b+", sum = "+vz(this.d)+"]"},MWn.a=0,MWn.b=_Vn,MWn.c=DWn,MWn.d=0,vX(YWn,"IntSummaryStatistics",1781),wAn(1049,1,pVn,eA),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new S2(this)},MWn.c=0,vX(YWn,"InternalHashCodeMap",1049),wAn(711,1,QWn,S2),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return this.d=this.a[this.c++],this.d},MWn.Ob=function(){var n;return this.c<this.a.length||!(n=this.b.next()).done&&(this.a=n.value[1],this.c=0,!0)},MWn.Qb=function(){gAn(this.e,this.d.cd()),0!=this.c&&--this.c},MWn.c=0,MWn.d=null,vX(YWn,"InternalHashCodeMap/1",711),wAn(1047,1,pVn,iA),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new p4(this)},MWn.c=0,MWn.d=0,vX(YWn,"InternalStringMap",1047),wAn(710,1,QWn,p4),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return this.c=this.a,this.a=this.b.next(),new JK(this.d,this.c,this.d.d)},MWn.Ob=function(){return!this.a.done},MWn.Qb=function(){Gan(this.d,this.c.value[0])},vX(YWn,"InternalStringMap/1",710),wAn(1048,1984,VQn,JK),MWn.cd=function(){return this.b.value[0]},MWn.dd=function(){return this.a.d!=this.c?hS(this.a,this.b.value[0]):this.b.value[1]},MWn.ed=function(n){return ubn(this.a,this.b.value[0],n)},MWn.c=0,vX(YWn,"InternalStringMap/2",1048),wAn(228,43,tYn,v4,q8),MWn.$b=function(){kR(this)},MWn._b=function(n){return lS(this,n)},MWn.uc=function(n){var t;for(t=this.d.a;t!=this.d;){if(cV(t.e,n))return!0;t=t.a}return!1},MWn.vc=function(){return new iw(this)},MWn.xc=function(n){return lnn(this,n)},MWn.zc=function(n,t){return Jgn(this,n,t)},MWn.Bc=function(n){return k7(this,n)},MWn.gc=function(){return NT(this.e)},MWn.c=!1,vX(YWn,"LinkedHashMap",228),wAn(387,383,{484:1,383:1,387:1,42:1},Cx,nH),vX(YWn,"LinkedHashMap/ChainEntry",387),wAn(701,nVn,tVn,iw),MWn.$b=function(){kR(this.a)},MWn.Hc=function(n){return y2(this,n)},MWn.Kc=function(){return new hW(this)},MWn.Mc=function(n){var t;return!!y2(this,n)&&(t=BB(n,42).cd(),k7(this.a,t),!0)},MWn.gc=function(){return NT(this.a.e)},vX(YWn,"LinkedHashMap/EntrySet",701),wAn(702,1,QWn,hW),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return s9(this)},MWn.Ob=function(){return this.b!=this.c.a.d},MWn.Qb=function(){Mx(!!this.a),p2(this.c.a.e,this),RH(this.a),v6(this.c.a.e,this.a.d),bD(this.c.a.e,this),this.a=null},vX(YWn,"LinkedHashMap/EntrySet/EntryIterator",702),wAn(178,53,eYn,fA,LN,Lq);var Eet=vX(YWn,"LinkedHashSet",178);wAn(68,1964,{3:1,4:1,20:1,28:1,52:1,14:1,68:1,15:1},YT,n_),MWn.Fc=function(n){return DH(this,n)},MWn.$b=function(){yQ(this)},MWn.Zc=function(n){return spn(this,n)},MWn.gc=function(){return this.b},MWn.b=0;var Tet,Met,Set,Pet,Cet,Iet=vX(YWn,"LinkedList",68);wAn(970,1,cVn,ZK),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){nX(this,n)},MWn.Ob=function(){return EE(this)},MWn.Sb=function(){return this.b.b!=this.d.a},MWn.Pb=function(){return b3(this)},MWn.Tb=function(){return this.a},MWn.Ub=function(){return U0(this)},MWn.Vb=function(){return this.a-1},MWn.Qb=function(){mtn(this)},MWn.Wb=function(n){Mx(!!this.c),this.c.c=n},MWn.a=0,MWn.c=null,vX(YWn,"LinkedList/ListIteratorImpl",970),wAn(608,1,{},$),vX(YWn,"LinkedList/Node",608),wAn(1959,1,{}),vX(YWn,"Locale",1959),wAn(861,1959,{},L),MWn.Ib=function(){return""},vX(YWn,"Locale/1",861),wAn(862,1959,{},N),MWn.Ib=function(){return"unknown"},vX(YWn,"Locale/4",862),wAn(109,60,{3:1,102:1,60:1,78:1,109:1},yv,lV),vX(YWn,"NoSuchElementException",109),wAn(404,1,{404:1},vy),MWn.Fb=function(n){var t;return n===this||!!cL(n,404)&&(t=BB(n,404),cV(this.a,t.a))},MWn.Hb=function(){return KA(this.a)},MWn.Ib=function(){return null!=this.a?GWn+kN(this.a)+")":"Optional.empty()"},vX(YWn,"Optional",404),wAn(463,1,{463:1},CO,yx),MWn.Fb=function(n){var t;return n===this||!!cL(n,463)&&(t=BB(n,463),this.a==t.a&&0==Pln(this.b,t.b))},MWn.Hb=function(){return this.a?CJ(this.b):0},MWn.Ib=function(){return this.a?"OptionalDouble.of("+this.b+")":"OptionalDouble.empty()"},MWn.a=!1,MWn.b=0,vX(YWn,"OptionalDouble",463),wAn(517,1,{517:1},IO,kx),MWn.Fb=function(n){var t;return n===this||!!cL(n,517)&&(t=BB(n,517),this.a==t.a&&0==E$(this.b,t.b))},MWn.Hb=function(){return this.a?this.b:0},MWn.Ib=function(){return this.a?"OptionalInt.of("+this.b+")":"OptionalInt.empty()"},MWn.a=!1,MWn.b=0,vX(YWn,"OptionalInt",517),wAn(503,2004,ZWn,Xz),MWn.Gc=function(n){return ikn(this,n)},MWn.$b=function(){this.b.c=x8(Ant,HWn,1,0,5,1)},MWn.Hc=function(n){return-1!=(null==n?-1:E7(this.b,n,0))},MWn.Kc=function(){return new Vb(this)},MWn.Mc=function(n){return srn(this,n)},MWn.gc=function(){return this.b.c.length},MWn.Nc=function(){return new w1(this,256)},MWn.Pc=function(){return bx(this.b)},MWn.Qc=function(n){return Qgn(this.b,n)},vX(YWn,"PriorityQueue",503),wAn(1277,1,QWn,Vb),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return this.a<this.c.b.c.length},MWn.Pb=function(){return Px(this.a<this.c.b.c.length),this.b=this.a++,xq(this.c.b,this.b)},MWn.Qb=function(){Mx(-1!=this.b),hrn(this.c,this.a=this.b),this.b=-1},MWn.a=0,MWn.b=-1,vX(YWn,"PriorityQueue/1",1277),wAn(230,1,{230:1},sbn,C4),MWn.a=0,MWn.b=0;var Oet,Aet,$et,Let=0;vX(YWn,"Random",230),wAn(27,1,fVn,w1,zU,CV),MWn.qd=function(){return this.a},MWn.rd=function(){return Dz(this),this.c},MWn.Nb=function(n){Dz(this),this.d.Nb(n)},MWn.sd=function(n){return ntn(this,n)},MWn.a=0,MWn.c=0,vX(YWn,"Spliterators/IteratorSpliterator",27),wAn(485,27,fVn,wS),vX(YWn,"SortedSet/1",485),wAn(602,1,nYn,Qb),MWn.we=function(n){this.a.td(n)},vX(YWn,"Spliterator/OfDouble/0methodref$accept$Type",602),wAn(603,1,nYn,Yb),MWn.we=function(n){this.a.td(n)},vX(YWn,"Spliterator/OfDouble/1methodref$accept$Type",603),wAn(604,1,wVn,Jb),MWn.ud=function(n){this.a.td(iln(n))},vX(YWn,"Spliterator/OfInt/2methodref$accept$Type",604),wAn(605,1,wVn,Zb),MWn.ud=function(n){this.a.td(iln(n))},vX(YWn,"Spliterator/OfInt/3methodref$accept$Type",605),wAn(617,1,fVn),MWn.Nb=function(n){pE(this,n)},MWn.qd=function(){return this.d},MWn.rd=function(){return this.e},MWn.d=0,MWn.e=0,vX(YWn,"Spliterators/BaseSpliterator",617),wAn(721,617,fVn),MWn.xe=function(n){gE(this,n)},MWn.Nb=function(n){cL(n,182)?gE(this,BB(n,182)):gE(this,new Yb(n))},MWn.sd=function(n){return cL(n,182)?this.ye(BB(n,182)):this.ye(new Qb(n))},vX(YWn,"Spliterators/AbstractDoubleSpliterator",721),wAn(720,617,fVn),MWn.xe=function(n){gE(this,n)},MWn.Nb=function(n){cL(n,196)?gE(this,BB(n,196)):gE(this,new Zb(n))},MWn.sd=function(n){return cL(n,196)?this.ye(BB(n,196)):this.ye(new Jb(n))},vX(YWn,"Spliterators/AbstractIntSpliterator",720),wAn(540,617,fVn),vX(YWn,"Spliterators/AbstractSpliterator",540),wAn(692,1,fVn),MWn.Nb=function(n){pE(this,n)},MWn.qd=function(){return this.b},MWn.rd=function(){return this.d-this.c},MWn.b=0,MWn.c=0,MWn.d=0,vX(YWn,"Spliterators/BaseArraySpliterator",692),wAn(947,692,fVn,BH),MWn.ze=function(n,t){cj(this,BB(n,38),t)},MWn.Nb=function(n){DX(this,n)},MWn.sd=function(n){return K6(this,n)},vX(YWn,"Spliterators/ArraySpliterator",947),wAn(693,692,fVn,_K),MWn.ze=function(n,t){aj(this,BB(n,182),t)},MWn.xe=function(n){DX(this,n)},MWn.Nb=function(n){cL(n,182)?DX(this,BB(n,182)):DX(this,new Yb(n))},MWn.ye=function(n){return K6(this,n)},MWn.sd=function(n){return cL(n,182)?K6(this,BB(n,182)):K6(this,new Qb(n))},vX(YWn,"Spliterators/DoubleArraySpliterator",693),wAn(1968,1,fVn),MWn.Nb=function(n){pE(this,n)},MWn.qd=function(){return 16448},MWn.rd=function(){return 0},vX(YWn,"Spliterators/EmptySpliterator",1968),wAn(946,1968,fVn,z),MWn.xe=function(n){Bf(n)},MWn.Nb=function(n){cL(n,196)?Bf(BB(n,196)):Bf(new Zb(n))},MWn.ye=function(n){return bS(n)},MWn.sd=function(n){return cL(n,196)?bS(BB(n,196)):bS(new Jb(n))},vX(YWn,"Spliterators/EmptySpliterator/OfInt",946),wAn(580,52,fYn,_v),MWn.Vc=function(n,t){Kz(n,this.a.c.length+1),kG(this.a,n,t)},MWn.Fc=function(n){return WB(this.a,n)},MWn.Wc=function(n,t){return Kz(n,this.a.c.length+1),ohn(this.a,n,t)},MWn.Gc=function(n){return gun(this.a,n)},MWn.$b=function(){this.a.c=x8(Ant,HWn,1,0,5,1)},MWn.Hc=function(n){return-1!=E7(this.a,n,0)},MWn.Ic=function(n){return oun(this.a,n)},MWn.Jc=function(n){Otn(this.a,n)},MWn.Xb=function(n){return Kz(n,this.a.c.length),xq(this.a,n)},MWn.Xc=function(n){return E7(this.a,n,0)},MWn.dc=function(){return 0==this.a.c.length},MWn.Kc=function(){return new Wb(this.a)},MWn.$c=function(n){return Kz(n,this.a.c.length),s6(this.a,n)},MWn.Ud=function(n,t){h1(this.a,n,t)},MWn._c=function(n,t){return Kz(n,this.a.c.length),c5(this.a,n,t)},MWn.gc=function(){return this.a.c.length},MWn.ad=function(n){m$(this.a,n)},MWn.bd=function(n,t){return new s1(this.a,n,t)},MWn.Pc=function(){return bx(this.a)},MWn.Qc=function(n){return Qgn(this.a,n)},MWn.Ib=function(){return LMn(this.a)},vX(YWn,"Vector",580),wAn(809,580,fYn,om),vX(YWn,"Stack",809),wAn(206,1,{206:1},$an),MWn.Ib=function(){return W0(this)},vX(YWn,"StringJoiner",206),wAn(544,1992,{3:1,83:1,171:1,161:1},WT,Wz),MWn.$b=function(){my(this)},MWn.vc=function(){return new xN(this)},MWn.zc=function(n,t){return Mon(this,n,t)},MWn.Bc=function(n){return $J(this,n)},MWn.gc=function(){return this.c},MWn.c=0,vX(YWn,"TreeMap",544),wAn(390,1,QWn,BR),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return mx(this)},MWn.Ob=function(){return aS(this.a)},MWn.Qb=function(){e_(this)},vX(YWn,"TreeMap/EntryIterator",390),wAn(435,739,tVn,xN),MWn.$b=function(){my(this.a)},vX(YWn,"TreeMap/EntrySet",435),wAn(436,383,{484:1,383:1,42:1,436:1},H8),MWn.b=!1;var Net,xet,Det,Ret,Ket=vX(YWn,"TreeMap/Node",436);wAn(621,1,{},q),MWn.Ib=function(){return"State: mv="+this.c+" value="+this.d+" done="+this.a+" found="+this.b},MWn.a=!1,MWn.b=!1,MWn.c=!1,vX(YWn,"TreeMap/State",621),wAn(297,22,lYn,gS),MWn.Ae=function(){return!1},MWn.Be=function(){return!1};var _et,Fet=Ben(YWn,"TreeMap/SubMapType",297,Unt,J2,h_);wAn(1112,297,lYn,LA),MWn.Be=function(){return!0},Ben(YWn,"TreeMap/SubMapType/1",1112,Fet,null,null),wAn(1113,297,lYn,A$),MWn.Ae=function(){return!0},MWn.Be=function(){return!0},Ben(YWn,"TreeMap/SubMapType/2",1113,Fet,null,null),wAn(1114,297,lYn,NA),MWn.Ae=function(){return!0},Ben(YWn,"TreeMap/SubMapType/3",1114,Fet,null,null),wAn(208,nVn,{3:1,20:1,28:1,14:1,271:1,21:1,84:1,208:1},zv,dE),MWn.Nc=function(){return new wS(this)},MWn.Fc=function(n){return ZU(this,n)},MWn.$b=function(){my(this.a)},MWn.Hc=function(n){return DK(this.a,n)},MWn.Kc=function(){return new Fb(new BR(new xN(new _b(this.a).a).b))},MWn.Mc=function(n){return MN(this,n)},MWn.gc=function(){return this.a.c};var Bet=vX(YWn,"TreeSet",208);wAn(966,1,{},rw),MWn.Ce=function(n,t){return DD(this.a,n,t)},vX(bYn,"BinaryOperator/lambda$0$Type",966),wAn(967,1,{},cw),MWn.Ce=function(n,t){return RD(this.a,n,t)},vX(bYn,"BinaryOperator/lambda$1$Type",967),wAn(846,1,{},G),MWn.Kb=function(n){return n},vX(bYn,"Function/lambda$0$Type",846),wAn(431,1,DVn,aw),MWn.Mb=function(n){return!this.a.Mb(n)},vX(bYn,"Predicate/lambda$2$Type",431),wAn(572,1,{572:1});var Het,qet,Get=vX(wYn,"Handler",572);wAn(2007,1,KWn),MWn.ne=function(){return"DUMMY"},MWn.Ib=function(){return this.ne()},vX(wYn,"Level",2007),wAn(1621,2007,KWn,U),MWn.ne=function(){return"INFO"},vX(wYn,"Level/LevelInfo",1621),wAn(1640,1,{},Kv),vX(wYn,"LogManager",1640),wAn(1780,1,KWn,i_),MWn.b=null,vX(wYn,"LogRecord",1780),wAn(512,1,{512:1},y5),MWn.e=!1;var zet,Uet,Xet,Wet=!1,Vet=!1,Qet=!1,Yet=!1,Jet=!1;vX(wYn,"Logger",512),wAn(819,572,{572:1},X),vX(wYn,"SimpleConsoleLogHandler",819),wAn(132,22,{3:1,35:1,22:1,132:1},pS);var Zet,nit=Ben(pYn,"Collector/Characteristics",132,Unt,p1,f_);wAn(744,1,{},jU),vX(pYn,"CollectorImpl",744),wAn(1060,1,{},W),MWn.Ce=function(n,t){return Ofn(BB(n,206),BB(t,206))},vX(pYn,"Collectors/10methodref$merge$Type",1060),wAn(1061,1,{},V),MWn.Kb=function(n){return W0(BB(n,206))},vX(pYn,"Collectors/11methodref$toString$Type",1061),wAn(1062,1,{},uw),MWn.Kb=function(n){return hN(),!!TO(n)},vX(pYn,"Collectors/12methodref$test$Type",1062),wAn(251,1,{},B),MWn.Od=function(n,t){BB(n,14).Fc(t)},vX(pYn,"Collectors/20methodref$add$Type",251),wAn(253,1,{},H),MWn.Ee=function(){return new Np},vX(pYn,"Collectors/21methodref$ctor$Type",253),wAn(346,1,{},Q),MWn.Ee=function(){return new Rv},vX(pYn,"Collectors/23methodref$ctor$Type",346),wAn(347,1,{},Y),MWn.Od=function(n,t){TU(BB(n,53),t)},vX(pYn,"Collectors/24methodref$add$Type",347),wAn(1055,1,{},J),MWn.Ce=function(n,t){return ZT(BB(n,15),BB(t,14))},vX(pYn,"Collectors/4methodref$addAll$Type",1055),wAn(1059,1,{},Z),MWn.Od=function(n,t){b6(BB(n,206),BB(t,475))},vX(pYn,"Collectors/9methodref$add$Type",1059),wAn(1058,1,{},YB),MWn.Ee=function(){return new $an(this.a,this.b,this.c)},vX(pYn,"Collectors/lambda$15$Type",1058),wAn(1063,1,{},nn),MWn.Ee=function(){var n;return Jgn(n=new v4,(hN(),!1),new Np),Jgn(n,!0,new Np),n},vX(pYn,"Collectors/lambda$22$Type",1063),wAn(1064,1,{},ow),MWn.Ee=function(){return Pun(Gk(Ant,1),HWn,1,5,[this.a])},vX(pYn,"Collectors/lambda$25$Type",1064),wAn(1065,1,{},sw),MWn.Od=function(n,t){Bq(this.a,een(n))},vX(pYn,"Collectors/lambda$26$Type",1065),wAn(1066,1,{},hw),MWn.Ce=function(n,t){return _z(this.a,een(n),een(t))},vX(pYn,"Collectors/lambda$27$Type",1066),wAn(1067,1,{},tn),MWn.Kb=function(n){return een(n)[0]},vX(pYn,"Collectors/lambda$28$Type",1067),wAn(713,1,{},en),MWn.Ce=function(n,t){return Hq(n,t)},vX(pYn,"Collectors/lambda$4$Type",713),wAn(252,1,{},rn),MWn.Ce=function(n,t){return GT(BB(n,14),BB(t,14))},vX(pYn,"Collectors/lambda$42$Type",252),wAn(348,1,{},cn),MWn.Ce=function(n,t){return zT(BB(n,53),BB(t,53))},vX(pYn,"Collectors/lambda$50$Type",348),wAn(349,1,{},an),MWn.Kb=function(n){return BB(n,53)},vX(pYn,"Collectors/lambda$51$Type",349),wAn(1054,1,{},fw),MWn.Od=function(n,t){bsn(this.a,BB(n,83),t)},vX(pYn,"Collectors/lambda$7$Type",1054),wAn(1056,1,{},un),MWn.Ce=function(n,t){return pun(BB(n,83),BB(t,83),new J)},vX(pYn,"Collectors/lambda$8$Type",1056),wAn(1057,1,{},lw),MWn.Kb=function(n){return mbn(this.a,BB(n,83))},vX(pYn,"Collectors/lambda$9$Type",1057),wAn(539,1,{}),MWn.He=function(){jW(this)},MWn.d=!1,vX(pYn,"TerminatableStream",539),wAn(812,539,vYn,AD),MWn.He=function(){jW(this)},vX(pYn,"DoubleStreamImpl",812),wAn(1784,721,fVn,ZB),MWn.ye=function(n){return pmn(this,BB(n,182))},MWn.a=null,vX(pYn,"DoubleStreamImpl/2",1784),wAn(1785,1,nYn,bw),MWn.we=function(n){HA(this.a,n)},vX(pYn,"DoubleStreamImpl/2/lambda$0$Type",1785),wAn(1782,1,nYn,ww),MWn.we=function(n){BA(this.a,n)},vX(pYn,"DoubleStreamImpl/lambda$0$Type",1782),wAn(1783,1,nYn,dw),MWn.we=function(n){hdn(this.a,n)},vX(pYn,"DoubleStreamImpl/lambda$2$Type",1783),wAn(1358,720,fVn,m5),MWn.ye=function(n){return k2(this,BB(n,196))},MWn.a=0,MWn.b=0,MWn.c=0,vX(pYn,"IntStream/5",1358),wAn(787,539,vYn,$D),MWn.He=function(){jW(this)},MWn.Ie=function(){return EW(this),this.a},vX(pYn,"IntStreamImpl",787),wAn(788,539,vYn,VT),MWn.He=function(){jW(this)},MWn.Ie=function(){return EW(this),IL(),$et},vX(pYn,"IntStreamImpl/Empty",788),wAn(1463,1,wVn,gw),MWn.ud=function(n){ran(this.a,n)},vX(pYn,"IntStreamImpl/lambda$4$Type",1463);var tit,eit=bq(pYn,"Stream");wAn(30,539,{525:1,670:1,833:1},Rq),MWn.He=function(){jW(this)},vX(pYn,"StreamImpl",30),wAn(845,1,{},on),MWn.ld=function(n){return lH(n)},vX(pYn,"StreamImpl/0methodref$lambda$2$Type",845),wAn(1084,540,fVn,KK),MWn.sd=function(n){for(;$9(this);){if(this.a.sd(n))return!0;jW(this.b),this.b=null,this.a=null}return!1},vX(pYn,"StreamImpl/1",1084),wAn(1085,1,lVn,pw),MWn.td=function(n){iH(this.a,BB(n,833))},vX(pYn,"StreamImpl/1/lambda$0$Type",1085),wAn(1086,1,DVn,vw),MWn.Mb=function(n){return TU(this.a,n)},vX(pYn,"StreamImpl/1methodref$add$Type",1086),wAn(1087,540,fVn,vQ),MWn.sd=function(n){var t;return this.a||(t=new Np,this.b.a.Nb(new mw(t)),SQ(),m$(t,this.c),this.a=new w1(t,16)),ntn(this.a,n)},MWn.a=null,vX(pYn,"StreamImpl/5",1087),wAn(1088,1,lVn,mw),MWn.td=function(n){WB(this.a,n)},vX(pYn,"StreamImpl/5/2methodref$add$Type",1088),wAn(722,540,fVn,Q9),MWn.sd=function(n){for(this.b=!1;!this.b&&this.c.sd(new AS(this,n)););return this.b},MWn.b=!1,vX(pYn,"StreamImpl/FilterSpliterator",722),wAn(1079,1,lVn,AS),MWn.td=function(n){Rz(this.a,this.b,n)},vX(pYn,"StreamImpl/FilterSpliterator/lambda$0$Type",1079),wAn(1075,721,fVn,E6),MWn.ye=function(n){return jK(this,BB(n,182))},vX(pYn,"StreamImpl/MapToDoubleSpliterator",1075),wAn(1078,1,lVn,$S),MWn.td=function(n){jS(this.a,this.b,n)},vX(pYn,"StreamImpl/MapToDoubleSpliterator/lambda$0$Type",1078),wAn(1074,720,fVn,T6),MWn.ye=function(n){return EK(this,BB(n,196))},vX(pYn,"StreamImpl/MapToIntSpliterator",1074),wAn(1077,1,lVn,LS),MWn.td=function(n){kS(this.a,this.b,n)},vX(pYn,"StreamImpl/MapToIntSpliterator/lambda$0$Type",1077),wAn(719,540,fVn,M6),MWn.sd=function(n){return TK(this,n)},vX(pYn,"StreamImpl/MapToObjSpliterator",719),wAn(1076,1,lVn,NS),MWn.td=function(n){ES(this.a,this.b,n)},vX(pYn,"StreamImpl/MapToObjSpliterator/lambda$0$Type",1076),wAn(618,1,lVn,sn),MWn.td=function(n){Il(this,n)},vX(pYn,"StreamImpl/ValueConsumer",618),wAn(1080,1,lVn,hn),MWn.td=function(n){dM()},vX(pYn,"StreamImpl/lambda$0$Type",1080),wAn(1081,1,lVn,fn),MWn.td=function(n){dM()},vX(pYn,"StreamImpl/lambda$1$Type",1081),wAn(1082,1,{},yw),MWn.Ce=function(n,t){return F_(this.a,n,t)},vX(pYn,"StreamImpl/lambda$4$Type",1082),wAn(1083,1,lVn,IS),MWn.td=function(n){ER(this.b,this.a,n)},vX(pYn,"StreamImpl/lambda$5$Type",1083),wAn(1089,1,lVn,kw),MWn.td=function(n){Hon(this.a,BB(n,365))},vX(pYn,"TerminatableStream/lambda$0$Type",1089),wAn(2041,1,{}),wAn(1914,1,{},ln),vX("javaemul.internal","ConsoleLogger",1914),wAn(2038,1,{});var iit,rit,cit=0,ait=0;wAn(1768,1,lVn,bn),MWn.td=function(n){BB(n,308)},vX(TYn,"BowyerWatsonTriangulation/lambda$0$Type",1768),wAn(1769,1,lVn,jw),MWn.td=function(n){Frn(this.a,BB(n,308).e)},vX(TYn,"BowyerWatsonTriangulation/lambda$1$Type",1769),wAn(1770,1,lVn,wn),MWn.td=function(n){BB(n,168)},vX(TYn,"BowyerWatsonTriangulation/lambda$2$Type",1770),wAn(1765,1,MYn,Ew),MWn.ue=function(n,t){return q3(this.a,BB(n,168),BB(t,168))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(TYn,"NaiveMinST/lambda$0$Type",1765),wAn(499,1,{},Tw),vX(TYn,"NodeMicroLayout",499),wAn(168,1,{168:1},xS),MWn.Fb=function(n){var t;return!!cL(n,168)&&(t=BB(n,168),cV(this.a,t.a)&&cV(this.b,t.b)||cV(this.a,t.b)&&cV(this.b,t.a))},MWn.Hb=function(){return KA(this.a)+KA(this.b)};var uit=vX(TYn,"TEdge",168);wAn(308,1,{308:1},ZFn),MWn.Fb=function(n){var t;return!!cL(n,308)&&K7(this,(t=BB(n,308)).a)&&K7(this,t.b)&&K7(this,t.c)},MWn.Hb=function(){return KA(this.a)+KA(this.b)+KA(this.c)},vX(TYn,"TTriangle",308),wAn(221,1,{221:1},C$),vX(TYn,"Tree",221),wAn(1254,1,{},IZ),vX(SYn,"Scanline",1254);var oit=bq(SYn,PYn);wAn(1692,1,{},ltn),vX(CYn,"CGraph",1692),wAn(307,1,{307:1},cZ),MWn.b=0,MWn.c=0,MWn.d=0,MWn.g=0,MWn.i=0,MWn.k=KQn,vX(CYn,"CGroup",307),wAn(815,1,{},Xv),vX(CYn,"CGroup/CGroupBuilder",815),wAn(57,1,{57:1},AR),MWn.Ib=function(){return this.j?SD(this.j.Kb(this)):(ED(bit),bit.o+"@"+(PN(this)>>>0).toString(16))},MWn.f=0,MWn.i=KQn;var sit,hit,fit,lit,bit=vX(CYn,"CNode",57);wAn(814,1,{},Wv),vX(CYn,"CNode/CNodeBuilder",814),wAn(1525,1,{},dn),MWn.Oe=function(n,t){return 0},MWn.Pe=function(n,t){return 0},vX(CYn,OYn,1525),wAn(1790,1,{},gn),MWn.Le=function(n){var t,i,r,c,a,u,o,s,h,f,l,b,w,d,g;for(h=RQn,r=new Wb(n.a.b);r.a<r.c.c.length;)t=BB(n0(r),57),h=e.Math.min(h,t.a.j.d.c+t.b.a);for(w=new YT,u=new Wb(n.a.a);u.a<u.c.c.length;)(a=BB(n0(u),307)).k=h,0==a.g&&r5(w,a,w.c.b,w.c);for(;0!=w.b;){for(c=(a=BB(0==w.b?null:(Px(0!=w.b),Atn(w,w.a.a)),307)).j.d.c,b=a.a.a.ec().Kc();b.Ob();)f=BB(b.Pb(),57),g=a.k+f.b.a,!Ghn(n,a,n.d)||f.d.c<g?f.i=g:f.i=f.d.c;for(c-=a.j.i,a.b+=c,n.d==(Ffn(),FPt)||n.d==KPt?a.c+=c:a.c-=c,l=a.a.a.ec().Kc();l.Ob();)for(s=(f=BB(l.Pb(),57)).c.Kc();s.Ob();)o=BB(s.Pb(),57),d=dA(n.d)?n.g.Oe(f,o):n.g.Pe(f,o),o.a.k=e.Math.max(o.a.k,f.i+f.d.b+d-o.b.a),cY(n,o,n.d)&&(o.a.k=e.Math.max(o.a.k,o.d.c-o.b.a)),--o.a.g,0==o.a.g&&DH(w,o.a)}for(i=new Wb(n.a.b);i.a<i.c.c.length;)(t=BB(n0(i),57)).d.c=t.i},vX(CYn,"LongestPathCompaction",1790),wAn(1690,1,{},yOn),MWn.e=!1;var wit,dit,git=vX(CYn,xYn,1690);wAn(1691,1,lVn,Mw),MWn.td=function(n){iun(this.a,BB(n,46))},vX(CYn,DYn,1691),wAn(1791,1,{},pn),MWn.Me=function(n){var t,e,i,r,c,a;for(t=new Wb(n.a.b);t.a<t.c.c.length;)BB(n0(t),57).c.$b();for(i=new Wb(n.a.b);i.a<i.c.c.length;)for(e=BB(n0(i),57),c=new Wb(n.a.b);c.a<c.c.c.length;)e!=(r=BB(n0(c),57))&&(e.a&&e.a==r.a||(a=dA(n.d)?n.g.Pe(e,r):n.g.Oe(e,r),(r.d.c>e.d.c||e.d.c==r.d.c&&e.d.b<r.d.b)&&Rdn(r.d.d+r.d.a+a,e.d.d)&&Kdn(r.d.d,e.d.d+e.d.a+a)&&e.c.Fc(r)))},vX(CYn,"QuadraticConstraintCalculation",1791),wAn(522,1,{522:1},Dp),MWn.a=!1,MWn.b=!1,MWn.c=!1,MWn.d=!1,vX(CYn,RYn,522),wAn(803,1,{},RG),MWn.Me=function(n){this.c=n,pCn(this,new yn)},vX(CYn,KYn,803),wAn(1718,1,{679:1},fY),MWn.Ke=function(n){_Pn(this,BB(n,464))},vX(CYn,_Yn,1718),wAn(1719,1,MYn,vn),MWn.ue=function(n,t){return uQ(BB(n,57),BB(t,57))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(CYn,FYn,1719),wAn(464,1,{464:1},OS),MWn.a=!1,vX(CYn,BYn,464),wAn(1720,1,MYn,mn),MWn.ue=function(n,t){return Jkn(BB(n,464),BB(t,464))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(CYn,HYn,1720),wAn(1721,1,qYn,yn),MWn.Lb=function(n){return BB(n,57),!0},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return BB(n,57),!0},vX(CYn,"ScanlineConstraintCalculator/lambda$1$Type",1721),wAn(428,22,{3:1,35:1,22:1,428:1},FS);var pit,vit,mit,yit=Ben(GYn,"HighLevelSortingCriterion",428,Unt,rJ,l_);wAn(427,22,{3:1,35:1,22:1,427:1},BS);var kit,jit,Eit,Tit,Mit,Sit,Pit,Cit,Iit,Oit,Ait,$it,Lit,Nit,xit,Dit,Rit,Kit=Ben(GYn,"LowLevelSortingCriterion",427,Unt,cJ,b_),_it=bq(zYn,"ILayoutMetaDataProvider");wAn(853,1,QYn,Gh),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,UYn),YYn),"Polyomino Traversal Strategy"),"Traversal strategy for trying different candidate positions for polyominoes."),Cit),(PPn(),gMt)),Bit),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,XYn),YYn),"Polyomino Secondary Sorting Criterion"),"Possible secondary sorting criteria for the processing order of polyominoes. They are used when polyominoes are equal according to the primary sorting criterion HighLevelSortingCriterion."),Sit),gMt),Kit),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,WYn),YYn),"Polyomino Primary Sorting Criterion"),"Possible primary sorting criteria for the processing order of polyominoes."),Tit),gMt),yit),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,VYn),YYn),"Fill Polyominoes"),"Use the Profile Fill algorithm to fill polyominoes to prevent small polyominoes from being placed inside of big polyominoes with large holes. Might increase packing area."),(hN(),!0)),wMt),ktt),nbn(hMt))))},vX(GYn,"PolyominoOptions",853),wAn(250,22,{3:1,35:1,22:1,250:1},HS);var Fit,Bit=Ben(GYn,"TraversalStrategy",250,Unt,Tin,w_);wAn(213,1,{213:1},kn),MWn.Ib=function(){return"NEdge[id="+this.b+" w="+this.g+" d="+this.a+"]"},MWn.a=1,MWn.b=0,MWn.c=0,MWn.f=!1,MWn.g=0;var Hit=vX(JYn,"NEdge",213);wAn(176,1,{},Hv),vX(JYn,"NEdge/NEdgeBuilder",176),wAn(653,1,{},Fv),vX(JYn,"NGraph",653),wAn(121,1,{121:1},k6),MWn.c=-1,MWn.d=0,MWn.e=0,MWn.i=-1,MWn.j=!1;var qit=vX(JYn,"NNode",121);wAn(795,1,JQn,Bv),MWn.Jc=function(n){e5(this,n)},MWn.Lc=function(){return new Rq(null,new w1(this,16))},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Oc=function(){return new Rq(null,new w1(this,16))},MWn.Vc=function(n,t){++this.b,kG(this.a,n,t)},MWn.Fc=function(n){return RN(this,n)},MWn.Wc=function(n,t){return++this.b,ohn(this.a,n,t)},MWn.Gc=function(n){return++this.b,gun(this.a,n)},MWn.$b=function(){++this.b,this.a.c=x8(Ant,HWn,1,0,5,1)},MWn.Hc=function(n){return-1!=E7(this.a,n,0)},MWn.Ic=function(n){return oun(this.a,n)},MWn.Xb=function(n){return xq(this.a,n)},MWn.Xc=function(n){return E7(this.a,n,0)},MWn.dc=function(){return 0==this.a.c.length},MWn.Kc=function(){return L9(new Wb(this.a))},MWn.Yc=function(){throw Hp(new pv)},MWn.Zc=function(n){throw Hp(new pv)},MWn.$c=function(n){return++this.b,s6(this.a,n)},MWn.Mc=function(n){return KN(this,n)},MWn._c=function(n,t){return++this.b,c5(this.a,n,t)},MWn.gc=function(){return this.a.c.length},MWn.bd=function(n,t){return new s1(this.a,n,t)},MWn.Pc=function(){return bx(this.a)},MWn.Qc=function(n){return Qgn(this.a,n)},MWn.b=0,vX(JYn,"NNode/ChangeAwareArrayList",795),wAn(269,1,{},qv),vX(JYn,"NNode/NNodeBuilder",269),wAn(1630,1,{},jn),MWn.a=!1,MWn.f=DWn,MWn.j=0,vX(JYn,"NetworkSimplex",1630),wAn(1294,1,lVn,Sw),MWn.td=function(n){qzn(this.a,BB(n,680),!0,!1)},vX(nJn,"NodeLabelAndSizeCalculator/lambda$0$Type",1294),wAn(558,1,{},Pw),MWn.b=!0,MWn.c=!0,MWn.d=!0,MWn.e=!0,vX(nJn,"NodeMarginCalculator",558),wAn(212,1,{212:1}),MWn.j=!1,MWn.k=!1;var Git,zit,Uit,Xit=vX(tJn,"Cell",212);wAn(124,212,{124:1,212:1},FR),MWn.Re=function(){return XH(this)},MWn.Se=function(){var n;return n=this.n,this.a.a+n.b+n.c},vX(tJn,"AtomicCell",124),wAn(232,22,{3:1,35:1,22:1,232:1},qS);var Wit,Vit=Ben(tJn,"ContainerArea",232,Unt,v1,d_);wAn(326,212,iJn),vX(tJn,"ContainerCell",326),wAn(1473,326,iJn,Hwn),MWn.Re=function(){var n;return n=0,this.e?this.b?n=this.b.b:this.a[1][1]&&(n=this.a[1][1].Re()):n=Ybn(this,Umn(this,!0)),n>0?n+this.n.d+this.n.a:0},MWn.Se=function(){var n,t,i,r,c;if(c=0,this.e)this.b?c=this.b.a:this.a[1][1]&&(c=this.a[1][1].Se());else if(this.g)c=Ybn(this,Okn(this,null,!0));else for(Dtn(),i=0,r=(t=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;i<r;++i)n=t[i],c=e.Math.max(c,Ybn(this,Okn(this,n,!0)));return c>0?c+this.n.b+this.n.c:0},MWn.Te=function(){var n,t,e,i,r;if(this.g)for(n=Okn(this,null,!1),Dtn(),i=0,r=(e=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;i<r;++i)Vxn(this,t=e[i],n);else for(Dtn(),i=0,r=(e=Pun(Gk(Vit,1),$Vn,232,0,[Git,zit,Uit])).length;i<r;++i)Vxn(this,t=e[i],n=Okn(this,t,!1))},MWn.Ue=function(){var n,t,i,r;t=this.i,n=this.n,r=Umn(this,!1),Q5(this,(Dtn(),Git),t.d+n.d,r),Q5(this,Uit,t.d+t.a-n.a-r[2],r),i=t.a-n.d-n.a,r[0]>0&&(r[0]+=this.d,i-=r[0]),r[2]>0&&(r[2]+=this.d,i-=r[2]),this.c.a=e.Math.max(0,i),this.c.d=t.d+n.d+(this.c.a-i)/2,r[1]=e.Math.max(r[1],i),Q5(this,zit,t.d+n.d+r[0]-(r[1]-i)/2,r)},MWn.b=null,MWn.d=0,MWn.e=!1,MWn.f=!1,MWn.g=!1;var Qit,Yit,Jit,Zit=0,nrt=0;vX(tJn,"GridContainerCell",1473),wAn(461,22,{3:1,35:1,22:1,461:1},GS);var trt,ert=Ben(tJn,"HorizontalLabelAlignment",461,Unt,m1,g_);wAn(306,212,{212:1,306:1},yJ,wtn,KY),MWn.Re=function(){return WH(this)},MWn.Se=function(){return VH(this)},MWn.a=0,MWn.c=!1;var irt,rrt,crt,art=vX(tJn,"LabelCell",306);wAn(244,326,{212:1,326:1,244:1},Ign),MWn.Re=function(){return MIn(this)},MWn.Se=function(){return SIn(this)},MWn.Te=function(){_Fn(this)},MWn.Ue=function(){GFn(this)},MWn.b=0,MWn.c=0,MWn.d=!1,vX(tJn,"StripContainerCell",244),wAn(1626,1,DVn,En),MWn.Mb=function(n){return Qy(BB(n,212))},vX(tJn,"StripContainerCell/lambda$0$Type",1626),wAn(1627,1,{},Tn),MWn.Fe=function(n){return BB(n,212).Se()},vX(tJn,"StripContainerCell/lambda$1$Type",1627),wAn(1628,1,DVn,Mn),MWn.Mb=function(n){return Yy(BB(n,212))},vX(tJn,"StripContainerCell/lambda$2$Type",1628),wAn(1629,1,{},Sn),MWn.Fe=function(n){return BB(n,212).Re()},vX(tJn,"StripContainerCell/lambda$3$Type",1629),wAn(462,22,{3:1,35:1,22:1,462:1},zS);var urt,ort,srt,hrt,frt,lrt,brt,wrt,drt,grt,prt,vrt,mrt,yrt,krt,jrt,Ert,Trt,Mrt,Srt,Prt,Crt,Irt,Ort=Ben(tJn,"VerticalLabelAlignment",462,Unt,y1,p_);wAn(789,1,{},eUn),MWn.c=0,MWn.d=0,MWn.k=0,MWn.s=0,MWn.t=0,MWn.v=!1,MWn.w=0,MWn.D=!1,vX(sJn,"NodeContext",789),wAn(1471,1,MYn,Pn),MWn.ue=function(n,t){return YO(BB(n,61),BB(t,61))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(sJn,"NodeContext/0methodref$comparePortSides$Type",1471),wAn(1472,1,MYn,Cn),MWn.ue=function(n,t){return UTn(BB(n,111),BB(t,111))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(sJn,"NodeContext/1methodref$comparePortContexts$Type",1472),wAn(159,22,{3:1,35:1,22:1,159:1},ocn);var Art,$rt,Lrt,Nrt,xrt,Drt,Rrt,Krt=Ben(sJn,"NodeLabelLocation",159,Unt,tpn,v_);wAn(111,1,{111:1},MOn),MWn.a=!1,vX(sJn,"PortContext",111),wAn(1476,1,lVn,In),MWn.td=function(n){CE(BB(n,306))},vX(lJn,bJn,1476),wAn(1477,1,DVn,On),MWn.Mb=function(n){return!!BB(n,111).c},vX(lJn,wJn,1477),wAn(1478,1,lVn,An),MWn.td=function(n){CE(BB(n,111).c)},vX(lJn,"LabelPlacer/lambda$2$Type",1478),wAn(1475,1,lVn,Ln),MWn.td=function(n){qD(),Yp(BB(n,111))},vX(lJn,"NodeLabelAndSizeUtilities/lambda$0$Type",1475),wAn(790,1,lVn,$_),MWn.td=function(n){RM(this.b,this.c,this.a,BB(n,181))},MWn.a=!1,MWn.c=!1,vX(lJn,"NodeLabelCellCreator/lambda$0$Type",790),wAn(1474,1,lVn,Cw),MWn.td=function(n){Iv(this.a,BB(n,181))},vX(lJn,"PortContextCreator/lambda$0$Type",1474),wAn(1829,1,{},Nn),vX(gJn,"GreedyRectangleStripOverlapRemover",1829),wAn(1830,1,MYn,$n),MWn.ue=function(n,t){return FN(BB(n,222),BB(t,222))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(gJn,"GreedyRectangleStripOverlapRemover/0methodref$compareByYCoordinate$Type",1830),wAn(1786,1,{},Zv),MWn.a=5,MWn.e=0,vX(gJn,"RectangleStripOverlapRemover",1786),wAn(1787,1,MYn,Dn),MWn.ue=function(n,t){return BN(BB(n,222),BB(t,222))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(gJn,"RectangleStripOverlapRemover/0methodref$compareLeftRectangleBorders$Type",1787),wAn(1789,1,MYn,Rn),MWn.ue=function(n,t){return JU(BB(n,222),BB(t,222))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(gJn,"RectangleStripOverlapRemover/1methodref$compareRightRectangleBorders$Type",1789),wAn(406,22,{3:1,35:1,22:1,406:1},US);var _rt,Frt,Brt,Hrt,qrt,Grt=Ben(gJn,"RectangleStripOverlapRemover/OverlapRemovalDirection",406,Unt,Y2,m_);wAn(222,1,{222:1},xG),vX(gJn,"RectangleStripOverlapRemover/RectangleNode",222),wAn(1788,1,lVn,Iw),MWn.td=function(n){Cmn(this.a,BB(n,222))},vX(gJn,"RectangleStripOverlapRemover/lambda$1$Type",1788),wAn(1304,1,MYn,Kn),MWn.ue=function(n,t){return zHn(BB(n,167),BB(t,167))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/CornerCasesGreaterThanRestComparator",1304),wAn(1307,1,{},_n),MWn.Kb=function(n){return BB(n,324).a},vX(vJn,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$0$Type",1307),wAn(1308,1,DVn,Fn),MWn.Mb=function(n){return BB(n,323).a},vX(vJn,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$1$Type",1308),wAn(1309,1,DVn,Bn),MWn.Mb=function(n){return BB(n,323).a},vX(vJn,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$2$Type",1309),wAn(1302,1,MYn,Hn),MWn.ue=function(n,t){return WRn(BB(n,167),BB(t,167))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/MinNumOfExtensionDirectionsComparator",1302),wAn(1305,1,{},xn),MWn.Kb=function(n){return BB(n,324).a},vX(vJn,"PolyominoCompactor/MinNumOfExtensionDirectionsComparator/lambda$0$Type",1305),wAn(767,1,MYn,qn),MWn.ue=function(n,t){return Uan(BB(n,167),BB(t,167))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/MinNumOfExtensionsComparator",767),wAn(1300,1,MYn,Gn),MWn.ue=function(n,t){return Qin(BB(n,321),BB(t,321))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/MinPerimeterComparator",1300),wAn(1301,1,MYn,zn),MWn.ue=function(n,t){return avn(BB(n,321),BB(t,321))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/MinPerimeterComparatorWithShape",1301),wAn(1303,1,MYn,Un),MWn.ue=function(n,t){return BKn(BB(n,167),BB(t,167))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(vJn,"PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator",1303),wAn(1306,1,{},Xn),MWn.Kb=function(n){return BB(n,324).a},vX(vJn,"PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator/lambda$0$Type",1306),wAn(777,1,{},DS),MWn.Ce=function(n,t){return O2(this,BB(n,46),BB(t,167))},vX(vJn,"SuccessorCombination",777),wAn(644,1,{},Wn),MWn.Ce=function(n,t){var e;return XIn((e=BB(n,46),BB(t,167),e))},vX(vJn,"SuccessorJitter",644),wAn(643,1,{},Vn),MWn.Ce=function(n,t){var e;return bxn((e=BB(n,46),BB(t,167),e))},vX(vJn,"SuccessorLineByLine",643),wAn(568,1,{},Qn),MWn.Ce=function(n,t){var e;return f$n((e=BB(n,46),BB(t,167),e))},vX(vJn,"SuccessorManhattan",568),wAn(1356,1,{},Yn),MWn.Ce=function(n,t){var e;return jNn((e=BB(n,46),BB(t,167),e))},vX(vJn,"SuccessorMaxNormWindingInMathPosSense",1356),wAn(400,1,{},Ow),MWn.Ce=function(n,t){return BU(this,n,t)},MWn.c=!1,MWn.d=!1,MWn.e=!1,MWn.f=!1,vX(vJn,"SuccessorQuadrantsGeneric",400),wAn(1357,1,{},Jn),MWn.Kb=function(n){return BB(n,324).a},vX(vJn,"SuccessorQuadrantsGeneric/lambda$0$Type",1357),wAn(323,22,{3:1,35:1,22:1,323:1},_S),MWn.a=!1;var zrt,Urt=Ben(EJn,TJn,323,Unt,n3,y_);wAn(1298,1,{}),MWn.Ib=function(){var n,t,e,i,r,c;for(e=" ",n=iln(0),r=0;r<this.o;r++)e+=""+n.a,n=iln(lR(n.a));for(e+="\n",n=iln(0),c=0;c<this.p;c++){for(e+=""+n.a,n=iln(lR(n.a)),i=0;i<this.o;i++)0==Vhn(t=trn(this,i,c),0)?e+="_":0==Vhn(t,1)?e+="X":e+="0";e+="\n"}return fx(e,0,e.length-1)},MWn.o=0,MWn.p=0,vX(EJn,"TwoBitGrid",1298),wAn(321,1298,{321:1},qwn),MWn.j=0,MWn.k=0,vX(EJn,"PlanarGrid",321),wAn(167,321,{321:1,167:1}),MWn.g=0,MWn.i=0,vX(EJn,"Polyomino",167);var Xrt=bq(IJn,OJn);wAn(134,1,AJn,Zn),MWn.Ye=function(n,t){return son(this,n,t)},MWn.Ve=function(){return Gq(this)},MWn.We=function(n){return mMn(this,n)},MWn.Xe=function(n){return Lx(this,n)},vX(IJn,"MapPropertyHolder",134),wAn(1299,134,AJn,yxn),vX(EJn,"Polyominoes",1299);var Wrt,Vrt,Qrt,Yrt,Jrt,Zrt,nct,tct,ect=!1;wAn(1766,1,lVn,nt),MWn.td=function(n){uqn(BB(n,221))},vX($Jn,"DepthFirstCompaction/0methodref$compactTree$Type",1766),wAn(810,1,lVn,Aw),MWn.td=function(n){KW(this.a,BB(n,221))},vX($Jn,"DepthFirstCompaction/lambda$1$Type",810),wAn(1767,1,lVn,N_),MWn.td=function(n){dgn(this.a,this.b,this.c,BB(n,221))},vX($Jn,"DepthFirstCompaction/lambda$2$Type",1767),wAn(65,1,{65:1},AZ),vX($Jn,"Node",65),wAn(1250,1,{},I$),vX($Jn,"ScanlineOverlapCheck",1250),wAn(1251,1,{679:1},hY),MWn.Ke=function(n){GD(this,BB(n,440))},vX($Jn,"ScanlineOverlapCheck/OverlapsScanlineHandler",1251),wAn(1252,1,MYn,tt),MWn.ue=function(n,t){return xln(BB(n,65),BB(t,65))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX($Jn,"ScanlineOverlapCheck/OverlapsScanlineHandler/lambda$0$Type",1252),wAn(440,1,{440:1},RS),MWn.a=!1,vX($Jn,"ScanlineOverlapCheck/Timestamp",440),wAn(1253,1,MYn,et),MWn.ue=function(n,t){return Zkn(BB(n,440),BB(t,440))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX($Jn,"ScanlineOverlapCheck/lambda$0$Type",1253),wAn(550,1,{},it),vX(LJn,"SVGImage",550),wAn(324,1,{324:1},x_),MWn.Ib=function(){return"("+this.a+FWn+this.b+FWn+this.c+")"},vX(LJn,"UniqueTriple",324),wAn(209,1,NJn),vX(xJn,"AbstractLayoutProvider",209),wAn(1132,209,NJn,rt),MWn.Ze=function(n,t){var e,i,r;OTn(t,DJn,1),this.a=Gy(MD(ZAn(n,(Epn(),Ect)))),P8(n,bct)&&(i=SD(ZAn(n,bct)),(e=XRn(cin(),i))&&BB(sJ(e.f),209).Ze(n,mcn(t,1))),r=new s4(this.a),this.b=Rzn(r,n),0===BB(ZAn(n,(Gsn(),oct)),481).g?(BOn(new ct,this.b),Ypn(n,gct,mMn(this.b,gct))):$T(),Uzn(r),Ypn(n,dct,this.b),HSn(t)},MWn.a=0,vX(RJn,"DisCoLayoutProvider",1132),wAn(1244,1,{},ct),MWn.c=!1,MWn.e=0,MWn.f=0,vX(RJn,"DisCoPolyominoCompactor",1244),wAn(561,1,{561:1},hG),MWn.b=!0,vX(KJn,"DCComponent",561),wAn(394,22,{3:1,35:1,22:1,394:1},KS),MWn.a=!1;var ict,rct,cct=Ben(KJn,"DCDirection",394,Unt,Z2,k_);wAn(266,134,{3:1,266:1,94:1,134:1},EAn),vX(KJn,"DCElement",266),wAn(395,1,{395:1},Imn),MWn.c=0,vX(KJn,"DCExtension",395),wAn(755,134,AJn,_j),vX(KJn,"DCGraph",755),wAn(481,22,{3:1,35:1,22:1,481:1},Ix);var act,uct,oct,sct,hct,fct,lct,bct,wct,dct,gct,pct,vct,mct,yct,kct,jct,Ect,Tct,Mct,Sct,Pct=Ben(_Jn,FJn,481,Unt,RV,j_);wAn(854,1,QYn,Hh),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,BJn),zJn),"Connected Components Compaction Strategy"),"Strategy for packing different connected components in order to save space and enhance readability of a graph."),sct),(PPn(),gMt)),Pct),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,HJn),zJn),"Connected Components Layout Algorithm"),"A layout algorithm that is to be applied to each connected component before the components themselves are compacted. If unspecified, the positions of the components' nodes are not altered."),yMt),Qtt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,qJn),"debug"),"DCGraph"),"Access to the DCGraph is intended for the debug view,"),mMt),Ant),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,GJn),"debug"),"List of Polyominoes"),"Access to the polyominoes is intended for the debug view,"),mMt),Ant),nbn(hMt)))),BBn((new qh,n))},vX(_Jn,"DisCoMetaDataProvider",854),wAn(998,1,QYn,qh),MWn.Qe=function(n){BBn(n)},vX(_Jn,"DisCoOptions",998),wAn(999,1,{},at),MWn.$e=function(){return new rt},MWn._e=function(n){},vX(_Jn,"DisCoOptions/DiscoFactory",999),wAn(562,167,{321:1,167:1,562:1},Q$n),MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,vX("org.eclipse.elk.alg.disco.structures","DCPolyomino",562),wAn(1268,1,DVn,ut),MWn.Mb=function(n){return TO(n)},vX(YJn,"ElkGraphComponentsProcessor/lambda$0$Type",1268),wAn(1269,1,{},ot),MWn.Kb=function(n){return MQ(),PMn(BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$1$Type",1269),wAn(1270,1,DVn,st),MWn.Mb=function(n){return qH(BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$2$Type",1270),wAn(1271,1,{},ht),MWn.Kb=function(n){return MQ(),OMn(BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$3$Type",1271),wAn(1272,1,DVn,ft),MWn.Mb=function(n){return GH(BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$4$Type",1272),wAn(1273,1,DVn,$w),MWn.Mb=function(n){return MJ(this.a,BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$5$Type",1273),wAn(1274,1,{},Lw),MWn.Kb=function(n){return KX(this.a,BB(n,79))},vX(YJn,"ElkGraphComponentsProcessor/lambda$6$Type",1274),wAn(1241,1,{},s4),MWn.a=0,vX(YJn,"ElkGraphTransformer",1241),wAn(1242,1,{},lt),MWn.Od=function(n,t){tOn(this,BB(n,160),BB(t,266))},vX(YJn,"ElkGraphTransformer/OffsetApplier",1242),wAn(1243,1,lVn,Nw),MWn.td=function(n){TL(this,BB(n,8))},vX(YJn,"ElkGraphTransformer/OffsetApplier/OffSetToChainApplier",1243),wAn(753,1,{},bt),vX(eZn,iZn,753),wAn(1232,1,MYn,wt),MWn.ue=function(n,t){return CIn(BB(n,231),BB(t,231))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(eZn,rZn,1232),wAn(740,209,NJn,Gv),MWn.Ze=function(n,t){vLn(this,n,t)},vX(eZn,"ForceLayoutProvider",740),wAn(357,134,{3:1,357:1,94:1,134:1}),vX(cZn,"FParticle",357),wAn(559,357,{3:1,559:1,357:1,94:1,134:1},hX),MWn.Ib=function(){var n;return this.a?(n=E7(this.a.a,this,0))>=0?"b"+n+"["+u5(this.a)+"]":"b["+u5(this.a)+"]":"b_"+PN(this)},vX(cZn,"FBendpoint",559),wAn(282,134,{3:1,282:1,94:1,134:1},IR),MWn.Ib=function(){return u5(this)},vX(cZn,"FEdge",282),wAn(231,134,{3:1,231:1,94:1,134:1},y6);var Cct,Ict,Oct,Act,$ct,Lct,Nct,xct,Dct,Rct,Kct=vX(cZn,"FGraph",231);wAn(447,357,{3:1,447:1,357:1,94:1,134:1},m4),MWn.Ib=function(){return null==this.b||0==this.b.length?"l["+u5(this.a)+"]":"l_"+this.b},vX(cZn,"FLabel",447),wAn(144,357,{3:1,144:1,357:1,94:1,134:1},qX),MWn.Ib=function(){return p0(this)},MWn.b=0,vX(cZn,"FNode",144),wAn(2003,1,{}),MWn.bf=function(n){sFn(this,n)},MWn.cf=function(){qmn(this)},MWn.d=0,vX(uZn,"AbstractForceModel",2003),wAn(631,2003,{631:1},Lan),MWn.af=function(n,t){var i,r,c,a;return tIn(this.f,n,t),c=XR(B$(t.d),n.d),a=e.Math.sqrt(c.a*c.a+c.b*c.b),r=e.Math.max(0,a-lW(n.e)/2-lW(t.e)/2),kL(c,((i=qon(this.e,n,t))>0?-_U(r,this.c)*i:xx(r,this.b)*BB(mMn(n,(fRn(),Zct)),19).a)/a),c},MWn.bf=function(n){sFn(this,n),this.a=BB(mMn(n,(fRn(),qct)),19).a,this.c=Gy(MD(mMn(n,cat))),this.b=Gy(MD(mMn(n,tat)))},MWn.df=function(n){return n<this.a},MWn.a=0,MWn.b=0,MWn.c=0,vX(uZn,"EadesModel",631),wAn(632,2003,{632:1},fH),MWn.af=function(n,t){var i,r,c,a,u;return tIn(this.f,n,t),c=XR(B$(t.d),n.d),u=e.Math.sqrt(c.a*c.a+c.b*c.b),a=Nx(r=e.Math.max(0,u-lW(n.e)/2-lW(t.e)/2),this.a)*BB(mMn(n,(fRn(),Zct)),19).a,(i=qon(this.e,n,t))>0&&(a-=Sy(r,this.a)*i),kL(c,a*this.b/u),c},MWn.bf=function(n){var t,i,r,c,a,u,o;for(sFn(this,n),this.b=Gy(MD(mMn(n,(fRn(),aat)))),this.c=this.b/BB(mMn(n,qct),19).a,r=n.e.c.length,a=0,c=0,o=new Wb(n.e);o.a<o.c.c.length;)a+=(u=BB(n0(o),144)).e.a,c+=u.e.b;t=a*c,i=Gy(MD(mMn(n,cat)))*fJn,this.a=e.Math.sqrt(t/(2*r))*i},MWn.cf=function(){qmn(this),this.b-=this.c},MWn.df=function(n){return this.b>0},MWn.a=0,MWn.b=0,MWn.c=0,vX(uZn,"FruchtermanReingoldModel",632),wAn(849,1,QYn,zh),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,oZn),""),"Force Model"),"Determines the model for force calculation."),Oct),(PPn(),gMt)),$at),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,sZn),""),"Iterations"),"The number of iterations on the force model."),iln(300)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,hZn),""),"Repulsive Power"),"Determines how many bend points are added to the edge; such bend points are regarded as repelling particles in the force model"),iln(0)),vMt),Att),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,fZn),""),"FR Temperature"),"The temperature is used as a scaling factor for particle displacements."),lZn),dMt),Ptt),nbn(hMt)))),a2(n,fZn,oZn,xct),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,bZn),""),"Eades Repulsion"),"Factor for repulsive forces in Eades' model."),5),dMt),Ptt),nbn(hMt)))),a2(n,bZn,oZn,$ct),pUn((new Uh,n))},vX(wZn,"ForceMetaDataProvider",849),wAn(424,22,{3:1,35:1,22:1,424:1},XS);var _ct,Fct,Bct,Hct,qct,Gct,zct,Uct,Xct,Wct,Vct,Qct,Yct,Jct,Zct,nat,tat,eat,iat,rat,cat,aat,uat,oat,sat,hat,fat,lat,bat,wat,dat,gat,pat,vat,mat,yat,kat,jat,Eat,Tat,Mat,Sat,Pat,Cat,Iat,Oat,Aat,$at=Ben(wZn,"ForceModelStrategy",424,Unt,aJ,E_);wAn(988,1,QYn,Uh),MWn.Qe=function(n){pUn(n)},vX(wZn,"ForceOptions",988),wAn(989,1,{},dt),MWn.$e=function(){return new Gv},MWn._e=function(n){},vX(wZn,"ForceOptions/ForceFactory",989),wAn(850,1,QYn,Xh),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,NZn),""),"Fixed Position"),"Prevent that the node is moved by the layout algorithm."),(hN(),!1)),(PPn(),wMt)),ktt),nbn((rpn(),sMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,xZn),""),"Desired Edge Length"),"Either specified for parent nodes or for individual edges, where the latter takes higher precedence."),100),dMt),Ptt),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[uMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,DZn),""),"Layout Dimension"),"Dimensions that are permitted to be altered during layout."),bat),gMt),Hat),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,RZn),""),"Stress Epsilon"),"Termination criterion for the iterative process."),lZn),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,KZn),""),"Iteration Limit"),"Maximum number of performed iterations. Takes higher precedence than 'epsilon'."),iln(DWn)),vMt),Att),nbn(hMt)))),UGn((new Wh,n))},vX(wZn,"StressMetaDataProvider",850),wAn(992,1,QYn,Wh),MWn.Qe=function(n){UGn(n)},vX(wZn,"StressOptions",992),wAn(993,1,{},gt),MWn.$e=function(){return new OR},MWn._e=function(n){},vX(wZn,"StressOptions/StressFactory",993),wAn(1128,209,NJn,OR),MWn.Ze=function(n,t){var e,i,r,c;for(OTn(t,FZn,1),qy(TD(ZAn(n,(rkn(),kat))))?qy(TD(ZAn(n,Pat)))||jJ(new Tw((GM(),new Dy(n)))):vLn(new Gv,n,mcn(t,1)),i=fon(n),c=(e=HFn(this.a,i)).Kc();c.Ob();)(r=BB(c.Pb(),231)).e.c.length<=1||(HHn(this.b,r),i$n(this.b),Otn(r.d,new pt));SUn(i=GUn(e)),HSn(t)},vX(HZn,"StressLayoutProvider",1128),wAn(1129,1,lVn,pt),MWn.td=function(n){_Bn(BB(n,447))},vX(HZn,"StressLayoutProvider/lambda$0$Type",1129),wAn(990,1,{},Tv),MWn.c=0,MWn.e=0,MWn.g=0,vX(HZn,"StressMajorization",990),wAn(379,22,{3:1,35:1,22:1,379:1},WS);var Lat,Nat,xat,Dat,Rat,Kat,_at,Fat,Bat,Hat=Ben(HZn,"StressMajorization/Dimension",379,Unt,j1,T_);wAn(991,1,MYn,xw),MWn.ue=function(n,t){return SK(this.a,BB(n,144),BB(t,144))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(HZn,"StressMajorization/lambda$0$Type",991),wAn(1229,1,{},D0),vX(GZn,"ElkLayered",1229),wAn(1230,1,lVn,vt),MWn.td=function(n){RIn(BB(n,37))},vX(GZn,"ElkLayered/lambda$0$Type",1230),wAn(1231,1,lVn,Dw),MWn.td=function(n){PK(this.a,BB(n,37))},vX(GZn,"ElkLayered/lambda$1$Type",1231),wAn(1263,1,{},$$),vX(GZn,"GraphConfigurator",1263),wAn(759,1,lVn,Rw),MWn.td=function(n){VMn(this.a,BB(n,10))},vX(GZn,"GraphConfigurator/lambda$0$Type",759),wAn(760,1,{},mt),MWn.Kb=function(n){return tjn(),new Rq(null,new w1(BB(n,29).a,16))},vX(GZn,"GraphConfigurator/lambda$1$Type",760),wAn(761,1,lVn,Kw),MWn.td=function(n){VMn(this.a,BB(n,10))},vX(GZn,"GraphConfigurator/lambda$2$Type",761),wAn(1127,209,NJn,Uv),MWn.Ze=function(n,t){var e;e=SBn(new tm,n),GI(ZAn(n,(HXn(),sgt)))===GI((ufn(),pCt))?rwn(this.a,e,t):wOn(this.a,e,t),gUn(new Qh,e)},vX(GZn,"LayeredLayoutProvider",1127),wAn(356,22,{3:1,35:1,22:1,356:1},VS);var qat,Gat,zat,Uat=Ben(GZn,"LayeredPhases",356,Unt,s5,M_);wAn(1651,1,{},vin),MWn.i=0,vX(zZn,"ComponentsToCGraphTransformer",1651),wAn(1652,1,{},yt),MWn.ef=function(n,t){return e.Math.min(null!=n.a?Gy(n.a):n.c.i,null!=t.a?Gy(t.a):t.c.i)},MWn.ff=function(n,t){return e.Math.min(null!=n.a?Gy(n.a):n.c.i,null!=t.a?Gy(t.a):t.c.i)},vX(zZn,"ComponentsToCGraphTransformer/1",1652),wAn(81,1,{81:1}),MWn.i=0,MWn.k=!0,MWn.o=KQn;var Xat,Wat,Vat,Qat=vX(UZn,"CNode",81);wAn(460,81,{460:1,81:1},NN,Sgn),MWn.Ib=function(){return""},vX(zZn,"ComponentsToCGraphTransformer/CRectNode",460),wAn(1623,1,{},kt),vX(zZn,"OneDimensionalComponentsCompaction",1623),wAn(1624,1,{},jt),MWn.Kb=function(n){return xZ(BB(n,46))},MWn.Fb=function(n){return this===n},vX(zZn,"OneDimensionalComponentsCompaction/lambda$0$Type",1624),wAn(1625,1,{},Et),MWn.Kb=function(n){return Ewn(BB(n,46))},MWn.Fb=function(n){return this===n},vX(zZn,"OneDimensionalComponentsCompaction/lambda$1$Type",1625),wAn(1654,1,{},BX),vX(UZn,"CGraph",1654),wAn(189,1,{189:1},Pgn),MWn.b=0,MWn.c=0,MWn.e=0,MWn.g=!0,MWn.i=KQn,vX(UZn,"CGroup",189),wAn(1653,1,{},Pt),MWn.ef=function(n,t){return e.Math.max(null!=n.a?Gy(n.a):n.c.i,null!=t.a?Gy(t.a):t.c.i)},MWn.ff=function(n,t){return e.Math.max(null!=n.a?Gy(n.a):n.c.i,null!=t.a?Gy(t.a):t.c.i)},vX(UZn,OYn,1653),wAn(1655,1,{},sOn),MWn.d=!1;var Yat=vX(UZn,xYn,1655);wAn(1656,1,{},Ct),MWn.Kb=function(n){return kM(),hN(),0!=BB(BB(n,46).a,81).d.e},MWn.Fb=function(n){return this===n},vX(UZn,DYn,1656),wAn(823,1,{},Sq),MWn.a=!1,MWn.b=!1,MWn.c=!1,MWn.d=!1,vX(UZn,RYn,823),wAn(1825,1,{},DG),vX(XZn,KYn,1825);var Jat=bq(WZn,PYn);wAn(1826,1,{369:1},lY),MWn.Ke=function(n){Gxn(this,BB(n,466))},vX(XZn,_Yn,1826),wAn(1827,1,MYn,It),MWn.ue=function(n,t){return oQ(BB(n,81),BB(t,81))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(XZn,FYn,1827),wAn(466,1,{466:1},fP),MWn.a=!1,vX(XZn,BYn,466),wAn(1828,1,MYn,Ot),MWn.ue=function(n,t){return njn(BB(n,466),BB(t,466))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(XZn,HYn,1828),wAn(140,1,{140:1},dP,mH),MWn.Fb=function(n){var t;return null!=n&&iut==tsn(n)&&(t=BB(n,140),cV(this.c,t.c)&&cV(this.d,t.d))},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[this.c,this.d]))},MWn.Ib=function(){return"("+this.c+FWn+this.d+(this.a?"cx":"")+this.b+")"},MWn.a=!0,MWn.c=0,MWn.d=0;var Zat,nut,tut,eut,iut=vX(WZn,"Point",140);wAn(405,22,{3:1,35:1,22:1,405:1},QS);var rut,cut,aut,uut,out,sut,hut,fut,lut,but,wut,dut=Ben(WZn,"Point/Quadrant",405,Unt,t3,S_);wAn(1642,1,{},Vv),MWn.b=null,MWn.c=null,MWn.d=null,MWn.e=null,MWn.f=null,vX(WZn,"RectilinearConvexHull",1642),wAn(574,1,{369:1},Tpn),MWn.Ke=function(n){_9(this,BB(n,140))},MWn.b=0,vX(WZn,"RectilinearConvexHull/MaximalElementsEventHandler",574),wAn(1644,1,MYn,Mt),MWn.ue=function(n,t){return DV(MD(n),MD(t))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/MaximalElementsEventHandler/lambda$0$Type",1644),wAn(1643,1,{369:1},ftn),MWn.Ke=function(n){PNn(this,BB(n,140))},MWn.a=0,MWn.b=null,MWn.c=null,MWn.d=null,MWn.e=null,vX(WZn,"RectilinearConvexHull/RectangleEventHandler",1643),wAn(1645,1,MYn,St),MWn.ue=function(n,t){return u0(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$0$Type",1645),wAn(1646,1,MYn,Tt),MWn.ue=function(n,t){return o0(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$1$Type",1646),wAn(1647,1,MYn,At),MWn.ue=function(n,t){return h0(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$2$Type",1647),wAn(1648,1,MYn,$t),MWn.ue=function(n,t){return s0(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$3$Type",1648),wAn(1649,1,MYn,Lt),MWn.ue=function(n,t){return jMn(BB(n,140),BB(t,140))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(WZn,"RectilinearConvexHull/lambda$4$Type",1649),wAn(1650,1,{},OZ),vX(WZn,"Scanline",1650),wAn(2005,1,{}),vX(VZn,"AbstractGraphPlacer",2005),wAn(325,1,{325:1},Xx),MWn.mf=function(n){return!!this.nf(n)&&(JIn(this.b,BB(mMn(n,(hWn(),Xft)),21),n),!0)},MWn.nf=function(n){var t,e,i;for(t=BB(mMn(n,(hWn(),Xft)),21),i=BB(h6(fut,t),21).Kc();i.Ob();)if(e=BB(i.Pb(),21),!BB(h6(this.b,e),15).dc())return!1;return!0},vX(VZn,"ComponentGroup",325),wAn(765,2005,{},Qv),MWn.of=function(n){var t;for(t=new Wb(this.a);t.a<t.c.c.length;)if(BB(n0(t),325).mf(n))return;WB(this.a,new Xx(n))},MWn.lf=function(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w;if(this.a.c=x8(Ant,HWn,1,0,5,1),t.a.c=x8(Ant,HWn,1,0,5,1),n.dc())return t.f.a=0,void(t.f.b=0);for(qan(t,a=BB(n.Xb(0),37)),r=n.Kc();r.Ob();)i=BB(r.Pb(),37),this.of(i);for(w=new Gj,c=Gy(MD(mMn(a,(HXn(),mpt)))),s=new Wb(this.a);s.a<s.c.c.length;)h=TXn(u=BB(n0(s),325),c),w9(TX(u.b),w.a,w.b),w.a+=h.a,w.b+=h.b;if(t.f.a=w.a-c,t.f.b=w.b-c,qy(TD(mMn(a,Mdt)))&&GI(mMn(a,Zdt))===GI((Mbn(),QPt))){for(b=n.Kc();b.Ob();)ZRn(f=BB(b.Pb(),37),f.c.a,f.c.b);for(KXn(e=new Nt,n,c),l=n.Kc();l.Ob();)UR(kO((f=BB(l.Pb(),37)).c),e.e);UR(kO(t.f),e.a)}for(o=new Wb(this.a);o.a<o.c.c.length;)d9(t,TX((u=BB(n0(o),325)).b))},vX(VZn,"ComponentGroupGraphPlacer",765),wAn(1293,765,{},hm),MWn.of=function(n){pfn(this,n)},MWn.lf=function(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v;if(this.a.c=x8(Ant,HWn,1,0,5,1),t.a.c=x8(Ant,HWn,1,0,5,1),n.dc())return t.f.a=0,void(t.f.b=0);for(qan(t,a=BB(n.Xb(0),37)),r=n.Kc();r.Ob();)pfn(this,BB(r.Pb(),37));for(v=new Gj,p=new Gj,d=new Gj,w=new Gj,c=Gy(MD(mMn(a,(HXn(),mpt)))),s=new Wb(this.a);s.a<s.c.c.length;){if(u=BB(n0(s),325),dA(BB(mMn(t,(sWn(),bSt)),103))){for(d.a=v.a,g=new ly(MX(kX(u.b).a).a.kc());g.b.Ob();)if(BB(cS(g.b.Pb()),21).Hc((kUn(),sIt))){d.a=p.a;break}}else if(gA(BB(mMn(t,bSt),103)))for(d.b=v.b,g=new ly(MX(kX(u.b).a).a.kc());g.b.Ob();)if(BB(cS(g.b.Pb()),21).Hc((kUn(),CIt))){d.b=p.b;break}if(h=TXn(BB(u,570),c),w9(TX(u.b),d.a,d.b),dA(BB(mMn(t,bSt),103))){for(p.a=d.a+h.a,w.a=e.Math.max(w.a,p.a),g=new ly(MX(kX(u.b).a).a.kc());g.b.Ob();)if(BB(cS(g.b.Pb()),21).Hc((kUn(),SIt))){v.a=d.a+h.a;break}p.b=d.b+h.b,d.b=p.b,w.b=e.Math.max(w.b,d.b)}else if(gA(BB(mMn(t,bSt),103))){for(p.b=d.b+h.b,w.b=e.Math.max(w.b,p.b),g=new ly(MX(kX(u.b).a).a.kc());g.b.Ob();)if(BB(cS(g.b.Pb()),21).Hc((kUn(),oIt))){v.b=d.b+h.b;break}p.a=d.a+h.a,d.a=p.a,w.a=e.Math.max(w.a,d.a)}}if(t.f.a=w.a-c,t.f.b=w.b-c,qy(TD(mMn(a,Mdt)))&&GI(mMn(a,Zdt))===GI((Mbn(),QPt))){for(b=n.Kc();b.Ob();)ZRn(f=BB(b.Pb(),37),f.c.a,f.c.b);for(KXn(i=new Nt,n,c),l=n.Kc();l.Ob();)UR(kO((f=BB(l.Pb(),37)).c),i.e);UR(kO(t.f),i.a)}for(o=new Wb(this.a);o.a<o.c.c.length;)d9(t,TX((u=BB(n0(o),325)).b))},vX(VZn,"ComponentGroupModelOrderGraphPlacer",1293),wAn(423,22,{3:1,35:1,22:1,423:1},YS);var gut,put,vut,mut=Ben(VZn,"ComponentOrderingStrategy",423,Unt,k1,P_);wAn(650,1,{},Nt),vX(VZn,"ComponentsCompactor",650),wAn(1468,12,QQn,v5),MWn.Fc=function(n){return Yjn(this,BB(n,140))},vX(VZn,"ComponentsCompactor/Hullpoints",1468),wAn(1465,1,{841:1},hvn),MWn.a=!1,vX(VZn,"ComponentsCompactor/InternalComponent",1465),wAn(1464,1,pVn,Yv),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new Wb(this.a)},vX(VZn,"ComponentsCompactor/InternalConnectedComponents",1464),wAn(1467,1,{594:1},dOn),MWn.hf=function(){return null},MWn.jf=function(){return this.a},MWn.gf=function(){return upn(this.d)},MWn.kf=function(){return this.b},vX(VZn,"ComponentsCompactor/InternalExternalExtension",1467),wAn(1466,1,{594:1},nm),MWn.jf=function(){return this.a},MWn.gf=function(){return upn(this.d)},MWn.hf=function(){return this.c},MWn.kf=function(){return this.b},vX(VZn,"ComponentsCompactor/InternalUnionExternalExtension",1466),wAn(1470,1,{},Qxn),vX(VZn,"ComponentsCompactor/OuterSegments",1470),wAn(1469,1,{},Jv),vX(VZn,"ComponentsCompactor/Segments",1469),wAn(1264,1,{},bY),vX(VZn,iZn,1264),wAn(1265,1,MYn,xt),MWn.ue=function(n,t){return b0(BB(n,37),BB(t,37))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(VZn,"ComponentsProcessor/lambda$0$Type",1265),wAn(570,325,{325:1,570:1},p5),MWn.mf=function(n){return dsn(this,n)},MWn.nf=function(n){return bNn(this,n)},vX(VZn,"ModelOrderComponentGroup",570),wAn(1291,2005,{},Dt),MWn.lf=function(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j;if(1!=n.gc()){if(n.dc())return t.a.c=x8(Ant,HWn,1,0,5,1),t.f.a=0,void(t.f.b=0);if(GI(mMn(t,(HXn(),Cdt)))===GI((Bfn(),wut))){for(s=n.Kc();s.Ob();){for(p=0,d=new Wb((u=BB(s.Pb(),37)).a);d.a<d.c.c.length;)w=BB(n0(d),10),p+=BB(mMn(w,hpt),19).a;u.p=p}SQ(),n.ad(new Rt)}for(a=BB(n.Xb(0),37),t.a.c=x8(Ant,HWn,1,0,5,1),qan(t,a),b=0,y=0,h=n.Kc();h.Ob();)v=(u=BB(h.Pb(),37)).f,b=e.Math.max(b,v.a),y+=v.a*v.b;for(b=e.Math.max(b,e.Math.sqrt(y)*Gy(MD(mMn(t,Edt)))),k=0,j=0,l=0,i=c=Gy(MD(mMn(t,mpt))),o=n.Kc();o.Ob();)k+(v=(u=BB(o.Pb(),37)).f).a>b&&(k=0,j+=l+c,l=0),ZRn(u,k+(g=u.c).a,j+g.b),kO(g),i=e.Math.max(i,k+v.a),l=e.Math.max(l,v.b),k+=v.a+c;if(t.f.a=i,t.f.b=j+l,qy(TD(mMn(a,Mdt)))){for(KXn(r=new Nt,n,c),f=n.Kc();f.Ob();)UR(kO(BB(f.Pb(),37).c),r.e);UR(kO(t.f),r.a)}d9(t,n)}else(m=BB(n.Xb(0),37))!=t&&(t.a.c=x8(Ant,HWn,1,0,5,1),$Kn(t,m,0,0),qan(t,m),kQ(t.d,m.d),t.f.a=m.f.a,t.f.b=m.f.b)},vX(VZn,"SimpleRowGraphPlacer",1291),wAn(1292,1,MYn,Rt),MWn.ue=function(n,t){return zan(BB(n,37),BB(t,37))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(VZn,"SimpleRowGraphPlacer/1",1292),wAn(1262,1,qYn,Kt),MWn.Lb=function(n){var t;return!!(t=BB(mMn(BB(n,243).b,(HXn(),vgt)),74))&&0!=t.b},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){var t;return!!(t=BB(mMn(BB(n,243).b,(HXn(),vgt)),74))&&0!=t.b},vX(ZZn,"CompoundGraphPostprocessor/1",1262),wAn(1261,1,n1n,em),MWn.pf=function(n,t){mvn(this,BB(n,37),t)},vX(ZZn,"CompoundGraphPreprocessor",1261),wAn(441,1,{441:1},zfn),MWn.c=!1,vX(ZZn,"CompoundGraphPreprocessor/ExternalPort",441),wAn(243,1,{243:1},L_),MWn.Ib=function(){return dx(this.c)+":"+OIn(this.b)},vX(ZZn,"CrossHierarchyEdge",243),wAn(763,1,MYn,_w),MWn.ue=function(n,t){return Vyn(this,BB(n,243),BB(t,243))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(ZZn,"CrossHierarchyEdgeComparator",763),wAn(299,134,{3:1,299:1,94:1,134:1}),MWn.p=0,vX(t1n,"LGraphElement",299),wAn(17,299,{3:1,17:1,299:1,94:1,134:1},wY),MWn.Ib=function(){return OIn(this)};var yut=vX(t1n,"LEdge",17);wAn(37,299,{3:1,20:1,37:1,299:1,94:1,134:1},min),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new Wb(this.b)},MWn.Ib=function(){return 0==this.b.c.length?"G-unlayered"+LMn(this.a):0==this.a.c.length?"G-layered"+LMn(this.b):"G[layerless"+LMn(this.a)+", layers"+LMn(this.b)+"]"};var kut,jut=vX(t1n,"LGraph",37);wAn(657,1,{}),MWn.qf=function(){return this.e.n},MWn.We=function(n){return mMn(this.e,n)},MWn.rf=function(){return this.e.o},MWn.sf=function(){return this.e.p},MWn.Xe=function(n){return Lx(this.e,n)},MWn.tf=function(n){this.e.n.a=n.a,this.e.n.b=n.b},MWn.uf=function(n){this.e.o.a=n.a,this.e.o.b=n.b},MWn.vf=function(n){this.e.p=n},vX(t1n,"LGraphAdapters/AbstractLShapeAdapter",657),wAn(577,1,{839:1},Fw),MWn.wf=function(){var n,t;if(!this.b)for(this.b=sx(this.a.b.c.length),t=new Wb(this.a.b);t.a<t.c.c.length;)n=BB(n0(t),70),WB(this.b,new Bw(n));return this.b},MWn.b=null,vX(t1n,"LGraphAdapters/LEdgeAdapter",577),wAn(656,1,{},HV),MWn.xf=function(){var n,t,e,i,r;if(!this.b)for(this.b=new Np,e=new Wb(this.a.b);e.a<e.c.c.length;)for(r=new Wb(BB(n0(e),29).a);r.a<r.c.c.length;)if(i=BB(n0(r),10),this.c.Mb(i)&&(WB(this.b,new __(this,i,this.e)),this.d)){if(Lx(i,(hWn(),Klt)))for(t=BB(mMn(i,Klt),15).Kc();t.Ob();)n=BB(t.Pb(),10),WB(this.b,new __(this,n,!1));if(Lx(i,Dft))for(t=BB(mMn(i,Dft),15).Kc();t.Ob();)n=BB(t.Pb(),10),WB(this.b,new __(this,n,!1))}return this.b},MWn.qf=function(){throw Hp(new tk(i1n))},MWn.We=function(n){return mMn(this.a,n)},MWn.rf=function(){return this.a.f},MWn.sf=function(){return this.a.p},MWn.Xe=function(n){return Lx(this.a,n)},MWn.tf=function(n){throw Hp(new tk(i1n))},MWn.uf=function(n){this.a.f.a=n.a,this.a.f.b=n.b},MWn.vf=function(n){this.a.p=n},MWn.b=null,MWn.d=!1,MWn.e=!1,vX(t1n,"LGraphAdapters/LGraphAdapter",656),wAn(576,657,{181:1},Bw),vX(t1n,"LGraphAdapters/LLabelAdapter",576),wAn(575,657,{680:1},__),MWn.yf=function(){return this.b},MWn.zf=function(){return SQ(),SQ(),set},MWn.wf=function(){var n,t;if(!this.a)for(this.a=sx(BB(this.e,10).b.c.length),t=new Wb(BB(this.e,10).b);t.a<t.c.c.length;)n=BB(n0(t),70),WB(this.a,new Bw(n));return this.a},MWn.Af=function(){var n;return new HR((n=BB(this.e,10).d).d,n.c,n.a,n.b)},MWn.Bf=function(){return SQ(),SQ(),set},MWn.Cf=function(){var n,t;if(!this.c)for(this.c=sx(BB(this.e,10).j.c.length),t=new Wb(BB(this.e,10).j);t.a<t.c.c.length;)n=BB(n0(t),11),WB(this.c,new gP(n,this.d));return this.c},MWn.Df=function(){return qy(TD(mMn(BB(this.e,10),(hWn(),_ft))))},MWn.Ef=function(n){BB(this.e,10).d.b=n.b,BB(this.e,10).d.d=n.d,BB(this.e,10).d.c=n.c,BB(this.e,10).d.a=n.a},MWn.Ff=function(n){BB(this.e,10).f.b=n.b,BB(this.e,10).f.d=n.d,BB(this.e,10).f.c=n.c,BB(this.e,10).f.a=n.a},MWn.Gf=function(){Ntn(this,(gM(),kut))},MWn.a=null,MWn.b=null,MWn.c=null,MWn.d=!1,vX(t1n,"LGraphAdapters/LNodeAdapter",575),wAn(1722,657,{838:1},gP),MWn.zf=function(){var n,t,e,i;if(this.d&&BB(this.e,11).i.k==(uSn(),Iut))return SQ(),SQ(),set;if(!this.a){for(this.a=new Np,e=new Wb(BB(this.e,11).e);e.a<e.c.c.length;)n=BB(n0(e),17),WB(this.a,new Fw(n));if(this.d&&(i=BB(mMn(BB(this.e,11),(hWn(),Elt)),10)))for(t=new oz(ZL(fbn(i).a.Kc(),new h));dAn(t);)n=BB(U5(t),17),WB(this.a,new Fw(n))}return this.a},MWn.wf=function(){var n,t;if(!this.b)for(this.b=sx(BB(this.e,11).f.c.length),t=new Wb(BB(this.e,11).f);t.a<t.c.c.length;)n=BB(n0(t),70),WB(this.b,new Bw(n));return this.b},MWn.Bf=function(){var n,t,e,i;if(this.d&&BB(this.e,11).i.k==(uSn(),Iut))return SQ(),SQ(),set;if(!this.c){for(this.c=new Np,e=new Wb(BB(this.e,11).g);e.a<e.c.c.length;)n=BB(n0(e),17),WB(this.c,new Fw(n));if(this.d&&(i=BB(mMn(BB(this.e,11),(hWn(),Elt)),10)))for(t=new oz(ZL(lbn(i).a.Kc(),new h));dAn(t);)n=BB(U5(t),17),WB(this.c,new Fw(n))}return this.c},MWn.Hf=function(){return BB(this.e,11).j},MWn.If=function(){return qy(TD(mMn(BB(this.e,11),(hWn(),elt))))},MWn.a=null,MWn.b=null,MWn.c=null,MWn.d=!1,vX(t1n,"LGraphAdapters/LPortAdapter",1722),wAn(1723,1,MYn,_t),MWn.ue=function(n,t){return WDn(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(t1n,"LGraphAdapters/PortComparator",1723),wAn(804,1,DVn,Ft),MWn.Mb=function(n){return BB(n,10),gM(),!0},vX(t1n,"LGraphAdapters/lambda$0$Type",804),wAn(392,299,{3:1,299:1,392:1,94:1,134:1}),vX(t1n,"LShape",392),wAn(70,392,{3:1,299:1,70:1,392:1,94:1,134:1},qj,O$),MWn.Ib=function(){var n;return null==(n=YH(this))?"label":"l_"+n},vX(t1n,"LLabel",70),wAn(207,1,{3:1,4:1,207:1,414:1}),MWn.Fb=function(n){var t;return!!cL(n,207)&&(t=BB(n,207),this.d==t.d&&this.a==t.a&&this.b==t.b&&this.c==t.c)},MWn.Hb=function(){var n,t;return n=VO(this.b)<<16,n|=VO(this.a)&QVn,t=VO(this.c)<<16,n^(t|=VO(this.d)&QVn)},MWn.Jf=function(n){var t,e,i,r,c,a,u,o,s;for(r=0;r<n.length&&Dhn((b1(r,n.length),n.charCodeAt(r)),o1n);)++r;for(t=n.length;t>0&&Dhn((b1(t-1,n.length),n.charCodeAt(t-1)),s1n);)--t;if(r<t){o=kKn(n.substr(r,t-r),",|;");try{for(a=0,u=(c=o).length;a<u;++a){if(2!=(i=kKn(c[a],"=")).length)throw Hp(new _y("Expecting a list of key-value pairs."));e=RMn(i[0]),s=bSn(RMn(i[1])),mK(e,"top")?this.d=s:mK(e,"left")?this.b=s:mK(e,"bottom")?this.a=s:mK(e,"right")&&(this.c=s)}}catch(h){throw cL(h=lun(h),127)?Hp(new _y(h1n+h)):Hp(h)}}},MWn.Ib=function(){return"[top="+this.d+",left="+this.b+",bottom="+this.a+",right="+this.c+"]"},MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,vX(f1n,"Spacing",207),wAn(142,207,l1n,lm,lA,HR,A_);var Eut=vX(f1n,"ElkMargin",142);wAn(651,142,l1n,fm),vX(t1n,"LMargin",651),wAn(10,392,{3:1,299:1,10:1,392:1,94:1,134:1},$vn),MWn.Ib=function(){return $pn(this)},MWn.i=!1;var Tut,Mut,Sut,Put,Cut,Iut,Out=vX(t1n,"LNode",10);wAn(267,22,{3:1,35:1,22:1,267:1},JS);var Aut,$ut=Ben(t1n,"LNode/NodeType",267,Unt,u9,I_);wAn(116,207,b1n,bm,WA,O_);var Lut,Nut,xut,Dut,Rut,Kut,_ut=vX(f1n,"ElkPadding",116);wAn(764,116,b1n,wm),vX(t1n,"LPadding",764),wAn(11,392,{3:1,299:1,11:1,392:1,94:1,134:1},CSn),MWn.Ib=function(){var n,t,e;return oO(((n=new Ck).a+="p_",n),pyn(this)),this.i&&oO(uO((n.a+="[",n),this.i),"]"),1==this.e.c.length&&0==this.g.c.length&&BB(xq(this.e,0),17).c!=this&&(t=BB(xq(this.e,0),17).c,oO((n.a+=" << ",n),pyn(t)),oO(uO((n.a+="[",n),t.i),"]")),0==this.e.c.length&&1==this.g.c.length&&BB(xq(this.g,0),17).d!=this&&(e=BB(xq(this.g,0),17).d,oO((n.a+=" >> ",n),pyn(e)),oO(uO((n.a+="[",n),e.i),"]")),n.a},MWn.c=!0,MWn.d=!1;var Fut,But,Hut,qut,Gut=vX(t1n,"LPort",11);wAn(397,1,pVn,Hw),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new qw(new Wb(this.a.e))},vX(t1n,"LPort/1",397),wAn(1290,1,QWn,qw),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return BB(n0(this.a),17).c},MWn.Ob=function(){return y$(this.a)},MWn.Qb=function(){AU(this.a)},vX(t1n,"LPort/1/1",1290),wAn(359,1,pVn,Gw),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new zw(new Wb(this.a.g))},vX(t1n,"LPort/2",359),wAn(762,1,QWn,zw),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return BB(n0(this.a),17).d},MWn.Ob=function(){return y$(this.a)},MWn.Qb=function(){AU(this.a)},vX(t1n,"LPort/2/1",762),wAn(1283,1,pVn,hP),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new m6(this)},vX(t1n,"LPort/CombineIter",1283),wAn(201,1,QWn,m6),MWn.Nb=function(n){fU(this,n)},MWn.Qb=function(){uE()},MWn.Ob=function(){return zN(this)},MWn.Pb=function(){return y$(this.a)?n0(this.a):n0(this.b)},vX(t1n,"LPort/CombineIter/1",201),wAn(1285,1,qYn,Bt),MWn.Lb=function(n){return Az(n)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),0!=BB(n,11).e.c.length},vX(t1n,"LPort/lambda$0$Type",1285),wAn(1284,1,qYn,Ht),MWn.Lb=function(n){return $z(n)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),0!=BB(n,11).g.c.length},vX(t1n,"LPort/lambda$1$Type",1284),wAn(1286,1,qYn,qt),MWn.Lb=function(n){return gcn(),BB(n,11).j==(kUn(),sIt)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),BB(n,11).j==(kUn(),sIt)},vX(t1n,"LPort/lambda$2$Type",1286),wAn(1287,1,qYn,Gt),MWn.Lb=function(n){return gcn(),BB(n,11).j==(kUn(),oIt)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),BB(n,11).j==(kUn(),oIt)},vX(t1n,"LPort/lambda$3$Type",1287),wAn(1288,1,qYn,zt),MWn.Lb=function(n){return gcn(),BB(n,11).j==(kUn(),SIt)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),BB(n,11).j==(kUn(),SIt)},vX(t1n,"LPort/lambda$4$Type",1288),wAn(1289,1,qYn,Ut),MWn.Lb=function(n){return gcn(),BB(n,11).j==(kUn(),CIt)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return gcn(),BB(n,11).j==(kUn(),CIt)},vX(t1n,"LPort/lambda$5$Type",1289),wAn(29,299,{3:1,20:1,299:1,29:1,94:1,134:1},HX),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new Wb(this.a)},MWn.Ib=function(){return"L_"+E7(this.b.b,this,0)+LMn(this.a)},vX(t1n,"Layer",29),wAn(1342,1,{},tm),vX(d1n,g1n,1342),wAn(1346,1,{},Xt),MWn.Kb=function(n){return PTn(BB(n,82))},vX(d1n,"ElkGraphImporter/0methodref$connectableShapeToNode$Type",1346),wAn(1349,1,{},Wt),MWn.Kb=function(n){return PTn(BB(n,82))},vX(d1n,"ElkGraphImporter/1methodref$connectableShapeToNode$Type",1349),wAn(1343,1,lVn,Uw),MWn.td=function(n){POn(this.a,BB(n,118))},vX(d1n,p1n,1343),wAn(1344,1,lVn,Xw),MWn.td=function(n){POn(this.a,BB(n,118))},vX(d1n,v1n,1344),wAn(1345,1,{},Vt),MWn.Kb=function(n){return new Rq(null,new w1(pV(BB(n,79)),16))},vX(d1n,m1n,1345),wAn(1347,1,DVn,Ww),MWn.Mb=function(n){return _A(this.a,BB(n,33))},vX(d1n,y1n,1347),wAn(1348,1,{},Qt),MWn.Kb=function(n){return new Rq(null,new w1(vV(BB(n,79)),16))},vX(d1n,"ElkGraphImporter/lambda$5$Type",1348),wAn(1350,1,DVn,Vw),MWn.Mb=function(n){return FA(this.a,BB(n,33))},vX(d1n,"ElkGraphImporter/lambda$7$Type",1350),wAn(1351,1,DVn,Yt),MWn.Mb=function(n){return AQ(BB(n,79))},vX(d1n,"ElkGraphImporter/lambda$8$Type",1351),wAn(1278,1,{},Qh),vX(d1n,"ElkGraphLayoutTransferrer",1278),wAn(1279,1,DVn,Qw),MWn.Mb=function(n){return JR(this.a,BB(n,17))},vX(d1n,"ElkGraphLayoutTransferrer/lambda$0$Type",1279),wAn(1280,1,lVn,Yw),MWn.td=function(n){mM(),WB(this.a,BB(n,17))},vX(d1n,"ElkGraphLayoutTransferrer/lambda$1$Type",1280),wAn(1281,1,DVn,Jw),MWn.Mb=function(n){return UD(this.a,BB(n,17))},vX(d1n,"ElkGraphLayoutTransferrer/lambda$2$Type",1281),wAn(1282,1,lVn,Zw),MWn.td=function(n){mM(),WB(this.a,BB(n,17))},vX(d1n,"ElkGraphLayoutTransferrer/lambda$3$Type",1282),wAn(1485,1,n1n,Jt),MWn.pf=function(n,t){Vrn(BB(n,37),t)},vX(j1n,"CommentNodeMarginCalculator",1485),wAn(1486,1,{},Zt),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"CommentNodeMarginCalculator/lambda$0$Type",1486),wAn(1487,1,lVn,ne),MWn.td=function(n){tHn(BB(n,10))},vX(j1n,"CommentNodeMarginCalculator/lambda$1$Type",1487),wAn(1488,1,n1n,te),MWn.pf=function(n,t){aDn(BB(n,37),t)},vX(j1n,"CommentPostprocessor",1488),wAn(1489,1,n1n,ee),MWn.pf=function(n,t){uUn(BB(n,37),t)},vX(j1n,"CommentPreprocessor",1489),wAn(1490,1,n1n,ie),MWn.pf=function(n,t){jLn(BB(n,37),t)},vX(j1n,"ConstraintsPostprocessor",1490),wAn(1491,1,n1n,re),MWn.pf=function(n,t){can(BB(n,37),t)},vX(j1n,"EdgeAndLayerConstraintEdgeReverser",1491),wAn(1492,1,n1n,ce),MWn.pf=function(n,t){Gwn(BB(n,37),t)},vX(j1n,"EndLabelPostprocessor",1492),wAn(1493,1,{},ae),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"EndLabelPostprocessor/lambda$0$Type",1493),wAn(1494,1,DVn,ue),MWn.Mb=function(n){return MY(BB(n,10))},vX(j1n,"EndLabelPostprocessor/lambda$1$Type",1494),wAn(1495,1,lVn,oe),MWn.td=function(n){ejn(BB(n,10))},vX(j1n,"EndLabelPostprocessor/lambda$2$Type",1495),wAn(1496,1,n1n,se),MWn.pf=function(n,t){ZPn(BB(n,37),t)},vX(j1n,"EndLabelPreprocessor",1496),wAn(1497,1,{},he),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"EndLabelPreprocessor/lambda$0$Type",1497),wAn(1498,1,lVn,D_),MWn.td=function(n){KM(this.a,this.b,this.c,BB(n,10))},MWn.a=0,MWn.b=0,MWn.c=!1,vX(j1n,"EndLabelPreprocessor/lambda$1$Type",1498),wAn(1499,1,DVn,fe),MWn.Mb=function(n){return GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),XPt))},vX(j1n,"EndLabelPreprocessor/lambda$2$Type",1499),wAn(1500,1,lVn,nd),MWn.td=function(n){DH(this.a,BB(n,70))},vX(j1n,"EndLabelPreprocessor/lambda$3$Type",1500),wAn(1501,1,DVn,le),MWn.Mb=function(n){return GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),UPt))},vX(j1n,"EndLabelPreprocessor/lambda$4$Type",1501),wAn(1502,1,lVn,td),MWn.td=function(n){DH(this.a,BB(n,70))},vX(j1n,"EndLabelPreprocessor/lambda$5$Type",1502),wAn(1551,1,n1n,Vh),MWn.pf=function(n,t){Cln(BB(n,37),t)},vX(j1n,"EndLabelSorter",1551),wAn(1552,1,MYn,be),MWn.ue=function(n,t){return Hgn(BB(n,456),BB(t,456))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"EndLabelSorter/1",1552),wAn(456,1,{456:1},TQ),vX(j1n,"EndLabelSorter/LabelGroup",456),wAn(1553,1,{},we),MWn.Kb=function(n){return EM(),new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"EndLabelSorter/lambda$0$Type",1553),wAn(1554,1,DVn,de),MWn.Mb=function(n){return EM(),BB(n,10).k==(uSn(),Cut)},vX(j1n,"EndLabelSorter/lambda$1$Type",1554),wAn(1555,1,lVn,ge),MWn.td=function(n){oSn(BB(n,10))},vX(j1n,"EndLabelSorter/lambda$2$Type",1555),wAn(1556,1,DVn,pe),MWn.Mb=function(n){return EM(),GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),UPt))},vX(j1n,"EndLabelSorter/lambda$3$Type",1556),wAn(1557,1,DVn,ve),MWn.Mb=function(n){return EM(),GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),XPt))},vX(j1n,"EndLabelSorter/lambda$4$Type",1557),wAn(1503,1,n1n,me),MWn.pf=function(n,t){IHn(this,BB(n,37))},MWn.b=0,MWn.c=0,vX(j1n,"FinalSplineBendpointsCalculator",1503),wAn(1504,1,{},ye),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$0$Type",1504),wAn(1505,1,{},ke),MWn.Kb=function(n){return new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$1$Type",1505),wAn(1506,1,DVn,je),MWn.Mb=function(n){return!b5(BB(n,17))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$2$Type",1506),wAn(1507,1,DVn,Ee),MWn.Mb=function(n){return Lx(BB(n,17),(hWn(),Nlt))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$3$Type",1507),wAn(1508,1,lVn,ed),MWn.td=function(n){zKn(this.a,BB(n,128))},vX(j1n,"FinalSplineBendpointsCalculator/lambda$4$Type",1508),wAn(1509,1,lVn,Te),MWn.td=function(n){JPn(BB(n,17).a)},vX(j1n,"FinalSplineBendpointsCalculator/lambda$5$Type",1509),wAn(792,1,n1n,id),MWn.pf=function(n,t){Vqn(this,BB(n,37),t)},vX(j1n,"GraphTransformer",792),wAn(511,22,{3:1,35:1,22:1,511:1},ZS);var zut,Uut,Xut,Wut=Ben(j1n,"GraphTransformer/Mode",511,Unt,uJ,tB);wAn(1510,1,n1n,Me),MWn.pf=function(n,t){exn(BB(n,37),t)},vX(j1n,"HierarchicalNodeResizingProcessor",1510),wAn(1511,1,n1n,Se),MWn.pf=function(n,t){lrn(BB(n,37),t)},vX(j1n,"HierarchicalPortConstraintProcessor",1511),wAn(1512,1,MYn,Pe),MWn.ue=function(n,t){return Ipn(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"HierarchicalPortConstraintProcessor/NodeComparator",1512),wAn(1513,1,n1n,Ce),MWn.pf=function(n,t){jBn(BB(n,37),t)},vX(j1n,"HierarchicalPortDummySizeProcessor",1513),wAn(1514,1,n1n,Ie),MWn.pf=function(n,t){JDn(this,BB(n,37),t)},MWn.a=0,vX(j1n,"HierarchicalPortOrthogonalEdgeRouter",1514),wAn(1515,1,MYn,Oe),MWn.ue=function(n,t){return _N(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"HierarchicalPortOrthogonalEdgeRouter/1",1515),wAn(1516,1,MYn,Ae),MWn.ue=function(n,t){return P9(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"HierarchicalPortOrthogonalEdgeRouter/2",1516),wAn(1517,1,n1n,$e),MWn.pf=function(n,t){EMn(BB(n,37),t)},vX(j1n,"HierarchicalPortPositionProcessor",1517),wAn(1518,1,n1n,Yh),MWn.pf=function(n,t){rXn(this,BB(n,37))},MWn.a=0,MWn.c=0,vX(j1n,"HighDegreeNodeLayeringProcessor",1518),wAn(571,1,{571:1},Le),MWn.b=-1,MWn.d=-1,vX(j1n,"HighDegreeNodeLayeringProcessor/HighDegreeNodeInformation",571),wAn(1519,1,{},Ne),MWn.Kb=function(n){return q_(),fbn(BB(n,10))},MWn.Fb=function(n){return this===n},vX(j1n,"HighDegreeNodeLayeringProcessor/lambda$0$Type",1519),wAn(1520,1,{},xe),MWn.Kb=function(n){return q_(),lbn(BB(n,10))},MWn.Fb=function(n){return this===n},vX(j1n,"HighDegreeNodeLayeringProcessor/lambda$1$Type",1520),wAn(1526,1,n1n,De),MWn.pf=function(n,t){dFn(this,BB(n,37),t)},vX(j1n,"HyperedgeDummyMerger",1526),wAn(793,1,{},R_),MWn.a=!1,MWn.b=!1,MWn.c=!1,vX(j1n,"HyperedgeDummyMerger/MergeState",793),wAn(1527,1,{},Re),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"HyperedgeDummyMerger/lambda$0$Type",1527),wAn(1528,1,{},Ke),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,10).j,16))},vX(j1n,"HyperedgeDummyMerger/lambda$1$Type",1528),wAn(1529,1,lVn,_e),MWn.td=function(n){BB(n,11).p=-1},vX(j1n,"HyperedgeDummyMerger/lambda$2$Type",1529),wAn(1530,1,n1n,Fe),MWn.pf=function(n,t){bFn(BB(n,37),t)},vX(j1n,"HypernodesProcessor",1530),wAn(1531,1,n1n,Be),MWn.pf=function(n,t){wFn(BB(n,37),t)},vX(j1n,"InLayerConstraintProcessor",1531),wAn(1532,1,n1n,He),MWn.pf=function(n,t){Lcn(BB(n,37),t)},vX(j1n,"InnermostNodeMarginCalculator",1532),wAn(1533,1,n1n,qe),MWn.pf=function(n,t){Vzn(this,BB(n,37))},MWn.a=KQn,MWn.b=KQn,MWn.c=RQn,MWn.d=RQn;var Vut,Qut,Yut,Jut,Zut,not,tot,eot,iot,rot,cot,aot,uot,oot,sot,hot,fot,lot,bot,wot,dot,got,pot,vot,mot,yot,kot,jot,Eot,Tot,Mot,Sot,Pot,Cot,Iot,Oot,Aot,$ot,Lot,Not,xot,Dot,Rot,Kot,_ot,Fot,Bot,Hot,qot,Got,zot,Uot,Xot,Wot,Vot,Qot,Yot,Jot=vX(j1n,"InteractiveExternalPortPositioner",1533);wAn(1534,1,{},Ge),MWn.Kb=function(n){return BB(n,17).d.i},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$0$Type",1534),wAn(1535,1,{},rd),MWn.Kb=function(n){return qN(this.a,MD(n))},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$1$Type",1535),wAn(1536,1,{},ze),MWn.Kb=function(n){return BB(n,17).c.i},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$2$Type",1536),wAn(1537,1,{},cd),MWn.Kb=function(n){return GN(this.a,MD(n))},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$3$Type",1537),wAn(1538,1,{},ad),MWn.Kb=function(n){return WR(this.a,MD(n))},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$4$Type",1538),wAn(1539,1,{},ud),MWn.Kb=function(n){return VR(this.a,MD(n))},MWn.Fb=function(n){return this===n},vX(j1n,"InteractiveExternalPortPositioner/lambda$5$Type",1539),wAn(77,22,{3:1,35:1,22:1,77:1,234:1},nP),MWn.Kf=function(){switch(this.g){case 15:return new dc;case 22:return new gc;case 47:return new mc;case 28:case 35:return new ei;case 32:return new Jt;case 42:return new te;case 1:return new ee;case 41:return new ie;case 56:return new id((Srn(),qut));case 0:return new id((Srn(),Hut));case 2:return new re;case 54:return new ce;case 33:return new se;case 51:return new me;case 55:return new Me;case 13:return new Se;case 38:return new Ce;case 44:return new Ie;case 40:return new $e;case 9:return new Yh;case 49:return new ox;case 37:return new De;case 43:return new Fe;case 27:return new Be;case 30:return new He;case 3:return new qe;case 18:return new Xe;case 29:return new We;case 5:return new Jh;case 50:return new Ue;case 34:return new Zh;case 36:return new ii;case 52:return new Vh;case 11:return new ci;case 7:return new tf;case 39:return new ai;case 45:return new ui;case 16:return new oi;case 10:return new si;case 48:return new fi;case 21:return new li;case 23:return new Ny((oin(),Amt));case 8:return new wi;case 12:return new gi;case 4:return new pi;case 19:return new af;case 17:return new Pi;case 53:return new Ci;case 6:return new Bi;case 25:return new am;case 46:return new Ni;case 31:return new xR;case 14:return new Vi;case 26:return new Sc;case 20:return new nr;case 24:return new Ny((oin(),$mt));default:throw Hp(new _y(M1n+(null!=this.f?this.f:""+this.g)))}};var Zot,nst,tst,est,ist,rst,cst,ast,ust=Ben(j1n,S1n,77,Unt,ENn,nB);wAn(1540,1,n1n,Xe),MWn.pf=function(n,t){Jzn(BB(n,37),t)},vX(j1n,"InvertedPortProcessor",1540),wAn(1541,1,n1n,We),MWn.pf=function(n,t){LKn(BB(n,37),t)},vX(j1n,"LabelAndNodeSizeProcessor",1541),wAn(1542,1,DVn,Ve),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"LabelAndNodeSizeProcessor/lambda$0$Type",1542),wAn(1543,1,DVn,Qe),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Mut)},vX(j1n,"LabelAndNodeSizeProcessor/lambda$1$Type",1543),wAn(1544,1,lVn,K_),MWn.td=function(n){_M(this.b,this.a,this.c,BB(n,10))},MWn.a=!1,MWn.c=!1,vX(j1n,"LabelAndNodeSizeProcessor/lambda$2$Type",1544),wAn(1545,1,n1n,Jh),MWn.pf=function(n,t){fzn(BB(n,37),t)},vX(j1n,"LabelDummyInserter",1545),wAn(1546,1,qYn,Ye),MWn.Lb=function(n){return GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),zPt))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return GI(mMn(BB(n,70),(HXn(),Ydt)))===GI((Rtn(),zPt))},vX(j1n,"LabelDummyInserter/1",1546),wAn(1547,1,n1n,Ue),MWn.pf=function(n,t){Pqn(BB(n,37),t)},vX(j1n,"LabelDummyRemover",1547),wAn(1548,1,DVn,Je),MWn.Mb=function(n){return qy(TD(mMn(BB(n,70),(HXn(),Qdt))))},vX(j1n,"LabelDummyRemover/lambda$0$Type",1548),wAn(1359,1,n1n,Zh),MWn.pf=function(n,t){TGn(this,BB(n,37),t)},MWn.a=null,vX(j1n,"LabelDummySwitcher",1359),wAn(286,1,{286:1},cKn),MWn.c=0,MWn.d=null,MWn.f=0,vX(j1n,"LabelDummySwitcher/LabelDummyInfo",286),wAn(1360,1,{},Ze),MWn.Kb=function(n){return Irn(),new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"LabelDummySwitcher/lambda$0$Type",1360),wAn(1361,1,DVn,ni),MWn.Mb=function(n){return Irn(),BB(n,10).k==(uSn(),Sut)},vX(j1n,"LabelDummySwitcher/lambda$1$Type",1361),wAn(1362,1,{},hd),MWn.Kb=function(n){return XD(this.a,BB(n,10))},vX(j1n,"LabelDummySwitcher/lambda$2$Type",1362),wAn(1363,1,lVn,fd),MWn.td=function(n){YX(this.a,BB(n,286))},vX(j1n,"LabelDummySwitcher/lambda$3$Type",1363),wAn(1364,1,MYn,ti),MWn.ue=function(n,t){return Lz(BB(n,286),BB(t,286))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"LabelDummySwitcher/lambda$4$Type",1364),wAn(791,1,n1n,ei),MWn.pf=function(n,t){Y6(BB(n,37),t)},vX(j1n,"LabelManagementProcessor",791),wAn(1549,1,n1n,ii),MWn.pf=function(n,t){Nxn(BB(n,37),t)},vX(j1n,"LabelSideSelector",1549),wAn(1550,1,DVn,ri),MWn.Mb=function(n){return qy(TD(mMn(BB(n,70),(HXn(),Qdt))))},vX(j1n,"LabelSideSelector/lambda$0$Type",1550),wAn(1558,1,n1n,ci),MWn.pf=function(n,t){EBn(BB(n,37),t)},vX(j1n,"LayerConstraintPostprocessor",1558),wAn(1559,1,n1n,tf),MWn.pf=function(n,t){r$n(BB(n,37),t)},vX(j1n,"LayerConstraintPreprocessor",1559),wAn(360,22,{3:1,35:1,22:1,360:1},tP);var ost,sst,hst,fst,lst,bst,wst,dst,gst,pst=Ben(j1n,"LayerConstraintPreprocessor/HiddenNodeConnections",360,Unt,e3,z_);wAn(1560,1,n1n,ai),MWn.pf=function(n,t){Eqn(BB(n,37),t)},vX(j1n,"LayerSizeAndGraphHeightCalculator",1560),wAn(1561,1,n1n,ui),MWn.pf=function(n,t){ALn(BB(n,37),t)},vX(j1n,"LongEdgeJoiner",1561),wAn(1562,1,n1n,oi),MWn.pf=function(n,t){WHn(BB(n,37),t)},vX(j1n,"LongEdgeSplitter",1562),wAn(1563,1,n1n,si),MWn.pf=function(n,t){PGn(this,BB(n,37),t)},MWn.d=0,MWn.e=0,MWn.i=0,MWn.j=0,MWn.k=0,MWn.n=0,vX(j1n,"NodePromotion",1563),wAn(1564,1,{},hi),MWn.Kb=function(n){return BB(n,46),hN(),!0},MWn.Fb=function(n){return this===n},vX(j1n,"NodePromotion/lambda$0$Type",1564),wAn(1565,1,{},od),MWn.Kb=function(n){return aV(this.a,BB(n,46))},MWn.Fb=function(n){return this===n},MWn.a=0,vX(j1n,"NodePromotion/lambda$1$Type",1565),wAn(1566,1,{},sd),MWn.Kb=function(n){return uV(this.a,BB(n,46))},MWn.Fb=function(n){return this===n},MWn.a=0,vX(j1n,"NodePromotion/lambda$2$Type",1566),wAn(1567,1,n1n,fi),MWn.pf=function(n,t){XUn(BB(n,37),t)},vX(j1n,"NorthSouthPortPostprocessor",1567),wAn(1568,1,n1n,li),MWn.pf=function(n,t){MUn(BB(n,37),t)},vX(j1n,"NorthSouthPortPreprocessor",1568),wAn(1569,1,MYn,bi),MWn.ue=function(n,t){return Zan(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"NorthSouthPortPreprocessor/lambda$0$Type",1569),wAn(1570,1,n1n,wi),MWn.pf=function(n,t){$_n(BB(n,37),t)},vX(j1n,"PartitionMidprocessor",1570),wAn(1571,1,DVn,di),MWn.Mb=function(n){return Lx(BB(n,10),(HXn(),Wgt))},vX(j1n,"PartitionMidprocessor/lambda$0$Type",1571),wAn(1572,1,lVn,ld),MWn.td=function(n){$Q(this.a,BB(n,10))},vX(j1n,"PartitionMidprocessor/lambda$1$Type",1572),wAn(1573,1,n1n,gi),MWn.pf=function(n,t){wNn(BB(n,37),t)},vX(j1n,"PartitionPostprocessor",1573),wAn(1574,1,n1n,pi),MWn.pf=function(n,t){NOn(BB(n,37),t)},vX(j1n,"PartitionPreprocessor",1574),wAn(1575,1,DVn,vi),MWn.Mb=function(n){return Lx(BB(n,10),(HXn(),Wgt))},vX(j1n,"PartitionPreprocessor/lambda$0$Type",1575),wAn(1576,1,{},mi),MWn.Kb=function(n){return new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(j1n,"PartitionPreprocessor/lambda$1$Type",1576),wAn(1577,1,DVn,yi),MWn.Mb=function(n){return Lgn(BB(n,17))},vX(j1n,"PartitionPreprocessor/lambda$2$Type",1577),wAn(1578,1,lVn,ki),MWn.td=function(n){Run(BB(n,17))},vX(j1n,"PartitionPreprocessor/lambda$3$Type",1578),wAn(1579,1,n1n,af),MWn.pf=function(n,t){u_n(BB(n,37),t)},vX(j1n,"PortListSorter",1579),wAn(1580,1,{},ji),MWn.Kb=function(n){return zsn(),BB(n,11).e},vX(j1n,"PortListSorter/lambda$0$Type",1580),wAn(1581,1,{},Ei),MWn.Kb=function(n){return zsn(),BB(n,11).g},vX(j1n,"PortListSorter/lambda$1$Type",1581),wAn(1582,1,MYn,Ti),MWn.ue=function(n,t){return T4(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"PortListSorter/lambda$2$Type",1582),wAn(1583,1,MYn,Mi),MWn.ue=function(n,t){return Oyn(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"PortListSorter/lambda$3$Type",1583),wAn(1584,1,MYn,Si),MWn.ue=function(n,t){return nFn(BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"PortListSorter/lambda$4$Type",1584),wAn(1585,1,n1n,Pi),MWn.pf=function(n,t){WAn(BB(n,37),t)},vX(j1n,"PortSideProcessor",1585),wAn(1586,1,n1n,Ci),MWn.pf=function(n,t){IRn(BB(n,37),t)},vX(j1n,"ReversedEdgeRestorer",1586),wAn(1591,1,n1n,am),MWn.pf=function(n,t){Ymn(this,BB(n,37),t)},vX(j1n,"SelfLoopPortRestorer",1591),wAn(1592,1,{},Ii),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"SelfLoopPortRestorer/lambda$0$Type",1592),wAn(1593,1,DVn,Oi),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"SelfLoopPortRestorer/lambda$1$Type",1593),wAn(1594,1,DVn,Ai),MWn.Mb=function(n){return Lx(BB(n,10),(hWn(),Olt))},vX(j1n,"SelfLoopPortRestorer/lambda$2$Type",1594),wAn(1595,1,{},$i),MWn.Kb=function(n){return BB(mMn(BB(n,10),(hWn(),Olt)),403)},vX(j1n,"SelfLoopPortRestorer/lambda$3$Type",1595),wAn(1596,1,lVn,bd),MWn.td=function(n){SSn(this.a,BB(n,403))},vX(j1n,"SelfLoopPortRestorer/lambda$4$Type",1596),wAn(794,1,lVn,Li),MWn.td=function(n){nPn(BB(n,101))},vX(j1n,"SelfLoopPortRestorer/lambda$5$Type",794),wAn(1597,1,n1n,Ni),MWn.pf=function(n,t){Lpn(BB(n,37),t)},vX(j1n,"SelfLoopPostProcessor",1597),wAn(1598,1,{},xi),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"SelfLoopPostProcessor/lambda$0$Type",1598),wAn(1599,1,DVn,Di),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"SelfLoopPostProcessor/lambda$1$Type",1599),wAn(1600,1,DVn,Ri),MWn.Mb=function(n){return Lx(BB(n,10),(hWn(),Olt))},vX(j1n,"SelfLoopPostProcessor/lambda$2$Type",1600),wAn(1601,1,lVn,Ki),MWn.td=function(n){Ljn(BB(n,10))},vX(j1n,"SelfLoopPostProcessor/lambda$3$Type",1601),wAn(1602,1,{},_i),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,101).f,1))},vX(j1n,"SelfLoopPostProcessor/lambda$4$Type",1602),wAn(1603,1,lVn,wd),MWn.td=function(n){a3(this.a,BB(n,409))},vX(j1n,"SelfLoopPostProcessor/lambda$5$Type",1603),wAn(1604,1,DVn,Fi),MWn.Mb=function(n){return!!BB(n,101).i},vX(j1n,"SelfLoopPostProcessor/lambda$6$Type",1604),wAn(1605,1,lVn,dd),MWn.td=function(n){Ty(this.a,BB(n,101))},vX(j1n,"SelfLoopPostProcessor/lambda$7$Type",1605),wAn(1587,1,n1n,Bi),MWn.pf=function(n,t){Z$n(BB(n,37),t)},vX(j1n,"SelfLoopPreProcessor",1587),wAn(1588,1,{},Hi),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,101).f,1))},vX(j1n,"SelfLoopPreProcessor/lambda$0$Type",1588),wAn(1589,1,{},qi),MWn.Kb=function(n){return BB(n,409).a},vX(j1n,"SelfLoopPreProcessor/lambda$1$Type",1589),wAn(1590,1,lVn,Gi),MWn.td=function(n){q$(BB(n,17))},vX(j1n,"SelfLoopPreProcessor/lambda$2$Type",1590),wAn(1606,1,n1n,xR),MWn.pf=function(n,t){sSn(this,BB(n,37),t)},vX(j1n,"SelfLoopRouter",1606),wAn(1607,1,{},zi),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,29).a,16))},vX(j1n,"SelfLoopRouter/lambda$0$Type",1607),wAn(1608,1,DVn,Ui),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"SelfLoopRouter/lambda$1$Type",1608),wAn(1609,1,DVn,Xi),MWn.Mb=function(n){return Lx(BB(n,10),(hWn(),Olt))},vX(j1n,"SelfLoopRouter/lambda$2$Type",1609),wAn(1610,1,{},Wi),MWn.Kb=function(n){return BB(mMn(BB(n,10),(hWn(),Olt)),403)},vX(j1n,"SelfLoopRouter/lambda$3$Type",1610),wAn(1611,1,lVn,eP),MWn.td=function(n){QV(this.a,this.b,BB(n,403))},vX(j1n,"SelfLoopRouter/lambda$4$Type",1611),wAn(1612,1,n1n,Vi),MWn.pf=function(n,t){fxn(BB(n,37),t)},vX(j1n,"SemiInteractiveCrossMinProcessor",1612),wAn(1613,1,DVn,Qi),MWn.Mb=function(n){return BB(n,10).k==(uSn(),Cut)},vX(j1n,"SemiInteractiveCrossMinProcessor/lambda$0$Type",1613),wAn(1614,1,DVn,Yi),MWn.Mb=function(n){return Gq(BB(n,10))._b((HXn(),spt))},vX(j1n,"SemiInteractiveCrossMinProcessor/lambda$1$Type",1614),wAn(1615,1,MYn,Ji),MWn.ue=function(n,t){return drn(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(j1n,"SemiInteractiveCrossMinProcessor/lambda$2$Type",1615),wAn(1616,1,{},Zi),MWn.Ce=function(n,t){return XQ(BB(n,10),BB(t,10))},vX(j1n,"SemiInteractiveCrossMinProcessor/lambda$3$Type",1616),wAn(1618,1,n1n,nr),MWn.pf=function(n,t){MBn(BB(n,37),t)},vX(j1n,"SortByInputModelProcessor",1618),wAn(1619,1,DVn,tr),MWn.Mb=function(n){return 0!=BB(n,11).g.c.length},vX(j1n,"SortByInputModelProcessor/lambda$0$Type",1619),wAn(1620,1,lVn,gd),MWn.td=function(n){fPn(this.a,BB(n,11))},vX(j1n,"SortByInputModelProcessor/lambda$1$Type",1620),wAn(1693,803,{},grn),MWn.Me=function(n){var t,e,i,r;switch(this.c=n,this.a.g){case 2:t=new Np,JT(AV(new Rq(null,new w1(this.c.a.b,16)),new dr),new uP(this,t)),pCn(this,new rr),Otn(t,new cr),t.c=x8(Ant,HWn,1,0,5,1),JT(AV(new Rq(null,new w1(this.c.a.b,16)),new ar),new vd(t)),pCn(this,new ur),Otn(t,new or),t.c=x8(Ant,HWn,1,0,5,1),e=j$(icn(LV(new Rq(null,new w1(this.c.a.b,16)),new md(this))),new sr),JT(new Rq(null,new w1(this.c.a.a,16)),new rP(e,t)),pCn(this,new fr),Otn(t,new er),t.c=x8(Ant,HWn,1,0,5,1);break;case 3:i=new Np,pCn(this,new ir),r=j$(icn(LV(new Rq(null,new w1(this.c.a.b,16)),new pd(this))),new hr),JT(AV(new Rq(null,new w1(this.c.a.b,16)),new lr),new aP(r,i)),pCn(this,new br),Otn(i,new wr),i.c=x8(Ant,HWn,1,0,5,1);break;default:throw Hp(new kv)}},MWn.b=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation",1693),wAn(1694,1,qYn,ir),MWn.Lb=function(n){return cL(BB(n,57).g,145)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return cL(BB(n,57).g,145)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$0$Type",1694),wAn(1695,1,{},pd),MWn.Fe=function(n){return GCn(this.a,BB(n,57))},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$1$Type",1695),wAn(1703,1,RVn,iP),MWn.Vd=function(){Fkn(this.a,this.b,-1)},MWn.b=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$10$Type",1703),wAn(1705,1,qYn,rr),MWn.Lb=function(n){return cL(BB(n,57).g,145)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return cL(BB(n,57).g,145)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$11$Type",1705),wAn(1706,1,lVn,cr),MWn.td=function(n){BB(n,365).Vd()},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$12$Type",1706),wAn(1707,1,DVn,ar),MWn.Mb=function(n){return cL(BB(n,57).g,10)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$13$Type",1707),wAn(1709,1,lVn,vd),MWn.td=function(n){Ebn(this.a,BB(n,57))},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$14$Type",1709),wAn(1708,1,RVn,lP),MWn.Vd=function(){Fkn(this.b,this.a,-1)},MWn.a=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$15$Type",1708),wAn(1710,1,qYn,ur),MWn.Lb=function(n){return cL(BB(n,57).g,10)},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return cL(BB(n,57).g,10)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$16$Type",1710),wAn(1711,1,lVn,or),MWn.td=function(n){BB(n,365).Vd()},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$17$Type",1711),wAn(1712,1,{},md),MWn.Fe=function(n){return zCn(this.a,BB(n,57))},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$18$Type",1712),wAn(1713,1,{},sr),MWn.De=function(){return 0},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$19$Type",1713),wAn(1696,1,{},hr),MWn.De=function(){return 0},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$2$Type",1696),wAn(1715,1,lVn,rP),MWn.td=function(n){HG(this.a,this.b,BB(n,307))},MWn.a=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$20$Type",1715),wAn(1714,1,RVn,cP),MWn.Vd=function(){VAn(this.a,this.b,-1)},MWn.b=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$21$Type",1714),wAn(1716,1,qYn,fr),MWn.Lb=function(n){return BB(n,57),!0},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return BB(n,57),!0},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$22$Type",1716),wAn(1717,1,lVn,er),MWn.td=function(n){BB(n,365).Vd()},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$23$Type",1717),wAn(1697,1,DVn,lr),MWn.Mb=function(n){return cL(BB(n,57).g,10)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$3$Type",1697),wAn(1699,1,lVn,aP),MWn.td=function(n){qG(this.a,this.b,BB(n,57))},MWn.a=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$4$Type",1699),wAn(1698,1,RVn,bP),MWn.Vd=function(){Fkn(this.b,this.a,-1)},MWn.a=0,vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$5$Type",1698),wAn(1700,1,qYn,br),MWn.Lb=function(n){return BB(n,57),!0},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return BB(n,57),!0},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$6$Type",1700),wAn(1701,1,lVn,wr),MWn.td=function(n){BB(n,365).Vd()},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$7$Type",1701),wAn(1702,1,DVn,dr),MWn.Mb=function(n){return cL(BB(n,57).g,145)},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$8$Type",1702),wAn(1704,1,lVn,uP),MWn.td=function(n){Ttn(this.a,this.b,BB(n,57))},vX(A1n,"EdgeAwareScanlineConstraintCalculation/lambda$9$Type",1704),wAn(1521,1,n1n,ox),MWn.pf=function(n,t){cqn(this,BB(n,37),t)},vX(A1n,"HorizontalGraphCompactor",1521),wAn(1522,1,{},yd),MWn.Oe=function(n,t){var e,i;return Z7(n,t)?0:(e=f2(n),i=f2(t),e&&e.k==(uSn(),Mut)||i&&i.k==(uSn(),Mut)?0:UN(BB(mMn(this.a.a,(hWn(),Alt)),304),e?e.k:(uSn(),Put),i?i.k:(uSn(),Put)))},MWn.Pe=function(n,t){var e,i;return Z7(n,t)?1:(e=f2(n),i=f2(t),XN(BB(mMn(this.a.a,(hWn(),Alt)),304),e?e.k:(uSn(),Put),i?i.k:(uSn(),Put)))},vX(A1n,"HorizontalGraphCompactor/1",1522),wAn(1523,1,{},gr),MWn.Ne=function(n,t){return MM(),0==n.a.i},vX(A1n,"HorizontalGraphCompactor/lambda$0$Type",1523),wAn(1524,1,{},kd),MWn.Ne=function(n,t){return _Q(this.a,n,t)},vX(A1n,"HorizontalGraphCompactor/lambda$1$Type",1524),wAn(1664,1,{},I7),vX(A1n,"LGraphToCGraphTransformer",1664),wAn(1672,1,DVn,pr),MWn.Mb=function(n){return null!=n},vX(A1n,"LGraphToCGraphTransformer/0methodref$nonNull$Type",1672),wAn(1665,1,{},vr),MWn.Kb=function(n){return G_(),Bbn(mMn(BB(BB(n,57).g,10),(hWn(),dlt)))},vX(A1n,"LGraphToCGraphTransformer/lambda$0$Type",1665),wAn(1666,1,{},mr),MWn.Kb=function(n){return G_(),mfn(BB(BB(n,57).g,145))},vX(A1n,"LGraphToCGraphTransformer/lambda$1$Type",1666),wAn(1675,1,DVn,yr),MWn.Mb=function(n){return G_(),cL(BB(n,57).g,10)},vX(A1n,"LGraphToCGraphTransformer/lambda$10$Type",1675),wAn(1676,1,lVn,kr),MWn.td=function(n){KQ(BB(n,57))},vX(A1n,"LGraphToCGraphTransformer/lambda$11$Type",1676),wAn(1677,1,DVn,jr),MWn.Mb=function(n){return G_(),cL(BB(n,57).g,145)},vX(A1n,"LGraphToCGraphTransformer/lambda$12$Type",1677),wAn(1681,1,lVn,Er),MWn.td=function(n){vfn(BB(n,57))},vX(A1n,"LGraphToCGraphTransformer/lambda$13$Type",1681),wAn(1678,1,lVn,jd),MWn.td=function(n){uA(this.a,BB(n,8))},MWn.a=0,vX(A1n,"LGraphToCGraphTransformer/lambda$14$Type",1678),wAn(1679,1,lVn,Ed),MWn.td=function(n){sA(this.a,BB(n,110))},MWn.a=0,vX(A1n,"LGraphToCGraphTransformer/lambda$15$Type",1679),wAn(1680,1,lVn,Td),MWn.td=function(n){oA(this.a,BB(n,8))},MWn.a=0,vX(A1n,"LGraphToCGraphTransformer/lambda$16$Type",1680),wAn(1682,1,{},Tr),MWn.Kb=function(n){return G_(),new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(A1n,"LGraphToCGraphTransformer/lambda$17$Type",1682),wAn(1683,1,DVn,Mr),MWn.Mb=function(n){return G_(),b5(BB(n,17))},vX(A1n,"LGraphToCGraphTransformer/lambda$18$Type",1683),wAn(1684,1,lVn,Md),MWn.td=function(n){Snn(this.a,BB(n,17))},vX(A1n,"LGraphToCGraphTransformer/lambda$19$Type",1684),wAn(1668,1,lVn,Sd),MWn.td=function(n){l0(this.a,BB(n,145))},vX(A1n,"LGraphToCGraphTransformer/lambda$2$Type",1668),wAn(1685,1,{},Sr),MWn.Kb=function(n){return G_(),new Rq(null,new w1(BB(n,29).a,16))},vX(A1n,"LGraphToCGraphTransformer/lambda$20$Type",1685),wAn(1686,1,{},Pr),MWn.Kb=function(n){return G_(),new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(A1n,"LGraphToCGraphTransformer/lambda$21$Type",1686),wAn(1687,1,{},Cr),MWn.Kb=function(n){return G_(),BB(mMn(BB(n,17),(hWn(),Nlt)),15)},vX(A1n,"LGraphToCGraphTransformer/lambda$22$Type",1687),wAn(1688,1,DVn,Ir),MWn.Mb=function(n){return tx(BB(n,15))},vX(A1n,"LGraphToCGraphTransformer/lambda$23$Type",1688),wAn(1689,1,lVn,Pd),MWn.td=function(n){PCn(this.a,BB(n,15))},vX(A1n,"LGraphToCGraphTransformer/lambda$24$Type",1689),wAn(1667,1,lVn,oP),MWn.td=function(n){H3(this.a,this.b,BB(n,145))},vX(A1n,"LGraphToCGraphTransformer/lambda$3$Type",1667),wAn(1669,1,{},Or),MWn.Kb=function(n){return G_(),new Rq(null,new w1(BB(n,29).a,16))},vX(A1n,"LGraphToCGraphTransformer/lambda$4$Type",1669),wAn(1670,1,{},Ar),MWn.Kb=function(n){return G_(),new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(A1n,"LGraphToCGraphTransformer/lambda$5$Type",1670),wAn(1671,1,{},$r),MWn.Kb=function(n){return G_(),BB(mMn(BB(n,17),(hWn(),Nlt)),15)},vX(A1n,"LGraphToCGraphTransformer/lambda$6$Type",1671),wAn(1673,1,lVn,Cd),MWn.td=function(n){KIn(this.a,BB(n,15))},vX(A1n,"LGraphToCGraphTransformer/lambda$8$Type",1673),wAn(1674,1,lVn,sP),MWn.td=function(n){x$(this.a,this.b,BB(n,145))},vX(A1n,"LGraphToCGraphTransformer/lambda$9$Type",1674),wAn(1663,1,{},Lr),MWn.Le=function(n){var t,e,i,r,c;for(this.a=n,this.d=new Fv,this.c=x8(qit,HWn,121,this.a.a.a.c.length,0,1),this.b=0,e=new Wb(this.a.a.a);e.a<e.c.c.length;)(t=BB(n0(e),307)).d=this.b,c=AN(oM(new qv,t),this.d),this.c[this.b]=c,++this.b;for(JGn(this),AUn(this),ZLn(this),WKn(B_(this.d),new Xm),r=new Wb(this.a.a.b);r.a<r.c.c.length;)(i=BB(n0(r),57)).d.c=this.c[i.a.d].e+i.b.a},MWn.b=0,vX(A1n,"NetworkSimplexCompaction",1663),wAn(145,1,{35:1,145:1},PBn),MWn.wd=function(n){return Lnn(this,BB(n,145))},MWn.Ib=function(){return mfn(this)},vX(A1n,"VerticalSegment",145),wAn(827,1,{},zEn),MWn.c=0,MWn.e=0,MWn.i=0,vX($1n,"BetweenLayerEdgeTwoNodeCrossingsCounter",827),wAn(663,1,{663:1},kcn),MWn.Ib=function(){return"AdjacencyList [node="+this.d+", adjacencies= "+this.a+"]"},MWn.b=0,MWn.c=0,MWn.f=0,vX($1n,"BetweenLayerEdgeTwoNodeCrossingsCounter/AdjacencyList",663),wAn(287,1,{35:1,287:1},Gx),MWn.wd=function(n){return aq(this,BB(n,287))},MWn.Ib=function(){return"Adjacency [position="+this.c+", cardinality="+this.a+", currentCardinality="+this.b+"]"},MWn.a=0,MWn.b=0,MWn.c=0,vX($1n,"BetweenLayerEdgeTwoNodeCrossingsCounter/AdjacencyList/Adjacency",287),wAn(1929,1,{},ZSn),MWn.b=0,MWn.e=!1,vX($1n,"CrossingMatrixFiller",1929);var vst,mst,yst,kst,jst=bq(L1n,"IInitializable");wAn(1804,1,N1n,vP),MWn.Nf=function(n,t,e,i,r,c){},MWn.Pf=function(n,t,e){},MWn.Lf=function(){return this.c!=(oin(),Amt)},MWn.Mf=function(){this.e=x8(ANt,hQn,25,this.d,15,1)},MWn.Of=function(n,t){t[n][0].c.p=n},MWn.Qf=function(n,t,e,i){++this.d},MWn.Rf=function(){return!0},MWn.Sf=function(n,t,e,i){return Yhn(this,n,t,e),Z4(this,t)},MWn.Tf=function(n,t){var e;return Yhn(this,n,e=hj(t,n.length),t),bon(this,e)},MWn.d=0,vX($1n,"GreedySwitchHeuristic",1804),wAn(1930,1,{},lG),MWn.b=0,MWn.d=0,vX($1n,"NorthSouthEdgeNeighbouringNodeCrossingsCounter",1930),wAn(1917,1,{},uRn),MWn.a=!1,vX($1n,"SwitchDecider",1917),wAn(101,1,{101:1},pPn),MWn.a=null,MWn.c=null,MWn.i=null,vX(x1n,"SelfHyperLoop",101),wAn(1916,1,{},epn),MWn.c=0,MWn.e=0,vX(x1n,"SelfHyperLoopLabels",1916),wAn(411,22,{3:1,35:1,22:1,411:1},mP);var Est,Tst,Mst,Sst,Pst,Cst,Ist=Ben(x1n,"SelfHyperLoopLabels/Alignment",411,Unt,r3,U_);wAn(409,1,{409:1},j6),vX(x1n,"SelfLoopEdge",409),wAn(403,1,{403:1},Ogn),MWn.a=!1,vX(x1n,"SelfLoopHolder",403),wAn(1724,1,DVn,qr),MWn.Mb=function(n){return b5(BB(n,17))},vX(x1n,"SelfLoopHolder/lambda$0$Type",1724),wAn(113,1,{113:1},ipn),MWn.a=!1,MWn.c=!1,vX(x1n,"SelfLoopPort",113),wAn(1792,1,DVn,Gr),MWn.Mb=function(n){return b5(BB(n,17))},vX(x1n,"SelfLoopPort/lambda$0$Type",1792),wAn(363,22,{3:1,35:1,22:1,363:1},yP);var Ost,Ast,$st,Lst,Nst,xst,Dst,Rst,Kst=Ben(x1n,"SelfLoopType",363,Unt,x5,Y_);wAn(1732,1,{},uf),vX(D1n,"PortRestorer",1732),wAn(361,22,{3:1,35:1,22:1,361:1},kP);var _st,Fst,Bst,Hst,qst,Gst,zst,Ust,Xst,Wst=Ben(D1n,"PortRestorer/PortSideArea",361,Unt,P1,J_);wAn(1733,1,{},Wr),MWn.Kb=function(n){return _Mn(),BB(n,15).Oc()},vX(D1n,"PortRestorer/lambda$0$Type",1733),wAn(1734,1,lVn,Vr),MWn.td=function(n){_Mn(),BB(n,113).c=!1},vX(D1n,"PortRestorer/lambda$1$Type",1734),wAn(1743,1,DVn,Qr),MWn.Mb=function(n){return _Mn(),BB(n,11).j==(kUn(),CIt)},vX(D1n,"PortRestorer/lambda$10$Type",1743),wAn(1744,1,{},Yr),MWn.Kb=function(n){return _Mn(),BB(n,113).d},vX(D1n,"PortRestorer/lambda$11$Type",1744),wAn(1745,1,lVn,Id),MWn.td=function(n){Nj(this.a,BB(n,11))},vX(D1n,"PortRestorer/lambda$12$Type",1745),wAn(1735,1,lVn,Od),MWn.td=function(n){Ax(this.a,BB(n,101))},vX(D1n,"PortRestorer/lambda$2$Type",1735),wAn(1736,1,MYn,Jr),MWn.ue=function(n,t){return oen(BB(n,113),BB(t,113))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(D1n,"PortRestorer/lambda$3$Type",1736),wAn(1737,1,DVn,Zr),MWn.Mb=function(n){return _Mn(),BB(n,113).c},vX(D1n,"PortRestorer/lambda$4$Type",1737),wAn(1738,1,DVn,xr),MWn.Mb=function(n){return Acn(BB(n,11))},vX(D1n,"PortRestorer/lambda$5$Type",1738),wAn(1739,1,DVn,Nr),MWn.Mb=function(n){return _Mn(),BB(n,11).j==(kUn(),sIt)},vX(D1n,"PortRestorer/lambda$6$Type",1739),wAn(1740,1,DVn,Dr),MWn.Mb=function(n){return _Mn(),BB(n,11).j==(kUn(),oIt)},vX(D1n,"PortRestorer/lambda$7$Type",1740),wAn(1741,1,DVn,Rr),MWn.Mb=function(n){return c3(BB(n,11))},vX(D1n,"PortRestorer/lambda$8$Type",1741),wAn(1742,1,DVn,Kr),MWn.Mb=function(n){return _Mn(),BB(n,11).j==(kUn(),SIt)},vX(D1n,"PortRestorer/lambda$9$Type",1742),wAn(270,22,{3:1,35:1,22:1,270:1},WV);var Vst,Qst,Yst,Jst,Zst,nht,tht,eht,iht=Ben(D1n,"PortSideAssigner/Target",270,Unt,Ftn,X_);wAn(1725,1,{},_r),MWn.Kb=function(n){return AV(new Rq(null,new w1(BB(n,101).j,16)),new Xr)},vX(D1n,"PortSideAssigner/lambda$1$Type",1725),wAn(1726,1,{},Fr),MWn.Kb=function(n){return BB(n,113).d},vX(D1n,"PortSideAssigner/lambda$2$Type",1726),wAn(1727,1,lVn,Br),MWn.td=function(n){qCn(BB(n,11),(kUn(),sIt))},vX(D1n,"PortSideAssigner/lambda$3$Type",1727),wAn(1728,1,{},Hr),MWn.Kb=function(n){return BB(n,113).d},vX(D1n,"PortSideAssigner/lambda$4$Type",1728),wAn(1729,1,lVn,Ad),MWn.td=function(n){tv(this.a,BB(n,11))},vX(D1n,"PortSideAssigner/lambda$5$Type",1729),wAn(1730,1,MYn,zr),MWn.ue=function(n,t){return MW(BB(n,101),BB(t,101))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(D1n,"PortSideAssigner/lambda$6$Type",1730),wAn(1731,1,MYn,Ur),MWn.ue=function(n,t){return oH(BB(n,113),BB(t,113))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(D1n,"PortSideAssigner/lambda$7$Type",1731),wAn(805,1,DVn,Xr),MWn.Mb=function(n){return BB(n,113).c},vX(D1n,"PortSideAssigner/lambda$8$Type",805),wAn(2009,1,{}),vX(R1n,"AbstractSelfLoopRouter",2009),wAn(1750,1,MYn,nc),MWn.ue=function(n,t){return IK(BB(n,101),BB(t,101))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(R1n,bJn,1750),wAn(1751,1,MYn,tc),MWn.ue=function(n,t){return CK(BB(n,101),BB(t,101))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(R1n,wJn,1751),wAn(1793,2009,{},ec),MWn.Uf=function(n,t,e){return e},vX(R1n,"OrthogonalSelfLoopRouter",1793),wAn(1795,1,lVn,wP),MWn.td=function(n){pgn(this.b,this.a,BB(n,8))},vX(R1n,"OrthogonalSelfLoopRouter/lambda$0$Type",1795),wAn(1794,1793,{},ic),MWn.Uf=function(n,t,e){var i,r;return Kx(e,0,UR(B$((i=n.c.d).n),i.a)),DH(e,UR(B$((r=n.d.d).n),r.a)),E_n(e)},vX(R1n,"PolylineSelfLoopRouter",1794),wAn(1746,1,{},nf),MWn.a=null,vX(R1n,"RoutingDirector",1746),wAn(1747,1,MYn,rc),MWn.ue=function(n,t){return wH(BB(n,113),BB(t,113))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(R1n,"RoutingDirector/lambda$0$Type",1747),wAn(1748,1,{},cc),MWn.Kb=function(n){return SM(),BB(n,101).j},vX(R1n,"RoutingDirector/lambda$1$Type",1748),wAn(1749,1,lVn,ac),MWn.td=function(n){SM(),BB(n,15).ad(Qst)},vX(R1n,"RoutingDirector/lambda$2$Type",1749),wAn(1752,1,{},uc),vX(R1n,"RoutingSlotAssigner",1752),wAn(1753,1,DVn,$d),MWn.Mb=function(n){return CC(this.a,BB(n,101))},vX(R1n,"RoutingSlotAssigner/lambda$0$Type",1753),wAn(1754,1,MYn,Ld),MWn.ue=function(n,t){return Uq(this.a,BB(n,101),BB(t,101))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(R1n,"RoutingSlotAssigner/lambda$1$Type",1754),wAn(1796,1793,{},oc),MWn.Uf=function(n,t,e){var i,r,c,a;return i=Gy(MD(gpn(n.b.g.b,(HXn(),jpt)))),nLn(n,t,e,a=new Ux(Pun(Gk(PMt,1),sVn,8,0,[(c=n.c.d,UR(new wA(c.n),c.a))])),i),DH(a,UR(new wA((r=n.d.d).n),r.a)),Fvn(new oBn(a))},vX(R1n,"SplineSelfLoopRouter",1796),wAn(578,1,MYn,Grn,kH),MWn.ue=function(n,t){return fXn(this,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(K1n,"ModelOrderNodeComparator",578),wAn(1755,1,DVn,sc),MWn.Mb=function(n){return 0!=BB(n,11).e.c.length},vX(K1n,"ModelOrderNodeComparator/lambda$0$Type",1755),wAn(1756,1,{},hc),MWn.Kb=function(n){return BB(xq(BB(n,11).e,0),17).c},vX(K1n,"ModelOrderNodeComparator/lambda$1$Type",1756),wAn(1757,1,DVn,fc),MWn.Mb=function(n){return 0!=BB(n,11).e.c.length},vX(K1n,"ModelOrderNodeComparator/lambda$2$Type",1757),wAn(1758,1,{},lc),MWn.Kb=function(n){return BB(xq(BB(n,11).e,0),17).c},vX(K1n,"ModelOrderNodeComparator/lambda$3$Type",1758),wAn(1759,1,DVn,bc),MWn.Mb=function(n){return 0!=BB(n,11).e.c.length},vX(K1n,"ModelOrderNodeComparator/lambda$4$Type",1759),wAn(806,1,MYn,O7,pP),MWn.ue=function(n,t){return Nz(this,n,t)},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(K1n,"ModelOrderPortComparator",806),wAn(801,1,{},wc),MWn.Vf=function(n,t){var i,r,c,a;for(c=PSn(t),i=new Np,a=t.f/c,r=1;r<c;++r)WB(i,iln(dG(fan(e.Math.round(r*a)))));return i},MWn.Wf=function(){return!1},vX(_1n,"ARDCutIndexHeuristic",801),wAn(1479,1,n1n,dc),MWn.pf=function(n,t){oKn(BB(n,37),t)},vX(_1n,"BreakingPointInserter",1479),wAn(305,1,{305:1},v3),MWn.Ib=function(){var n;return(n=new Ck).a+="BPInfo[",n.a+="\n\tstart=",uO(n,this.i),n.a+="\n\tend=",uO(n,this.a),n.a+="\n\tnodeStartEdge=",uO(n,this.e),n.a+="\n\tstartEndEdge=",uO(n,this.j),n.a+="\n\toriginalEdge=",uO(n,this.f),n.a+="\n\tstartInLayerDummy=",uO(n,this.k),n.a+="\n\tstartInLayerEdge=",uO(n,this.n),n.a+="\n\tendInLayerDummy=",uO(n,this.b),n.a+="\n\tendInLayerEdge=",uO(n,this.c),n.a},vX(_1n,"BreakingPointInserter/BPInfo",305),wAn(652,1,{652:1},Hd),MWn.a=!1,MWn.b=0,MWn.c=0,vX(_1n,"BreakingPointInserter/Cut",652),wAn(1480,1,n1n,gc),MWn.pf=function(n,t){mLn(BB(n,37),t)},vX(_1n,"BreakingPointProcessor",1480),wAn(1481,1,DVn,pc),MWn.Mb=function(n){return Jnn(BB(n,10))},vX(_1n,"BreakingPointProcessor/0methodref$isEnd$Type",1481),wAn(1482,1,DVn,vc),MWn.Mb=function(n){return Znn(BB(n,10))},vX(_1n,"BreakingPointProcessor/1methodref$isStart$Type",1482),wAn(1483,1,n1n,mc),MWn.pf=function(n,t){rNn(this,BB(n,37),t)},vX(_1n,"BreakingPointRemover",1483),wAn(1484,1,lVn,yc),MWn.td=function(n){BB(n,128).k=!0},vX(_1n,"BreakingPointRemover/lambda$0$Type",1484),wAn(797,1,{},MAn),MWn.b=0,MWn.e=0,MWn.f=0,MWn.j=0,vX(_1n,"GraphStats",797),wAn(798,1,{},kc),MWn.Ce=function(n,t){return e.Math.max(Gy(MD(n)),Gy(MD(t)))},vX(_1n,"GraphStats/0methodref$max$Type",798),wAn(799,1,{},jc),MWn.Ce=function(n,t){return e.Math.max(Gy(MD(n)),Gy(MD(t)))},vX(_1n,"GraphStats/2methodref$max$Type",799),wAn(1660,1,{},Ec),MWn.Ce=function(n,t){return vB(MD(n),MD(t))},vX(_1n,"GraphStats/lambda$1$Type",1660),wAn(1661,1,{},Nd),MWn.Kb=function(n){return wpn(this.a,BB(n,29))},vX(_1n,"GraphStats/lambda$2$Type",1661),wAn(1662,1,{},xd),MWn.Kb=function(n){return VLn(this.a,BB(n,29))},vX(_1n,"GraphStats/lambda$6$Type",1662),wAn(800,1,{},Tc),MWn.Vf=function(n,t){return BB(mMn(n,(HXn(),_pt)),15)||(SQ(),SQ(),set)},MWn.Wf=function(){return!1},vX(_1n,"ICutIndexCalculator/ManualCutIndexCalculator",800),wAn(802,1,{},Mc),MWn.Vf=function(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k;for(null==t.n&&Dmn(t),k=t.n,null==t.d&&Dmn(t),s=t.d,(y=x8(xNt,qQn,25,k.length,15,1))[0]=k[0],v=k[0],h=1;h<k.length;h++)y[h]=y[h-1]+k[h],v+=k[h];for(c=PSn(t)-1,u=BB(mMn(n,(HXn(),Fpt)),19).a,r=KQn,i=new Np,b=e.Math.max(0,c-u);b<=e.Math.min(t.f-1,c+u);b++){if(g=v/(b+1),p=0,f=1,a=new Np,m=KQn,l=0,o=0,d=s[0],0==b)m=v,null==t.g&&(t.g=Xrn(t,new jc)),o=Gy(t.g);else{for(;f<t.f;)y[f-1]-p>=g&&(WB(a,iln(f)),m=e.Math.max(m,y[f-1]-l),o+=d,p+=y[f-1]-p,l=y[f-1],d=s[f]),d=e.Math.max(d,s[f]),++f;o+=d}(w=e.Math.min(1/m,1/t.b/o))>r&&(r=w,i=a)}return i},MWn.Wf=function(){return!1},vX(_1n,"MSDCutIndexHeuristic",802),wAn(1617,1,n1n,Sc),MWn.pf=function(n,t){bBn(BB(n,37),t)},vX(_1n,"SingleEdgeGraphWrapper",1617),wAn(227,22,{3:1,35:1,22:1,227:1},jP);var rht,cht,aht,uht=Ben(F1n,"CenterEdgeLabelPlacementStrategy",227,Unt,Z8,W_);wAn(422,22,{3:1,35:1,22:1,422:1},EP);var oht,sht,hht,fht,lht=Ben(F1n,"ConstraintCalculationStrategy",422,Unt,GY,V_);wAn(314,22,{3:1,35:1,22:1,314:1,246:1,234:1},TP),MWn.Kf=function(){return sIn(this)},MWn.Xf=function(){return sIn(this)};var bht,wht,dht,ght,pht=Ben(F1n,"CrossingMinimizationStrategy",314,Unt,T1,Q_);wAn(337,22,{3:1,35:1,22:1,337:1},MP);var vht,mht,yht,kht,jht,Eht,Tht=Ben(F1n,"CuttingStrategy",337,Unt,M1,Z_);wAn(335,22,{3:1,35:1,22:1,335:1,246:1,234:1},SP),MWn.Kf=function(){return RAn(this)},MWn.Xf=function(){return RAn(this)};var Mht,Sht,Pht,Cht=Ben(F1n,"CycleBreakingStrategy",335,Unt,L5,nF);wAn(419,22,{3:1,35:1,22:1,419:1},PP);var Iht,Oht,Aht,$ht,Lht=Ben(F1n,"DirectionCongruency",419,Unt,qY,tF);wAn(450,22,{3:1,35:1,22:1,450:1},CP);var Nht,xht,Dht,Rht,Kht,_ht,Fht,Bht=Ben(F1n,"EdgeConstraint",450,Unt,S1,eF);wAn(276,22,{3:1,35:1,22:1,276:1},IP);var Hht,qht,Ght,zht=Ben(F1n,"EdgeLabelSideSelection",276,Unt,i9,iF);wAn(479,22,{3:1,35:1,22:1,479:1},OP);var Uht,Xht,Wht,Vht,Qht,Yht,Jht,Zht=Ben(F1n,"EdgeStraighteningStrategy",479,Unt,HY,rF);wAn(274,22,{3:1,35:1,22:1,274:1},AP);var nft,tft,eft,ift,rft,cft,aft,uft=Ben(F1n,"FixedAlignment",274,Unt,t9,cF);wAn(275,22,{3:1,35:1,22:1,275:1},$P);var oft,sft,hft,fft,lft,bft,wft,dft,gft,pft,vft,mft=Ben(F1n,"GraphCompactionStrategy",275,Unt,n9,aF);wAn(256,22,{3:1,35:1,22:1,256:1},LP);var yft,kft,jft,Eft,Tft=Ben(F1n,"GraphProperties",256,Unt,bcn,uF);wAn(292,22,{3:1,35:1,22:1,292:1},NP);var Mft,Sft,Pft,Cft,Ift=Ben(F1n,"GreedySwitchType",292,Unt,I1,oF);wAn(303,22,{3:1,35:1,22:1,303:1},xP);var Oft,Aft,$ft,Lft=Ben(F1n,"InLayerConstraint",303,Unt,C1,sF);wAn(420,22,{3:1,35:1,22:1,420:1},DP);var Nft,xft,Dft,Rft,Kft,_ft,Fft,Bft,Hft,qft,Gft,zft,Uft,Xft,Wft,Vft,Qft,Yft,Jft,Zft,nlt,tlt,elt,ilt,rlt,clt,alt,ult,olt,slt,hlt,flt,llt,blt,wlt,dlt,glt,plt,vlt,mlt,ylt,klt,jlt,Elt,Tlt,Mlt,Slt,Plt,Clt,Ilt,Olt,Alt,$lt,Llt,Nlt,xlt,Dlt,Rlt,Klt,_lt,Flt,Blt,Hlt,qlt,Glt=Ben(F1n,"InteractiveReferencePoint",420,Unt,zY,hF);wAn(163,22,{3:1,35:1,22:1,163:1},BP);var zlt,Ult,Xlt,Wlt,Vlt,Qlt,Ylt,Jlt,Zlt,nbt,tbt,ebt,ibt,rbt,cbt,abt,ubt,obt,sbt,hbt,fbt,lbt,bbt,wbt,dbt,gbt,pbt,vbt,mbt,ybt,kbt,jbt,Ebt,Tbt,Mbt,Sbt,Pbt,Cbt,Ibt,Obt,Abt,$bt,Lbt,Nbt,xbt,Dbt,Rbt,Kbt,_bt,Fbt,Bbt,Hbt,qbt,Gbt,zbt,Ubt,Xbt,Wbt,Vbt,Qbt,Ybt,Jbt,Zbt,nwt,twt,ewt,iwt,rwt,cwt,awt,uwt,owt,swt,hwt,fwt,lwt,bwt,wwt,dwt,gwt,pwt,vwt,mwt,ywt,kwt,jwt,Ewt,Twt,Mwt,Swt,Pwt,Cwt,Iwt,Owt,Awt,$wt,Lwt,Nwt,xwt,Dwt,Rwt,Kwt,_wt,Fwt,Bwt,Hwt,qwt,Gwt,zwt,Uwt,Xwt,Wwt,Vwt,Qwt,Ywt,Jwt,Zwt,ndt,tdt,edt,idt,rdt,cdt,adt,udt,odt,sdt,hdt,fdt,ldt,bdt,wdt,ddt,gdt,pdt,vdt,mdt,ydt,kdt,jdt,Edt,Tdt,Mdt,Sdt,Pdt,Cdt,Idt,Odt,Adt,$dt,Ldt,Ndt,xdt,Ddt,Rdt,Kdt,_dt,Fdt,Bdt,Hdt,qdt,Gdt,zdt,Udt,Xdt,Wdt,Vdt,Qdt,Ydt,Jdt,Zdt,ngt,tgt,egt,igt,rgt,cgt,agt,ugt,ogt,sgt,hgt,fgt,lgt,bgt,wgt,dgt,ggt,pgt,vgt,mgt,ygt,kgt,jgt,Egt,Tgt,Mgt,Sgt,Pgt,Cgt,Igt,Ogt,Agt,$gt,Lgt,Ngt,xgt,Dgt,Rgt,Kgt,_gt,Fgt,Bgt,Hgt,qgt,Ggt,zgt,Ugt,Xgt,Wgt,Vgt,Qgt,Ygt,Jgt,Zgt,npt,tpt,ept,ipt,rpt,cpt,apt,upt,opt,spt,hpt,fpt,lpt,bpt,wpt,dpt,gpt,ppt,vpt,mpt,ypt,kpt,jpt,Ept,Tpt,Mpt,Spt,Ppt,Cpt,Ipt,Opt,Apt,$pt,Lpt,Npt,xpt,Dpt,Rpt,Kpt,_pt,Fpt,Bpt,Hpt,qpt,Gpt,zpt,Upt,Xpt,Wpt,Vpt,Qpt,Ypt,Jpt,Zpt,nvt,tvt,evt,ivt=Ben(F1n,"LayerConstraint",163,Unt,D5,fF);wAn(848,1,QYn,hf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,U1n),""),"Direction Congruency"),"Specifies how drawings of the same graph with different layout directions compare to each other: either a natural reading direction is preserved or the drawings are rotated versions of each other."),Pbt),(PPn(),gMt)),Lht),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X1n),""),"Feedback Edges"),"Whether feedback edges should be highlighted by routing around the nodes."),(hN(),!1)),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,W1n),""),"Interactive Reference Point"),"Determines which point of a node is considered by interactive layout phases."),Qbt),gMt),Glt),nbn(hMt)))),a2(n,W1n,e0n,Jbt),a2(n,W1n,l0n,Ybt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,V1n),""),"Merge Edges"),"Edges that have no ports are merged so they touch the connected nodes at the same points. When this option is disabled, one port is created for each edge directly connected to a node. When it is enabled, all such incoming edges share an input port, and all outgoing edges share an output port."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Q1n),""),"Merge Hierarchy-Crossing Edges"),"If hierarchical layout is active, hierarchy-crossing edges use as few hierarchical ports as possible. They are broken by the algorithm, with hierarchical ports inserted as required. Usually, one such port is created for each edge at each hierarchy crossing point. With this option set to true, we try to create as few hierarchical ports as possible in the process. In particular, all edges that form a hyperedge can share a port."),!0),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Pj(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Y1n),""),"Allow Non-Flow Ports To Switch Sides"),"Specifies whether non-flow ports may switch sides if their node's port constraints are either FIXED_SIDE or FIXED_ORDER. A non-flow port is a port on a side that is not part of the currently configured layout flow. For instance, given a left-to-right layout direction, north and south ports would be considered non-flow ports. Further note that the underlying criterium whether to switch sides or not solely relies on the minimization of edge crossings. Hence, edge length and other aesthetics criteria are not addressed."),!1),wMt),ktt),nbn(fMt)),Pun(Gk(Qtt,1),sVn,2,6,["org.eclipse.elk.layered.northOrSouthPort"])))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,J1n),""),"Port Sorting Strategy"),"Only relevant for nodes with FIXED_SIDE port constraints. Determines the way a node's ports are distributed on the sides of a node if their order is not prescribed. The option is set on parent nodes."),xwt),gMt),zvt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Z1n),""),"Thoroughness"),"How much effort should be spent to produce a nice layout."),iln(7)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,n0n),""),"Add Unnecessary Bendpoints"),"Adds bend points even if an edge does not change direction. If true, each long edge dummy will contribute a bend point to its edges and hierarchy-crossing edges will always get a bend point where they cross hierarchy boundaries. By default, bend points are only added where an edge changes direction."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,t0n),""),"Generate Position and Layer IDs"),"If enabled position id and layer id are generated, which are usually only used internally when setting the interactiveLayout option. This option should be specified on the root node."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,e0n),"cycleBreaking"),"Cycle Breaking Strategy"),"Strategy for cycle breaking. Cycle breaking looks for cycles in the graph and determines which edges to reverse to break the cycles. Reversed edges will end up pointing to the opposite direction of regular edges (that is, reversed edges will point left if edges usually point right)."),Mbt),gMt),Cht),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,i0n),f2n),"Node Layering Strategy"),"Strategy for node layering."),bwt),gMt),ovt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,r0n),f2n),"Layer Constraint"),"Determines a constraint on the placement of the node regarding the layering."),iwt),gMt),ivt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,c0n),f2n),"Layer Choice Constraint"),"Allows to set a constraint regarding the layer placement of a node. Let i be the value of teh constraint. Assumed the drawing has n layers and i < n. If set to i, it expresses that the node should be placed in i-th layer. Should i>=n be true then the node is placed in the last layer of the drawing. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,a0n),f2n),"Layer ID"),"Layer identifier that was calculated by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,u0n),l2n),"Upper Bound On Width [MinWidth Layerer]"),"Defines a loose upper bound on the width of the MinWidth layerer. If set to '-1' multiple values are tested and the best result is selected."),iln(4)),vMt),Att),nbn(hMt)))),a2(n,u0n,i0n,awt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,o0n),l2n),"Upper Layer Estimation Scaling Factor [MinWidth Layerer]"),"Multiplied with Upper Bound On Width for defining an upper bound on the width of layers which haven't been determined yet, but whose maximum width had been (roughly) estimated by the MinWidth algorithm. Compensates for too high estimations. If set to '-1' multiple values are tested and the best result is selected."),iln(2)),vMt),Att),nbn(hMt)))),a2(n,o0n,i0n,owt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,s0n),b2n),"Node Promotion Strategy"),"Reduces number of dummy nodes after layering phase (if possible)."),fwt),gMt),Dvt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,h0n),b2n),"Max Node Promotion Iterations"),"Limits the number of iterations for node promotion."),iln(0)),vMt),Att),nbn(hMt)))),a2(n,h0n,s0n,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,f0n),"layering.coffmanGraham"),"Layer Bound"),"The maximum number of nodes allowed per layer."),iln(DWn)),vMt),Att),nbn(hMt)))),a2(n,f0n,i0n,nwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,l0n),w2n),"Crossing Minimization Strategy"),"Strategy for crossing minimization."),Ebt),gMt),pht),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,b0n),w2n),"Force Node Model Order"),"The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,w0n),w2n),"Hierarchical Sweepiness"),"How likely it is to use cross-hierarchy (1) vs bottom-up (-1)."),.1),dMt),Ptt),nbn(hMt)))),a2(n,w0n,d2n,pbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,d0n),w2n),"Semi-Interactive Crossing Minimization"),"Preserves the order of nodes within a layer but still minimizes crossings between edges connecting long edge dummies. Derives the desired order from positions specified by the 'org.eclipse.elk.position' layout option. Requires a crossing minimization strategy that is able to process 'in-layer' constraints."),!1),wMt),ktt),nbn(hMt)))),a2(n,d0n,l0n,kbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,g0n),w2n),"Position Choice Constraint"),"Allows to set a constraint regarding the position placement of a node in a layer. Assumed the layer in which the node placed includes n other nodes and i < n. If set to i, it expresses that the node should be placed at the i-th position. Should i>=n be true then the node is placed at the last position in the layer. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,p0n),w2n),"Position ID"),"Position within a layer that was determined by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,v0n),g2n),"Greedy Switch Activation Threshold"),"By default it is decided automatically if the greedy switch is activated or not. The decision is based on whether the size of the input graph (without dummy nodes) is smaller than the value of this option. A '0' enforces the activation."),iln(40)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,m0n),g2n),"Greedy Switch Crossing Minimization"),"Greedy Switch strategy for crossing minimization. The greedy switch heuristic is executed after the regular crossing minimization as a post-processor. Note that if 'hierarchyHandling' is set to 'INCLUDE_CHILDREN', the 'greedySwitchHierarchical.type' option must be used."),wbt),gMt),Ift),nbn(hMt)))),a2(n,m0n,l0n,dbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,y0n),"crossingMinimization.greedySwitchHierarchical"),"Greedy Switch Crossing Minimization (hierarchical)"),"Activates the greedy switch heuristic in case hierarchical layout is used. The differences to the non-hierarchical case (see 'greedySwitch.type') are: 1) greedy switch is inactive by default, 3) only the option value set on the node at which hierarchical layout starts is relevant, and 2) if it's activated by the user, it properly addresses hierarchy-crossing edges."),hbt),gMt),Ift),nbn(hMt)))),a2(n,y0n,l0n,fbt),a2(n,y0n,d2n,lbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,k0n),p2n),"Node Placement Strategy"),"Strategy for node placement."),Lwt),gMt),Avt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,j0n),p2n),"Favor Straight Edges Over Balancing"),"Favor straight edges over a balanced node placement. The default behavior is determined automatically based on the used 'edgeRouting'. For an orthogonal style it is set to true, for all other styles to false."),wMt),ktt),nbn(hMt)))),a2(n,j0n,k0n,Ewt),a2(n,j0n,k0n,Twt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,E0n),v2n),"BK Edge Straightening"),"Specifies whether the Brandes Koepf node placer tries to increase the number of straight edges at the expense of diagram size. There is a subtle difference to the 'favorStraightEdges' option, which decides whether a balanced placement of the nodes is desired, or not. In bk terms this means combining the four alignments into a single balanced one, or not. This option on the other hand tries to straighten additional edges during the creation of each of the four alignments."),pwt),gMt),Zht),nbn(hMt)))),a2(n,E0n,k0n,vwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,T0n),v2n),"BK Fixed Alignment"),"Tells the BK node placer to use a certain alignment (out of its four) instead of the one producing the smallest height, or the combination of all four."),ywt),gMt),uft),nbn(hMt)))),a2(n,T0n,k0n,kwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,M0n),"nodePlacement.linearSegments"),"Linear Segments Deflection Dampening"),"Dampens the movement of nodes to keep the diagram from getting too large."),.3),dMt),Ptt),nbn(hMt)))),a2(n,M0n,k0n,Swt),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,S0n),"nodePlacement.networkSimplex"),"Node Flexibility"),"Aims at shorter and straighter edges. Two configurations are possible: (a) allow ports to move freely on the side they are assigned to (the order is always defined beforehand), (b) additionally allow to enlarge a node wherever it helps. If this option is not configured for a node, the 'nodeFlexibility.default' value is used, which is specified for the node's parent."),gMt),kvt),nbn(sMt)))),a2(n,S0n,k0n,Awt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,P0n),"nodePlacement.networkSimplex.nodeFlexibility"),"Node Flexibility Default"),"Default value of the 'nodeFlexibility' option for the children of a hierarchical node."),Iwt),gMt),kvt),nbn(hMt)))),a2(n,P0n,k0n,Owt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,C0n),m2n),"Self-Loop Distribution"),"Alter the distribution of the loops around the node. It only takes effect for PortConstraints.FREE."),xbt),gMt),nmt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,I0n),m2n),"Self-Loop Ordering"),"Alter the ordering of the loops they can either be stacked or sequenced. It only takes effect for PortConstraints.FREE."),Rbt),gMt),cmt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,O0n),"edgeRouting.splines"),"Spline Routing Mode"),"Specifies the way control points are assembled for each individual edge. CONSERVATIVE ensures that edges are properly routed around the nodes but feels rather orthogonal at times. SLOPPY uses fewer control points to obtain curvier edge routes but may result in edges overlapping nodes."),_bt),gMt),hmt),nbn(hMt)))),a2(n,O0n,y2n,Fbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,A0n),"edgeRouting.splines.sloppy"),"Sloppy Spline Layer Spacing Factor"),"Spacing factor for routing area between layers when using sloppy spline routing."),.2),dMt),Ptt),nbn(hMt)))),a2(n,A0n,y2n,Hbt),a2(n,A0n,O0n,qbt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,$0n),"edgeRouting.polyline"),"Sloped Edge Zone Width"),"Width of the strip to the left and to the right of each layer where the polyline edge router is allowed to refrain from ensuring that edges are routed horizontally. This prevents awkward bend points for nodes that extent almost to the edge of their layer."),2),dMt),Ptt),nbn(hMt)))),a2(n,$0n,y2n,Lbt),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,L0n),k2n),"Spacing Base Value"),"An optional base value for all other layout options of the 'spacing' group. It can be used to conveniently alter the overall 'spaciousness' of the drawing. Whenever an explicit value is set for the other layout options, this base value will have no effect. The base value is not inherited, i.e. it must be set for each hierarchical node."),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,N0n),k2n),"Edge Node Between Layers Spacing"),"The spacing to be preserved between nodes and edges that are routed next to the node's layer. For the spacing between nodes and edges that cross the node's layer 'spacing.edgeNode' is used."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,x0n),k2n),"Edge Edge Between Layer Spacing"),"Spacing to be preserved between pairs of edges that are routed between the same pair of layers. Note that 'spacing.edgeEdge' is used for the spacing between pairs of edges crossing the same layer."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,D0n),k2n),"Node Node Between Layers Spacing"),"The spacing to be preserved between any pair of nodes of two adjacent layers. Note that 'spacing.nodeNode' is used for the spacing between nodes within the layer itself."),20),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,R0n),j2n),"Direction Priority"),"Defines how important it is to have a certain edge point into the direction of the overall layout. This option is evaluated during the cycle breaking phase."),iln(0)),vMt),Att),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,K0n),j2n),"Shortness Priority"),"Defines how important it is to keep an edge as short as possible. This option is evaluated during the layering phase."),iln(0)),vMt),Att),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,_0n),j2n),"Straightness Priority"),"Defines how important it is to keep an edge straight, i.e. aligned with one of the two axes. This option is evaluated during node placement."),iln(0)),vMt),Att),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,F0n),E2n),DJn),"Tries to further compact components (disconnected sub-graphs)."),!1),wMt),ktt),nbn(hMt)))),a2(n,F0n,kZn,!0),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,B0n),T2n),"Post Compaction Strategy"),M2n),Ylt),gMt),mft),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,H0n),T2n),"Post Compaction Constraint Calculation"),M2n),Vlt),gMt),lht),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,q0n),S2n),"High Degree Node Treatment"),"Makes room around high degree nodes to place leafs and trees."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,G0n),S2n),"High Degree Node Threshold"),"Whether a node is considered to have a high degree."),iln(16)),vMt),Att),nbn(hMt)))),a2(n,G0n,q0n,!0),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,z0n),S2n),"High Degree Node Maximum Tree Height"),"Maximum height of a subtree connected to a high degree node to be moved to separate layers."),iln(5)),vMt),Att),nbn(hMt)))),a2(n,z0n,q0n,!0),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,U0n),P2n),"Graph Wrapping Strategy"),"For certain graphs and certain prescribed drawing areas it may be desirable to split the laid out graph into chunks that are placed side by side. The edges that connect different chunks are 'wrapped' around from the end of one chunk to the start of the other chunk. The points between the chunks are referred to as 'cuts'."),bdt),gMt),Smt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X0n),P2n),"Additional Wrapped Edges Spacing"),"To visually separate edges that are wrapped from regularly routed edges an additional spacing value can be specified in form of this layout option. The spacing is added to the regular edgeNode spacing."),10),dMt),Ptt),nbn(hMt)))),a2(n,X0n,U0n,Uwt),a2(n,X0n,U0n,Xwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,W0n),P2n),"Correction Factor for Wrapping"),"At times and for certain types of graphs the executed wrapping may produce results that are consistently biased in the same fashion: either wrapping to often or to rarely. This factor can be used to correct the bias. Internally, it is simply multiplied with the 'aspect ratio' layout option."),1),dMt),Ptt),nbn(hMt)))),a2(n,W0n,U0n,Vwt),a2(n,W0n,U0n,Qwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,V0n),C2n),"Cutting Strategy"),"The strategy by which the layer indexes are determined at which the layering crumbles into chunks."),idt),gMt),Tht),nbn(hMt)))),a2(n,V0n,U0n,rdt),a2(n,V0n,U0n,cdt),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,Q0n),C2n),"Manually Specified Cuts"),"Allows the user to specify her own cuts for a certain graph."),mMt),Rnt),nbn(hMt)))),a2(n,Q0n,V0n,Jwt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Y0n),"wrapping.cutting.msd"),"MSD Freedom"),"The MSD cutting strategy starts with an initial guess on the number of chunks the graph should be split into. The freedom specifies how much the strategy may deviate from this guess. E.g. if an initial number of 3 is computed, a freedom of 1 allows 2, 3, and 4 cuts."),ndt),vMt),Att),nbn(hMt)))),a2(n,Y0n,V0n,tdt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,J0n),I2n),"Validification Strategy"),"When wrapping graphs, one can specify indices that are not allowed as split points. The validification strategy makes sure every computed split point is allowed."),vdt),gMt),dmt),nbn(hMt)))),a2(n,J0n,U0n,mdt),a2(n,J0n,U0n,ydt),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,Z0n),I2n),"Valid Indices for Wrapping"),null),mMt),Rnt),nbn(hMt)))),a2(n,Z0n,U0n,ddt),a2(n,Z0n,U0n,gdt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,n2n),O2n),"Improve Cuts"),"For general graphs it is important that not too many edges wrap backwards. Thus a compromise between evenly-distributed cuts and the total number of cut edges is sought."),!0),wMt),ktt),nbn(hMt)))),a2(n,n2n,U0n,sdt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,t2n),O2n),"Distance Penalty When Improving Cuts"),null),2),dMt),Ptt),nbn(hMt)))),a2(n,t2n,U0n,udt),a2(n,t2n,n2n,!0),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,e2n),O2n),"Improve Wrapped Edges"),"The initial wrapping is performed in a very simple way. As a consequence, edges that wrap from one chunk to another may be unnecessarily long. Activating this option tries to shorten such edges."),!0),wMt),ktt),nbn(hMt)))),a2(n,e2n,U0n,fdt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,i2n),A2n),"Edge Label Side Selection"),"Method to decide on edge label sides."),Abt),gMt),zht),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,r2n),A2n),"Edge Center Label Placement Strategy"),"Determines in which layer center labels of long edges should be placed."),Ibt),gMt),uht),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,c2n),$2n),"Consider Model Order"),"Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting."),abt),gMt),Fvt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,a2n),$2n),"No Model Order"),"Set on a node to not set a model order for this node even though it is a real node."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,u2n),$2n),"Consider Model Order for Components"),"If set to NONE the usual ordering strategy (by cumulative node priority and size of nodes) is used. INSIDE_PORT_SIDES orders the components with external ports only inside the groups with the same port side. FORCE_MODEL_ORDER enforces the mode order on components. This option might produce bad alignments and sub optimal drawings in terms of used area since the ordering should be respected."),Zlt),gMt),mut),nbn(hMt)))),a2(n,u2n,kZn,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,o2n),$2n),"Long Edge Ordering Strategy"),"Indicates whether long edges are sorted under, over, or equal to nodes that have no connection to a previous layer in a left-to-right or right-to-left layout. Under and over changes to right and left in a vertical layout."),ibt),gMt),wvt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,s2n),$2n),"Crossing Counter Node Order Influence"),"Indicates with what percentage (1 for 100%) violations of the node model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal node order. Defaults to no influence (0)."),0),dMt),Ptt),nbn(hMt)))),a2(n,s2n,c2n,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,h2n),$2n),"Crossing Counter Port Order Influence"),"Indicates with what percentage (1 for 100%) violations of the port model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal port order. Defaults to no influence (0)."),0),dMt),Ptt),nbn(hMt)))),a2(n,h2n,c2n,null),vWn((new bf,n))},vX(F1n,"LayeredMetaDataProvider",848),wAn(986,1,QYn,bf),MWn.Qe=function(n){vWn(n)},vX(F1n,"LayeredOptions",986),wAn(987,1,{},Cc),MWn.$e=function(){return new Uv},MWn._e=function(n){},vX(F1n,"LayeredOptions/LayeredFactory",987),wAn(1372,1,{}),MWn.a=0,vX(y3n,"ElkSpacings/AbstractSpacingsBuilder",1372),wAn(779,1372,{},uwn),vX(F1n,"LayeredSpacings/LayeredSpacingsBuilder",779),wAn(313,22,{3:1,35:1,22:1,313:1,246:1,234:1},RP),MWn.Kf=function(){return rLn(this)},MWn.Xf=function(){return rLn(this)};var rvt,cvt,avt,uvt,ovt=Ben(F1n,"LayeringStrategy",313,Unt,e9,lF);wAn(378,22,{3:1,35:1,22:1,378:1},KP);var svt,hvt,fvt,lvt,bvt,wvt=Ben(F1n,"LongEdgeOrderingStrategy",378,Unt,E1,bF);wAn(197,22,{3:1,35:1,22:1,197:1},_P);var dvt,gvt,pvt,vvt,mvt,yvt,kvt=Ben(F1n,"NodeFlexibility",197,Unt,k3,wF);wAn(315,22,{3:1,35:1,22:1,315:1,246:1,234:1},FP),MWn.Kf=function(){return DAn(this)},MWn.Xf=function(){return DAn(this)};var jvt,Evt,Tvt,Mvt,Svt,Pvt,Cvt,Ivt,Ovt,Avt=Ben(F1n,"NodePlacementStrategy",315,Unt,$5,yF);wAn(260,22,{3:1,35:1,22:1,260:1},HP);var $vt,Lvt,Nvt,xvt,Dvt=Ben(F1n,"NodePromotionStrategy",260,Unt,Btn,gF);wAn(339,22,{3:1,35:1,22:1,339:1},qP);var Rvt,Kvt,_vt,Fvt=Ben(F1n,"OrderingStrategy",339,Unt,A1,pF);wAn(421,22,{3:1,35:1,22:1,421:1},GP);var Bvt,Hvt,qvt,Gvt,zvt=Ben(F1n,"PortSortingStrategy",421,Unt,UY,vF);wAn(452,22,{3:1,35:1,22:1,452:1},zP);var Uvt,Xvt,Wvt,Vvt,Qvt=Ben(F1n,"PortType",452,Unt,O1,dF);wAn(375,22,{3:1,35:1,22:1,375:1},UP);var Yvt,Jvt,Zvt,nmt=Ben(F1n,"SelfLoopDistributionStrategy",375,Unt,$1,mF);wAn(376,22,{3:1,35:1,22:1,376:1},XP);var tmt,emt,imt,rmt,cmt=Ben(F1n,"SelfLoopOrderingStrategy",376,Unt,BY,kF);wAn(304,1,{304:1},sGn),vX(F1n,"Spacings",304),wAn(336,22,{3:1,35:1,22:1,336:1},WP);var amt,umt,omt,smt,hmt=Ben(F1n,"SplineRoutingMode",336,Unt,N1,jF);wAn(338,22,{3:1,35:1,22:1,338:1},VP);var fmt,lmt,bmt,wmt,dmt=Ben(F1n,"ValidifyStrategy",338,Unt,x1,EF);wAn(377,22,{3:1,35:1,22:1,377:1},QP);var gmt,pmt,vmt,mmt,ymt,kmt,jmt,Emt,Tmt,Mmt,Smt=Ben(F1n,"WrappingStrategy",377,Unt,L1,TF);wAn(1383,1,E3n,wf),MWn.Yf=function(n){return BB(n,37),pmt},MWn.pf=function(n,t){JHn(this,BB(n,37),t)},vX(T3n,"DepthFirstCycleBreaker",1383),wAn(782,1,E3n,KG),MWn.Yf=function(n){return BB(n,37),vmt},MWn.pf=function(n,t){UXn(this,BB(n,37),t)},MWn.Zf=function(n){return BB(xq(n,pvn(this.d,n.c.length)),10)},vX(T3n,"GreedyCycleBreaker",782),wAn(1386,782,E3n,TI),MWn.Zf=function(n){var t,e,i,r;for(r=null,t=DWn,i=new Wb(n);i.a<i.c.c.length;)Lx(e=BB(n0(i),10),(hWn(),wlt))&&BB(mMn(e,wlt),19).a<t&&(t=BB(mMn(e,wlt),19).a,r=e);return r||BB(xq(n,pvn(this.d,n.c.length)),10)},vX(T3n,"GreedyModelOrderCycleBreaker",1386),wAn(1384,1,E3n,rf),MWn.Yf=function(n){return BB(n,37),mmt},MWn.pf=function(n,t){Iqn(this,BB(n,37),t)},vX(T3n,"InteractiveCycleBreaker",1384),wAn(1385,1,E3n,cf),MWn.Yf=function(n){return BB(n,37),ymt},MWn.pf=function(n,t){Lqn(this,BB(n,37),t)},MWn.a=0,MWn.b=0,vX(T3n,"ModelOrderCycleBreaker",1385),wAn(1389,1,E3n,$M),MWn.Yf=function(n){return BB(n,37),kmt},MWn.pf=function(n,t){JXn(this,BB(n,37),t)},vX(M3n,"CoffmanGrahamLayerer",1389),wAn(1390,1,MYn,Dd),MWn.ue=function(n,t){return BIn(this.a,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(M3n,"CoffmanGrahamLayerer/0methodref$compareNodesInTopo$Type",1390),wAn(1391,1,MYn,Rd),MWn.ue=function(n,t){return zG(this.a,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(M3n,"CoffmanGrahamLayerer/lambda$1$Type",1391),wAn(1392,1,E3n,Ic),MWn.Yf=function(n){return BB(n,37),dq(dq(dq(new B2,(yMn(),Rat),(lWn(),kot)),Kat,Oot),_at,Iot)},MWn.pf=function(n,t){EUn(this,BB(n,37),t)},vX(M3n,"InteractiveLayerer",1392),wAn(569,1,{569:1},im),MWn.a=0,MWn.c=0,vX(M3n,"InteractiveLayerer/LayerSpan",569),wAn(1388,1,E3n,ef),MWn.Yf=function(n){return BB(n,37),jmt},MWn.pf=function(n,t){qxn(this,BB(n,37),t)},vX(M3n,"LongestPathLayerer",1388),wAn(1395,1,E3n,sf),MWn.Yf=function(n){return BB(n,37),dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)},MWn.pf=function(n,t){iXn(this,BB(n,37),t)},MWn.a=0,MWn.b=0,MWn.d=0,vX(M3n,"MinWidthLayerer",1395),wAn(1396,1,MYn,Kd),MWn.ue=function(n,t){return dan(this,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(M3n,"MinWidthLayerer/MinOutgoingEdgesComparator",1396),wAn(1387,1,E3n,of),MWn.Yf=function(n){return BB(n,37),Mmt},MWn.pf=function(n,t){mGn(this,BB(n,37),t)},vX(M3n,"NetworkSimplexLayerer",1387),wAn(1393,1,E3n,RR),MWn.Yf=function(n){return BB(n,37),dq(dq(dq(new B2,(yMn(),Rat),(lWn(),cot)),Kat,Oot),_at,Iot)},MWn.pf=function(n,t){$zn(this,BB(n,37),t)},MWn.d=0,MWn.f=0,MWn.g=0,MWn.i=0,MWn.s=0,MWn.t=0,MWn.u=0,vX(M3n,"StretchWidthLayerer",1393),wAn(1394,1,MYn,Oc),MWn.ue=function(n,t){return R6(BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(M3n,"StretchWidthLayerer/1",1394),wAn(402,1,S3n),MWn.Nf=function(n,t,e,i,r,c){},MWn._f=function(n,t,e){return r_n(this,n,t,e)},MWn.Mf=function(){this.g=x8(DNt,P3n,25,this.d,15,1),this.f=x8(DNt,P3n,25,this.d,15,1)},MWn.Of=function(n,t){this.e[n]=x8(ANt,hQn,25,t[n].length,15,1)},MWn.Pf=function(n,t,e){e[n][t].p=t,this.e[n][t]=t},MWn.Qf=function(n,t,e,i){BB(xq(i[n][t].j,e),11).p=this.d++},MWn.b=0,MWn.c=0,MWn.d=0,vX(C3n,"AbstractBarycenterPortDistributor",402),wAn(1633,1,MYn,_d),MWn.ue=function(n,t){return qgn(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(C3n,"AbstractBarycenterPortDistributor/lambda$0$Type",1633),wAn(817,1,N1n,G2),MWn.Nf=function(n,t,e,i,r,c){},MWn.Pf=function(n,t,e){},MWn.Qf=function(n,t,e,i){},MWn.Lf=function(){return!1},MWn.Mf=function(){this.c=this.e.a,this.g=this.f.g},MWn.Of=function(n,t){t[n][0].c.p=n},MWn.Rf=function(){return!1},MWn.ag=function(n,t,e,i){e?sjn(this,n):(Djn(this,n,i),ZGn(this,n,t)),n.c.length>1&&(qy(TD(mMn(vW((l1(0,n.c.length),BB(n.c[0],10))),(HXn(),xdt))))?R$n(n,this.d,BB(this,660)):(SQ(),m$(n,this.d)),Ban(this.e,n))},MWn.Sf=function(n,t,e,i){var r,c,a,u,o,s,h;for(t!=Jq(e,n.length)&&(c=n[t-(e?1:-1)],G6(this.f,c,e?(ain(),qvt):(ain(),Hvt))),r=n[t][0],h=!i||r.k==(uSn(),Mut),s=u6(n[t]),this.ag(s,h,!1,e),a=0,o=new Wb(s);o.a<o.c.c.length;)u=BB(n0(o),10),n[t][a++]=u;return!1},MWn.Tf=function(n,t){var e,i,r,c,a;for(c=u6(n[a=Jq(t,n.length)]),this.ag(c,!1,!0,t),e=0,r=new Wb(c);r.a<r.c.c.length;)i=BB(n0(r),10),n[a][e++]=i;return!1},vX(C3n,"BarycenterHeuristic",817),wAn(658,1,{658:1},Bd),MWn.Ib=function(){return"BarycenterState [node="+this.c+", summedWeight="+this.d+", degree="+this.b+", barycenter="+this.a+", visited="+this.e+"]"},MWn.b=0,MWn.d=0,MWn.e=!1;var Pmt=vX(C3n,"BarycenterHeuristic/BarycenterState",658);wAn(1802,1,MYn,Fd),MWn.ue=function(n,t){return MEn(this.a,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(C3n,"BarycenterHeuristic/lambda$0$Type",1802),wAn(816,1,N1n,UEn),MWn.Mf=function(){},MWn.Nf=function(n,t,e,i,r,c){},MWn.Qf=function(n,t,e,i){},MWn.Of=function(n,t){this.a[n]=x8(Pmt,{3:1,4:1,5:1,2018:1},658,t[n].length,0,1),this.b[n]=x8(Lmt,{3:1,4:1,5:1,2019:1},233,t[n].length,0,1)},MWn.Pf=function(n,t,e){Dgn(this,e[n][t],!0)},MWn.c=!1,vX(C3n,"ForsterConstraintResolver",816),wAn(233,1,{233:1},DY,uGn),MWn.Ib=function(){var n,t;for((t=new Ck).a+="[",n=0;n<this.d.length;n++)oO(t,$pn(this.d[n])),null!=lL(this.g,this.d[0]).a&&oO(oO((t.a+="<",t),ZI(lL(this.g,this.d[0]).a)),">"),n<this.d.length-1&&(t.a+=FWn);return(t.a+="]",t).a},MWn.a=0,MWn.c=0,MWn.f=0;var Cmt,Imt,Omt,Amt,$mt,Lmt=vX(C3n,"ForsterConstraintResolver/ConstraintGroup",233);wAn(1797,1,lVn,qd),MWn.td=function(n){Dgn(this.a,BB(n,10),!1)},vX(C3n,"ForsterConstraintResolver/lambda$0$Type",1797),wAn(214,1,{214:1,225:1},CGn),MWn.Nf=function(n,t,e,i,r,c){},MWn.Of=function(n,t){},MWn.Mf=function(){this.r=x8(ANt,hQn,25,this.n,15,1)},MWn.Pf=function(n,t,e){var i;(i=e[n][t].e)&&WB(this.b,i)},MWn.Qf=function(n,t,e,i){++this.n},MWn.Ib=function(){return izn(this.e,new Rv)},MWn.g=!1,MWn.i=!1,MWn.n=0,MWn.s=!1,vX(C3n,"GraphInfoHolder",214),wAn(1832,1,N1n,Pc),MWn.Nf=function(n,t,e,i,r,c){},MWn.Of=function(n,t){},MWn.Qf=function(n,t,e,i){},MWn._f=function(n,t,e){return e&&t>0?uZ(this.a,n[t-1],n[t]):!e&&t<n.length-1?uZ(this.a,n[t],n[t+1]):yrn(this.a,n[t],e?(kUn(),CIt):(kUn(),oIt)),bLn(this,n,t,e)},MWn.Mf=function(){this.d=x8(ANt,hQn,25,this.c,15,1),this.a=new QK(this.d)},MWn.Pf=function(n,t,e){var i;i=e[n][t],this.c+=i.j.c.length},MWn.c=0,vX(C3n,"GreedyPortDistributor",1832),wAn(1401,1,E3n,df),MWn.Yf=function(n){return Xhn(BB(n,37))},MWn.pf=function(n,t){XGn(BB(n,37),t)},vX(C3n,"InteractiveCrossingMinimizer",1401),wAn(1402,1,MYn,Gd),MWn.ue=function(n,t){return Hjn(this,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(C3n,"InteractiveCrossingMinimizer/1",1402),wAn(507,1,{507:1,123:1,51:1},Ny),MWn.Yf=function(n){var t;return BB(n,37),dq(t=kA(Imt),(yMn(),_at),(lWn(),Bot)),t},MWn.pf=function(n,t){P_n(this,BB(n,37),t)},MWn.e=0,vX(C3n,"LayerSweepCrossingMinimizer",507),wAn(1398,1,lVn,zd),MWn.td=function(n){wBn(this.a,BB(n,214))},vX(C3n,"LayerSweepCrossingMinimizer/0methodref$compareDifferentRandomizedLayouts$Type",1398),wAn(1399,1,lVn,Ud),MWn.td=function(n){Ohn(this.a,BB(n,214))},vX(C3n,"LayerSweepCrossingMinimizer/1methodref$minimizeCrossingsNoCounter$Type",1399),wAn(1400,1,lVn,Xd),MWn.td=function(n){pFn(this.a,BB(n,214))},vX(C3n,"LayerSweepCrossingMinimizer/2methodref$minimizeCrossingsWithCounter$Type",1400),wAn(454,22,{3:1,35:1,22:1,454:1},YP);var Nmt,xmt=Ben(C3n,"LayerSweepCrossingMinimizer/CrossMinType",454,Unt,D1,MF);wAn(1397,1,DVn,Ac),MWn.Mb=function(n){return _cn(),0==BB(n,29).a.c.length},vX(C3n,"LayerSweepCrossingMinimizer/lambda$0$Type",1397),wAn(1799,1,N1n,aZ),MWn.Mf=function(){},MWn.Nf=function(n,t,e,i,r,c){},MWn.Qf=function(n,t,e,i){},MWn.Of=function(n,t){t[n][0].c.p=n,this.b[n]=x8(_mt,{3:1,4:1,5:1,1944:1},659,t[n].length,0,1)},MWn.Pf=function(n,t,e){e[n][t].p=t,$X(this.b[n],t,new $c)},vX(C3n,"LayerSweepTypeDecider",1799),wAn(659,1,{659:1},$c),MWn.Ib=function(){return"NodeInfo [connectedEdges="+this.a+", hierarchicalInfluence="+this.b+", randomInfluence="+this.c+"]"},MWn.a=0,MWn.b=0,MWn.c=0;var Dmt,Rmt,Kmt,_mt=vX(C3n,"LayerSweepTypeDecider/NodeInfo",659);wAn(1800,1,qYn,Lc),MWn.Lb=function(n){return zN(new m6(BB(n,11).b))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return zN(new m6(BB(n,11).b))},vX(C3n,"LayerSweepTypeDecider/lambda$0$Type",1800),wAn(1801,1,qYn,Nc),MWn.Lb=function(n){return zN(new m6(BB(n,11).b))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return zN(new m6(BB(n,11).b))},vX(C3n,"LayerSweepTypeDecider/lambda$1$Type",1801),wAn(1833,402,S3n,Dj),MWn.$f=function(n,t,e){var i,r,c,a,u,o,s,h,f;switch(s=this.g,e.g){case 1:for(i=0,r=0,o=new Wb(n.j);o.a<o.c.c.length;)0!=(a=BB(n0(o),11)).e.c.length&&(++i,a.j==(kUn(),sIt)&&++r);for(c=t+r,f=t+i,u=xwn(n,(ain(),Hvt)).Kc();u.Ob();)(a=BB(u.Pb(),11)).j==(kUn(),sIt)?(s[a.p]=c,--c):(s[a.p]=f,--f);return i;case 2:for(h=0,u=xwn(n,(ain(),qvt)).Kc();u.Ob();)++h,s[(a=BB(u.Pb(),11)).p]=t+h;return h;default:throw Hp(new wv)}},vX(C3n,"LayerTotalPortDistributor",1833),wAn(660,817,{660:1,225:1},prn),MWn.ag=function(n,t,e,i){e?sjn(this,n):(Djn(this,n,i),ZGn(this,n,t)),n.c.length>1&&(qy(TD(mMn(vW((l1(0,n.c.length),BB(n.c[0],10))),(HXn(),xdt))))?R$n(n,this.d,this):(SQ(),m$(n,this.d)),qy(TD(mMn(vW((l1(0,n.c.length),BB(n.c[0],10))),xdt)))||Ban(this.e,n))},vX(C3n,"ModelOrderBarycenterHeuristic",660),wAn(1803,1,MYn,Wd),MWn.ue=function(n,t){return KSn(this.a,BB(n,10),BB(t,10))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(C3n,"ModelOrderBarycenterHeuristic/lambda$0$Type",1803),wAn(1403,1,E3n,jf),MWn.Yf=function(n){var t;return BB(n,37),dq(t=kA(Dmt),(yMn(),_at),(lWn(),Bot)),t},MWn.pf=function(n,t){mY((BB(n,37),t))},vX(C3n,"NoCrossingMinimizer",1403),wAn(796,402,S3n,Rj),MWn.$f=function(n,t,e){var i,r,c,a,u,o,s,h,f,l,b;switch(f=this.g,e.g){case 1:for(r=0,c=0,h=new Wb(n.j);h.a<h.c.c.length;)0!=(o=BB(n0(h),11)).e.c.length&&(++r,o.j==(kUn(),sIt)&&++c);for(a=t+c*(i=1/(r+1)),b=t+1-i,s=xwn(n,(ain(),Hvt)).Kc();s.Ob();)(o=BB(s.Pb(),11)).j==(kUn(),sIt)?(f[o.p]=a,a-=i):(f[o.p]=b,b-=i);break;case 2:for(u=0,h=new Wb(n.j);h.a<h.c.c.length;)0==(o=BB(n0(h),11)).g.c.length||++u;for(l=t+(i=1/(u+1)),s=xwn(n,(ain(),qvt)).Kc();s.Ob();)f[(o=BB(s.Pb(),11)).p]=l,l+=i;break;default:throw Hp(new _y("Port type is undefined"))}return 1},vX(C3n,"NodeRelativePortDistributor",796),wAn(807,1,{},Vz,HMn),vX(C3n,"SweepCopy",807),wAn(1798,1,N1n,wdn),MWn.Of=function(n,t){},MWn.Mf=function(){var n;n=x8(ANt,hQn,25,this.f,15,1),this.d=new eg(n),this.a=new QK(n)},MWn.Nf=function(n,t,e,i,r,c){var a;a=BB(xq(c[n][t].j,e),11),r.c==a&&r.c.i.c==r.d.i.c&&++this.e[n]},MWn.Pf=function(n,t,e){var i;i=e[n][t],this.c[n]=this.c[n]|i.k==(uSn(),Iut)},MWn.Qf=function(n,t,e,i){var r;(r=BB(xq(i[n][t].j,e),11)).p=this.f++,r.g.c.length+r.e.c.length>1&&(r.j==(kUn(),oIt)?this.b[n]=!0:r.j==CIt&&n>0&&(this.b[n-1]=!0))},MWn.f=0,vX(L1n,"AllCrossingsCounter",1798),wAn(587,1,{},mrn),MWn.b=0,MWn.d=0,vX(L1n,"BinaryIndexedTree",587),wAn(524,1,{},QK),vX(L1n,"CrossingsCounter",524),wAn(1906,1,MYn,Vd),MWn.ue=function(n,t){return Xq(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(L1n,"CrossingsCounter/lambda$0$Type",1906),wAn(1907,1,MYn,Qd),MWn.ue=function(n,t){return Wq(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(L1n,"CrossingsCounter/lambda$1$Type",1907),wAn(1908,1,MYn,Yd),MWn.ue=function(n,t){return Vq(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(L1n,"CrossingsCounter/lambda$2$Type",1908),wAn(1909,1,MYn,Jd),MWn.ue=function(n,t){return Qq(this.a,BB(n,11),BB(t,11))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(L1n,"CrossingsCounter/lambda$3$Type",1909),wAn(1910,1,lVn,Zd),MWn.td=function(n){p7(this.a,BB(n,11))},vX(L1n,"CrossingsCounter/lambda$4$Type",1910),wAn(1911,1,DVn,ng),MWn.Mb=function(n){return yI(this.a,BB(n,11))},vX(L1n,"CrossingsCounter/lambda$5$Type",1911),wAn(1912,1,lVn,tg),MWn.td=function(n){mI(this,n)},vX(L1n,"CrossingsCounter/lambda$6$Type",1912),wAn(1913,1,lVn,ZP),MWn.td=function(n){var t;hH(),d3(this.b,(t=this.a,BB(n,11),t))},vX(L1n,"CrossingsCounter/lambda$7$Type",1913),wAn(826,1,qYn,xc),MWn.Lb=function(n){return hH(),Lx(BB(n,11),(hWn(),Elt))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return hH(),Lx(BB(n,11),(hWn(),Elt))},vX(L1n,"CrossingsCounter/lambda$8$Type",826),wAn(1905,1,{},eg),vX(L1n,"HyperedgeCrossingsCounter",1905),wAn(467,1,{35:1,467:1},DR),MWn.wd=function(n){return vgn(this,BB(n,467))},MWn.b=0,MWn.c=0,MWn.e=0,MWn.f=0;var Fmt=vX(L1n,"HyperedgeCrossingsCounter/Hyperedge",467);wAn(362,1,{35:1,362:1},qV),MWn.wd=function(n){return l$n(this,BB(n,362))},MWn.b=0,MWn.c=0;var Bmt,Hmt,qmt=vX(L1n,"HyperedgeCrossingsCounter/HyperedgeCorner",362);wAn(523,22,{3:1,35:1,22:1,523:1},JP);var Gmt,zmt,Umt,Xmt,Wmt,Vmt=Ben(L1n,"HyperedgeCrossingsCounter/HyperedgeCorner/Type",523,Unt,XY,SF);wAn(1405,1,E3n,lf),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?zmt:null},MWn.pf=function(n,t){ljn(this,BB(n,37),t)},vX(I3n,"InteractiveNodePlacer",1405),wAn(1406,1,E3n,ff),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?Umt:null},MWn.pf=function(n,t){jmn(this,BB(n,37),t)},vX(I3n,"LinearSegmentsNodePlacer",1406),wAn(257,1,{35:1,257:1},rm),MWn.wd=function(n){return uj(this,BB(n,257))},MWn.Fb=function(n){var t;return!!cL(n,257)&&(t=BB(n,257),this.b==t.b)},MWn.Hb=function(){return this.b},MWn.Ib=function(){return"ls"+LMn(this.e)},MWn.a=0,MWn.b=0,MWn.c=-1,MWn.d=-1,MWn.g=0;var Qmt,Ymt=vX(I3n,"LinearSegmentsNodePlacer/LinearSegment",257);wAn(1408,1,E3n,_G),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?Qmt:null},MWn.pf=function(n,t){SXn(this,BB(n,37),t)},MWn.b=0,MWn.g=0,vX(I3n,"NetworkSimplexPlacer",1408),wAn(1427,1,MYn,Dc),MWn.ue=function(n,t){return E$(BB(n,19).a,BB(t,19).a)},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(I3n,"NetworkSimplexPlacer/0methodref$compare$Type",1427),wAn(1429,1,MYn,Rc),MWn.ue=function(n,t){return E$(BB(n,19).a,BB(t,19).a)},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(I3n,"NetworkSimplexPlacer/1methodref$compare$Type",1429),wAn(649,1,{649:1},nC);var Jmt=vX(I3n,"NetworkSimplexPlacer/EdgeRep",649);wAn(401,1,{401:1},GV),MWn.b=!1;var Zmt,nyt,tyt,eyt=vX(I3n,"NetworkSimplexPlacer/NodeRep",401);wAn(508,12,{3:1,4:1,20:1,28:1,52:1,12:1,14:1,15:1,54:1,508:1},um),vX(I3n,"NetworkSimplexPlacer/Path",508),wAn(1409,1,{},Kc),MWn.Kb=function(n){return BB(n,17).d.i.k},vX(I3n,"NetworkSimplexPlacer/Path/lambda$0$Type",1409),wAn(1410,1,DVn,_c),MWn.Mb=function(n){return BB(n,267)==(uSn(),Put)},vX(I3n,"NetworkSimplexPlacer/Path/lambda$1$Type",1410),wAn(1411,1,{},Fc),MWn.Kb=function(n){return BB(n,17).d.i},vX(I3n,"NetworkSimplexPlacer/Path/lambda$2$Type",1411),wAn(1412,1,DVn,ig),MWn.Mb=function(n){return HD(tdn(BB(n,10)))},vX(I3n,"NetworkSimplexPlacer/Path/lambda$3$Type",1412),wAn(1413,1,DVn,Bc),MWn.Mb=function(n){return hq(BB(n,11))},vX(I3n,"NetworkSimplexPlacer/lambda$0$Type",1413),wAn(1414,1,lVn,tC),MWn.td=function(n){D$(this.a,this.b,BB(n,11))},vX(I3n,"NetworkSimplexPlacer/lambda$1$Type",1414),wAn(1423,1,lVn,rg),MWn.td=function(n){WCn(this.a,BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$10$Type",1423),wAn(1424,1,{},Hc),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$11$Type",1424),wAn(1425,1,lVn,cg),MWn.td=function(n){BDn(this.a,BB(n,10))},vX(I3n,"NetworkSimplexPlacer/lambda$12$Type",1425),wAn(1426,1,{},qc),MWn.Kb=function(n){return BZ(),iln(BB(n,121).e)},vX(I3n,"NetworkSimplexPlacer/lambda$13$Type",1426),wAn(1428,1,{},Gc),MWn.Kb=function(n){return BZ(),iln(BB(n,121).e)},vX(I3n,"NetworkSimplexPlacer/lambda$15$Type",1428),wAn(1430,1,DVn,zc),MWn.Mb=function(n){return BZ(),BB(n,401).c.k==(uSn(),Cut)},vX(I3n,"NetworkSimplexPlacer/lambda$17$Type",1430),wAn(1431,1,DVn,Uc),MWn.Mb=function(n){return BZ(),BB(n,401).c.j.c.length>1},vX(I3n,"NetworkSimplexPlacer/lambda$18$Type",1431),wAn(1432,1,lVn,zV),MWn.td=function(n){cwn(this.c,this.b,this.d,this.a,BB(n,401))},MWn.c=0,MWn.d=0,vX(I3n,"NetworkSimplexPlacer/lambda$19$Type",1432),wAn(1415,1,{},Xc),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$2$Type",1415),wAn(1433,1,lVn,ag),MWn.td=function(n){N$(this.a,BB(n,11))},MWn.a=0,vX(I3n,"NetworkSimplexPlacer/lambda$20$Type",1433),wAn(1434,1,{},Wc),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$21$Type",1434),wAn(1435,1,lVn,ug),MWn.td=function(n){dL(this.a,BB(n,10))},vX(I3n,"NetworkSimplexPlacer/lambda$22$Type",1435),wAn(1436,1,DVn,Vc),MWn.Mb=function(n){return HD(n)},vX(I3n,"NetworkSimplexPlacer/lambda$23$Type",1436),wAn(1437,1,{},Qc),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$24$Type",1437),wAn(1438,1,DVn,og),MWn.Mb=function(n){return EO(this.a,BB(n,10))},vX(I3n,"NetworkSimplexPlacer/lambda$25$Type",1438),wAn(1439,1,lVn,eC),MWn.td=function(n){MPn(this.a,this.b,BB(n,10))},vX(I3n,"NetworkSimplexPlacer/lambda$26$Type",1439),wAn(1440,1,DVn,Yc),MWn.Mb=function(n){return BZ(),!b5(BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$27$Type",1440),wAn(1441,1,DVn,Jc),MWn.Mb=function(n){return BZ(),!b5(BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$28$Type",1441),wAn(1442,1,{},sg),MWn.Ce=function(n,t){return sL(this.a,BB(n,29),BB(t,29))},vX(I3n,"NetworkSimplexPlacer/lambda$29$Type",1442),wAn(1416,1,{},Zc),MWn.Kb=function(n){return BZ(),new Rq(null,new zU(new oz(ZL(lbn(BB(n,10)).a.Kc(),new h))))},vX(I3n,"NetworkSimplexPlacer/lambda$3$Type",1416),wAn(1417,1,DVn,na),MWn.Mb=function(n){return BZ(),t2(BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$4$Type",1417),wAn(1418,1,lVn,hg),MWn.td=function(n){iBn(this.a,BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$5$Type",1418),wAn(1419,1,{},ta),MWn.Kb=function(n){return BZ(),new Rq(null,new w1(BB(n,29).a,16))},vX(I3n,"NetworkSimplexPlacer/lambda$6$Type",1419),wAn(1420,1,DVn,ea),MWn.Mb=function(n){return BZ(),BB(n,10).k==(uSn(),Cut)},vX(I3n,"NetworkSimplexPlacer/lambda$7$Type",1420),wAn(1421,1,{},ia),MWn.Kb=function(n){return BZ(),new Rq(null,new zU(new oz(ZL(hbn(BB(n,10)).a.Kc(),new h))))},vX(I3n,"NetworkSimplexPlacer/lambda$8$Type",1421),wAn(1422,1,DVn,ra),MWn.Mb=function(n){return BZ(),UH(BB(n,17))},vX(I3n,"NetworkSimplexPlacer/lambda$9$Type",1422),wAn(1404,1,E3n,Cf),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?Zmt:null},MWn.pf=function(n,t){kHn(BB(n,37),t)},vX(I3n,"SimpleNodePlacer",1404),wAn(180,1,{180:1},qKn),MWn.Ib=function(){var n;return n="",this.c==(gJ(),tyt)?n+=aJn:this.c==nyt&&(n+=cJn),this.o==(oZ(),ryt)?n+=pJn:this.o==cyt?n+="UP":n+="BALANCED",n},vX($3n,"BKAlignedLayout",180),wAn(516,22,{3:1,35:1,22:1,516:1},cC);var iyt,ryt,cyt,ayt=Ben($3n,"BKAlignedLayout/HDirection",516,Unt,VY,PF);wAn(515,22,{3:1,35:1,22:1,515:1},rC);var uyt,oyt,syt,hyt,fyt,lyt,byt,wyt,dyt,gyt,pyt,vyt,myt,yyt,kyt,jyt,Eyt,Tyt,Myt,Syt=Ben($3n,"BKAlignedLayout/VDirection",515,Unt,QY,CF);wAn(1634,1,{},iC),vX($3n,"BKAligner",1634),wAn(1637,1,{},Jyn),vX($3n,"BKCompactor",1637),wAn(654,1,{654:1},ca),MWn.a=0,vX($3n,"BKCompactor/ClassEdge",654),wAn(458,1,{458:1},cm),MWn.a=null,MWn.b=0,vX($3n,"BKCompactor/ClassNode",458),wAn(1407,1,E3n,jI),MWn.Yf=function(n){return BB(mMn(BB(n,37),(hWn(),Zft)),21).Hc((bDn(),lft))?oyt:null},MWn.pf=function(n,t){rWn(this,BB(n,37),t)},MWn.d=!1,vX($3n,"BKNodePlacer",1407),wAn(1635,1,{},aa),MWn.d=0,vX($3n,"NeighborhoodInformation",1635),wAn(1636,1,MYn,fg),MWn.ue=function(n,t){return Mtn(this,BB(n,46),BB(t,46))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX($3n,"NeighborhoodInformation/NeighborComparator",1636),wAn(808,1,{}),vX($3n,"ThresholdStrategy",808),wAn(1763,808,{},dm),MWn.bg=function(n,t,e){return this.a.o==(oZ(),cyt)?RQn:KQn},MWn.cg=function(){},vX($3n,"ThresholdStrategy/NullThresholdStrategy",1763),wAn(579,1,{579:1},aC),MWn.c=!1,MWn.d=!1,vX($3n,"ThresholdStrategy/Postprocessable",579),wAn(1764,808,{},gm),MWn.bg=function(n,t,e){var i,r,c;return r=t==e,i=this.a.a[e.p]==t,r||i?(c=n,this.a.c,gJ(),r&&(c=THn(this,t,!0)),!isNaN(c)&&!isFinite(c)&&i&&(c=THn(this,e,!1)),c):n},MWn.cg=function(){for(var n,t,e;0!=this.d.b;)(t=cFn(this,e=BB(PJ(this.d),579))).a&&(n=t.a,(qy(this.a.f[this.a.g[e.b.p].p])||b5(n)||n.c.i.c!=n.d.i.c)&&(b$n(this,e)||rA(this.e,e)));for(;0!=this.e.a.c.length;)b$n(this,BB(thn(this.e),579))},vX($3n,"ThresholdStrategy/SimpleThresholdStrategy",1764),wAn(635,1,{635:1,246:1,234:1},ua),MWn.Kf=function(){return Tan(this)},MWn.Xf=function(){return Tan(this)},vX(L3n,"EdgeRouterFactory",635),wAn(1458,1,E3n,If),MWn.Yf=function(n){return Uxn(BB(n,37))},MWn.pf=function(n,t){DHn(BB(n,37),t)},vX(L3n,"OrthogonalEdgeRouter",1458),wAn(1451,1,E3n,EI),MWn.Yf=function(n){return Ejn(BB(n,37))},MWn.pf=function(n,t){OUn(this,BB(n,37),t)},vX(L3n,"PolylineEdgeRouter",1451),wAn(1452,1,qYn,oa),MWn.Lb=function(n){return Qan(BB(n,10))},MWn.Fb=function(n){return this===n},MWn.Mb=function(n){return Qan(BB(n,10))},vX(L3n,"PolylineEdgeRouter/1",1452),wAn(1809,1,DVn,sa),MWn.Mb=function(n){return BB(n,129).c==(O6(),Tyt)},vX(N3n,"HyperEdgeCycleDetector/lambda$0$Type",1809),wAn(1810,1,{},ha),MWn.Ge=function(n){return BB(n,129).d},vX(N3n,"HyperEdgeCycleDetector/lambda$1$Type",1810),wAn(1811,1,DVn,fa),MWn.Mb=function(n){return BB(n,129).c==(O6(),Tyt)},vX(N3n,"HyperEdgeCycleDetector/lambda$2$Type",1811),wAn(1812,1,{},la),MWn.Ge=function(n){return BB(n,129).d},vX(N3n,"HyperEdgeCycleDetector/lambda$3$Type",1812),wAn(1813,1,{},ba),MWn.Ge=function(n){return BB(n,129).d},vX(N3n,"HyperEdgeCycleDetector/lambda$4$Type",1813),wAn(1814,1,{},wa),MWn.Ge=function(n){return BB(n,129).d},vX(N3n,"HyperEdgeCycleDetector/lambda$5$Type",1814),wAn(112,1,{35:1,112:1},Fan),MWn.wd=function(n){return oj(this,BB(n,112))},MWn.Fb=function(n){var t;return!!cL(n,112)&&(t=BB(n,112),this.g==t.g)},MWn.Hb=function(){return this.g},MWn.Ib=function(){var n,t,e,i;for(n=new lN("{"),i=new Wb(this.n);i.a<i.c.c.length;)null==(t=gyn((e=BB(n0(i),11)).i))&&(t="n"+AK(e.i)),n.a+=""+t,i.a<i.c.c.length&&(n.a+=",");return n.a+="}",n.a},MWn.a=0,MWn.b=0,MWn.c=NaN,MWn.d=0,MWn.g=0,MWn.i=0,MWn.o=0,MWn.s=NaN,vX(N3n,"HyperEdgeSegment",112),wAn(129,1,{129:1},zZ),MWn.Ib=function(){return this.a+"->"+this.b+" ("+wx(this.c)+")"},MWn.d=0,vX(N3n,"HyperEdgeSegmentDependency",129),wAn(520,22,{3:1,35:1,22:1,520:1},uC);var Pyt,Cyt,Iyt,Oyt,Ayt,$yt,Lyt,Nyt,xyt=Ben(N3n,"HyperEdgeSegmentDependency/DependencyType",520,Unt,WY,IF);wAn(1815,1,{},lg),vX(N3n,"HyperEdgeSegmentSplitter",1815),wAn(1816,1,{},zj),MWn.a=0,MWn.b=0,vX(N3n,"HyperEdgeSegmentSplitter/AreaRating",1816),wAn(329,1,{329:1},kB),MWn.a=0,MWn.b=0,MWn.c=0,vX(N3n,"HyperEdgeSegmentSplitter/FreeArea",329),wAn(1817,1,MYn,ja),MWn.ue=function(n,t){return OK(BB(n,112),BB(t,112))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(N3n,"HyperEdgeSegmentSplitter/lambda$0$Type",1817),wAn(1818,1,lVn,XV),MWn.td=function(n){n4(this.a,this.d,this.c,this.b,BB(n,112))},MWn.b=0,vX(N3n,"HyperEdgeSegmentSplitter/lambda$1$Type",1818),wAn(1819,1,{},Ea),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,112).e,16))},vX(N3n,"HyperEdgeSegmentSplitter/lambda$2$Type",1819),wAn(1820,1,{},Ta),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,112).j,16))},vX(N3n,"HyperEdgeSegmentSplitter/lambda$3$Type",1820),wAn(1821,1,{},Ma),MWn.Fe=function(n){return Gy(MD(n))},vX(N3n,"HyperEdgeSegmentSplitter/lambda$4$Type",1821),wAn(655,1,{},fX),MWn.a=0,MWn.b=0,MWn.c=0,vX(N3n,"OrthogonalRoutingGenerator",655),wAn(1638,1,{},Sa),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,112).e,16))},vX(N3n,"OrthogonalRoutingGenerator/lambda$0$Type",1638),wAn(1639,1,{},Pa),MWn.Kb=function(n){return new Rq(null,new w1(BB(n,112).j,16))},vX(N3n,"OrthogonalRoutingGenerator/lambda$1$Type",1639),wAn(661,1,{}),vX(x3n,"BaseRoutingDirectionStrategy",661),wAn(1807,661,{},pm),MWn.dg=function(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g;if(!n.r||n.q)for(f=t+n.o*i,h=new Wb(n.n);h.a<h.c.c.length;)for(s=BB(n0(h),11),l=Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a])).a,o=new Wb(s.g);o.a<o.c.c.length;)b5(u=BB(n0(o),17))||(d=u.d,g=Aon(Pun(Gk(PMt,1),sVn,8,0,[d.i.n,d.n,d.a])).a,e.Math.abs(l-g)>lZn&&(c=n,r=new xC(l,a=f),DH(u.a,r),F_n(this,u,c,r,!1),(b=n.r)&&(r=new xC(w=Gy(MD(Dpn(b.e,0))),a),DH(u.a,r),F_n(this,u,c,r,!1),c=b,r=new xC(w,a=t+b.o*i),DH(u.a,r),F_n(this,u,c,r,!1)),r=new xC(g,a),DH(u.a,r),F_n(this,u,c,r,!1)))},MWn.eg=function(n){return n.i.n.a+n.n.a+n.a.a},MWn.fg=function(){return kUn(),SIt},MWn.gg=function(){return kUn(),sIt},vX(x3n,"NorthToSouthRoutingStrategy",1807),wAn(1808,661,{},vm),MWn.dg=function(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g;if(!n.r||n.q)for(f=t-n.o*i,h=new Wb(n.n);h.a<h.c.c.length;)for(s=BB(n0(h),11),l=Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a])).a,o=new Wb(s.g);o.a<o.c.c.length;)b5(u=BB(n0(o),17))||(d=u.d,g=Aon(Pun(Gk(PMt,1),sVn,8,0,[d.i.n,d.n,d.a])).a,e.Math.abs(l-g)>lZn&&(c=n,r=new xC(l,a=f),DH(u.a,r),F_n(this,u,c,r,!1),(b=n.r)&&(r=new xC(w=Gy(MD(Dpn(b.e,0))),a),DH(u.a,r),F_n(this,u,c,r,!1),c=b,r=new xC(w,a=t-b.o*i),DH(u.a,r),F_n(this,u,c,r,!1)),r=new xC(g,a),DH(u.a,r),F_n(this,u,c,r,!1)))},MWn.eg=function(n){return n.i.n.a+n.n.a+n.a.a},MWn.fg=function(){return kUn(),sIt},MWn.gg=function(){return kUn(),SIt},vX(x3n,"SouthToNorthRoutingStrategy",1808),wAn(1806,661,{},mm),MWn.dg=function(n,t,i){var r,c,a,u,o,s,h,f,l,b,w,d,g;if(!n.r||n.q)for(f=t+n.o*i,h=new Wb(n.n);h.a<h.c.c.length;)for(s=BB(n0(h),11),l=Aon(Pun(Gk(PMt,1),sVn,8,0,[s.i.n,s.n,s.a])).b,o=new Wb(s.g);o.a<o.c.c.length;)b5(u=BB(n0(o),17))||(d=u.d,g=Aon(Pun(Gk(PMt,1),sVn,8,0,[d.i.n,d.n,d.a])).b,e.Math.abs(l-g)>lZn&&(c=n,r=new xC(a=f,l),DH(u.a,r),F_n(this,u,c,r,!0),(b=n.r)&&(r=new xC(a,w=Gy(MD(Dpn(b.e,0)))),DH(u.a,r),F_n(this,u,c,r,!0),c=b,r=new xC(a=t+b.o*i,w),DH(u.a,r),F_n(this,u,c,r,!0)),r=new xC(a,g),DH(u.a,r),F_n(this,u,c,r,!0)))},MWn.eg=function(n){return n.i.n.b+n.n.b+n.a.b},MWn.fg=function(){return kUn(),oIt},MWn.gg=function(){return kUn(),CIt},vX(x3n,"WestToEastRoutingStrategy",1806),wAn(813,1,{},oBn),MWn.Ib=function(){return LMn(this.a)},MWn.b=0,MWn.c=!1,MWn.d=!1,MWn.f=0,vX(R3n,"NubSpline",813),wAn(407,1,{407:1},Exn,wJ),vX(R3n,"NubSpline/PolarCP",407),wAn(1453,1,E3n,hyn),MWn.Yf=function(n){return rTn(BB(n,37))},MWn.pf=function(n,t){cXn(this,BB(n,37),t)},vX(R3n,"SplineEdgeRouter",1453),wAn(268,1,{268:1},S6),MWn.Ib=function(){return this.a+" ->("+this.c+") "+this.b},MWn.c=0,vX(R3n,"SplineEdgeRouter/Dependency",268),wAn(455,22,{3:1,35:1,22:1,455:1},oC);var Dyt,Ryt,Kyt,_yt,Fyt,Byt=Ben(R3n,"SplineEdgeRouter/SideToProcess",455,Unt,YY,OF);wAn(1454,1,DVn,ya),MWn.Mb=function(n){return gxn(),!BB(n,128).o},vX(R3n,"SplineEdgeRouter/lambda$0$Type",1454),wAn(1455,1,{},ma),MWn.Ge=function(n){return gxn(),BB(n,128).v+1},vX(R3n,"SplineEdgeRouter/lambda$1$Type",1455),wAn(1456,1,lVn,sC),MWn.td=function(n){iq(this.a,this.b,BB(n,46))},vX(R3n,"SplineEdgeRouter/lambda$2$Type",1456),wAn(1457,1,lVn,hC),MWn.td=function(n){rq(this.a,this.b,BB(n,46))},vX(R3n,"SplineEdgeRouter/lambda$3$Type",1457),wAn(128,1,{35:1,128:1},tCn,hqn),MWn.wd=function(n){return sj(this,BB(n,128))},MWn.b=0,MWn.e=!1,MWn.f=0,MWn.g=0,MWn.j=!1,MWn.k=!1,MWn.n=0,MWn.o=!1,MWn.p=!1,MWn.q=!1,MWn.s=0,MWn.u=0,MWn.v=0,MWn.F=0,vX(R3n,"SplineSegment",128),wAn(459,1,{459:1},ka),MWn.a=0,MWn.b=!1,MWn.c=!1,MWn.d=!1,MWn.e=!1,MWn.f=0,vX(R3n,"SplineSegment/EdgeInformation",459),wAn(1234,1,{},da),vX(H3n,iZn,1234),wAn(1235,1,MYn,ga),MWn.ue=function(n,t){return IIn(BB(n,135),BB(t,135))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(H3n,rZn,1235),wAn(1233,1,{},AE),vX(H3n,"MrTree",1233),wAn(393,22,{3:1,35:1,22:1,393:1,246:1,234:1},fC),MWn.Kf=function(){return AIn(this)},MWn.Xf=function(){return AIn(this)};var Hyt,qyt=Ben(H3n,"TreeLayoutPhases",393,Unt,j3,AF);wAn(1130,209,NJn,_R),MWn.Ze=function(n,t){var e,i,r,c,a,u;for(qy(TD(ZAn(n,(CAn(),Ckt))))||jJ(new Tw((GM(),new Dy(n)))),qan(a=new P6,n),hon(a,(qqn(),skt),n),v_n(n,a,u=new xp),W_n(n,a,u),c=a,i=new Wb(r=x_n(this.a,c));i.a<i.c.c.length;)e=BB(n0(i),135),WEn(this.b,e,mcn(t,1/r.c.length));Izn(c=tWn(r))},vX(H3n,"TreeLayoutProvider",1130),wAn(1847,1,pVn,pa),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return SQ(),LT(),bet},vX(H3n,"TreeUtil/1",1847),wAn(1848,1,pVn,va),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return SQ(),LT(),bet},vX(H3n,"TreeUtil/2",1848),wAn(502,134,{3:1,502:1,94:1,134:1}),MWn.g=0,vX(q3n,"TGraphElement",502),wAn(188,502,{3:1,188:1,502:1,94:1,134:1},UQ),MWn.Ib=function(){return this.b&&this.c?g0(this.b)+"->"+g0(this.c):"e_"+nsn(this)},vX(q3n,"TEdge",188),wAn(135,134,{3:1,135:1,94:1,134:1},P6),MWn.Ib=function(){var n,t,e,i,r;for(r=null,i=spn(this.b,0);i.b!=i.d.c;)r+=(null==(e=BB(b3(i),86)).c||0==e.c.length?"n_"+e.g:"n_"+e.c)+"\n";for(t=spn(this.a,0);t.b!=t.d.c;)r+=((n=BB(b3(t),188)).b&&n.c?g0(n.b)+"->"+g0(n.c):"e_"+nsn(n))+"\n";return r};var Gyt=vX(q3n,"TGraph",135);wAn(633,502,{3:1,502:1,633:1,94:1,134:1}),vX(q3n,"TShape",633),wAn(86,633,{3:1,502:1,86:1,633:1,94:1,134:1},csn),MWn.Ib=function(){return g0(this)};var zyt,Uyt,Xyt,Wyt,Vyt,Qyt,Yyt=vX(q3n,"TNode",86);wAn(255,1,pVn,bg),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return new wg(spn(this.a.d,0))},vX(q3n,"TNode/2",255),wAn(358,1,QWn,wg),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return BB(b3(this.a),188).c},MWn.Ob=function(){return EE(this.a)},MWn.Qb=function(){mtn(this.a)},vX(q3n,"TNode/2/1",358),wAn(1840,1,n1n,KR),MWn.pf=function(n,t){xFn(this,BB(n,135),t)},vX(G3n,"FanProcessor",1840),wAn(327,22,{3:1,35:1,22:1,327:1,234:1},lC),MWn.Kf=function(){switch(this.g){case 0:return new Qm;case 1:return new KR;case 2:return new Oa;case 3:return new Ca;case 4:return new $a;case 5:return new La;default:throw Hp(new _y(M1n+(null!=this.f?this.f:""+this.g)))}};var Jyt,Zyt,nkt,tkt,ekt,ikt,rkt,ckt,akt,ukt,okt,skt,hkt,fkt,lkt,bkt,wkt,dkt,gkt,pkt,vkt,mkt,ykt,kkt,jkt,Ekt,Tkt,Mkt,Skt,Pkt,Ckt,Ikt,Okt,Akt,$kt,Lkt,Nkt,xkt,Dkt,Rkt,Kkt,_kt=Ben(G3n,S1n,327,Unt,r9,$F);wAn(1843,1,n1n,Ca),MWn.pf=function(n,t){u$n(this,BB(n,135),t)},MWn.a=0,vX(G3n,"LevelHeightProcessor",1843),wAn(1844,1,pVn,Ia),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return SQ(),LT(),bet},vX(G3n,"LevelHeightProcessor/1",1844),wAn(1841,1,n1n,Oa),MWn.pf=function(n,t){QPn(this,BB(n,135),t)},MWn.a=0,vX(G3n,"NeighborsProcessor",1841),wAn(1842,1,pVn,Aa),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return SQ(),LT(),bet},vX(G3n,"NeighborsProcessor/1",1842),wAn(1845,1,n1n,$a),MWn.pf=function(n,t){a$n(this,BB(n,135),t)},MWn.a=0,vX(G3n,"NodePositionProcessor",1845),wAn(1839,1,n1n,Qm),MWn.pf=function(n,t){ZHn(this,BB(n,135))},vX(G3n,"RootProcessor",1839),wAn(1846,1,n1n,La),MWn.pf=function(n,t){dln(BB(n,135))},vX(G3n,"Untreeifyer",1846),wAn(851,1,QYn,Pf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X3n),""),"Weighting of Nodes"),"Which weighting to use when computing a node order."),kkt),(PPn(),gMt)),qkt),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,W3n),""),"Search Order"),"Which search order to use when computing a spanning tree."),mkt),gMt),Jkt),nbn(hMt)))),KGn((new Sf,n))},vX(V3n,"MrTreeMetaDataProvider",851),wAn(994,1,QYn,Sf),MWn.Qe=function(n){KGn(n)},vX(V3n,"MrTreeOptions",994),wAn(995,1,{},Na),MWn.$e=function(){return new _R},MWn._e=function(n){},vX(V3n,"MrTreeOptions/MrtreeFactory",995),wAn(480,22,{3:1,35:1,22:1,480:1},bC);var Fkt,Bkt,Hkt,qkt=Ben(V3n,"OrderWeighting",480,Unt,ZY,LF);wAn(425,22,{3:1,35:1,22:1,425:1},wC);var Gkt,zkt,Ukt,Xkt,Wkt,Vkt,Qkt,Ykt,Jkt=Ben(V3n,"TreeifyingOrder",425,Unt,JY,xF);wAn(1459,1,E3n,pf),MWn.Yf=function(n){return BB(n,135),zkt},MWn.pf=function(n,t){ycn(this,BB(n,135),t)},vX("org.eclipse.elk.alg.mrtree.p1treeify","DFSTreeifyer",1459),wAn(1460,1,E3n,vf),MWn.Yf=function(n){return BB(n,135),Ukt},MWn.pf=function(n,t){fCn(this,BB(n,135),t)},vX("org.eclipse.elk.alg.mrtree.p2order","NodeOrderer",1460),wAn(1461,1,E3n,gf),MWn.Yf=function(n){return BB(n,135),Xkt},MWn.pf=function(n,t){nRn(this,BB(n,135),t)},MWn.a=0,vX("org.eclipse.elk.alg.mrtree.p3place","NodePlacer",1461),wAn(1462,1,E3n,mf),MWn.Yf=function(n){return BB(n,135),Wkt},MWn.pf=function(n,t){xkn(BB(n,135),t)},vX("org.eclipse.elk.alg.mrtree.p4route","EdgeRouter",1462),wAn(495,22,{3:1,35:1,22:1,495:1,246:1,234:1},dC),MWn.Kf=function(){return bwn(this)},MWn.Xf=function(){return bwn(this)};var Zkt,njt,tjt,ejt,ijt=Ben(J3n,"RadialLayoutPhases",495,Unt,nJ,NF);wAn(1131,209,NJn,OE),MWn.Ze=function(n,t){var e,i,r;if(OTn(t,"Radial layout",ECn(this,n).c.length),qy(TD(ZAn(n,(Uyn(),Ajt))))||jJ(new Tw((GM(),new Dy(n)))),r=uTn(n),Ypn(n,(wD(),Vkt),r),!r)throw Hp(new _y("The given graph is not a tree!"));for(0==(e=Gy(MD(ZAn(n,Djt))))&&(e=fIn(n)),Ypn(n,Djt,e),i=new Wb(ECn(this,n));i.a<i.c.c.length;)BB(n0(i),51).pf(n,mcn(t,1));HSn(t)},vX(J3n,"RadialLayoutProvider",1131),wAn(549,1,MYn,IE),MWn.ue=function(n,t){return DRn(this.a,this.b,BB(n,33),BB(t,33))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},MWn.a=0,MWn.b=0,vX(J3n,"RadialUtil/lambda$0$Type",549),wAn(1375,1,n1n,Da),MWn.pf=function(n,t){dGn(BB(n,33),t)},vX(t4n,"CalculateGraphSize",1375),wAn(442,22,{3:1,35:1,22:1,442:1,234:1},gC),MWn.Kf=function(){switch(this.g){case 0:return new Ba;case 1:return new xa;case 2:return new Da;default:throw Hp(new _y(M1n+(null!=this.f?this.f:""+this.g)))}};var rjt,cjt,ajt,ujt=Ben(t4n,S1n,442,Unt,R1,DF);wAn(645,1,{}),MWn.e=1,MWn.g=0,vX(e4n,"AbstractRadiusExtensionCompaction",645),wAn(1772,645,{},gD),MWn.hg=function(n){var t,e,i,r,c,a,u,o,s;for(this.c=BB(ZAn(n,(wD(),Vkt)),33),eb(this,this.c),this.d=Evn(BB(ZAn(n,(Uyn(),Rjt)),293)),(o=BB(ZAn(n,Mjt),19))&&tb(this,o.a),ib(this,(kW(u=MD(ZAn(n,(sWn(),LPt)))),u)),s=wDn(this.c),this.d&&this.d.lg(s),vKn(this,s),a=new Jy(Pun(Gk(UOt,1),i4n,33,0,[this.c])),e=0;e<2;e++)for(t=0;t<s.c.length;t++)r=new Jy(Pun(Gk(UOt,1),i4n,33,0,[(l1(t,s.c.length),BB(s.c[t],33))])),c=t<s.c.length-1?(l1(t+1,s.c.length),BB(s.c[t+1],33)):(l1(0,s.c.length),BB(s.c[0],33)),i=0==t?BB(xq(s,s.c.length-1),33):(l1(t-1,s.c.length),BB(s.c[t-1],33)),ZTn(this,(l1(t,s.c.length),BB(s.c[t],33),a),i,c,r)},vX(e4n,"AnnulusWedgeCompaction",1772),wAn(1374,1,n1n,xa),MWn.pf=function(n,t){bjn(BB(n,33),t)},vX(e4n,"GeneralCompactor",1374),wAn(1771,645,{},Ra),MWn.hg=function(n){var t,e,i,r;e=BB(ZAn(n,(wD(),Vkt)),33),this.f=e,this.b=Evn(BB(ZAn(n,(Uyn(),Rjt)),293)),(r=BB(ZAn(n,Mjt),19))&&tb(this,r.a),ib(this,(kW(i=MD(ZAn(n,(sWn(),LPt)))),i)),t=wDn(e),this.b&&this.b.lg(t),vPn(this,t)},MWn.a=0,vX(e4n,"RadialCompaction",1771),wAn(1779,1,{},Ka),MWn.ig=function(n){var t,e,i,r,c,a;for(this.a=n,t=0,i=0,c=new Wb(a=wDn(n));c.a<c.c.c.length;)for(r=BB(n0(c),33),e=++i;e<a.c.length;e++)YFn(this,r,(l1(e,a.c.length),BB(a.c[e],33)))&&(t+=1);return t},vX(r4n,"CrossingMinimizationPosition",1779),wAn(1777,1,{},_a),MWn.ig=function(n){var t,i,r,c,a,u,o,s,f,l,b,w,d;for(r=0,i=new oz(ZL(dLn(n).a.Kc(),new h));dAn(i);)t=BB(U5(i),79),f=(o=PTn(BB(Wtn((!t.c&&(t.c=new hK(KOt,t,5,8)),t.c),0),82))).i+o.g/2,l=o.j+o.f/2,c=n.i+n.g/2,a=n.j+n.f/2,(b=new Gj).a=f-c,b.b=l-a,Ukn(u=new xC(b.a,b.b),n.g,n.f),b.a-=u.a,b.b-=u.b,c=f-b.a,a=l-b.b,Ukn(s=new xC(b.a,b.b),o.g,o.f),b.a-=s.a,b.b-=s.b,w=(f=c+b.a)-c,d=(l=a+b.b)-a,r+=e.Math.sqrt(w*w+d*d);return r},vX(r4n,"EdgeLengthOptimization",1777),wAn(1778,1,{},Fa),MWn.ig=function(n){var t,i,r,c,a,u,o,s,f;for(r=0,i=new oz(ZL(dLn(n).a.Kc(),new h));dAn(i);)t=BB(U5(i),79),u=(a=PTn(BB(Wtn((!t.c&&(t.c=new hK(KOt,t,5,8)),t.c),0),82))).i+a.g/2,o=a.j+a.f/2,c=BB(ZAn(a,(sWn(),gPt)),8),s=u-(n.i+c.a+n.g/2),f=o-(n.j+c.b+n.f),r+=e.Math.sqrt(s*s+f*f);return r},vX(r4n,"EdgeLengthPositionOptimization",1778),wAn(1373,645,n1n,Ba),MWn.pf=function(n,t){fLn(this,BB(n,33),t)},vX("org.eclipse.elk.alg.radial.intermediate.overlaps","RadiusExtensionOverlapRemoval",1373),wAn(426,22,{3:1,35:1,22:1,426:1},pC);var ojt,sjt,hjt,fjt,ljt=Ben(a4n,"AnnulusWedgeCriteria",426,Unt,tJ,RF);wAn(380,22,{3:1,35:1,22:1,380:1},vC);var bjt,wjt,djt,gjt,pjt,vjt,mjt,yjt,kjt,jjt,Ejt,Tjt,Mjt,Sjt,Pjt,Cjt,Ijt,Ojt,Ajt,$jt,Ljt,Njt,xjt,Djt,Rjt,Kjt,_jt,Fjt,Bjt,Hjt,qjt,Gjt=Ben(a4n,FJn,380,Unt,K1,KF);wAn(852,1,QYn,yf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,u4n),""),"Order ID"),"The id can be used to define an order for nodes of one radius. This can be used to sort them in the layer accordingly."),iln(0)),(PPn(),vMt)),Att),nbn((rpn(),sMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,o4n),""),"Radius"),"The radius option can be used to set the initial radius for the radial layouter."),0),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,s4n),""),"Compaction"),"With the compacter option it can be determined how compaction on the graph is done. It can be chosen between none, the radial compaction or the compaction of wedges separately."),gjt),gMt),Gjt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,h4n),""),"Compaction Step Size"),"Determine the size of steps with which the compaction is done. Step size 1 correlates to a compaction of 1 pixel per Iteration."),iln(1)),vMt),Att),nbn(hMt)))),a2(n,h4n,s4n,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,f4n),""),"Sorter"),"Sort the nodes per radius according to the sorting algorithm. The strategies are none, by the given order id, or sorting them by polar coordinates."),jjt),gMt),Yjt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,l4n),""),"Annulus Wedge Criteria"),"Determine how the wedge for the node placement is calculated. It can be chosen between wedge determination by the number of leaves or by the maximum sum of diagonals."),Tjt),gMt),ljt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,b4n),""),"Translation Optimization"),"Find the optimal translation of the nodes of the first radii according to this criteria. For example edge crossings can be minimized."),vjt),gMt),Vjt),nbn(hMt)))),tUn((new kf,n))},vX(a4n,"RadialMetaDataProvider",852),wAn(996,1,QYn,kf),MWn.Qe=function(n){tUn(n)},vX(a4n,"RadialOptions",996),wAn(997,1,{},Ha),MWn.$e=function(){return new OE},MWn._e=function(n){},vX(a4n,"RadialOptions/RadialFactory",997),wAn(340,22,{3:1,35:1,22:1,340:1},mC);var zjt,Ujt,Xjt,Wjt,Vjt=Ben(a4n,"RadialTranslationStrategy",340,Unt,E3,_F);wAn(293,22,{3:1,35:1,22:1,293:1},yC);var Qjt,Yjt=Ben(a4n,"SortingStrategy",293,Unt,F1,FF);wAn(1449,1,E3n,qa),MWn.Yf=function(n){return BB(n,33),null},MWn.pf=function(n,t){SLn(this,BB(n,33),t)},MWn.c=0,vX("org.eclipse.elk.alg.radial.p1position","EadesRadial",1449),wAn(1775,1,{},Ga),MWn.jg=function(n){return Upn(n)},vX(d4n,"AnnulusWedgeByLeafs",1775),wAn(1776,1,{},za),MWn.jg=function(n){return VEn(this,n)},vX(d4n,"AnnulusWedgeByNodeSpace",1776),wAn(1450,1,E3n,Ua),MWn.Yf=function(n){return BB(n,33),null},MWn.pf=function(n,t){bEn(this,BB(n,33),t)},vX("org.eclipse.elk.alg.radial.p2routing","StraightLineEdgeRouter",1450),wAn(811,1,{},Jm),MWn.kg=function(n){},MWn.lg=function(n){nv(this,n)},vX(g4n,"IDSorter",811),wAn(1774,1,MYn,Xa),MWn.ue=function(n,t){return Qrn(BB(n,33),BB(t,33))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(g4n,"IDSorter/lambda$0$Type",1774),wAn(1773,1,{},Arn),MWn.kg=function(n){c2(this,n)},MWn.lg=function(n){n.dc()||(this.e||c2(this,nG(BB(n.Xb(0),33))),nv(this.e,n))},vX(g4n,"PolarCoordinateSorter",1773),wAn(1136,209,NJn,Wa),MWn.Ze=function(n,t){var i,r,c,a,u,o,s,h,f,l,b,w,d,g,p,v,m,y,k,j,E,T;if(OTn(t,"Rectangle Packing",1),t.n&&t.n&&n&&y0(t,o2(n),(Bsn(),uOt)),i=Gy(MD(ZAn(n,(W$n(),lEt)))),w=BB(ZAn(n,PEt),381),p=qy(TD(ZAn(n,yEt))),y=qy(TD(ZAn(n,SEt))),f=qy(TD(ZAn(n,gEt))),k=BB(ZAn(n,CEt),116),m=Gy(MD(ZAn(n,$Et))),r=qy(TD(ZAn(n,AEt))),l=qy(TD(ZAn(n,pEt))),g=qy(TD(ZAn(n,vEt))),T=Gy(MD(ZAn(n,LEt))),!n.a&&(n.a=new eU(UOt,n,10,11)),Trn(E=n.a),g){for(b=new Np,o=new AL(E);o.e!=o.i.gc();)P8(a=BB(kpn(o),33),dEt)&&(b.c[b.c.length]=a);for(s=new Wb(b);s.a<s.c.c.length;)snn(E,a=BB(n0(s),33));for(SQ(),m$(b,new Va),h=new Wb(b);h.a<h.c.c.length;)a=BB(n0(h),33),j=BB(ZAn(a,dEt),19).a,sln(E,j=e.Math.min(j,E.i),a);for(d=0,u=new AL(E);u.e!=u.i.gc();)Ypn(a=BB(kpn(u),33),wEt,iln(d)),++d}(v=XPn(n)).a-=k.b+k.c,v.b-=k.d+k.a,v.a,T<0||T<v.a?(c=OKn(new jB(i,w,p),E,m,k),t.n&&t.n&&n&&y0(t,o2(n),(Bsn(),uOt))):c=new eq(i,T,0,(YLn(),_Et)),v.a+=k.b+k.c,v.b+=k.d+k.a,y||(Trn(E),c=kzn(new m3(i,f,l,r,m),E,e.Math.max(v.a,c.c),v,t,n,k)),pan(E,k),KUn(n,c.c+(k.b+k.c),c.b+(k.d+k.a),!1,!0),qy(TD(ZAn(n,MEt)))||jJ(new Tw((GM(),new Dy(n)))),t.n&&t.n&&n&&y0(t,o2(n),(Bsn(),uOt)),HSn(t)},vX(y4n,"RectPackingLayoutProvider",1136),wAn(1137,1,MYn,Va),MWn.ue=function(n,t){return wsn(BB(n,33),BB(t,33))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(y4n,"RectPackingLayoutProvider/lambda$0$Type",1137),wAn(1256,1,{},jB),MWn.a=0,MWn.c=!1,vX(k4n,"AreaApproximation",1256);var Jjt,Zjt,nEt,tEt=bq(k4n,"BestCandidateFilter");wAn(638,1,{526:1},Qa),MWn.mg=function(n,t,i){var r,c,a,u,o,s;for(s=new Np,a=RQn,o=new Wb(n);o.a<o.c.c.length;)u=BB(n0(o),220),a=e.Math.min(a,(u.c+(i.b+i.c))*(u.b+(i.d+i.a)));for(c=new Wb(n);c.a<c.c.c.length;)((r=BB(n0(c),220)).c+(i.b+i.c))*(r.b+(i.d+i.a))==a&&(s.c[s.c.length]=r);return s},vX(k4n,"AreaFilter",638),wAn(639,1,{526:1},Ya),MWn.mg=function(n,t,i){var r,c,a,u,o,s;for(o=new Np,s=RQn,u=new Wb(n);u.a<u.c.c.length;)a=BB(n0(u),220),s=e.Math.min(s,e.Math.abs((a.c+(i.b+i.c))/(a.b+(i.d+i.a))-t));for(c=new Wb(n);c.a<c.c.c.length;)r=BB(n0(c),220),e.Math.abs((r.c+(i.b+i.c))/(r.b+(i.d+i.a))-t)==s&&(o.c[o.c.length]=r);return o},vX(k4n,"AspectRatioFilter",639),wAn(637,1,{526:1},Ja),MWn.mg=function(n,t,i){var r,c,a,u,o,s;for(s=new Np,a=KQn,o=new Wb(n);o.a<o.c.c.length;)u=BB(n0(o),220),a=e.Math.max(a,Yq(u.c+(i.b+i.c),u.b+(i.d+i.a),u.a));for(c=new Wb(n);c.a<c.c.c.length;)Yq((r=BB(n0(c),220)).c+(i.b+i.c),r.b+(i.d+i.a),r.a)==a&&(s.c[s.c.length]=r);return s},vX(k4n,"ScaleMeasureFilter",637),wAn(381,22,{3:1,35:1,22:1,381:1},kC);var eEt,iEt,rEt,cEt,aEt,uEt,oEt,sEt,hEt,fEt,lEt,bEt,wEt,dEt,gEt,pEt,vEt,mEt,yEt,kEt,jEt,EEt,TEt,MEt,SEt,PEt,CEt,IEt,OEt,AEt,$Et,LEt,NEt=Ben(j4n,"OptimizationGoal",381,Unt,_1,BF);wAn(856,1,QYn,Of),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,E4n),""),"Optimization Goal"),"Optimization goal for approximation of the bounding box given by the first iteration. Determines whether layout is sorted by the maximum scaling, aspect ratio, or area. Depending on the strategy the aspect ratio might be nearly ignored."),sEt),(PPn(),gMt)),NEt),nbn((rpn(),sMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,T4n),""),"Shift Last Placed."),"When placing a rectangle behind or below the last placed rectangle in the first iteration, it is sometimes possible to shift the rectangle further to the left or right, resulting in less whitespace. True (default) enables the shift and false disables it. Disabling the shift produces a greater approximated area by the first iteration and a layout, when using ONLY the first iteration (default not the case), where it is sometimes impossible to implement a size transformation of rectangles that will fill the bounding box and eliminate empty spaces."),(hN(),!0)),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,M4n),""),"Current position of a node in the order of nodes"),"The rectangles are ordered. Normally according to their definition the the model. This option specifies the current position of a node."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,S4n),""),"Desired index of node"),"The rectangles are ordered. Normally according to their definition the the model. This option allows to specify a desired position that has preference over the original position."),iln(-1)),vMt),Att),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,P4n),""),"Only Area Approximation"),"If enabled only the width approximation step is executed and the nodes are placed accordingly. The nodes are layouted according to the packingStrategy. If set to true not expansion of nodes is taking place."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,C4n),""),"Compact Rows"),"Enables compaction. Compacts blocks if they do not use the full height of the row. This option allows to have a smaller drawing. If this option is disabled all nodes are placed next to each other in rows."),!0),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,I4n),""),"Fit Aspect Ratio"),"Expands nodes if expandNodes is true to fit the aspect ratio instead of only in their bounds. The option is only useful if the used packingStrategy is ASPECT_RATIO_DRIVEN, otherwise this may result in unreasonable ndoe expansion."),!1),wMt),ktt),nbn(sMt)))),a2(n,I4n,A4n,null),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,O4n),""),"Target Width"),"Option to place the rectangles in the given target width instead of approximating the width using the desired aspect ratio. The padding is not included in this. Meaning a drawing will have width of targetwidth + horizontal padding."),-1),dMt),Ptt),nbn(sMt)))),NXn((new Af,n))},vX(j4n,"RectPackingMetaDataProvider",856),wAn(1004,1,QYn,Af),MWn.Qe=function(n){NXn(n)},vX(j4n,"RectPackingOptions",1004),wAn(1005,1,{},Za),MWn.$e=function(){return new Wa},MWn._e=function(n){},vX(j4n,"RectPackingOptions/RectpackingFactory",1005),wAn(1257,1,{},m3),MWn.a=0,MWn.b=!1,MWn.c=0,MWn.d=0,MWn.e=!1,MWn.f=!1,MWn.g=0,vX("org.eclipse.elk.alg.rectpacking.seconditeration","RowFillingAndCompaction",1257),wAn(187,1,{187:1},asn),MWn.a=0,MWn.c=!1,MWn.d=0,MWn.e=0,MWn.f=0,MWn.g=0,MWn.i=0,MWn.k=!1,MWn.o=RQn,MWn.p=RQn,MWn.r=0,MWn.s=0,MWn.t=0,vX(L4n,"Block",187),wAn(211,1,{211:1},RJ),MWn.a=0,MWn.b=0,MWn.d=0,MWn.e=0,MWn.f=0,vX(L4n,"BlockRow",211),wAn(443,1,{443:1},KJ),MWn.b=0,MWn.c=0,MWn.d=0,MWn.e=0,MWn.f=0,vX(L4n,"BlockStack",443),wAn(220,1,{220:1},eq,awn),MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,MWn.e=0;var xEt,DEt,REt,KEt,_Et,FEt=vX(L4n,"DrawingData",220);wAn(355,22,{3:1,35:1,22:1,355:1},jC);var BEt,HEt,qEt,GEt,zEt=Ben(L4n,"DrawingDataDescriptor",355,Unt,N5,HF);wAn(200,1,{200:1},x0),MWn.b=0,MWn.c=0,MWn.e=0,MWn.f=0,vX(L4n,"RectRow",200),wAn(756,1,{},Ehn),MWn.j=0,vX(x4n,g1n,756),wAn(1245,1,{},nu),MWn.Je=function(n){return W8(n.a,n.b)},vX(x4n,p1n,1245),wAn(1246,1,{},dg),MWn.Je=function(n){return p6(this.a,n)},vX(x4n,v1n,1246),wAn(1247,1,{},gg),MWn.Je=function(n){return Opn(this.a,n)},vX(x4n,m1n,1247),wAn(1248,1,{},pg),MWn.Je=function(n){return uon(this.a,n)},vX(x4n,"ElkGraphImporter/lambda$3$Type",1248),wAn(1249,1,{},vg),MWn.Je=function(n){return iOn(this.a,n)},vX(x4n,y1n,1249),wAn(1133,209,NJn,$E),MWn.Ze=function(n,t){var e,i,r,c,a,u,o,s,h,f;for(P8(n,(MMn(),kTt))&&(f=SD(ZAn(n,(Bvn(),qTt))),(c=XRn(cin(),f))&&BB(sJ(c.f),209).Ze(n,mcn(t,1))),Ypn(n,gTt,($6(),ZEt)),Ypn(n,pTt,($Sn(),cTt)),Ypn(n,vTt,(Lun(),WTt)),a=BB(ZAn(n,(Bvn(),_Tt)),19).a,OTn(t,"Overlap removal",1),qy(TD(ZAn(n,KTt))),o=new mg(u=new Rv),e=GXn(i=new Ehn,n),s=!0,r=0;r<a&&s;){if(qy(TD(ZAn(n,FTt)))){if(u.a.$b(),HPn(new I$(o),e.i),0==u.a.gc())break;e.e=u}for(h2(this.b),CU(this.b,(Pbn(),HEt),(OM(),GTt)),CU(this.b,qEt,e.g),CU(this.b,GEt,(IM(),QEt)),this.a=$qn(this.b,e),h=new Wb(this.a);h.a<h.c.c.length;)BB(n0(h),51).pf(e,mcn(t,1));cjn(i,e),s=qy(TD(mMn(e,(Xcn(),Yrt)))),++r}DGn(i,e),HSn(t)},vX(x4n,"OverlapRemovalLayoutProvider",1133),wAn(1134,1,{},mg),vX(x4n,"OverlapRemovalLayoutProvider/lambda$0$Type",1134),wAn(437,22,{3:1,35:1,22:1,437:1},EC);var UEt,XEt,WEt=Ben(x4n,"SPOrEPhases",437,Unt,B1,qF);wAn(1255,1,{},LE),vX(x4n,"ShrinkTree",1255),wAn(1135,209,NJn,Zm),MWn.Ze=function(n,t){var e,i,r,c;P8(n,(MMn(),kTt))&&(c=SD(ZAn(n,kTt)),(r=XRn(cin(),c))&&BB(sJ(r.f),209).Ze(n,mcn(t,1))),e=GXn(i=new Ehn,n),$Ln(this.a,e,mcn(t,1)),DGn(i,e)},vX(x4n,"ShrinkTreeLayoutProvider",1135),wAn(300,134,{3:1,300:1,94:1,134:1},DJ),MWn.c=!1,vX("org.eclipse.elk.alg.spore.graph","Graph",300),wAn(482,22,{3:1,35:1,22:1,482:1,246:1,234:1},LM),MWn.Kf=function(){return esn(this)},MWn.Xf=function(){return esn(this)};var VEt,QEt,YEt=Ben(D4n,FJn,482,Unt,KV,GF);wAn(551,22,{3:1,35:1,22:1,551:1,246:1,234:1},vD),MWn.Kf=function(){return new ru},MWn.Xf=function(){return new ru};var JEt,ZEt,nTt,tTt=Ben(D4n,"OverlapRemovalStrategy",551,Unt,_V,zF);wAn(430,22,{3:1,35:1,22:1,430:1},TC);var eTt,iTt,rTt,cTt,aTt,uTt,oTt=Ben(D4n,"RootSelection",430,Unt,iJ,UF);wAn(316,22,{3:1,35:1,22:1,316:1},MC);var sTt,hTt,fTt,lTt,bTt,wTt,dTt,gTt,pTt,vTt,mTt,yTt,kTt,jTt,ETt,TTt,MTt,STt,PTt,CTt,ITt,OTt,ATt,$Tt,LTt,NTt,xTt,DTt,RTt,KTt,_Tt,FTt,BTt,HTt,qTt,GTt,zTt=Ben(D4n,"SpanningTreeCostFunction",316,Unt,A5,XF);wAn(1002,1,QYn,Ef),MWn.Qe=function(n){yHn(n)},vX(D4n,"SporeCompactionOptions",1002),wAn(1003,1,{},tu),MWn.$e=function(){return new Zm},MWn._e=function(n){},vX(D4n,"SporeCompactionOptions/SporeCompactionFactory",1003),wAn(855,1,QYn,Tf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,K4n),""),"Underlying Layout Algorithm"),"A layout algorithm that is applied to the graph before it is compacted. If this is null, nothing is applied before compaction."),(PPn(),yMt)),Qtt),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,q4n),"structure"),"Structure Extraction Strategy"),"This option defines what kind of triangulation or other partitioning of the plane is applied to the vertices."),DTt),gMt),VTt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,_4n),W4n),"Tree Construction Strategy"),"Whether a minimum spanning tree or a maximum spanning tree should be constructed."),NTt),gMt),YTt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,F4n),W4n),"Cost Function for Spanning Tree"),"The cost function is used in the creation of the spanning tree."),$Tt),gMt),zTt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,B4n),W4n),"Root node for spanning tree construction"),"The identifier of the node that is preferred as the root of the spanning tree. If this is null, the first node is chosen."),null),yMt),Qtt),nbn(hMt)))),a2(n,B4n,H4n,CTt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,H4n),W4n),"Root selection for spanning tree"),"This sets the method used to select a root node for the construction of a spanning tree"),OTt),gMt),oTt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,G4n),E2n),"Compaction Strategy"),"This option defines how the compaction is applied."),ETt),gMt),YEt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,z4n),E2n),"Orthogonal Compaction"),"Restricts the translation of nodes to orthogonal directions in the compaction phase."),(hN(),!1)),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,U4n),V4n),"Upper limit for iterations of overlap removal"),null),iln(64)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X4n),V4n),"Whether to run a supplementary scanline overlap check."),null),!0),wMt),ktt),nbn(hMt)))),AKn((new Mf,n)),yHn((new Ef,n))},vX(D4n,"SporeMetaDataProvider",855),wAn(VVn,1,QYn,Mf),MWn.Qe=function(n){AKn(n)},vX(D4n,"SporeOverlapRemovalOptions",VVn),wAn(1001,1,{},eu),MWn.$e=function(){return new $E},MWn._e=function(n){},vX(D4n,"SporeOverlapRemovalOptions/SporeOverlapFactory",1001),wAn(530,22,{3:1,35:1,22:1,530:1,246:1,234:1},XW),MWn.Kf=function(){return isn(this)},MWn.Xf=function(){return isn(this)};var UTt,XTt,WTt,VTt=Ben(D4n,"StructureExtractionStrategy",530,Unt,FV,WF);wAn(429,22,{3:1,35:1,22:1,429:1,246:1,234:1},SC),MWn.Kf=function(){return wwn(this)},MWn.Xf=function(){return wwn(this)};var QTt,YTt=Ben(D4n,"TreeConstructionStrategy",429,Unt,eJ,VF);wAn(1443,1,E3n,iu),MWn.Yf=function(n){return BB(n,300),new B2},MWn.pf=function(n,t){Tjn(BB(n,300),t)},vX(Y4n,"DelaunayTriangulationPhase",1443),wAn(1444,1,lVn,yg),MWn.td=function(n){WB(this.a,BB(n,65).a)},vX(Y4n,"DelaunayTriangulationPhase/lambda$0$Type",1444),wAn(783,1,E3n,Vm),MWn.Yf=function(n){return BB(n,300),new B2},MWn.pf=function(n,t){this.ng(BB(n,300),t)},MWn.ng=function(n,t){var e;OTn(t,"Minimum spanning tree construction",1),e=n.d?n.d.a:BB(xq(n.i,0),65).a,Kun(this,(qy(TD(mMn(n,(Xcn(),Qrt)))),YHn(n.e,e,n.b)),n),HSn(t)},vX(J4n,"MinSTPhase",783),wAn(1446,783,E3n,ym),MWn.ng=function(n,t){var e,i;OTn(t,"Maximum spanning tree construction",1),e=new kg(n),i=n.d?n.d.c:BB(xq(n.i,0),65).c,Kun(this,(qy(TD(mMn(n,(Xcn(),Qrt)))),YHn(n.e,i,e)),n),HSn(t)},vX(J4n,"MaxSTPhase",1446),wAn(1447,1,{},kg),MWn.Je=function(n){return IC(this.a,n)},vX(J4n,"MaxSTPhase/lambda$0$Type",1447),wAn(1445,1,lVn,jg),MWn.td=function(n){R$(this.a,BB(n,65))},vX(J4n,"MinSTPhase/lambda$0$Type",1445),wAn(785,1,E3n,ru),MWn.Yf=function(n){return BB(n,300),new B2},MWn.pf=function(n,t){WTn(this,BB(n,300),t)},MWn.a=!1,vX(Z4n,"GrowTreePhase",785),wAn(786,1,lVn,EB),MWn.td=function(n){eun(this.a,this.b,this.c,BB(n,221))},vX(Z4n,"GrowTreePhase/lambda$0$Type",786),wAn(1448,1,E3n,cu),MWn.Yf=function(n){return BB(n,300),new B2},MWn.pf=function(n,t){tmn(this,BB(n,300),t)},vX(Z4n,"ShrinkTreeCompactionPhase",1448),wAn(784,1,lVn,TB),MWn.td=function(n){lAn(this.a,this.b,this.c,BB(n,221))},vX(Z4n,"ShrinkTreeCompactionPhase/lambda$0$Type",784);var JTt,ZTt,nMt=bq(y3n,"IGraphElementVisitor");wAn(860,1,{527:1},R0),MWn.og=function(n){var t;qan(t=hRn(this,n),BB(RX(this.b,n),94)),yLn(this,n,t)},vX(xJn,"LayoutConfigurator",860);var tMt,eMt,iMt,rMt=bq(xJn,"LayoutConfigurator/IPropertyHolderOptionFilter");wAn(932,1,{1933:1},au),MWn.pg=function(n,t){return Nun(),!n.Xe(t)},vX(xJn,"LayoutConfigurator/lambda$0$Type",932),wAn(933,1,{1933:1},uu),MWn.pg=function(n,t){return SE(n,t)},vX(xJn,"LayoutConfigurator/lambda$1$Type",933),wAn(931,1,{831:1},ou),MWn.qg=function(n,t){return Nun(),!n.Xe(t)},vX(xJn,"LayoutConfigurator/lambda$2$Type",931),wAn(934,1,DVn,LC),MWn.Mb=function(n){return YW(this.a,this.b,BB(n,1933))},vX(xJn,"LayoutConfigurator/lambda$3$Type",934),wAn(858,1,{},su),vX(xJn,"RecursiveGraphLayoutEngine",858),wAn(296,60,BVn,kv,rk),vX(xJn,"UnsupportedConfigurationException",296),wAn(453,60,BVn,ck),vX(xJn,"UnsupportedGraphException",453),wAn(754,1,{}),vX(y3n,"AbstractRandomListAccessor",754),wAn(500,754,{},CNn),MWn.rg=function(){return null},MWn.d=!0,MWn.e=!0,MWn.f=0,vX(t5n,"AlgorithmAssembler",500),wAn(1236,1,DVn,hu),MWn.Mb=function(n){return!!BB(n,123)},vX(t5n,"AlgorithmAssembler/lambda$0$Type",1236),wAn(1237,1,{},Eg),MWn.Kb=function(n){return bj(this.a,BB(n,123))},vX(t5n,"AlgorithmAssembler/lambda$1$Type",1237),wAn(1238,1,DVn,fu),MWn.Mb=function(n){return!!BB(n,80)},vX(t5n,"AlgorithmAssembler/lambda$2$Type",1238),wAn(1239,1,lVn,Tg),MWn.td=function(n){Jcn(this.a,BB(n,80))},vX(t5n,"AlgorithmAssembler/lambda$3$Type",1239),wAn(1240,1,lVn,NC),MWn.td=function(n){Dx(this.a,this.b,BB(n,234))},vX(t5n,"AlgorithmAssembler/lambda$4$Type",1240),wAn(1355,1,MYn,lu),MWn.ue=function(n,t){return FQ(BB(n,234),BB(t,234))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(t5n,"EnumBasedFactoryComparator",1355),wAn(80,754,{80:1},B2),MWn.rg=function(){return new Rv},MWn.a=0,vX(t5n,"LayoutProcessorConfiguration",80),wAn(1013,1,{527:1},$f),MWn.og=function(n){nan(eMt,new Mg(n))},vX(zYn,"DeprecatedLayoutOptionReplacer",1013),wAn(1014,1,lVn,bu),MWn.td=function(n){N9(BB(n,160))},vX(zYn,"DeprecatedLayoutOptionReplacer/lambda$0$Type",1014),wAn(1015,1,lVn,wu),MWn.td=function(n){Twn(BB(n,160))},vX(zYn,"DeprecatedLayoutOptionReplacer/lambda$1$Type",1015),wAn(1016,1,{},Mg),MWn.Od=function(n,t){Rx(this.a,BB(n,146),BB(t,38))},vX(zYn,"DeprecatedLayoutOptionReplacer/lambda$2$Type",1016),wAn(149,1,{686:1,149:1},MTn),MWn.Fb=function(n){return j5(this,n)},MWn.sg=function(){return this.b},MWn.tg=function(){return this.c},MWn.ne=function(){return this.e},MWn.Hb=function(){return vvn(this.c)},MWn.Ib=function(){return"Layout Algorithm: "+this.c};var cMt,aMt=vX(zYn,"LayoutAlgorithmData",149);wAn(263,1,{},du),vX(zYn,"LayoutAlgorithmData/Builder",263),wAn(1017,1,{527:1},gu),MWn.og=function(n){cL(n,239)&&!qy(TD(n.We((sWn(),zSt))))&&KFn(BB(n,33))},vX(zYn,"LayoutAlgorithmResolver",1017),wAn(229,1,{686:1,229:1},UZ),MWn.Fb=function(n){return!!cL(n,229)&&mK(this.b,BB(n,229).b)},MWn.sg=function(){return this.a},MWn.tg=function(){return this.b},MWn.ne=function(){return this.d},MWn.Hb=function(){return vvn(this.b)},MWn.Ib=function(){return"Layout Type: "+this.b},vX(zYn,"LayoutCategoryData",229),wAn(344,1,{},pu),vX(zYn,"LayoutCategoryData/Builder",344),wAn(867,1,{},ORn),vX(zYn,"LayoutMetaDataService",867),wAn(868,1,{},UX),vX(zYn,"LayoutMetaDataService/Registry",868),wAn(478,1,{478:1},vu),vX(zYn,"LayoutMetaDataService/Registry/Triple",478),wAn(869,1,e5n,mu),MWn.ug=function(){return new Gj},vX(zYn,"LayoutMetaDataService/lambda$0$Type",869),wAn(870,1,i5n,yu),MWn.vg=function(n){return B$(BB(n,8))},vX(zYn,"LayoutMetaDataService/lambda$1$Type",870),wAn(879,1,e5n,ku),MWn.ug=function(){return new Np},vX(zYn,"LayoutMetaDataService/lambda$10$Type",879),wAn(880,1,i5n,ju),MWn.vg=function(n){return new t_(BB(n,12))},vX(zYn,"LayoutMetaDataService/lambda$11$Type",880),wAn(881,1,e5n,Eu),MWn.ug=function(){return new YT},vX(zYn,"LayoutMetaDataService/lambda$12$Type",881),wAn(882,1,i5n,Tu),MWn.vg=function(n){return zB(BB(n,68))},vX(zYn,"LayoutMetaDataService/lambda$13$Type",882),wAn(883,1,e5n,Mu),MWn.ug=function(){return new Rv},vX(zYn,"LayoutMetaDataService/lambda$14$Type",883),wAn(884,1,i5n,Su),MWn.vg=function(n){return JQ(BB(n,53))},vX(zYn,"LayoutMetaDataService/lambda$15$Type",884),wAn(885,1,e5n,Pu),MWn.ug=function(){return new fA},vX(zYn,"LayoutMetaDataService/lambda$16$Type",885),wAn(886,1,i5n,Cu),MWn.vg=function(n){return S4(BB(n,53))},vX(zYn,"LayoutMetaDataService/lambda$17$Type",886),wAn(887,1,e5n,Iu),MWn.ug=function(){return new zv},vX(zYn,"LayoutMetaDataService/lambda$18$Type",887),wAn(888,1,i5n,Ou),MWn.vg=function(n){return GB(BB(n,208))},vX(zYn,"LayoutMetaDataService/lambda$19$Type",888),wAn(871,1,e5n,Au),MWn.ug=function(){return new km},vX(zYn,"LayoutMetaDataService/lambda$2$Type",871),wAn(872,1,i5n,$u),MWn.vg=function(n){return new Kj(BB(n,74))},vX(zYn,"LayoutMetaDataService/lambda$3$Type",872),wAn(873,1,e5n,Lu),MWn.ug=function(){return new lm},vX(zYn,"LayoutMetaDataService/lambda$4$Type",873),wAn(874,1,i5n,Nu),MWn.vg=function(n){return new A_(BB(n,142))},vX(zYn,"LayoutMetaDataService/lambda$5$Type",874),wAn(875,1,e5n,Du),MWn.ug=function(){return new bm},vX(zYn,"LayoutMetaDataService/lambda$6$Type",875),wAn(876,1,i5n,Ru),MWn.vg=function(n){return new O_(BB(n,116))},vX(zYn,"LayoutMetaDataService/lambda$7$Type",876),wAn(877,1,e5n,Ku),MWn.ug=function(){return new Yu},vX(zYn,"LayoutMetaDataService/lambda$8$Type",877),wAn(878,1,i5n,_u),MWn.vg=function(n){return new rnn(BB(n,373))},vX(zYn,"LayoutMetaDataService/lambda$9$Type",878);var uMt,oMt,sMt,hMt,fMt,lMt=bq(IJn,"IProperty");wAn(23,1,{35:1,686:1,23:1,146:1},bPn),MWn.wd=function(n){return gL(this,BB(n,146))},MWn.Fb=function(n){return cL(n,23)?mK(this.f,BB(n,23).f):cL(n,146)&&mK(this.f,BB(n,146).tg())},MWn.wg=function(){var n;if(cL(this.b,4)){if(null==(n=Jdn(this.b)))throw Hp(new Fy(o5n+this.f+"'. Make sure it's type is registered with the "+(ED(bAt),bAt.k)+c5n));return n}return this.b},MWn.sg=function(){return this.d},MWn.tg=function(){return this.f},MWn.ne=function(){return this.i},MWn.Hb=function(){return vvn(this.f)},MWn.Ib=function(){return"Layout Option: "+this.f},vX(zYn,"LayoutOptionData",23),wAn(24,1,{},Fu),vX(zYn,"LayoutOptionData/Builder",24),wAn(175,22,{3:1,35:1,22:1,175:1},AC);var bMt,wMt,dMt,gMt,pMt,vMt,mMt,yMt,kMt,jMt=Ben(zYn,"LayoutOptionData/Target",175,Unt,O5,QF);wAn(277,22,{3:1,35:1,22:1,277:1},$C);var EMt,TMt,MMt,SMt=Ben(zYn,"LayoutOptionData/Type",277,Unt,_tn,YF);wAn(110,1,{110:1},bA,UV,gY),MWn.Fb=function(n){var t;return!(null==n||!cL(n,110))&&(t=BB(n,110),cV(this.c,t.c)&&cV(this.d,t.d)&&cV(this.b,t.b)&&cV(this.a,t.a))},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[this.c,this.d,this.b,this.a]))},MWn.Ib=function(){return"Rect[x="+this.c+",y="+this.d+",w="+this.b+",h="+this.a+"]"},MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,vX(f1n,"ElkRectangle",110),wAn(8,1,{3:1,4:1,8:1,414:1},Gj,XZ,xC,wA),MWn.Fb=function(n){return nrn(this,n)},MWn.Hb=function(){return VO(this.a)+byn(VO(this.b))},MWn.Jf=function(n){var t,e,i;for(e=0;e<n.length&&xhn((b1(e,n.length),n.charCodeAt(e)),o1n);)++e;for(t=n.length;t>0&&xhn((b1(t-1,n.length),n.charCodeAt(t-1)),s1n);)--t;if(e>=t)throw Hp(new _y("The given string does not contain any numbers."));if(2!=(i=kKn(n.substr(e,t-e),",|;|\r|\n")).length)throw Hp(new _y("Exactly two numbers are expected, "+i.length+" were found."));try{this.a=bSn(RMn(i[0])),this.b=bSn(RMn(i[1]))}catch(r){throw cL(r=lun(r),127)?Hp(new _y(h1n+r)):Hp(r)}},MWn.Ib=function(){return"("+this.a+","+this.b+")"},MWn.a=0,MWn.b=0;var PMt=vX(f1n,"KVector",8);wAn(74,68,{3:1,4:1,20:1,28:1,52:1,14:1,68:1,15:1,74:1,414:1},km,Kj,Ux),MWn.Pc=function(){return Vsn(this)},MWn.Jf=function(n){var t,e,i,r,c;e=kKn(n,",|;|\\(|\\)|\\[|\\]|\\{|\\}| |\t|\n"),yQ(this);try{for(t=0,r=0,i=0,c=0;t<e.length;)null!=e[t]&&RMn(e[t]).length>0&&(r%2==0?i=bSn(e[t]):c=bSn(e[t]),r>0&&r%2!=0&&DH(this,new xC(i,c)),++r),++t}catch(a){throw cL(a=lun(a),127)?Hp(new _y("The given string does not match the expected format for vectors."+a)):Hp(a)}},MWn.Ib=function(){var n,t,e;for(n=new lN("("),t=spn(this,0);t.b!=t.d.c;)oO(n,(e=BB(b3(t),8)).a+","+e.b),t.b!=t.d.c&&(n.a+="; ");return(n.a+=")",n).a};var CMt,IMt,OMt,AMt,$Mt,LMt,NMt=vX(f1n,"KVectorChain",74);wAn(248,22,{3:1,35:1,22:1,248:1},DC);var xMt,DMt,RMt,KMt,_Mt,FMt,BMt,HMt,qMt,GMt,zMt,UMt,XMt,WMt,VMt,QMt,YMt,JMt,ZMt,nSt=Ben(h5n,"Alignment",248,Unt,J8,JF);wAn(979,1,QYn,Lf),MWn.Qe=function(n){G_n(n)},vX(h5n,"BoxLayouterOptions",979),wAn(980,1,{},xu),MWn.$e=function(){return new Gu},MWn._e=function(n){},vX(h5n,"BoxLayouterOptions/BoxFactory",980),wAn(291,22,{3:1,35:1,22:1,291:1},RC);var tSt,eSt,iSt,rSt,cSt,aSt,uSt,oSt,sSt,hSt,fSt,lSt,bSt,wSt,dSt,gSt,pSt,vSt,mSt,ySt,kSt,jSt,ESt,TSt,MSt,SSt,PSt,CSt,ISt,OSt,ASt,$St,LSt,NSt,xSt,DSt,RSt,KSt,_St,FSt,BSt,HSt,qSt,GSt,zSt,USt,XSt,WSt,VSt,QSt,YSt,JSt,ZSt,nPt,tPt,ePt,iPt,rPt,cPt,aPt,uPt,oPt,sPt,hPt,fPt,lPt,bPt,wPt,dPt,gPt,pPt,vPt,mPt,yPt,kPt,jPt,EPt,TPt,MPt,SPt,PPt,CPt,IPt,OPt,APt,$Pt,LPt,NPt,xPt,DPt,RPt,KPt,_Pt,FPt,BPt,HPt,qPt=Ben(h5n,"ContentAlignment",291,Unt,Y8,ZF);wAn(684,1,QYn,Nf),MWn.Qe=function(n){Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,w5n),""),"Layout Algorithm"),"Select a specific layout algorithm."),(PPn(),yMt)),Qtt),nbn((rpn(),hMt))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,d5n),""),"Resolved Layout Algorithm"),"Meta data associated with the selected algorithm."),mMt),aMt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,W2n),""),"Alignment"),"Alignment of the selected node relative to other nodes; the exact meaning depends on the used algorithm."),rSt),gMt),nSt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,VJn),""),"Aspect Ratio"),"The desired aspect ratio of the drawing, that is the quotient of width by height."),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,g5n),""),"Bend Points"),"A fixed list of bend points for the edge. This is used by the 'Fixed Layout' algorithm to specify a pre-defined routing for an edge. The vector chain must include the source point, any bend points, and the target point, so it must have at least two points."),mMt),NMt),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,u3n),""),"Content Alignment"),"Specifies how the content of a node are aligned. Each node can individually control the alignment of its contents. I.e. if a node should be aligned top left in its parent node, the parent node should specify that option."),fSt),pMt),qPt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,X2n),""),"Debug Mode"),"Whether additional debug information shall be generated."),(hN(),!1)),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,J2n),""),TJn),"Overall direction of edges: horizontal (right / left) or vertical (down / up)."),wSt),gMt),WPt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,y2n),""),"Edge Routing"),"What kind of edge routing style should be applied for the content of a parent node. Algorithms may also set this option to single edges in order to mark them as splines. The bend point list of edges with this option set to SPLINES must be interpreted as control points for a piecewise cubic spline."),mSt),gMt),oCt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,A4n),""),"Expand Nodes"),"If active, nodes are expanded to fill the area of their parent."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,d2n),""),"Hierarchy Handling"),"Determines whether separate layout runs are triggered for different compound nodes in a hierarchical graph. Setting a node's hierarchy handling to `INCLUDE_CHILDREN` will lay out that node and all of its descendants in a single layout run, until a descendant is encountered which has its hierarchy handling set to `SEPARATE_CHILDREN`. In general, `SEPARATE_CHILDREN` will ensure that a new layout run is triggered for a node with that setting. Including multiple levels of hierarchy in a single layout run may allow cross-hierarchical edges to be laid out properly. If the root node is set to `INHERIT` (or not set at all), the default behavior is `SEPARATE_CHILDREN`."),TSt),gMt),SCt),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[sMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,QJn),""),"Padding"),"The padding to be left to a parent element's border when placing child elements. This can also serve as an output option of a layout algorithm if node size calculation is setup appropriately."),WSt),mMt),_ut),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[sMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,jZn),""),"Interactive"),"Whether the algorithm should be run in interactive mode for the content of a parent node. What this means exactly depends on how the specific algorithm interprets this option. Usually in the interactive mode algorithms try to modify the current layout as little as possible."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,m3n),""),"interactive Layout"),"Whether the graph should be changeable interactively and by setting constraints"),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,MZn),""),"Omit Node Micro Layout"),"Node micro layout comprises the computation of node dimensions (if requested), the placement of ports and their labels, and the placement of node labels. The functionality is implemented independent of any specific layout algorithm and shouldn't have any negative impact on the layout algorithm's performance itself. Yet, if any unforeseen behavior occurs, this option allows to deactivate the micro layout."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,EZn),""),"Port Constraints"),"Defines constraints of the position of the ports of a node."),oPt),gMt),aIt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,g3n),""),"Position"),"The position of a node, port, or label. This is used by the 'Fixed Layout' algorithm to specify a pre-defined position."),mMt),PMt),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[fMt,oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,pZn),""),"Priority"),"Defines the priority of an object; its meaning depends on the specific layout algorithm and the context where it is used."),vMt),Att),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[uMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,yZn),""),"Randomization Seed"),"Seed used for pseudo-random number generators to control the layout algorithm. If the value is 0, the seed shall be determined pseudo-randomly (e.g. from the system time)."),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,kZn),""),"Separate Connected Components"),"Whether each connected component should be processed separately."),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,o3n),""),"Junction Points"),"This option is not used as option, but as output of the layout algorithms. It is attached to edges and determines the points where junction symbols should be drawn in order to represent hyperedges with orthogonal routing. Whether such points are computed depends on the chosen layout algorithm and edge routing style. The points are put into the vector chain with no specific order."),ASt),mMt),NMt),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,f3n),""),"Comment Box"),"Whether the node should be regarded as a comment box instead of a regular node. In that case its placement should be similar to how labels are handled. Any edges incident to a comment box specify to which graph elements the comment is related."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,l3n),""),"Hypernode"),"Whether the node should be handled as a hypernode."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,p5n),""),"Label Manager"),"Label managers can shorten labels upon a layout algorithm's request."),mMt),KNt),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,p3n),""),"Margins"),"Margins define additional space around the actual bounds of a graph element. For instance, ports or labels being placed on the outside of a node's border might introduce such a margin. The margin is used to guarantee non-overlap of other graph elements with those ports or labels."),LSt),mMt),Eut),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,z2n),""),"No Layout"),"No layout is done for the associated element. This is used to mark parts of a diagram to avoid their inclusion in the layout graph, or to mark parts of the layout graph to prevent layout engines from processing them. If you wish to exclude the contents of a compound node from automatic layout, while the node itself is still considered on its own layer, use the 'Fixed Layout' algorithm for that node."),!1),wMt),ktt),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[uMt,fMt,oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,v5n),""),"Scale Factor"),"The scaling factor to be applied to the corresponding node in recursive layout. It causes the corresponding node's size to be adjusted, and its ports and labels to be sized and placed accordingly after the layout of that node has been determined (and before the node itself and its siblings are arranged). The scaling is not reverted afterwards, so the resulting layout graph contains the adjusted size and position data. This option is currently not supported if 'Layout Hierarchy' is set."),1),dMt),Ptt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,m5n),""),"Animate"),"Whether the shift from the old layout to the new computed layout shall be animated."),!0),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,y5n),""),"Animation Time Factor"),"Factor for computation of animation time. The higher the value, the longer the animation time. If the value is 0, the resulting time is always equal to the minimum defined by 'Minimal Animation Time'."),iln(100)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,k5n),""),"Layout Ancestors"),"Whether the hierarchy levels on the path from the selected element to the root of the diagram shall be included in the layout process."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,j5n),""),"Maximal Animation Time"),"The maximal time for animations, in milliseconds."),iln(4e3)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,E5n),""),"Minimal Animation Time"),"The minimal time for animations, in milliseconds."),iln(400)),vMt),Att),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,T5n),""),"Progress Bar"),"Whether a progress bar shall be displayed during layout computations."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,M5n),""),"Validate Graph"),"Whether the graph shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,S5n),""),"Validate Options"),"Whether layout options shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user."),!0),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,P5n),""),"Zoom to Fit"),"Whether the zoom level shall be set to view the whole diagram after layout."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,b5n),"box"),"Box Layout Mode"),"Configures the packing mode used by the {@link BoxLayoutProvider}. If SIMPLE is not required (neither priorities are used nor the interactive mode), GROUP_DEC can improve the packing and decrease the area. GROUP_MIXED and GROUP_INC may, in very specific scenarios, work better."),oSt),gMt),cOt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,L2n),k2n),"Comment Comment Spacing"),"Spacing to be preserved between a comment box and other comment boxes connected to the same node. The space left between comment boxes of different nodes is controlled by the node-node spacing."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,N2n),k2n),"Comment Node Spacing"),"Spacing to be preserved between a node and its connected comment boxes. The space left between a node and the comments of another node is controlled by the node-node spacing."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,XJn),k2n),"Components Spacing"),"Spacing to be preserved between pairs of connected components. This option is only relevant if 'separateConnectedComponents' is activated."),20),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,x2n),k2n),"Edge Spacing"),"Spacing to be preserved between any two edges. Note that while this can somewhat easily be satisfied for the segments of orthogonally drawn edges, it is harder for general polylines or splines."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,mZn),k2n),"Edge Label Spacing"),"The minimal distance to be preserved between a label and the edge it is associated with. Note that the placement of a label is influenced by the 'edgelabels.placement' option."),2),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,D2n),k2n),"Edge Node Spacing"),"Spacing to be preserved between nodes and edges."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,R2n),k2n),"Label Spacing"),"Determines the amount of space to be left between two labels of the same graph element."),0),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,F2n),k2n),"Label Node Spacing"),"Spacing to be preserved between labels and the border of node they are associated with. Note that the placement of a label is influenced by the 'nodelabels.placement' option."),5),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,K2n),k2n),"Horizontal spacing between Label and Port"),"Horizontal spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,_2n),k2n),"Vertical spacing between Label and Port"),"Vertical spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,vZn),k2n),"Node Spacing"),"The minimal distance to be preserved between each two nodes."),20),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,B2n),k2n),"Node Self Loop Spacing"),"Spacing to be preserved between a node and its self loops."),10),dMt),Ptt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,H2n),k2n),"Port Spacing"),"Spacing between pairs of ports of the same node."),10),dMt),Ptt),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[sMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,q2n),k2n),"Individual Spacing"),"Allows to specify individual spacing values for graph elements that shall be different from the value specified for the element's parent."),mMt),hOt),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[uMt,fMt,oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,v3n),k2n),"Additional Port Space"),"Additional space around the sets of ports on each node side. For each side of a node, this option can reserve additional space before and after the ports on each side. For example, a top spacing of 20 makes sure that the first port on the western and eastern side is 20 units away from the northern border."),DPt),mMt),Eut),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,d3n),A5n),"Layout Partition"),"Partition to which the node belongs. This requires Layout Partitioning to be active. Nodes with lower partition IDs will appear to the left of nodes with higher partition IDs (assuming a left-to-right layout direction)."),vMt),Att),EG(hMt,Pun(Gk(jMt,1),$Vn,175,0,[sMt]))))),a2(n,d3n,w3n,JSt),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,w3n),A5n),"Layout Partitioning"),"Whether to activate partitioned layout. This will allow to group nodes through the Layout Partition option. a pair of nodes with different partition indices is then placed such that the node with lower index is placed to the left of the other node (with left-to-right layout direction). Depending on the layout algorithm, this may only be guaranteed to work if all nodes have a layout partition configured, or at least if edges that cross partitions are not part of a partition-crossing cycle."),QSt),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Z2n),$5n),"Node Label Padding"),"Define padding for node labels that are placed inside of a node."),xSt),mMt),_ut),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,CZn),$5n),"Node Label Placement"),"Hints for where node labels are to be placed; if empty, the node label's position is not modified."),RSt),pMt),GCt),EG(sMt,Pun(Gk(jMt,1),$Vn,175,0,[oMt]))))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,e3n),L5n),"Port Alignment"),"Defines the default port distribution for a node. May be overridden for each side individually."),nPt),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,i3n),L5n),"Port Alignment (North)"),"Defines how ports on the northern side are placed, overriding the node's general port alignment."),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,r3n),L5n),"Port Alignment (South)"),"Defines how ports on the southern side are placed, overriding the node's general port alignment."),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,c3n),L5n),"Port Alignment (West)"),"Defines how ports on the western side are placed, overriding the node's general port alignment."),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,a3n),L5n),"Port Alignment (East)"),"Defines how ports on the eastern side are placed, overriding the node's general port alignment."),gMt),JCt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,PZn),N5n),"Node Size Constraints"),"What should be taken into account when calculating a node's size. Empty size constraints specify that a node's size is already fixed and should not be changed."),_St),pMt),YIt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,SZn),N5n),"Node Size Options"),"Options modifying the behavior of the size constraints set on a node. Each member of the set specifies something that should be taken into account when calculating node sizes. The empty set corresponds to no further modifications."),GSt),pMt),iOt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,BZn),N5n),"Node Size Minimum"),"The minimal size to which a node can be reduced."),HSt),mMt),PMt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Y2n),N5n),"Fixed Graph Size"),"By default, the fixed layout provider will enlarge a graph until it is large enough to contain its children. If this option is set, it won't do so."),!1),wMt),ktt),nbn(hMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,s3n),A2n),"Edge Label Placement"),"Gives a hint on where to put edge labels."),pSt),gMt),nCt),nbn(oMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,TZn),A2n),"Inline Edge Labels"),"If true, an edge label is placed directly on its edge. May only apply to center edge labels. This kind of label placement is only advisable if the label's rendering is such that it is not crossed by its edge and thus stays legible."),!1),wMt),ktt),nbn(oMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,C5n),"font"),"Font Name"),"Font name used for a label."),yMt),Qtt),nbn(oMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,I5n),"font"),"Font Size"),"Font size used for a label."),vMt),Att),nbn(oMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,b3n),x5n),"Port Anchor Offset"),"The offset to the port position where connections shall be attached."),mMt),PMt),nbn(fMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,h3n),x5n),"Port Index"),"The index of a port in the fixed order around a node. The order is assumed as clockwise, starting with the leftmost port on the top side. This option must be set if 'Port Constraints' is set to FIXED_ORDER and no specific positions are given for the ports. Additionally, the option 'Port Side' must be defined in this case."),vMt),Att),nbn(fMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,U2n),x5n),"Port Side"),"The side of a node on which a port is situated. This option must be set if 'Port Constraints' is set to FIXED_SIDE or FIXED_ORDER and no specific positions are given for the ports."),dPt),gMt),FIt),nbn(fMt)))),Abn(n,new bPn(Oj(Ij(Aj(Ej(Cj(Mj(Sj(new Fu,G2n),x5n),"Port Border Offset"),"The offset of ports on the node border. With a positive offset the port is moved outside of the node, while with a negative offset the port is moved towards the inside. An offset of 0 means that the port is placed directly on the node border, i.e. if the port side is north, the port's south border touches the nodes's north border; if the port side is east, the port's west border touches the nodes's east border; if the port side is south, the port's north border touches the node's south border; if the port side is west, the port's east border touches the node's west border."),dMt),Ptt),nbn(fMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,IZn),D5n),"Port Label Placement"),"Decides on a placement method for port labels; if empty, the node label's position is not modified."),lPt),pMt),IIt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,n3n),D5n),"Port Labels Next to Port"),"Use 'portLabels.placement': NEXT_TO_PORT_OF_POSSIBLE."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,t3n),D5n),"Treat Port Labels as Group"),"If this option is true (default), the labels of a port will be treated as a group when it comes to centering them next to their port. If this option is false, only the first label will be centered next to the port, with the others being placed below. This only applies to labels of eastern and western ports and will have no effect if labels are not placed next to their port."),!0),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,V2n),R5n),"Activate Inside Self Loops"),"Whether this node allows to route self loops inside of it instead of around it. If set to true, this will make the node a compound node if it isn't already, and will require the layout algorithm to support compound nodes with hierarchical ports."),!1),wMt),ktt),nbn(sMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,Q2n),R5n),"Inside Self Loop"),"Whether a self loop should be routed inside a node instead of around that node."),!1),wMt),ktt),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,WJn),"edge"),"Edge Thickness"),"The thickness of an edge. This is a hint on the line width used to draw an edge, possibly requiring more space to be reserved for it."),1),dMt),Ptt),nbn(uMt)))),Abn(n,new bPn(Oj(Ij(Aj(Tj(Ej(Cj(Mj(Sj(new Fu,O5n),"edge"),"Edge Type"),"The type of an edge. This is usually used for UML class diagrams, where associations must be handled differently from generalizations."),kSt),gMt),yCt),nbn(uMt)))),xM(n,new UZ(yj(jj(kj(new pu,w1n),"Layered"),'The layer-based method was introduced by Sugiyama, Tagawa and Toda in 1981. It emphasizes the direction of edges by pointing as many edges as possible into the same direction. The nodes are arranged in layers, which are sometimes called "hierarchies", and then reordered such that the number of edge crossings is minimized. Afterwards, concrete coordinates are computed for the nodes and edge bend points.'))),xM(n,new UZ(yj(jj(kj(new pu,"org.eclipse.elk.orthogonal"),"Orthogonal"),'Orthogonal methods that follow the "topology-shape-metrics" approach by Batini, Nardelli and Tamassia \'86. The first phase determines the topology of the drawing by applying a planarization technique, which results in a planar representation of the graph. The orthogonal shape is computed in the second phase, which aims at minimizing the number of edge bends, and is called orthogonalization. The third phase leads to concrete coordinates for nodes and edge bend points by applying a compaction method, thus defining the metrics.'))),xM(n,new UZ(yj(jj(kj(new pu,gZn),"Force"),"Layout algorithms that follow physical analogies by simulating a system of attractive and repulsive forces. The first successful method of this kind was proposed by Eades in 1984."))),xM(n,new UZ(yj(jj(kj(new pu,"org.eclipse.elk.circle"),"Circle"),"Circular layout algorithms emphasize cycles or biconnected components of a graph by arranging them in circles. This is useful if a drawing is desired where such components are clearly grouped, or where cycles are shown as prominent OPTIONS of the graph."))),xM(n,new UZ(yj(jj(kj(new pu,Y3n),"Tree"),"Specialized layout methods for trees, i.e. acyclic graphs. The regular structure of graphs that have no undirected cycles can be emphasized using an algorithm of this type."))),xM(n,new UZ(yj(jj(kj(new pu,"org.eclipse.elk.planar"),"Planar"),"Algorithms that require a planar or upward planar graph. Most of these algorithms are theoretically interesting, but not practically usable."))),xM(n,new UZ(yj(jj(kj(new pu,w4n),"Radial"),"Radial layout algorithms usually position the nodes of the graph on concentric circles."))),bKn((new xf,n)),G_n((new Lf,n)),RDn((new Df,n))},vX(h5n,"CoreOptions",684),wAn(103,22,{3:1,35:1,22:1,103:1},KC);var GPt,zPt,UPt,XPt,WPt=Ben(h5n,TJn,103,Unt,C5,eB);wAn(272,22,{3:1,35:1,22:1,272:1},_C);var VPt,QPt,YPt,JPt,ZPt,nCt=Ben(h5n,"EdgeLabelPlacement",272,Unt,q1,iB);wAn(218,22,{3:1,35:1,22:1,218:1},FC);var tCt,eCt,iCt,rCt,cCt,aCt,uCt,oCt=Ben(h5n,"EdgeRouting",218,Unt,S3,rB);wAn(312,22,{3:1,35:1,22:1,312:1},BC);var sCt,hCt,fCt,lCt,bCt,wCt,dCt,gCt,pCt,vCt,mCt,yCt=Ben(h5n,"EdgeType",312,Unt,a9,cB);wAn(977,1,QYn,xf),MWn.Qe=function(n){bKn(n)},vX(h5n,"FixedLayouterOptions",977),wAn(978,1,{},Vu),MWn.$e=function(){return new Hu},MWn._e=function(n){},vX(h5n,"FixedLayouterOptions/FixedFactory",978),wAn(334,22,{3:1,35:1,22:1,334:1},HC);var kCt,jCt,ECt,TCt,MCt,SCt=Ben(h5n,"HierarchyHandling",334,Unt,H1,aB);wAn(285,22,{3:1,35:1,22:1,285:1},qC);var PCt,CCt,ICt,OCt,ACt,$Ct,LCt,NCt,xCt,DCt,RCt=Ben(h5n,"LabelSide",285,Unt,M3,uB);wAn(93,22,{3:1,35:1,22:1,93:1},GC);var KCt,_Ct,FCt,BCt,HCt,qCt,GCt=Ben(h5n,"NodeLabelPlacement",93,Unt,ken,oB);wAn(249,22,{3:1,35:1,22:1,249:1},zC);var zCt,UCt,XCt,WCt,VCt,QCt,YCt,JCt=Ben(h5n,"PortAlignment",249,Unt,I5,sB);wAn(98,22,{3:1,35:1,22:1,98:1},UC);var ZCt,nIt,tIt,eIt,iIt,rIt,cIt,aIt=Ben(h5n,"PortConstraints",98,Unt,S8,hB);wAn(273,22,{3:1,35:1,22:1,273:1},XC);var uIt,oIt,sIt,hIt,fIt,lIt,bIt,wIt,dIt,gIt,pIt,vIt,mIt,yIt,kIt,jIt,EIt,TIt,MIt,SIt,PIt,CIt,IIt=Ben(h5n,"PortLabelPlacement",273,Unt,c9,fB);wAn(61,22,{3:1,35:1,22:1,61:1},WC);var OIt,AIt,$It,LIt,NIt,xIt,DIt,RIt,KIt,_It,FIt=Ben(h5n,"PortSide",61,Unt,h5,wB);wAn(981,1,QYn,Df),MWn.Qe=function(n){RDn(n)},vX(h5n,"RandomLayouterOptions",981),wAn(982,1,{},Qu),MWn.$e=function(){return new no},MWn._e=function(n){},vX(h5n,"RandomLayouterOptions/RandomFactory",982),wAn(374,22,{3:1,35:1,22:1,374:1},VC);var BIt,HIt,qIt,GIt,zIt,UIt,XIt,WIt,VIt,QIt,YIt=Ben(h5n,"SizeConstraint",374,Unt,T3,lB);wAn(259,22,{3:1,35:1,22:1,259:1},QC);var JIt,ZIt,nOt,tOt,eOt,iOt=Ben(h5n,"SizeOptions",259,Unt,Ein,bB);wAn(370,1,{1949:1},Xm),MWn.b=!1,MWn.c=0,MWn.d=-1,MWn.e=null,MWn.f=null,MWn.g=-1,MWn.j=!1,MWn.k=!1,MWn.n=!1,MWn.o=0,MWn.q=0,MWn.r=0,vX(y3n,"BasicProgressMonitor",370),wAn(972,209,NJn,Gu),MWn.Ze=function(n,t){var e,i,r,c,a,u,o,s,h;OTn(t,"Box layout",2),r=zy(MD(ZAn(n,(SMn(),XMt)))),c=BB(ZAn(n,GMt),116),e=qy(TD(ZAn(n,_Mt))),i=qy(TD(ZAn(n,FMt))),0===BB(ZAn(n,RMt),311).g?(u=new t_((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a)),SQ(),m$(u,new Sg(i)),a=u,o=XPn(n),(null==(s=MD(ZAn(n,DMt)))||(kW(s),s<=0))&&(s=1.3),KUn(n,(h=HUn(a,r,c,o.a,o.b,e,(kW(s),s))).a,h.b,!1,!0)):kqn(n,r,c,e),HSn(t)},vX(y3n,"BoxLayoutProvider",972),wAn(973,1,MYn,Sg),MWn.ue=function(n,t){return hNn(this,BB(n,33),BB(t,33))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},MWn.a=!1,vX(y3n,"BoxLayoutProvider/1",973),wAn(157,1,{157:1},Gtn,zx),MWn.Ib=function(){return this.c?zRn(this.c):LMn(this.b)},vX(y3n,"BoxLayoutProvider/Group",157),wAn(311,22,{3:1,35:1,22:1,311:1},YC);var rOt,cOt=Ben(y3n,"BoxLayoutProvider/PackingMode",311,Unt,P3,dB);wAn(974,1,MYn,zu),MWn.ue=function(n,t){return DQ(BB(n,157),BB(t,157))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(y3n,"BoxLayoutProvider/lambda$0$Type",974),wAn(975,1,MYn,Uu),MWn.ue=function(n,t){return cQ(BB(n,157),BB(t,157))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(y3n,"BoxLayoutProvider/lambda$1$Type",975),wAn(976,1,MYn,Xu),MWn.ue=function(n,t){return aQ(BB(n,157),BB(t,157))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(y3n,"BoxLayoutProvider/lambda$2$Type",976),wAn(1365,1,{831:1},Wu),MWn.qg=function(n,t){return AM(),!cL(t,160)||SE((Nun(),BB(n,160)),t)},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$0$Type",1365),wAn(1366,1,lVn,Pg),MWn.td=function(n){Jsn(this.a,BB(n,146))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$1$Type",1366),wAn(1367,1,lVn,qu),MWn.td=function(n){BB(n,94),AM()},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$2$Type",1367),wAn(1371,1,lVn,Cg),MWn.td=function(n){Orn(this.a,BB(n,94))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$3$Type",1371),wAn(1369,1,DVn,JC),MWn.Mb=function(n){return Von(this.a,this.b,BB(n,146))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$4$Type",1369),wAn(1368,1,DVn,ZC),MWn.Mb=function(n){return $x(this.a,this.b,BB(n,831))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$5$Type",1368),wAn(1370,1,lVn,nI),MWn.td=function(n){Fz(this.a,this.b,BB(n,146))},vX(y3n,"ElkSpacings/AbstractSpacingsBuilder/lambda$6$Type",1370),wAn(935,1,{},Bu),MWn.Kb=function(n){return yA(n)},MWn.Fb=function(n){return this===n},vX(y3n,"ElkUtil/lambda$0$Type",935),wAn(936,1,lVn,tI),MWn.td=function(n){rOn(this.a,this.b,BB(n,79))},MWn.a=0,MWn.b=0,vX(y3n,"ElkUtil/lambda$1$Type",936),wAn(937,1,lVn,eI),MWn.td=function(n){Ey(this.a,this.b,BB(n,202))},MWn.a=0,MWn.b=0,vX(y3n,"ElkUtil/lambda$2$Type",937),wAn(938,1,lVn,iI),MWn.td=function(n){t$(this.a,this.b,BB(n,137))},MWn.a=0,MWn.b=0,vX(y3n,"ElkUtil/lambda$3$Type",938),wAn(939,1,lVn,Ig),MWn.td=function(n){cq(this.a,BB(n,469))},vX(y3n,"ElkUtil/lambda$4$Type",939),wAn(342,1,{35:1,342:1},$p),MWn.wd=function(n){return vL(this,BB(n,236))},MWn.Fb=function(n){var t;return!!cL(n,342)&&(t=BB(n,342),this.a==t.a)},MWn.Hb=function(){return CJ(this.a)},MWn.Ib=function(){return this.a+" (exclusive)"},MWn.a=0,vX(y3n,"ExclusiveBounds/ExclusiveLowerBound",342),wAn(1138,209,NJn,Hu),MWn.Ze=function(n,t){var i,r,c,a,u,o,s,f,l,b,w,d,g,p,v,m,y,k,j,E,T;for(OTn(t,"Fixed Layout",1),a=BB(ZAn(n,(sWn(),vSt)),218),b=0,w=0,v=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));v.e!=v.i.gc();){for(g=BB(kpn(v),33),(T=BB(ZAn(g,(Xsn(),gCt)),8))&&(SA(g,T.a,T.b),BB(ZAn(g,fCt),174).Hc((mdn(),DIt))&&(d=BB(ZAn(g,bCt),8)).a>0&&d.b>0&&KUn(g,d.a,d.b,!0,!0)),b=e.Math.max(b,g.i+g.g),w=e.Math.max(w,g.j+g.f),f=new AL((!g.n&&(g.n=new eU(zOt,g,1,7)),g.n));f.e!=f.i.gc();)o=BB(kpn(f),137),(T=BB(ZAn(o,gCt),8))&&SA(o,T.a,T.b),b=e.Math.max(b,g.i+o.i+o.g),w=e.Math.max(w,g.j+o.j+o.f);for(k=new AL((!g.c&&(g.c=new eU(XOt,g,9,9)),g.c));k.e!=k.i.gc();)for(y=BB(kpn(k),118),(T=BB(ZAn(y,gCt),8))&&SA(y,T.a,T.b),j=g.i+y.i,E=g.j+y.j,b=e.Math.max(b,j+y.g),w=e.Math.max(w,E+y.f),s=new AL((!y.n&&(y.n=new eU(zOt,y,1,7)),y.n));s.e!=s.i.gc();)o=BB(kpn(s),137),(T=BB(ZAn(o,gCt),8))&&SA(o,T.a,T.b),b=e.Math.max(b,j+o.i+o.g),w=e.Math.max(w,E+o.j+o.f);for(c=new oz(ZL(dLn(g).a.Kc(),new h));dAn(c);)l=_Un(i=BB(U5(c),79)),b=e.Math.max(b,l.a),w=e.Math.max(w,l.b);for(r=new oz(ZL(wLn(g).a.Kc(),new h));dAn(r);)JJ(PMn(i=BB(U5(r),79)))!=n&&(l=_Un(i),b=e.Math.max(b,l.a),w=e.Math.max(w,l.b))}if(a==(Mbn(),QPt))for(p=new AL((!n.a&&(n.a=new eU(UOt,n,10,11)),n.a));p.e!=p.i.gc();)for(r=new oz(ZL(dLn(g=BB(kpn(p),33)).a.Kc(),new h));dAn(r);)0==(u=rFn(i=BB(U5(r),79))).b?Ypn(i,OSt,null):Ypn(i,OSt,u);qy(TD(ZAn(n,(Xsn(),lCt))))||KUn(n,b+(m=BB(ZAn(n,wCt),116)).b+m.c,w+m.d+m.a,!0,!0),HSn(t)},vX(y3n,"FixedLayoutProvider",1138),wAn(373,134,{3:1,414:1,373:1,94:1,134:1},Yu,rnn),MWn.Jf=function(n){var t,e,i,r,c,a,u;if(n)try{for(a=kKn(n,";,;"),r=0,c=(i=a).length;r<c;++r){if(t=kKn(i[r],"\\:"),!(e=pGn(cin(),t[0])))throw Hp(new _y("Invalid option id: "+t[0]));if(null==(u=Zqn(e,t[1])))throw Hp(new _y("Invalid option value: "+t[1]));null==u?(!this.q&&(this.q=new xp),v6(this.q,e)):(!this.q&&(this.q=new xp),VW(this.q,e,u))}}catch(o){throw cL(o=lun(o),102)?Hp(new Fsn(o)):Hp(o)}},MWn.Ib=function(){return SD(P4($V((this.q?this.q:(SQ(),SQ(),het)).vc().Oc(),new Ju),x7(new YB,new Z,new W,new V,Pun(Gk(nit,1),$Vn,132,0,[]))))};var aOt,uOt,oOt,sOt,hOt=vX(y3n,"IndividualSpacings",373);wAn(971,1,{},Ju),MWn.Kb=function(n){return RQ(BB(n,42))},vX(y3n,"IndividualSpacings/lambda$0$Type",971),wAn(709,1,{},sG),MWn.c=0,vX(y3n,"InstancePool",709),wAn(1275,1,{},Zu),vX(y3n,"LoggedGraph",1275),wAn(396,22,{3:1,35:1,22:1,396:1},cI);var fOt,lOt,bOt,wOt=Ben(y3n,"LoggedGraph/Type",396,Unt,C3,gB);wAn(46,1,{20:1,46:1},rI),MWn.Jc=function(n){e5(this,n)},MWn.Fb=function(n){var t,e,i;return!!cL(n,46)&&(e=BB(n,46),t=null==this.a?null==e.a:Nfn(this.a,e.a),i=null==this.b?null==e.b:Nfn(this.b,e.b),t&&i)},MWn.Hb=function(){var n,t,e;return n=-65536&(t=null==this.a?0:nsn(this.a)),t&QVn^(-65536&(e=null==this.b?0:nsn(this.b)))>>16&QVn|n^(e&QVn)<<16},MWn.Kc=function(){return new Og(this)},MWn.Ib=function(){return null==this.a&&null==this.b?"pair(null,null)":null==this.a?"pair(null,"+Bbn(this.b)+")":null==this.b?"pair("+Bbn(this.a)+",null)":"pair("+Bbn(this.a)+","+Bbn(this.b)+")"},vX(y3n,"Pair",46),wAn(983,1,QWn,Og),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return!this.c&&(!this.b&&null!=this.a.a||null!=this.a.b)},MWn.Pb=function(){if(!this.c&&!this.b&&null!=this.a.a)return this.b=!0,this.a.a;if(!this.c&&null!=this.a.b)return this.c=!0,this.a.b;throw Hp(new yv)},MWn.Qb=function(){throw this.c&&null!=this.a.b?this.a.b=null:this.b&&null!=this.a.a&&(this.a.a=null),Hp(new dv)},MWn.b=!1,MWn.c=!1,vX(y3n,"Pair/1",983),wAn(448,1,{448:1},VV),MWn.Fb=function(n){return cV(this.a,BB(n,448).a)&&cV(this.c,BB(n,448).c)&&cV(this.d,BB(n,448).d)&&cV(this.b,BB(n,448).b)},MWn.Hb=function(){return fhn(Pun(Gk(Ant,1),HWn,1,5,[this.a,this.c,this.d,this.b]))},MWn.Ib=function(){return"("+this.a+FWn+this.c+FWn+this.d+FWn+this.b+")"},vX(y3n,"Quadruple",448),wAn(1126,209,NJn,no),MWn.Ze=function(n,t){var e;OTn(t,"Random Layout",1),0!=(!n.a&&(n.a=new eU(UOt,n,10,11)),n.a).i?(iUn(n,(e=BB(ZAn(n,(vdn(),NIt)),19))&&0!=e.a?new C4(e.a):new sbn,zy(MD(ZAn(n,AIt))),zy(MD(ZAn(n,xIt))),BB(ZAn(n,$It),116)),HSn(t)):HSn(t)},vX(y3n,"RandomLayoutProvider",1126),wAn(553,1,{}),MWn.qf=function(){return new xC(this.f.i,this.f.j)},MWn.We=function(n){return EY(n,(sWn(),aPt))?ZAn(this.f,bOt):ZAn(this.f,n)},MWn.rf=function(){return new xC(this.f.g,this.f.f)},MWn.sf=function(){return this.g},MWn.Xe=function(n){return P8(this.f,n)},MWn.tf=function(n){Pen(this.f,n.a),Cen(this.f,n.b)},MWn.uf=function(n){Sen(this.f,n.a),Men(this.f,n.b)},MWn.vf=function(n){this.g=n},MWn.g=0,vX(H5n,"ElkGraphAdapters/AbstractElkGraphElementAdapter",553),wAn(554,1,{839:1},Ag),MWn.wf=function(){var n,t;if(!this.b)for(this.b=C2(mV(this.a).i),t=new AL(mV(this.a));t.e!=t.i.gc();)n=BB(kpn(t),137),WB(this.b,new Ry(n));return this.b},MWn.b=null,vX(H5n,"ElkGraphAdapters/ElkEdgeAdapter",554),wAn(301,553,{},Dy),MWn.xf=function(){return eyn(this)},MWn.a=null,vX(H5n,"ElkGraphAdapters/ElkGraphAdapter",301),wAn(630,553,{181:1},Ry),vX(H5n,"ElkGraphAdapters/ElkLabelAdapter",630),wAn(629,553,{680:1},JN),MWn.wf=function(){return nyn(this)},MWn.Af=function(){var n;return!(n=BB(ZAn(this.f,(sWn(),$St)),142))&&(n=new lm),n},MWn.Cf=function(){return tyn(this)},MWn.Ef=function(n){var t;t=new A_(n),Ypn(this.f,(sWn(),$St),t)},MWn.Ff=function(n){Ypn(this.f,(sWn(),XSt),new O_(n))},MWn.yf=function(){return this.d},MWn.zf=function(){var n,t;if(!this.a)for(this.a=new Np,t=new oz(ZL(wLn(BB(this.f,33)).a.Kc(),new h));dAn(t);)n=BB(U5(t),79),WB(this.a,new Ag(n));return this.a},MWn.Bf=function(){var n,t;if(!this.c)for(this.c=new Np,t=new oz(ZL(dLn(BB(this.f,33)).a.Kc(),new h));dAn(t);)n=BB(U5(t),79),WB(this.c,new Ag(n));return this.c},MWn.Df=function(){return 0!=YQ(BB(this.f,33)).i||qy(TD(BB(this.f,33).We((sWn(),SSt))))},MWn.Gf=function(){_7(this,(GM(),lOt))},MWn.a=null,MWn.b=null,MWn.c=null,MWn.d=null,MWn.e=null,vX(H5n,"ElkGraphAdapters/ElkNodeAdapter",629),wAn(1266,553,{838:1},op),MWn.wf=function(){return kyn(this)},MWn.zf=function(){var n,t;if(!this.a)for(this.a=sx(BB(this.f,118).xg().i),t=new AL(BB(this.f,118).xg());t.e!=t.i.gc();)n=BB(kpn(t),79),WB(this.a,new Ag(n));return this.a},MWn.Bf=function(){var n,t;if(!this.c)for(this.c=sx(BB(this.f,118).yg().i),t=new AL(BB(this.f,118).yg());t.e!=t.i.gc();)n=BB(kpn(t),79),WB(this.c,new Ag(n));return this.c},MWn.Hf=function(){return BB(BB(this.f,118).We((sWn(),wPt)),61)},MWn.If=function(){var n,t,e,i,r,c,a;for(i=WJ(BB(this.f,118)),e=new AL(BB(this.f,118).yg());e.e!=e.i.gc();)for(a=new AL((!(n=BB(kpn(e),79)).c&&(n.c=new hK(KOt,n,5,8)),n.c));a.e!=a.i.gc();){if(Ctn(PTn(c=BB(kpn(a),82)),i))return!0;if(PTn(c)==i&&qy(TD(ZAn(n,(sWn(),PSt)))))return!0}for(t=new AL(BB(this.f,118).xg());t.e!=t.i.gc();)for(r=new AL((!(n=BB(kpn(t),79)).b&&(n.b=new hK(KOt,n,4,7)),n.b));r.e!=r.i.gc();)if(Ctn(PTn(BB(kpn(r),82)),i))return!0;return!1},MWn.a=null,MWn.b=null,MWn.c=null,vX(H5n,"ElkGraphAdapters/ElkPortAdapter",1266),wAn(1267,1,MYn,to),MWn.ue=function(n,t){return GRn(BB(n,118),BB(t,118))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(H5n,"ElkGraphAdapters/PortComparator",1267);var dOt,gOt,pOt,vOt,mOt,yOt,kOt,jOt,EOt,TOt,MOt,SOt,POt,COt,IOt,OOt,AOt,$Ot,LOt=bq(q5n,"EObject"),NOt=bq(G5n,z5n),xOt=bq(G5n,U5n),DOt=bq(G5n,X5n),ROt=bq(G5n,"ElkShape"),KOt=bq(G5n,W5n),_Ot=bq(G5n,V5n),FOt=bq(G5n,Q5n),BOt=bq(q5n,Y5n),HOt=bq(q5n,"EFactory"),qOt=bq(q5n,J5n),GOt=bq(q5n,"EPackage"),zOt=bq(G5n,Z5n),UOt=bq(G5n,n6n),XOt=bq(G5n,t6n);wAn(90,1,e6n),MWn.Jg=function(){return this.Kg(),null},MWn.Kg=function(){return null},MWn.Lg=function(){return this.Kg(),!1},MWn.Mg=function(){return!1},MWn.Ng=function(n){ban(this,n)},vX(i6n,"BasicNotifierImpl",90),wAn(97,90,f6n),MWn.nh=function(){return mA(this)},MWn.Og=function(n,t){return n},MWn.Pg=function(){throw Hp(new pv)},MWn.Qg=function(n){var t;return t=Cvn(BB(itn(this.Tg(),this.Vg()),18)),this.eh().ih(this,t.n,t.f,n)},MWn.Rg=function(n,t){throw Hp(new pv)},MWn.Sg=function(n,t,e){return T_n(this,n,t,e)},MWn.Tg=function(){var n;return this.Pg()&&(n=this.Pg().ck())?n:this.zh()},MWn.Ug=function(){return cAn(this)},MWn.Vg=function(){throw Hp(new pv)},MWn.Wg=function(){var n,t;return!(t=this.ph().dk())&&this.Pg().ik((QM(),t=null==(n=lJ(qFn(this.Tg())))?N$t:new QN(this,n))),t},MWn.Xg=function(n,t){return n},MWn.Yg=function(n){return n.Gj()?n.aj():Awn(this.Tg(),n)},MWn.Zg=function(){var n;return(n=this.Pg())?n.fk():null},MWn.$g=function(){return this.Pg()?this.Pg().ck():null},MWn._g=function(n,t,e){return Zpn(this,n,t,e)},MWn.ah=function(n){return S9(this,n)},MWn.bh=function(n,t){return V5(this,n,t)},MWn.dh=function(){var n;return!!(n=this.Pg())&&n.gk()},MWn.eh=function(){throw Hp(new pv)},MWn.fh=function(){return Ydn(this)},MWn.gh=function(n,t,e,i){return Npn(this,n,t,i)},MWn.hh=function(n,t,e){return BB(itn(this.Tg(),t),66).Nj().Qj(this,this.yh(),t-this.Ah(),n,e)},MWn.ih=function(n,t,e,i){return oJ(this,n,t,i)},MWn.jh=function(n,t,e){return BB(itn(this.Tg(),t),66).Nj().Rj(this,this.yh(),t-this.Ah(),n,e)},MWn.kh=function(){return!!this.Pg()&&!!this.Pg().ek()},MWn.lh=function(n){return vpn(this,n)},MWn.mh=function(n){return ZJ(this,n)},MWn.oh=function(n){return _qn(this,n)},MWn.ph=function(){throw Hp(new pv)},MWn.qh=function(){return this.Pg()?this.Pg().ek():null},MWn.rh=function(){return Ydn(this)},MWn.sh=function(n,t){yCn(this,n,t)},MWn.th=function(n){this.ph().hk(n)},MWn.uh=function(n){this.ph().kk(n)},MWn.vh=function(n){this.ph().jk(n)},MWn.wh=function(n,t){var e,i,r,c;return(c=this.Zg())&&n&&(t=_pn(c.Vk(),this,t),c.Zk(this)),(i=this.eh())&&(0!=(gKn(this,this.eh(),this.Vg()).Bb&BQn)?(r=i.fh())&&(n?!c&&r.Zk(this):r.Yk(this)):(t=(e=this.Vg())>=0?this.Qg(t):this.eh().ih(this,-1-e,null,t),t=this.Sg(null,-1,t))),this.uh(n),t},MWn.xh=function(n){var t,e,i,r,c,a,u;if((c=Awn(e=this.Tg(),n))>=(t=this.Ah()))return BB(n,66).Nj().Uj(this,this.yh(),c-t);if(c<=-1){if(!(a=Fqn((IPn(),Z$t),e,n)))throw Hp(new _y(r6n+n.ne()+u6n));if(ZM(),BB(a,66).Oj()||(a=Z1(B7(Z$t,a))),r=BB((i=this.Yg(a))>=0?this._g(i,!0,!0):cOn(this,a,!0),153),(u=a.Zj())>1||-1==u)return BB(BB(r,215).hl(n,!1),76)}else if(n.$j())return BB((i=this.Yg(n))>=0?this._g(i,!1,!0):cOn(this,n,!1),76);return new II(this,n)},MWn.yh=function(){return Q7(this)},MWn.zh=function(){return(QX(),t$t).S},MWn.Ah=function(){return bX(this.zh())},MWn.Bh=function(n){mPn(this,n)},MWn.Ib=function(){return P$n(this)},vX(l6n,"BasicEObjectImpl",97),wAn(114,97,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1}),MWn.Ch=function(n){return Y7(this)[n]},MWn.Dh=function(n,t){$X(Y7(this),n,t)},MWn.Eh=function(n){$X(Y7(this),n,null)},MWn.Jg=function(){return BB(yan(this,4),126)},MWn.Kg=function(){throw Hp(new pv)},MWn.Lg=function(){return 0!=(4&this.Db)},MWn.Pg=function(){throw Hp(new pv)},MWn.Fh=function(n){hgn(this,2,n)},MWn.Rg=function(n,t){this.Db=t<<16|255&this.Db,this.Fh(n)},MWn.Tg=function(){return jY(this)},MWn.Vg=function(){return this.Db>>16},MWn.Wg=function(){var n;return QM(),null==(n=lJ(qFn(BB(yan(this,16),26)||this.zh())))?N$t:new QN(this,n)},MWn.Mg=function(){return 0==(1&this.Db)},MWn.Zg=function(){return BB(yan(this,128),1935)},MWn.$g=function(){return BB(yan(this,16),26)},MWn.dh=function(){return 0!=(32&this.Db)},MWn.eh=function(){return BB(yan(this,2),49)},MWn.kh=function(){return 0!=(64&this.Db)},MWn.ph=function(){throw Hp(new pv)},MWn.qh=function(){return BB(yan(this,64),281)},MWn.th=function(n){hgn(this,16,n)},MWn.uh=function(n){hgn(this,128,n)},MWn.vh=function(n){hgn(this,64,n)},MWn.yh=function(){return fgn(this)},MWn.Db=0,vX(l6n,"MinimalEObjectImpl",114),wAn(115,114,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn.Fh=function(n){this.Cb=n},MWn.eh=function(){return this.Cb},vX(l6n,"MinimalEObjectImpl/Container",115),wAn(1985,115,{105:1,413:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn._g=function(n,t,e){return Eyn(this,n,t,e)},MWn.jh=function(n,t,e){return eSn(this,n,t,e)},MWn.lh=function(n){return m0(this,n)},MWn.sh=function(n,t){rsn(this,n,t)},MWn.zh=function(){return CXn(),POt},MWn.Bh=function(n){zun(this,n)},MWn.Ve=function(){return lpn(this)},MWn.We=function(n){return ZAn(this,n)},MWn.Xe=function(n){return P8(this,n)},MWn.Ye=function(n,t){return Ypn(this,n,t)},vX(b6n,"EMapPropertyHolderImpl",1985),wAn(567,115,{105:1,469:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},ro),MWn._g=function(n,t,e){switch(n){case 0:return this.a;case 1:return this.b}return Zpn(this,n,t,e)},MWn.lh=function(n){switch(n){case 0:return 0!=this.a;case 1:return 0!=this.b}return vpn(this,n)},MWn.sh=function(n,t){switch(n){case 0:return void jen(this,Gy(MD(t)));case 1:return void Een(this,Gy(MD(t)))}yCn(this,n,t)},MWn.zh=function(){return CXn(),pOt},MWn.Bh=function(n){switch(n){case 0:return void jen(this,0);case 1:return void Een(this,0)}mPn(this,n)},MWn.Ib=function(){var n;return 0!=(64&this.Db)?P$n(this):((n=new fN(P$n(this))).a+=" (x: ",vE(n,this.a),n.a+=", y: ",vE(n,this.b),n.a+=")",n.a)},MWn.a=0,MWn.b=0,vX(b6n,"ElkBendPointImpl",567),wAn(723,1985,{105:1,413:1,160:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn._g=function(n,t,e){return _fn(this,n,t,e)},MWn.hh=function(n,t,e){return FTn(this,n,t,e)},MWn.jh=function(n,t,e){return run(this,n,t,e)},MWn.lh=function(n){return Ean(this,n)},MWn.sh=function(n,t){Gjn(this,n,t)},MWn.zh=function(){return CXn(),kOt},MWn.Bh=function(n){ofn(this,n)},MWn.zg=function(){return this.k},MWn.Ag=function(){return mV(this)},MWn.Ib=function(){return Yln(this)},MWn.k=null,vX(b6n,"ElkGraphElementImpl",723),wAn(724,723,{105:1,413:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn._g=function(n,t,e){return Rbn(this,n,t,e)},MWn.lh=function(n){return fwn(this,n)},MWn.sh=function(n,t){zjn(this,n,t)},MWn.zh=function(){return CXn(),SOt},MWn.Bh=function(n){Dwn(this,n)},MWn.Bg=function(){return this.f},MWn.Cg=function(){return this.g},MWn.Dg=function(){return this.i},MWn.Eg=function(){return this.j},MWn.Fg=function(n,t){MA(this,n,t)},MWn.Gg=function(n,t){SA(this,n,t)},MWn.Hg=function(n){Pen(this,n)},MWn.Ig=function(n){Cen(this,n)},MWn.Ib=function(){return mSn(this)},MWn.f=0,MWn.g=0,MWn.i=0,MWn.j=0,vX(b6n,"ElkShapeImpl",724),wAn(725,724,{105:1,413:1,82:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),MWn._g=function(n,t,e){return Hvn(this,n,t,e)},MWn.hh=function(n,t,e){return djn(this,n,t,e)},MWn.jh=function(n,t,e){return gjn(this,n,t,e)},MWn.lh=function(n){return Gon(this,n)},MWn.sh=function(n,t){LAn(this,n,t)},MWn.zh=function(){return CXn(),vOt},MWn.Bh=function(n){xpn(this,n)},MWn.xg=function(){return!this.d&&(this.d=new hK(_Ot,this,8,5)),this.d},MWn.yg=function(){return!this.e&&(this.e=new hK(_Ot,this,7,4)),this.e},vX(b6n,"ElkConnectableShapeImpl",725),wAn(352,723,{105:1,413:1,79:1,160:1,352:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},io),MWn.Qg=function(n){return Mkn(this,n)},MWn._g=function(n,t,e){switch(n){case 3:return XJ(this);case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),this.b;case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),this.c;case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),this.a;case 7:return hN(),!this.b&&(this.b=new hK(KOt,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new hK(KOt,this,5,8)),this.c.i<=1));case 8:return hN(),!!nAn(this);case 9:return hN(),!!QIn(this);case 10:return hN(),!this.b&&(this.b=new hK(KOt,this,4,7)),0!=this.b.i&&(!this.c&&(this.c=new hK(KOt,this,5,8)),0!=this.c.i)}return _fn(this,n,t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 3:return this.Cb&&(e=(i=this.Db>>16)>=0?Mkn(this,e):this.Cb.ih(this,-1-i,null,e)),VD(this,BB(n,33),e);case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),Ywn(this.b,n,e);case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),Ywn(this.c,n,e);case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),Ywn(this.a,n,e)}return FTn(this,n,t,e)},MWn.jh=function(n,t,e){switch(t){case 3:return VD(this,null,e);case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),_pn(this.b,n,e);case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),_pn(this.c,n,e);case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),_pn(this.a,n,e)}return run(this,n,t,e)},MWn.lh=function(n){switch(n){case 3:return!!XJ(this);case 4:return!!this.b&&0!=this.b.i;case 5:return!!this.c&&0!=this.c.i;case 6:return!!this.a&&0!=this.a.i;case 7:return!this.b&&(this.b=new hK(KOt,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new hK(KOt,this,5,8)),this.c.i<=1));case 8:return nAn(this);case 9:return QIn(this);case 10:return!this.b&&(this.b=new hK(KOt,this,4,7)),0!=this.b.i&&(!this.c&&(this.c=new hK(KOt,this,5,8)),0!=this.c.i)}return Ean(this,n)},MWn.sh=function(n,t){switch(n){case 3:return void HLn(this,BB(t,33));case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),sqn(this.b),!this.b&&(this.b=new hK(KOt,this,4,7)),void pX(this.b,BB(t,14));case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),sqn(this.c),!this.c&&(this.c=new hK(KOt,this,5,8)),void pX(this.c,BB(t,14));case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),sqn(this.a),!this.a&&(this.a=new eU(FOt,this,6,6)),void pX(this.a,BB(t,14))}Gjn(this,n,t)},MWn.zh=function(){return CXn(),mOt},MWn.Bh=function(n){switch(n){case 3:return void HLn(this,null);case 4:return!this.b&&(this.b=new hK(KOt,this,4,7)),void sqn(this.b);case 5:return!this.c&&(this.c=new hK(KOt,this,5,8)),void sqn(this.c);case 6:return!this.a&&(this.a=new eU(FOt,this,6,6)),void sqn(this.a)}ofn(this,n)},MWn.Ib=function(){return lHn(this)},vX(b6n,"ElkEdgeImpl",352),wAn(439,1985,{105:1,413:1,202:1,439:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},co),MWn.Qg=function(n){return skn(this,n)},MWn._g=function(n,t,e){switch(n){case 1:return this.j;case 2:return this.k;case 3:return this.b;case 4:return this.c;case 5:return!this.a&&(this.a=new $L(xOt,this,5)),this.a;case 6:return VJ(this);case 7:return t?Pvn(this):this.i;case 8:return t?Svn(this):this.f;case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),this.g;case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),this.e;case 11:return this.d}return Eyn(this,n,t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 6:return this.Cb&&(e=(i=this.Db>>16)>=0?skn(this,e):this.Cb.ih(this,-1-i,null,e)),QD(this,BB(n,79),e);case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),Ywn(this.g,n,e);case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),Ywn(this.e,n,e)}return BB(itn(BB(yan(this,16),26)||(CXn(),yOt),t),66).Nj().Qj(this,fgn(this),t-bX((CXn(),yOt)),n,e)},MWn.jh=function(n,t,e){switch(t){case 5:return!this.a&&(this.a=new $L(xOt,this,5)),_pn(this.a,n,e);case 6:return QD(this,null,e);case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),_pn(this.g,n,e);case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),_pn(this.e,n,e)}return eSn(this,n,t,e)},MWn.lh=function(n){switch(n){case 1:return 0!=this.j;case 2:return 0!=this.k;case 3:return 0!=this.b;case 4:return 0!=this.c;case 5:return!!this.a&&0!=this.a.i;case 6:return!!VJ(this);case 7:return!!this.i;case 8:return!!this.f;case 9:return!!this.g&&0!=this.g.i;case 10:return!!this.e&&0!=this.e.i;case 11:return null!=this.d}return m0(this,n)},MWn.sh=function(n,t){switch(n){case 1:return void Ien(this,Gy(MD(t)));case 2:return void Aen(this,Gy(MD(t)));case 3:return void Ten(this,Gy(MD(t)));case 4:return void Oen(this,Gy(MD(t)));case 5:return!this.a&&(this.a=new $L(xOt,this,5)),sqn(this.a),!this.a&&(this.a=new $L(xOt,this,5)),void pX(this.a,BB(t,14));case 6:return void FLn(this,BB(t,79));case 7:return void Nin(this,BB(t,82));case 8:return void Lin(this,BB(t,82));case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),sqn(this.g),!this.g&&(this.g=new hK(FOt,this,9,10)),void pX(this.g,BB(t,14));case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),sqn(this.e),!this.e&&(this.e=new hK(FOt,this,10,9)),void pX(this.e,BB(t,14));case 11:return void crn(this,SD(t))}rsn(this,n,t)},MWn.zh=function(){return CXn(),yOt},MWn.Bh=function(n){switch(n){case 1:return void Ien(this,0);case 2:return void Aen(this,0);case 3:return void Ten(this,0);case 4:return void Oen(this,0);case 5:return!this.a&&(this.a=new $L(xOt,this,5)),void sqn(this.a);case 6:return void FLn(this,null);case 7:return void Nin(this,null);case 8:return void Lin(this,null);case 9:return!this.g&&(this.g=new hK(FOt,this,9,10)),void sqn(this.g);case 10:return!this.e&&(this.e=new hK(FOt,this,10,9)),void sqn(this.e);case 11:return void crn(this,null)}zun(this,n)},MWn.Ib=function(){return ROn(this)},MWn.b=0,MWn.c=0,MWn.d=null,MWn.j=0,MWn.k=0,vX(b6n,"ElkEdgeSectionImpl",439),wAn(150,115,{105:1,92:1,90:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1}),MWn._g=function(n,t,e){return 0==n?(!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab):U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.hh=function(n,t,e){return 0==t?(!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e)):BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Qj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.jh=function(n,t,e){return 0==t?(!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e)):BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Rj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){return 0==n?!!this.Ab&&0!=this.Ab.i:O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.oh=function(n){return hUn(this,n)},MWn.sh=function(n,t){if(0===n)return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.uh=function(n){hgn(this,128,n)},MWn.zh=function(){return gWn(),b$t},MWn.Bh=function(n){if(0===n)return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.Gh=function(){this.Bb|=1},MWn.Hh=function(n){return N_n(this,n)},MWn.Bb=0,vX(l6n,"EModelElementImpl",150),wAn(704,150,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},Rf),MWn.Ih=function(n,t){return qGn(this,n,t)},MWn.Jh=function(n){var t,e,i,r;if(this.a!=Utn(n)||0!=(256&n.Bb))throw Hp(new _y(m6n+n.zb+g6n));for(e=kY(n);0!=a4(e.a).i;){if(iyn(t=BB(eGn(e,0,cL(r=BB(Wtn(a4(e.a),0),87).c,88)?BB(r,26):(gWn(),d$t)),26)))return BB(i=Utn(t).Nh().Jh(t),49).th(n),i;e=kY(t)}return"java.util.Map$Entry"==(null!=n.D?n.D:n.B)?new fq(n):new jH(n)},MWn.Kh=function(n,t){return xXn(this,n,t)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.a}return U9(this,n-bX((gWn(),h$t)),itn(BB(yan(this,16),26)||h$t,n),t,e)},MWn.hh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 1:return this.a&&(e=BB(this.a,49).ih(this,4,GOt,e)),Jhn(this,BB(n,235),e)}return BB(itn(BB(yan(this,16),26)||(gWn(),h$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),h$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 1:return Jhn(this,null,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),h$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),h$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return!!this.a}return O3(this,n-bX((gWn(),h$t)),itn(BB(yan(this,16),26)||h$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void xMn(this,BB(t,235))}Lbn(this,n-bX((gWn(),h$t)),itn(BB(yan(this,16),26)||h$t,n),t)},MWn.zh=function(){return gWn(),h$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void xMn(this,null)}qfn(this,n-bX((gWn(),h$t)),itn(BB(yan(this,16),26)||h$t,n))},vX(l6n,"EFactoryImpl",704),wAn(k6n,704,{105:1,2014:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},ao),MWn.Ih=function(n,t){switch(n.yj()){case 12:return BB(t,146).tg();case 13:return Bbn(t);default:throw Hp(new _y(d6n+n.ne()+g6n))}},MWn.Jh=function(n){var t;switch(-1==n.G&&(n.G=(t=Utn(n))?uvn(t.Mh(),n):-1),n.G){case 4:return new uo;case 6:return new jm;case 7:return new Em;case 8:return new io;case 9:return new ro;case 10:return new co;case 11:return new so;default:throw Hp(new _y(m6n+n.zb+g6n))}},MWn.Kh=function(n,t){switch(n.yj()){case 13:case 12:return null;default:throw Hp(new _y(d6n+n.ne()+g6n))}},vX(b6n,"ElkGraphFactoryImpl",k6n),wAn(438,150,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1}),MWn.Wg=function(){var n;return null==(n=lJ(qFn(BB(yan(this,16),26)||this.zh())))?(QM(),QM(),N$t):new Wx(this,n)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.ne()}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void this.Lh(SD(t))}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),w$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void this.Lh(null)}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.ne=function(){return this.zb},MWn.Lh=function(n){Nrn(this,n)},MWn.Ib=function(){return kfn(this)},MWn.zb=null,vX(l6n,"ENamedElementImpl",438),wAn(179,438,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},vY),MWn.Qg=function(n){return wkn(this,n)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.yb;case 3:return this.xb;case 4:return this.sb;case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),this.rb;case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),this.vb;case 7:return t?this.Db>>16==7?BB(this.Cb,235):null:QJ(this)}return U9(this,n-bX((gWn(),v$t)),itn(BB(yan(this,16),26)||v$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 4:return this.sb&&(e=BB(this.sb,49).ih(this,1,HOt,e)),jfn(this,BB(n,471),e);case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),Ywn(this.rb,n,e);case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),Ywn(this.vb,n,e);case 7:return this.Cb&&(e=(i=this.Db>>16)>=0?wkn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,7,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),v$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),v$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 4:return jfn(this,null,e);case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),_pn(this.rb,n,e);case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),_pn(this.vb,n,e);case 7:return T_n(this,null,7,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),v$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),v$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.yb;case 3:return null!=this.xb;case 4:return!!this.sb;case 5:return!!this.rb&&0!=this.rb.i;case 6:return!!this.vb&&0!=this.vb.i;case 7:return!!QJ(this)}return O3(this,n-bX((gWn(),v$t)),itn(BB(yan(this,16),26)||v$t,n))},MWn.oh=function(n){return LNn(this,n)||hUn(this,n)},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void Nrn(this,SD(t));case 2:return void Drn(this,SD(t));case 3:return void xrn(this,SD(t));case 4:return void iSn(this,BB(t,471));case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),sqn(this.rb),!this.rb&&(this.rb=new Jz(this,HAt,this)),void pX(this.rb,BB(t,14));case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),sqn(this.vb),!this.vb&&(this.vb=new eK(GOt,this,6,7)),void pX(this.vb,BB(t,14))}Lbn(this,n-bX((gWn(),v$t)),itn(BB(yan(this,16),26)||v$t,n),t)},MWn.vh=function(n){var t,e;if(n&&this.rb)for(e=new AL(this.rb);e.e!=e.i.gc();)cL(t=kpn(e),351)&&(BB(t,351).w=null);hgn(this,64,n)},MWn.zh=function(){return gWn(),v$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Nrn(this,null);case 2:return void Drn(this,null);case 3:return void xrn(this,null);case 4:return void iSn(this,null);case 5:return!this.rb&&(this.rb=new Jz(this,HAt,this)),void sqn(this.rb);case 6:return!this.vb&&(this.vb=new eK(GOt,this,6,7)),void sqn(this.vb)}qfn(this,n-bX((gWn(),v$t)),itn(BB(yan(this,16),26)||v$t,n))},MWn.Gh=function(){Tyn(this)},MWn.Mh=function(){return!this.rb&&(this.rb=new Jz(this,HAt,this)),this.rb},MWn.Nh=function(){return this.sb},MWn.Oh=function(){return this.ub},MWn.Ph=function(){return this.xb},MWn.Qh=function(){return this.yb},MWn.Rh=function(n){this.ub=n},MWn.Ib=function(){var n;return 0!=(64&this.Db)?kfn(this):((n=new fN(kfn(this))).a+=" (nsURI: ",cO(n,this.yb),n.a+=", nsPrefix: ",cO(n,this.xb),n.a+=")",n.a)},MWn.xb=null,MWn.yb=null,vX(l6n,"EPackageImpl",179),wAn(555,179,{105:1,2016:1,555:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},sAn),MWn.q=!1,MWn.r=!1;var WOt=!1;vX(b6n,"ElkGraphPackageImpl",555),wAn(354,724,{105:1,413:1,160:1,137:1,470:1,354:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},uo),MWn.Qg=function(n){return hkn(this,n)},MWn._g=function(n,t,e){switch(n){case 7:return YJ(this);case 8:return this.a}return Rbn(this,n,t,e)},MWn.hh=function(n,t,e){var i;return 7===t?(this.Cb&&(e=(i=this.Db>>16)>=0?hkn(this,e):this.Cb.ih(this,-1-i,null,e)),VG(this,BB(n,160),e)):FTn(this,n,t,e)},MWn.jh=function(n,t,e){return 7==t?VG(this,null,e):run(this,n,t,e)},MWn.lh=function(n){switch(n){case 7:return!!YJ(this);case 8:return!mK("",this.a)}return fwn(this,n)},MWn.sh=function(n,t){switch(n){case 7:return void INn(this,BB(t,160));case 8:return void xin(this,SD(t))}zjn(this,n,t)},MWn.zh=function(){return CXn(),jOt},MWn.Bh=function(n){switch(n){case 7:return void INn(this,null);case 8:return void xin(this,"")}Dwn(this,n)},MWn.Ib=function(){return cPn(this)},MWn.a="",vX(b6n,"ElkLabelImpl",354),wAn(239,725,{105:1,413:1,82:1,160:1,33:1,470:1,239:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},jm),MWn.Qg=function(n){return Skn(this,n)},MWn._g=function(n,t,e){switch(n){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),this.c;case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),this.a;case 11:return JJ(this);case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),this.b;case 13:return hN(),!this.a&&(this.a=new eU(UOt,this,10,11)),this.a.i>0}return Hvn(this,n,t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),Ywn(this.c,n,e);case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),Ywn(this.a,n,e);case 11:return this.Cb&&(e=(i=this.Db>>16)>=0?Skn(this,e):this.Cb.ih(this,-1-i,null,e)),zR(this,BB(n,33),e);case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),Ywn(this.b,n,e)}return djn(this,n,t,e)},MWn.jh=function(n,t,e){switch(t){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),_pn(this.c,n,e);case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),_pn(this.a,n,e);case 11:return zR(this,null,e);case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),_pn(this.b,n,e)}return gjn(this,n,t,e)},MWn.lh=function(n){switch(n){case 9:return!!this.c&&0!=this.c.i;case 10:return!!this.a&&0!=this.a.i;case 11:return!!JJ(this);case 12:return!!this.b&&0!=this.b.i;case 13:return!this.a&&(this.a=new eU(UOt,this,10,11)),this.a.i>0}return Gon(this,n)},MWn.sh=function(n,t){switch(n){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),sqn(this.c),!this.c&&(this.c=new eU(XOt,this,9,9)),void pX(this.c,BB(t,14));case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),sqn(this.a),!this.a&&(this.a=new eU(UOt,this,10,11)),void pX(this.a,BB(t,14));case 11:return void nNn(this,BB(t,33));case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),sqn(this.b),!this.b&&(this.b=new eU(_Ot,this,12,3)),void pX(this.b,BB(t,14))}LAn(this,n,t)},MWn.zh=function(){return CXn(),EOt},MWn.Bh=function(n){switch(n){case 9:return!this.c&&(this.c=new eU(XOt,this,9,9)),void sqn(this.c);case 10:return!this.a&&(this.a=new eU(UOt,this,10,11)),void sqn(this.a);case 11:return void nNn(this,null);case 12:return!this.b&&(this.b=new eU(_Ot,this,12,3)),void sqn(this.b)}xpn(this,n)},MWn.Ib=function(){return zRn(this)},vX(b6n,"ElkNodeImpl",239),wAn(186,725,{105:1,413:1,82:1,160:1,118:1,470:1,186:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Em),MWn.Qg=function(n){return fkn(this,n)},MWn._g=function(n,t,e){return 9==n?WJ(this):Hvn(this,n,t,e)},MWn.hh=function(n,t,e){var i;return 9===t?(this.Cb&&(e=(i=this.Db>>16)>=0?fkn(this,e):this.Cb.ih(this,-1-i,null,e)),YD(this,BB(n,33),e)):djn(this,n,t,e)},MWn.jh=function(n,t,e){return 9==t?YD(this,null,e):gjn(this,n,t,e)},MWn.lh=function(n){return 9==n?!!WJ(this):Gon(this,n)},MWn.sh=function(n,t){9!==n?LAn(this,n,t):BLn(this,BB(t,33))},MWn.zh=function(){return CXn(),TOt},MWn.Bh=function(n){9!==n?xpn(this,n):BLn(this,null)},MWn.Ib=function(){return URn(this)},vX(b6n,"ElkPortImpl",186);var VOt=bq(B6n,"BasicEMap/Entry");wAn(1092,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,114:1,115:1},so),MWn.Fb=function(n){return this===n},MWn.cd=function(){return this.b},MWn.Hb=function(){return PN(this)},MWn.Uh=function(n){Din(this,BB(n,146))},MWn._g=function(n,t,e){switch(n){case 0:return this.b;case 1:return this.c}return Zpn(this,n,t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.b;case 1:return null!=this.c}return vpn(this,n)},MWn.sh=function(n,t){switch(n){case 0:return void Din(this,BB(t,146));case 1:return void _in(this,t)}yCn(this,n,t)},MWn.zh=function(){return CXn(),MOt},MWn.Bh=function(n){switch(n){case 0:return void Din(this,null);case 1:return void _in(this,null)}mPn(this,n)},MWn.Sh=function(){var n;return-1==this.a&&(n=this.b,this.a=n?nsn(n):0),this.a},MWn.dd=function(){return this.c},MWn.Th=function(n){this.a=n},MWn.ed=function(n){var t;return t=this.c,_in(this,n),t},MWn.Ib=function(){var n;return 0!=(64&this.Db)?P$n(this):(oO(oO(oO(n=new Ck,this.b?this.b.tg():zWn),e1n),kN(this.c)),n.a)},MWn.a=-1,MWn.c=null;var QOt,YOt,JOt,ZOt,nAt,tAt,eAt,iAt,rAt=vX(b6n,"ElkPropertyToValueMapEntryImpl",1092);wAn(984,1,{},lo),vX(G6n,"JsonAdapter",984),wAn(210,60,BVn,ek),vX(G6n,"JsonImportException",210),wAn(857,1,{},dkn),vX(G6n,"JsonImporter",857),wAn(891,1,{},aI),vX(G6n,"JsonImporter/lambda$0$Type",891),wAn(892,1,{},uI),vX(G6n,"JsonImporter/lambda$1$Type",892),wAn(900,1,{},$g),vX(G6n,"JsonImporter/lambda$10$Type",900),wAn(902,1,{},oI),vX(G6n,"JsonImporter/lambda$11$Type",902),wAn(903,1,{},sI),vX(G6n,"JsonImporter/lambda$12$Type",903),wAn(909,1,{},fQ),vX(G6n,"JsonImporter/lambda$13$Type",909),wAn(908,1,{},hQ),vX(G6n,"JsonImporter/lambda$14$Type",908),wAn(904,1,{},hI),vX(G6n,"JsonImporter/lambda$15$Type",904),wAn(905,1,{},fI),vX(G6n,"JsonImporter/lambda$16$Type",905),wAn(906,1,{},lI),vX(G6n,"JsonImporter/lambda$17$Type",906),wAn(907,1,{},bI),vX(G6n,"JsonImporter/lambda$18$Type",907),wAn(912,1,{},Lg),vX(G6n,"JsonImporter/lambda$19$Type",912),wAn(893,1,{},Ng),vX(G6n,"JsonImporter/lambda$2$Type",893),wAn(910,1,{},xg),vX(G6n,"JsonImporter/lambda$20$Type",910),wAn(911,1,{},Dg),vX(G6n,"JsonImporter/lambda$21$Type",911),wAn(915,1,{},Rg),vX(G6n,"JsonImporter/lambda$22$Type",915),wAn(913,1,{},Kg),vX(G6n,"JsonImporter/lambda$23$Type",913),wAn(914,1,{},_g),vX(G6n,"JsonImporter/lambda$24$Type",914),wAn(917,1,{},Fg),vX(G6n,"JsonImporter/lambda$25$Type",917),wAn(916,1,{},Bg),vX(G6n,"JsonImporter/lambda$26$Type",916),wAn(918,1,lVn,wI),MWn.td=function(n){E9(this.b,this.a,SD(n))},vX(G6n,"JsonImporter/lambda$27$Type",918),wAn(919,1,lVn,dI),MWn.td=function(n){T9(this.b,this.a,SD(n))},vX(G6n,"JsonImporter/lambda$28$Type",919),wAn(920,1,{},gI),vX(G6n,"JsonImporter/lambda$29$Type",920),wAn(896,1,{},Hg),vX(G6n,"JsonImporter/lambda$3$Type",896),wAn(921,1,{},pI),vX(G6n,"JsonImporter/lambda$30$Type",921),wAn(922,1,{},qg),vX(G6n,"JsonImporter/lambda$31$Type",922),wAn(923,1,{},Gg),vX(G6n,"JsonImporter/lambda$32$Type",923),wAn(924,1,{},zg),vX(G6n,"JsonImporter/lambda$33$Type",924),wAn(925,1,{},Ug),vX(G6n,"JsonImporter/lambda$34$Type",925),wAn(859,1,{},Xg),vX(G6n,"JsonImporter/lambda$35$Type",859),wAn(929,1,{},MB),vX(G6n,"JsonImporter/lambda$36$Type",929),wAn(926,1,lVn,Wg),MWn.td=function(n){Y4(this.a,BB(n,469))},vX(G6n,"JsonImporter/lambda$37$Type",926),wAn(927,1,lVn,SI),MWn.td=function(n){lO(this.a,this.b,BB(n,202))},vX(G6n,"JsonImporter/lambda$38$Type",927),wAn(928,1,lVn,PI),MWn.td=function(n){bO(this.a,this.b,BB(n,202))},vX(G6n,"JsonImporter/lambda$39$Type",928),wAn(894,1,{},Vg),vX(G6n,"JsonImporter/lambda$4$Type",894),wAn(930,1,lVn,Qg),MWn.td=function(n){J4(this.a,BB(n,8))},vX(G6n,"JsonImporter/lambda$40$Type",930),wAn(895,1,{},Yg),vX(G6n,"JsonImporter/lambda$5$Type",895),wAn(899,1,{},Jg),vX(G6n,"JsonImporter/lambda$6$Type",899),wAn(897,1,{},Zg),vX(G6n,"JsonImporter/lambda$7$Type",897),wAn(898,1,{},np),vX(G6n,"JsonImporter/lambda$8$Type",898),wAn(901,1,{},tp),vX(G6n,"JsonImporter/lambda$9$Type",901),wAn(948,1,lVn,ep),MWn.td=function(n){nW(this.a,new GX(SD(n)))},vX(G6n,"JsonMetaDataConverter/lambda$0$Type",948),wAn(949,1,lVn,ip),MWn.td=function(n){_X(this.a,BB(n,237))},vX(G6n,"JsonMetaDataConverter/lambda$1$Type",949),wAn(950,1,lVn,rp),MWn.td=function(n){t1(this.a,BB(n,149))},vX(G6n,"JsonMetaDataConverter/lambda$2$Type",950),wAn(951,1,lVn,cp),MWn.td=function(n){FX(this.a,BB(n,175))},vX(G6n,"JsonMetaDataConverter/lambda$3$Type",951),wAn(237,22,{3:1,35:1,22:1,237:1},MI);var cAt,aAt=Ben(IJn,"GraphFeature",237,Unt,Ktn,pB);wAn(13,1,{35:1,146:1},up,iR,$O,XA),MWn.wd=function(n){return pL(this,BB(n,146))},MWn.Fb=function(n){return EY(this,n)},MWn.wg=function(){return mpn(this)},MWn.tg=function(){return this.b},MWn.Hb=function(){return vvn(this.b)},MWn.Ib=function(){return this.b},vX(IJn,"Property",13),wAn(818,1,MYn,ap),MWn.ue=function(n,t){return _ln(this,BB(n,94),BB(t,94))},MWn.Fb=function(n){return this===n},MWn.ve=function(){return new nw(this)},vX(IJn,"PropertyHolderComparator",818),wAn(695,1,QWn,sp),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return A9(this)},MWn.Qb=function(){uE()},MWn.Ob=function(){return!!this.a},vX(c8n,"ElkGraphUtil/AncestorIterator",695);var uAt=bq(B6n,"EList");wAn(67,52,{20:1,28:1,52:1,14:1,15:1,67:1,58:1}),MWn.Vc=function(n,t){sln(this,n,t)},MWn.Fc=function(n){return f9(this,n)},MWn.Wc=function(n,t){return oon(this,n,t)},MWn.Gc=function(n){return pX(this,n)},MWn.Zh=function(){return new ax(this)},MWn.$h=function(){return new ux(this)},MWn._h=function(n){return sin(this,n)},MWn.ai=function(){return!0},MWn.bi=function(n,t){},MWn.ci=function(){},MWn.di=function(n,t){L8(this,n,t)},MWn.ei=function(n,t,e){},MWn.fi=function(n,t){},MWn.gi=function(n,t,e){},MWn.Fb=function(n){return QDn(this,n)},MWn.Hb=function(){return Mun(this)},MWn.hi=function(){return!1},MWn.Kc=function(){return new AL(this)},MWn.Yc=function(){return new cx(this)},MWn.Zc=function(n){var t;if(t=this.gc(),n<0||n>t)throw Hp(new tK(n,t));return new GU(this,n)},MWn.ji=function(n,t){this.ii(n,this.Xc(t))},MWn.Mc=function(n){return snn(this,n)},MWn.li=function(n,t){return t},MWn._c=function(n,t){return ovn(this,n,t)},MWn.Ib=function(){return Jbn(this)},MWn.ni=function(){return!0},MWn.oi=function(n,t){return xsn(this,t)},vX(B6n,"AbstractEList",67),wAn(63,67,h8n,go,gtn,jcn),MWn.Vh=function(n,t){return BTn(this,n,t)},MWn.Wh=function(n){return bmn(this,n)},MWn.Xh=function(n,t){Ifn(this,n,t)},MWn.Yh=function(n){c6(this,n)},MWn.pi=function(n){return F9(this,n)},MWn.$b=function(){a6(this)},MWn.Hc=function(n){return Sjn(this,n)},MWn.Xb=function(n){return Wtn(this,n)},MWn.qi=function(n){var t,e,i;++this.j,n>(e=null==this.g?0:this.g.length)&&(i=this.g,(t=e+(e/2|0)+4)<n&&(t=n),this.g=this.ri(t),null!=i&&aHn(i,0,this.g,0,this.i))},MWn.Xc=function(n){return Wyn(this,n)},MWn.dc=function(){return 0==this.i},MWn.ii=function(n,t){return YIn(this,n,t)},MWn.ri=function(n){return x8(Ant,HWn,1,n,5,1)},MWn.ki=function(n){return this.g[n]},MWn.$c=function(n){return Lyn(this,n)},MWn.mi=function(n,t){return onn(this,n,t)},MWn.gc=function(){return this.i},MWn.Pc=function(){return N3(this)},MWn.Qc=function(n){return Qwn(this,n)},MWn.i=0;var oAt=vX(B6n,"BasicEList",63),sAt=bq(B6n,"TreeIterator");wAn(694,63,f8n),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return null!=this.g||this.c?null==this.g||0!=this.i&&BB(this.g[this.i-1],47).Ob():tZ(this)},MWn.Pb=function(){return aLn(this)},MWn.Qb=function(){if(!this.e)throw Hp(new Fy("There is no valid object to remove."));this.e.Qb()},MWn.c=!1,vX(B6n,"AbstractTreeIterator",694),wAn(685,694,f8n,OA),MWn.si=function(n){var t;return cL(t=BB(n,56).Wg().Kc(),279)&&BB(t,279).Nk(new bo),t},vX(c8n,"ElkGraphUtil/PropertiesSkippingTreeIterator",685),wAn(952,1,{},bo),vX(c8n,"ElkGraphUtil/PropertiesSkippingTreeIterator/1",952);var hAt,fAt,lAt,bAt=vX(c8n,"ElkReflect",null);wAn(889,1,i5n,wo),MWn.vg=function(n){return hZ(),B6(BB(n,174))},vX(c8n,"ElkReflect/lambda$0$Type",889),bq(B6n,"ResourceLocator"),wAn(1051,1,{}),vX(B6n,"DelegatingResourceLocator",1051),wAn(1052,1051,{}),vX("org.eclipse.emf.common","EMFPlugin",1052);var wAt,dAt=bq(J8n,"Adapter"),gAt=bq(J8n,"Notification");wAn(1153,1,Z8n),MWn.ti=function(){return this.d},MWn.ui=function(n){},MWn.vi=function(n){this.d=n},MWn.wi=function(n){this.d==n&&(this.d=null)},MWn.d=null,vX(i6n,"AdapterImpl",1153),wAn(1995,67,n9n),MWn.Vh=function(n,t){return kwn(this,n,t)},MWn.Wh=function(n){var t,e,i;if(++this.j,n.dc())return!1;for(t=this.Vi(),i=n.Kc();i.Ob();)e=i.Pb(),this.Ii(this.oi(t,e)),++t;return!0},MWn.Xh=function(n,t){ZD(this,n,t)},MWn.Yh=function(n){eW(this,n)},MWn.Gi=function(){return this.Ji()},MWn.$b=function(){JD(this,this.Vi(),this.Wi())},MWn.Hc=function(n){return this.Li(n)},MWn.Ic=function(n){return this.Mi(n)},MWn.Hi=function(n,t){this.Si().jm()},MWn.Ii=function(n){this.Si().jm()},MWn.Ji=function(){return this.Si()},MWn.Ki=function(){this.Si().jm()},MWn.Li=function(n){return this.Si().jm()},MWn.Mi=function(n){return this.Si().jm()},MWn.Ni=function(n){return this.Si().jm()},MWn.Oi=function(n){return this.Si().jm()},MWn.Pi=function(){return this.Si().jm()},MWn.Qi=function(n){return this.Si().jm()},MWn.Ri=function(){return this.Si().jm()},MWn.Ti=function(n){return this.Si().jm()},MWn.Ui=function(n,t){return this.Si().jm()},MWn.Vi=function(){return this.Si().jm()},MWn.Wi=function(){return this.Si().jm()},MWn.Xi=function(n){return this.Si().jm()},MWn.Yi=function(){return this.Si().jm()},MWn.Fb=function(n){return this.Ni(n)},MWn.Xb=function(n){return this.li(n,this.Oi(n))},MWn.Hb=function(){return this.Pi()},MWn.Xc=function(n){return this.Qi(n)},MWn.dc=function(){return this.Ri()},MWn.ii=function(n,t){return AMn(this,n,t)},MWn.ki=function(n){return this.Oi(n)},MWn.$c=function(n){return wq(this,n)},MWn.Mc=function(n){var t;return(t=this.Xc(n))>=0&&(this.$c(t),!0)},MWn.mi=function(n,t){return this.Ui(n,this.oi(n,t))},MWn.gc=function(){return this.Vi()},MWn.Pc=function(){return this.Wi()},MWn.Qc=function(n){return this.Xi(n)},MWn.Ib=function(){return this.Yi()},vX(B6n,"DelegatingEList",1995),wAn(1996,1995,n9n),MWn.Vh=function(n,t){return uFn(this,n,t)},MWn.Wh=function(n){return this.Vh(this.Vi(),n)},MWn.Xh=function(n,t){eAn(this,n,t)},MWn.Yh=function(n){OOn(this,n)},MWn.ai=function(){return!this.bj()},MWn.$b=function(){vqn(this)},MWn.Zi=function(n,t,e,i,r){return new NY(this,n,t,e,i,r)},MWn.$i=function(n){ban(this.Ai(),n)},MWn._i=function(){return null},MWn.aj=function(){return-1},MWn.Ai=function(){return null},MWn.bj=function(){return!1},MWn.cj=function(n,t){return t},MWn.dj=function(n,t){return t},MWn.ej=function(){return!1},MWn.fj=function(){return!this.Ri()},MWn.ii=function(n,t){var e,i;return this.ej()?(i=this.fj(),e=AMn(this,n,t),this.$i(this.Zi(7,iln(t),e,n,i)),e):AMn(this,n,t)},MWn.$c=function(n){var t,e,i,r;return this.ej()?(e=null,i=this.fj(),t=this.Zi(4,r=wq(this,n),null,n,i),this.bj()&&r?(e=this.dj(r,e))?(e.Ei(t),e.Fi()):this.$i(t):e?(e.Ei(t),e.Fi()):this.$i(t),r):(r=wq(this,n),this.bj()&&r&&(e=this.dj(r,null))&&e.Fi(),r)},MWn.mi=function(n,t){return oFn(this,n,t)},vX(i6n,"DelegatingNotifyingListImpl",1996),wAn(143,1,t9n),MWn.Ei=function(n){return KEn(this,n)},MWn.Fi=function(){$7(this)},MWn.xi=function(){return this.d},MWn._i=function(){return null},MWn.gj=function(){return null},MWn.yi=function(n){return-1},MWn.zi=function(){return Rxn(this)},MWn.Ai=function(){return null},MWn.Bi=function(){return Kxn(this)},MWn.Ci=function(){return this.o<0?this.o<-2?-2-this.o-1:-1:this.o},MWn.hj=function(){return!1},MWn.Di=function(n){var t,e,i,r,c,a,u,o;switch(this.d){case 1:case 2:switch(n.xi()){case 1:case 2:if(GI(n.Ai())===GI(this.Ai())&&this.yi(null)==n.yi(null))return this.g=n.zi(),1==n.xi()&&(this.d=1),!0}case 4:if(4===n.xi()&&GI(n.Ai())===GI(this.Ai())&&this.yi(null)==n.yi(null))return a=tGn(this),c=this.o<0?this.o<-2?-2-this.o-1:-1:this.o,i=n.Ci(),this.d=6,o=new gtn(2),c<=i?(f9(o,this.n),f9(o,n.Bi()),this.g=Pun(Gk(ANt,1),hQn,25,15,[this.o=c,i+1])):(f9(o,n.Bi()),f9(o,this.n),this.g=Pun(Gk(ANt,1),hQn,25,15,[this.o=i,c])),this.n=o,a||(this.o=-2-this.o-1),!0;break;case 6:if(4===n.xi()&&GI(n.Ai())===GI(this.Ai())&&this.yi(null)==n.yi(null)){for(a=tGn(this),i=n.Ci(),u=BB(this.g,48),e=x8(ANt,hQn,25,u.length+1,15,1),t=0;t<u.length&&(r=u[t])<=i;)e[t++]=r,++i;for(BB(this.n,15).Vc(t,n.Bi()),e[t]=i;++t<e.length;)e[t]=u[t-1];return this.g=e,a||(this.o=-2-e[0]),!0}}return!1},MWn.Ib=function(){var n,t,e;switch((e=new fN(nE(this.gm)+"@"+(nsn(this)>>>0).toString(16))).a+=" (eventType: ",this.d){case 1:e.a+="SET";break;case 2:e.a+="UNSET";break;case 3:e.a+="ADD";break;case 5:e.a+="ADD_MANY";break;case 4:e.a+="REMOVE";break;case 6:e.a+="REMOVE_MANY";break;case 7:e.a+="MOVE";break;case 8:e.a+="REMOVING_ADAPTER";break;case 9:e.a+="RESOLVE";break;default:mE(e,this.d)}if(lKn(this)&&(e.a+=", touch: true"),e.a+=", position: ",mE(e,this.o<0?this.o<-2?-2-this.o-1:-1:this.o),e.a+=", notifier: ",rO(e,this.Ai()),e.a+=", feature: ",rO(e,this._i()),e.a+=", oldValue: ",rO(e,Kxn(this)),e.a+=", newValue: ",6==this.d&&cL(this.g,48)){for(t=BB(this.g,48),e.a+="[",n=0;n<t.length;)e.a+=t[n],++n<t.length&&(e.a+=FWn);e.a+="]"}else rO(e,Rxn(this));return e.a+=", isTouch: ",yE(e,lKn(this)),e.a+=", wasSet: ",yE(e,tGn(this)),e.a+=")",e.a},MWn.d=0,MWn.e=0,MWn.f=0,MWn.j=0,MWn.k=0,MWn.o=0,MWn.p=0,vX(i6n,"NotificationImpl",143),wAn(1167,143,t9n,NY),MWn._i=function(){return this.a._i()},MWn.yi=function(n){return this.a.aj()},MWn.Ai=function(){return this.a.Ai()},vX(i6n,"DelegatingNotifyingListImpl/1",1167),wAn(242,63,h8n,po,Fj),MWn.Fc=function(n){return Mwn(this,BB(n,366))},MWn.Ei=function(n){return Mwn(this,n)},MWn.Fi=function(){var n,t,e;for(n=0;n<this.i;++n)null!=(e=(t=BB(this.g[n],366)).Ai())&&-1!=t.xi()&&BB(e,92).Ng(t)},MWn.ri=function(n){return x8(gAt,HWn,366,n,0,1)},vX(i6n,"NotificationChainImpl",242),wAn(1378,90,e6n),MWn.Kg=function(){return this.e},MWn.Mg=function(){return 0!=(1&this.f)},MWn.f=1,vX(i6n,"NotifierImpl",1378),wAn(1993,63,h8n),MWn.Vh=function(n,t){return LFn(this,n,t)},MWn.Wh=function(n){return this.Vh(this.i,n)},MWn.Xh=function(n,t){qOn(this,n,t)},MWn.Yh=function(n){tAn(this,n)},MWn.ai=function(){return!this.bj()},MWn.$b=function(){sqn(this)},MWn.Zi=function(n,t,e,i,r){return new xY(this,n,t,e,i,r)},MWn.$i=function(n){ban(this.Ai(),n)},MWn._i=function(){return null},MWn.aj=function(){return-1},MWn.Ai=function(){return null},MWn.bj=function(){return!1},MWn.ij=function(){return!1},MWn.cj=function(n,t){return t},MWn.dj=function(n,t){return t},MWn.ej=function(){return!1},MWn.fj=function(){return 0!=this.i},MWn.ii=function(n,t){return Iln(this,n,t)},MWn.$c=function(n){return fDn(this,n)},MWn.mi=function(n,t){return fBn(this,n,t)},MWn.jj=function(n,t){return t},MWn.kj=function(n,t){return t},MWn.lj=function(n,t,e){return e},vX(i6n,"NotifyingListImpl",1993),wAn(1166,143,t9n,xY),MWn._i=function(){return this.a._i()},MWn.yi=function(n){return this.a.aj()},MWn.Ai=function(){return this.a.Ai()},vX(i6n,"NotifyingListImpl/1",1166),wAn(953,63,h8n,aR),MWn.Hc=function(n){return this.i>10?(this.b&&this.c.j==this.a||(this.b=new $q(this),this.a=this.j),FT(this.b,n)):Sjn(this,n)},MWn.ni=function(){return!0},MWn.a=0,vX(B6n,"AbstractEList/1",953),wAn(295,73,NQn,tK),vX(B6n,"AbstractEList/BasicIndexOutOfBoundsException",295),wAn(40,1,QWn,AL),MWn.Nb=function(n){fU(this,n)},MWn.mj=function(){if(this.i.j!=this.f)throw Hp(new vv)},MWn.nj=function(){return kpn(this)},MWn.Ob=function(){return this.e!=this.i.gc()},MWn.Pb=function(){return this.nj()},MWn.Qb=function(){Qjn(this)},MWn.e=0,MWn.f=0,MWn.g=-1,vX(B6n,"AbstractEList/EIterator",40),wAn(278,40,cVn,cx,GU),MWn.Qb=function(){Qjn(this)},MWn.Rb=function(n){odn(this,n)},MWn.oj=function(){var n;try{return n=this.d.Xb(--this.e),this.mj(),this.g=this.e,n}catch(t){throw cL(t=lun(t),73)?(this.mj(),Hp(new yv)):Hp(t)}},MWn.pj=function(n){kmn(this,n)},MWn.Sb=function(){return 0!=this.e},MWn.Tb=function(){return this.e},MWn.Ub=function(){return this.oj()},MWn.Vb=function(){return this.e-1},MWn.Wb=function(n){this.pj(n)},vX(B6n,"AbstractEList/EListIterator",278),wAn(341,40,QWn,ax),MWn.nj=function(){return jpn(this)},MWn.Qb=function(){throw Hp(new pv)},vX(B6n,"AbstractEList/NonResolvingEIterator",341),wAn(385,278,cVn,ux,RK),MWn.Rb=function(n){throw Hp(new pv)},MWn.nj=function(){var n;try{return n=this.c.ki(this.e),this.mj(),this.g=this.e++,n}catch(t){throw cL(t=lun(t),73)?(this.mj(),Hp(new yv)):Hp(t)}},MWn.oj=function(){var n;try{return n=this.c.ki(--this.e),this.mj(),this.g=this.e,n}catch(t){throw cL(t=lun(t),73)?(this.mj(),Hp(new yv)):Hp(t)}},MWn.Qb=function(){throw Hp(new pv)},MWn.Wb=function(n){throw Hp(new pv)},vX(B6n,"AbstractEList/NonResolvingEListIterator",385),wAn(1982,67,r9n),MWn.Vh=function(n,t){var e,i,r,c,a,u,o,s,h;if(0!=(i=t.gc())){for(e=Psn(this,(s=null==(o=BB(yan(this.a,4),126))?0:o.length)+i),(h=s-n)>0&&aHn(o,n,e,n+i,h),u=t.Kc(),c=0;c<i;++c)JA(e,n+c,xsn(this,a=u.Pb()));for(Fgn(this,e),r=0;r<i;++r)a=e[n],this.bi(n,a),++n;return!0}return++this.j,!1},MWn.Wh=function(n){var t,e,i,r,c,a,u,o,s;if(0!=(i=n.gc())){for(t=Psn(this,s=(o=null==(e=BB(yan(this.a,4),126))?0:e.length)+i),u=n.Kc(),c=o;c<s;++c)JA(t,c,xsn(this,a=u.Pb()));for(Fgn(this,t),r=o;r<s;++r)a=t[r],this.bi(r,a);return!0}return++this.j,!1},MWn.Xh=function(n,t){var e,i,r,c;e=Psn(this,(r=null==(i=BB(yan(this.a,4),126))?0:i.length)+1),c=xsn(this,t),n!=r&&aHn(i,n,e,n+1,r-n),$X(e,n,c),Fgn(this,e),this.bi(n,t)},MWn.Yh=function(n){var t,e,i;JA(t=Psn(this,(i=null==(e=BB(yan(this.a,4),126))?0:e.length)+1),i,xsn(this,n)),Fgn(this,t),this.bi(i,n)},MWn.Zh=function(){return new S5(this)},MWn.$h=function(){return new Yz(this)},MWn._h=function(n){var t,e;if(e=null==(t=BB(yan(this.a,4),126))?0:t.length,n<0||n>e)throw Hp(new tK(n,e));return new BW(this,n)},MWn.$b=function(){var n,t;++this.j,t=null==(n=BB(yan(this.a,4),126))?0:n.length,Fgn(this,null),L8(this,t,n)},MWn.Hc=function(n){var t,e,i,r;if(null!=(t=BB(yan(this.a,4),126)))if(null!=n){for(i=0,r=(e=t).length;i<r;++i)if(Nfn(n,e[i]))return!0}else for(i=0,r=(e=t).length;i<r;++i)if(GI(e[i])===GI(n))return!0;return!1},MWn.Xb=function(n){var t,e;if(n>=(e=null==(t=BB(yan(this.a,4),126))?0:t.length))throw Hp(new tK(n,e));return t[n]},MWn.Xc=function(n){var t,e,i;if(null!=(t=BB(yan(this.a,4),126)))if(null!=n){for(e=0,i=t.length;e<i;++e)if(Nfn(n,t[e]))return e}else for(e=0,i=t.length;e<i;++e)if(GI(t[e])===GI(n))return e;return-1},MWn.dc=function(){return null==BB(yan(this.a,4),126)},MWn.Kc=function(){return new M5(this)},MWn.Yc=function(){return new Qz(this)},MWn.Zc=function(n){var t,e;if(e=null==(t=BB(yan(this.a,4),126))?0:t.length,n<0||n>e)throw Hp(new tK(n,e));return new FW(this,n)},MWn.ii=function(n,t){var e,i,r;if(n>=(r=null==(e=$dn(this))?0:e.length))throw Hp(new Ay(u8n+n+o8n+r));if(t>=r)throw Hp(new Ay(s8n+t+o8n+r));return i=e[t],n!=t&&(n<t?aHn(e,n,e,n+1,t-n):aHn(e,t+1,e,t,n-t),$X(e,n,i),Fgn(this,e)),i},MWn.ki=function(n){return BB(yan(this.a,4),126)[n]},MWn.$c=function(n){return EOn(this,n)},MWn.mi=function(n,t){var e,i;return i=(e=$dn(this))[n],JA(e,n,xsn(this,t)),Fgn(this,e),i},MWn.gc=function(){var n;return null==(n=BB(yan(this.a,4),126))?0:n.length},MWn.Pc=function(){var n,t,e;return e=null==(n=BB(yan(this.a,4),126))?0:n.length,t=x8(dAt,i9n,415,e,0,1),e>0&&aHn(n,0,t,0,e),t},MWn.Qc=function(n){var t,e;return(e=null==(t=BB(yan(this.a,4),126))?0:t.length)>0&&(n.length<e&&(n=Den(tsn(n).c,e)),aHn(t,0,n,0,e)),n.length>e&&$X(n,e,null),n},vX(B6n,"ArrayDelegatingEList",1982),wAn(1038,40,QWn,M5),MWn.mj=function(){if(this.b.j!=this.f||GI(BB(yan(this.b.a,4),126))!==GI(this.a))throw Hp(new vv)},MWn.Qb=function(){Qjn(this),this.a=BB(yan(this.b.a,4),126)},vX(B6n,"ArrayDelegatingEList/EIterator",1038),wAn(706,278,cVn,Qz,FW),MWn.mj=function(){if(this.b.j!=this.f||GI(BB(yan(this.b.a,4),126))!==GI(this.a))throw Hp(new vv)},MWn.pj=function(n){kmn(this,n),this.a=BB(yan(this.b.a,4),126)},MWn.Qb=function(){Qjn(this),this.a=BB(yan(this.b.a,4),126)},vX(B6n,"ArrayDelegatingEList/EListIterator",706),wAn(1039,341,QWn,S5),MWn.mj=function(){if(this.b.j!=this.f||GI(BB(yan(this.b.a,4),126))!==GI(this.a))throw Hp(new vv)},vX(B6n,"ArrayDelegatingEList/NonResolvingEIterator",1039),wAn(707,385,cVn,Yz,BW),MWn.mj=function(){if(this.b.j!=this.f||GI(BB(yan(this.b.a,4),126))!==GI(this.a))throw Hp(new vv)},vX(B6n,"ArrayDelegatingEList/NonResolvingEListIterator",707),wAn(606,295,NQn,LO),vX(B6n,"BasicEList/BasicIndexOutOfBoundsException",606),wAn(696,63,h8n,DI),MWn.Vc=function(n,t){throw Hp(new pv)},MWn.Fc=function(n){throw Hp(new pv)},MWn.Wc=function(n,t){throw Hp(new pv)},MWn.Gc=function(n){throw Hp(new pv)},MWn.$b=function(){throw Hp(new pv)},MWn.qi=function(n){throw Hp(new pv)},MWn.Kc=function(){return this.Zh()},MWn.Yc=function(){return this.$h()},MWn.Zc=function(n){return this._h(n)},MWn.ii=function(n,t){throw Hp(new pv)},MWn.ji=function(n,t){throw Hp(new pv)},MWn.$c=function(n){throw Hp(new pv)},MWn.Mc=function(n){throw Hp(new pv)},MWn._c=function(n,t){throw Hp(new pv)},vX(B6n,"BasicEList/UnmodifiableEList",696),wAn(705,1,{3:1,20:1,14:1,15:1,58:1,589:1}),MWn.Vc=function(n,t){Q$(this,n,BB(t,42))},MWn.Fc=function(n){return aD(this,BB(n,42))},MWn.Jc=function(n){e5(this,n)},MWn.Xb=function(n){return BB(Wtn(this.c,n),133)},MWn.ii=function(n,t){return BB(this.c.ii(n,t),42)},MWn.ji=function(n,t){Y$(this,n,BB(t,42))},MWn.Lc=function(){return new Rq(null,new w1(this,16))},MWn.$c=function(n){return BB(this.c.$c(n),42)},MWn._c=function(n,t){return uX(this,n,BB(t,42))},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Oc=function(){return new Rq(null,new w1(this,16))},MWn.Wc=function(n,t){return this.c.Wc(n,t)},MWn.Gc=function(n){return this.c.Gc(n)},MWn.$b=function(){this.c.$b()},MWn.Hc=function(n){return this.c.Hc(n)},MWn.Ic=function(n){return oun(this.c,n)},MWn.qj=function(){var n,t;if(null==this.d){for(this.d=x8(oAt,c9n,63,2*this.f+1,0,1),t=this.e,this.f=0,n=this.c.Kc();n.e!=n.i.gc();)Ivn(this,BB(n.nj(),133));this.e=t}},MWn.Fb=function(n){return NK(this,n)},MWn.Hb=function(){return Mun(this.c)},MWn.Xc=function(n){return this.c.Xc(n)},MWn.rj=function(){this.c=new hp(this)},MWn.dc=function(){return 0==this.f},MWn.Kc=function(){return this.c.Kc()},MWn.Yc=function(){return this.c.Yc()},MWn.Zc=function(n){return this.c.Zc(n)},MWn.sj=function(){return A8(this)},MWn.tj=function(n,t,e){return new SB(n,t,e)},MWn.uj=function(){return new vo},MWn.Mc=function(n){return hin(this,n)},MWn.gc=function(){return this.f},MWn.bd=function(n,t){return new s1(this.c,n,t)},MWn.Pc=function(){return this.c.Pc()},MWn.Qc=function(n){return this.c.Qc(n)},MWn.Ib=function(){return Jbn(this.c)},MWn.e=0,MWn.f=0,vX(B6n,"BasicEMap",705),wAn(1033,63,h8n,hp),MWn.bi=function(n,t){Av(this,BB(t,133))},MWn.ei=function(n,t,e){var i;++(i=this,BB(t,133),i).a.e},MWn.fi=function(n,t){$v(this,BB(t,133))},MWn.gi=function(n,t,e){VN(this,BB(t,133),BB(e,133))},MWn.di=function(n,t){aan(this.a)},vX(B6n,"BasicEMap/1",1033),wAn(1034,63,h8n,vo),MWn.ri=function(n){return x8(vAt,a9n,612,n,0,1)},vX(B6n,"BasicEMap/2",1034),wAn(1035,nVn,tVn,fp),MWn.$b=function(){this.a.c.$b()},MWn.Hc=function(n){return rdn(this.a,n)},MWn.Kc=function(){return 0==this.a.f?(dD(),pAt.a):new Bj(this.a)},MWn.Mc=function(n){var t;return t=this.a.f,Wdn(this.a,n),this.a.f!=t},MWn.gc=function(){return this.a.f},vX(B6n,"BasicEMap/3",1035),wAn(1036,28,ZWn,lp),MWn.$b=function(){this.a.c.$b()},MWn.Hc=function(n){return YDn(this.a,n)},MWn.Kc=function(){return 0==this.a.f?(dD(),pAt.a):new Hj(this.a)},MWn.gc=function(){return this.a.f},vX(B6n,"BasicEMap/4",1036),wAn(1037,nVn,tVn,bp),MWn.$b=function(){this.a.c.$b()},MWn.Hc=function(n){var t,e,i,r,c,a,u,o,s;if(this.a.f>0&&cL(n,42)&&(this.a.qj(),r=null==(u=(o=BB(n,42)).cd())?0:nsn(u),c=eR(this.a,r),t=this.a.d[c]))for(e=BB(t.g,367),s=t.i,a=0;a<s;++a)if((i=e[a]).Sh()==r&&i.Fb(o))return!0;return!1},MWn.Kc=function(){return 0==this.a.f?(dD(),pAt.a):new pQ(this.a)},MWn.Mc=function(n){return IAn(this,n)},MWn.gc=function(){return this.a.f},vX(B6n,"BasicEMap/5",1037),wAn(613,1,QWn,pQ),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return-1!=this.b},MWn.Pb=function(){var n;if(this.f.e!=this.c)throw Hp(new vv);if(-1==this.b)throw Hp(new yv);return this.d=this.a,this.e=this.b,ujn(this),n=BB(this.f.d[this.d].g[this.e],133),this.vj(n)},MWn.Qb=function(){if(this.f.e!=this.c)throw Hp(new vv);if(-1==this.e)throw Hp(new dv);this.f.c.Mc(Wtn(this.f.d[this.d],this.e)),this.c=this.f.e,this.e=-1,this.a==this.d&&-1!=this.b&&--this.b},MWn.vj=function(n){return n},MWn.a=0,MWn.b=-1,MWn.c=0,MWn.d=0,MWn.e=0,vX(B6n,"BasicEMap/BasicEMapIterator",613),wAn(1031,613,QWn,Bj),MWn.vj=function(n){return n.cd()},vX(B6n,"BasicEMap/BasicEMapKeyIterator",1031),wAn(1032,613,QWn,Hj),MWn.vj=function(n){return n.dd()},vX(B6n,"BasicEMap/BasicEMapValueIterator",1032),wAn(1030,1,JWn,wp),MWn.wc=function(n){nan(this,n)},MWn.yc=function(n,t,e){return Zln(this,n,t,e)},MWn.$b=function(){this.a.c.$b()},MWn._b=function(n){return BI(this,n)},MWn.uc=function(n){return YDn(this.a,n)},MWn.vc=function(){return I8(this.a)},MWn.Fb=function(n){return NK(this.a,n)},MWn.xc=function(n){return cdn(this.a,n)},MWn.Hb=function(){return Mun(this.a.c)},MWn.dc=function(){return 0==this.a.f},MWn.ec=function(){return O8(this.a)},MWn.zc=function(n,t){return vjn(this.a,n,t)},MWn.Bc=function(n){return Wdn(this.a,n)},MWn.gc=function(){return this.a.f},MWn.Ib=function(){return Jbn(this.a.c)},MWn.Cc=function(){return C8(this.a)},vX(B6n,"BasicEMap/DelegatingMap",1030),wAn(612,1,{42:1,133:1,612:1},SB),MWn.Fb=function(n){var t;return!!cL(n,42)&&(t=BB(n,42),(null!=this.b?Nfn(this.b,t.cd()):GI(this.b)===GI(t.cd()))&&(null!=this.c?Nfn(this.c,t.dd()):GI(this.c)===GI(t.dd())))},MWn.Sh=function(){return this.a},MWn.cd=function(){return this.b},MWn.dd=function(){return this.c},MWn.Hb=function(){return this.a^(null==this.c?0:nsn(this.c))},MWn.Th=function(n){this.a=n},MWn.Uh=function(n){throw Hp(new sv)},MWn.ed=function(n){var t;return t=this.c,this.c=n,t},MWn.Ib=function(){return this.b+"->"+this.c},MWn.a=0;var pAt,vAt=vX(B6n,"BasicEMap/EntryImpl",612);wAn(536,1,{},oo),vX(B6n,"BasicEMap/View",536),wAn(768,1,{}),MWn.Fb=function(n){return NAn((SQ(),set),n)},MWn.Hb=function(){return Fon((SQ(),set))},MWn.Ib=function(){return LMn((SQ(),set))},vX(B6n,"ECollections/BasicEmptyUnmodifiableEList",768),wAn(1312,1,cVn,mo),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){throw Hp(new pv)},MWn.Ob=function(){return!1},MWn.Sb=function(){return!1},MWn.Pb=function(){throw Hp(new yv)},MWn.Tb=function(){return 0},MWn.Ub=function(){throw Hp(new yv)},MWn.Vb=function(){return-1},MWn.Qb=function(){throw Hp(new pv)},MWn.Wb=function(n){throw Hp(new pv)},vX(B6n,"ECollections/BasicEmptyUnmodifiableEList/1",1312),wAn(1310,768,{20:1,14:1,15:1,58:1},Tm),MWn.Vc=function(n,t){NE()},MWn.Fc=function(n){return xE()},MWn.Wc=function(n,t){return DE()},MWn.Gc=function(n){return RE()},MWn.$b=function(){KE()},MWn.Hc=function(n){return!1},MWn.Ic=function(n){return!1},MWn.Jc=function(n){e5(this,n)},MWn.Xb=function(n){return yO((SQ(),n)),null},MWn.Xc=function(n){return-1},MWn.dc=function(){return!0},MWn.Kc=function(){return this.a},MWn.Yc=function(){return this.a},MWn.Zc=function(n){return this.a},MWn.ii=function(n,t){return _E()},MWn.ji=function(n,t){FE()},MWn.Lc=function(){return new Rq(null,new w1(this,16))},MWn.$c=function(n){return BE()},MWn.Mc=function(n){return HE()},MWn._c=function(n,t){return qE()},MWn.gc=function(){return 0},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Oc=function(){return new Rq(null,new w1(this,16))},MWn.bd=function(n,t){return SQ(),new s1(set,n,t)},MWn.Pc=function(){return cz((SQ(),set))},MWn.Qc=function(n){return SQ(),Emn(set,n)},vX(B6n,"ECollections/EmptyUnmodifiableEList",1310),wAn(1311,768,{20:1,14:1,15:1,58:1,589:1},Mm),MWn.Vc=function(n,t){NE()},MWn.Fc=function(n){return xE()},MWn.Wc=function(n,t){return DE()},MWn.Gc=function(n){return RE()},MWn.$b=function(){KE()},MWn.Hc=function(n){return!1},MWn.Ic=function(n){return!1},MWn.Jc=function(n){e5(this,n)},MWn.Xb=function(n){return yO((SQ(),n)),null},MWn.Xc=function(n){return-1},MWn.dc=function(){return!0},MWn.Kc=function(){return this.a},MWn.Yc=function(){return this.a},MWn.Zc=function(n){return this.a},MWn.ii=function(n,t){return _E()},MWn.ji=function(n,t){FE()},MWn.Lc=function(){return new Rq(null,new w1(this,16))},MWn.$c=function(n){return BE()},MWn.Mc=function(n){return HE()},MWn._c=function(n,t){return qE()},MWn.gc=function(){return 0},MWn.ad=function(n){_rn(this,n)},MWn.Nc=function(){return new w1(this,16)},MWn.Oc=function(){return new Rq(null,new w1(this,16))},MWn.bd=function(n,t){return SQ(),new s1(set,n,t)},MWn.Pc=function(){return cz((SQ(),set))},MWn.Qc=function(n){return SQ(),Emn(set,n)},MWn.sj=function(){return SQ(),SQ(),het},vX(B6n,"ECollections/EmptyUnmodifiableEMap",1311);var mAt,yAt=bq(B6n,"Enumerator");wAn(281,1,{281:1},rRn),MWn.Fb=function(n){var t;return this===n||!!cL(n,281)&&(t=BB(n,281),this.f==t.f&&vG(this.i,t.i)&&pG(this.a,0!=(256&this.f)?0!=(256&t.f)?t.a:null:0!=(256&t.f)?null:t.a)&&pG(this.d,t.d)&&pG(this.g,t.g)&&pG(this.e,t.e)&&Spn(this,t))},MWn.Hb=function(){return this.f},MWn.Ib=function(){return M_n(this)},MWn.f=0;var kAt,jAt,EAt,TAt=0,MAt=0,SAt=0,PAt=0,CAt=0,IAt=0,OAt=0,AAt=0,$At=0,LAt=0,NAt=0,xAt=0,DAt=0;vX(B6n,"URI",281),wAn(1091,43,tYn,Sm),MWn.zc=function(n,t){return BB(mZ(this,SD(n),BB(t,281)),281)},vX(B6n,"URI/URICache",1091),wAn(497,63,h8n,fo,rG),MWn.hi=function(){return!0},vX(B6n,"UniqueEList",497),wAn(581,60,BVn,L7),vX(B6n,"WrappedException",581);var RAt,KAt=bq(q5n,s9n),_At=bq(q5n,h9n),FAt=bq(q5n,f9n),BAt=bq(q5n,l9n),HAt=bq(q5n,b9n),qAt=bq(q5n,"EClass"),GAt=bq(q5n,"EDataType");wAn(1183,43,tYn,Pm),MWn.xc=function(n){return XI(n)?SJ(this,n):qI(AY(this.f,n))},vX(q5n,"EDataType/Internal/ConversionDelegate/Factory/Registry/Impl",1183);var zAt,UAt,XAt=bq(q5n,"EEnum"),WAt=bq(q5n,w9n),VAt=bq(q5n,d9n),QAt=bq(q5n,g9n),YAt=bq(q5n,p9n),JAt=bq(q5n,v9n);wAn(1029,1,{},ho),MWn.Ib=function(){return"NIL"},vX(q5n,"EStructuralFeature/Internal/DynamicValueHolder/1",1029),wAn(1028,43,tYn,Cm),MWn.xc=function(n){return XI(n)?SJ(this,n):qI(AY(this.f,n))},vX(q5n,"EStructuralFeature/Internal/SettingDelegate/Factory/Registry/Impl",1028);var ZAt,n$t,t$t,e$t,i$t,r$t,c$t,a$t,u$t,o$t,s$t,h$t,f$t,l$t,b$t,w$t,d$t,g$t,p$t,v$t,m$t,y$t,k$t,j$t,E$t,T$t,M$t,S$t,P$t,C$t,I$t,O$t=bq(q5n,m9n),A$t=bq(q5n,"EValidator/PatternMatcher"),$$t=bq(y9n,"FeatureMap/Entry");wAn(535,1,{72:1},CI),MWn.ak=function(){return this.a},MWn.dd=function(){return this.b},vX(l6n,"BasicEObjectImpl/1",535),wAn(1027,1,k9n,II),MWn.Wj=function(n){return V5(this.a,this.b,n)},MWn.fj=function(){return ZJ(this.a,this.b)},MWn.Wb=function(n){NJ(this.a,this.b,n)},MWn.Xj=function(){PW(this.a,this.b)},vX(l6n,"BasicEObjectImpl/4",1027),wAn(1983,1,{108:1}),MWn.bk=function(n){this.e=0==n?M$t:x8(Ant,HWn,1,n,5,1)},MWn.Ch=function(n){return this.e[n]},MWn.Dh=function(n,t){this.e[n]=t},MWn.Eh=function(n){this.e[n]=null},MWn.ck=function(){return this.c},MWn.dk=function(){throw Hp(new pv)},MWn.ek=function(){throw Hp(new pv)},MWn.fk=function(){return this.d},MWn.gk=function(){return null!=this.e},MWn.hk=function(n){this.c=n},MWn.ik=function(n){throw Hp(new pv)},MWn.jk=function(n){throw Hp(new pv)},MWn.kk=function(n){this.d=n},vX(l6n,"BasicEObjectImpl/EPropertiesHolderBaseImpl",1983),wAn(185,1983,{108:1},Kf),MWn.dk=function(){return this.a},MWn.ek=function(){return this.b},MWn.ik=function(n){this.a=n},MWn.jk=function(n){this.b=n},vX(l6n,"BasicEObjectImpl/EPropertiesHolderImpl",185),wAn(506,97,f6n,yo),MWn.Kg=function(){return this.f},MWn.Pg=function(){return this.k},MWn.Rg=function(n,t){this.g=n,this.i=t},MWn.Tg=function(){return 0==(2&this.j)?this.zh():this.ph().ck()},MWn.Vg=function(){return this.i},MWn.Mg=function(){return 0!=(1&this.j)},MWn.eh=function(){return this.g},MWn.kh=function(){return 0!=(4&this.j)},MWn.ph=function(){return!this.k&&(this.k=new Kf),this.k},MWn.th=function(n){this.ph().hk(n),n?this.j|=2:this.j&=-3},MWn.vh=function(n){this.ph().jk(n),n?this.j|=4:this.j&=-5},MWn.zh=function(){return(QX(),t$t).S},MWn.i=0,MWn.j=1,vX(l6n,"EObjectImpl",506),wAn(780,506,{105:1,92:1,90:1,56:1,108:1,49:1,97:1},jH),MWn.Ch=function(n){return this.e[n]},MWn.Dh=function(n,t){this.e[n]=t},MWn.Eh=function(n){this.e[n]=null},MWn.Tg=function(){return this.d},MWn.Yg=function(n){return Awn(this.d,n)},MWn.$g=function(){return this.d},MWn.dh=function(){return null!=this.e},MWn.ph=function(){return!this.k&&(this.k=new ko),this.k},MWn.th=function(n){this.d=n},MWn.yh=function(){var n;return null==this.e&&(n=bX(this.d),this.e=0==n?S$t:x8(Ant,HWn,1,n,5,1)),this},MWn.Ah=function(){return 0},vX(l6n,"DynamicEObjectImpl",780),wAn(1376,780,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1},fq),MWn.Fb=function(n){return this===n},MWn.Hb=function(){return PN(this)},MWn.th=function(n){this.d=n,this.b=NNn(n,"key"),this.c=NNn(n,E6n)},MWn.Sh=function(){var n;return-1==this.a&&(n=J7(this,this.b),this.a=null==n?0:nsn(n)),this.a},MWn.cd=function(){return J7(this,this.b)},MWn.dd=function(){return J7(this,this.c)},MWn.Th=function(n){this.a=n},MWn.Uh=function(n){NJ(this,this.b,n)},MWn.ed=function(n){var t;return t=J7(this,this.c),NJ(this,this.c,n),t},MWn.a=0,vX(l6n,"DynamicEObjectImpl/BasicEMapEntry",1376),wAn(1377,1,{108:1},ko),MWn.bk=function(n){throw Hp(new pv)},MWn.Ch=function(n){throw Hp(new pv)},MWn.Dh=function(n,t){throw Hp(new pv)},MWn.Eh=function(n){throw Hp(new pv)},MWn.ck=function(){throw Hp(new pv)},MWn.dk=function(){return this.a},MWn.ek=function(){return this.b},MWn.fk=function(){return this.c},MWn.gk=function(){throw Hp(new pv)},MWn.hk=function(n){throw Hp(new pv)},MWn.ik=function(n){this.a=n},MWn.jk=function(n){this.b=n},MWn.kk=function(n){this.c=n},vX(l6n,"DynamicEObjectImpl/DynamicEPropertiesHolderImpl",1377),wAn(510,150,{105:1,92:1,90:1,590:1,147:1,56:1,108:1,49:1,97:1,510:1,150:1,114:1,115:1},jo),MWn.Qg=function(n){return bkn(this,n)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.d;case 2:return e?(!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),this.b):(!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),A8(this.b));case 3:return bZ(this);case 4:return!this.a&&(this.a=new $L(LOt,this,4)),this.a;case 5:return!this.c&&(this.c=new RL(LOt,this,5)),this.c}return U9(this,n-bX((gWn(),e$t)),itn(BB(yan(this,16),26)||e$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 3:return this.Cb&&(e=(i=this.Db>>16)>=0?bkn(this,e):this.Cb.ih(this,-1-i,null,e)),QG(this,BB(n,147),e)}return BB(itn(BB(yan(this,16),26)||(gWn(),e$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),e$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 2:return!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),BK(this.b,n,e);case 3:return QG(this,null,e);case 4:return!this.a&&(this.a=new $L(LOt,this,4)),_pn(this.a,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),e$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),e$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.d;case 2:return!!this.b&&0!=this.b.f;case 3:return!!bZ(this);case 4:return!!this.a&&0!=this.a.i;case 5:return!!this.c&&0!=this.c.i}return O3(this,n-bX((gWn(),e$t)),itn(BB(yan(this,16),26)||e$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void pq(this,SD(t));case 2:return!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),void tan(this.b,t);case 3:return void ONn(this,BB(t,147));case 4:return!this.a&&(this.a=new $L(LOt,this,4)),sqn(this.a),!this.a&&(this.a=new $L(LOt,this,4)),void pX(this.a,BB(t,14));case 5:return!this.c&&(this.c=new RL(LOt,this,5)),sqn(this.c),!this.c&&(this.c=new RL(LOt,this,5)),void pX(this.c,BB(t,14))}Lbn(this,n-bX((gWn(),e$t)),itn(BB(yan(this,16),26)||e$t,n),t)},MWn.zh=function(){return gWn(),e$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Bin(this,null);case 2:return!this.b&&(this.b=new Jx((gWn(),k$t),X$t,this)),void this.b.c.$b();case 3:return void ONn(this,null);case 4:return!this.a&&(this.a=new $L(LOt,this,4)),void sqn(this.a);case 5:return!this.c&&(this.c=new RL(LOt,this,5)),void sqn(this.c)}qfn(this,n-bX((gWn(),e$t)),itn(BB(yan(this,16),26)||e$t,n))},MWn.Ib=function(){return Vfn(this)},MWn.d=null,vX(l6n,"EAnnotationImpl",510),wAn(151,705,j9n,y9),MWn.Xh=function(n,t){n$(this,n,BB(t,42))},MWn.lk=function(n,t){return FK(this,BB(n,42),t)},MWn.pi=function(n){return BB(BB(this.c,69).pi(n),133)},MWn.Zh=function(){return BB(this.c,69).Zh()},MWn.$h=function(){return BB(this.c,69).$h()},MWn._h=function(n){return BB(this.c,69)._h(n)},MWn.mk=function(n,t){return BK(this,n,t)},MWn.Wj=function(n){return BB(this.c,76).Wj(n)},MWn.rj=function(){},MWn.fj=function(){return BB(this.c,76).fj()},MWn.tj=function(n,t,e){var i;return(i=BB(Utn(this.b).Nh().Jh(this.b),133)).Th(n),i.Uh(t),i.ed(e),i},MWn.uj=function(){return new Ip(this)},MWn.Wb=function(n){tan(this,n)},MWn.Xj=function(){BB(this.c,76).Xj()},vX(y9n,"EcoreEMap",151),wAn(158,151,j9n,Jx),MWn.qj=function(){var n,t,e,i,r;if(null==this.d){for(r=x8(oAt,c9n,63,2*this.f+1,0,1),e=this.c.Kc();e.e!=e.i.gc();)!(n=r[i=((t=BB(e.nj(),133)).Sh()&DWn)%r.length])&&(n=r[i]=new Ip(this)),n.Fc(t);this.d=r}},vX(l6n,"EAnnotationImpl/1",158),wAn(284,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,472:1,49:1,97:1,150:1,284:1,114:1,115:1}),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),!!this.$j();case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 9:return gX(this,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Rj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return this.$j();case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i)}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void this.Lh(SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void this.ok(BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi())}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),E$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void this.Lh(null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return void this.ok(1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi())}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.Gh=function(){Ikn(this),this.Bb|=1},MWn.Yj=function(){return Ikn(this)},MWn.Zj=function(){return this.t},MWn.$j=function(){var n;return(n=this.t)>1||-1==n},MWn.hi=function(){return 0!=(512&this.Bb)},MWn.nk=function(n,t){return Pfn(this,n,t)},MWn.ok=function(n){Nen(this,n)},MWn.Ib=function(){return KOn(this)},MWn.s=0,MWn.t=1,vX(l6n,"ETypedElementImpl",284),wAn(449,284,{105:1,92:1,90:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,449:1,284:1,114:1,115:1,677:1}),MWn.Qg=function(n){return Nyn(this,n)},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),!!this.$j();case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return hN(),0!=(this.Bb&k6n);case 11:return hN(),0!=(this.Bb&M9n);case 12:return hN(),0!=(this.Bb&_Qn);case 13:return this.j;case 14:return qLn(this);case 15:return hN(),0!=(this.Bb&T9n);case 16:return hN(),0!=(this.Bb&hVn);case 17:return dZ(this)}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 17:return this.Cb&&(e=(i=this.Db>>16)>=0?Nyn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,17,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Qj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 9:return gX(this,e);case 17:return T_n(this,null,17,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Rj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return this.$j();case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return 0==(this.Bb&k6n);case 11:return 0!=(this.Bb&M9n);case 12:return 0!=(this.Bb&_Qn);case 13:return null!=this.j;case 14:return null!=qLn(this);case 15:return 0!=(this.Bb&T9n);case 16:return 0!=(this.Bb&hVn);case 17:return!!dZ(this)}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void JZ(this,SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void this.ok(BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi());case 10:return void Aln(this,qy(TD(t)));case 11:return void Nln(this,qy(TD(t)));case 12:return void $ln(this,qy(TD(t)));case 13:return void _I(this,SD(t));case 15:return void Lln(this,qy(TD(t)));case 16:return void qln(this,qy(TD(t)))}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),j$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,88)&&ACn(P5(BB(this.Cb,88)),4),void Nrn(this,null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return void this.ok(1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi());case 10:return void Aln(this,!0);case 11:return void Nln(this,!1);case 12:return void $ln(this,!1);case 13:return this.i=null,void arn(this,null);case 15:return void Lln(this,!1);case 16:return void qln(this,!1)}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.Gh=function(){kV(B7((IPn(),Z$t),this)),Ikn(this),this.Bb|=1},MWn.Gj=function(){return this.f},MWn.zj=function(){return qLn(this)},MWn.Hj=function(){return dZ(this)},MWn.Lj=function(){return null},MWn.pk=function(){return this.k},MWn.aj=function(){return this.n},MWn.Mj=function(){return oEn(this)},MWn.Nj=function(){var n,t,e,i,r,c,a,u,o;return this.p||((null==(e=dZ(this)).i&&qFn(e),e.i).length,(i=this.Lj())&&bX(dZ(i)),n=(a=(r=Ikn(this)).Bj())?0!=(1&a.i)?a==$Nt?ktt:a==ANt?Att:a==DNt?Ctt:a==xNt?Ptt:a==LNt?Rtt:a==RNt?_tt:a==NNt?Ttt:Stt:a:null,t=qLn(this),u=r.zj(),bbn(this),0!=(this.Bb&hVn)&&((c=mjn((IPn(),Z$t),e))&&c!=this||(c=Z1(B7(Z$t,this))))?this.p=new AI(this,c):this.$j()?this.rk()?i?0!=(this.Bb&T9n)?n?this.sk()?this.p=new lQ(47,n,this,i):this.p=new lQ(5,n,this,i):this.sk()?this.p=new w4(46,this,i):this.p=new w4(4,this,i):n?this.sk()?this.p=new lQ(49,n,this,i):this.p=new lQ(7,n,this,i):this.sk()?this.p=new w4(48,this,i):this.p=new w4(6,this,i):0!=(this.Bb&T9n)?n?n==Hnt?this.p=new PB(50,VOt,this):this.sk()?this.p=new PB(43,n,this):this.p=new PB(1,n,this):this.sk()?this.p=new RY(42,this):this.p=new RY(0,this):n?n==Hnt?this.p=new PB(41,VOt,this):this.sk()?this.p=new PB(45,n,this):this.p=new PB(3,n,this):this.sk()?this.p=new RY(44,this):this.p=new RY(2,this):cL(r,148)?n==$$t?this.p=new RY(40,this):0!=(512&this.Bb)?0!=(this.Bb&T9n)?this.p=n?new PB(9,n,this):new RY(8,this):this.p=n?new PB(11,n,this):new RY(10,this):0!=(this.Bb&T9n)?this.p=n?new PB(13,n,this):new RY(12,this):this.p=n?new PB(15,n,this):new RY(14,this):i?(o=i.t)>1||-1==o?this.sk()?0!=(this.Bb&T9n)?this.p=n?new lQ(25,n,this,i):new w4(24,this,i):this.p=n?new lQ(27,n,this,i):new w4(26,this,i):0!=(this.Bb&T9n)?this.p=n?new lQ(29,n,this,i):new w4(28,this,i):this.p=n?new lQ(31,n,this,i):new w4(30,this,i):this.sk()?0!=(this.Bb&T9n)?this.p=n?new lQ(33,n,this,i):new w4(32,this,i):this.p=n?new lQ(35,n,this,i):new w4(34,this,i):0!=(this.Bb&T9n)?this.p=n?new lQ(37,n,this,i):new w4(36,this,i):this.p=n?new lQ(39,n,this,i):new w4(38,this,i):this.sk()?0!=(this.Bb&T9n)?this.p=n?new PB(17,n,this):new RY(16,this):this.p=n?new PB(19,n,this):new RY(18,this):0!=(this.Bb&T9n)?this.p=n?new PB(21,n,this):new RY(20,this):this.p=n?new PB(23,n,this):new RY(22,this):this.qk()?this.sk()?this.p=new CB(BB(r,26),this,i):this.p=new mJ(BB(r,26),this,i):cL(r,148)?n==$$t?this.p=new RY(40,this):0!=(this.Bb&T9n)?this.p=n?new nz(t,u,this,(Bwn(),a==ANt?q$t:a==$Nt?K$t:a==LNt?G$t:a==DNt?H$t:a==xNt?B$t:a==RNt?U$t:a==NNt?_$t:a==ONt?F$t:z$t)):new dQ(BB(r,148),t,u,this):this.p=n?new ZG(t,u,this,(Bwn(),a==ANt?q$t:a==$Nt?K$t:a==LNt?G$t:a==DNt?H$t:a==xNt?B$t:a==RNt?U$t:a==NNt?_$t:a==ONt?F$t:z$t)):new wQ(BB(r,148),t,u,this):this.rk()?i?0!=(this.Bb&T9n)?this.sk()?this.p=new NB(BB(r,26),this,i):this.p=new LB(BB(r,26),this,i):this.sk()?this.p=new $B(BB(r,26),this,i):this.p=new IB(BB(r,26),this,i):0!=(this.Bb&T9n)?this.sk()?this.p=new eD(BB(r,26),this):this.p=new tD(BB(r,26),this):this.sk()?this.p=new nD(BB(r,26),this):this.p=new Zx(BB(r,26),this):this.sk()?i?0!=(this.Bb&T9n)?this.p=new xB(BB(r,26),this,i):this.p=new OB(BB(r,26),this,i):0!=(this.Bb&T9n)?this.p=new rD(BB(r,26),this):this.p=new iD(BB(r,26),this):i?0!=(this.Bb&T9n)?this.p=new DB(BB(r,26),this,i):this.p=new AB(BB(r,26),this,i):0!=(this.Bb&T9n)?this.p=new cD(BB(r,26),this):this.p=new cG(BB(r,26),this)),this.p},MWn.Ij=function(){return 0!=(this.Bb&k6n)},MWn.qk=function(){return!1},MWn.rk=function(){return!1},MWn.Jj=function(){return 0!=(this.Bb&hVn)},MWn.Oj=function(){return hnn(this)},MWn.sk=function(){return!1},MWn.Kj=function(){return 0!=(this.Bb&T9n)},MWn.tk=function(n){this.k=n},MWn.Lh=function(n){JZ(this,n)},MWn.Ib=function(){return ERn(this)},MWn.e=!1,MWn.n=0,vX(l6n,"EStructuralFeatureImpl",449),wAn(322,449,{105:1,92:1,90:1,34:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,322:1,150:1,449:1,284:1,114:1,115:1,677:1},Om),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),!!NIn(this);case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return hN(),0!=(this.Bb&k6n);case 11:return hN(),0!=(this.Bb&M9n);case 12:return hN(),0!=(this.Bb&_Qn);case 13:return this.j;case 14:return qLn(this);case 15:return hN(),0!=(this.Bb&T9n);case 16:return hN(),0!=(this.Bb&hVn);case 17:return dZ(this);case 18:return hN(),0!=(this.Bb&h6n);case 19:return t?uun(this):x6(this)}return U9(this,n-bX((gWn(),i$t)),itn(BB(yan(this,16),26)||i$t,n),t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return NIn(this);case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return 0==(this.Bb&k6n);case 11:return 0!=(this.Bb&M9n);case 12:return 0!=(this.Bb&_Qn);case 13:return null!=this.j;case 14:return null!=qLn(this);case 15:return 0!=(this.Bb&T9n);case 16:return 0!=(this.Bb&hVn);case 17:return!!dZ(this);case 18:return 0!=(this.Bb&h6n);case 19:return!!x6(this)}return O3(this,n-bX((gWn(),i$t)),itn(BB(yan(this,16),26)||i$t,n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void JZ(this,SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void Uj(this,BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi());case 10:return void Aln(this,qy(TD(t)));case 11:return void Nln(this,qy(TD(t)));case 12:return void $ln(this,qy(TD(t)));case 13:return void _I(this,SD(t));case 15:return void Lln(this,qy(TD(t)));case 16:return void qln(this,qy(TD(t)));case 18:return void Gln(this,qy(TD(t)))}Lbn(this,n-bX((gWn(),i$t)),itn(BB(yan(this,16),26)||i$t,n),t)},MWn.zh=function(){return gWn(),i$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,88)&&ACn(P5(BB(this.Cb,88)),4),void Nrn(this,null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return this.b=0,void Nen(this,1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi());case 10:return void Aln(this,!0);case 11:return void Nln(this,!1);case 12:return void $ln(this,!1);case 13:return this.i=null,void arn(this,null);case 15:return void Lln(this,!1);case 16:return void qln(this,!1);case 18:return void Gln(this,!1)}qfn(this,n-bX((gWn(),i$t)),itn(BB(yan(this,16),26)||i$t,n))},MWn.Gh=function(){uun(this),kV(B7((IPn(),Z$t),this)),Ikn(this),this.Bb|=1},MWn.$j=function(){return NIn(this)},MWn.nk=function(n,t){return this.b=0,this.a=null,Pfn(this,n,t)},MWn.ok=function(n){Uj(this,n)},MWn.Ib=function(){var n;return 0!=(64&this.Db)?ERn(this):((n=new fN(ERn(this))).a+=" (iD: ",yE(n,0!=(this.Bb&h6n)),n.a+=")",n.a)},MWn.b=0,vX(l6n,"EAttributeImpl",322),wAn(351,438,{105:1,92:1,90:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,150:1,114:1,115:1,676:1}),MWn.uk=function(n){return n.Tg()==this},MWn.Qg=function(n){return fyn(this,n)},MWn.Rg=function(n,t){this.w=null,this.Db=t<<16|255&this.Db,this.Cb=n},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return null!=this.D?this.D:this.B;case 3:return iyn(this);case 4:return this.zj();case 5:return this.F;case 6:return t?Utn(this):wZ(this);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),this.A}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 6:return this.Cb&&(e=(i=this.Db>>16)>=0?fyn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,6,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Qj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 6:return T_n(this,null,6,e);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),_pn(this.A,n,e)}return BB(itn(BB(yan(this,16),26)||this.zh(),t),66).Nj().Rj(this,fgn(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.D&&this.D==this.F;case 3:return!!iyn(this);case 4:return null!=this.zj();case 5:return null!=this.F&&this.F!=this.D&&this.F!=this.B;case 6:return!!wZ(this);case 7:return!!this.A&&0!=this.A.i}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void ZZ(this,SD(t));case 2:return void IA(this,SD(t));case 5:return void Yqn(this,SD(t));case 7:return!this.A&&(this.A=new NL(O$t,this,7)),sqn(this.A),!this.A&&(this.A=new NL(O$t,this,7)),void pX(this.A,BB(t,14))}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),c$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,179)&&(BB(this.Cb,179).tb=null),void Nrn(this,null);case 2:return Dsn(this,null),void xen(this,this.D);case 5:return void Yqn(this,null);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),void sqn(this.A)}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.yj=function(){var n;return-1==this.G&&(this.G=(n=Utn(this))?uvn(n.Mh(),this):-1),this.G},MWn.zj=function(){return null},MWn.Aj=function(){return Utn(this)},MWn.vk=function(){return this.v},MWn.Bj=function(){return iyn(this)},MWn.Cj=function(){return null!=this.D?this.D:this.B},MWn.Dj=function(){return this.F},MWn.wj=function(n){return SFn(this,n)},MWn.wk=function(n){this.v=n},MWn.xk=function(n){Urn(this,n)},MWn.yk=function(n){this.C=n},MWn.Lh=function(n){ZZ(this,n)},MWn.Ib=function(){return Cwn(this)},MWn.C=null,MWn.D=null,MWn.G=-1,vX(l6n,"EClassifierImpl",351),wAn(88,351,{105:1,92:1,90:1,26:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,88:1,351:1,150:1,473:1,114:1,115:1,676:1},_f),MWn.uk=function(n){return QR(this,n.Tg())},MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return null!=this.D?this.D:this.B;case 3:return iyn(this);case 4:return null;case 5:return this.F;case 6:return t?Utn(this):wZ(this);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),this.A;case 8:return hN(),0!=(256&this.Bb);case 9:return hN(),0!=(512&this.Bb);case 10:return kY(this);case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),this.q;case 12:return YBn(this);case 13:return RBn(this);case 14:return RBn(this),this.r;case 15:return YBn(this),this.k;case 16:return WPn(this);case 17:return gBn(this);case 18:return qFn(this);case 19:return CLn(this);case 20:return YBn(this),this.o;case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),this.s;case 22:return a4(this);case 23:return HDn(this)}return U9(this,n-bX((gWn(),r$t)),itn(BB(yan(this,16),26)||r$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 6:return this.Cb&&(e=(i=this.Db>>16)>=0?fyn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,6,e);case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),Ywn(this.q,n,e);case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),Ywn(this.s,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),r$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),r$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 6:return T_n(this,null,6,e);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),_pn(this.A,n,e);case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),_pn(this.q,n,e);case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),_pn(this.s,n,e);case 22:return _pn(a4(this),n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),r$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),r$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.D&&this.D==this.F;case 3:return!!iyn(this);case 4:return!1;case 5:return null!=this.F&&this.F!=this.D&&this.F!=this.B;case 6:return!!wZ(this);case 7:return!!this.A&&0!=this.A.i;case 8:return 0!=(256&this.Bb);case 9:return 0!=(512&this.Bb);case 10:return!(!this.u||0==a4(this.u.a).i||this.n&&Rvn(this.n));case 11:return!!this.q&&0!=this.q.i;case 12:return 0!=YBn(this).i;case 13:return 0!=RBn(this).i;case 14:return RBn(this),0!=this.r.i;case 15:return YBn(this),0!=this.k.i;case 16:return 0!=WPn(this).i;case 17:return 0!=gBn(this).i;case 18:return 0!=qFn(this).i;case 19:return 0!=CLn(this).i;case 20:return YBn(this),!!this.o;case 21:return!!this.s&&0!=this.s.i;case 22:return!!this.n&&Rvn(this.n);case 23:return 0!=HDn(this).i}return O3(this,n-bX((gWn(),r$t)),itn(BB(yan(this,16),26)||r$t,n))},MWn.oh=function(n){return(null==this.i||this.q&&0!=this.q.i?null:NNn(this,n))||hUn(this,n)},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void ZZ(this,SD(t));case 2:return void IA(this,SD(t));case 5:return void Yqn(this,SD(t));case 7:return!this.A&&(this.A=new NL(O$t,this,7)),sqn(this.A),!this.A&&(this.A=new NL(O$t,this,7)),void pX(this.A,BB(t,14));case 8:return void Jfn(this,qy(TD(t)));case 9:return void tln(this,qy(TD(t)));case 10:return vqn(kY(this)),void pX(kY(this),BB(t,14));case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),sqn(this.q),!this.q&&(this.q=new eU(QAt,this,11,10)),void pX(this.q,BB(t,14));case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),sqn(this.s),!this.s&&(this.s=new eU(FAt,this,21,17)),void pX(this.s,BB(t,14));case 22:return sqn(a4(this)),void pX(a4(this),BB(t,14))}Lbn(this,n-bX((gWn(),r$t)),itn(BB(yan(this,16),26)||r$t,n),t)},MWn.zh=function(){return gWn(),r$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,179)&&(BB(this.Cb,179).tb=null),void Nrn(this,null);case 2:return Dsn(this,null),void xen(this,this.D);case 5:return void Yqn(this,null);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),void sqn(this.A);case 8:return void Jfn(this,!1);case 9:return void tln(this,!1);case 10:return void(this.u&&vqn(this.u));case 11:return!this.q&&(this.q=new eU(QAt,this,11,10)),void sqn(this.q);case 21:return!this.s&&(this.s=new eU(FAt,this,21,17)),void sqn(this.s);case 22:return void(this.n&&sqn(this.n))}qfn(this,n-bX((gWn(),r$t)),itn(BB(yan(this,16),26)||r$t,n))},MWn.Gh=function(){var n,t;if(YBn(this),RBn(this),WPn(this),gBn(this),qFn(this),CLn(this),HDn(this),a6(XB(P5(this))),this.s)for(n=0,t=this.s.i;n<t;++n)vx(Wtn(this.s,n));if(this.q)for(n=0,t=this.q.i;n<t;++n)vx(Wtn(this.q,n));Cfn((IPn(),Z$t),this).ne(),this.Bb|=1},MWn.Ib=function(){return dEn(this)},MWn.k=null,MWn.r=null,vX(l6n,"EClassImpl",88),wAn(1994,1993,D9n),MWn.Vh=function(n,t){return LFn(this,n,t)},MWn.Wh=function(n){return LFn(this,this.i,n)},MWn.Xh=function(n,t){qOn(this,n,t)},MWn.Yh=function(n){tAn(this,n)},MWn.lk=function(n,t){return Ywn(this,n,t)},MWn.pi=function(n){return F9(this,n)},MWn.mk=function(n,t){return _pn(this,n,t)},MWn.mi=function(n,t){return fBn(this,n,t)},MWn.Zh=function(){return new ax(this)},MWn.$h=function(){return new ux(this)},MWn._h=function(n){return sin(this,n)},vX(y9n,"NotifyingInternalEListImpl",1994),wAn(622,1994,R9n),MWn.Hc=function(n){return bqn(this,n)},MWn.Zi=function(n,t,e,i,r){return yZ(this,n,t,e,i,r)},MWn.$i=function(n){Lv(this,n)},MWn.Wj=function(n){return this},MWn.ak=function(){return itn(this.e.Tg(),this.aj())},MWn._i=function(){return this.ak()},MWn.aj=function(){return Awn(this.e.Tg(),this.ak())},MWn.zk=function(){return BB(this.ak().Yj(),26).Bj()},MWn.Ak=function(){return Cvn(BB(this.ak(),18)).n},MWn.Ai=function(){return this.e},MWn.Bk=function(){return!0},MWn.Ck=function(){return!1},MWn.Dk=function(){return!1},MWn.Ek=function(){return!1},MWn.Xc=function(n){return uvn(this,n)},MWn.cj=function(n,t){var e;return e=BB(n,49),this.Dk()?this.Bk()?e.gh(this.e,this.Ak(),this.zk(),t):e.gh(this.e,Awn(e.Tg(),Cvn(BB(this.ak(),18))),null,t):e.gh(this.e,-1-this.aj(),null,t)},MWn.dj=function(n,t){var e;return e=BB(n,49),this.Dk()?this.Bk()?e.ih(this.e,this.Ak(),this.zk(),t):e.ih(this.e,Awn(e.Tg(),Cvn(BB(this.ak(),18))),null,t):e.ih(this.e,-1-this.aj(),null,t)},MWn.rk=function(){return!1},MWn.Fk=function(){return!0},MWn.wj=function(n){return x3(this.d,n)},MWn.ej=function(){return mA(this.e)},MWn.fj=function(){return 0!=this.i},MWn.ri=function(n){return Den(this.d,n)},MWn.li=function(n,t){return this.Fk()&&this.Ek()?GOn(this,n,BB(t,56)):t},MWn.Gk=function(n){return n.kh()?tfn(this.e,BB(n,49)):n},MWn.Wb=function(n){J$(this,n)},MWn.Pc=function(){return H9(this)},MWn.Qc=function(n){var t;if(this.Ek())for(t=this.i-1;t>=0;--t)Wtn(this,t);return Qwn(this,n)},MWn.Xj=function(){sqn(this)},MWn.oi=function(n,t){return _en(this,n,t)},vX(y9n,"EcoreEList",622),wAn(496,622,R9n,yH),MWn.ai=function(){return!1},MWn.aj=function(){return this.c},MWn.bj=function(){return!1},MWn.Fk=function(){return!0},MWn.hi=function(){return!0},MWn.li=function(n,t){return t},MWn.ni=function(){return!1},MWn.c=0,vX(y9n,"EObjectEList",496),wAn(85,496,R9n,$L),MWn.bj=function(){return!0},MWn.Dk=function(){return!1},MWn.rk=function(){return!0},vX(y9n,"EObjectContainmentEList",85),wAn(545,85,R9n,LL),MWn.ci=function(){this.b=!0},MWn.fj=function(){return this.b},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.b,this.b=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.b=!1},MWn.b=!1,vX(y9n,"EObjectContainmentEList/Unsettable",545),wAn(1140,545,R9n,YG),MWn.ii=function(n,t){var e,i;return e=BB(Iln(this,n,t),87),mA(this.e)&&Lv(this,new j9(this.a,7,(gWn(),a$t),iln(t),cL(i=e.c,88)?BB(i,26):d$t,n)),e},MWn.jj=function(n,t){return Zwn(this,BB(n,87),t)},MWn.kj=function(n,t){return Jwn(this,BB(n,87),t)},MWn.lj=function(n,t,e){return _jn(this,BB(n,87),BB(t,87),e)},MWn.Zi=function(n,t,e,i,r){switch(n){case 3:return yZ(this,n,t,e,i,this.i>1);case 5:return yZ(this,n,t,e,i,this.i-BB(e,15).gc()>0);default:return new N7(this.e,n,this.c,t,e,i,!0)}},MWn.ij=function(){return!0},MWn.fj=function(){return Rvn(this)},MWn.Xj=function(){sqn(this)},vX(l6n,"EClassImpl/1",1140),wAn(1154,1153,Z8n),MWn.ui=function(n){var t,e,i,r,c,a,u;if(8!=(e=n.xi())){if(0==(i=apn(n)))switch(e){case 1:case 9:null!=(u=n.Bi())&&(!(t=P5(BB(u,473))).c&&(t.c=new Bo),snn(t.c,n.Ai())),null!=(a=n.zi())&&0==(1&(r=BB(a,473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),f9(t.c,BB(n.Ai(),26)));break;case 3:null!=(a=n.zi())&&0==(1&(r=BB(a,473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),f9(t.c,BB(n.Ai(),26)));break;case 5:if(null!=(a=n.zi()))for(c=BB(a,14).Kc();c.Ob();)0==(1&(r=BB(c.Pb(),473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),f9(t.c,BB(n.Ai(),26)));break;case 4:null!=(u=n.Bi())&&0==(1&(r=BB(u,473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),snn(t.c,n.Ai()));break;case 6:if(null!=(u=n.Bi()))for(c=BB(u,14).Kc();c.Ob();)0==(1&(r=BB(c.Pb(),473)).Bb)&&(!(t=P5(r)).c&&(t.c=new Bo),snn(t.c,n.Ai()))}this.Hk(i)}},MWn.Hk=function(n){dRn(this,n)},MWn.b=63,vX(l6n,"ESuperAdapter",1154),wAn(1155,1154,Z8n,dp),MWn.Hk=function(n){ACn(this,n)},vX(l6n,"EClassImpl/10",1155),wAn(1144,696,R9n),MWn.Vh=function(n,t){return BTn(this,n,t)},MWn.Wh=function(n){return bmn(this,n)},MWn.Xh=function(n,t){Ifn(this,n,t)},MWn.Yh=function(n){c6(this,n)},MWn.pi=function(n){return F9(this,n)},MWn.mi=function(n,t){return onn(this,n,t)},MWn.lk=function(n,t){throw Hp(new pv)},MWn.Zh=function(){return new ax(this)},MWn.$h=function(){return new ux(this)},MWn._h=function(n){return sin(this,n)},MWn.mk=function(n,t){throw Hp(new pv)},MWn.Wj=function(n){return this},MWn.fj=function(){return 0!=this.i},MWn.Wb=function(n){throw Hp(new pv)},MWn.Xj=function(){throw Hp(new pv)},vX(y9n,"EcoreEList/UnmodifiableEList",1144),wAn(319,1144,R9n,NO),MWn.ni=function(){return!1},vX(y9n,"EcoreEList/UnmodifiableEList/FastCompare",319),wAn(1147,319,R9n,don),MWn.Xc=function(n){var t,e;if(cL(n,170)&&-1!=(t=BB(n,170).aj()))for(e=this.i;t<e;++t)if(GI(this.g[t])===GI(n))return t;return-1},vX(l6n,"EClassImpl/1EAllStructuralFeaturesList",1147),wAn(1141,497,h8n,Eo),MWn.ri=function(n){return x8(VAt,B9n,87,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/1EGenericSuperTypeEList",1141),wAn(623,497,h8n,To),MWn.ri=function(n){return x8(FAt,N9n,170,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/1EStructuralFeatureUniqueEList",623),wAn(741,497,h8n,Mo),MWn.ri=function(n){return x8(JAt,N9n,18,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/1ReferenceList",741),wAn(1142,497,h8n,gp),MWn.bi=function(n,t){tz(this,BB(t,34))},MWn.ri=function(n){return x8(BAt,N9n,34,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/2",1142),wAn(1143,497,h8n,So),MWn.ri=function(n){return x8(BAt,N9n,34,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/3",1143),wAn(1145,319,R9n,EH),MWn.Fc=function(n){return mB(this,BB(n,34))},MWn.Yh=function(n){JE(this,BB(n,34))},vX(l6n,"EClassImpl/4",1145),wAn(1146,319,R9n,TH),MWn.Fc=function(n){return yB(this,BB(n,18))},MWn.Yh=function(n){ZE(this,BB(n,18))},vX(l6n,"EClassImpl/5",1146),wAn(1148,497,h8n,Po),MWn.ri=function(n){return x8(QAt,x9n,59,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/6",1148),wAn(1149,497,h8n,Co),MWn.ri=function(n){return x8(JAt,N9n,18,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/7",1149),wAn(1997,1996,{3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1,69:1}),MWn.Vh=function(n,t){return uFn(this,n,t)},MWn.Wh=function(n){return uFn(this,this.Vi(),n)},MWn.Xh=function(n,t){eAn(this,n,t)},MWn.Yh=function(n){OOn(this,n)},MWn.lk=function(n,t){return wmn(this,n,t)},MWn.mk=function(n,t){return Fpn(this,n,t)},MWn.mi=function(n,t){return oFn(this,n,t)},MWn.pi=function(n){return this.Oi(n)},MWn.Zh=function(){return new ax(this)},MWn.Gi=function(){return this.Ji()},MWn.$h=function(){return new ux(this)},MWn._h=function(n){return sin(this,n)},vX(y9n,"DelegatingNotifyingInternalEListImpl",1997),wAn(742,1997,H9n),MWn.ai=function(){var n;return cL(n=itn(jY(this.b),this.aj()).Yj(),148)&&!cL(n,457)&&0==(1&n.Bj().i)},MWn.Hc=function(n){var t,e,i,r,c,a,u;if(this.Fk()){if((u=this.Vi())>4){if(!this.wj(n))return!1;if(this.rk()){if(a=(t=(e=BB(n,49)).Ug())==this.b&&(this.Dk()?e.Og(e.Vg(),BB(itn(jY(this.b),this.aj()).Yj(),26).Bj())==Cvn(BB(itn(jY(this.b),this.aj()),18)).n:-1-e.Vg()==this.aj()),this.Ek()&&!a&&!t&&e.Zg())for(i=0;i<u;++i)if(GI(Gz(this,this.Oi(i)))===GI(n))return!0;return a}if(this.Dk()&&!this.Ck()){if(GI(r=BB(n,56).ah(Cvn(BB(itn(jY(this.b),this.aj()),18))))===GI(this.b))return!0;if(null==r||!BB(r,56).kh())return!1}}if(c=this.Li(n),this.Ek()&&!c)for(i=0;i<u;++i)if(GI(e=Gz(this,this.Oi(i)))===GI(n))return!0;return c}return this.Li(n)},MWn.Zi=function(n,t,e,i,r){return new N7(this.b,n,this.aj(),t,e,i,r)},MWn.$i=function(n){ban(this.b,n)},MWn.Wj=function(n){return this},MWn._i=function(){return itn(jY(this.b),this.aj())},MWn.aj=function(){return Awn(jY(this.b),itn(jY(this.b),this.aj()))},MWn.Ai=function(){return this.b},MWn.Bk=function(){return!!itn(jY(this.b),this.aj()).Yj().Bj()},MWn.bj=function(){var n;return!(!cL(n=itn(jY(this.b),this.aj()),99)||0==(BB(n,18).Bb&h6n)&&!Cvn(BB(n,18)))},MWn.Ck=function(){var n,t,e;return!!cL(n=itn(jY(this.b),this.aj()),99)&&!!(t=Cvn(BB(n,18)))&&((e=t.t)>1||-1==e)},MWn.Dk=function(){var n;return!!cL(n=itn(jY(this.b),this.aj()),99)&&!!Cvn(BB(n,18))},MWn.Ek=function(){var n;return!!cL(n=itn(jY(this.b),this.aj()),99)&&0!=(BB(n,18).Bb&BQn)},MWn.Xc=function(n){var t,e,i;if((e=this.Qi(n))>=0)return e;if(this.Fk())for(t=0,i=this.Vi();t<i;++t)if(GI(Gz(this,this.Oi(t)))===GI(n))return t;return-1},MWn.cj=function(n,t){var e;return e=BB(n,49),this.Dk()?this.Bk()?e.gh(this.b,Cvn(BB(itn(jY(this.b),this.aj()),18)).n,BB(itn(jY(this.b),this.aj()).Yj(),26).Bj(),t):e.gh(this.b,Awn(e.Tg(),Cvn(BB(itn(jY(this.b),this.aj()),18))),null,t):e.gh(this.b,-1-this.aj(),null,t)},MWn.dj=function(n,t){var e;return e=BB(n,49),this.Dk()?this.Bk()?e.ih(this.b,Cvn(BB(itn(jY(this.b),this.aj()),18)).n,BB(itn(jY(this.b),this.aj()).Yj(),26).Bj(),t):e.ih(this.b,Awn(e.Tg(),Cvn(BB(itn(jY(this.b),this.aj()),18))),null,t):e.ih(this.b,-1-this.aj(),null,t)},MWn.rk=function(){var n;return!!cL(n=itn(jY(this.b),this.aj()),99)&&0!=(BB(n,18).Bb&h6n)},MWn.Fk=function(){return cL(itn(jY(this.b),this.aj()).Yj(),88)},MWn.wj=function(n){return itn(jY(this.b),this.aj()).Yj().wj(n)},MWn.ej=function(){return mA(this.b)},MWn.fj=function(){return!this.Ri()},MWn.hi=function(){return itn(jY(this.b),this.aj()).hi()},MWn.li=function(n,t){return eGn(this,n,t)},MWn.Wb=function(n){vqn(this),pX(this,BB(n,15))},MWn.Pc=function(){var n;if(this.Ek())for(n=this.Vi()-1;n>=0;--n)eGn(this,n,this.Oi(n));return this.Wi()},MWn.Qc=function(n){var t;if(this.Ek())for(t=this.Vi()-1;t>=0;--t)eGn(this,t,this.Oi(t));return this.Xi(n)},MWn.Xj=function(){vqn(this)},MWn.oi=function(n,t){return B9(this,n,t)},vX(y9n,"DelegatingEcoreEList",742),wAn(1150,742,H9n,uR),MWn.Hi=function(n,t){lD(this,n,BB(t,26))},MWn.Ii=function(n){e$(this,BB(n,26))},MWn.Oi=function(n){var t;return cL(t=BB(Wtn(a4(this.a),n),87).c,88)?BB(t,26):(gWn(),d$t)},MWn.Ti=function(n){var t;return cL(t=BB(fDn(a4(this.a),n),87).c,88)?BB(t,26):(gWn(),d$t)},MWn.Ui=function(n,t){return dmn(this,n,BB(t,26))},MWn.ai=function(){return!1},MWn.Zi=function(n,t,e,i,r){return null},MWn.Ji=function(){return new pp(this)},MWn.Ki=function(){sqn(a4(this.a))},MWn.Li=function(n){return Ufn(this,n)},MWn.Mi=function(n){var t;for(t=n.Kc();t.Ob();)if(!Ufn(this,t.Pb()))return!1;return!0},MWn.Ni=function(n){var t,e,i;if(cL(n,15)&&(i=BB(n,15)).gc()==a4(this.a).i){for(t=i.Kc(),e=new AL(this);t.Ob();)if(GI(t.Pb())!==GI(kpn(e)))return!1;return!0}return!1},MWn.Pi=function(){var n,t,e,i;for(t=1,n=new AL(a4(this.a));n.e!=n.i.gc();)t=31*t+((e=cL(i=BB(kpn(n),87).c,88)?BB(i,26):(gWn(),d$t))?PN(e):0);return t},MWn.Qi=function(n){var t,e,i,r;for(i=0,e=new AL(a4(this.a));e.e!=e.i.gc();){if(t=BB(kpn(e),87),GI(n)===GI(cL(r=t.c,88)?BB(r,26):(gWn(),d$t)))return i;++i}return-1},MWn.Ri=function(){return 0==a4(this.a).i},MWn.Si=function(){return null},MWn.Vi=function(){return a4(this.a).i},MWn.Wi=function(){var n,t,e,i,r,c;for(c=a4(this.a).i,r=x8(Ant,HWn,1,c,5,1),e=0,t=new AL(a4(this.a));t.e!=t.i.gc();)n=BB(kpn(t),87),r[e++]=cL(i=n.c,88)?BB(i,26):(gWn(),d$t);return r},MWn.Xi=function(n){var t,e,i,r;for(r=a4(this.a).i,n.length<r&&(n=Den(tsn(n).c,r)),n.length>r&&$X(n,r,null),e=0,t=new AL(a4(this.a));t.e!=t.i.gc();)$X(n,e++,cL(i=BB(kpn(t),87).c,88)?BB(i,26):(gWn(),d$t));return n},MWn.Yi=function(){var n,t,e,i,r;for((r=new Sk).a+="[",n=a4(this.a),t=0,i=a4(this.a).i;t<i;)cO(r,kN(cL(e=BB(Wtn(n,t),87).c,88)?BB(e,26):(gWn(),d$t))),++t<i&&(r.a+=FWn);return r.a+="]",r.a},MWn.$i=function(n){},MWn.aj=function(){return 10},MWn.Bk=function(){return!0},MWn.bj=function(){return!1},MWn.Ck=function(){return!1},MWn.Dk=function(){return!1},MWn.Ek=function(){return!0},MWn.rk=function(){return!1},MWn.Fk=function(){return!0},MWn.wj=function(n){return cL(n,88)},MWn.fj=function(){return Q0(this.a)},MWn.hi=function(){return!0},MWn.ni=function(){return!0},vX(l6n,"EClassImpl/8",1150),wAn(1151,1964,LVn,pp),MWn.Zc=function(n){return sin(this.a,n)},MWn.gc=function(){return a4(this.a.a).i},vX(l6n,"EClassImpl/8/1",1151),wAn(1152,497,h8n,Io),MWn.ri=function(n){return x8(HAt,HWn,138,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"EClassImpl/9",1152),wAn(1139,53,eYn,Im),vX(l6n,"EClassImpl/MyHashSet",1139),wAn(566,351,{105:1,92:1,90:1,138:1,148:1,834:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,150:1,114:1,115:1,676:1},Ev),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return null!=this.D?this.D:this.B;case 3:return iyn(this);case 4:return this.zj();case 5:return this.F;case 6:return t?Utn(this):wZ(this);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),this.A;case 8:return hN(),0!=(256&this.Bb)}return U9(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.D&&this.D==this.F;case 3:return!!iyn(this);case 4:return null!=this.zj();case 5:return null!=this.F&&this.F!=this.D&&this.F!=this.B;case 6:return!!wZ(this);case 7:return!!this.A&&0!=this.A.i;case 8:return 0==(256&this.Bb)}return O3(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void ZZ(this,SD(t));case 2:return void IA(this,SD(t));case 5:return void Yqn(this,SD(t));case 7:return!this.A&&(this.A=new NL(O$t,this,7)),sqn(this.A),!this.A&&(this.A=new NL(O$t,this,7)),void pX(this.A,BB(t,14));case 8:return void Zfn(this,qy(TD(t)))}Lbn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n),t)},MWn.zh=function(){return gWn(),u$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,179)&&(BB(this.Cb,179).tb=null),void Nrn(this,null);case 2:return Dsn(this,null),void xen(this,this.D);case 5:return void Yqn(this,null);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),void sqn(this.A);case 8:return void Zfn(this,!0)}qfn(this,n-bX(this.zh()),itn(BB(yan(this,16),26)||this.zh(),n))},MWn.Gh=function(){Cfn((IPn(),Z$t),this).ne(),this.Bb|=1},MWn.Fj=function(){var n,t;if(!this.c&&!(n=G$n(Utn(this))).dc())for(t=n.Kc();t.Ob();)N_n(this,SD(t.Pb()))&&Rln(this);return this.b},MWn.zj=function(){var n;if(!this.e){n=null;try{n=iyn(this)}catch(t){if(!cL(t=lun(t),102))throw Hp(t)}this.d=null,n&&0!=(1&n.i)&&(this.d=n==$Nt?(hN(),ptt):n==ANt?iln(0):n==DNt?new Nb(0):n==xNt?0:n==LNt?jgn(0):n==RNt?rln(0):n==NNt?Pnn(0):fun(0)),this.e=!0}return this.d},MWn.Ej=function(){return 0!=(256&this.Bb)},MWn.Ik=function(n){n&&(this.D="org.eclipse.emf.common.util.AbstractEnumerator")},MWn.xk=function(n){Urn(this,n),this.Ik(n)},MWn.yk=function(n){this.C=n,this.e=!1},MWn.Ib=function(){var n;return 0!=(64&this.Db)?Cwn(this):((n=new fN(Cwn(this))).a+=" (serializable: ",yE(n,0!=(256&this.Bb)),n.a+=")",n.a)},MWn.c=!1,MWn.d=null,MWn.e=!1,vX(l6n,"EDataTypeImpl",566),wAn(457,566,{105:1,92:1,90:1,138:1,148:1,834:1,671:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,457:1,150:1,114:1,115:1,676:1},Am),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return null!=this.D?this.D:this.B;case 3:return iyn(this);case 4:return Qsn(this);case 5:return this.F;case 6:return t?Utn(this):wZ(this);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),this.A;case 8:return hN(),0!=(256&this.Bb);case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),this.a}return U9(this,n-bX((gWn(),o$t)),itn(BB(yan(this,16),26)||o$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 6:return this.Cb&&(e=(i=this.Db>>16)>=0?fyn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,6,e);case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),Ywn(this.a,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),o$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),o$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 6:return T_n(this,null,6,e);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),_pn(this.A,n,e);case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),_pn(this.a,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),o$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),o$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return null!=this.D&&this.D==this.F;case 3:return!!iyn(this);case 4:return!!Qsn(this);case 5:return null!=this.F&&this.F!=this.D&&this.F!=this.B;case 6:return!!wZ(this);case 7:return!!this.A&&0!=this.A.i;case 8:return 0==(256&this.Bb);case 9:return!!this.a&&0!=this.a.i}return O3(this,n-bX((gWn(),o$t)),itn(BB(yan(this,16),26)||o$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void ZZ(this,SD(t));case 2:return void IA(this,SD(t));case 5:return void Yqn(this,SD(t));case 7:return!this.A&&(this.A=new NL(O$t,this,7)),sqn(this.A),!this.A&&(this.A=new NL(O$t,this,7)),void pX(this.A,BB(t,14));case 8:return void Zfn(this,qy(TD(t)));case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),sqn(this.a),!this.a&&(this.a=new eU(WAt,this,9,5)),void pX(this.a,BB(t,14))}Lbn(this,n-bX((gWn(),o$t)),itn(BB(yan(this,16),26)||o$t,n),t)},MWn.zh=function(){return gWn(),o$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,179)&&(BB(this.Cb,179).tb=null),void Nrn(this,null);case 2:return Dsn(this,null),void xen(this,this.D);case 5:return void Yqn(this,null);case 7:return!this.A&&(this.A=new NL(O$t,this,7)),void sqn(this.A);case 8:return void Zfn(this,!0);case 9:return!this.a&&(this.a=new eU(WAt,this,9,5)),void sqn(this.a)}qfn(this,n-bX((gWn(),o$t)),itn(BB(yan(this,16),26)||o$t,n))},MWn.Gh=function(){var n,t;if(this.a)for(n=0,t=this.a.i;n<t;++n)vx(Wtn(this.a,n));Cfn((IPn(),Z$t),this).ne(),this.Bb|=1},MWn.zj=function(){return Qsn(this)},MWn.wj=function(n){return null!=n},MWn.Ik=function(n){},vX(l6n,"EEnumImpl",457),wAn(573,438,{105:1,92:1,90:1,1940:1,678:1,147:1,191:1,56:1,108:1,49:1,97:1,573:1,150:1,114:1,115:1},jv),MWn.ne=function(){return this.zb},MWn.Qg=function(n){return lkn(this,n)},MWn._g=function(n,t,e){var i;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return iln(this.d);case 3:return this.b?this.b:this.a;case 4:return null==(i=this.c)?this.zb:i;case 5:return this.Db>>16==5?BB(this.Cb,671):null}return U9(this,n-bX((gWn(),s$t)),itn(BB(yan(this,16),26)||s$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 5:return this.Cb&&(e=(i=this.Db>>16)>=0?lkn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,5,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),s$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),s$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 5:return T_n(this,null,5,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),s$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),s$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0!=this.d;case 3:return!!this.b;case 4:return null!=this.c;case 5:return!(this.Db>>16!=5||!BB(this.Cb,671))}return O3(this,n-bX((gWn(),s$t)),itn(BB(yan(this,16),26)||s$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void Nrn(this,SD(t));case 2:return void $en(this,BB(t,19).a);case 3:return void gOn(this,BB(t,1940));case 4:return void Fin(this,SD(t))}Lbn(this,n-bX((gWn(),s$t)),itn(BB(yan(this,16),26)||s$t,n),t)},MWn.zh=function(){return gWn(),s$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Nrn(this,null);case 2:return void $en(this,0);case 3:return void gOn(this,null);case 4:return void Fin(this,null)}qfn(this,n-bX((gWn(),s$t)),itn(BB(yan(this,16),26)||s$t,n))},MWn.Ib=function(){var n;return null==(n=this.c)?this.zb:n},MWn.b=null,MWn.c=null,MWn.d=0,vX(l6n,"EEnumLiteralImpl",573);var L$t,N$t,x$t,D$t=bq(l6n,"EFactoryImpl/InternalEDateTimeFormat");wAn(489,1,{2015:1},vp),vX(l6n,"EFactoryImpl/1ClientInternalEDateTimeFormat",489),wAn(241,115,{105:1,92:1,90:1,87:1,56:1,108:1,49:1,97:1,241:1,114:1,115:1},Kp),MWn.Sg=function(n,t,e){var i;return e=T_n(this,n,t,e),this.e&&cL(n,170)&&(i=kLn(this,this.e))!=this.c&&(e=azn(this,i,e)),e},MWn._g=function(n,t,e){switch(n){case 0:return this.f;case 1:return!this.d&&(this.d=new $L(VAt,this,1)),this.d;case 2:return t?lFn(this):this.c;case 3:return this.b;case 4:return this.e;case 5:return t?qvn(this):this.a}return U9(this,n-bX((gWn(),f$t)),itn(BB(yan(this,16),26)||f$t,n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return nfn(this,null,e);case 1:return!this.d&&(this.d=new $L(VAt,this,1)),_pn(this.d,n,e);case 3:return Zhn(this,null,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),f$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),f$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.f;case 1:return!!this.d&&0!=this.d.i;case 2:return!!this.c;case 3:return!!this.b;case 4:return!!this.e;case 5:return!!this.a}return O3(this,n-bX((gWn(),f$t)),itn(BB(yan(this,16),26)||f$t,n))},MWn.sh=function(n,t){switch(n){case 0:return void jEn(this,BB(t,87));case 1:return!this.d&&(this.d=new $L(VAt,this,1)),sqn(this.d),!this.d&&(this.d=new $L(VAt,this,1)),void pX(this.d,BB(t,14));case 3:return void kEn(this,BB(t,87));case 4:return void DMn(this,BB(t,836));case 5:return void cen(this,BB(t,138))}Lbn(this,n-bX((gWn(),f$t)),itn(BB(yan(this,16),26)||f$t,n),t)},MWn.zh=function(){return gWn(),f$t},MWn.Bh=function(n){switch(n){case 0:return void jEn(this,null);case 1:return!this.d&&(this.d=new $L(VAt,this,1)),void sqn(this.d);case 3:return void kEn(this,null);case 4:return void DMn(this,null);case 5:return void cen(this,null)}qfn(this,n-bX((gWn(),f$t)),itn(BB(yan(this,16),26)||f$t,n))},MWn.Ib=function(){var n;return(n=new lN(P$n(this))).a+=" (expression: ",bHn(this,n),n.a+=")",n.a},vX(l6n,"EGenericTypeImpl",241),wAn(1969,1964,q9n),MWn.Xh=function(n,t){nR(this,n,t)},MWn.lk=function(n,t){return nR(this,this.gc(),n),t},MWn.pi=function(n){return Dpn(this.Gi(),n)},MWn.Zh=function(){return this.$h()},MWn.Gi=function(){return new Pp(this)},MWn.$h=function(){return this._h(0)},MWn._h=function(n){return this.Gi().Zc(n)},MWn.mk=function(n,t){return ywn(this,n,!0),t},MWn.ii=function(n,t){var e;return e=tkn(this,t),this.Zc(n).Rb(e),e},MWn.ji=function(n,t){ywn(this,t,!0),this.Zc(n).Rb(t)},vX(y9n,"AbstractSequentialInternalEList",1969),wAn(486,1969,q9n,QN),MWn.pi=function(n){return Dpn(this.Gi(),n)},MWn.Zh=function(){return null==this.b?(YM(),YM(),x$t):this.Jk()},MWn.Gi=function(){return new DO(this.a,this.b)},MWn.$h=function(){return null==this.b?(YM(),YM(),x$t):this.Jk()},MWn._h=function(n){var t,e;if(null==this.b){if(n<0||n>1)throw Hp(new Ay(e9n+n+", size=0"));return YM(),YM(),x$t}for(e=this.Jk(),t=0;t<n;++t)Man(e);return e},MWn.dc=function(){var n,t,e,i,r,c;if(null!=this.b)for(e=0;e<this.b.length;++e)if(n=this.b[e],!this.Mk()||this.a.mh(n))if(c=this.a.bh(n,!1),ZM(),BB(n,66).Oj()){for(i=0,r=(t=BB(c,153)).gc();i<r;++i)if(wX(t.il(i))&&null!=t.jl(i))return!1}else if(n.$j()){if(!BB(c,14).dc())return!1}else if(null!=c)return!1;return!0},MWn.Kc=function(){return Ern(this)},MWn.Zc=function(n){var t,e;if(null==this.b){if(0!=n)throw Hp(new Ay(e9n+n+", size=0"));return YM(),YM(),x$t}for(e=this.Lk()?this.Kk():this.Jk(),t=0;t<n;++t)Man(e);return e},MWn.ii=function(n,t){throw Hp(new pv)},MWn.ji=function(n,t){throw Hp(new pv)},MWn.Jk=function(){return new YN(this.a,this.b)},MWn.Kk=function(){return new Vx(this.a,this.b)},MWn.Lk=function(){return!0},MWn.gc=function(){var n,t,e,i,r,c,a;if(r=0,null!=this.b)for(e=0;e<this.b.length;++e)if(n=this.b[e],!this.Mk()||this.a.mh(n))if(a=this.a.bh(n,!1),ZM(),BB(n,66).Oj())for(i=0,c=(t=BB(a,153)).gc();i<c;++i)wX(t.il(i))&&null!=t.jl(i)&&++r;else n.$j()?r+=BB(a,14).gc():null!=a&&++r;return r},MWn.Mk=function(){return!0},vX(y9n,"EContentsEList",486),wAn(1156,486,q9n,Wx),MWn.Jk=function(){return new Qx(this.a,this.b)},MWn.Kk=function(){return new Yx(this.a,this.b)},MWn.Mk=function(){return!1},vX(l6n,"ENamedElementImpl/1",1156),wAn(279,1,G9n,YN),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){throw Hp(new pv)},MWn.Nk=function(n){if(0!=this.g||this.e)throw Hp(new Fy("Iterator already in use or already filtered"));this.e=n},MWn.Ob=function(){var n,t,e,i,r,c;switch(this.g){case 3:case 2:return!0;case 1:return!1;case-3:this.p?this.p.Pb():++this.n;default:if(this.k&&(this.p?kPn(this,this.p):pOn(this)))return r=this.p?this.p.Pb():this.j?this.j.pi(this.n++):this.k.Xb(this.n++),this.f?((n=BB(r,72)).ak(),e=n.dd(),this.i=e):(e=r,this.i=e),this.g=3,!0;for(;this.d<this.c.length;)if(t=this.c[this.d++],(!this.e||t.Gj()!=NOt||0!=t.aj())&&(!this.Mk()||this.b.mh(t)))if(c=this.b.bh(t,this.Lk()),this.f=(ZM(),BB(t,66).Oj()),this.f||t.$j()){if(this.Lk()?(i=BB(c,15),this.k=i):(i=BB(c,69),this.k=this.j=i),cL(this.k,54)?(this.p=null,this.o=this.k.gc(),this.n=0):this.p=this.j?this.j.$h():this.k.Yc(),this.p?kPn(this,this.p):pOn(this))return r=this.p?this.p.Pb():this.j?this.j.pi(this.n++):this.k.Xb(this.n++),this.f?((n=BB(r,72)).ak(),e=n.dd(),this.i=e):(e=r,this.i=e),this.g=3,!0}else if(null!=c)return this.k=null,this.p=null,e=c,this.i=e,this.g=2,!0;return this.k=null,this.p=null,this.f=!1,this.g=1,!1}},MWn.Sb=function(){var n,t,e,i,r,c;switch(this.g){case-3:case-2:return!0;case-1:return!1;case 3:this.p?this.p.Ub():--this.n;default:if(this.k&&(this.p?jPn(this,this.p):wCn(this)))return r=this.p?this.p.Ub():this.j?this.j.pi(--this.n):this.k.Xb(--this.n),this.f?((n=BB(r,72)).ak(),e=n.dd(),this.i=e):(e=r,this.i=e),this.g=-3,!0;for(;this.d>0;)if(t=this.c[--this.d],(!this.e||t.Gj()!=NOt||0!=t.aj())&&(!this.Mk()||this.b.mh(t)))if(c=this.b.bh(t,this.Lk()),this.f=(ZM(),BB(t,66).Oj()),this.f||t.$j()){if(this.Lk()?(i=BB(c,15),this.k=i):(i=BB(c,69),this.k=this.j=i),cL(this.k,54)?(this.o=this.k.gc(),this.n=this.o):this.p=this.j?this.j._h(this.k.gc()):this.k.Zc(this.k.gc()),this.p?jPn(this,this.p):wCn(this))return r=this.p?this.p.Ub():this.j?this.j.pi(--this.n):this.k.Xb(--this.n),this.f?((n=BB(r,72)).ak(),e=n.dd(),this.i=e):(e=r,this.i=e),this.g=-3,!0}else if(null!=c)return this.k=null,this.p=null,e=c,this.i=e,this.g=-2,!0;return this.k=null,this.p=null,this.g=-1,!1}},MWn.Pb=function(){return Man(this)},MWn.Tb=function(){return this.a},MWn.Ub=function(){var n;if(this.g<-1||this.Sb())return--this.a,this.g=0,n=this.i,this.Sb(),n;throw Hp(new yv)},MWn.Vb=function(){return this.a-1},MWn.Qb=function(){throw Hp(new pv)},MWn.Lk=function(){return!1},MWn.Wb=function(n){throw Hp(new pv)},MWn.Mk=function(){return!0},MWn.a=0,MWn.d=0,MWn.f=!1,MWn.g=0,MWn.n=0,MWn.o=0,vX(y9n,"EContentsEList/FeatureIteratorImpl",279),wAn(697,279,G9n,Vx),MWn.Lk=function(){return!0},vX(y9n,"EContentsEList/ResolvingFeatureIteratorImpl",697),wAn(1157,697,G9n,Yx),MWn.Mk=function(){return!1},vX(l6n,"ENamedElementImpl/1/1",1157),wAn(1158,279,G9n,Qx),MWn.Mk=function(){return!1},vX(l6n,"ENamedElementImpl/1/2",1158),wAn(36,143,t9n,f4,l4,nU,k9,N7,t6,Hen,S0,qen,P0,J5,C0,Uen,I0,Z5,O0,Gen,A0,tU,j9,GQ,zen,$0,n6,L0),MWn._i=function(){return h9(this)},MWn.gj=function(){var n;return(n=h9(this))?n.zj():null},MWn.yi=function(n){return-1==this.b&&this.a&&(this.b=this.c.Xg(this.a.aj(),this.a.Gj())),this.c.Og(this.b,n)},MWn.Ai=function(){return this.c},MWn.hj=function(){var n;return!!(n=h9(this))&&n.Kj()},MWn.b=-1,vX(l6n,"ENotificationImpl",36),wAn(399,284,{105:1,92:1,90:1,147:1,191:1,56:1,59:1,108:1,472:1,49:1,97:1,150:1,399:1,284:1,114:1,115:1},$m),MWn.Qg=function(n){return Pkn(this,n)},MWn._g=function(n,t,e){var i;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),(i=this.t)>1||-1==i;case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return this.Db>>16==10?BB(this.Cb,26):null;case 11:return!this.d&&(this.d=new NL(O$t,this,11)),this.d;case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),this.c;case 13:return!this.a&&(this.a=new oR(this,this)),this.a;case 14:return H7(this)}return U9(this,n-bX((gWn(),g$t)),itn(BB(yan(this,16),26)||g$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 10:return this.Cb&&(e=(i=this.Db>>16)>=0?Pkn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,10,e);case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),Ywn(this.c,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),g$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),g$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 9:return gX(this,e);case 10:return T_n(this,null,10,e);case 11:return!this.d&&(this.d=new NL(O$t,this,11)),_pn(this.d,n,e);case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),_pn(this.c,n,e);case 14:return _pn(H7(this),n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),g$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),g$t)),n,e)},MWn.lh=function(n){var t;switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return(t=this.t)>1||-1==t;case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return!(this.Db>>16!=10||!BB(this.Cb,26));case 11:return!!this.d&&0!=this.d.i;case 12:return!!this.c&&0!=this.c.i;case 13:return!(!this.a||0==H7(this.a.a).i||this.b&&Kvn(this.b));case 14:return!!this.b&&Kvn(this.b)}return O3(this,n-bX((gWn(),g$t)),itn(BB(yan(this,16),26)||g$t,n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void Nrn(this,SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void Nen(this,BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi());case 11:return!this.d&&(this.d=new NL(O$t,this,11)),sqn(this.d),!this.d&&(this.d=new NL(O$t,this,11)),void pX(this.d,BB(t,14));case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),sqn(this.c),!this.c&&(this.c=new eU(YAt,this,12,10)),void pX(this.c,BB(t,14));case 13:return!this.a&&(this.a=new oR(this,this)),vqn(this.a),!this.a&&(this.a=new oR(this,this)),void pX(this.a,BB(t,14));case 14:return sqn(H7(this)),void pX(H7(this),BB(t,14))}Lbn(this,n-bX((gWn(),g$t)),itn(BB(yan(this,16),26)||g$t,n),t)},MWn.zh=function(){return gWn(),g$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Nrn(this,null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return void Nen(this,1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi());case 11:return!this.d&&(this.d=new NL(O$t,this,11)),void sqn(this.d);case 12:return!this.c&&(this.c=new eU(YAt,this,12,10)),void sqn(this.c);case 13:return void(this.a&&vqn(this.a));case 14:return void(this.b&&sqn(this.b))}qfn(this,n-bX((gWn(),g$t)),itn(BB(yan(this,16),26)||g$t,n))},MWn.Gh=function(){var n,t;if(this.c)for(n=0,t=this.c.i;n<t;++n)vx(Wtn(this.c,n));Ikn(this),this.Bb|=1},vX(l6n,"EOperationImpl",399),wAn(505,742,H9n,oR),MWn.Hi=function(n,t){fD(this,n,BB(t,138))},MWn.Ii=function(n){i$(this,BB(n,138))},MWn.Oi=function(n){return BB(Wtn(H7(this.a),n),87).c||(gWn(),l$t)},MWn.Ti=function(n){return BB(fDn(H7(this.a),n),87).c||(gWn(),l$t)},MWn.Ui=function(n,t){return bgn(this,n,BB(t,138))},MWn.ai=function(){return!1},MWn.Zi=function(n,t,e,i,r){return null},MWn.Ji=function(){return new mp(this)},MWn.Ki=function(){sqn(H7(this.a))},MWn.Li=function(n){return oln(this,n)},MWn.Mi=function(n){var t;for(t=n.Kc();t.Ob();)if(!oln(this,t.Pb()))return!1;return!0},MWn.Ni=function(n){var t,e,i;if(cL(n,15)&&(i=BB(n,15)).gc()==H7(this.a).i){for(t=i.Kc(),e=new AL(this);t.Ob();)if(GI(t.Pb())!==GI(kpn(e)))return!1;return!0}return!1},MWn.Pi=function(){var n,t,e;for(t=1,n=new AL(H7(this.a));n.e!=n.i.gc();)t=31*t+((e=BB(kpn(n),87).c||(gWn(),l$t))?nsn(e):0);return t},MWn.Qi=function(n){var t,e,i;for(i=0,e=new AL(H7(this.a));e.e!=e.i.gc();){if(t=BB(kpn(e),87),GI(n)===GI(t.c||(gWn(),l$t)))return i;++i}return-1},MWn.Ri=function(){return 0==H7(this.a).i},MWn.Si=function(){return null},MWn.Vi=function(){return H7(this.a).i},MWn.Wi=function(){var n,t,e,i,r;for(r=H7(this.a).i,i=x8(Ant,HWn,1,r,5,1),e=0,t=new AL(H7(this.a));t.e!=t.i.gc();)n=BB(kpn(t),87),i[e++]=n.c||(gWn(),l$t);return i},MWn.Xi=function(n){var t,e,i;for(i=H7(this.a).i,n.length<i&&(n=Den(tsn(n).c,i)),n.length>i&&$X(n,i,null),e=0,t=new AL(H7(this.a));t.e!=t.i.gc();)$X(n,e++,BB(kpn(t),87).c||(gWn(),l$t));return n},MWn.Yi=function(){var n,t,e,i;for((i=new Sk).a+="[",n=H7(this.a),t=0,e=H7(this.a).i;t<e;)cO(i,kN(BB(Wtn(n,t),87).c||(gWn(),l$t))),++t<e&&(i.a+=FWn);return i.a+="]",i.a},MWn.$i=function(n){},MWn.aj=function(){return 13},MWn.Bk=function(){return!0},MWn.bj=function(){return!1},MWn.Ck=function(){return!1},MWn.Dk=function(){return!1},MWn.Ek=function(){return!0},MWn.rk=function(){return!1},MWn.Fk=function(){return!0},MWn.wj=function(n){return cL(n,138)},MWn.fj=function(){return V0(this.a)},MWn.hi=function(){return!0},MWn.ni=function(){return!0},vX(l6n,"EOperationImpl/1",505),wAn(1340,1964,LVn,mp),MWn.Zc=function(n){return sin(this.a,n)},MWn.gc=function(){return H7(this.a.a).i},vX(l6n,"EOperationImpl/1/1",1340),wAn(1341,545,R9n,JG),MWn.ii=function(n,t){var e;return e=BB(Iln(this,n,t),87),mA(this.e)&&Lv(this,new j9(this.a,7,(gWn(),p$t),iln(t),e.c||l$t,n)),e},MWn.jj=function(n,t){return Mfn(this,BB(n,87),t)},MWn.kj=function(n,t){return Sfn(this,BB(n,87),t)},MWn.lj=function(n,t,e){return Wgn(this,BB(n,87),BB(t,87),e)},MWn.Zi=function(n,t,e,i,r){switch(n){case 3:return yZ(this,n,t,e,i,this.i>1);case 5:return yZ(this,n,t,e,i,this.i-BB(e,15).gc()>0);default:return new N7(this.e,n,this.c,t,e,i,!0)}},MWn.ij=function(){return!0},MWn.fj=function(){return Kvn(this)},MWn.Xj=function(){sqn(this)},vX(l6n,"EOperationImpl/2",1341),wAn(498,1,{1938:1,498:1},OI),vX(l6n,"EPackageImpl/1",498),wAn(16,85,R9n,eU),MWn.zk=function(){return this.d},MWn.Ak=function(){return this.b},MWn.Dk=function(){return!0},MWn.b=0,vX(y9n,"EObjectContainmentWithInverseEList",16),wAn(353,16,R9n,eK),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectContainmentWithInverseEList/Resolving",353),wAn(298,353,R9n,Jz),MWn.ci=function(){this.a.tb=null},vX(l6n,"EPackageImpl/2",298),wAn(1228,1,{},Oo),vX(l6n,"EPackageImpl/3",1228),wAn(718,43,tYn,Nm),MWn._b=function(n){return XI(n)?eY(this,n):!!AY(this.f,n)},vX(l6n,"EPackageRegistryImpl",718),wAn(509,284,{105:1,92:1,90:1,147:1,191:1,56:1,2017:1,108:1,472:1,49:1,97:1,150:1,509:1,284:1,114:1,115:1},Lm),MWn.Qg=function(n){return Ckn(this,n)},MWn._g=function(n,t,e){var i;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),(i=this.t)>1||-1==i;case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return this.Db>>16==10?BB(this.Cb,59):null}return U9(this,n-bX((gWn(),m$t)),itn(BB(yan(this,16),26)||m$t,n),t,e)},MWn.hh=function(n,t,e){var i;switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),Ywn(this.Ab,n,e);case 10:return this.Cb&&(e=(i=this.Db>>16)>=0?Ckn(this,e):this.Cb.ih(this,-1-i,null,e)),T_n(this,n,10,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),m$t),t),66).Nj().Qj(this,fgn(this),t-bX((gWn(),m$t)),n,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 9:return gX(this,e);case 10:return T_n(this,null,10,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),m$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),m$t)),n,e)},MWn.lh=function(n){var t;switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return(t=this.t)>1||-1==t;case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return!(this.Db>>16!=10||!BB(this.Cb,59))}return O3(this,n-bX((gWn(),m$t)),itn(BB(yan(this,16),26)||m$t,n))},MWn.zh=function(){return gWn(),m$t},vX(l6n,"EParameterImpl",509),wAn(99,449,{105:1,92:1,90:1,147:1,191:1,56:1,18:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,99:1,449:1,284:1,114:1,115:1,677:1},pD),MWn._g=function(n,t,e){var i,r;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return hN(),0!=(256&this.Bb);case 3:return hN(),0!=(512&this.Bb);case 4:return iln(this.s);case 5:return iln(this.t);case 6:return hN(),(r=this.t)>1||-1==r;case 7:return hN(),this.s>=1;case 8:return t?Ikn(this):this.r;case 9:return this.q;case 10:return hN(),0!=(this.Bb&k6n);case 11:return hN(),0!=(this.Bb&M9n);case 12:return hN(),0!=(this.Bb&_Qn);case 13:return this.j;case 14:return qLn(this);case 15:return hN(),0!=(this.Bb&T9n);case 16:return hN(),0!=(this.Bb&hVn);case 17:return dZ(this);case 18:return hN(),0!=(this.Bb&h6n);case 19:return hN(),!(!(i=Cvn(this))||0==(i.Bb&h6n));case 20:return hN(),0!=(this.Bb&BQn);case 21:return t?Cvn(this):this.b;case 22:return t?Ion(this):K5(this);case 23:return!this.a&&(this.a=new RL(BAt,this,23)),this.a}return U9(this,n-bX((gWn(),y$t)),itn(BB(yan(this,16),26)||y$t,n),t,e)},MWn.lh=function(n){var t,e;switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return 0==(256&this.Bb);case 3:return 0==(512&this.Bb);case 4:return 0!=this.s;case 5:return 1!=this.t;case 6:return(e=this.t)>1||-1==e;case 7:return this.s>=1;case 8:return!!this.r&&!this.q.e&&0==yW(this.q).i;case 9:return!(!this.q||this.r&&!this.q.e&&0==yW(this.q).i);case 10:return 0==(this.Bb&k6n);case 11:return 0!=(this.Bb&M9n);case 12:return 0!=(this.Bb&_Qn);case 13:return null!=this.j;case 14:return null!=qLn(this);case 15:return 0!=(this.Bb&T9n);case 16:return 0!=(this.Bb&hVn);case 17:return!!dZ(this);case 18:return 0!=(this.Bb&h6n);case 19:return!!(t=Cvn(this))&&0!=(t.Bb&h6n);case 20:return 0==(this.Bb&BQn);case 21:return!!this.b;case 22:return!!K5(this);case 23:return!!this.a&&0!=this.a.i}return O3(this,n-bX((gWn(),y$t)),itn(BB(yan(this,16),26)||y$t,n))},MWn.sh=function(n,t){var e;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void JZ(this,SD(t));case 2:return void Yfn(this,qy(TD(t)));case 3:return void nln(this,qy(TD(t)));case 4:return void Len(this,BB(t,19).a);case 5:return void Nen(this,BB(t,19).a);case 8:return void Ihn(this,BB(t,138));case 9:return void((e=HTn(this,BB(t,87),null))&&e.Fi());case 10:return void Aln(this,qy(TD(t)));case 11:return void Nln(this,qy(TD(t)));case 12:return void $ln(this,qy(TD(t)));case 13:return void _I(this,SD(t));case 15:return void Lln(this,qy(TD(t)));case 16:return void qln(this,qy(TD(t)));case 18:return void YZ(this,qy(TD(t)));case 20:return void Uln(this,qy(TD(t)));case 21:return void rrn(this,BB(t,18));case 23:return!this.a&&(this.a=new RL(BAt,this,23)),sqn(this.a),!this.a&&(this.a=new RL(BAt,this,23)),void pX(this.a,BB(t,14))}Lbn(this,n-bX((gWn(),y$t)),itn(BB(yan(this,16),26)||y$t,n),t)},MWn.zh=function(){return gWn(),y$t},MWn.Bh=function(n){var t;switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return cL(this.Cb,88)&&ACn(P5(BB(this.Cb,88)),4),void Nrn(this,null);case 2:return void Yfn(this,!0);case 3:return void nln(this,!0);case 4:return void Len(this,0);case 5:return void Nen(this,1);case 8:return void Ihn(this,null);case 9:return void((t=HTn(this,null,null))&&t.Fi());case 10:return void Aln(this,!0);case 11:return void Nln(this,!1);case 12:return void $ln(this,!1);case 13:return this.i=null,void arn(this,null);case 15:return void Lln(this,!1);case 16:return void qln(this,!1);case 18:return zln(this,!1),void(cL(this.Cb,88)&&ACn(P5(BB(this.Cb,88)),2));case 20:return void Uln(this,!0);case 21:return void rrn(this,null);case 23:return!this.a&&(this.a=new RL(BAt,this,23)),void sqn(this.a)}qfn(this,n-bX((gWn(),y$t)),itn(BB(yan(this,16),26)||y$t,n))},MWn.Gh=function(){Ion(this),kV(B7((IPn(),Z$t),this)),Ikn(this),this.Bb|=1},MWn.Lj=function(){return Cvn(this)},MWn.qk=function(){var n;return!!(n=Cvn(this))&&0!=(n.Bb&h6n)},MWn.rk=function(){return 0!=(this.Bb&h6n)},MWn.sk=function(){return 0!=(this.Bb&BQn)},MWn.nk=function(n,t){return this.c=null,Pfn(this,n,t)},MWn.Ib=function(){var n;return 0!=(64&this.Db)?ERn(this):((n=new fN(ERn(this))).a+=" (containment: ",yE(n,0!=(this.Bb&h6n)),n.a+=", resolveProxies: ",yE(n,0!=(this.Bb&BQn)),n.a+=")",n.a)},vX(l6n,"EReferenceImpl",99),wAn(548,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,548:1,114:1,115:1},Ao),MWn.Fb=function(n){return this===n},MWn.cd=function(){return this.b},MWn.dd=function(){return this.c},MWn.Hb=function(){return PN(this)},MWn.Uh=function(n){vq(this,SD(n))},MWn.ed=function(n){return $H(this,SD(n))},MWn._g=function(n,t,e){switch(n){case 0:return this.b;case 1:return this.c}return U9(this,n-bX((gWn(),k$t)),itn(BB(yan(this,16),26)||k$t,n),t,e)},MWn.lh=function(n){switch(n){case 0:return null!=this.b;case 1:return null!=this.c}return O3(this,n-bX((gWn(),k$t)),itn(BB(yan(this,16),26)||k$t,n))},MWn.sh=function(n,t){switch(n){case 0:return void mq(this,SD(t));case 1:return void Kin(this,SD(t))}Lbn(this,n-bX((gWn(),k$t)),itn(BB(yan(this,16),26)||k$t,n),t)},MWn.zh=function(){return gWn(),k$t},MWn.Bh=function(n){switch(n){case 0:return void Rin(this,null);case 1:return void Kin(this,null)}qfn(this,n-bX((gWn(),k$t)),itn(BB(yan(this,16),26)||k$t,n))},MWn.Sh=function(){var n;return-1==this.a&&(n=this.b,this.a=null==n?0:vvn(n)),this.a},MWn.Th=function(n){this.a=n},MWn.Ib=function(){var n;return 0!=(64&this.Db)?P$n(this):((n=new fN(P$n(this))).a+=" (key: ",cO(n,this.b),n.a+=", value: ",cO(n,this.c),n.a+=")",n.a)},MWn.a=-1,MWn.b=null,MWn.c=null;var R$t,K$t,_$t,F$t,B$t,H$t,q$t,G$t,z$t,U$t,X$t=vX(l6n,"EStringToStringMapEntryImpl",548),W$t=bq(y9n,"FeatureMap/Entry/Internal");wAn(565,1,z9n),MWn.Ok=function(n){return this.Pk(BB(n,49))},MWn.Pk=function(n){return this.Ok(n)},MWn.Fb=function(n){var t,e;return this===n||!!cL(n,72)&&(t=BB(n,72)).ak()==this.c&&(null==(e=this.dd())?null==t.dd():Nfn(e,t.dd()))},MWn.ak=function(){return this.c},MWn.Hb=function(){var n;return n=this.dd(),nsn(this.c)^(null==n?0:nsn(n))},MWn.Ib=function(){var n,t;return t=Utn((n=this.c).Hj()).Ph(),n.ne(),(null!=t&&0!=t.length?t+":"+n.ne():n.ne())+"="+this.dd()},vX(l6n,"EStructuralFeatureImpl/BasicFeatureMapEntry",565),wAn(776,565,z9n,rR),MWn.Pk=function(n){return new rR(this.c,n)},MWn.dd=function(){return this.a},MWn.Qk=function(n,t,e){return Scn(this,n,this.a,t,e)},MWn.Rk=function(n,t,e){return Pcn(this,n,this.a,t,e)},vX(l6n,"EStructuralFeatureImpl/ContainmentUpdatingFeatureMapEntry",776),wAn(1314,1,{},AI),MWn.Pj=function(n,t,e,i,r){return BB(S9(n,this.b),215).nl(this.a).Wj(i)},MWn.Qj=function(n,t,e,i,r){return BB(S9(n,this.b),215).el(this.a,i,r)},MWn.Rj=function(n,t,e,i,r){return BB(S9(n,this.b),215).fl(this.a,i,r)},MWn.Sj=function(n,t,e){return BB(S9(n,this.b),215).nl(this.a).fj()},MWn.Tj=function(n,t,e,i){BB(S9(n,this.b),215).nl(this.a).Wb(i)},MWn.Uj=function(n,t,e){return BB(S9(n,this.b),215).nl(this.a)},MWn.Vj=function(n,t,e){BB(S9(n,this.b),215).nl(this.a).Xj()},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateFeatureMapDelegator",1314),wAn(89,1,{},PB,lQ,RY,w4),MWn.Pj=function(n,t,e,i,r){var c;if(null==(c=t.Ch(e))&&t.Dh(e,c=iWn(this,n)),!r)switch(this.e){case 50:case 41:return BB(c,589).sj();case 40:return BB(c,215).kl()}return c},MWn.Qj=function(n,t,e,i,r){var c;return null==(c=t.Ch(e))&&t.Dh(e,c=iWn(this,n)),BB(c,69).lk(i,r)},MWn.Rj=function(n,t,e,i,r){var c;return null!=(c=t.Ch(e))&&(r=BB(c,69).mk(i,r)),r},MWn.Sj=function(n,t,e){var i;return null!=(i=t.Ch(e))&&BB(i,76).fj()},MWn.Tj=function(n,t,e,i){var r;!(r=BB(t.Ch(e),76))&&t.Dh(e,r=iWn(this,n)),r.Wb(i)},MWn.Uj=function(n,t,e){var i;return null==(i=t.Ch(e))&&t.Dh(e,i=iWn(this,n)),cL(i,76)?BB(i,76):new Ep(BB(t.Ch(e),15))},MWn.Vj=function(n,t,e){var i;!(i=BB(t.Ch(e),76))&&t.Dh(e,i=iWn(this,n)),i.Xj()},MWn.b=0,MWn.e=0,vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateMany",89),wAn(504,1,{}),MWn.Qj=function(n,t,e,i,r){throw Hp(new pv)},MWn.Rj=function(n,t,e,i,r){throw Hp(new pv)},MWn.Uj=function(n,t,e){return new bQ(this,n,t,e)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingle",504),wAn(1331,1,k9n,bQ),MWn.Wj=function(n){return this.a.Pj(this.c,this.d,this.b,n,!0)},MWn.fj=function(){return this.a.Sj(this.c,this.d,this.b)},MWn.Wb=function(n){this.a.Tj(this.c,this.d,this.b,n)},MWn.Xj=function(){this.a.Vj(this.c,this.d,this.b)},MWn.b=0,vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingle/1",1331),wAn(769,504,{},mJ),MWn.Pj=function(n,t,e,i,r){return gKn(n,n.eh(),n.Vg())==this.b?this.sk()&&i?cAn(n):n.eh():null},MWn.Qj=function(n,t,e,i,r){var c,a;return n.eh()&&(r=(c=n.Vg())>=0?n.Qg(r):n.eh().ih(n,-1-c,null,r)),a=Awn(n.Tg(),this.e),n.Sg(i,a,r)},MWn.Rj=function(n,t,e,i,r){var c;return c=Awn(n.Tg(),this.e),n.Sg(null,c,r)},MWn.Sj=function(n,t,e){var i;return i=Awn(n.Tg(),this.e),!!n.eh()&&n.Vg()==i},MWn.Tj=function(n,t,e,i){var r,c,a,u,o;if(null!=i&&!SFn(this.a,i))throw Hp(new Ky(U9n+(cL(i,56)?dEn(BB(i,56).Tg()):utn(tsn(i)))+X9n+this.a+"'"));if(r=n.eh(),a=Awn(n.Tg(),this.e),GI(i)!==GI(r)||n.Vg()!=a&&null!=i){if(vkn(n,BB(i,56)))throw Hp(new _y(w6n+n.Ib()));o=null,r&&(o=(c=n.Vg())>=0?n.Qg(o):n.eh().ih(n,-1-c,null,o)),(u=BB(i,49))&&(o=u.gh(n,Awn(u.Tg(),this.b),null,o)),(o=n.Sg(u,a,o))&&o.Fi()}else n.Lg()&&n.Mg()&&ban(n,new nU(n,1,a,i,i))},MWn.Vj=function(n,t,e){var i,r,c;n.eh()?(c=(i=n.Vg())>=0?n.Qg(null):n.eh().ih(n,-1-i,null,null),r=Awn(n.Tg(),this.e),(c=n.Sg(null,r,c))&&c.Fi()):n.Lg()&&n.Mg()&&ban(n,new tU(n,1,this.e,null,null))},MWn.sk=function(){return!1},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleContainer",769),wAn(1315,769,{},CB),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleContainerResolving",1315),wAn(563,504,{}),MWn.Pj=function(n,t,e,i,r){var c;return null==(c=t.Ch(e))?this.b:GI(c)===GI(R$t)?null:c},MWn.Sj=function(n,t,e){var i;return null!=(i=t.Ch(e))&&(GI(i)===GI(R$t)||!Nfn(i,this.b))},MWn.Tj=function(n,t,e,i){var r,c;n.Lg()&&n.Mg()?(r=null==(c=t.Ch(e))?this.b:GI(c)===GI(R$t)?null:c,null==i?null!=this.c?(t.Dh(e,null),i=this.b):null!=this.b?t.Dh(e,R$t):t.Dh(e,null):(this.Sk(i),t.Dh(e,i)),ban(n,this.d.Tk(n,1,this.e,r,i))):null==i?null!=this.c?t.Dh(e,null):null!=this.b?t.Dh(e,R$t):t.Dh(e,null):(this.Sk(i),t.Dh(e,i))},MWn.Vj=function(n,t,e){var i,r;n.Lg()&&n.Mg()?(i=null==(r=t.Ch(e))?this.b:GI(r)===GI(R$t)?null:r,t.Eh(e),ban(n,this.d.Tk(n,1,this.e,i,this.b))):t.Eh(e)},MWn.Sk=function(n){throw Hp(new bv)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData",563),wAn(W9n,1,{},$o),MWn.Tk=function(n,t,e,i,r){return new tU(n,t,e,i,r)},MWn.Uk=function(n,t,e,i,r,c){return new GQ(n,t,e,i,r,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator",W9n),wAn(1332,W9n,{},Lo),MWn.Tk=function(n,t,e,i,r){return new n6(n,t,e,qy(TD(i)),qy(TD(r)))},MWn.Uk=function(n,t,e,i,r,c){return new L0(n,t,e,qy(TD(i)),qy(TD(r)),c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/1",1332),wAn(1333,W9n,{},No),MWn.Tk=function(n,t,e,i,r){return new Hen(n,t,e,BB(i,217).a,BB(r,217).a)},MWn.Uk=function(n,t,e,i,r,c){return new S0(n,t,e,BB(i,217).a,BB(r,217).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/2",1333),wAn(1334,W9n,{},xo),MWn.Tk=function(n,t,e,i,r){return new qen(n,t,e,BB(i,172).a,BB(r,172).a)},MWn.Uk=function(n,t,e,i,r,c){return new P0(n,t,e,BB(i,172).a,BB(r,172).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/3",1334),wAn(1335,W9n,{},Do),MWn.Tk=function(n,t,e,i,r){return new J5(n,t,e,Gy(MD(i)),Gy(MD(r)))},MWn.Uk=function(n,t,e,i,r,c){return new C0(n,t,e,Gy(MD(i)),Gy(MD(r)),c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/4",1335),wAn(1336,W9n,{},Ro),MWn.Tk=function(n,t,e,i,r){return new Uen(n,t,e,BB(i,155).a,BB(r,155).a)},MWn.Uk=function(n,t,e,i,r,c){return new I0(n,t,e,BB(i,155).a,BB(r,155).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/5",1336),wAn(1337,W9n,{},Ko),MWn.Tk=function(n,t,e,i,r){return new Z5(n,t,e,BB(i,19).a,BB(r,19).a)},MWn.Uk=function(n,t,e,i,r,c){return new O0(n,t,e,BB(i,19).a,BB(r,19).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/6",1337),wAn(1338,W9n,{},_o),MWn.Tk=function(n,t,e,i,r){return new Gen(n,t,e,BB(i,162).a,BB(r,162).a)},MWn.Uk=function(n,t,e,i,r,c){return new A0(n,t,e,BB(i,162).a,BB(r,162).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/7",1338),wAn(1339,W9n,{},Fo),MWn.Tk=function(n,t,e,i,r){return new zen(n,t,e,BB(i,184).a,BB(r,184).a)},MWn.Uk=function(n,t,e,i,r,c){return new $0(n,t,e,BB(i,184).a,BB(r,184).a,c)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/8",1339),wAn(1317,563,{},wQ),MWn.Sk=function(n){if(!this.a.wj(n))throw Hp(new Ky(U9n+tsn(n)+X9n+this.a+"'"))},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataDynamic",1317),wAn(1318,563,{},ZG),MWn.Sk=function(n){},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataStatic",1318),wAn(770,563,{}),MWn.Sj=function(n,t,e){return null!=t.Ch(e)},MWn.Tj=function(n,t,e,i){var r,c;n.Lg()&&n.Mg()?(r=!0,null==(c=t.Ch(e))?(r=!1,c=this.b):GI(c)===GI(R$t)&&(c=null),null==i?null!=this.c?(t.Dh(e,null),i=this.b):t.Dh(e,R$t):(this.Sk(i),t.Dh(e,i)),ban(n,this.d.Uk(n,1,this.e,c,i,!r))):null==i?null!=this.c?t.Dh(e,null):t.Dh(e,R$t):(this.Sk(i),t.Dh(e,i))},MWn.Vj=function(n,t,e){var i,r;n.Lg()&&n.Mg()?(i=!0,null==(r=t.Ch(e))?(i=!1,r=this.b):GI(r)===GI(R$t)&&(r=null),t.Eh(e),ban(n,this.d.Uk(n,2,this.e,r,this.b,i))):t.Eh(e)},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettable",770),wAn(1319,770,{},dQ),MWn.Sk=function(n){if(!this.a.wj(n))throw Hp(new Ky(U9n+tsn(n)+X9n+this.a+"'"))},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableDynamic",1319),wAn(1320,770,{},nz),MWn.Sk=function(n){},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableStatic",1320),wAn(398,504,{},cG),MWn.Pj=function(n,t,e,i,r){var c,a,u,o,s;if(s=t.Ch(e),this.Kj()&&GI(s)===GI(R$t))return null;if(this.sk()&&i&&null!=s){if((u=BB(s,49)).kh()&&u!=(o=tfn(n,u))){if(!SFn(this.a,o))throw Hp(new Ky(U9n+tsn(o)+X9n+this.a+"'"));t.Dh(e,s=o),this.rk()&&(c=BB(o,49),a=u.ih(n,this.b?Awn(u.Tg(),this.b):-1-Awn(n.Tg(),this.e),null,null),!c.eh()&&(a=c.gh(n,this.b?Awn(c.Tg(),this.b):-1-Awn(n.Tg(),this.e),null,a)),a&&a.Fi()),n.Lg()&&n.Mg()&&ban(n,new tU(n,9,this.e,u,o))}return s}return s},MWn.Qj=function(n,t,e,i,r){var c,a;return GI(a=t.Ch(e))===GI(R$t)&&(a=null),t.Dh(e,i),this.bj()?GI(a)!==GI(i)&&null!=a&&(r=(c=BB(a,49)).ih(n,Awn(c.Tg(),this.b),null,r)):this.rk()&&null!=a&&(r=BB(a,49).ih(n,-1-Awn(n.Tg(),this.e),null,r)),n.Lg()&&n.Mg()&&(!r&&(r=new Fj(4)),r.Ei(new tU(n,1,this.e,a,i))),r},MWn.Rj=function(n,t,e,i,r){var c;return GI(c=t.Ch(e))===GI(R$t)&&(c=null),t.Eh(e),n.Lg()&&n.Mg()&&(!r&&(r=new Fj(4)),this.Kj()?r.Ei(new tU(n,2,this.e,c,null)):r.Ei(new tU(n,1,this.e,c,null))),r},MWn.Sj=function(n,t,e){return null!=t.Ch(e)},MWn.Tj=function(n,t,e,i){var r,c,a,u,o;if(null!=i&&!SFn(this.a,i))throw Hp(new Ky(U9n+(cL(i,56)?dEn(BB(i,56).Tg()):utn(tsn(i)))+X9n+this.a+"'"));u=null!=(o=t.Ch(e)),this.Kj()&&GI(o)===GI(R$t)&&(o=null),a=null,this.bj()?GI(o)!==GI(i)&&(null!=o&&(a=(r=BB(o,49)).ih(n,Awn(r.Tg(),this.b),null,a)),null!=i&&(a=(r=BB(i,49)).gh(n,Awn(r.Tg(),this.b),null,a))):this.rk()&&GI(o)!==GI(i)&&(null!=o&&(a=BB(o,49).ih(n,-1-Awn(n.Tg(),this.e),null,a)),null!=i&&(a=BB(i,49).gh(n,-1-Awn(n.Tg(),this.e),null,a))),null==i&&this.Kj()?t.Dh(e,R$t):t.Dh(e,i),n.Lg()&&n.Mg()?(c=new GQ(n,1,this.e,o,i,this.Kj()&&!u),a?(a.Ei(c),a.Fi()):ban(n,c)):a&&a.Fi()},MWn.Vj=function(n,t,e){var i,r,c,a,u;a=null!=(u=t.Ch(e)),this.Kj()&&GI(u)===GI(R$t)&&(u=null),c=null,null!=u&&(this.bj()?c=(i=BB(u,49)).ih(n,Awn(i.Tg(),this.b),null,c):this.rk()&&(c=BB(u,49).ih(n,-1-Awn(n.Tg(),this.e),null,c))),t.Eh(e),n.Lg()&&n.Mg()?(r=new GQ(n,this.Kj()?2:1,this.e,u,null,a),c?(c.Ei(r),c.Fi()):ban(n,r)):c&&c.Fi()},MWn.bj=function(){return!1},MWn.rk=function(){return!1},MWn.sk=function(){return!1},MWn.Kj=function(){return!1},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObject",398),wAn(564,398,{},Zx),MWn.rk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainment",564),wAn(1323,564,{},nD),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentResolving",1323),wAn(772,564,{},tD),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettable",772),wAn(1325,772,{},eD),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettableResolving",1325),wAn(640,564,{},IB),MWn.bj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverse",640),wAn(1324,640,{},$B),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseResolving",1324),wAn(773,640,{},LB),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettable",773),wAn(1326,773,{},NB),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettableResolving",1326),wAn(641,398,{},iD),MWn.sk=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolving",641),wAn(1327,641,{},rD),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingUnsettable",1327),wAn(774,641,{},OB),MWn.bj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverse",774),wAn(1328,774,{},xB),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverseUnsettable",1328),wAn(1321,398,{},cD),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectUnsettable",1321),wAn(771,398,{},AB),MWn.bj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverse",771),wAn(1322,771,{},DB),MWn.Kj=function(){return!0},vX(l6n,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverseUnsettable",1322),wAn(775,565,z9n,aW),MWn.Pk=function(n){return new aW(this.a,this.c,n)},MWn.dd=function(){return this.b},MWn.Qk=function(n,t,e){return D8(this,n,this.b,e)},MWn.Rk=function(n,t,e){return R8(this,n,this.b,e)},vX(l6n,"EStructuralFeatureImpl/InverseUpdatingFeatureMapEntry",775),wAn(1329,1,k9n,Ep),MWn.Wj=function(n){return this.a},MWn.fj=function(){return cL(this.a,95)?BB(this.a,95).fj():!this.a.dc()},MWn.Wb=function(n){this.a.$b(),this.a.Gc(BB(n,15))},MWn.Xj=function(){cL(this.a,95)?BB(this.a,95).Xj():this.a.$b()},vX(l6n,"EStructuralFeatureImpl/SettingMany",1329),wAn(1330,565,z9n,g4),MWn.Ok=function(n){return new cR((Uqn(),FLt),this.b.Ih(this.a,n))},MWn.dd=function(){return null},MWn.Qk=function(n,t,e){return e},MWn.Rk=function(n,t,e){return e},vX(l6n,"EStructuralFeatureImpl/SimpleContentFeatureMapEntry",1330),wAn(642,565,z9n,cR),MWn.Ok=function(n){return new cR(this.c,n)},MWn.dd=function(){return this.a},MWn.Qk=function(n,t,e){return e},MWn.Rk=function(n,t,e){return e},vX(l6n,"EStructuralFeatureImpl/SimpleFeatureMapEntry",642),wAn(391,497,h8n,Bo),MWn.ri=function(n){return x8(qAt,HWn,26,n,0,1)},MWn.ni=function(){return!1},vX(l6n,"ESuperAdapter/1",391),wAn(444,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,836:1,49:1,97:1,150:1,444:1,114:1,115:1},Ho),MWn._g=function(n,t,e){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),this.Ab;case 1:return this.zb;case 2:return!this.a&&(this.a=new aG(this,VAt,this)),this.a}return U9(this,n-bX((gWn(),T$t)),itn(BB(yan(this,16),26)||T$t,n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),_pn(this.Ab,n,e);case 2:return!this.a&&(this.a=new aG(this,VAt,this)),_pn(this.a,n,e)}return BB(itn(BB(yan(this,16),26)||(gWn(),T$t),t),66).Nj().Rj(this,fgn(this),t-bX((gWn(),T$t)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.Ab&&0!=this.Ab.i;case 1:return null!=this.zb;case 2:return!!this.a&&0!=this.a.i}return O3(this,n-bX((gWn(),T$t)),itn(BB(yan(this,16),26)||T$t,n))},MWn.sh=function(n,t){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),sqn(this.Ab),!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void pX(this.Ab,BB(t,14));case 1:return void Nrn(this,SD(t));case 2:return!this.a&&(this.a=new aG(this,VAt,this)),sqn(this.a),!this.a&&(this.a=new aG(this,VAt,this)),void pX(this.a,BB(t,14))}Lbn(this,n-bX((gWn(),T$t)),itn(BB(yan(this,16),26)||T$t,n),t)},MWn.zh=function(){return gWn(),T$t},MWn.Bh=function(n){switch(n){case 0:return!this.Ab&&(this.Ab=new eU(KAt,this,0,3)),void sqn(this.Ab);case 1:return void Nrn(this,null);case 2:return!this.a&&(this.a=new aG(this,VAt,this)),void sqn(this.a)}qfn(this,n-bX((gWn(),T$t)),itn(BB(yan(this,16),26)||T$t,n))},vX(l6n,"ETypeParameterImpl",444),wAn(445,85,R9n,aG),MWn.cj=function(n,t){return LTn(this,BB(n,87),t)},MWn.dj=function(n,t){return NTn(this,BB(n,87),t)},vX(l6n,"ETypeParameterImpl/1",445),wAn(634,43,tYn,xm),MWn.ec=function(){return new Tp(this)},vX(l6n,"ETypeParameterImpl/2",634),wAn(556,nVn,tVn,Tp),MWn.Fc=function(n){return YR(this,BB(n,87))},MWn.Gc=function(n){var t,e,i;for(i=!1,e=n.Kc();e.Ob();)t=BB(e.Pb(),87),null==VW(this.a,t,"")&&(i=!0);return i},MWn.$b=function(){$U(this.a)},MWn.Hc=function(n){return hU(this.a,n)},MWn.Kc=function(){return new Mp(new usn(new Pb(this.a).a))},MWn.Mc=function(n){return _6(this,n)},MWn.gc=function(){return NT(this.a)},vX(l6n,"ETypeParameterImpl/2/1",556),wAn(557,1,QWn,Mp),MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return BB(ten(this.a).cd(),87)},MWn.Ob=function(){return this.a.b},MWn.Qb=function(){o9(this.a)},vX(l6n,"ETypeParameterImpl/2/1/1",557),wAn(1276,43,tYn,Dm),MWn._b=function(n){return XI(n)?eY(this,n):!!AY(this.f,n)},MWn.xc=function(n){var t;return cL(t=XI(n)?SJ(this,n):qI(AY(this.f,n)),837)?(t=BB(t,837)._j(),VW(this,BB(n,235),t),t):null!=t?t:null==n?(JM(),rLt):null},vX(l6n,"EValidatorRegistryImpl",1276),wAn(1313,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,1941:1,49:1,97:1,150:1,114:1,115:1},qo),MWn.Ih=function(n,t){switch(n.yj()){case 21:case 22:case 23:case 24:case 26:case 31:case 32:case 37:case 38:case 39:case 40:case 43:case 44:case 48:case 49:case 20:return null==t?null:Bbn(t);case 25:return Xtn(t);case 27:return X9(t);case 28:return W9(t);case 29:return null==t?null:H$(IOt[0],BB(t,199));case 41:return null==t?"":nE(BB(t,290));case 42:return Bbn(t);case 50:return SD(t);default:throw Hp(new _y(d6n+n.ne()+g6n))}},MWn.Jh=function(n){var t;switch(-1==n.G&&(n.G=(t=Utn(n))?uvn(t.Mh(),n):-1),n.G){case 0:return new Om;case 1:return new jo;case 2:return new _f;case 4:return new Ev;case 5:return new Am;case 6:return new jv;case 7:return new Rf;case 10:return new yo;case 11:return new $m;case 12:return new vY;case 13:return new Lm;case 14:return new pD;case 17:return new Ao;case 18:return new Kp;case 19:return new Ho;default:throw Hp(new _y(m6n+n.zb+g6n))}},MWn.Kh=function(n,t){switch(n.yj()){case 20:return null==t?null:new wE(t);case 21:return null==t?null:new $A(t);case 23:case 22:return null==t?null:Zdn(t);case 26:case 24:return null==t?null:Pnn(l_n(t,-128,127)<<24>>24);case 25:return d$n(t);case 27:return Syn(t);case 28:return Pyn(t);case 29:return gMn(t);case 32:case 31:return null==t?null:bSn(t);case 38:case 37:return null==t?null:new Dv(t);case 40:case 39:return null==t?null:iln(l_n(t,_Vn,DWn));case 41:case 42:return null;case 44:case 43:return null==t?null:jgn(rUn(t));case 49:case 48:return null==t?null:rln(l_n(t,Q9n,32767)<<16>>16);case 50:return t;default:throw Hp(new _y(d6n+n.ne()+g6n))}},vX(l6n,"EcoreFactoryImpl",1313),wAn(547,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,1939:1,49:1,97:1,150:1,179:1,547:1,114:1,115:1,675:1},UW),MWn.gb=!1,MWn.hb=!1;var V$t,Q$t=!1;vX(l6n,"EcorePackageImpl",547),wAn(1184,1,{837:1},Go),MWn._j=function(){return sN(),cLt},vX(l6n,"EcorePackageImpl/1",1184),wAn(1193,1,s7n,zo),MWn.wj=function(n){return cL(n,147)},MWn.xj=function(n){return x8(BOt,HWn,147,n,0,1)},vX(l6n,"EcorePackageImpl/10",1193),wAn(1194,1,s7n,Uo),MWn.wj=function(n){return cL(n,191)},MWn.xj=function(n){return x8(qOt,HWn,191,n,0,1)},vX(l6n,"EcorePackageImpl/11",1194),wAn(1195,1,s7n,Xo),MWn.wj=function(n){return cL(n,56)},MWn.xj=function(n){return x8(LOt,HWn,56,n,0,1)},vX(l6n,"EcorePackageImpl/12",1195),wAn(1196,1,s7n,Wo),MWn.wj=function(n){return cL(n,399)},MWn.xj=function(n){return x8(QAt,x9n,59,n,0,1)},vX(l6n,"EcorePackageImpl/13",1196),wAn(1197,1,s7n,Vo),MWn.wj=function(n){return cL(n,235)},MWn.xj=function(n){return x8(GOt,HWn,235,n,0,1)},vX(l6n,"EcorePackageImpl/14",1197),wAn(1198,1,s7n,Qo),MWn.wj=function(n){return cL(n,509)},MWn.xj=function(n){return x8(YAt,HWn,2017,n,0,1)},vX(l6n,"EcorePackageImpl/15",1198),wAn(1199,1,s7n,Yo),MWn.wj=function(n){return cL(n,99)},MWn.xj=function(n){return x8(JAt,N9n,18,n,0,1)},vX(l6n,"EcorePackageImpl/16",1199),wAn(1200,1,s7n,Jo),MWn.wj=function(n){return cL(n,170)},MWn.xj=function(n){return x8(FAt,N9n,170,n,0,1)},vX(l6n,"EcorePackageImpl/17",1200),wAn(1201,1,s7n,Zo),MWn.wj=function(n){return cL(n,472)},MWn.xj=function(n){return x8(_At,HWn,472,n,0,1)},vX(l6n,"EcorePackageImpl/18",1201),wAn(1202,1,s7n,ns),MWn.wj=function(n){return cL(n,548)},MWn.xj=function(n){return x8(X$t,a9n,548,n,0,1)},vX(l6n,"EcorePackageImpl/19",1202),wAn(1185,1,s7n,ts),MWn.wj=function(n){return cL(n,322)},MWn.xj=function(n){return x8(BAt,N9n,34,n,0,1)},vX(l6n,"EcorePackageImpl/2",1185),wAn(1203,1,s7n,es),MWn.wj=function(n){return cL(n,241)},MWn.xj=function(n){return x8(VAt,B9n,87,n,0,1)},vX(l6n,"EcorePackageImpl/20",1203),wAn(1204,1,s7n,is),MWn.wj=function(n){return cL(n,444)},MWn.xj=function(n){return x8(O$t,HWn,836,n,0,1)},vX(l6n,"EcorePackageImpl/21",1204),wAn(1205,1,s7n,rs),MWn.wj=function(n){return zI(n)},MWn.xj=function(n){return x8(ktt,sVn,476,n,8,1)},vX(l6n,"EcorePackageImpl/22",1205),wAn(1206,1,s7n,cs),MWn.wj=function(n){return cL(n,190)},MWn.xj=function(n){return x8(NNt,sVn,190,n,0,2)},vX(l6n,"EcorePackageImpl/23",1206),wAn(1207,1,s7n,as),MWn.wj=function(n){return cL(n,217)},MWn.xj=function(n){return x8(Ttt,sVn,217,n,0,1)},vX(l6n,"EcorePackageImpl/24",1207),wAn(1208,1,s7n,us),MWn.wj=function(n){return cL(n,172)},MWn.xj=function(n){return x8(Stt,sVn,172,n,0,1)},vX(l6n,"EcorePackageImpl/25",1208),wAn(1209,1,s7n,os),MWn.wj=function(n){return cL(n,199)},MWn.xj=function(n){return x8(mtt,sVn,199,n,0,1)},vX(l6n,"EcorePackageImpl/26",1209),wAn(1210,1,s7n,ss),MWn.wj=function(n){return!1},MWn.xj=function(n){return x8(_Nt,HWn,2110,n,0,1)},vX(l6n,"EcorePackageImpl/27",1210),wAn(1211,1,s7n,hs),MWn.wj=function(n){return UI(n)},MWn.xj=function(n){return x8(Ptt,sVn,333,n,7,1)},vX(l6n,"EcorePackageImpl/28",1211),wAn(1212,1,s7n,fs),MWn.wj=function(n){return cL(n,58)},MWn.xj=function(n){return x8(uAt,nZn,58,n,0,1)},vX(l6n,"EcorePackageImpl/29",1212),wAn(1186,1,s7n,ls),MWn.wj=function(n){return cL(n,510)},MWn.xj=function(n){return x8(KAt,{3:1,4:1,5:1,1934:1},590,n,0,1)},vX(l6n,"EcorePackageImpl/3",1186),wAn(1213,1,s7n,bs),MWn.wj=function(n){return cL(n,573)},MWn.xj=function(n){return x8(yAt,HWn,1940,n,0,1)},vX(l6n,"EcorePackageImpl/30",1213),wAn(1214,1,s7n,ws),MWn.wj=function(n){return cL(n,153)},MWn.xj=function(n){return x8(oLt,nZn,153,n,0,1)},vX(l6n,"EcorePackageImpl/31",1214),wAn(1215,1,s7n,ds),MWn.wj=function(n){return cL(n,72)},MWn.xj=function(n){return x8($$t,h7n,72,n,0,1)},vX(l6n,"EcorePackageImpl/32",1215),wAn(1216,1,s7n,gs),MWn.wj=function(n){return cL(n,155)},MWn.xj=function(n){return x8(Ctt,sVn,155,n,0,1)},vX(l6n,"EcorePackageImpl/33",1216),wAn(1217,1,s7n,ps),MWn.wj=function(n){return cL(n,19)},MWn.xj=function(n){return x8(Att,sVn,19,n,0,1)},vX(l6n,"EcorePackageImpl/34",1217),wAn(1218,1,s7n,vs),MWn.wj=function(n){return cL(n,290)},MWn.xj=function(n){return x8($nt,HWn,290,n,0,1)},vX(l6n,"EcorePackageImpl/35",1218),wAn(1219,1,s7n,ms),MWn.wj=function(n){return cL(n,162)},MWn.xj=function(n){return x8(Rtt,sVn,162,n,0,1)},vX(l6n,"EcorePackageImpl/36",1219),wAn(1220,1,s7n,ys),MWn.wj=function(n){return cL(n,83)},MWn.xj=function(n){return x8(Nnt,HWn,83,n,0,1)},vX(l6n,"EcorePackageImpl/37",1220),wAn(1221,1,s7n,ks),MWn.wj=function(n){return cL(n,591)},MWn.xj=function(n){return x8(iLt,HWn,591,n,0,1)},vX(l6n,"EcorePackageImpl/38",1221),wAn(1222,1,s7n,js),MWn.wj=function(n){return!1},MWn.xj=function(n){return x8(FNt,HWn,2111,n,0,1)},vX(l6n,"EcorePackageImpl/39",1222),wAn(1187,1,s7n,Es),MWn.wj=function(n){return cL(n,88)},MWn.xj=function(n){return x8(qAt,HWn,26,n,0,1)},vX(l6n,"EcorePackageImpl/4",1187),wAn(1223,1,s7n,Ts),MWn.wj=function(n){return cL(n,184)},MWn.xj=function(n){return x8(_tt,sVn,184,n,0,1)},vX(l6n,"EcorePackageImpl/40",1223),wAn(1224,1,s7n,Ms),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(l6n,"EcorePackageImpl/41",1224),wAn(1225,1,s7n,Ss),MWn.wj=function(n){return cL(n,588)},MWn.xj=function(n){return x8(sAt,HWn,588,n,0,1)},vX(l6n,"EcorePackageImpl/42",1225),wAn(1226,1,s7n,Ps),MWn.wj=function(n){return!1},MWn.xj=function(n){return x8(BNt,sVn,2112,n,0,1)},vX(l6n,"EcorePackageImpl/43",1226),wAn(1227,1,s7n,Cs),MWn.wj=function(n){return cL(n,42)},MWn.xj=function(n){return x8(Hnt,kVn,42,n,0,1)},vX(l6n,"EcorePackageImpl/44",1227),wAn(1188,1,s7n,Is),MWn.wj=function(n){return cL(n,138)},MWn.xj=function(n){return x8(HAt,HWn,138,n,0,1)},vX(l6n,"EcorePackageImpl/5",1188),wAn(1189,1,s7n,Os),MWn.wj=function(n){return cL(n,148)},MWn.xj=function(n){return x8(GAt,HWn,148,n,0,1)},vX(l6n,"EcorePackageImpl/6",1189),wAn(1190,1,s7n,As),MWn.wj=function(n){return cL(n,457)},MWn.xj=function(n){return x8(XAt,HWn,671,n,0,1)},vX(l6n,"EcorePackageImpl/7",1190),wAn(1191,1,s7n,$s),MWn.wj=function(n){return cL(n,573)},MWn.xj=function(n){return x8(WAt,HWn,678,n,0,1)},vX(l6n,"EcorePackageImpl/8",1191),wAn(1192,1,s7n,Ls),MWn.wj=function(n){return cL(n,471)},MWn.xj=function(n){return x8(HOt,HWn,471,n,0,1)},vX(l6n,"EcorePackageImpl/9",1192),wAn(1025,1982,r9n,xy),MWn.bi=function(n,t){Afn(this,BB(t,415))},MWn.fi=function(n,t){eCn(this,n,BB(t,415))},vX(l6n,"MinimalEObjectImpl/1ArrayDelegatingAdapterList",1025),wAn(1026,143,t9n,uW),MWn.Ai=function(){return this.a.a},vX(l6n,"MinimalEObjectImpl/1ArrayDelegatingAdapterList/1",1026),wAn(1053,1052,{},o$),vX("org.eclipse.emf.ecore.plugin","EcorePlugin",1053);var Y$t,J$t,Z$t,nLt,tLt,eLt,iLt=bq(f7n,"Resource");wAn(781,1378,l7n),MWn.Yk=function(n){},MWn.Zk=function(n){},MWn.Vk=function(){return!this.a&&(this.a=new Sp(this)),this.a},MWn.Wk=function(n){var t,e,i,r,c;if((i=n.length)>0){if(b1(0,n.length),47==n.charCodeAt(0)){for(c=new J6(4),r=1,t=1;t<i;++t)b1(t,n.length),47==n.charCodeAt(t)&&(WB(c,r==t?"":n.substr(r,t-r)),r=t+1);return WB(c,n.substr(r)),ojn(this,c)}b1(i-1,n.length),63==n.charCodeAt(i-1)&&(e=MK(n,YTn(63),i-2))>0&&(n=n.substr(0,e))}return jIn(this,n)},MWn.Xk=function(){return this.c},MWn.Ib=function(){return nE(this.gm)+"@"+(nsn(this)>>>0).toString(16)+" uri='"+this.d+"'"},MWn.b=!1,vX(b7n,"ResourceImpl",781),wAn(1379,781,l7n,Cp),vX(b7n,"BinaryResourceImpl",1379),wAn(1169,694,f8n),MWn.si=function(n){return cL(n,56)?TY(this,BB(n,56)):cL(n,591)?new AL(BB(n,591).Vk()):GI(n)===GI(this.f)?BB(n,14).Kc():(dD(),pAt.a)},MWn.Ob=function(){return bOn(this)},MWn.a=!1,vX(y9n,"EcoreUtil/ContentTreeIterator",1169),wAn(1380,1169,f8n,rU),MWn.si=function(n){return GI(n)===GI(this.f)?BB(n,15).Kc():new F2(BB(n,56))},vX(b7n,"ResourceImpl/5",1380),wAn(648,1994,D9n,Sp),MWn.Hc=function(n){return this.i<=4?Sjn(this,n):cL(n,49)&&BB(n,49).Zg()==this.a},MWn.bi=function(n,t){n==this.i-1&&(this.a.b||(this.a.b=!0))},MWn.di=function(n,t){0==n?this.a.b||(this.a.b=!0):L8(this,n,t)},MWn.fi=function(n,t){},MWn.gi=function(n,t,e){},MWn.aj=function(){return 2},MWn.Ai=function(){return this.a},MWn.bj=function(){return!0},MWn.cj=function(n,t){return t=BB(n,49).wh(this.a,t)},MWn.dj=function(n,t){return BB(n,49).wh(null,t)},MWn.ej=function(){return!1},MWn.hi=function(){return!0},MWn.ri=function(n){return x8(LOt,HWn,56,n,0,1)},MWn.ni=function(){return!1},vX(b7n,"ResourceImpl/ContentsEList",648),wAn(957,1964,LVn,Pp),MWn.Zc=function(n){return this.a._h(n)},MWn.gc=function(){return this.a.gc()},vX(y9n,"AbstractSequentialInternalEList/1",957),wAn(624,1,{},SH),vX(y9n,"BasicExtendedMetaData",624),wAn(1160,1,{},$I),MWn.$k=function(){return null},MWn._k=function(){return-2==this.a&&ob(this,aMn(this.d,this.b)),this.a},MWn.al=function(){return null},MWn.bl=function(){return SQ(),SQ(),set},MWn.ne=function(){return this.c==C7n&&hb(this,Egn(this.d,this.b)),this.c},MWn.cl=function(){return 0},MWn.a=-2,MWn.c=C7n,vX(y9n,"BasicExtendedMetaData/EClassExtendedMetaDataImpl",1160),wAn(1161,1,{},_0),MWn.$k=function(){return this.a==(R5(),tLt)&&sb(this,vNn(this.f,this.b)),this.a},MWn._k=function(){return 0},MWn.al=function(){return this.c==(R5(),tLt)&&fb(this,mNn(this.f,this.b)),this.c},MWn.bl=function(){return!this.d&&lb(this,SKn(this.f,this.b)),this.d},MWn.ne=function(){return this.e==C7n&&bb(this,Egn(this.f,this.b)),this.e},MWn.cl=function(){return-2==this.g&&wb(this,YEn(this.f,this.b)),this.g},MWn.e=C7n,MWn.g=-2,vX(y9n,"BasicExtendedMetaData/EDataTypeExtendedMetaDataImpl",1161),wAn(1159,1,{},RI),MWn.b=!1,MWn.c=!1,vX(y9n,"BasicExtendedMetaData/EPackageExtendedMetaDataImpl",1159),wAn(1162,1,{},K0),MWn.c=-2,MWn.e=C7n,MWn.f=C7n,vX(y9n,"BasicExtendedMetaData/EStructuralFeatureExtendedMetaDataImpl",1162),wAn(585,622,R9n,MH),MWn.aj=function(){return this.c},MWn.Fk=function(){return!1},MWn.li=function(n,t){return t},MWn.c=0,vX(y9n,"EDataTypeEList",585);var rLt,cLt,aLt,uLt,oLt=bq(y9n,"FeatureMap");wAn(75,585,{3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},Ecn),MWn.Vc=function(n,t){lNn(this,n,BB(t,72))},MWn.Fc=function(n){return uLn(this,BB(n,72))},MWn.Yh=function(n){dX(this,BB(n,72))},MWn.cj=function(n,t){return HK(this,BB(n,72),t)},MWn.dj=function(n,t){return qK(this,BB(n,72),t)},MWn.ii=function(n,t){return a_n(this,n,t)},MWn.li=function(n,t){return hGn(this,n,BB(t,72))},MWn._c=function(n,t){return Pxn(this,n,BB(t,72))},MWn.jj=function(n,t){return GK(this,BB(n,72),t)},MWn.kj=function(n,t){return zK(this,BB(n,72),t)},MWn.lj=function(n,t,e){return gEn(this,BB(n,72),BB(t,72),e)},MWn.oi=function(n,t){return sTn(this,n,BB(t,72))},MWn.dl=function(n,t){return xKn(this,n,t)},MWn.Wc=function(n,t){var e,i,r,c,a,u,o,s,h;for(s=new gtn(t.gc()),r=t.Kc();r.Ob();)if(c=(i=BB(r.Pb(),72)).ak(),$xn(this.e,c))(!c.hi()||!G3(this,c,i.dd())&&!Sjn(s,i))&&f9(s,i);else{for(h=axn(this.e.Tg(),c),e=BB(this.g,119),a=!0,u=0;u<this.i;++u)if(o=e[u],h.rl(o.ak())){BB(ovn(this,u,i),72),a=!1;break}a&&f9(s,i)}return oon(this,n,s)},MWn.Gc=function(n){var t,e,i,r,c,a,u,o,s;for(o=new gtn(n.gc()),i=n.Kc();i.Ob();)if(r=(e=BB(i.Pb(),72)).ak(),$xn(this.e,r))(!r.hi()||!G3(this,r,e.dd())&&!Sjn(o,e))&&f9(o,e);else{for(s=axn(this.e.Tg(),r),t=BB(this.g,119),c=!0,a=0;a<this.i;++a)if(u=t[a],s.rl(u.ak())){BB(ovn(this,a,e),72),c=!1;break}c&&f9(o,e)}return pX(this,o)},MWn.Wh=function(n){return this.j=-1,LFn(this,this.i,n)},MWn.el=function(n,t,e){return PRn(this,n,t,e)},MWn.mk=function(n,t){return TKn(this,n,t)},MWn.fl=function(n,t,e){return ZBn(this,n,t,e)},MWn.gl=function(){return this},MWn.hl=function(n,t){return rHn(this,n,t)},MWn.il=function(n){return BB(Wtn(this,n),72).ak()},MWn.jl=function(n){return BB(Wtn(this,n),72).dd()},MWn.kl=function(){return this.b},MWn.bj=function(){return!0},MWn.ij=function(){return!0},MWn.ll=function(n){return!adn(this,n)},MWn.ri=function(n){return x8(W$t,h7n,332,n,0,1)},MWn.Gk=function(n){return hD(this,n)},MWn.Wb=function(n){tX(this,n)},MWn.ml=function(n,t){MHn(this,n,t)},MWn.nl=function(n){return zin(this,n)},MWn.ol=function(n){Kmn(this,n)},vX(y9n,"BasicFeatureMap",75),wAn(1851,1,cVn),MWn.Nb=function(n){fU(this,n)},MWn.Rb=function(n){if(-1==this.g)throw Hp(new dv);mz(this);try{Axn(this.e,this.b,this.a,n),this.d=this.e.j,cvn(this)}catch(t){throw cL(t=lun(t),73)?Hp(new vv):Hp(t)}},MWn.Ob=function(){return Ksn(this)},MWn.Sb=function(){return _sn(this)},MWn.Pb=function(){return cvn(this)},MWn.Tb=function(){return this.a},MWn.Ub=function(){var n;if(_sn(this))return mz(this),this.g=--this.a,this.Lk()&&(n=FIn(this.e,this.b,this.c,this.a,this.j),this.j=n),this.i=0,this.j;throw Hp(new yv)},MWn.Vb=function(){return this.a-1},MWn.Qb=function(){if(-1==this.g)throw Hp(new dv);mz(this);try{aPn(this.e,this.b,this.g),this.d=this.e.j,this.g<this.a&&(--this.a,--this.c),--this.g}catch(n){throw cL(n=lun(n),73)?Hp(new vv):Hp(n)}},MWn.Lk=function(){return!1},MWn.Wb=function(n){if(-1==this.g)throw Hp(new dv);mz(this);try{XFn(this.e,this.b,this.g,n),this.d=this.e.j}catch(t){throw cL(t=lun(t),73)?Hp(new vv):Hp(t)}},MWn.a=0,MWn.c=0,MWn.d=0,MWn.f=!1,MWn.g=0,MWn.i=0,vX(y9n,"FeatureMapUtil/BasicFeatureEIterator",1851),wAn(410,1851,cVn,Aan),MWn.pl=function(){var n,t,e;for(e=this.e.i,n=BB(this.e.g,119);this.c<e;){if(t=n[this.c],this.k.rl(t.ak()))return this.j=this.f?t:t.dd(),this.i=2,!0;++this.c}return this.i=1,this.g=-1,!1},MWn.ql=function(){var n,t;for(n=BB(this.e.g,119);--this.c>=0;)if(t=n[this.c],this.k.rl(t.ak()))return this.j=this.f?t:t.dd(),this.i=-2,!0;return this.i=-1,this.g=-1,!1},vX(y9n,"BasicFeatureMap/FeatureEIterator",410),wAn(662,410,cVn,xO),MWn.Lk=function(){return!0},vX(y9n,"BasicFeatureMap/ResolvingFeatureEIterator",662),wAn(955,486,q9n,z$),MWn.Gi=function(){return this},vX(y9n,"EContentsEList/1",955),wAn(956,486,q9n,DO),MWn.Lk=function(){return!1},vX(y9n,"EContentsEList/2",956),wAn(954,279,G9n,U$),MWn.Nk=function(n){},MWn.Ob=function(){return!1},MWn.Sb=function(){return!1},vX(y9n,"EContentsEList/FeatureIteratorImpl/1",954),wAn(825,585,R9n,KL),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EDataTypeEList/Unsettable",825),wAn(1849,585,R9n,_L),MWn.hi=function(){return!0},vX(y9n,"EDataTypeUniqueEList",1849),wAn(1850,825,R9n,FL),MWn.hi=function(){return!0},vX(y9n,"EDataTypeUniqueEList/Unsettable",1850),wAn(139,85,R9n,NL),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectContainmentEList/Resolving",139),wAn(1163,545,R9n,xL),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectContainmentEList/Unsettable/Resolving",1163),wAn(748,16,R9n,iK),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EObjectContainmentWithInverseEList/Unsettable",748),wAn(1173,748,R9n,rK),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectContainmentWithInverseEList/Unsettable/Resolving",1173),wAn(743,496,R9n,DL),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EObjectEList/Unsettable",743),wAn(328,496,R9n,RL),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectResolvingEList",328),wAn(1641,743,R9n,BL),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectResolvingEList/Unsettable",1641),wAn(1381,1,{},Ns),vX(y9n,"EObjectValidator",1381),wAn(546,496,R9n,iU),MWn.zk=function(){return this.d},MWn.Ak=function(){return this.b},MWn.bj=function(){return!0},MWn.Dk=function(){return!0},MWn.b=0,vX(y9n,"EObjectWithInverseEList",546),wAn(1176,546,R9n,cK),MWn.Ck=function(){return!0},vX(y9n,"EObjectWithInverseEList/ManyInverse",1176),wAn(625,546,R9n,aK),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EObjectWithInverseEList/Unsettable",625),wAn(1175,625,R9n,oK),MWn.Ck=function(){return!0},vX(y9n,"EObjectWithInverseEList/Unsettable/ManyInverse",1175),wAn(749,546,R9n,uK),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectWithInverseResolvingEList",749),wAn(31,749,R9n,hK),MWn.Ck=function(){return!0},vX(y9n,"EObjectWithInverseResolvingEList/ManyInverse",31),wAn(750,625,R9n,sK),MWn.Ek=function(){return!0},MWn.li=function(n,t){return GOn(this,n,BB(t,56))},vX(y9n,"EObjectWithInverseResolvingEList/Unsettable",750),wAn(1174,750,R9n,fK),MWn.Ck=function(){return!0},vX(y9n,"EObjectWithInverseResolvingEList/Unsettable/ManyInverse",1174),wAn(1164,622,R9n),MWn.ai=function(){return 0==(1792&this.b)},MWn.ci=function(){this.b|=1},MWn.Bk=function(){return 0!=(4&this.b)},MWn.bj=function(){return 0!=(40&this.b)},MWn.Ck=function(){return 0!=(16&this.b)},MWn.Dk=function(){return 0!=(8&this.b)},MWn.Ek=function(){return 0!=(this.b&M9n)},MWn.rk=function(){return 0!=(32&this.b)},MWn.Fk=function(){return 0!=(this.b&k6n)},MWn.wj=function(n){return this.d?x3(this.d,n):this.ak().Yj().wj(n)},MWn.fj=function(){return 0!=(2&this.b)?0!=(1&this.b):0!=this.i},MWn.hi=function(){return 0!=(128&this.b)},MWn.Xj=function(){var n;sqn(this),0!=(2&this.b)&&(mA(this.e)?(n=0!=(1&this.b),this.b&=-2,Lv(this,new t6(this.e,2,Awn(this.e.Tg(),this.ak()),n,!1))):this.b&=-2)},MWn.ni=function(){return 0==(1536&this.b)},MWn.b=0,vX(y9n,"EcoreEList/Generic",1164),wAn(1165,1164,R9n,zQ),MWn.ak=function(){return this.a},vX(y9n,"EcoreEList/Dynamic",1165),wAn(747,63,h8n,Ip),MWn.ri=function(n){return Den(this.a.a,n)},vX(y9n,"EcoreEMap/1",747),wAn(746,85,R9n,Zz),MWn.bi=function(n,t){Ivn(this.b,BB(t,133))},MWn.di=function(n,t){aan(this.b)},MWn.ei=function(n,t,e){var i;++(i=this.b,BB(t,133),i).e},MWn.fi=function(n,t){Oln(this.b,BB(t,133))},MWn.gi=function(n,t,e){Oln(this.b,BB(e,133)),GI(e)===GI(t)&&BB(e,133).Th(c$(BB(t,133).cd())),Ivn(this.b,BB(t,133))},vX(y9n,"EcoreEMap/DelegateEObjectContainmentEList",746),wAn(1171,151,j9n,yin),vX(y9n,"EcoreEMap/Unsettable",1171),wAn(1172,746,R9n,lK),MWn.ci=function(){this.a=!0},MWn.fj=function(){return this.a},MWn.Xj=function(){var n;sqn(this),mA(this.e)?(n=this.a,this.a=!1,ban(this.e,new t6(this.e,2,this.c,n,!1))):this.a=!1},MWn.a=!1,vX(y9n,"EcoreEMap/Unsettable/UnsettableDelegateEObjectContainmentEList",1172),wAn(1168,228,tYn,lX),MWn.a=!1,MWn.b=!1,vX(y9n,"EcoreUtil/Copier",1168),wAn(745,1,QWn,F2),MWn.Nb=function(n){fU(this,n)},MWn.Ob=function(){return udn(this)},MWn.Pb=function(){var n;return udn(this),n=this.b,this.b=null,n},MWn.Qb=function(){this.a.Qb()},vX(y9n,"EcoreUtil/ProperContentIterator",745),wAn(1382,1381,{},Ff),vX(y9n,"EcoreValidator",1382),bq(y9n,"FeatureMapUtil/Validator"),wAn(1260,1,{1942:1},xs),MWn.rl=function(n){return!0},vX(y9n,"FeatureMapUtil/1",1260),wAn(757,1,{1942:1},cUn),MWn.rl=function(n){var t;return this.c==n||(null==(t=TD(RX(this.a,n)))?xRn(this,n)?(r6(this.a,n,(hN(),vtt)),!0):(r6(this.a,n,(hN(),ptt)),!1):t==(hN(),vtt))},MWn.e=!1,vX(y9n,"FeatureMapUtil/BasicValidator",757),wAn(758,43,tYn,X$),vX(y9n,"FeatureMapUtil/BasicValidator/Cache",758),wAn(501,52,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,69:1,95:1},xI),MWn.Vc=function(n,t){Axn(this.c,this.b,n,t)},MWn.Fc=function(n){return xKn(this.c,this.b,n)},MWn.Wc=function(n,t){return jHn(this.c,this.b,n,t)},MWn.Gc=function(n){return Z$(this,n)},MWn.Xh=function(n,t){htn(this.c,this.b,n,t)},MWn.lk=function(n,t){return PRn(this.c,this.b,n,t)},MWn.pi=function(n){return iHn(this.c,this.b,n,!1)},MWn.Zh=function(){return jA(this.c,this.b)},MWn.$h=function(){return EA(this.c,this.b)},MWn._h=function(n){return $8(this.c,this.b,n)},MWn.mk=function(n,t){return tR(this,n,t)},MWn.$b=function(){Nv(this)},MWn.Hc=function(n){return G3(this.c,this.b,n)},MWn.Ic=function(n){return Mcn(this.c,this.b,n)},MWn.Xb=function(n){return iHn(this.c,this.b,n,!0)},MWn.Wj=function(n){return this},MWn.Xc=function(n){return z3(this.c,this.b,n)},MWn.dc=function(){return HI(this)},MWn.fj=function(){return!adn(this.c,this.b)},MWn.Kc=function(){return cnn(this.c,this.b)},MWn.Yc=function(){return ann(this.c,this.b)},MWn.Zc=function(n){return lln(this.c,this.b,n)},MWn.ii=function(n,t){return mFn(this.c,this.b,n,t)},MWn.ji=function(n,t){Q6(this.c,this.b,n,t)},MWn.$c=function(n){return aPn(this.c,this.b,n)},MWn.Mc=function(n){return CKn(this.c,this.b,n)},MWn._c=function(n,t){return XFn(this.c,this.b,n,t)},MWn.Wb=function(n){AOn(this.c,this.b),Z$(this,BB(n,15))},MWn.gc=function(){return Kln(this.c,this.b)},MWn.Pc=function(){return G1(this.c,this.b)},MWn.Qc=function(n){return U3(this.c,this.b,n)},MWn.Ib=function(){var n,t;for((t=new Sk).a+="[",n=jA(this.c,this.b);Ksn(n);)cO(t,kN(cvn(n))),Ksn(n)&&(t.a+=FWn);return t.a+="]",t.a},MWn.Xj=function(){AOn(this.c,this.b)},vX(y9n,"FeatureMapUtil/FeatureEList",501),wAn(627,36,t9n,b4),MWn.yi=function(n){return eln(this,n)},MWn.Di=function(n){var t,e,i,r;switch(this.d){case 1:case 2:if(GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return this.g=n.zi(),1==n.xi()&&(this.d=1),!0;break;case 3:if(3===n.xi()&&GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return this.d=5,f9(t=new gtn(2),this.g),f9(t,n.zi()),this.g=t,!0;break;case 5:if(3===n.xi()&&GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return BB(this.g,14).Fc(n.zi()),!0;break;case 4:switch(n.xi()){case 3:if(GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return this.d=1,this.g=n.zi(),!0;break;case 4:if(GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return this.d=6,f9(r=new gtn(2),this.n),f9(r,n.Bi()),this.n=r,i=Pun(Gk(ANt,1),hQn,25,15,[this.o,n.Ci()]),this.g=i,!0}break;case 6:if(4===n.xi()&&GI(n.Ai())===GI(this.c)&&eln(this,null)==n.yi(null))return BB(this.n,14).Fc(n.Bi()),aHn(i=BB(this.g,48),0,e=x8(ANt,hQn,25,i.length+1,15,1),0,i.length),e[i.length]=n.Ci(),this.g=e,!0}return!1},vX(y9n,"FeatureMapUtil/FeatureENotificationImpl",627),wAn(552,501,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},lq),MWn.dl=function(n,t){return xKn(this.c,n,t)},MWn.el=function(n,t,e){return PRn(this.c,n,t,e)},MWn.fl=function(n,t,e){return ZBn(this.c,n,t,e)},MWn.gl=function(){return this},MWn.hl=function(n,t){return rHn(this.c,n,t)},MWn.il=function(n){return BB(iHn(this.c,this.b,n,!1),72).ak()},MWn.jl=function(n){return BB(iHn(this.c,this.b,n,!1),72).dd()},MWn.kl=function(){return this.a},MWn.ll=function(n){return!adn(this.c,n)},MWn.ml=function(n,t){MHn(this.c,n,t)},MWn.nl=function(n){return zin(this.c,n)},MWn.ol=function(n){Kmn(this.c,n)},vX(y9n,"FeatureMapUtil/FeatureFeatureMap",552),wAn(1259,1,k9n,KI),MWn.Wj=function(n){return iHn(this.b,this.a,-1,n)},MWn.fj=function(){return!adn(this.b,this.a)},MWn.Wb=function(n){MHn(this.b,this.a,n)},MWn.Xj=function(){AOn(this.b,this.a)},vX(y9n,"FeatureMapUtil/FeatureValue",1259);var sLt,hLt,fLt,lLt,bLt,wLt=bq(O7n,"AnyType");wAn(666,60,BVn,ik),vX(O7n,"InvalidDatatypeValueException",666);var dLt,gLt,pLt,vLt,mLt,yLt,kLt,jLt,ELt,TLt,MLt,SLt,PLt,CLt,ILt,OLt,ALt,$Lt,LLt,NLt,xLt,DLt,RLt,KLt,_Lt,FLt,BLt,HLt,qLt,GLt,zLt=bq(O7n,A7n),ULt=bq(O7n,$7n),XLt=bq(O7n,L7n);wAn(830,506,{105:1,92:1,90:1,56:1,49:1,97:1,843:1},Rm),MWn._g=function(n,t,e){switch(n){case 0:return e?(!this.c&&(this.c=new Ecn(this,0)),this.c):(!this.c&&(this.c=new Ecn(this,0)),this.c.b);case 1:return e?(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)):(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),215)).kl();case 2:return e?(!this.b&&(this.b=new Ecn(this,2)),this.b):(!this.b&&(this.b=new Ecn(this,2)),this.b.b)}return U9(this,n-bX(this.zh()),itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.c&&(this.c=new Ecn(this,0)),TKn(this.c,n,e);case 1:return(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),69)).mk(n,e);case 2:return!this.b&&(this.b=new Ecn(this,2)),TKn(this.b,n,e)}return BB(itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),t),66).Nj().Rj(this,Q7(this),t-bX(this.zh()),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.c&&0!=this.c.i;case 1:return!(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)).dc();case 2:return!!this.b&&0!=this.b.i}return O3(this,n-bX(this.zh()),itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.c&&(this.c=new Ecn(this,0)),void tX(this.c,t);case 1:return void(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),215)).Wb(t);case 2:return!this.b&&(this.b=new Ecn(this,2)),void tX(this.b,t)}Lbn(this,n-bX(this.zh()),itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),n),t)},MWn.zh=function(){return Uqn(),pLt},MWn.Bh=function(n){switch(n){case 0:return!this.c&&(this.c=new Ecn(this,0)),void sqn(this.c);case 1:return void(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)).$b();case 2:return!this.b&&(this.b=new Ecn(this,2)),void sqn(this.b)}qfn(this,n-bX(this.zh()),itn(0==(2&this.j)?this.zh():(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.Ib=function(){var n;return 0!=(4&this.j)?P$n(this):((n=new fN(P$n(this))).a+=" (mixed: ",rO(n,this.c),n.a+=", anyAttribute: ",rO(n,this.b),n.a+=")",n.a)},vX(N7n,"AnyTypeImpl",830),wAn(667,506,{105:1,92:1,90:1,56:1,49:1,97:1,2021:1,667:1},Rs),MWn._g=function(n,t,e){switch(n){case 0:return this.a;case 1:return this.b}return U9(this,n-bX((Uqn(),OLt)),itn(0==(2&this.j)?OLt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t,e)},MWn.lh=function(n){switch(n){case 0:return null!=this.a;case 1:return null!=this.b}return O3(this,n-bX((Uqn(),OLt)),itn(0==(2&this.j)?OLt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.sh=function(n,t){switch(n){case 0:return void kb(this,SD(t));case 1:return void jb(this,SD(t))}Lbn(this,n-bX((Uqn(),OLt)),itn(0==(2&this.j)?OLt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t)},MWn.zh=function(){return Uqn(),OLt},MWn.Bh=function(n){switch(n){case 0:return void(this.a=null);case 1:return void(this.b=null)}qfn(this,n-bX((Uqn(),OLt)),itn(0==(2&this.j)?OLt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.Ib=function(){var n;return 0!=(4&this.j)?P$n(this):((n=new fN(P$n(this))).a+=" (data: ",cO(n,this.a),n.a+=", target: ",cO(n,this.b),n.a+=")",n.a)},MWn.a=null,MWn.b=null,vX(N7n,"ProcessingInstructionImpl",667),wAn(668,830,{105:1,92:1,90:1,56:1,49:1,97:1,843:1,2022:1,668:1},_m),MWn._g=function(n,t,e){switch(n){case 0:return e?(!this.c&&(this.c=new Ecn(this,0)),this.c):(!this.c&&(this.c=new Ecn(this,0)),this.c.b);case 1:return e?(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)):(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),215)).kl();case 2:return e?(!this.b&&(this.b=new Ecn(this,2)),this.b):(!this.b&&(this.b=new Ecn(this,2)),this.b.b);case 3:return!this.c&&(this.c=new Ecn(this,0)),SD(rHn(this.c,(Uqn(),LLt),!0));case 4:return gK(this.a,(!this.c&&(this.c=new Ecn(this,0)),SD(rHn(this.c,(Uqn(),LLt),!0))));case 5:return this.a}return U9(this,n-bX((Uqn(),$Lt)),itn(0==(2&this.j)?$Lt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t,e)},MWn.lh=function(n){switch(n){case 0:return!!this.c&&0!=this.c.i;case 1:return!(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)).dc();case 2:return!!this.b&&0!=this.b.i;case 3:return!this.c&&(this.c=new Ecn(this,0)),null!=SD(rHn(this.c,(Uqn(),LLt),!0));case 4:return null!=gK(this.a,(!this.c&&(this.c=new Ecn(this,0)),SD(rHn(this.c,(Uqn(),LLt),!0))));case 5:return!!this.a}return O3(this,n-bX((Uqn(),$Lt)),itn(0==(2&this.j)?$Lt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.c&&(this.c=new Ecn(this,0)),void tX(this.c,t);case 1:return void(!this.c&&(this.c=new Ecn(this,0)),BB(BB(n1(this.c,(Uqn(),vLt)),153),215)).Wb(t);case 2:return!this.b&&(this.b=new Ecn(this,2)),void tX(this.b,t);case 3:return void F0(this,SD(t));case 4:return void F0(this,pK(this.a,t));case 5:return void Eb(this,BB(t,148))}Lbn(this,n-bX((Uqn(),$Lt)),itn(0==(2&this.j)?$Lt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t)},MWn.zh=function(){return Uqn(),$Lt},MWn.Bh=function(n){switch(n){case 0:return!this.c&&(this.c=new Ecn(this,0)),void sqn(this.c);case 1:return void(!this.c&&(this.c=new Ecn(this,0)),BB(n1(this.c,(Uqn(),vLt)),153)).$b();case 2:return!this.b&&(this.b=new Ecn(this,2)),void sqn(this.b);case 3:return!this.c&&(this.c=new Ecn(this,0)),void MHn(this.c,(Uqn(),LLt),null);case 4:return void F0(this,pK(this.a,null));case 5:return void(this.a=null)}qfn(this,n-bX((Uqn(),$Lt)),itn(0==(2&this.j)?$Lt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},vX(N7n,"SimpleAnyTypeImpl",668),wAn(669,506,{105:1,92:1,90:1,56:1,49:1,97:1,2023:1,669:1},Km),MWn._g=function(n,t,e){switch(n){case 0:return e?(!this.a&&(this.a=new Ecn(this,0)),this.a):(!this.a&&(this.a=new Ecn(this,0)),this.a.b);case 1:return e?(!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),this.b):(!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),A8(this.b));case 2:return e?(!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),this.c):(!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),A8(this.c));case 3:return!this.a&&(this.a=new Ecn(this,0)),n1(this.a,(Uqn(),DLt));case 4:return!this.a&&(this.a=new Ecn(this,0)),n1(this.a,(Uqn(),RLt));case 5:return!this.a&&(this.a=new Ecn(this,0)),n1(this.a,(Uqn(),_Lt));case 6:return!this.a&&(this.a=new Ecn(this,0)),n1(this.a,(Uqn(),FLt))}return U9(this,n-bX((Uqn(),xLt)),itn(0==(2&this.j)?xLt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t,e)},MWn.jh=function(n,t,e){switch(t){case 0:return!this.a&&(this.a=new Ecn(this,0)),TKn(this.a,n,e);case 1:return!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),BK(this.b,n,e);case 2:return!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),BK(this.c,n,e);case 5:return!this.a&&(this.a=new Ecn(this,0)),tR(n1(this.a,(Uqn(),_Lt)),n,e)}return BB(itn(0==(2&this.j)?(Uqn(),xLt):(!this.k&&(this.k=new Kf),this.k).ck(),t),66).Nj().Rj(this,Q7(this),t-bX((Uqn(),xLt)),n,e)},MWn.lh=function(n){switch(n){case 0:return!!this.a&&0!=this.a.i;case 1:return!!this.b&&0!=this.b.f;case 2:return!!this.c&&0!=this.c.f;case 3:return!this.a&&(this.a=new Ecn(this,0)),!HI(n1(this.a,(Uqn(),DLt)));case 4:return!this.a&&(this.a=new Ecn(this,0)),!HI(n1(this.a,(Uqn(),RLt)));case 5:return!this.a&&(this.a=new Ecn(this,0)),!HI(n1(this.a,(Uqn(),_Lt)));case 6:return!this.a&&(this.a=new Ecn(this,0)),!HI(n1(this.a,(Uqn(),FLt)))}return O3(this,n-bX((Uqn(),xLt)),itn(0==(2&this.j)?xLt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.sh=function(n,t){switch(n){case 0:return!this.a&&(this.a=new Ecn(this,0)),void tX(this.a,t);case 1:return!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),void tan(this.b,t);case 2:return!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),void tan(this.c,t);case 3:return!this.a&&(this.a=new Ecn(this,0)),Nv(n1(this.a,(Uqn(),DLt))),!this.a&&(this.a=new Ecn(this,0)),void Z$(n1(this.a,DLt),BB(t,14));case 4:return!this.a&&(this.a=new Ecn(this,0)),Nv(n1(this.a,(Uqn(),RLt))),!this.a&&(this.a=new Ecn(this,0)),void Z$(n1(this.a,RLt),BB(t,14));case 5:return!this.a&&(this.a=new Ecn(this,0)),Nv(n1(this.a,(Uqn(),_Lt))),!this.a&&(this.a=new Ecn(this,0)),void Z$(n1(this.a,_Lt),BB(t,14));case 6:return!this.a&&(this.a=new Ecn(this,0)),Nv(n1(this.a,(Uqn(),FLt))),!this.a&&(this.a=new Ecn(this,0)),void Z$(n1(this.a,FLt),BB(t,14))}Lbn(this,n-bX((Uqn(),xLt)),itn(0==(2&this.j)?xLt:(!this.k&&(this.k=new Kf),this.k).ck(),n),t)},MWn.zh=function(){return Uqn(),xLt},MWn.Bh=function(n){switch(n){case 0:return!this.a&&(this.a=new Ecn(this,0)),void sqn(this.a);case 1:return!this.b&&(this.b=new y9((gWn(),k$t),X$t,this,1)),void this.b.c.$b();case 2:return!this.c&&(this.c=new y9((gWn(),k$t),X$t,this,2)),void this.c.c.$b();case 3:return!this.a&&(this.a=new Ecn(this,0)),void Nv(n1(this.a,(Uqn(),DLt)));case 4:return!this.a&&(this.a=new Ecn(this,0)),void Nv(n1(this.a,(Uqn(),RLt)));case 5:return!this.a&&(this.a=new Ecn(this,0)),void Nv(n1(this.a,(Uqn(),_Lt)));case 6:return!this.a&&(this.a=new Ecn(this,0)),void Nv(n1(this.a,(Uqn(),FLt)))}qfn(this,n-bX((Uqn(),xLt)),itn(0==(2&this.j)?xLt:(!this.k&&(this.k=new Kf),this.k).ck(),n))},MWn.Ib=function(){var n;return 0!=(4&this.j)?P$n(this):((n=new fN(P$n(this))).a+=" (mixed: ",rO(n,this.a),n.a+=")",n.a)},vX(N7n,"XMLTypeDocumentRootImpl",669),wAn(1919,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1,2024:1},Ds),MWn.Ih=function(n,t){switch(n.yj()){case 7:case 8:case 9:case 10:case 16:case 22:case 23:case 24:case 25:case 26:case 32:case 33:case 34:case 36:case 37:case 44:case 45:case 50:case 51:case 53:case 55:case 56:case 57:case 58:case 60:case 61:case 4:return null==t?null:Bbn(t);case 19:case 28:case 29:case 35:case 38:case 39:case 41:case 46:case 52:case 54:case 5:return SD(t);case 6:return mD(BB(t,190));case 12:case 47:case 49:case 11:return qGn(this,n,t);case 13:return null==t?null:GBn(BB(t,240));case 15:case 14:return null==t?null:RU(Gy(MD(t)));case 17:return EEn((Uqn(),t));case 18:return EEn(t);case 21:case 20:return null==t?null:KU(BB(t,155).a);case 27:return yD(BB(t,190));case 30:return _mn((Uqn(),BB(t,15)));case 31:return _mn(BB(t,15));case 40:return jD((Uqn(),t));case 42:return TEn((Uqn(),t));case 43:return TEn(t);case 59:case 48:return kD((Uqn(),t));default:throw Hp(new _y(d6n+n.ne()+g6n))}},MWn.Jh=function(n){var t;switch(-1==n.G&&(n.G=(t=Utn(n))?uvn(t.Mh(),n):-1),n.G){case 0:return new Rm;case 1:return new Rs;case 2:return new _m;case 3:return new Km;default:throw Hp(new _y(m6n+n.zb+g6n))}},MWn.Kh=function(n,t){var e,i,r,c,a,u,o,s,h,f,l,b,w,d,g,p;switch(n.yj()){case 5:case 52:case 4:return t;case 6:return ypn(t);case 8:case 7:return null==t?null:_En(t);case 9:return null==t?null:Pnn(l_n((i=FBn(t,!0)).length>0&&(b1(0,i.length),43==i.charCodeAt(0))?i.substr(1):i,-128,127)<<24>>24);case 10:return null==t?null:Pnn(l_n((r=FBn(t,!0)).length>0&&(b1(0,r.length),43==r.charCodeAt(0))?r.substr(1):r,-128,127)<<24>>24);case 11:return SD(xXn(this,(Uqn(),kLt),t));case 12:return SD(xXn(this,(Uqn(),jLt),t));case 13:return null==t?null:new wE(FBn(t,!0));case 15:case 14:return gLn(t);case 16:return SD(xXn(this,(Uqn(),ELt),t));case 17:return Hdn((Uqn(),t));case 18:return Hdn(t);case 28:case 29:case 35:case 38:case 39:case 41:case 54:case 19:return FBn(t,!0);case 21:case 20:return ILn(t);case 22:return SD(xXn(this,(Uqn(),TLt),t));case 23:return SD(xXn(this,(Uqn(),MLt),t));case 24:return SD(xXn(this,(Uqn(),SLt),t));case 25:return SD(xXn(this,(Uqn(),PLt),t));case 26:return SD(xXn(this,(Uqn(),CLt),t));case 27:return Zgn(t);case 30:return qdn((Uqn(),t));case 31:return qdn(t);case 32:return null==t?null:iln(l_n((h=FBn(t,!0)).length>0&&(b1(0,h.length),43==h.charCodeAt(0))?h.substr(1):h,_Vn,DWn));case 33:return null==t?null:new $A((f=FBn(t,!0)).length>0&&(b1(0,f.length),43==f.charCodeAt(0))?f.substr(1):f);case 34:return null==t?null:iln(l_n((l=FBn(t,!0)).length>0&&(b1(0,l.length),43==l.charCodeAt(0))?l.substr(1):l,_Vn,DWn));case 36:return null==t?null:jgn(rUn((b=FBn(t,!0)).length>0&&(b1(0,b.length),43==b.charCodeAt(0))?b.substr(1):b));case 37:return null==t?null:jgn(rUn((w=FBn(t,!0)).length>0&&(b1(0,w.length),43==w.charCodeAt(0))?w.substr(1):w));case 40:return Vwn((Uqn(),t));case 42:return Gdn((Uqn(),t));case 43:return Gdn(t);case 44:return null==t?null:new $A((d=FBn(t,!0)).length>0&&(b1(0,d.length),43==d.charCodeAt(0))?d.substr(1):d);case 45:return null==t?null:new $A((g=FBn(t,!0)).length>0&&(b1(0,g.length),43==g.charCodeAt(0))?g.substr(1):g);case 46:return FBn(t,!1);case 47:return SD(xXn(this,(Uqn(),ILt),t));case 59:case 48:return Wwn((Uqn(),t));case 49:return SD(xXn(this,(Uqn(),ALt),t));case 50:return null==t?null:rln(l_n((p=FBn(t,!0)).length>0&&(b1(0,p.length),43==p.charCodeAt(0))?p.substr(1):p,Q9n,32767)<<16>>16);case 51:return null==t?null:rln(l_n((c=FBn(t,!0)).length>0&&(b1(0,c.length),43==c.charCodeAt(0))?c.substr(1):c,Q9n,32767)<<16>>16);case 53:return SD(xXn(this,(Uqn(),NLt),t));case 55:return null==t?null:rln(l_n((a=FBn(t,!0)).length>0&&(b1(0,a.length),43==a.charCodeAt(0))?a.substr(1):a,Q9n,32767)<<16>>16);case 56:return null==t?null:rln(l_n((u=FBn(t,!0)).length>0&&(b1(0,u.length),43==u.charCodeAt(0))?u.substr(1):u,Q9n,32767)<<16>>16);case 57:return null==t?null:jgn(rUn((o=FBn(t,!0)).length>0&&(b1(0,o.length),43==o.charCodeAt(0))?o.substr(1):o));case 58:return null==t?null:jgn(rUn((s=FBn(t,!0)).length>0&&(b1(0,s.length),43==s.charCodeAt(0))?s.substr(1):s));case 60:return null==t?null:iln(l_n((e=FBn(t,!0)).length>0&&(b1(0,e.length),43==e.charCodeAt(0))?e.substr(1):e,_Vn,DWn));case 61:return null==t?null:iln(l_n(FBn(t,!0),_Vn,DWn));default:throw Hp(new _y(d6n+n.ne()+g6n))}},vX(N7n,"XMLTypeFactoryImpl",1919),wAn(586,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1,1945:1,586:1},zW),MWn.N=!1,MWn.O=!1;var WLt,VLt,QLt,YLt,JLt,ZLt=!1;vX(N7n,"XMLTypePackageImpl",586),wAn(1852,1,{837:1},Ks),MWn._j=function(){return fFn(),TNt},vX(N7n,"XMLTypePackageImpl/1",1852),wAn(1861,1,s7n,_s),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/10",1861),wAn(1862,1,s7n,Fs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/11",1862),wAn(1863,1,s7n,Bs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/12",1863),wAn(1864,1,s7n,Hs),MWn.wj=function(n){return UI(n)},MWn.xj=function(n){return x8(Ptt,sVn,333,n,7,1)},vX(N7n,"XMLTypePackageImpl/13",1864),wAn(1865,1,s7n,qs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/14",1865),wAn(1866,1,s7n,Gs),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/15",1866),wAn(1867,1,s7n,zs),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/16",1867),wAn(1868,1,s7n,Us),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/17",1868),wAn(1869,1,s7n,Xs),MWn.wj=function(n){return cL(n,155)},MWn.xj=function(n){return x8(Ctt,sVn,155,n,0,1)},vX(N7n,"XMLTypePackageImpl/18",1869),wAn(1870,1,s7n,Ws),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/19",1870),wAn(1853,1,s7n,Vs),MWn.wj=function(n){return cL(n,843)},MWn.xj=function(n){return x8(wLt,HWn,843,n,0,1)},vX(N7n,"XMLTypePackageImpl/2",1853),wAn(1871,1,s7n,Qs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/20",1871),wAn(1872,1,s7n,Ys),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/21",1872),wAn(1873,1,s7n,Js),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/22",1873),wAn(1874,1,s7n,Zs),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/23",1874),wAn(1875,1,s7n,nh),MWn.wj=function(n){return cL(n,190)},MWn.xj=function(n){return x8(NNt,sVn,190,n,0,2)},vX(N7n,"XMLTypePackageImpl/24",1875),wAn(1876,1,s7n,th),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/25",1876),wAn(1877,1,s7n,eh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/26",1877),wAn(1878,1,s7n,ih),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/27",1878),wAn(1879,1,s7n,rh),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/28",1879),wAn(1880,1,s7n,ch),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/29",1880),wAn(1854,1,s7n,ah),MWn.wj=function(n){return cL(n,667)},MWn.xj=function(n){return x8(zLt,HWn,2021,n,0,1)},vX(N7n,"XMLTypePackageImpl/3",1854),wAn(1881,1,s7n,uh),MWn.wj=function(n){return cL(n,19)},MWn.xj=function(n){return x8(Att,sVn,19,n,0,1)},vX(N7n,"XMLTypePackageImpl/30",1881),wAn(1882,1,s7n,oh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/31",1882),wAn(1883,1,s7n,sh),MWn.wj=function(n){return cL(n,162)},MWn.xj=function(n){return x8(Rtt,sVn,162,n,0,1)},vX(N7n,"XMLTypePackageImpl/32",1883),wAn(1884,1,s7n,hh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/33",1884),wAn(1885,1,s7n,fh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/34",1885),wAn(1886,1,s7n,lh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/35",1886),wAn(1887,1,s7n,bh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/36",1887),wAn(1888,1,s7n,wh),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/37",1888),wAn(1889,1,s7n,dh),MWn.wj=function(n){return cL(n,15)},MWn.xj=function(n){return x8(Rnt,nZn,15,n,0,1)},vX(N7n,"XMLTypePackageImpl/38",1889),wAn(1890,1,s7n,gh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/39",1890),wAn(1855,1,s7n,ph),MWn.wj=function(n){return cL(n,668)},MWn.xj=function(n){return x8(ULt,HWn,2022,n,0,1)},vX(N7n,"XMLTypePackageImpl/4",1855),wAn(1891,1,s7n,vh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/40",1891),wAn(1892,1,s7n,mh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/41",1892),wAn(1893,1,s7n,yh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/42",1893),wAn(1894,1,s7n,kh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/43",1894),wAn(1895,1,s7n,jh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/44",1895),wAn(1896,1,s7n,Eh),MWn.wj=function(n){return cL(n,184)},MWn.xj=function(n){return x8(_tt,sVn,184,n,0,1)},vX(N7n,"XMLTypePackageImpl/45",1896),wAn(1897,1,s7n,Th),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/46",1897),wAn(1898,1,s7n,Mh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/47",1898),wAn(1899,1,s7n,Sh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/48",1899),wAn(sQn,1,s7n,Ph),MWn.wj=function(n){return cL(n,184)},MWn.xj=function(n){return x8(_tt,sVn,184,n,0,1)},vX(N7n,"XMLTypePackageImpl/49",sQn),wAn(1856,1,s7n,Ch),MWn.wj=function(n){return cL(n,669)},MWn.xj=function(n){return x8(XLt,HWn,2023,n,0,1)},vX(N7n,"XMLTypePackageImpl/5",1856),wAn(1901,1,s7n,Ih),MWn.wj=function(n){return cL(n,162)},MWn.xj=function(n){return x8(Rtt,sVn,162,n,0,1)},vX(N7n,"XMLTypePackageImpl/50",1901),wAn(1902,1,s7n,Oh),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/51",1902),wAn(1903,1,s7n,Ah),MWn.wj=function(n){return cL(n,19)},MWn.xj=function(n){return x8(Att,sVn,19,n,0,1)},vX(N7n,"XMLTypePackageImpl/52",1903),wAn(1857,1,s7n,$h),MWn.wj=function(n){return XI(n)},MWn.xj=function(n){return x8(Qtt,sVn,2,n,6,1)},vX(N7n,"XMLTypePackageImpl/6",1857),wAn(1858,1,s7n,Lh),MWn.wj=function(n){return cL(n,190)},MWn.xj=function(n){return x8(NNt,sVn,190,n,0,2)},vX(N7n,"XMLTypePackageImpl/7",1858),wAn(1859,1,s7n,Nh),MWn.wj=function(n){return zI(n)},MWn.xj=function(n){return x8(ktt,sVn,476,n,8,1)},vX(N7n,"XMLTypePackageImpl/8",1859),wAn(1860,1,s7n,xh),MWn.wj=function(n){return cL(n,217)},MWn.xj=function(n){return x8(Ttt,sVn,217,n,0,1)},vX(N7n,"XMLTypePackageImpl/9",1860),wAn(50,60,BVn,ak),vX(ant,"RegEx/ParseException",50),wAn(820,1,{},Dh),MWn.sl=function(n){return n<this.j&&63==fV(this.i,n)},MWn.tl=function(){var n,t,e,i,r;if(10!=this.c)throw Hp(new ak(kWn((u$(),g8n))));switch(n=this.a){case 101:n=27;break;case 102:n=12;break;case 110:n=10;break;case 114:n=13;break;case 116:n=9;break;case 120:if(QXn(this),0!=this.c)throw Hp(new ak(kWn((u$(),B8n))));if(123==this.a){for(r=0,e=0;;){if(QXn(this),0!=this.c)throw Hp(new ak(kWn((u$(),B8n))));if((r=Gvn(this.a))<0)break;if(e>16*e)throw Hp(new ak(kWn((u$(),H8n))));e=16*e+r}if(125!=this.a)throw Hp(new ak(kWn((u$(),q8n))));if(e>unt)throw Hp(new ak(kWn((u$(),G8n))));n=e}else{if(r=0,0!=this.c||(r=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(e=r,QXn(this),0!=this.c||(r=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));n=e=16*e+r}break;case 117:if(i=0,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));n=t=16*t+i;break;case 118:if(QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if(t=16*t+i,QXn(this),0!=this.c||(i=Gvn(this.a))<0)throw Hp(new ak(kWn((u$(),B8n))));if((t=16*t+i)>unt)throw Hp(new ak(kWn((u$(),"parser.descappe.4"))));n=t;break;case 65:case 90:case 122:throw Hp(new ak(kWn((u$(),z8n))))}return n},MWn.ul=function(n){var t;switch(n){case 100:t=32==(32&this.e)?ZUn("Nd",!0):(wWn(),uNt);break;case 68:t=32==(32&this.e)?ZUn("Nd",!1):(wWn(),lNt);break;case 119:t=32==(32&this.e)?ZUn("IsWord",!0):(wWn(),kNt);break;case 87:t=32==(32&this.e)?ZUn("IsWord",!1):(wWn(),wNt);break;case 115:t=32==(32&this.e)?ZUn("IsSpace",!0):(wWn(),gNt);break;case 83:t=32==(32&this.e)?ZUn("IsSpace",!1):(wWn(),bNt);break;default:throw Hp(new dy(ont+n.toString(16)))}return t},MWn.vl=function(n){var t,e,i,r,c,a,u,o,s,h,f;for(this.b=1,QXn(this),t=null,0==this.c&&94==this.a?(QXn(this),n?(wWn(),wWn(),s=new M0(5)):(wWn(),wWn(),Yxn(t=new M0(4),0,unt),s=new M0(4))):(wWn(),wWn(),s=new M0(4)),r=!0;1!=(f=this.c)&&(0!=f||93!=this.a||r);){if(r=!1,e=this.a,i=!1,10==f)switch(e){case 100:case 68:case 119:case 87:case 115:case 83:sHn(s,this.ul(e)),i=!0;break;case 105:case 73:case 99:case 67:(e=this.Ll(s,e))<0&&(i=!0);break;case 112:case 80:if(!(h=DIn(this,e)))throw Hp(new ak(kWn((u$(),O8n))));sHn(s,h),i=!0;break;default:e=this.tl()}else if(20==f){if((c=lx(this.i,58,this.d))<0)throw Hp(new ak(kWn((u$(),A8n))));if(a=!0,94==fV(this.i,this.d)&&(++this.d,a=!1),!(u=b9(fx(this.i,this.d,c),a,512==(512&this.e))))throw Hp(new ak(kWn((u$(),L8n))));if(sHn(s,u),i=!0,c+1>=this.j||93!=fV(this.i,c+1))throw Hp(new ak(kWn((u$(),A8n))));this.d=c+2}if(QXn(this),!i)if(0!=this.c||45!=this.a)Yxn(s,e,e);else{if(QXn(this),1==(f=this.c))throw Hp(new ak(kWn((u$(),$8n))));0==f&&93==this.a?(Yxn(s,e,e),Yxn(s,45,45)):(o=this.a,10==f&&(o=this.tl()),QXn(this),Yxn(s,e,o))}(this.e&k6n)==k6n&&0==this.c&&44==this.a&&QXn(this)}if(1==this.c)throw Hp(new ak(kWn((u$(),$8n))));return t&&(WGn(t,s),s=t),T$n(s),qHn(s),this.b=0,QXn(this),s},MWn.wl=function(){var n,t,e,i;for(e=this.vl(!1);7!=(i=this.c);){if(n=this.a,(0!=i||45!=n&&38!=n)&&4!=i)throw Hp(new ak(kWn((u$(),_8n))));if(QXn(this),9!=this.c)throw Hp(new ak(kWn((u$(),K8n))));if(t=this.vl(!1),4==i)sHn(e,t);else if(45==n)WGn(e,t);else{if(38!=n)throw Hp(new dy("ASSERT"));kGn(e,t)}}return QXn(this),e},MWn.xl=function(){var n,t;return n=this.a-48,wWn(),wWn(),t=new vJ(12,null,n),!this.g&&(this.g=new _v),Cv(this.g,new Op(n)),QXn(this),t},MWn.yl=function(){return QXn(this),wWn(),pNt},MWn.zl=function(){return QXn(this),wWn(),dNt},MWn.Al=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Bl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Cl=function(){return QXn(this),fsn()},MWn.Dl=function(){return QXn(this),wWn(),mNt},MWn.El=function(){return QXn(this),wWn(),jNt},MWn.Fl=function(){var n;if(this.d>=this.j||64!=(65504&(n=fV(this.i,this.d++))))throw Hp(new ak(kWn((u$(),S8n))));return QXn(this),wWn(),wWn(),new oG(0,n-64)},MWn.Gl=function(){return QXn(this),RFn()},MWn.Hl=function(){return QXn(this),wWn(),ENt},MWn.Il=function(){var n;return wWn(),wWn(),n=new oG(0,105),QXn(this),n},MWn.Jl=function(){return QXn(this),wWn(),yNt},MWn.Kl=function(){return QXn(this),wWn(),vNt},MWn.Ll=function(n,t){return this.tl()},MWn.Ml=function(){return QXn(this),wWn(),hNt},MWn.Nl=function(){var n,t,e,i,r;if(this.d+1>=this.j)throw Hp(new ak(kWn((u$(),E8n))));if(i=-1,t=null,49<=(n=fV(this.i,this.d))&&n<=57){if(i=n-48,!this.g&&(this.g=new _v),Cv(this.g,new Op(i)),++this.d,41!=fV(this.i,this.d))throw Hp(new ak(kWn((u$(),y8n))));++this.d}else switch(63==n&&--this.d,QXn(this),(t=OXn(this)).e){case 20:case 21:case 22:case 23:break;case 8:if(7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));break;default:throw Hp(new ak(kWn((u$(),T8n))))}if(QXn(this),e=null,2==(r=Vdn(this)).e){if(2!=r.em())throw Hp(new ak(kWn((u$(),M8n))));e=r.am(1),r=r.am(0)}if(7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),wWn(),wWn(),new jnn(i,t,r,e)},MWn.Ol=function(){return QXn(this),wWn(),fNt},MWn.Pl=function(){var n;if(QXn(this),n=uU(24,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Ql=function(){var n;if(QXn(this),n=uU(20,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Rl=function(){var n;if(QXn(this),n=uU(22,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Sl=function(){var n,t,e,i,r;for(n=0,e=0,t=-1;this.d<this.j&&0!=(r=QOn(t=fV(this.i,this.d)));)n|=r,++this.d;if(this.d>=this.j)throw Hp(new ak(kWn((u$(),k8n))));if(45==t){for(++this.d;this.d<this.j&&0!=(r=QOn(t=fV(this.i,this.d)));)e|=r,++this.d;if(this.d>=this.j)throw Hp(new ak(kWn((u$(),k8n))))}if(58==t){if(++this.d,QXn(this),i=AX(Vdn(this),n,e),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));QXn(this)}else{if(41!=t)throw Hp(new ak(kWn((u$(),j8n))));++this.d,QXn(this),i=AX(Vdn(this),n,e)}return i},MWn.Tl=function(){var n;if(QXn(this),n=uU(21,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Ul=function(){var n;if(QXn(this),n=uU(23,Vdn(this)),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Vl=function(){var n,t;if(QXn(this),n=this.f++,t=oU(Vdn(this),n),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),t},MWn.Wl=function(){var n;if(QXn(this),n=oU(Vdn(this),0),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Xl=function(n){return QXn(this),5==this.c?(QXn(this),gG(n,(wWn(),wWn(),new h4(9,n)))):gG(n,(wWn(),wWn(),new h4(3,n)))},MWn.Yl=function(n){var t;return QXn(this),wWn(),wWn(),t=new r$(2),5==this.c?(QXn(this),tqn(t,sNt),tqn(t,n)):(tqn(t,n),tqn(t,sNt)),t},MWn.Zl=function(n){return QXn(this),5==this.c?(QXn(this),wWn(),wWn(),new h4(9,n)):(wWn(),wWn(),new h4(3,n))},MWn.a=0,MWn.b=0,MWn.c=0,MWn.d=0,MWn.e=0,MWn.f=1,MWn.g=null,MWn.j=0,vX(ant,"RegEx/RegexParser",820),wAn(1824,820,{},Fm),MWn.sl=function(n){return!1},MWn.tl=function(){return qDn(this)},MWn.ul=function(n){return d_n(n)},MWn.vl=function(n){return ZXn(this)},MWn.wl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.xl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.yl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.zl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Al=function(){return QXn(this),d_n(67)},MWn.Bl=function(){return QXn(this),d_n(73)},MWn.Cl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Dl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.El=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Fl=function(){return QXn(this),d_n(99)},MWn.Gl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Hl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Il=function(){return QXn(this),d_n(105)},MWn.Jl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Kl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Ll=function(n,t){return sHn(n,d_n(t)),-1},MWn.Ml=function(){return QXn(this),wWn(),wWn(),new oG(0,94)},MWn.Nl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Ol=function(){return QXn(this),wWn(),wWn(),new oG(0,36)},MWn.Pl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Ql=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Rl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Sl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Tl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Ul=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Vl=function(){var n;if(QXn(this),n=oU(Vdn(this),0),7!=this.c)throw Hp(new ak(kWn((u$(),y8n))));return QXn(this),n},MWn.Wl=function(){throw Hp(new ak(kWn((u$(),U8n))))},MWn.Xl=function(n){return QXn(this),gG(n,(wWn(),wWn(),new h4(3,n)))},MWn.Yl=function(n){var t;return QXn(this),wWn(),wWn(),tqn(t=new r$(2),n),tqn(t,sNt),t},MWn.Zl=function(n){return QXn(this),wWn(),wWn(),new h4(3,n)};var nNt=null,tNt=null;vX(ant,"RegEx/ParserForXMLSchema",1824),wAn(117,1,ynt,Ap),MWn.$l=function(n){throw Hp(new dy("Not supported."))},MWn._l=function(){return-1},MWn.am=function(n){return null},MWn.bm=function(){return null},MWn.cm=function(n){},MWn.dm=function(n){},MWn.em=function(){return 0},MWn.Ib=function(){return this.fm(0)},MWn.fm=function(n){return 11==this.e?".":""},MWn.e=0;var eNt,iNt,rNt,cNt,aNt,uNt,oNt,sNt,hNt,fNt,lNt,bNt,wNt,dNt,gNt,pNt,vNt,mNt,yNt,kNt,jNt,ENt,TNt,MNt,SNt=null,PNt=null,CNt=null,INt=vX(ant,"RegEx/Token",117);wAn(136,117,{3:1,136:1,117:1},M0),MWn.fm=function(n){var t,e,i;if(4==this.e)if(this==oNt)e=".";else if(this==uNt)e="\\d";else if(this==kNt)e="\\w";else if(this==gNt)e="\\s";else{for((i=new Sk).a+="[",t=0;t<this.b.length;t+=2)0!=(n&k6n)&&t>0&&(i.a+=","),this.b[t]===this.b[t+1]?cO(i,aBn(this.b[t])):(cO(i,aBn(this.b[t])),i.a+="-",cO(i,aBn(this.b[t+1])));i.a+="]",e=i.a}else if(this==lNt)e="\\D";else if(this==wNt)e="\\W";else if(this==bNt)e="\\S";else{for((i=new Sk).a+="[^",t=0;t<this.b.length;t+=2)0!=(n&k6n)&&t>0&&(i.a+=","),this.b[t]===this.b[t+1]?cO(i,aBn(this.b[t])):(cO(i,aBn(this.b[t])),i.a+="-",cO(i,aBn(this.b[t+1])));i.a+="]",e=i.a}return e},MWn.a=!1,MWn.c=!1,vX(ant,"RegEx/RangeToken",136),wAn(584,1,{584:1},Op),MWn.a=0,vX(ant,"RegEx/RegexParser/ReferencePosition",584),wAn(583,1,{3:1,583:1},XE),MWn.Fb=function(n){var t;return null!=n&&!!cL(n,583)&&(t=BB(n,583),mK(this.b,t.b)&&this.a==t.a)},MWn.Hb=function(){return vvn(this.b+"/"+txn(this.a))},MWn.Ib=function(){return this.c.fm(this.a)},MWn.a=0,vX(ant,"RegEx/RegularExpression",583),wAn(223,117,ynt,oG),MWn._l=function(){return this.a},MWn.fm=function(n){var t,e;switch(this.e){case 0:switch(this.a){case 124:case 42:case 43:case 63:case 40:case 41:case 46:case 91:case 123:case 92:e="\\"+PR(this.a&QVn);break;case 12:e="\\f";break;case 10:e="\\n";break;case 13:e="\\r";break;case 9:e="\\t";break;case 27:e="\\e";break;default:e=this.a>=BQn?"\\v"+fx(t="0"+(this.a>>>0).toString(16),t.length-6,t.length):""+PR(this.a&QVn)}break;case 8:e=this==hNt||this==fNt?""+PR(this.a&QVn):"\\"+PR(this.a&QVn);break;default:e=null}return e},MWn.a=0,vX(ant,"RegEx/Token/CharToken",223),wAn(309,117,ynt,h4),MWn.am=function(n){return this.a},MWn.cm=function(n){this.b=n},MWn.dm=function(n){this.c=n},MWn.em=function(){return 1},MWn.fm=function(n){var t;if(3==this.e)if(this.c<0&&this.b<0)t=this.a.fm(n)+"*";else if(this.c==this.b)t=this.a.fm(n)+"{"+this.c+"}";else if(this.c>=0&&this.b>=0)t=this.a.fm(n)+"{"+this.c+","+this.b+"}";else{if(!(this.c>=0&&this.b<0))throw Hp(new dy("Token#toString(): CLOSURE "+this.c+FWn+this.b));t=this.a.fm(n)+"{"+this.c+",}"}else if(this.c<0&&this.b<0)t=this.a.fm(n)+"*?";else if(this.c==this.b)t=this.a.fm(n)+"{"+this.c+"}?";else if(this.c>=0&&this.b>=0)t=this.a.fm(n)+"{"+this.c+","+this.b+"}?";else{if(!(this.c>=0&&this.b<0))throw Hp(new dy("Token#toString(): NONGREEDYCLOSURE "+this.c+FWn+this.b));t=this.a.fm(n)+"{"+this.c+",}?"}return t},MWn.b=0,MWn.c=0,vX(ant,"RegEx/Token/ClosureToken",309),wAn(821,117,ynt,UU),MWn.am=function(n){return 0==n?this.a:this.b},MWn.em=function(){return 2},MWn.fm=function(n){return 3==this.b.e&&this.b.am(0)==this.a?this.a.fm(n)+"+":9==this.b.e&&this.b.am(0)==this.a?this.a.fm(n)+"+?":this.a.fm(n)+""+this.b.fm(n)},vX(ant,"RegEx/Token/ConcatToken",821),wAn(1822,117,ynt,jnn),MWn.am=function(n){if(0==n)return this.d;if(1==n)return this.b;throw Hp(new dy("Internal Error: "+n))},MWn.em=function(){return this.b?2:1},MWn.fm=function(n){var t;return t=this.c>0?"(?("+this.c+")":8==this.a.e?"(?("+this.a+")":"(?"+this.a,this.b?t+=this.d+"|"+this.b+")":t+=this.d+")",t},MWn.c=0,vX(ant,"RegEx/Token/ConditionToken",1822),wAn(1823,117,ynt,T0),MWn.am=function(n){return this.b},MWn.em=function(){return 1},MWn.fm=function(n){return"(?"+(0==this.a?"":txn(this.a))+(0==this.c?"":txn(this.c))+":"+this.b.fm(n)+")"},MWn.a=0,MWn.c=0,vX(ant,"RegEx/Token/ModifierToken",1823),wAn(822,117,ynt,cW),MWn.am=function(n){return this.a},MWn.em=function(){return 1},MWn.fm=function(n){var t;switch(t=null,this.e){case 6:t=0==this.b?"(?:"+this.a.fm(n)+")":"("+this.a.fm(n)+")";break;case 20:t="(?="+this.a.fm(n)+")";break;case 21:t="(?!"+this.a.fm(n)+")";break;case 22:t="(?<="+this.a.fm(n)+")";break;case 23:t="(?<!"+this.a.fm(n)+")";break;case 24:t="(?>"+this.a.fm(n)+")"}return t},MWn.b=0,vX(ant,"RegEx/Token/ParenToken",822),wAn(521,117,{3:1,117:1,521:1},vJ),MWn.bm=function(){return this.b},MWn.fm=function(n){return 12==this.e?"\\"+this.a:iAn(this.b)},MWn.a=0,vX(ant,"RegEx/Token/StringToken",521),wAn(465,117,ynt,r$),MWn.$l=function(n){tqn(this,n)},MWn.am=function(n){return BB(bW(this.a,n),117)},MWn.em=function(){return this.a?this.a.a.c.length:0},MWn.fm=function(n){var t,e,i,r,c;if(1==this.e){if(2==this.a.a.c.length)t=BB(bW(this.a,0),117),r=3==(e=BB(bW(this.a,1),117)).e&&e.am(0)==t?t.fm(n)+"+":9==e.e&&e.am(0)==t?t.fm(n)+"+?":t.fm(n)+""+e.fm(n);else{for(c=new Sk,i=0;i<this.a.a.c.length;i++)cO(c,BB(bW(this.a,i),117).fm(n));r=c.a}return r}if(2==this.a.a.c.length&&7==BB(bW(this.a,1),117).e)r=BB(bW(this.a,0),117).fm(n)+"?";else if(2==this.a.a.c.length&&7==BB(bW(this.a,0),117).e)r=BB(bW(this.a,1),117).fm(n)+"??";else{for(cO(c=new Sk,BB(bW(this.a,0),117).fm(n)),i=1;i<this.a.a.c.length;i++)c.a+="|",cO(c,BB(bW(this.a,i),117).fm(n));r=c.a}return r},vX(ant,"RegEx/Token/UnionToken",465),wAn(518,1,{592:1},UE),MWn.Ib=function(){return this.a.b},vX(knt,"XMLTypeUtil/PatternMatcherImpl",518),wAn(1622,1381,{},Rh),vX(knt,"XMLTypeValidator",1622),wAn(264,1,pVn,hz),MWn.Jc=function(n){e5(this,n)},MWn.Kc=function(){return(this.b-this.a)*this.c<0?MNt:new XL(this)},MWn.a=0,MWn.b=0,MWn.c=0,vX(Ent,"ExclusiveRange",264),wAn(1068,1,cVn,Kh),MWn.Rb=function(n){BB(n,19),l$()},MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return GE()},MWn.Ub=function(){return zE()},MWn.Wb=function(n){BB(n,19),w$()},MWn.Ob=function(){return!1},MWn.Sb=function(){return!1},MWn.Tb=function(){return-1},MWn.Vb=function(){return-1},MWn.Qb=function(){throw Hp(new tk(Snt))},vX(Ent,"ExclusiveRange/1",1068),wAn(254,1,cVn,XL),MWn.Rb=function(n){BB(n,19),b$()},MWn.Nb=function(n){fU(this,n)},MWn.Pb=function(){return Fhn(this)},MWn.Ub=function(){return O9(this)},MWn.Wb=function(n){BB(n,19),d$()},MWn.Ob=function(){return this.c.c<0?this.a>=this.c.b:this.a<=this.c.b},MWn.Sb=function(){return this.b>0},MWn.Tb=function(){return this.b},MWn.Vb=function(){return this.b-1},MWn.Qb=function(){throw Hp(new tk(Snt))},MWn.a=0,MWn.b=0,vX(Ent,"ExclusiveRange/RangeIterator",254);var ONt=RW(P9n,"C"),ANt=RW(O9n,"I"),$Nt=RW($Wn,"Z"),LNt=RW(A9n,"J"),NNt=RW(S9n,"B"),xNt=RW(C9n,"D"),DNt=RW(I9n,"F"),RNt=RW($9n,"S"),KNt=bq("org.eclipse.elk.core.labels","ILabelManager"),_Nt=bq(B6n,"DiagnosticChain"),FNt=bq(f7n,"ResourceSet"),BNt=vX(B6n,"InvocationTargetException",null),HNt=(Dk(),f5),qNt=qNt=hEn;Zen(Qp),scn("permProps",[[[Pnt,Cnt],[Int,"gecko1_8"]],[[Pnt,Cnt],[Int,"ie10"]],[[Pnt,Cnt],[Int,"ie8"]],[[Pnt,Cnt],[Int,"ie9"]],[[Pnt,Cnt],[Int,"safari"]]]),qNt(null,"elk",null)}).call(this)}).call(this,void 0!==e.g?e.g:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(n,t,e){"use strict";function i(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}function r(n,t){if(!n)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?n:t}function c(n,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);n.prototype=Object.create(t&&t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(n,t):n.__proto__=t)}var a=function(t){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var c=Object.assign({},t),a=!1;try{n.resolve("web-worker"),a=!0}catch(s){}if(t.workerUrl)if(a){var u=n("web-worker");c.workerFactory=function(n){return new u(n)}}else console.warn("Web worker requested but 'web-worker' package not installed. \nConsider installing the package or pass your own 'workerFactory' to ELK's constructor.\n... Falling back to non-web worker version.");if(!c.workerFactory){var o=n("./elk-worker.min.js").Worker;c.workerFactory=function(n){return new o(n)}}return r(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,c))}return c(e,t),e}(n("./elk-api.js").default);Object.defineProperty(t.exports,"__esModule",{value:!0}),t.exports=a,a.default=a},{"./elk-api.js":1,"./elk-worker.min.js":2,"web-worker":4}],4:[function(n,t,e){t.exports=Worker},{}]},{},[3])(3)},9487:(n,t,e)=>{"use strict";e.d(t,{diagram:()=>k});var i=e(6432),r=e(9373),c=e(3349),a=e(7295),u=e.n(a);e(7484),e(7967),e(7856),e(277),e(5625),e(9354),e(1518),e(9542),e(285),e(8734);const o=new(u()),s={},h={};let f={};const l=(n,t,e)=>{const r={TB:{in:{north:"north"},out:{south:"west",west:"east",east:"south"}},LR:{in:{west:"west"},out:{east:"south",south:"north",north:"east"}},RL:{in:{east:"east"},out:{west:"north",north:"south",south:"west"}},BT:{in:{south:"south"},out:{north:"east",east:"west",west:"north"}}};return r.TD=r.TB,i.l.info("abc88",e,t,n),r[e][t][n]},b=(n,t,e)=>{if(i.l.info("getNextPort abc88",{node:n,edgeDirection:t,graphDirection:e}),!s[n])switch(e){case"TB":case"TD":s[n]={inPosition:"north",outPosition:"south"};break;case"BT":s[n]={inPosition:"south",outPosition:"north"};break;case"RL":s[n]={inPosition:"east",outPosition:"west"};break;case"LR":s[n]={inPosition:"west",outPosition:"east"}}const r="in"===t?s[n].inPosition:s[n].outPosition;return"in"===t?s[n].inPosition=l(s[n].inPosition,t,e):s[n].outPosition=l(s[n].outPosition,t,e),r},w=function(n,t,e,c){i.l.info("abc78 edges = ",n);const a=c.insert("g").attr("class","edgeLabels");let u,o,s={},l=t.db.getDirection();if(void 0!==n.defaultStyle){const t=(0,i.a)(n.defaultStyle);u=t.style,o=t.labelStyle}return n.forEach((function(t){var c="L-"+t.start+"-"+t.end;void 0===s[c]?(s[c]=0,i.l.info("abc78 new entry",c,s[c])):(s[c]++,i.l.info("abc78 new entry",c,s[c]));let w=c+"-"+s[c];i.l.info("abc78 new link id to be used is",c,w,s[c]);var d="LS-"+t.start,g="LE-"+t.end;const p={style:"",labelStyle:""};switch(p.minlen=t.length||1,"arrow_open"===t.type?p.arrowhead="none":p.arrowhead="normal",p.arrowTypeStart="arrow_open",p.arrowTypeEnd="arrow_open",t.type){case"double_arrow_cross":p.arrowTypeStart="arrow_cross";case"arrow_cross":p.arrowTypeEnd="arrow_cross";break;case"double_arrow_point":p.arrowTypeStart="arrow_point";case"arrow_point":p.arrowTypeEnd="arrow_point";break;case"double_arrow_circle":p.arrowTypeStart="arrow_circle";case"arrow_circle":p.arrowTypeEnd="arrow_circle"}let v="",m="";switch(t.stroke){case"normal":v="fill:none;",void 0!==u&&(v=u),void 0!==o&&(m=o),p.thickness="normal",p.pattern="solid";break;case"dotted":p.thickness="normal",p.pattern="dotted",p.style="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":p.thickness="thick",p.pattern="solid",p.style="stroke-width: 3.5px;fill:none;"}if(void 0!==t.style){const n=(0,i.a)(t.style);v=n.style,m=n.labelStyle}p.style=p.style+=v,p.labelStyle=p.labelStyle+=m,void 0!==t.interpolate?p.curve=(0,i.d)(t.interpolate,r.c_6):void 0!==n.defaultInterpolate?p.curve=(0,i.d)(n.defaultInterpolate,r.c_6):p.curve=(0,i.d)(h.curve,r.c_6),void 0===t.text?void 0!==t.style&&(p.arrowheadStyle="fill: #333"):(p.arrowheadStyle="fill: #333",p.labelpos="c"),p.labelType="text",p.label=t.text.replace(i.c.lineBreakRegex,"\n"),void 0===t.style&&(p.style=p.style||"stroke: #333; stroke-width: 1.5px;fill:none;"),p.labelStyle=p.labelStyle.replace("color:","fill:"),p.id=w,p.classes="flowchart-link "+d+" "+g;const y=(0,i.f)(a,p),{source:k,target:j}=((n,t)=>{let e=n.start,i=n.end;const r=f[e],c=f[i];return r&&c?("diamond"===r.type&&(e=`${e}-${b(e,"out",t)}`),"diamond"===c.type&&(i=`${i}-${b(i,"in",t)}`),{source:e,target:i}):{source:e,target:i}})(t,l);i.l.debug("abc78 source and target",k,j),e.edges.push({id:"e"+t.start+t.end,sources:[k],targets:[j],labelEl:y,labels:[{width:p.width,height:p.height,orgWidth:p.width,orgHeight:p.height,text:p.label,layoutOptions:{"edgeLabels.inline":"true","edgeLabels.placement":"CENTER"}}],edgeData:p})})),e},d=function(n,t,e){const i=((n,t,e)=>{const{parentById:i}=e,r=new Set;let c=n;for(;c;){if(r.add(c),c===t)return c;c=i[c]}for(c=t;c;){if(r.has(c))return c;c=i[c]}return"root"})(n,t,e);if(void 0===i||"root"===i)return{x:0,y:0};const r=f[i].offset;return{x:r.posX,y:r.posY}},g=function(n,t,e,i,c){const a=d(t.sources[0],t.targets[0],c),u=t.sections[0].startPoint,o=t.sections[0].endPoint,s=(t.sections[0].bendPoints?t.sections[0].bendPoints:[]).map((n=>[n.x+a.x,n.y+a.y])),h=[[u.x+a.x,u.y+a.y],...s,[o.x+a.x,o.y+a.y]],f=(0,r.jvg)().curve(r.c_6),l=n.insert("path").attr("d",f(h)).attr("class","path").attr("fill","none"),b=n.insert("g").attr("class","edgeLabel"),w=(0,r.Ys)(b.node().appendChild(t.labelEl)),g=w.node().firstChild.getBoundingClientRect();w.attr("width",g.width),w.attr("height",g.height),b.attr("transform",`translate(${t.labels[0].x+a.x}, ${t.labels[0].y+a.y})`),function(n,t,e,i){let r="";switch(i&&(r=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,r=r.replace(/\(/g,"\\("),r=r.replace(/\)/g,"\\)")),t.arrowTypeStart){case"arrow_cross":n.attr("marker-start","url("+r+"#"+e+"-crossStart)");break;case"arrow_point":n.attr("marker-start","url("+r+"#"+e+"-pointStart)");break;case"arrow_barb":n.attr("marker-start","url("+r+"#"+e+"-barbStart)");break;case"arrow_circle":n.attr("marker-start","url("+r+"#"+e+"-circleStart)");break;case"aggregation":n.attr("marker-start","url("+r+"#"+e+"-aggregationStart)");break;case"extension":n.attr("marker-start","url("+r+"#"+e+"-extensionStart)");break;case"composition":n.attr("marker-start","url("+r+"#"+e+"-compositionStart)");break;case"dependency":n.attr("marker-start","url("+r+"#"+e+"-dependencyStart)");break;case"lollipop":n.attr("marker-start","url("+r+"#"+e+"-lollipopStart)")}switch(t.arrowTypeEnd){case"arrow_cross":n.attr("marker-end","url("+r+"#"+e+"-crossEnd)");break;case"arrow_point":n.attr("marker-end","url("+r+"#"+e+"-pointEnd)");break;case"arrow_barb":n.attr("marker-end","url("+r+"#"+e+"-barbEnd)");break;case"arrow_circle":n.attr("marker-end","url("+r+"#"+e+"-circleEnd)");break;case"aggregation":n.attr("marker-end","url("+r+"#"+e+"-aggregationEnd)");break;case"extension":n.attr("marker-end","url("+r+"#"+e+"-extensionEnd)");break;case"composition":n.attr("marker-end","url("+r+"#"+e+"-compositionEnd)");break;case"dependency":n.attr("marker-end","url("+r+"#"+e+"-dependencyEnd)");break;case"lollipop":n.attr("marker-end","url("+r+"#"+e+"-lollipopEnd)")}}(l,e,i.type,i.arrowMarkerAbsolute)},p=(n,t)=>{n.forEach((n=>{n.children||(n.children=[]);const e=t.childrenById[n.id];e&&e.forEach((t=>{n.children.push(f[t])})),p(n.children,t)}))},v=(n,t,e,r,c,a,u)=>{e.forEach((function(e){if(e)if(f[e.id].offset={posX:e.x+n,posY:e.y+t,x:n,y:t,depth:u,width:e.width,height:e.height},"group"===e.type){const r=c.insert("g").attr("class","subgraph");r.insert("rect").attr("class","subgraph subgraph-lvl-"+u%5+" node").attr("x",e.x+n).attr("y",e.y+t).attr("width",e.width).attr("height",e.height);const a=r.insert("g").attr("class","label");a.attr("transform",`translate(${e.labels[0].x+n+e.x}, ${e.labels[0].y+t+e.y})`),a.node().appendChild(e.labelData.labelNode),i.l.info("Id (UGH)= ",e.type,e.labels)}else i.l.info("Id (UGH)= ",e.id),e.el.attr("transform",`translate(${e.x+n+e.width/2}, ${e.y+t+e.height/2})`)})),e.forEach((function(e){e&&"group"===e.type&&v(n+e.x,t+e.y,e.children,r,c,a,u+1)}))},m={getClasses:function(n,t){i.l.info("Extracting classes"),t.db.clear("ver-2");try{return t.parse(n),t.db.getClasses()}catch(e){return{}}},draw:async function(n,t,e,a){var u;a.db.clear(),f={},a.db.setGen("gen-2"),a.parser.parse(n);const s=(0,r.Ys)("body").append("div").attr("style","height:400px").attr("id","cy");let h={id:"root",layoutOptions:{"elk.hierarchyHandling":"INCLUDE_CHILDREN","org.eclipse.elk.padding":"[top=100, left=100, bottom=110, right=110]","elk.layered.spacing.edgeNodeBetweenLayers":"30","elk.direction":"DOWN"},children:[],edges:[]};switch(i.l.info("Drawing flowchart using v3 renderer",o),a.db.getDirection()){case"BT":h.layoutOptions["elk.direction"]="UP";break;case"TB":h.layoutOptions["elk.direction"]="DOWN";break;case"LR":h.layoutOptions["elk.direction"]="RIGHT";break;case"RL":h.layoutOptions["elk.direction"]="LEFT"}const{securityLevel:l,flowchart:b}=(0,i.g)();let d;"sandbox"===l&&(d=(0,r.Ys)("#i"+t));const m="sandbox"===l?(0,r.Ys)(d.nodes()[0].contentDocument.body):(0,r.Ys)("body"),y="sandbox"===l?d.nodes()[0].contentDocument:document,k=m.select(`[id="${t}"]`);(0,i.i)(k,["point","circle","cross"],a.type,a.arrowMarkerAbsolute);const j=a.db.getVertices();let E;const T=a.db.getSubGraphs();i.l.info("Subgraphs - ",T);for(let i=T.length-1;i>=0;i--)E=T[i],a.db.addVertex(E.id,E.title,"group",void 0,E.classes,E.dir);const M=k.insert("g").attr("class","subgraphs"),S=function(n){const t={parentById:{},childrenById:{}},e=n.getSubGraphs();return i.l.info("Subgraphs - ",e),e.forEach((function(n){n.nodes.forEach((function(e){t.parentById[e]=n.id,void 0===t.childrenById[n.id]&&(t.childrenById[n.id]=[]),t.childrenById[n.id].push(e)}))})),e.forEach((function(n){n.id,void 0!==t.parentById[n.id]&&t.parentById[n.id]})),t}(a.db);h=function(n,t,e,r,a,u,o){const s=e.select(`[id="${t}"]`),h=s.insert("g").attr("class","nodes");return Object.keys(n).forEach((function(t){const e=n[t];let o="default";e.classes.length>0&&(o=e.classes.join(" "));const l=(0,i.a)(e.styles);let b,w=void 0!==e.text?e.text:e.id;const d={width:0,height:0};if((0,i.e)((0,i.g)().flowchart.htmlLabels)){const n={label:w.replace(/fa[blrs]?:fa-[\w-]+/g,(n=>`<i class='${n.replace(":"," ")}'></i>`))};b=(0,c.a)(s,n).node();const t=b.getBBox();d.width=t.width,d.height=t.height,d.labelNode=b,b.parentNode.removeChild(b)}else{const n=r.createElementNS("http://www.w3.org/2000/svg","text");n.setAttribute("style",l.labelStyle.replace("color:","fill:"));const t=w.split(i.c.lineBreakRegex);for(const i of t){const t=r.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","1"),t.textContent=i,n.appendChild(t)}b=n;const e=b.getBBox();d.width=e.width,d.height=e.height,d.labelNode=b}const g=[{id:e.id+"-west",layoutOptions:{"port.side":"WEST"}},{id:e.id+"-east",layoutOptions:{"port.side":"EAST"}},{id:e.id+"-south",layoutOptions:{"port.side":"SOUTH"}},{id:e.id+"-north",layoutOptions:{"port.side":"NORTH"}}];let p=0,v="",m={};switch(e.type){case"round":p=5,v="rect";break;case"square":case"group":default:v="rect";break;case"diamond":v="question",m={portConstraints:"FIXED_SIDE"};break;case"hexagon":v="hexagon";break;case"odd":case"odd_right":v="rect_left_inv_arrow";break;case"lean_right":v="lean_right";break;case"lean_left":v="lean_left";break;case"trapezoid":v="trapezoid";break;case"inv_trapezoid":v="inv_trapezoid";break;case"circle":v="circle";break;case"ellipse":v="ellipse";break;case"stadium":v="stadium";break;case"subroutine":v="subroutine";break;case"cylinder":v="cylinder";break;case"doublecircle":v="doublecircle"}const y={labelStyle:l.labelStyle,shape:v,labelText:w,rx:p,ry:p,class:o,style:l.style,id:e.id,link:e.link,linkTarget:e.linkTarget,tooltip:a.db.getTooltip(e.id)||"",domId:a.db.lookUpDomId(e.id),haveCallback:e.haveCallback,width:"group"===e.type?500:void 0,dir:e.dir,type:e.type,props:e.props,padding:(0,i.g)().flowchart.padding};let k,j;"group"!==y.type&&(j=(0,i.b)(h,y,e.dir),k=j.node().getBBox());const E={id:e.id,ports:"diamond"===e.type?g:[],layoutOptions:m,labelText:w,labelData:d,domId:a.db.lookUpDomId(e.id),width:null==k?void 0:k.width,height:null==k?void 0:k.height,type:e.type,el:j,parent:u.parentById[e.id]};f[y.id]=E})),o}(j,t,m,y,a,S,h);const P=k.insert("g").attr("class","edges edgePath"),C=a.db.getEdges();h=w(C,a,h,k);Object.keys(f).forEach((n=>{const t=f[n];t.parent||h.children.push(t),void 0!==S.childrenById[n]&&(t.labels=[{text:t.labelText,layoutOptions:{"nodeLabels.placement":"[H_CENTER, V_TOP, INSIDE]"},width:t.labelData.width,height:t.labelData.height}],delete t.x,delete t.y,delete t.width,delete t.height)})),p(h.children,S),i.l.info("after layout",JSON.stringify(h,null,2));const I=await o.layout(h);v(0,0,I.children,k,M,a,0),i.l.info("after layout",I),null==(u=I.edges)||u.map((n=>{g(P,n,n.edgeData,a,S)})),(0,i.s)({},k,b.diagramPadding,b.useMaxWidth),s.remove()}},y=n=>`.label {\n font-family: ${n.fontFamily};\n color: ${n.nodeTextColor||n.textColor};\n }\n .cluster-label text {\n fill: ${n.titleColor};\n }\n .cluster-label span {\n color: ${n.titleColor};\n }\n\n .label text,span {\n fill: ${n.nodeTextColor||n.textColor};\n color: ${n.nodeTextColor||n.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${n.mainBkg};\n stroke: ${n.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${n.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${n.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${n.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${n.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${n.edgeLabelBackground};\n fill: ${n.edgeLabelBackground};\n }\n text-align: center;\n }\n\n .cluster rect {\n fill: ${n.clusterBkg};\n stroke: ${n.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${n.titleColor};\n }\n\n .cluster span {\n color: ${n.titleColor};\n }\n /* .cluster div {\n color: ${n.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${n.fontFamily};\n font-size: 12px;\n background: ${n.tertiaryColor};\n border: 1px solid ${n.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${n.textColor};\n }\n .subgraph {\n stroke-width:2;\n rx:3;\n }\n // .subgraph-lvl-1 {\n // fill:#ccc;\n // // stroke:black;\n // }\n ${(n=>{let t="";for(let e=0;e<5;e++)t+=`\n .subgraph-lvl-${e} {\n fill: ${n[`surface${e}`]};\n stroke: ${n[`surfacePeer${e}`]};\n }\n `;return t})(n)}\n`,k={db:i.h,renderer:m,parser:i.p,styles:y}}}]); \ No newline at end of file diff --git a/assets/js/95b96bb9.aefbf3b7.js b/assets/js/95b96bb9.aefbf3b7.js new file mode 100644 index 0000000..4711a8e --- /dev/null +++ b/assets/js/95b96bb9.aefbf3b7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3561],{4577:e=>{e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"How can Copr help with broken dependencies","permalink":"/blog/2023/08/02/copr"},{"title":"4th week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/4th-week"},{"title":"3rd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/3rd-week"},{"title":"Sort the matrix diagonally","permalink":"/blog/leetcode/sort-diagonally"},{"title":"2nd week of Advent of Code \'22 in Rust","permalink":"/blog/aoc-2022/2nd-week"}]}')}}]); \ No newline at end of file diff --git a/assets/js/95be84b6.0463fc28.js b/assets/js/95be84b6.0463fc28.js new file mode 100644 index 0000000..5378c5a --- /dev/null +++ b/assets/js/95be84b6.0463fc28.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3835],{1820:t=>{t.exports=JSON.parse('{"label":"csharp","permalink":"/ib002/tags/csharp","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"graphs/iterative-and-iterators","title":"Iterative algorithms via iterators","description":"Iterative DFS using iterators.\\n","permalink":"/ib002/graphs/iterative-and-iterators"}]}')}}]); \ No newline at end of file diff --git a/assets/js/95f41f0b.79e14732.js b/assets/js/95f41f0b.79e14732.js new file mode 100644 index 0000000..88c5eac --- /dev/null +++ b/assets/js/95f41f0b.79e14732.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9385],{3905:(e,t,r)=>{r.d(t,{Zo:()=>f,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(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 i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),s=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},f=function(e){var t=s(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),u=s(r),d=o,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||a;return r?n.createElement(m,i(i({ref:t},f),{},{components:r})):n.createElement(m,i({ref:t},f))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var s=2;s<a;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},6534:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15",slug:"aoc-2022/1st-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},i=void 0,c={permalink:"/blog/aoc-2022/1st-week",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md",source:"@site/blog/aoc-2022/01-week-1.md",title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15:00.000Z",formattedDate:"December 15, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:12.4,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15",slug:"aoc-2022/1st-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"2nd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/2nd-week"},nextItem:{title:"Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/intro"}},l={authorsImageUrls:[void 0]},s=[],f={toc:s},u="wrapper";function p(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Let's go through the first week of ","[",(0,o.kt)("em",{parentName:"p"},"Advent of Code"),"]"," in Rust."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.dadc79bc.js b/assets/js/9e4087bc.dadc79bc.js new file mode 100644 index 0000000..40ca758 --- /dev/null +++ b/assets/js/9e4087bc.dadc79bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3608],{3169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(7294),l=a(9960),n=a(5999),c=a(833),i=a(7452);function m(e){let{year:t,posts:a}=e;return r.createElement(r.Fragment,null,r.createElement("h3",null,t),r.createElement("ul",null,a.map((e=>r.createElement("li",{key:e.metadata.date},r.createElement(l.Z,{to:e.metadata.permalink},e.metadata.formattedDate," - ",e.metadata.title))))))}function s(e){let{years:t}=e;return r.createElement("section",{className:"margin-vert--lg"},r.createElement("div",{className:"container"},r.createElement("div",{className:"row"},t.map(((e,t)=>r.createElement("div",{key:t,className:"col col--4 margin-vert--lg"},r.createElement(m,e)))))))}function o(e){let{archive:t}=e;const a=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),l=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),m=function(e){const t=e.reduceRight(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return r.createElement(r.Fragment,null,r.createElement(c.d,{title:a,description:l}),r.createElement(i.Z,null,r.createElement("header",{className:"hero hero--primary"},r.createElement("div",{className:"container"},r.createElement("h1",{className:"hero__title"},a),r.createElement("p",{className:"hero__subtitle"},l))),r.createElement("main",null,m.length>0&&r.createElement(s,{years:m}))))}}}]); \ No newline at end of file diff --git a/assets/js/9eb50c57.bc586b34.js b/assets/js/9eb50c57.bc586b34.js new file mode 100644 index 0000000..9b31e59 --- /dev/null +++ b/assets/js/9eb50c57.bc586b34.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7509],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var i=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,i,o=function(e,t){if(null==e)return{};var n,i,o={},a=Object.keys(e);for(i=0;i<a.length;i++)n=a[i],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i<a.length;i++)n=a[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=i.createContext({}),p=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=p(e.components);return i.createElement(l.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},d=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=p(n),d=o,h=m["".concat(l,".").concat(d)]||m[d]||u[d]||a;return n?i.createElement(h,r(r({ref:t},c),{},{components:n})):i.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,r=new Array(a);r[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:o,r[1]=s;for(var p=2;p<a;p++)r[p]=n[p];return i.createElement.apply(null,r)}return i.createElement.apply(null,n)}d.displayName="MDXCreateElement"},6239:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var i=n(7462),o=(n(7294),n(3905));const a={id:"postcondition-ambiguity",title:"Vague postconditions and proving correctness of algorithms",description:"Debugging and testing with precise postconditions.\n",tags:["python","testing","postconditions","sorting"],last_update:{date:new Date("2021-03-18T00:00:00.000Z")}},r=void 0,s={unversionedId:"algorithms-correctness/postcondition-ambiguity",id:"algorithms-correctness/postcondition-ambiguity",title:"Vague postconditions and proving correctness of algorithms",description:"Debugging and testing with precise postconditions.\n",source:"@site/ib002/02-algorithms-correctness/2021-03-18-postcondition-ambiguity.md",sourceDirName:"02-algorithms-correctness",slug:"/algorithms-correctness/postcondition-ambiguity",permalink:"/ib002/algorithms-correctness/postcondition-ambiguity",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/02-algorithms-correctness/2021-03-18-postcondition-ambiguity.md",tags:[{label:"python",permalink:"/ib002/tags/python"},{label:"testing",permalink:"/ib002/tags/testing"},{label:"postconditions",permalink:"/ib002/tags/postconditions"},{label:"sorting",permalink:"/ib002/tags/sorting"}],version:"current",lastUpdatedAt:1616025600,formattedLastUpdatedAt:"Mar 18, 2021",frontMatter:{id:"postcondition-ambiguity",title:"Vague postconditions and proving correctness of algorithms",description:"Debugging and testing with precise postconditions.\n",tags:["python","testing","postconditions","sorting"],last_update:{date:"2021-03-18T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Algorithms and Correctness",permalink:"/ib002/category/algorithms-and-correctness"},next:{title:"Asymptotic Notation and Time Complexity",permalink:"/ib002/category/asymptotic-notation-and-time-complexity"}},l={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Implementation of select sort from the exercises",id:"implementation-of-select-sort-from-the-exercises",level:2},{value:"Discussed preconditions, loop invariants and postconditions",id:"discussed-preconditions-loop-invariants-and-postconditions",level:2},{value:"Precondition",id:"precondition",level:3},{value:"Loop invariant",id:"loop-invariant",level:3},{value:"Postcondition",id:"postcondition",level:3},{value:"So is the permutation really required?",id:"so-is-the-permutation-really-required",level:2},{value:"Implementation of the broken select sort",id:"implementation-of-the-broken-select-sort",level:2},{value:"Property-based tests for our sorts",id:"property-based-tests-for-our-sorts",level:2},{value:"Loop invariant",id:"loop-invariant-1",level:3},{value:"Postcondition(s)",id:"postconditions",level:3},{value:"Putting it together",id:"putting-it-together",level:3},{value:"Let's run the tests!",id:"lets-run-the-tests",level:3},{value:"Summary",id:"summary",level:2}],c={toc:p},m="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,i.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"pathname:///files/ib002/algorithms-correctness/postcondition-ambiguity/test_sort.py"},"Source code")," used later on."),(0,o.kt)("h2",{id:"implementation-of-select-sort-from-the-exercises"},"Implementation of select sort from the exercises"),(0,o.kt)("p",null,"To implement select sort from the exercises and make it as easy to read as possible, I have implemented maximum function that returns index of the biggest element from the first ",(0,o.kt)("span",{parentName:"p",className:"math math-inline"},(0,o.kt)("span",{parentName:"span",className:"katex"},(0,o.kt)("span",{parentName:"span",className:"katex-mathml"},(0,o.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,o.kt)("semantics",{parentName:"math"},(0,o.kt)("mrow",{parentName:"semantics"},(0,o.kt)("mi",{parentName:"mrow"},"n")),(0,o.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"n")))),(0,o.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,o.kt)("span",{parentName:"span",className:"base"},(0,o.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,o.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))," elements."),(0,o.kt)("p",null,"For the sake of time and memory complexity, I am also using ",(0,o.kt)("inlineCode",{parentName:"p"},"itertools.islice"),", which makes a slice, but does not copy the elements into the memory like normal slice does."),(0,o.kt)("p",null,"There is also a ",(0,o.kt)("inlineCode",{parentName:"p"},"check_loop_invariant")," function that will be described later."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},"def compare_by_value(pair):\n index, value = pair\n return value\n\n\ndef maximum(arr, n):\n first_n_elements = itertools.islice(enumerate(arr), n)\n index, value = max(first_n_elements, key=compare_by_value)\n return index\n\n\ndef select_sort(arr, n):\n assert n == len(arr)\n\n check_loop_invariant(arr, n, n)\n for i in reversed(range(1, n)):\n j = maximum(arr, i + 1)\n arr[i], arr[j] = arr[j], arr[i]\n\n check_loop_invariant(arr, n, i)\n\n return arr\n")),(0,o.kt)("h2",{id:"discussed-preconditions-loop-invariants-and-postconditions"},"Discussed preconditions, loop invariants and postconditions"),(0,o.kt)("p",null,"You can safely replace ",(0,o.kt)("inlineCode",{parentName:"p"},"A")," with ",(0,o.kt)("inlineCode",{parentName:"p"},"arr")," or array for list."),(0,o.kt)("h3",{id:"precondition"},"Precondition"),(0,o.kt)("p",null,"As a precondition we have established that ",(0,o.kt)("inlineCode",{parentName:"p"},"A")," represents an array of values and ",(0,o.kt)("span",{parentName:"p",className:"math math-inline"},(0,o.kt)("span",{parentName:"span",className:"katex"},(0,o.kt)("span",{parentName:"span",className:"katex-mathml"},(0,o.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,o.kt)("semantics",{parentName:"math"},(0,o.kt)("mrow",{parentName:"semantics"},(0,o.kt)("mi",{parentName:"mrow"},"n")),(0,o.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"n")))),(0,o.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,o.kt)("span",{parentName:"span",className:"base"},(0,o.kt)("span",{parentName:"span",className:"strut",style:{height:"0.4306em"}}),(0,o.kt)("span",{parentName:"span",className:"mord mathnormal"},"n")))))," is length of the ",(0,o.kt)("inlineCode",{parentName:"p"},"A"),"."),(0,o.kt)("h3",{id:"loop-invariant"},"Loop invariant"),(0,o.kt)("p",null,"As for loop invariant we have established that we require two properties:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"A[i + 1 : n]")," is sorted"),(0,o.kt)("li",{parentName:"ol"},"all elements of ",(0,o.kt)("inlineCode",{parentName:"li"},"A[i + 1 : n]")," are bigger or equal to the other elements")),(0,o.kt)("p",null,"This invariant is later defined as ",(0,o.kt)("inlineCode",{parentName:"p"},"check_loop_invariant")," function. It is checked before the first iteration and after each iteration."),(0,o.kt)("h3",{id:"postcondition"},"Postcondition"),(0,o.kt)("p",null,"For the postcondition the first suggestion was that ",(0,o.kt)("inlineCode",{parentName:"p"},"A")," must be sorted. And later we have added that ",(0,o.kt)("inlineCode",{parentName:"p"},"A'")," must be a permutation of ",(0,o.kt)("inlineCode",{parentName:"p"},"A"),"."),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"However at the end of the session question arose if it is really required to state in the postcondition that ",(0,o.kt)("inlineCode",{parentName:"p"},"A'")," is a permutation.")),(0,o.kt)("h2",{id:"so-is-the-permutation-really-required"},"So is the permutation really required?"),(0,o.kt)("p",null,"As I have said it is better to have postconditions explicit and do not expect anything that is not stated explicitly, e.g. ",(0,o.kt)("em",{parentName:"p"},"name suggests it"),". In reality we could consider it as a smaller mistake (but it has consequences)."),(0,o.kt)("p",null,"On the other hand explicit postconditions can be used to our advantage ",(0,o.kt)("strong",{parentName:"p"},"and also")," help our proof of correctness."),(0,o.kt)("p",null,"Consequences:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Property-based testing"),(0,o.kt)("p",{parentName:"li"},"If we have explicit postconditions we can use them to define properties of the output from our algorithms. That way we can use property-based testing, which does not depend on specific inputs and expected outputs, but rather on randomly generated input and checking if the output conforms to our expectations (the postconditions are fulfilled).")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Proof of correctness"),(0,o.kt)("p",{parentName:"li"},"If we can prove that algorithm is correct even for algorithm that ",(0,o.kt)("strong",{parentName:"p"},"is not")," correct, we have a problem. That proof has no value and is useless."))),(0,o.kt)("p",null,'For the sake of showcasing the power of postconditions I will introduce "select sort" that is not correct, but will comply with both the loop invariant and our vague postcondition and thus pass the tests.'),(0,o.kt)("h2",{id:"implementation-of-the-broken-select-sort"},"Implementation of the broken select sort"),(0,o.kt)("p",null,"To make sure this thing passes everything, but our explicit postcondition with permutation will ",(0,o.kt)("em",{parentName:"p"},"blow it up"),', I have designed this "select sort" as follows:'),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"If I get empty list, there is nothing to do."),(0,o.kt)("li",{parentName:"ol"},"I find maximum in the array."),(0,o.kt)("li",{parentName:"ol"},"For each index from the end, I will assign ",(0,o.kt)("inlineCode",{parentName:"li"},"maximum + index"),".\nThis will ensure that even if the maximum in the original array was the first element, I will always satisfy that 2nd part of the loop invariant.")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},"def broken_select_sort(arr, n):\n assert n == len(arr)\n\n if not arr:\n return\n\n max_value = max(arr)\n\n check_loop_invariant(arr, n, n)\n for i in reversed(range(n)):\n arr[i] = max_value + i\n\n check_loop_invariant(arr, n, i)\n\n return arr\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"There is also an easier way to break this, I leave that as an exercise ;)")),(0,o.kt)("h2",{id:"property-based-tests-for-our-sorts"},"Property-based tests for our sorts"),(0,o.kt)("p",null,"Since we have talked a lot about proofs at the seminar, I would like to demonstrate it on the testing of the sorts. In the following text I will cover implementation of the loop invariant and both postconditions we have talked about and then test our sorts using them."),(0,o.kt)("h3",{id:"loop-invariant-1"},"Loop invariant"),(0,o.kt)("p",null,"To check loop invariant I have implemented this function:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},'def check_loop_invariant(arr, n, i):\n # A[i + 1 : n] is sorted\n for x, y in zip(itertools.islice(arr, i + 1, n), itertools.islice(arr, i + 2, n)):\n assert x <= y\n\n # all elements of A[i + 1 : n] are bigger or equal to the other elements\n if i + 1 >= n:\n # in case there are no elements\n return\n\n # otherwise, since the "tail" is sorted, we can assume that it is enough to\n # check the other elements to the smallest value of the tail\n smallest = arr[i + 1]\n for element in itertools.islice(arr, i + 1):\n assert smallest >= element\n')),(0,o.kt)("p",null,'First part checks if the "ending" of the array is sorted.'),(0,o.kt)("p",null,"In second part I have used a ",(0,o.kt)("em",{parentName:"p"},"dirty trick")," of taking just the first element that is the smallest and compared the rest of the elements to it. Why is it enough? I leave it as an exercise ;)"),(0,o.kt)("h3",{id:"postconditions"},"Postcondition(s)"),(0,o.kt)("p",null,"I have defined both the vague and explicit postconditions:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},"def check_vague_postcondition(original_arr, arr):\n if not arr:\n return\n\n # check ordering\n for x, y in zip(arr, itertools.islice(arr, 1, len(arr))):\n assert x <= y\n\n\ndef check_postcondition(original_arr, arr):\n if not arr:\n return\n\n # check ordering\n for x, y in zip(arr, itertools.islice(arr, 1, len(arr))):\n assert x <= y\n\n # get counts from original list\n original_counts = {}\n for value in original_arr:\n original_counts[value] = 1 + original_counts.get(value, 0)\n\n # get counts from resulting list\n counts = {}\n for value in arr:\n counts[value] = 1 + counts.get(value, 0)\n\n # if arr is permutation of original_arr then all counts must be the same\n assert counts == original_counts\n")),(0,o.kt)("h3",{id:"putting-it-together"},"Putting it together"),(0,o.kt)("p",null,"Now that we have everything implement, we can move on to the implementation of the tests:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},'from hypothesis import given, settings\nfrom hypothesis.strategies import integers, lists\nimport pytest\n\n@given(lists(integers()))\n@settings(max_examples=1000)\n@pytest.mark.parametrize(\n "postcondition", [check_vague_postcondition, check_postcondition]\n)\n@pytest.mark.parametrize("sorting_function", [select_sort, broken_select_sort])\ndef test_select_sort(sorting_function, postcondition, numbers):\n result = sorting_function(numbers[:], len(numbers))\n postcondition(numbers, result)\n')),(0,o.kt)("p",null,"Since it might seem a bit scary, I will disect it by parts."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Parameters of test function"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},"def test_select_sort(sorting_function, postcondition, numbers):\n")),(0,o.kt)("p",{parentName:"li"},"We are given 3 parameters:"),(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"sorting_function")," - as the name suggests is the sorting function we test"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"postcondition")," - as the name suggests is the postcondition that we check"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"numbers")," - is random list of numbers that we will be sorting"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Body of the test"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},"result = sorting_function(numbers[:], len(numbers))\npostcondition(numbers, result)\n")),(0,o.kt)("p",{parentName:"li"},"We pass to the sorting function ",(0,o.kt)("strong",{parentName:"p"},"copy")," of the numbers we got, this ensures that once we are checking the more strict postcondition, we can gather the necessary information even after sorting the list in-situ, i.e. we can check if the ",(0,o.kt)("inlineCode",{parentName:"p"},"result")," is really a ",(0,o.kt)("inlineCode",{parentName:"p"},"permutation")," of the ",(0,o.kt)("inlineCode",{parentName:"p"},"numbers")," even though the sorting functions has modified the passed in list."))),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Now we get to the more complicated part and it is the ",(0,o.kt)("em",{parentName:"p"},"decorators"),".")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"1st ",(0,o.kt)("inlineCode",{parentName:"p"},"parametrize")," from the bottom"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-py",metastring:"showLineNumbers",showLineNumbers:!0},'@pytest.mark.parametrize("sorting_function", [select_sort, broken_select_sort])\n')),(0,o.kt)("p",{parentName:"li"},"This tells pytest, that we want to pass the values from the list to the parameter ",(0,o.kt)("inlineCode",{parentName:"p"},"sorting_function"),". In other words, this lets us use the same test function for both the correct and incorrect select sort.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"2nd ",(0,o.kt)("inlineCode",{parentName:"p"},"parametrize")," from the bottom is similar, but works with the postcondition.\nThe reason why they are separated is pretty simple, this way they act like cartesian product: for each sorting function we also use each postcondition.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"@settings")," raises the count of tests that hypothesis runs (from default of 100(?)).")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"@given(lists(integers()))"),"\nThis means hypothesis is randomly creating lists of integers and passing them to the function, which has only one parameter left and that is ",(0,o.kt)("inlineCode",{parentName:"p"},"numbers"),"."))),(0,o.kt)("h3",{id:"lets-run-the-tests"},"Let's run the tests!"),(0,o.kt)("p",null,"In case you want to experiment locally, you should install ",(0,o.kt)("inlineCode",{parentName:"p"},"pytest")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"hypothesis")," from the PyPI."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},'% pytest -v test_sort.py\n=================================== test session starts ====================================\nplatform linux -- Python 3.6.8, pytest-3.8.2, py-1.7.0, pluggy-0.13.1 -- /usr/bin/python3\ncachedir: .pytest_cache\nrootdir: /home/xfocko/git/xfocko/ib002/postcondition-ambiguity, inifile:\nplugins: hypothesis-5.16.1\ncollected 4 items\n\ntest_sort.py::test_select_sort[select_sort-check_vague_postcondition] PASSED [ 25%]\ntest_sort.py::test_select_sort[select_sort-check_postcondition] PASSED [ 50%]\ntest_sort.py::test_select_sort[broken_select_sort-check_vague_postcondition] PASSED [ 75%]\ntest_sort.py::test_select_sort[broken_select_sort-check_postcondition] FAILED [100%]\n\n========================================= FAILURES =========================================\n_________________ test_select_sort[broken_select_sort-check_postcondition] _________________\n\nsorting_function = <function broken_select_sort at 0x7fac179308c8>\npostcondition = <function check_postcondition at 0x7fac1786d1e0>\n\n @given(lists(integers()))\n> @settings(max_examples=1000)\n @pytest.mark.parametrize(\n "postcondition", [check_vague_postcondition, check_postcondition]\n )\n @pytest.mark.parametrize("sorting_function", [select_sort, broken_select_sort])\n def test_select_sort(sorting_function, postcondition, numbers):\n\ntest_sort.py:132:\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\ntest_sort.py:139: in test_select_sort\n postcondition(numbers, result)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\noriginal_arr = [0, 0], arr = [0, 1]\n\n def check_postcondition(original_arr, arr):\n if not arr:\n return\n\n # check ordering\n for x, y in zip(arr, itertools.islice(arr, 1, len(arr))):\n assert x <= y\n\n # get counts from original list\n original_counts = {}\n for value in original_arr:\n original_counts[value] = 1 + original_counts.get(value, 0)\n\n # get counts from resulting list\n counts = {}\n for value in arr:\n counts[value] = 1 + counts.get(value, 0)\n\n # if arr is permutation of original_arr then all counts must be the same\n> assert counts == original_counts\nE assert {0: 1, 1: 1} == {0: 2}\nE Differing items:\nE {0: 1} != {0: 2}\nE Left contains more items:\nE {1: 1}\nE Full diff:\nE - {0: 1, 1: 1}\nE + {0: 2}\n\ntest_sort.py:128: AssertionError\n----------------------------------- Captured stdout call -----------------------------------\nFalsifying example: test_select_sort(\n sorting_function=<function test_sort.broken_select_sort>,\n postcondition=<function test_sort.check_postcondition>,\n numbers=[0, 0],\n)\n============================ 1 failed, 3 passed in 6.84 seconds ============================\n')),(0,o.kt)("p",null,"We can clearly see that our broken select sort has passed the ",(0,o.kt)("em",{parentName:"p"},"vague postcondition"),", but the explicit one was not satisfied."),(0,o.kt)("h2",{id:"summary"},"Summary"),(0,o.kt)("p",null,"For proving the correctness of the algorithm it is better to be explicit than prove that algorithm is correct even though it is not. Being explicit also allows you to test smaller ",(0,o.kt)("em",{parentName:"p"},"chunks")," of code better."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a082abd3.1797976b.js b/assets/js/a082abd3.1797976b.js new file mode 100644 index 0000000..7d98656 --- /dev/null +++ b/assets/js/a082abd3.1797976b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8786],{3276:a=>{a.exports=JSON.parse('{"label":"admin","permalink":"/blog/tags/admin","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/a2be6ffb.f8d1346f.js b/assets/js/a2be6ffb.f8d1346f.js new file mode 100644 index 0000000..169da96 --- /dev/null +++ b/assets/js/a2be6ffb.f8d1346f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4800],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var o=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,o,i=function(e,t){if(null==e)return{};var n,o,i={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=o.createContext({}),p=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=p(e.components);return o.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=p(n),d=i,g=m["".concat(s,".").concat(d)]||m[d]||u[d]||a;return n?o.createElement(g,r(r({ref:t},c),{},{components:n})):o.createElement(g,r({ref:t},c))}));function g(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,r=new Array(a);r[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[m]="string"==typeof e?e:i,r[1]=l;for(var p=2;p<a;p++)r[p]=n[p];return o.createElement.apply(null,r)}return o.createElement.apply(null,n)}d.displayName="MDXCreateElement"},5185:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var o=n(7462),i=(n(7294),n(3905));const a={title:"Environment",description:"Suggestions for setting up a local environment for C++ course.\n",last_update:{date:new Date("2023-02-18T00:00:00.000Z")}},r=void 0,l={unversionedId:"environment",id:"environment",title:"Environment",description:"Suggestions for setting up a local environment for C++ course.\n",source:"@site/pb161/environment.md",sourceDirName:".",slug:"/environment",permalink:"/pb161/environment",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb161/environment.md",tags:[],version:"current",lastUpdatedAt:1676678400,formattedLastUpdatedAt:"Feb 18, 2023",frontMatter:{title:"Environment",description:"Suggestions for setting up a local environment for C++ course.\n",last_update:{date:"2023-02-18T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Introduction",permalink:"/pb161/"}},s={},p=[{value:"Required tools per OS",id:"required-tools-per-os",level:2},{value:"Windows",id:"windows",level:3},{value:"Linux",id:"linux",level:3},{value:"macOS",id:"macos",level:3},{value:"nix(OS)",id:"nixos",level:3},{value:"IDEs",id:"ides",level:2},{value:"git",id:"git",level:2},{value:"pre-commit (link)",id:"pre-commit-link",level:3},{value:"Testing",id:"testing",level:2},{value:"catch2",id:"catch2",level:3},{value:"Google Test",id:"google-test",level:3}],c={toc:p},m="wrapper";function u(e){let{components:t,...n}=e;return(0,i.kt)(m,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"required-tools-per-os"},"Required tools per OS"),(0,i.kt)("h3",{id:"windows"},"Windows"),(0,i.kt)("p",null,"Most likely WSL, VM or VPS. If you consider setting up either of those PITA, then\nVSCode + SSH to ",(0,i.kt)("em",{parentName:"p"},"aisa")," might be the best option for you."),(0,i.kt)("admonition",{title:"VSCode @ aisa",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Be careful when using VSCode on aisa, most notably:"),(0,i.kt)("ol",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ol"},"VSCode can leave lingering processes running in the background that can \u201eeat\nup\u201c your quota for running processes.\nAFAIK UNIX team has implemented some periodic clean up of those."),(0,i.kt)("li",{parentName:"ol"},"Disk quota can be also affected, because of the C/C++ extension toolkit that\nhas a cache for IntelliSense."))),(0,i.kt)("p",null,"Either of those will be linux distros, so jump to ",(0,i.kt)("a",{parentName:"p",href:"#linux"},"next section"),"."),(0,i.kt)("h3",{id:"linux"},"Linux"),(0,i.kt)("p",null,"Majority (if not all) of the provided materials include makefile (contains absolute\npath, so in case of linting and compiling, you need to adjust to your needs). You\nbasically need following list of tools:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"gcc")," - for compiling"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"clang-tidy")," - for linting (depends on distribution, might be provided with\nclang itself or in separate package, e.g. ",(0,i.kt)("inlineCode",{parentName:"li"},"clang-tools-extra"),")"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"clang-format")," - for your own sanity of keeping consistent formatting"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"make")," - since you are provided makefiles and it might be quickest to set up"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"valgrind")," - in case you manage to create memory errors in your code")),(0,i.kt)("p",null,"In case of Fedora it is following set of packages:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo dnf install -y clang clang-tools-extra valgrind gcc make\n# If you decide to use google test: add `gtest` or `llvm-googletest` for clang\n")),(0,i.kt)("h3",{id:"macos"},"macOS"),(0,i.kt)("p",null,"In case of macOS you should be able to find all of the packages in brew.sh, except\n",(0,i.kt)("inlineCode",{parentName:"p"},"valgrind"),", not sure if you can solve with podman/docker."),(0,i.kt)("p",null,"There is also an alterantive to homebrew, that is nixpkgs."),(0,i.kt)("h3",{id:"nixos"},"nix(OS)"),(0,i.kt)("p",null,"In case you run nixOS or linux distribution with nixpkgs or you use nixpkgs as a\nreplacement for homebrew on macOS. You should be fine with the following config:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-nix"},'with import <nixpkgs> {};\nstdenv.mkDerivation {\n name = "cppenv";\n buildInputs = [\n clang-tools\n\n gnumake\n\n gmock # used for google test\n valgrind # not sure about macOS though\n ];\n}\n')),(0,i.kt)("h2",{id:"ides"},"IDEs"),(0,i.kt)("p",null,"Choice of the IDE is mostly up to you, you do not need to use IDE at all ;)"),(0,i.kt)("p",null,"I would probably recommend VSCode + appropriate extension or CLion if you are used\nto the JetBrains IDEs."),(0,i.kt)("h2",{id:"git"},"git"),(0,i.kt)("p",null,"I recommend you using some basic versioning for your code, even though you submit\nonly the sources on ",(0,i.kt)("em",{parentName:"p"},"aisa"),". There are specific reasons why I suggest it:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"if you build a ",(0,i.kt)("em",{parentName:"li"},"commit, tag and submit")," habit, you might be able to address\nsome of the smaller problems in your sources even before submission; more info\nin the ",(0,i.kt)("a",{parentName:"li",href:"#pre-commit"},"pre-commit section"))),(0,i.kt)("p",null,"In case you are planning to use git branches for separating different\nassignments and/or merge requests I suggest you to keep specifications and\nskeletons on your default branch, since ",(0,i.kt)("em",{parentName:"p"},"frag")," on ",(0,i.kt)("em",{parentName:"p"},"aisa")," automatically downloads\neverything that is not present and by that can create conflicts when switching\nbranches."),(0,i.kt)("admonition",{title:"Commit conventions",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"When creating smaller and well defined commits, you can more easily argue about\ncorrectness of your implementation and also identify bugs, since they are better\ncontained.")),(0,i.kt)("p",null,"Since frag creates a lot of support files (majority of them are dotfiles, i.e.\nhidden files), I recommend you to use following\n",(0,i.kt)("a",{parentName:"p",href:"pathname:///files/pb161/environment/gitignore"},"gitignore")," configuration that\nshould cover most of the scenarios."),(0,i.kt)("h3",{id:"pre-commit-link"},"pre-commit (",(0,i.kt)("a",{parentName:"h3",href:"https://pre-commit.com/"},"link"),")"),(0,i.kt)("p",null,'Pre-commit basically allows you to "check" your code before committing. It functions\nas a git hook, i.e. you want to make a commit, pre-commit checks it before-hand.'),(0,i.kt)("p",null,"In case of C++ there are few use-cases:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"formatting")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"linting")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"building and/or running tests, in case you feel like masochist"),(0,i.kt)("p",{parentName:"li"},"However this might be a challenging task to implement, since most of the tasks\nare published from the beginning."))),(0,i.kt)("p",null,"In case of formatting and linting, there are already existing hooks (there is a\nlist of supported ones on the page), but there is also an option for you setting\nit up yourself (it is just a matter of specifying command and files it should run\non)."),(0,i.kt)("admonition",{title:"Formatting",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"For formatting you can the following ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/pre-commit/mirrors-clang-format#using-clang-format-with-pre-commit"},"git hook"),"."),(0,i.kt)("p",{parentName:"admonition"},"This hook follows the formatting conventions defined by the ",(0,i.kt)("inlineCode",{parentName:"p"},".clang-format")," file\nthat is looked up recursively all the way to the root of the filesystem, therefore\nit is ideal to keep it in the root of the git repository."),(0,i.kt)("p",{parentName:"admonition"},"You can look up the different codestyles ",(0,i.kt)("a",{parentName:"p",href:"https://gitlab.fi.muni.cz/pb071/codestyles"},"here"),".")),(0,i.kt)("h2",{id:"testing"},"Testing"),(0,i.kt)("p",null,"I have tried 2 frameworks for testing, one of them will be probably showcased in\nlectures. If you have not picked one yet, you can take an inspiration from the\nfollowing."),(0,i.kt)("h3",{id:"catch2"},"catch2"),(0,i.kt)("p",null,"It is quite popular, only one header-file, also might be easier to set up."),(0,i.kt)("p",null,"Might feel slow to compile, this can be addressed by having one object file with\nprecompiled ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," for tests, e.g."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},'/* File: catch_main.cpp\n * Compile it with: g++ $(CXXFLAGS) -c catch_main.cpp\n *\n * Once you have source file with tests, e.g. test_something.cpp, compile it in\n * a similar fashion: g++ $(CXXFLAGS) -c test_something.cpp $(LDLIBS)\n *\n * And link them together:\n * g++ catch_main.o test_something.o -o test_something\n *\n * Now you can run ./test_something and if you change it, you do not need to compile\n * the main again.\n */\n#define CATCH_CONFIG_MAIN\n#include "catch.hpp"\n')),(0,i.kt)("h3",{id:"google-test"},"Google Test"),(0,i.kt)("p",null,"It is faster compared to catch2, even if you do not precompile the ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),". Might\nbe more complicated to set up, since there are multiple files (it is not one header\nfile). Not very user friendly on ",(0,i.kt)("em",{parentName:"p"},"aisa"),". However can be installed through package\nmanager."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a6a48ea2.d5faeb42.js b/assets/js/a6a48ea2.d5faeb42.js new file mode 100644 index 0000000..dfc5c33 --- /dev/null +++ b/assets/js/a6a48ea2.d5faeb42.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3618],{3905:(e,t,n)=>{n.d(t,{Zo:()=>f,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(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 l=r.createContext({}),s=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},f=function(e){var t=s(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),u=s(n),p=o,m=u["".concat(l,".").concat(p)]||u[p]||d[p]||a;return n?r.createElement(m,i(i({ref:t},f),{},{components:n})):r.createElement(m,i({ref:t},f))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var s=2;s<a;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},8763:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15",slug:"aoc-2022/2nd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},i=void 0,c={permalink:"/blog/aoc-2022/2nd-week",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/02-week-2.md",source:"@site/blog/aoc-2022/02-week-2.md",title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15:00.000Z",formattedDate:"December 25, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:20.875,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"2nd week of Advent of Code '22 in Rust",description:"Surviving second week in Rust.",date:"2022-12-25T23:15",slug:"aoc-2022/2nd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"},nextItem:{title:"1st week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/1st-week"}},l={authorsImageUrls:[void 0]},s=[],f={toc:s},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Let's go through the second week of ","[",(0,o.kt)("em",{parentName:"p"},"Advent of Code"),"]"," in Rust."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.c08b78c4.js b/assets/js/a6aa9e1f.c08b78c4.js new file mode 100644 index 0000000..760dd24 --- /dev/null +++ b/assets/js/a6aa9e1f.c08b78c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3089],{46:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var n=a(7294),l=a(6010),r=a(2263),i=a(833),o=a(5281),s=a(9058),m=a(9703),c=a(197),g=a(9985);function p(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,r.Z)(),{blogDescription:l,blogTitle:o,permalink:s}=t,m="/"===s?a:o;return n.createElement(n.Fragment,null,n.createElement(i.d,{title:m,description:l}),n.createElement(c.Z,{tag:"blog_posts_list"}))}function d(e){const{metadata:t,items:a,sidebar:l}=e;return n.createElement(s.Z,{sidebar:l},n.createElement(g.Z,{items:a}),n.createElement(m.Z,{metadata:t}))}function u(e){return n.createElement(i.FG,{className:(0,l.Z)(o.k.wrapper.blogPages,o.k.page.blogListPage)},n.createElement(p,e),n.createElement(d,e))}},9703:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),l=a(5999),r=a(2244);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),i&&n.createElement(r.Z,{permalink:i,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),l=a(9460),r=a(390);function i(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}}}]); \ No newline at end of file diff --git a/assets/js/a7098721.ef506174.js b/assets/js/a7098721.ef506174.js new file mode 100644 index 0000000..1f7c58b --- /dev/null +++ b/assets/js/a7098721.ef506174.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1050],{6615:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":1,"totalCount":7,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/a7d8226e.dabdb919.js b/assets/js/a7d8226e.dabdb919.js new file mode 100644 index 0000000..2998341 --- /dev/null +++ b/assets/js/a7d8226e.dabdb919.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[516],{4475:t=>{t.exports=JSON.parse('{"title":"Asymptotic Notation and Time Complexity","description":"Materials related to asymptotic notation and time complexity.\\n","slug":"/category/asymptotic-notation-and-time-complexity","permalink":"/ib002/category/asymptotic-notation-and-time-complexity","navigation":{"previous":{"title":"Vague postconditions and proving correctness of algorithms","permalink":"/ib002/algorithms-correctness/postcondition-ambiguity"},"next":{"title":"Time complexity of \u2039extend\u203a","permalink":"/ib002/time-complexity/extend"}}}')}}]); \ No newline at end of file diff --git a/assets/js/a80747a0.4dc03a81.js b/assets/js/a80747a0.4dc03a81.js new file mode 100644 index 0000000..480b702 --- /dev/null +++ b/assets/js/a80747a0.4dc03a81.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5824],{4464:e=>{e.exports=JSON.parse('{"label":"advent-of-code-2022","permalink":"/blog/tags/advent-of-code-2022","allTagsPath":"/blog/tags","count":5}')}}]); \ No newline at end of file diff --git a/assets/js/ab2721d4.e0b371f9.js b/assets/js/ab2721d4.e0b371f9.js new file mode 100644 index 0000000..d89699b --- /dev/null +++ b/assets/js/ab2721d4.e0b371f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7755],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(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 i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),f=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=f(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=f(r),d=o,m=p["".concat(l,".").concat(d)]||p[d]||s[d]||a;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[p]="string"==typeof e?e:o,i[1]=c;for(var f=2;f<a;f++)i[f]=r[f];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},861:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>s,frontMatter:()=>a,metadata:()=>c,toc:()=>f});var n=r(7462),o=(r(7294),r(3905));const a={title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14",slug:"aoc-2022/4th-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},i=void 0,c={permalink:"/blog/aoc-2022/4th-week",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/04-week-4.md",source:"@site/blog/aoc-2022/04-week-4.md",title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14:00.000Z",formattedDate:"July 7, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:15.175,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"4th week of Advent of Code '22 in Rust",description:"Surviving fourth week in Rust.",date:"2023-07-07T15:14",slug:"aoc-2022/4th-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"How can Copr help with broken dependencies",permalink:"/blog/2023/08/02/copr"},nextItem:{title:"3rd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/3rd-week"}},l={authorsImageUrls:[void 0]},f=[],u={toc:f},p="wrapper";function s(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Let's go through the fourth week of ","[",(0,o.kt)("em",{parentName:"p"},"Advent of Code"),"]"," in Rust."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/af8b72a7.1e28998e.js b/assets/js/af8b72a7.1e28998e.js new file mode 100644 index 0000000..803d7f1 --- /dev/null +++ b/assets/js/af8b72a7.1e28998e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5658],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(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 i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),m=p(r),d=o,f=m["".concat(l,".").concat(d)]||m[d]||u[d]||a;return r?n.createElement(f,i(i({ref:t},s),{},{components:r})):n.createElement(f,i({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[m]="string"==typeof e?e:o,i[1]=c;for(var p=2;p<a;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},3650:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const a={title:"How can Copr help with broken dependencies",description:"Copr comes to save you when maintainer doesn't care.",date:new Date("2023-08-02T00:00:00.000Z"),authors:[{key:"mf",title:"a.k.a. your opinionated admin"}],tags:["\ud83c\udfed","red-hat","copr","admin","vps"]},i=void 0,c={permalink:"/blog/2023/08/02/copr",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/2023-08-02-copr.md",source:"@site/blog/2023-08-02-copr.md",title:"How can Copr help with broken dependencies",description:"Copr comes to save you when maintainer doesn't care.",date:"2023-08-02T00:00:00.000Z",formattedDate:"August 2, 2023",tags:[{label:"\ud83c\udfed",permalink:"/blog/tags/\ud83c\udfed"},{label:"red-hat",permalink:"/blog/tags/red-hat"},{label:"copr",permalink:"/blog/tags/copr"},{label:"admin",permalink:"/blog/tags/admin"},{label:"vps",permalink:"/blog/tags/vps"}],readingTime:3.44,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. your opinionated admin",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"How can Copr help with broken dependencies",description:"Copr comes to save you when maintainer doesn't care.",date:"2023-08-02T00:00:00.000Z",authors:[{key:"mf",title:"a.k.a. your opinionated admin"}],tags:["\ud83c\udfed","red-hat","copr","admin","vps"]},nextItem:{title:"4th week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/4th-week"}},l={authorsImageUrls:[void 0]},p=[],s={toc:p},m="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(m,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"When you decide to run Fedora on your VPS, you might get screwed over by using\nrandom repositories\u2026"))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b0067e0a.68fd3778.js b/assets/js/b0067e0a.68fd3778.js new file mode 100644 index 0000000..faa2dd8 --- /dev/null +++ b/assets/js/b0067e0a.68fd3778.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1272],{2611:e=>{e.exports=JSON.parse('{"pluginId":"ib002","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"autogeneratedBar":[{"type":"link","label":"Introduction","href":"/ib002/","docId":"ib002-intro"},{"type":"category","label":"Algorithms and Correctness","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Vague postconditions and proving correctness of algorithms","href":"/ib002/algorithms-correctness/postcondition-ambiguity","docId":"algorithms-correctness/postcondition-ambiguity"}],"href":"/ib002/category/algorithms-and-correctness"},{"type":"category","label":"Asymptotic Notation and Time Complexity","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Time complexity of \u2039extend\u203a","href":"/ib002/time-complexity/extend","docId":"time-complexity/extend"}],"href":"/ib002/category/asymptotic-notation-and-time-complexity"},{"type":"category","label":"Recursion","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Recursion and backtracking with Robot Karel","href":"/ib002/recursion/karel-1","docId":"recursion/karel-1"},{"type":"link","label":"Introduction to dynamic programming","href":"/ib002/recursion/pyramid-slide-down","docId":"recursion/pyramid-slide-down"}],"href":"/ib002/category/recursion"},{"type":"category","label":"Red-Black Trees","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f","href":"/ib002/rb-trees/applications","docId":"rb-trees/applications"},{"type":"link","label":"On the rules of the red-black tree","href":"/ib002/rb-trees/rules","docId":"rb-trees/rules"}],"href":"/ib002/category/red-black-trees"},{"type":"category","label":"Graphs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Iterative algorithms via iterators","href":"/ib002/graphs/iterative-and-iterators","docId":"graphs/iterative-and-iterators"},{"type":"link","label":"Distance boundaries from BFS tree on undirected graphs","href":"/ib002/graphs/bfs-tree","docId":"graphs/bfs-tree"}],"href":"/ib002/category/graphs"}]},"docs":{"algorithms-correctness/postcondition-ambiguity":{"id":"algorithms-correctness/postcondition-ambiguity","title":"Vague postconditions and proving correctness of algorithms","description":"Debugging and testing with precise postconditions.\\n","sidebar":"autogeneratedBar"},"graphs/bfs-tree":{"id":"graphs/bfs-tree","title":"Distance boundaries from BFS tree on undirected graphs","description":"Short explanation of distance boundaries deduced from a BFS tree.\\n","sidebar":"autogeneratedBar"},"graphs/iterative-and-iterators":{"id":"graphs/iterative-and-iterators","title":"Iterative algorithms via iterators","description":"Iterative DFS using iterators.\\n","sidebar":"autogeneratedBar"},"ib002-intro":{"id":"ib002-intro","title":"Introduction","description":"In this part you can find \u201crandom\u201d additional materials I have written over the","sidebar":"autogeneratedBar"},"rb-trees/applications":{"id":"rb-trees/applications","title":"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f","description":"Uk\xe1zka pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f v standardn\xedch kni\u017enic\xedch zn\xe1m\xfdch jazyk\u016f.\\n","sidebar":"autogeneratedBar"},"rb-trees/rules":{"id":"rb-trees/rules","title":"On the rules of the red-black tree","description":"Shower thoughts on the rules of the red-black tree.\\n","sidebar":"autogeneratedBar"},"recursion/karel-1":{"id":"recursion/karel-1","title":"Recursion and backtracking with Robot Karel","description":"A problem with too many restrictions.\\n","sidebar":"autogeneratedBar"},"recursion/pyramid-slide-down":{"id":"recursion/pyramid-slide-down","title":"Introduction to dynamic programming","description":"Solving a problem in different ways.\\n","sidebar":"autogeneratedBar"},"time-complexity/extend":{"id":"time-complexity/extend","title":"Time complexity of \u2039extend\u203a","description":"How to make inefficient algorithm unknowingly.\\n","sidebar":"autogeneratedBar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b0291f37.5b91d377.js b/assets/js/b0291f37.5b91d377.js new file mode 100644 index 0000000..a304761 --- /dev/null +++ b/assets/js/b0291f37.5b91d377.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6097],{7085:e=>{e.exports=JSON.parse('{"name":"docusaurus-theme-search-algolia","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/b25fbc58.c6b468d1.js b/assets/js/b25fbc58.c6b468d1.js new file mode 100644 index 0000000..3c20c03 --- /dev/null +++ b/assets/js/b25fbc58.c6b468d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9197],{5617:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/\ud83c\udfed","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/b2c263ce.01869630.js b/assets/js/b2c263ce.01869630.js new file mode 100644 index 0000000..17fe471 --- /dev/null +++ b/assets/js/b2c263ce.01869630.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6192],{8379:e=>{e.exports=JSON.parse('{"title":"Recursion","description":"Materials related to recursive algorithms and their time complexity.\\n","slug":"/category/recursion","permalink":"/ib002/category/recursion","navigation":{"previous":{"title":"Time complexity of \u2039extend\u203a","permalink":"/ib002/time-complexity/extend"},"next":{"title":"Recursion and backtracking with Robot Karel","permalink":"/ib002/recursion/karel-1"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b45dccf0.5fcb5182.js b/assets/js/b45dccf0.5fcb5182.js new file mode 100644 index 0000000..7857adc --- /dev/null +++ b/assets/js/b45dccf0.5fcb5182.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9679],{8296:a=>{a.exports=JSON.parse('{"label":"copr","permalink":"/blog/tags/copr","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/b5a32f14.3c491fc9.js b/assets/js/b5a32f14.3c491fc9.js new file mode 100644 index 0000000..5ba6cdb --- /dev/null +++ b/assets/js/b5a32f14.3c491fc9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2433],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=o.createContext({}),l=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=l(n),h=r,m=u["".concat(p,".").concat(h)]||u[h]||c[h]||a;return n?o.createElement(m,i(i({ref:t},d),{},{components:n})):o.createElement(m,i({ref:t},d))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=h;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:r,i[1]=s;for(var l=2;l<a;l++)i[l]=n[l];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}h.displayName="MDXCreateElement"},9746:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=n(7462),r=(n(7294),n(3905));const a={title:"How can Copr help with broken dependencies",description:"Copr comes to save you when maintainer doesn't care.",date:new Date("2023-08-02T00:00:00.000Z"),authors:[{key:"mf",title:"a.k.a. your opinionated admin"}],tags:["\ud83c\udfed","red-hat","copr","admin","vps"]},i=void 0,s={permalink:"/blog/2023/08/02/copr",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/2023-08-02-copr.md",source:"@site/blog/2023-08-02-copr.md",title:"How can Copr help with broken dependencies",description:"Copr comes to save you when maintainer doesn't care.",date:"2023-08-02T00:00:00.000Z",formattedDate:"August 2, 2023",tags:[{label:"\ud83c\udfed",permalink:"/blog/tags/\ud83c\udfed"},{label:"red-hat",permalink:"/blog/tags/red-hat"},{label:"copr",permalink:"/blog/tags/copr"},{label:"admin",permalink:"/blog/tags/admin"},{label:"vps",permalink:"/blog/tags/vps"}],readingTime:3.44,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. your opinionated admin",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"How can Copr help with broken dependencies",description:"Copr comes to save you when maintainer doesn't care.",date:"2023-08-02T00:00:00.000Z",authors:[{key:"mf",title:"a.k.a. your opinionated admin"}],tags:["\ud83c\udfed","red-hat","copr","admin","vps"]},nextItem:{title:"4th week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/4th-week"}},p={authorsImageUrls:[void 0]},l=[{value:"How does Copr repositories work?",id:"how-does-copr-repositories-work",level:2},{value:"My issue",id:"my-issue",level:2},{value:"How can Copr help?",id:"how-can-copr-help",level:2},{value:"Conclusion",id:"conclusion",level:2}],d={toc:l},u="wrapper";function c(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"When you decide to run Fedora on your VPS, you might get screwed over by using\nrandom repositories\u2026"),(0,r.kt)("p",null,"When I \u201creserved\u201d my VPS",(0,r.kt)("sup",{parentName:"p",id:"fnref-1-d4045e"},(0,r.kt)("a",{parentName:"sup",href:"#fn-1-d4045e",className:"footnote-ref"},"1"))," back in June '20, I slapped Fedora on it without\nthinking. I bet 99% of people would say that I'm crazy for doing such thing",(0,r.kt)("sup",{parentName:"p",id:"fnref-2-d4045e"},(0,r.kt)("a",{parentName:"sup",href:"#fn-2-d4045e",className:"footnote-ref"},"2")),",\n",(0,r.kt)("strong",{parentName:"p"},"BUT")," I've been using Fedora on my PCs for some time already and it felt very\nstable and natural to just use, even for VPS."),(0,r.kt)("p",null,"One of the first things I've done was setting up a mail server. You may guess\nwhat's the fun part about having a mail server\u2026 Yes, it's all the spam you\nreceive and only then you realize how much \u201ccrap\u201d gets filtered on free mail\nservices. To battle this problem I chose to use\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/rspamd/rspamd"},"rspamd")," that had CentOS support, but someone\nhad a ",(0,r.kt)("a",{parentName:"p",href:"https://copr.fedorainfracloud.org/"},"Copr")," repository that I used to\ninstall it."),(0,r.kt)("h2",{id:"how-does-copr-repositories-work"},"How does Copr repositories work?"),(0,r.kt)("p",null,"If you have ever used Ubuntu, you might be familiar with the concept since it is\nvery close to ",(0,r.kt)("a",{parentName:"p",href:"https://help.ubuntu.com/community/PPA"},"PPAs"),"."),(0,r.kt)("p",null,"tl;dr of the whole process consists of"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"enabling the Copr repository, and"),(0,r.kt)("li",{parentName:"ol"},"installing the desired package.")),(0,r.kt)("p",null,"So in shell you would do"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"# dnf copr enable \u2039copr-repository\u203a\n# dnf install \u2039package-from-the-repository\u203a\n")),(0,r.kt)("p",null,"And\u2026 that's it! Nothing else needed! Simple, right? And literally same process\nas you would do for the PPA."),(0,r.kt)("admonition",{title:"AUR",type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"On the other hand, if you are familiar with the archLinux, you definitely know\nAUR and what it can do for you. Copr repository is pretty similar, but the\npackages are prebuilt in Copr and Copr repositories can carry the required\ndependencies for said packages, which simplifies the distribution, and can even\nhelp with installing singular packages (when you just need the dependency, not\neverything).")),(0,r.kt)("h2",{id:"my-issue"},"My issue"),(0,r.kt)("p",null,"Now you might wonder how would I use it on my VPS. It's rather simple, once in\n6 months a new Fedora release comes out. And you need to upgrade to newer\nrelease\u2026 You don't need to do it right away and for such setup it probably isn't\neven recommended."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Fedora releases are supported for a year, i.e. they live 6 months till the next\nrelease and then another 6 months till another release."),(0,r.kt)("p",{parentName:"admonition"},"Some people prefer to run one version \u201cbehind\u201d. If you ever decide to run it on\nyour home server or in a similar setup, it might be a pretty good idea to\nfollow. I'm using the \u201clatest greatest\u201d, cause why not \ud83d\ude04"),(0,r.kt)("p",{parentName:"admonition"},"One way or another, you still need to bump the release every six months, unless\nyou'd bump 2 releases at once every year, which would be a decision, since, at\nleast I, cannot see any benefits in it\u2026 You don't go for \u201cstability\u201d, cause once\na year you switch to the latest release and then, before you bump, you use one\nyear old software, so you're not even using the latest.")),(0,r.kt)("p",null,"Fast-forward 2 years in the future, new Fedora release came out (October '22)\nand I was doing an upgrade. Dependencies of the rspamd have been updated and\nrspamd builds in Copr have failed and no one fixed it. Cool, so now I can\nupgrade, but can either ignore the dependencies or uninstall the rspamd\u2026"),(0,r.kt)("h2",{id:"how-can-copr-help"},"How can Copr help?"),(0,r.kt)("p",null,"I have managed to find\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/rspamd/rspamd/blob/master/rpm/rspamd.spec"},"specfile")," for the\nrspamd package that they use for CentOS. There were some files apart from the\nspecfile, so I had to make an SRPM locally and then\u2026 I just uploaded the SRPM\nto the Copr to\n",(0,r.kt)("a",{parentName:"p",href:"https://copr.fedorainfracloud.org/coprs/mfocko/rspamd/build/5046567/"},"build"),"\nan RPM."),(0,r.kt)("p",null,"I have switched the previous Copr repository for rspamd with my own and happily\nproceeded with the upgrade."),(0,r.kt)("h2",{id:"conclusion"},"Conclusion"),(0,r.kt)("p",null,"Copr is heavily used for testing builds on the upstream with\n",(0,r.kt)("a",{parentName:"p",href:"https://packit.dev"},"Packit"),". However, as you can see, it is possible to use it\n",(0,r.kt)("strong",{parentName:"p"},"very well")," for packaging your own stuff and avoiding issues (such as the one\nI have described above), if need be."),(0,r.kt)("div",{className:"footnotes"},(0,r.kt)("hr",{parentName:"div"}),(0,r.kt)("ol",{parentName:"div"},(0,r.kt)("li",{parentName:"ol",id:"fn-1-d4045e"},(0,r.kt)("a",{parentName:"li",href:"https://vpsfree.cz"},"vpsFree.cz"),(0,r.kt)("a",{parentName:"li",href:"#fnref-1-d4045e",className:"footnote-backref"},"\u21a9")),(0,r.kt)("li",{parentName:"ol",id:"fn-2-d4045e"},"Even though I've been running archLinux on some Raspberry Pi's and also\non one of my \u201chome servers\u201d, before getting the VPS. You could say I like\nto live on the edge\u2026",(0,r.kt)("a",{parentName:"li",href:"#fnref-2-d4045e",className:"footnote-backref"},"\u21a9")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b9b1ccdc.859f8a18.js b/assets/js/b9b1ccdc.859f8a18.js new file mode 100644 index 0000000..3eb529c --- /dev/null +++ b/assets/js/b9b1ccdc.859f8a18.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9044],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function p(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),m=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},s=function(e){var t=m(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=m(a),d=r,h=u["".concat(l,".").concat(d)]||u[d]||c[d]||o;return a?n.createElement(h,i(i({ref:t},s),{},{components:a})):n.createElement(h,i({ref:t},s))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[u]="string"==typeof e?e:r,i[1]=p;for(var m=2;m<o;m++)i[m]=a[m];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}d.displayName="MDXCreateElement"},284:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>p,toc:()=>m});var n=a(7462),r=(a(7294),a(3905));const o={slug:"cams",title:"Practice exam C",description:"Stalking cars\u2026\n",last_update:{date:new Date("2023-05-07T00:00:00.000Z")}},i="Watching Cams",p={unversionedId:"pexam/c-cams",id:"pexam/c-cams",title:"Practice exam C",description:"Stalking cars\u2026\n",source:"@site/pb071/pexam/c-cams.md",sourceDirName:"pexam",slug:"/pexam/cams",permalink:"/pb071/pexam/cams",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/pexam/c-cams.md",tags:[],version:"current",lastUpdatedAt:1683417600,formattedLastUpdatedAt:"May 7, 2023",frontMatter:{slug:"cams",title:"Practice exam C",description:"Stalking cars\u2026\n",last_update:{date:"2023-05-07T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Practice exam B",permalink:"/pb071/pexam/garbage_collect"},next:{title:"Submitting merge requests",permalink:"/pb071/mr"}},l={},m=[{value:"Format of the input file",id:"format-of-the-input-file",level:2},{value:"Examples",id:"examples",level:4},{value:"Format of the output",id:"format-of-the-output",level:2},{value:"Example usage",id:"example-usage",level:2},{value:"Requirements and notes",id:"requirements-and-notes",level:2}],s={toc:m},u="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(u,(0,n.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"watching-cams"},"Watching Cams"),(0,r.kt)("admonition",{title:"Exam environment",type:"caution"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"During the exam you will be provided with a barebone ",(0,r.kt)("em",{parentName:"li"},"exam session")," on the\n",(0,r.kt)("em",{parentName:"li"},"faculty computers"),"."),(0,r.kt)("li",{parentName:"ul"},"In browser you are only allowed to have the following tabs open:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.cppreference.com"},"C documentation")),(0,r.kt)("li",{parentName:"ul"},"page containing the assignment"))),(0,r.kt)("li",{parentName:"ul"},"You ",(0,r.kt)("strong",{parentName:"li"},"are not")," allowed to use your own source code, e.g. prepared beforehand\nor from the seminars."),(0,r.kt)("li",{parentName:"ul"},"You have ",(0,r.kt)("strong",{parentName:"li"},"5 minutes")," to read through the assignment and ask any follow-up\nquestions should be there something unclear."),(0,r.kt)("li",{parentName:"ul"},"You have ",(0,r.kt)("strong",{parentName:"li"},"60 minutes")," to work on the assignment, afterward your work will be\ndiscussed with your seminar tutor."))),(0,r.kt)("p",null,"Your task is to write a program ",(0,r.kt)("inlineCode",{parentName:"p"},"cams")," that will be processing input from the\ncams that are capable of identifying license plates on the cars and then\nprint out summary based on the input data. Your contributions to the society are\nvery much appreciated and may (or may not) be used for (each or none) of the\nfollowing purposes",(0,r.kt)("sup",{parentName:"p",id:"fnref-1"},(0,r.kt)("a",{parentName:"sup",href:"#fn-1",className:"footnote-ref"},"1")),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"stalking people leaving and coming back home,"),(0,r.kt)("li",{parentName:"ul"},"retroactively making people pay for the parking,"),(0,r.kt)("li",{parentName:"ul"},"providing evidence of people speeding on highways,"),(0,r.kt)("li",{parentName:"ul"},"tracking people that don't pay tolls, or"),(0,r.kt)("li",{parentName:"ul"},"convict employees leaving the work prematurely.")),(0,r.kt)("h2",{id:"format-of-the-input-file"},"Format of the input file"),(0,r.kt)("p",null,"Input for your program consists of the data from the cameras. You will be given\nthe data from the cameras as a path to a file and user should also be able to\nspecify ",(0,r.kt)("inlineCode",{parentName:"p"},"-")," (i.e. ",(0,r.kt)("inlineCode",{parentName:"p"},"stdin"),") as the path."),(0,r.kt)("p",null,"Each \u201cscan\u201d (i.e. reading) of the cameras consists of the following data:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("em",{parentName:"p"},"camera ID"),": non-negative integer identifying a camera")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("em",{parentName:"p"},"plate"),": string of unknown length that can consist of any characters apart\nfrom whitespace")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("em",{parentName:"p"},"timestamp"),": date and time of the scan as an unsigned integer (represented as\na UNIX time)"),(0,r.kt)("admonition",{parentName:"li",type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"When programming on UN","*","X(-like) systems, you can assume that the ",(0,r.kt)("inlineCode",{parentName:"p"},"time_t"),"\nstructure from the system header ",(0,r.kt)("inlineCode",{parentName:"p"},"time.h")," ",(0,r.kt)("strong",{parentName:"p"},"is")," the ",(0,r.kt)("inlineCode",{parentName:"p"},"unsigned int")," that you\nare provided in the input file.")))),(0,r.kt)("p",null,"And they are compiled into one reading such as:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"camera_ID: plate timestamp\n")),(0,r.kt)("p",null,"There should be always ",(0,r.kt)("strong",{parentName:"p"},"at least one")," space in between each part of the\nreading. Readings are separated by the commas, which may, but don't have to, be\naccompanied by whitespace around."),(0,r.kt)("h4",{id:"examples"},"Examples"),(0,r.kt)("p",null,"Few examples of the data from the cameras follow"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"10: ABC-12-34 1664608712, 289: XYZ-98-76 1665416417,\n25: ABC-12-34 1633078256 , 42: TryToCatchMe 1671602419,\n11: EL9-987 1679541338 ,2 : Foo-666 1683170082,42: YourMum 1683170082,\n42: TryToCatchMe 1671602419 , 1234: TryToCatchMe 1671602419,\n19: ABC-12-34 1664659649, 69:YouShould-not-pLaCe-4ny-expectations%on^the(input 1680307994,\n9 : 9B9-161 1665416417 , 10: 1a1-999 1671602419,1:lmao 1633078256,\n16: ABC-12-34 1664609012\n")),(0,r.kt)("h2",{id:"format-of-the-output"},"Format of the output"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"All the examples consider using data from the example of the input.")),(0,r.kt)("p",null,"You are expected to print out the dates and cameras that has captured the\nlicense plate for each of them (in a sorted fashion)."),(0,r.kt)("p",null,"If there are multiple scans present and the timespan (i.e. time difference\nbetween the scans is bigger than 60 minutes, you should separate them by a\nnewline). For example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"*** ABC-12-34 ***\n 25: Fri Oct 1 10:50:56 2021\n\n 10: Sat Oct 1 09:18:32 2022\n 16: Sat Oct 1 09:23:32 2022\n\n 19: Sat Oct 1 23:27:29 2022\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Since you are given the timestamp in a ",(0,r.kt)("inlineCode",{parentName:"p"},"time_t")," compatible type on UN","*","X, you\ncan safely use ",(0,r.kt)("inlineCode",{parentName:"p"},"ctime(3)")," for printing the timestamp as a ",(0,r.kt)("em",{parentName:"p"},"human readable")," time\nwhen outputting the date and time.")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For a better readability you can include one more newline after the last line\nof the output.")),(0,r.kt)("h2",{id:"example-usage"},"Example usage"),(0,r.kt)("p",null,"You can also have a look at example usage of your program. We can run your\nprogram from the shell like"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ ./cams example_1.txt\n")),(0,r.kt)("p",null,"And it will produce an output:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"*** ABC-12-34 ***\n 25: Fri Oct 1 10:50:56 2021\n\n 10: Sat Oct 1 09:18:32 2022\n 16: Sat Oct 1 09:23:32 2022\n\n 19: Sat Oct 1 23:27:29 2022\n\n*** EL9-987 ***\n 11: Thu Mar 23 04:15:38 2023\n\n*** Foo-666 ***\n 2: Thu May 4 05:14:42 2023\n\n*** TryToCatchMe ***\n 42: Wed Dec 21 07:00:19 2022\n 42: Wed Dec 21 07:00:19 2022\n 1234: Wed Dec 21 07:00:19 2022\n\n*** XYZ-98-76 ***\n 289: Mon Oct 10 17:40:17 2022\n\n*** YouShould-not-pLaCe-4ny-expectations%on^the(input ***\n 69: Sat Apr 1 02:13:14 2023\n\n*** YourMum ***\n 42: Thu May 4 05:14:42 2023\n")),(0,r.kt)("h2",{id:"requirements-and-notes"},"Requirements and notes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Define ",(0,r.kt)("strong",{parentName:"li"},"structures")," (and ",(0,r.kt)("strong",{parentName:"li"},"enumerations"),", if applicable) for the parsed\ninformation from the files."),(0,r.kt)("li",{parentName:"ul"},"For keeping the \u201crecords\u201d, use some ",(0,r.kt)("strong",{parentName:"li"},"dynamic")," data structure.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Don't forget to consider pros and cons of using ",(0,r.kt)("em",{parentName:"li"},"specific")," data structures\nbefore going through implementing."))),(0,r.kt)("li",{parentName:"ul"},"You ",(0,r.kt)("strong",{parentName:"li"},"are not required")," to produce 1:1 output to the provided examples, they\nare just a hint to not waste your time tinkering with a user experience."),(0,r.kt)("li",{parentName:"ul"},"If any of the operations on the input files should fail,\n",(0,r.kt)("strong",{parentName:"li"},"you are expected to")," handle the situation ",(0,r.kt)("em",{parentName:"li"},"accordingly"),"."),(0,r.kt)("li",{parentName:"ul"},"Failures of any other common functions (e.g. functions used for memory\nmanagement) should be handled in ",(0,r.kt)("strong",{parentName:"li"},"the same way")," as they were in the\nhomeworks and seminars."),(0,r.kt)("li",{parentName:"ul"},"Your program ",(0,r.kt)("strong",{parentName:"li"},"must free")," all the resources before exiting.")),(0,r.kt)("div",{className:"footnotes"},(0,r.kt)("hr",{parentName:"div"}),(0,r.kt)("ol",{parentName:"div"},(0,r.kt)("li",{parentName:"ol",id:"fn-1"},"Subject to NDA.",(0,r.kt)("a",{parentName:"li",href:"#fnref-1",className:"footnote-backref"},"\u21a9")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/bb882650.671a659f.js b/assets/js/bb882650.671a659f.js new file mode 100644 index 0000000..798c168 --- /dev/null +++ b/assets/js/bb882650.671a659f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8091],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(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 i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),f=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=f(e.components);return n.createElement(c.Provider,{value:t},e.children)},d="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=f(r),p=o,m=d["".concat(c,".").concat(p)]||d[p]||s[p]||a;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:o,i[1]=l;for(var f=2;f<a;f++)i[f]=r[f];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}p.displayName="MDXCreateElement"},6974:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>s,frontMatter:()=>a,metadata:()=>l,toc:()=>f});var n=r(7462),o=(r(7294),r(3905));const a={title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},i=void 0,l={permalink:"/blog/aoc-2022/3rd-week",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md",source:"@site/blog/aoc-2022/03-week-3.md",title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:11.565,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"4th week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/4th-week"},nextItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"}},c={authorsImageUrls:[void 0]},f=[],u={toc:f},d="wrapper";function s(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Let's go through the third week of ","[",(0,o.kt)("em",{parentName:"p"},"Advent of Code"),"]"," in Rust."))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/be4da062.4dfd3eed.js b/assets/js/be4da062.4dfd3eed.js new file mode 100644 index 0000000..47cd589 --- /dev/null +++ b/assets/js/be4da062.4dfd3eed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6498],{4436:e=>{e.exports=JSON.parse('{"label":"time complexity","permalink":"/ib002/tags/time-complexity","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"time-complexity/extend","title":"Time complexity of \u2039extend\u203a","description":"How to make inefficient algorithm unknowingly.\\n","permalink":"/ib002/time-complexity/extend"}]}')}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.05fc7105.js b/assets/js/c4f5d8e4.05fc7105.js new file mode 100644 index 0000000..95ab034 --- /dev/null +++ b/assets/js/c4f5d8e4.05fc7105.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4195],{3261:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});var a=n(7294),r=n(6010),l=n(2263),o=n(7452),c=n(7462);const i={features:"features_t9lD",featureSvg:"featureSvg_GfXr"},s=[{title:"About Me",description:a.createElement("p",null,"I'm working in Red Hat in the"," ",a.createElement("a",{href:"https://github.com/packit"},"Packit team")," and studying at"," ",a.createElement("a",{href:"https://fi.muni.cz"},"FI MUNI")," while also tutoring some courses there.")},{title:"Content",description:a.createElement(a.Fragment,null,"On this page you can find my blog or unofficial materials I have written over the course of teaching multiple courses at the FI.")},{title:"Mastodon",description:a.createElement(a.Fragment,null,"Feel free to contact me on any of the following Mastodon accounts:"," ",a.createElement("a",{rel:"me",href:"https://fosstodon.org/@m4tt_314"},"Fosstodon")," ","or"," ",a.createElement("a",{rel:"me",href:"https://hachyderm.io/@m4tt_314"},"Hachyderm.io"))}];function m(e){let{title:t,description:n}=e;return a.createElement("div",{className:(0,r.Z)("col col--4")},a.createElement("div",{className:"text--center padding-horiz--md"},a.createElement("h3",null,t),a.createElement("p",null,n)))}function u(){return a.createElement("section",{className:i.features},a.createElement("div",{className:"container"},a.createElement("div",{className:"row"},s.map(((e,t)=>a.createElement(m,(0,c.Z)({key:t},e)))))))}const h={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function f(){const{siteConfig:e}=(0,l.Z)();return a.createElement("header",{className:(0,r.Z)("hero hero--primary",h.heroBanner)},a.createElement("div",{className:"container"},a.createElement("h1",{className:"hero__title"},e.title),a.createElement("p",{className:"hero__subtitle"},e.tagline)))}function d(){const{siteConfig:e}=(0,l.Z)();return a.createElement(o.Z,{title:`${e.title}`,description:"mf's blog and additional materials for courses at \u03c6"},a.createElement(f,null),a.createElement("main",null,a.createElement(u,null)))}}}]); \ No newline at end of file diff --git a/assets/js/c8cbffbd.a55be3a0.js b/assets/js/c8cbffbd.a55be3a0.js new file mode 100644 index 0000000..a33ba7d --- /dev/null +++ b/assets/js/c8cbffbd.a55be3a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9814],{4166:s=>{s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"pb161"}')}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.6c86d4f9.js b/assets/js/ccc49370.6c86d4f9.js new file mode 100644 index 0000000..67c3598 --- /dev/null +++ b/assets/js/ccc49370.6c86d4f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6103],{5203:(e,t,n)=>{n.r(t),n.d(t,{default:()=>h});var a=n(7294),l=n(6010),r=n(833),o=n(5281),i=n(9460),c=n(9058),s=n(390),m=n(7462),d=n(5999),u=n(2244);function f(e){const{nextItem:t,prevItem:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,d.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},n&&a.createElement(u.Z,(0,m.Z)({},n,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")})),t&&a.createElement(u.Z,(0,m.Z)({},t,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post"),isNext:!0})))}function g(){const{assets:e,metadata:t}=(0,i.C)(),{title:n,description:l,date:o,tags:c,authors:s,frontMatter:m}=t,{keywords:d}=m,u=e.image??m.image;return a.createElement(r.d,{title:n,description:l,keywords:d,image:u},a.createElement("meta",{property:"og:type",content:"article"}),a.createElement("meta",{property:"article:published_time",content:o}),s.some((e=>e.url))&&a.createElement("meta",{property:"article:author",content:s.map((e=>e.url)).filter(Boolean).join(",")}),c.length>0&&a.createElement("meta",{property:"article:tag",content:c.map((e=>e.label)).join(",")}))}var v=n(9407);function p(e){let{sidebar:t,children:n}=e;const{metadata:l,toc:r}=(0,i.C)(),{nextItem:o,prevItem:m,frontMatter:d}=l,{hide_table_of_contents:u,toc_min_heading_level:g,toc_max_heading_level:p}=d;return a.createElement(c.Z,{sidebar:t,toc:!u&&r.length>0?a.createElement(v.Z,{toc:r,minHeadingLevel:g,maxHeadingLevel:p}):void 0},a.createElement(s.Z,null,n),(o||m)&&a.createElement(f,{nextItem:o,prevItem:m}))}function h(e){const t=e.content;return a.createElement(i.n,{content:e.content,isBlogPostPage:!0},a.createElement(r.FG,{className:(0,l.Z)(o.k.wrapper.blogPages,o.k.page.blogPostPage)},a.createElement(g,null),a.createElement(p,{sidebar:e.sidebar},a.createElement(t,null))))}},9407:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(7462),l=n(7294),r=n(6010),o=n(3743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function m(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,r.Z)(i.tableOfContents,"thin-scrollbar",t)},l.createElement(o.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:s})))}},3743:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(7462),l=n(7294),r=n(6668);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(c(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function m(){const e=(0,l.useRef)(0),{navbar:{hideOnScroll:t}}=(0,r.L)();return(0,l.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,l.useRef)(void 0),n=m();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:r,maxHeadingLevel:o}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:r,maxHeadingLevel:o}),c=s(i,{anchorTopOffset:n.current}),m=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(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:r}=e;return t.length?l.createElement("ul",{className:r?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const f=l.memo(u);function g(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...g}=e;const v=(0,r.L)(),p=m??v.tableOfContents.minHeadingLevel,h=u??v.tableOfContents.maxHeadingLevel,b=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>i({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:h});return d((0,l.useMemo)((()=>{if(c&&s)return{linkClassName:c,linkActiveClassName:s,minHeadingLevel:p,maxHeadingLevel:h}}),[c,s,p,h])),l.createElement(f,(0,a.Z)({toc:b,className:n,linkClassName:c},g))}}}]); \ No newline at end of file diff --git a/assets/js/cfa2b263.c19c407b.js b/assets/js/cfa2b263.c19c407b.js new file mode 100644 index 0000000..bfdac66 --- /dev/null +++ b/assets/js/cfa2b263.c19c407b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[3086],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,i=function(e,t){if(null==e)return{};var n,a,i={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},m="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),m=d(n),u=i,h=m["".concat(l,".").concat(u)]||m[u]||c[u]||o;return n?a.createElement(h,r(r({ref:t},p),{},{components:n})):a.createElement(h,r({ref:t},p))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=u;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:i,r[1]=s;for(var d=2;d<o;d++)r[d]=n[d];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},6031:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var a=n(7462),i=(n(7294),n(3905));const o={title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15",slug:"leetcode/sort-diagonally",authors:"mf",tags:["cpp","leetcode","iterators"],hide_table_of_contents:!1},r=void 0,s={permalink:"/blog/leetcode/sort-diagonally",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/leetcode/sort-matrix-diagonally.md",source:"@site/blog/leetcode/sort-matrix-diagonally.md",title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15:00.000Z",formattedDate:"March 4, 2023",tags:[{label:"cpp",permalink:"/blog/tags/cpp"},{label:"leetcode",permalink:"/blog/tags/leetcode"},{label:"iterators",permalink:"/blog/tags/iterators"}],readingTime:16.99,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"Sort the matrix diagonally",description:"Compiler assisted development.",date:"2023-03-04T23:15",slug:"leetcode/sort-diagonally",authors:"mf",tags:["cpp","leetcode","iterators"],hide_table_of_contents:!1},prevItem:{title:"3rd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/3rd-week"},nextItem:{title:"2nd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/2nd-week"}},l={authorsImageUrls:[void 0]},d=[{value:"Problem description",id:"problem-description",level:2},{value:"Example",id:"example",level:3},{value:"Skeleton and initial adjustments",id:"skeleton-and-initial-adjustments",level:2},{value:"Na\xefve solution",id:"na\xefve-solution",level:2},{value:"Implementing the <code>diagonals</code>",id:"implementing-the-diagonals",level:2},{value:"Iterating over diagonals",id:"iterating-over-diagonals",level:3},{value:"Implementing the iterator over diagonals",id:"implementing-the-iterator-over-diagonals",level:3},{value:"Implementing the <code>diagonal</code> itself",id:"implementing-the-diagonal-itself",level:2},{value:"Implementing <code>diagonal_iter</code>",id:"implementing-diagonal_iter",level:3}],p={toc:d},m="wrapper";function c(e){let{components:t,...n}=e;return(0,i.kt)(m,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Let's try to solve one of the LeetCode challenges in easy and hard mode at the\nsame time."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Link to the problem: ",(0,i.kt)("a",{parentName:"li",href:"https://leetcode.com/problems/sort-the-matrix-diagonally/"},"https://leetcode.com/problems/sort-the-matrix-diagonally/"))),(0,i.kt)("h2",{id:"problem-description"},"Problem description"),(0,i.kt)("p",null,"A ",(0,i.kt)("strong",{parentName:"p"},"matrix diagonal")," is a diagonal line of cells starting from some cell in\neither the topmost row or leftmost column and going in the bottom-right direction\nuntil reaching the matrix's end. For example, the ",(0,i.kt)("strong",{parentName:"p"},"matrix diagonal")," starting\nfrom ",(0,i.kt)("inlineCode",{parentName:"p"},"mat[2][0]"),", where ",(0,i.kt)("inlineCode",{parentName:"p"},"mat")," is a ",(0,i.kt)("inlineCode",{parentName:"p"},"6 x 3")," matrix, includes cells ",(0,i.kt)("inlineCode",{parentName:"p"},"mat[2][0]"),",\n",(0,i.kt)("inlineCode",{parentName:"p"},"mat[3][1]"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"mat[4][2]"),"."),(0,i.kt)("p",null,"Given an ",(0,i.kt)("inlineCode",{parentName:"p"},"m x n")," matrix ",(0,i.kt)("inlineCode",{parentName:"p"},"mat")," of integers, sort each matrix diagonal in ascending\norder and return the resulting matrix."),(0,i.kt)("h3",{id:"example"},"Example"),(0,i.kt)("p",null,(0,i.kt)("img",{parentName:"p",src:"https://assets.leetcode.com/uploads/2020/01/21/1482_example_1_2.png",alt:"Image describing the problem"})),(0,i.kt)("h2",{id:"skeleton-and-initial-adjustments"},"Skeleton and initial adjustments"),(0,i.kt)("p",null,"We are given the following skeleton for the C++ and the given challenge:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"class Solution {\npublic:\n vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {\n \n }\n};\n")),(0,i.kt)("p",null,"The task is to sort the passed matrix diagonally and then return it. First of all,\nI don't like to solve this in a web browser, so we'll need to adjust it accordingly\nfor running it locally. We'll start by including the ",(0,i.kt)("inlineCode",{parentName:"p"},"vector")," header and using\nfully-qualified namespaces",(0,i.kt)("sup",{parentName:"p",id:"fnref-1-b611be"},(0,i.kt)("a",{parentName:"sup",href:"#fn-1-b611be",className:"footnote-ref"},"1"))," and also adding few tests:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"#include <cassert>\n#include <vector>\n\nusing matrix = std::vector<std::vector<int>>;\n\nclass Solution {\npublic:\n matrix diagonalSort(matrix& mat)\n {\n }\n};\n\nstatic void test_case_1()\n{\n // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]\n // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]\n\n Solution s;\n assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },\n std::vector { 2, 2, 1, 2 },\n std::vector { 1, 1, 1, 2 } })\n == std::vector { std::vector { 1, 1, 1, 1 },\n std::vector { 1, 2, 2, 2 },\n std::vector { 1, 2, 3, 3 } }));\n}\n\nstatic void test_case_2()\n{\n // Input: mat =\n // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]\n // Output:\n // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]\n\n Solution s;\n assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },\n std::vector { 23, 55, 17, 45, 15, 52 },\n std::vector { 75, 31, 36, 44, 58, 8 },\n std::vector { 22, 27, 33, 25, 68, 4 },\n std::vector { 84, 28, 14, 11, 5, 50 } })\n == std::vector { std::vector { 5, 17, 4, 1, 52, 7 },\n std::vector { 11, 11, 25, 45, 8, 69 },\n std::vector { 14, 23, 25, 44, 58, 15 },\n std::vector { 22, 27, 31, 36, 50, 66 },\n std::vector { 84, 28, 75, 33, 55, 68 } }));\n}\n\nint main()\n{\n test_case_1();\n test_case_2();\n\n return 0;\n}\n")),(0,i.kt)("p",null,"We need to return the matrix, but we're given a reference to the input matrix. We\ncan easily abuse the C++ here and just switch the reference to value, this way\nthe matrix will be copied when passed to the function, we can sort the copy and\njust return it back. And we also get yelled by the compiler for the fact that the\nmethod doesn't return anything yet, so to make it \u201cshut up\u201d we will just return\nthe input for now:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-diff"},"- matrix diagonalSort(matrix& mat)\n+ matrix diagonalSort(matrix mat)\n {\n+ return mat;\n }\n")),(0,i.kt)("p",null,"Now, we get the copy and we're good to go."),(0,i.kt)("h2",{id:"na\xefve-solution"},"Na\xefve solution"),(0,i.kt)("p",null,"As you may know, C++ offers a plethora of functions that can be used to your\nadvantage, given that you know how to \u201cbend\u201d the data structures accordingly."),(0,i.kt)("p",null,"What does that mean for us? Well, we have an ",(0,i.kt)("inlineCode",{parentName:"p"},"std::sort"),", we can use it, right?\nLet's have a look at it:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"template< class RandomIt >\nvoid sort( RandomIt first, RandomIt last );\n")),(0,i.kt)("p",null,"This overload is more than we need. What does it do? It just sorts the elements\nin the range ",(0,i.kt)("inlineCode",{parentName:"p"},"[first, last)")," using ",(0,i.kt)("inlineCode",{parentName:"p"},"operator<")," on them. We can't sort the whole\nmatrix using this, but\u2026 we can sort just \xbbone\xab diagonal without doing much work\non our end."),(0,i.kt)("p",null,"What is the ",(0,i.kt)("inlineCode",{parentName:"p"},"RandomIt")," type though? If we look more into the documentation, we\ncan easily find the requirements for it and also learn that it's a ",(0,i.kt)("em",{parentName:"p"},"random access"),"\n",(0,i.kt)("em",{parentName:"p"},"iterator")," and allows swapping its values at the same time."),(0,i.kt)("admonition",{title:"Random access iterator",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"What is the ",(0,i.kt)("em",{parentName:"p"},"random access iterator")," though? We can find it in a documentation\nand see the following description:"),(0,i.kt)("blockquote",{parentName:"admonition"},(0,i.kt)("p",{parentName:"blockquote"},"A ",(0,i.kt)("strong",{parentName:"p"},"LegacyRandomAccessIterator")," is a ",(0,i.kt)("a",{parentName:"p",href:"https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator"},"LegacyBidirectionalIterator"),"\nthat can be moved to point to any element in constant time.")),(0,i.kt)("p",{parentName:"admonition"},"After that we can see all the requirements for it being listed. I don't feel like\nreading them right now, so we will just use it and see where the compilation blows\nup, i.e. \u201c",(0,i.kt)("em",{parentName:"p"},"compiler-assisted development"),"\u201d",(0,i.kt)("sup",{parentName:"p",id:"fnref-2-b611be"},(0,i.kt)("a",{parentName:"sup",href:"#fn-2-b611be",className:"footnote-ref"},"2"))," if you will ;)")),(0,i.kt)("p",null,"Now we know that we can use ",(0,i.kt)("inlineCode",{parentName:"p"},"std::sort")," to sort the diagonal itself, but we also\nneed to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to\nsomeone else",(0,i.kt)("sup",{parentName:"p",id:"fnref-3-b611be"},(0,i.kt)("a",{parentName:"sup",href:"#fn-3-b611be",className:"footnote-ref"},"3")),". And that way we get"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"matrix diagonalSort(matrix mat)\n{\n // we iterate over the diagonals\n for (auto d : diagonals(mat)) {\n // and we sort each diagonal\n std::sort(d.begin(), d.end());\n }\n\n // we take the matrix by copy, so we can sort in-situ and return the copy\n // that we sorted\n return mat;\n}\n")),(0,i.kt)("p",null,"This solution looks very simple, doesn't it? Well, cause it is.\nLet's try compiling it:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]\n for (auto d : diagonals(mat)) {\n ^\nFound compiler error(s).\nmake: *** [makefile:14: tidy] Error 1\n")),(0,i.kt)("p",null,"OK, seems about right. We haven't implemented the ",(0,i.kt)("inlineCode",{parentName:"p"},"diagonals")," yet. And based on\nwhat we've written so far, we need a function or a class ",(0,i.kt)("inlineCode",{parentName:"p"},"diagonals")," that will\ngive us the diagonals we need."),(0,i.kt)("h2",{id:"implementing-the-diagonals"},"Implementing the ",(0,i.kt)("inlineCode",{parentName:"h2"},"diagonals")),(0,i.kt)("p",null,"Cool, so we need the function that will let us go through each and every diagonal\nin our matrix. We use the ",(0,i.kt)("em",{parentName:"p"},"for-range")," loop, so whatever we get back from the\n",(0,i.kt)("inlineCode",{parentName:"p"},"diagonals")," must support ",(0,i.kt)("inlineCode",{parentName:"p"},".begin()")," and ",(0,i.kt)("inlineCode",{parentName:"p"},".end()"),". Since I am a masochist, we will\ndo such functionality for a matrix of any type, not just the ",(0,i.kt)("inlineCode",{parentName:"p"},"int")," from the challenge."),(0,i.kt)("p",null,"As I said, we need to be able to"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"construct the object"),(0,i.kt)("li",{parentName:"ul"},"get the beginning"),(0,i.kt)("li",{parentName:"ul"},"get the end (the \u201csentinel\u201d)")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"template <typename T>\nclass diagonals {\n using matrix_t = std::vector<std::vector<T>>;\n\n matrix_t& _matrix;\n\npublic:\n diagonals(matrix_t& m)\n : _matrix(m)\n {\n }\n diagonals_iter begin()\n {\n /* TODO */\n }\n diagonals_iter end()\n {\n /* TODO */\n }\n};\n")),(0,i.kt)("p",null,"Now we have a ",(0,i.kt)("inlineCode",{parentName:"p"},"diagonals")," that we can use to go through the diagonals. We haven't\nimplemented the core of it yet. Let's go through what we have for now."),(0,i.kt)("p",null,"We have a templated class with templated ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," that is used as a placeholder for any\ntype we would store in the matrix. Because I'm lazy, I have defined the ",(0,i.kt)("inlineCode",{parentName:"p"},"matrix_t"),"\ntype that is a \u201cshortcut\u201d for ",(0,i.kt)("inlineCode",{parentName:"p"},"std::vector<std::vector<T>>"),", so I don't have to\ntype it out all the time. Of course, we need to store the matrix, we are given,\nas a private attribute. And then just have the constructor and the 2 methods we\nneed for the ",(0,i.kt)("em",{parentName:"p"},"for-range"),"."),(0,i.kt)("h3",{id:"iterating-over-diagonals"},"Iterating over diagonals"),(0,i.kt)("p",null,"Now that we have an object that will allow us to iterate through the diagonals,\nwe need to implement the iterating itself. We need to go through all of them, so\nwe have multiple options how to do so. I have decided to start from the \u201cmain\u201d\ndiagonal that starts at ",(0,i.kt)("inlineCode",{parentName:"p"},"(0, 0)")," index and then proceed with the diagonals starting\nin the first row, followed by the rest of the diagonals in the first column."),(0,i.kt)("p",null,"We need to be able to tell that we've iterated through all of them, and also we\nneed to know which diagonal is next. For that purpose we will pass the indices\nof the first cell on the diagonal. That way we can always tell how to move forward."),(0,i.kt)("p",null,"We will start by updating the ",(0,i.kt)("inlineCode",{parentName:"p"},"begin")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"end")," to reflect our choice accordingly."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }\ndiagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }\n")),(0,i.kt)("p",null,"For the ",(0,i.kt)("inlineCode",{parentName:"p"},"begin")," we return the first diagonal that starts at ",(0,i.kt)("inlineCode",{parentName:"p"},"(0, 0)"),". And because\nwe have decided to do the diagonals in the first column at the end, the first\ndiagonal that is not a valid one is the one at ",(0,i.kt)("inlineCode",{parentName:"p"},"(0, height)"),". Apart from the\nindices, we also need to pass reference to the matrix itself."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"You may have noticed that we also include the diagonals that have length 1,\nspecifically the ones at ",(0,i.kt)("inlineCode",{parentName:"p"},"(0, height - 1)")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"(width - 1, 0)"),". We are implementing\nan iterator that ",(0,i.kt)("strong",{parentName:"p"},"should not")," care about the way it's being used. Therefore, we\ndon't care about the fact they don't need to be sorted.")),(0,i.kt)("p",null,"Cool, let's leave the iterator itself to someone else, right?",(0,i.kt)("sup",{parentName:"p",id:"fnref-4-b611be"},(0,i.kt)("a",{parentName:"sup",href:"#fn-4-b611be",className:"footnote-ref"},"4"))),(0,i.kt)("h3",{id:"implementing-the-iterator-over-diagonals"},"Implementing the iterator over diagonals"),(0,i.kt)("p",null,"We can start with a simple skeleton based on the information that we pass from\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"diagonals"),". Also to utilize the ",(0,i.kt)("inlineCode",{parentName:"p"},"matrix_t")," and also contain implementation\ndetails hidden away, we will put this code into the ",(0,i.kt)("inlineCode",{parentName:"p"},"diagonals")," class."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"class diagonals_iter {\n matrix_t& m;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n};\n")),(0,i.kt)("p",null,"In this case we will be implementing a \u201csimple\u201d forward iterator, so we don't\nneed to implement a lot. Notably it will be:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"inequality operator (we need to know when we reach the end and have nothing to\niterate over)"),(0,i.kt)("li",{parentName:"ul"},"preincrementation operator (we need to be able to move around the iterable)"),(0,i.kt)("li",{parentName:"ul"},"dereference operator (we need to be able to retrieve the objects we iterate\nover)")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"class diagonals_iter {\n matrix_t& m;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator!=(const diagonals_iter& rhs) const\n {\n // iterators are not equal if they reference different matrices, or\n // their positions differ\n return m != rhs.m || x != rhs.x || y != rhs.y;\n }\n\n diagonals_iter& operator++()\n {\n if (y != 0) {\n // iterating through diagonals down the first column\n y++;\n return *this;\n }\n\n // iterating the diagonals along the first row\n x++;\n if (x == m.front().size()) {\n // switching to diagonals in the first column\n x = 0;\n y++;\n }\n\n return *this;\n }\n\n diagonal<T> operator*() const { return diagonal { m, x, y }; }\n};\n")),(0,i.kt)("p",null,"Let's go one-by-one. Inequality operator is rather simple, just compare iterator's\nattributes field-by-field. If you think about it, checking inequality of two 2D\nvectors may be a bit inefficient, therefore, we can swap around and check it as\na last thing."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-diff"},"- return m != rhs.m || x != rhs.x || y != rhs.y;\n+ return x != rhs.x || y != rhs.y || m != rhs.m;\n")),(0,i.kt)("p",null,"Preincrementation is where the magic happens. If you have a better look, you can\nsee two branches of this operation:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"When ",(0,i.kt)("inlineCode",{parentName:"li"},"y != 0")," (we're iterating over the diagonals in the first column)\nIn this case, we just bump the row and we're done."),(0,i.kt)("li",{parentName:"ol"},"When ",(0,i.kt)("inlineCode",{parentName:"li"},"y == 0")," (we're iterating over the diagonals in the first row)\nIn this case, we bump the column and check if we haven't gotten out of bounds,\ni.e. the end of the first row. If we get out of the bounds, we're continuing\nwith the second diagonal in the first column.")),(0,i.kt)("p",null,"Dereferencing the iterator must \u201cyield\u201d something. In our case it will be the\ndiagonal that we want to sort. For sorting we need just the iterators that can\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\nsomething else. In our case it will be a class called ",(0,i.kt)("inlineCode",{parentName:"p"},"diagonal"),"."),(0,i.kt)("h2",{id:"implementing-the-diagonal-itself"},"Implementing the ",(0,i.kt)("inlineCode",{parentName:"h2"},"diagonal")," itself"),(0,i.kt)("p",null,"After implementing the iterator over diagonals, we know that all we need to describe\na diagonal is the matrix itself and the \u201cstart\u201d of the diagonal (row and column).\nAnd we also know that the diagonal must provide some iterators for the ",(0,i.kt)("inlineCode",{parentName:"p"},"std::sort"),"\nfunction. We can start with the following skeleton:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"template <typename T>\nclass diagonal {\n using matrix_t = std::vector<std::vector<T>>;\n\n matrix_t& matrix;\n std::size_t x;\n std::size_t y;\n\npublic:\n diagonal(matrix_t& matrix, std::size_t x, std::size_t y)\n : matrix(matrix)\n , x(x)\n , y(y)\n {\n }\n\n diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }\n\n diagonal_iter end() const\n {\n auto max_x = matrix[y].size();\n auto max_y = matrix.size();\n\n // we need to find the distance in which we get out of bounds (either in\n // column or row)\n auto steps = std::min(max_x - x, max_y - y);\n\n return diagonal_iter { matrix, x + steps, y + steps };\n }\n};\n")),(0,i.kt)("p",null,"Initialization is rather simple, we just \u201ckeep\u201d the stuff we get, ",(0,i.kt)("inlineCode",{parentName:"p"},"begin")," is the\nsimplest, we just delegate."),(0,i.kt)("p",null,"In case of the ",(0,i.kt)("inlineCode",{parentName:"p"},"end"),", it gets more complicated. We need to know where is the \u201cend\u201d\nof the diagonal. Since ",(0,i.kt)("inlineCode",{parentName:"p"},"end")," should point to the first element \u201cafter\u201d the iterable,\nwe know that it's the first position of the iterator where either ",(0,i.kt)("inlineCode",{parentName:"p"},"y")," becomes\n",(0,i.kt)("inlineCode",{parentName:"p"},"matrix.size()")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," becomes ",(0,i.kt)("inlineCode",{parentName:"p"},"matrix[y].size()"),". Also we are moving along diagonal,\nduh, therefore we can deduce the first \u201cposition\u201d afterwards by minimal amount of\nsteps to get out of the any column or row, hence ",(0,i.kt)("inlineCode",{parentName:"p"},"std::min(max_x - x, max_y - y)"),".\nFinal position is then computed simply by adding the steps to the beginning of\nthe diagonal."),(0,i.kt)("p",null,"Now we just need to finish the iterator for the diagonal itself and we're done."),(0,i.kt)("h3",{id:"implementing-diagonal_iter"},"Implementing ",(0,i.kt)("inlineCode",{parentName:"h3"},"diagonal_iter")),(0,i.kt)("p",null,"This part is the hardest from all we need to do. It's because of the requirements\nof the ",(0,i.kt)("inlineCode",{parentName:"p"},"std::sort")," that requires us to implement a ",(0,i.kt)("em",{parentName:"p"},"random access iterator"),". I have\nbriefly described it above, and \u201cin a nutshell\u201d it means that we need to implement\nan iterator that can move in constant time along the diagonal in any amount of\nsteps."),(0,i.kt)("p",null,"Let's go through all of the functionality that our iterator needs to support to\nbe used in ",(0,i.kt)("inlineCode",{parentName:"p"},"std::sort"),". We need the usual operations like:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"equality/inequality"),(0,i.kt)("li",{parentName:"ul"},"incrementation"),(0,i.kt)("li",{parentName:"ul"},"dereferencing")),(0,i.kt)("p",null,"We will also add all the types that our iterator uses with the category of the\niterator, i.e. what interface it supports:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"class diagonal_iter {\n // we need to keep reference to the matrix itself\n matrix_t& m;\n\n // we need to be able to tell our current position\n std::size_t x;\n std::size_t y;\n\npublic:\n using difference_type = std::ptrdiff_t;\n using value_type = T;\n using pointer = T*;\n using reference = T&;\n using iterator_category = std::random_access_iterator_tag;\n\n diagonal_iter(matrix_t& matrix,\n std::size_t x,\n std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator==(const diagonal_iter& rhs) const\n {\n return x == rhs.x && y == rhs.y && m == rhs.m;\n }\n\n diagonal_iter& operator++()\n {\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\n // the same time\n x++;\n y++;\n return *this;\n }\n\n reference operator*() const { return m[y][x]; }\n};\n")),(0,i.kt)("p",null,"This is pretty similar to the previous iterator, but now we need to implement the\nremaining requirements of the ",(0,i.kt)("em",{parentName:"p"},"random access iterator"),". Let's see what those are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"decrementation - cause we need to be able to move backwards too, since ",(0,i.kt)("em",{parentName:"li"},"random "),(0,i.kt)("em",{parentName:"li"},"access iterator")," extends the interface of ",(0,i.kt)("em",{parentName:"li"},"bidirectional iterator")),(0,i.kt)("li",{parentName:"ul"},"moving the iterator in either direction by steps given as an integer"),(0,i.kt)("li",{parentName:"ul"},"being able to tell the distance between two iterators"),(0,i.kt)("li",{parentName:"ul"},"define an ordering on the iterators")),(0,i.kt)("p",null,"Let's fill them in:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-cpp"},"class diagonal_iter {\n // we need to keep reference to the matrix itself\n matrix_t& m;\n\n // we need to be able to tell our current position\n std::size_t x;\n std::size_t y;\n\npublic:\n using difference_type = std::ptrdiff_t;\n using value_type = T;\n using pointer = T*;\n using reference = T&;\n using iterator_category = std::random_access_iterator_tag;\n\n diagonal_iter(matrix_t& matrix,\n std::size_t x,\n std::size_t y)\n : m(matrix)\n , x(x)\n , y(y)\n {\n }\n\n bool operator==(const diagonal_iter& rhs) const\n {\n return x == rhs.x && y == rhs.y && m == rhs.m;\n }\n\n diagonal_iter& operator++()\n {\n // we are moving along the diagonal, so we increment both \u2039x\u203a and \u2039y\u203a at\n // the same time\n x++;\n y++;\n return *this;\n }\n\n reference operator*() const { return m[y][x]; }\n\n // exactly opposite to the incrementation\n diagonal_iter operator--()\n {\n x--;\n y--;\n return *this;\n }\n\n // moving \u2039n\u203a steps back is same as calling decrementation \u2039n\u203a-times, so we\n // can just return a new iterator and subtract \u2039n\u203a from both coordinates in\n // the matrix\n diagonal_iter operator-(difference_type n) const\n {\n return diagonal_iter { m, x - n, y - n };\n }\n\n // here we assume that we are given two iterators on the same diagonal\n difference_type operator-(const diagonal_iter& rhs) const\n {\n assert(m == rhs.m);\n return x - rhs.x;\n }\n\n // counterpart of moving \u2039n\u203a steps backwards\n diagonal_iter operator+(difference_type n) const\n {\n return diagonal_iter { m, x + n, y + n };\n }\n\n // we compare the coordinates, and also assume that those 2 iterators are\n // lying on the same diagonal\n bool operator<(const diagonal_iter& rhs) const\n {\n assert(m == rhs.m);\n return x < rhs.x && y < rhs.y;\n }\n};\n")),(0,i.kt)("p",null,"At this point we could probably try and compile it, right? If we do so, we will\nget yelled at by a compiler for the following reasons:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n __last = __next;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here\n std::__unguarded_linear_insert(__i,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__final_insertion_sort(__first, __last, __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')\n matrix_t& m;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]\n std::__unguarded_linear_insert(__i,\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__final_insertion_sort(__first, __last, __comp);\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal<int>::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]\n __unguarded_linear_insert(_RandomAccessIterator __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n __last = __cut;\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop<diagonal<int>::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__introsort_loop(__first, __last,\n ^\n/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here\n std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n ^\nmatrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here\n std::sort(d.begin(), d.end());\n ^\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')\n matrix_t& m;\n ^\n")),(0,i.kt)("p",null,"That's a lot of noise, isn't it? Let's focus on the important parts:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]\n\u2026\nmatrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')\n matrix_t& m;\n ^\n")),(0,i.kt)("p",null,"Ah! We have a reference in our iterator, and this prevents us from having a copy\nassignment operator (that is used \u201csomewhere\u201d in the sorting algorithm). Well\u2026\nLet's just wrap it!"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-diff"},"# we need to keep a different type than reference\n- matrix_t& m;\n+ std::reference_wrapper<matrix_t> m;\n\n# in comparison we need to get the reference out of the wrapper first\n- return x == rhs.x && y == rhs.y && m == rhs.m;\n+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();\n\n# same when we return a reference to the \u201ccell\u201d in the matrix\n- reference operator*() const { return m[y][x]; }\n+ reference operator*() const { return m.get()[y][x]; }\n\n# and finally in the assertions that we set for the \u201cdistance\u201d and \u201cless than\u201d\n- assert(m == rhs.m);\n+ assert(m.get() == rhs.m.get());\n")),(0,i.kt)("p",null,"We're done now! We have written an iterator over diagonals for a 2D ",(0,i.kt)("inlineCode",{parentName:"p"},"vector"),". You can have a look at the final result ",(0,i.kt)("a",{parentName:"p",href:"pathname:///files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp"},"here"),"."),(0,i.kt)("div",{className:"footnotes"},(0,i.kt)("hr",{parentName:"div"}),(0,i.kt)("ol",{parentName:"div"},(0,i.kt)("li",{parentName:"ol",id:"fn-1-b611be"},"just because I'm used to it and don't care about your opinion ;)",(0,i.kt)("a",{parentName:"li",href:"#fnref-1-b611be",className:"footnote-backref"},"\u21a9")),(0,i.kt)("li",{parentName:"ol",id:"fn-2-b611be"},"exercise at your own risk",(0,i.kt)("a",{parentName:"li",href:"#fnref-2-b611be",className:"footnote-backref"},"\u21a9")),(0,i.kt)("li",{parentName:"ol",id:"fn-3-b611be"},"me in 5 minutes in fact, but don't make me scared",(0,i.kt)("a",{parentName:"li",href:"#fnref-3-b611be",className:"footnote-backref"},"\u21a9")),(0,i.kt)("li",{parentName:"ol",id:"fn-4-b611be"},"me in the next section\u2026",(0,i.kt)("a",{parentName:"li",href:"#fnref-4-b611be",className:"footnote-backref"},"\u21a9")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d02d148d.0cb68506.js b/assets/js/d02d148d.0cb68506.js new file mode 100644 index 0000000..6da0c36 --- /dev/null +++ b/assets/js/d02d148d.0cb68506.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7780],{9221:i=>{i.exports=JSON.parse('{"label":"testing","permalink":"/ib002/tags/testing","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"algorithms-correctness/postcondition-ambiguity","title":"Vague postconditions and proving correctness of algorithms","description":"Debugging and testing with precise postconditions.\\n","permalink":"/ib002/algorithms-correctness/postcondition-ambiguity"}]}')}}]); \ No newline at end of file diff --git a/assets/js/d5ca4423.c7f8ab3b.js b/assets/js/d5ca4423.c7f8ab3b.js new file mode 100644 index 0000000..914a82f --- /dev/null +++ b/assets/js/d5ca4423.c7f8ab3b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5126],{1032:i=>{i.exports=JSON.parse('{"label":"sorting","permalink":"/ib002/tags/sorting","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"algorithms-correctness/postcondition-ambiguity","title":"Vague postconditions and proving correctness of algorithms","description":"Debugging and testing with precise postconditions.\\n","permalink":"/ib002/algorithms-correctness/postcondition-ambiguity"}]}')}}]); \ No newline at end of file diff --git a/assets/js/d661cf04.70911e61.js b/assets/js/d661cf04.70911e61.js new file mode 100644 index 0000000..15fda6a --- /dev/null +++ b/assets/js/d661cf04.70911e61.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6112],{8194:e=>{e.exports=JSON.parse('{"title":"Practice Exams","description":"Practice exams for training for the final exam.\\n","slug":"/category/practice-exams","permalink":"/pb071/category/practice-exams","navigation":{"previous":{"title":"10th seminar","permalink":"/pb071/bonuses/seminar-10"},"next":{"title":"Practice exam B","permalink":"/pb071/pexam/garbage_collect"}}}')}}]); \ No newline at end of file diff --git a/assets/js/d675395f.567b4609.js b/assets/js/d675395f.567b4609.js new file mode 100644 index 0000000..b3d716e --- /dev/null +++ b/assets/js/d675395f.567b4609.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2741],{5745:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/d74d369f.ab677fcf.js b/assets/js/d74d369f.ab677fcf.js new file mode 100644 index 0000000..e6e0a31 --- /dev/null +++ b/assets/js/d74d369f.ab677fcf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9479],{2231:e=>{e.exports=JSON.parse('{"title":"Red-Black Trees","description":"Materials related to red-black trees.\\n","slug":"/category/red-black-trees","permalink":"/ib002/category/red-black-trees","navigation":{"previous":{"title":"Introduction to dynamic programming","permalink":"/ib002/recursion/pyramid-slide-down"},"next":{"title":"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f","permalink":"/ib002/rb-trees/applications"}}}')}}]); \ No newline at end of file diff --git a/assets/js/d79dd549.ee10504b.js b/assets/js/d79dd549.ee10504b.js new file mode 100644 index 0000000..8206e63 --- /dev/null +++ b/assets/js/d79dd549.ee10504b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5169],{9261:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/red-hat","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/d7f7fb17.fd985da7.js b/assets/js/d7f7fb17.fd985da7.js new file mode 100644 index 0000000..d1205bd --- /dev/null +++ b/assets/js/d7f7fb17.fd985da7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[1171],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)r=a[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),f=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=f(e.components);return o.createElement(l.Provider,{value:t},e.children)},s="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),s=f(r),d=n,m=s["".concat(l,".").concat(d)]||s[d]||u[d]||a;return r?o.createElement(m,i(i({ref:t},p),{},{components:r})):o.createElement(m,i({ref:t},p))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[s]="string"==typeof e?e:n,i[1]=c;for(var f=2;f<a;f++)i[f]=r[f];return o.createElement.apply(null,i)}return o.createElement.apply(null,r)}d.displayName="MDXCreateElement"},8049:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>f});var o=r(7462),n=(r(7294),r(3905));const a={title:"Advent of Code '22 in Rust",description:"Preparing for Advent of Code '22.",date:"2022-12-14T21:45",slug:"aoc-2022/intro",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},i=void 0,c={permalink:"/blog/aoc-2022/intro",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/00-intro.md",source:"@site/blog/aoc-2022/00-intro.md",title:"Advent of Code '22 in Rust",description:"Preparing for Advent of Code '22.",date:"2022-12-14T21:45:00.000Z",formattedDate:"December 14, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:8.665,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"Advent of Code '22 in Rust",description:"Preparing for Advent of Code '22.",date:"2022-12-14T21:45",slug:"aoc-2022/intro",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"1st week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/1st-week"}},l={authorsImageUrls:[void 0]},f=[],p={toc:f},s="wrapper";function u(e){let{components:t,...r}=e;return(0,n.kt)(s,(0,o.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Let's talk about the preparations for this year's ","[",(0,n.kt)("em",{parentName:"p"},"Advent of Code"),"]","."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d9adc206.4d3c59b2.js b/assets/js/d9adc206.4d3c59b2.js new file mode 100644 index 0000000..53bfd46 --- /dev/null +++ b/assets/js/d9adc206.4d3c59b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4252],{6297:e=>{e.exports=JSON.parse('{"label":"dynamic array","permalink":"/ib002/tags/dynamic-array","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"time-complexity/extend","title":"Time complexity of \u2039extend\u203a","description":"How to make inefficient algorithm unknowingly.\\n","permalink":"/ib002/time-complexity/extend"}]}')}}]); \ No newline at end of file diff --git a/assets/js/dadfcff0.3cd22a72.js b/assets/js/dadfcff0.3cd22a72.js new file mode 100644 index 0000000..e88cd3a --- /dev/null +++ b/assets/js/dadfcff0.3cd22a72.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7624],{3095:e=>{e.exports=JSON.parse('{"label":"graphs","permalink":"/ib002/tags/graphs","allTagsPath":"/ib002/tags","count":2,"items":[{"id":"graphs/bfs-tree","title":"Distance boundaries from BFS tree on undirected graphs","description":"Short explanation of distance boundaries deduced from a BFS tree.\\n","permalink":"/ib002/graphs/bfs-tree"},{"id":"graphs/iterative-and-iterators","title":"Iterative algorithms via iterators","description":"Iterative DFS using iterators.\\n","permalink":"/ib002/graphs/iterative-and-iterators"}]}')}}]); \ No newline at end of file diff --git a/assets/js/df203c0f.1c48be56.js b/assets/js/df203c0f.1c48be56.js new file mode 100644 index 0000000..53aae18 --- /dev/null +++ b/assets/js/df203c0f.1c48be56.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9924],{1298:(e,t,l)=>{l.r(t),l.d(t,{default:()=>d});var a=l(7294),n=l(6010),r=l(9960),s=l(8824),c=l(833),o=l(5281),i=l(5999),u=l(7452),g=l(197);function m(e){let{doc:t}=e;return a.createElement("article",{className:"margin-vert--lg"},a.createElement(r.Z,{to:t.permalink},a.createElement("h2",null,t.title)),t.description&&a.createElement("p",null,t.description))}function d(e){let{tag:t}=e;const l=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,i.I)({id:"theme.docs.tagDocListPageTitle.nDocsTagged",description:'Pluralized label for "{count} docs tagged". 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 doc tagged|{count} docs tagged"},{count:t}))}(),d=(0,i.I)({id:"theme.docs.tagDocListPageTitle",description:"The title of the page for a docs tag",message:'{nDocsTagged} with "{tagName}"'},{nDocsTagged:l(t.count),tagName:t.label});return a.createElement(c.FG,{className:(0,n.Z)(o.k.wrapper.docsPages,o.k.page.docsTagDocListPage)},a.createElement(c.d,{title:d}),a.createElement(g.Z,{tag:"doc_tag_doc_list"}),a.createElement(u.Z,null,a.createElement("div",{className:"container margin-vert--lg"},a.createElement("div",{className:"row"},a.createElement("main",{className:"col col--8 col--offset-2"},a.createElement("header",{className:"margin-bottom--xl"},a.createElement("h1",null,d),a.createElement(r.Z,{href:t.allTagsPath},a.createElement(i.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),a.createElement("section",{className:"margin-vert--lg"},t.items.map((e=>a.createElement(m,{key:e.id,doc:e})))))))))}},8824:(e,t,l)=>{l.d(t,{c:()=>i});var a=l(7294),n=l(2263);const r=["zero","one","two","few","many","other"];function s(e){return r.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,a.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(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`),c}}),[e])}function i(){const e=o();return{selectMessage:(t,l)=>function(e,t,l){const a=e.split("|");if(1===a.length)return a[0];a.length>l.pluralForms.length&&console.error(`For locale=${l.locale}, a maximum of ${l.pluralForms.length} plural forms are expected (${l.pluralForms.join(",")}), but the message contains ${a.length}: ${e}`);const n=l.select(t),r=l.pluralForms.indexOf(n);return a[Math.min(r,a.length-1)]}(l,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/dff2ebad.0c0a899d.js b/assets/js/dff2ebad.0c0a899d.js new file mode 100644 index 0000000..451cd7c --- /dev/null +++ b/assets/js/dff2ebad.0c0a899d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[146],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(7294);function o(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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function r(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,c=r(e,["components","mdxType","originalType","parentName"]),m=p(n),u=o,h=m["".concat(s,".").concat(u)]||m[u]||d[u]||i;return n?a.createElement(h,l(l({ref:t},c),{},{components:n})):a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,l=new Array(i);l[0]=u;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r[m]="string"==typeof e?e:o,l[1]=r;for(var p=2;p<i;p++)l[p]=n[p];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},577:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const i={title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15",slug:"aoc-2022/1st-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},l=void 0,r={permalink:"/blog/aoc-2022/1st-week",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/01-week-1.md",source:"@site/blog/aoc-2022/01-week-1.md",title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15:00.000Z",formattedDate:"December 15, 2022",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:12.4,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"1st week of Advent of Code '22 in Rust",description:"Surviving first week in Rust.",date:"2022-12-15T01:15",slug:"aoc-2022/1st-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"2nd week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/2nd-week"},nextItem:{title:"Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/intro"}},s={authorsImageUrls:[void 0]},p=[{value:"Day 1: Calorie Counting",id:"day-1-calorie-counting",level:2},{value:"Solution",id:"solution",level:3},{value:"Day 2: Rock Paper Scissors",id:"day-2-rock-paper-scissors",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Day 3: Rucksack Reorganization",id:"day-3-rucksack-reorganization",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Day 4: Camp Cleanup",id:"day-4-camp-cleanup",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 5: Supply Stacks",id:"day-5-supply-stacks",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 6: Tuning Trouble",id:"day-6-tuning-trouble",level:2},{value:"Solution",id:"solution-5",level:3},{value:"Day 7: No Space Left On Device",id:"day-7-no-space-left-on-device",level:2},{value:"Solution",id:"solution-6",level:3},{value:"Post Mortem",id:"post-mortem",level:2},{value:"<code>Rc<T></code> vs <code>Rc<RefCell<T>></code>",id:"rct-vs-rcrefcellt",level:3}],c={toc:p},m="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Let's go through the first week of ",(0,o.kt)("a",{parentName:"p",href:"https://adventofcode.com"},(0,o.kt)("em",{parentName:"a"},"Advent of Code"))," in Rust."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"If you wish to have a look at the solutions, you can follow them on my ",(0,o.kt)("a",{parentName:"p",href:"https://gitlab.com/mfocko/advent-of-code-2022"},"GitLab"),".\nMore specifically in the ",(0,o.kt)("a",{parentName:"p",href:"https://gitlab.com/mfocko/advent-of-code-2022/-/tree/main/src/bin"},(0,o.kt)("inlineCode",{parentName:"a"},"/src/bin/")),".")),(0,o.kt)("p",null,"I will try to summarize my experience with using Rust for the AoC. Trying it out\nages ago, I believe it will be ",(0,o.kt)("em",{parentName:"p"},"pain and suffering"),", but we will see. For each\nday I will also try to give a tl;dr of the problem, so that you can better imagine\nthe relation to my woes or \ud83d\udc4d moments."),(0,o.kt)("h2",{id:"day-1-calorie-counting"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/1"},"Day 1: Calorie Counting")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"As the name suggests, we get the calories of the food contained in the elves\nbackpacks and we want to choose the elf that has the most food ;)")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"Wakey wakey!")),(0,o.kt)("p",null,"Programming in Rust at 6am definitely hits. I've also forgotten to mention how I\nhandle samples. With each puzzle you usually get a sample input and expected\noutput. You can use them to verify that your solution works, or usually doesn't."),(0,o.kt)("p",null,"At first I've decided to put asserts into my ",(0,o.kt)("inlineCode",{parentName:"p"},"main"),", something like"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'assert_eq!(part_1(&sample), 24000);\ninfo!("Part 1: {}", part_1(&input));\n\nassert_eq!(part_2(&sample), 45000);\ninfo!("Part 2: {}", part_2(&input));\n')),(0,o.kt)("p",null,"However, once you get further, the sample input may take some time to run itself.\nSo in the end, I have decided to turn them into unit tests:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'#[cfg(test)]\nmod tests {\n use super::*;\n\n #[test]\n fn test_part_1() {\n let sample = parse_input("samples/day01.txt");\n assert_eq!(part_1(&sample), 24000);\n }\n\n #[test]\n fn test_part_2() {\n let sample = parse_input("samples/day01.txt");\n assert_eq!(part_2(&sample), 45000);\n }\n}\n')),(0,o.kt)("p",null,"And later on I have noticed, it's hard to tell the difference between the days,\nso I further renamed the ",(0,o.kt)("inlineCode",{parentName:"p"},"mod")," from generic ",(0,o.kt)("inlineCode",{parentName:"p"},"tests")," to reflect the days."),(0,o.kt)("p",null,"Also after finishing the first day puzzle, I have installed an ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/mozilla/sccache"},(0,o.kt)("inlineCode",{parentName:"a"},"sccache"))," to\ncache the builds, so that the build time is lower, cause it was kinda unbearable."),(0,o.kt)("h3",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Well, it's a pretty simple problem. You just take the input, sum the calories and\nfind the biggest one. However, if we try to generalize to more than the biggest\none, the fun appears. We have few options:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"keep all the calories, sort them, take what we need"),(0,o.kt)("li",{parentName:"ul"},"keep all the calories and use max heap"),(0,o.kt)("li",{parentName:"ul"},"use min heap and maintain at most N calories that we need")),(0,o.kt)("h2",{id:"day-2-rock-paper-scissors"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/2"},"Day 2: Rock Paper Scissors")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"You want to know what score did you achieve while playing ",(0,o.kt)("em",{parentName:"p"},"Rock Paper Scissors"),".\nAnd then you want to be strategic about it.")),(0,o.kt)("p",null,"Apart from the technical details of the puzzle, it went relatively smooth."),(0,o.kt)("h3",{id:"solution-1"},"Solution"),(0,o.kt)("p",null,"I took relatively na\xefve approach and then tried to simplify it."),(0,o.kt)("h2",{id:"day-3-rucksack-reorganization"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/3"},"Day 3: Rucksack Reorganization")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you\nwant to find the common item among those compartments. Each of them has priority,\nyou care only about the sum.")),(0,o.kt)("p",null,"This is the day where I started to fight the compiler and neither of us decided\nto give up. Let's dive into it \\o/"),(0,o.kt)("admonition",{title:"Fun fact",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Fighting the compiler took me 30 minutes.")),(0,o.kt)("p",null,"We need to find a common item among 2 collections, that's an easy task, right?\nWe can construct 2 sets and find an intersection:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"let top: HashSet<i32> = [1, 2, 3].iter().collect();\nlet bottom: HashSet<i32> = [3, 4, 5].iter().collect();\n")),(0,o.kt)("p",null,"Now, the first issue that we encounter is caused by the fact that we are using\na slice (the ",(0,o.kt)("inlineCode",{parentName:"p"},"[\u2026]"),"), iterator of that returns ",(0,o.kt)("strong",{parentName:"p"},"references")," to the numbers.\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\nafter running the ",(0,o.kt)("inlineCode",{parentName:"p"},".collect"),". To fix this, we can use ",(0,o.kt)("inlineCode",{parentName:"p"},".into_iter"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"let top: HashSet<i32> = [1, 2, 3].into_iter().collect();\nlet bottom: HashSet<i32> = [3, 4, 5].into_iter().collect();\n")),(0,o.kt)("p",null,"This way the numbers will get copied instead of referenced. OK, let's find the\nintersection of those 2 collections:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'println!("Common elements: {:?}", top.intersection(&bottom));\n')),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Common elements: [3]\n")),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Notice that we need to do ",(0,o.kt)("inlineCode",{parentName:"p"},"&bottom"),". It explicitly specifies that ",(0,o.kt)("inlineCode",{parentName:"p"},".intersection"),"\n",(0,o.kt)("strong",{parentName:"p"},"borrows")," the ",(0,o.kt)("inlineCode",{parentName:"p"},"bottom"),", i.e. takes an immutable reference to it.")),(0,o.kt)("p",null,"That's what we want, right? Looks like it! \\o/"),(0,o.kt)("p",null,"Next part wants us to find the common element among all of the backpacks. OK, so\nthat should be fairly easy, we have an intersection and we want to find intersection\nover all of them."),(0,o.kt)("p",null,"Let's have a look at the type of the ",(0,o.kt)("inlineCode",{parentName:"p"},".intersection")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"pub fn intersection<'a>(\n\xa0\xa0\xa0\xa0&'a self,\n\xa0\xa0\xa0\xa0other: &'a HashSet<T, S>\n) -> Intersection<'a, T, S>\n")),(0,o.kt)("p",null,"OK\u2026 Huh\u2026 But we have an example there!"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"let intersection: HashSet<_> = a.intersection(&b).collect();\n")),(0,o.kt)("p",null,"Cool, that's all we need."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\nprintln!("Intersection: {:?}", intersection);\n')),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Intersection: {3, 4}\n")),(0,o.kt)("p",null,"Cool, so let's do the intersection with the ",(0,o.kt)("inlineCode",{parentName:"p"},"top_2"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).collect();\nlet intersection: HashSet<_> = intersection.intersection(&top_2).collect();\nprintln!("Intersection: {:?}", intersection);\n')),(0,o.kt)("p",null,"And we get yelled at by the compiler:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"error[E0308]: mismatched types\n --\x3e src/main.rs:10:58\n |\n10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();\n | ------------ ^^^^^^ expected `&i32`, found `i32`\n | |\n | arguments to this function are incorrect\n |\n = note: expected reference `&HashSet<&i32>`\n found reference `&HashSet<i32>`\n")),(0,o.kt)("p",null,"/o\\ What the hell is going on here? Well, the funny thing is, that this operation\ndoesn't return the elements themselves, but the references to them and when we pass\nthe third set, it has just the values themselves, without any references."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"It may seem as a very weird decision, but in fact it makes some sense\u2026 It allows\nyou to do intersection of items that may not be possible to copy. Overall this is\na \u201ctax\u201d for having a borrow checker ",(0,o.kt)("del",{parentName:"p"},"drilling your ass")," having your back and\nmaking sure you're not doing something naughty that may cause an ",(0,o.kt)("strong",{parentName:"p"},"undefined"),"\n",(0,o.kt)("strong",{parentName:"p"},"behavior"),".")),(0,o.kt)("p",null,"To resolve this we need to get an iterator that ",(0,o.kt)("strong",{parentName:"p"},"clones")," the elements:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();\nlet bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();\nlet top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();\nlet bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();\n\nlet intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();\nlet intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();\nlet intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();\nprintln!("Intersection: {:?}", intersection);\n')),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Intersection: {4}\n")),(0,o.kt)("h3",{id:"solution-2"},"Solution"),(0,o.kt)("p",null,"The approach is pretty simple, if you omit the ",(0,o.kt)("em",{parentName:"p"},"1on1 with the compiler"),". You just\nhave some fun with the set operations :)"),(0,o.kt)("h2",{id:"day-4-camp-cleanup"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/4"},"Day 4: Camp Cleanup")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Elves are cleaning up the camp and they got overlapping sections to clean up.\nFind how many overlap and can take the day off.")),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/ops/struct.RangeInclusive.html"},(0,o.kt)("inlineCode",{parentName:"a"},"RangeInclusive"))," is your friend not an enemy :)"),(0,o.kt)("h3",{id:"solution-3"},"Solution"),(0,o.kt)("p",null,"Relatively easy, you just need to parse the input and know what you want. Rust's\n",(0,o.kt)("inlineCode",{parentName:"p"},"RangeInclusive")," type helped a lot, cause it took care of all abstractions."),(0,o.kt)("h2",{id:"day-5-supply-stacks"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/5"},"Day 5: Supply Stacks")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Let's play with stacks of crates.")),(0,o.kt)("p",null,"Very easy problem with very annoying input. You can judge yourself:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"}," [D] \n[N] [C] \n[Z] [M] [P]\n 1 2 3 \n\nmove 1 from 2 to 1\nmove 3 from 1 to 3\nmove 2 from 2 to 1\nmove 1 from 1 to 2\n")),(0,o.kt)("p",null,"Good luck transforming that into something reasonable :)"),(0,o.kt)("admonition",{title:"Fun fact",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Took me 40 minutes to parse this reasonably, including fighting the compiler.")),(0,o.kt)("h3",{id:"solution-4"},"Solution"),(0,o.kt)("p",null,"For the initial solution I went with a manual solution (as in ",(0,o.kt)("em",{parentName:"p"},"I have done all"),"\n",(0,o.kt)("em",{parentName:"p"},"the work"),". Later on I have decided to explore the ",(0,o.kt)("inlineCode",{parentName:"p"},"std")," and interface of the\n",(0,o.kt)("inlineCode",{parentName:"p"},"std::vec::Vec")," and found ",(0,o.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/vec/struct.Vec.html#method.split_off"},(0,o.kt)("inlineCode",{parentName:"a"},"split_off"))," which takes an index and splits (duh)\nthe vector:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"let mut vec = vec![1, 2, 3];\nlet vec2 = vec.split_off(1);\nassert_eq!(vec, [1]);\nassert_eq!(vec2, [2, 3]);\n")),(0,o.kt)("p",null,"This helped me simplify my solution a lot and also get rid of some ",(0,o.kt)("em",{parentName:"p"},"edge cases"),"."),(0,o.kt)("h2",{id:"day-6-tuning-trouble"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/6"},"Day 6: Tuning Trouble")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Finding start of the message in a very weird protocol. Start of the message is\ndenoted by ",(0,o.kt)("span",{parentName:"p",className:"math math-inline"},(0,o.kt)("span",{parentName:"span",className:"katex"},(0,o.kt)("span",{parentName:"span",className:"katex-mathml"},(0,o.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,o.kt)("semantics",{parentName:"math"},(0,o.kt)("mrow",{parentName:"semantics"},(0,o.kt)("mi",{parentName:"mrow"},"N")),(0,o.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"N")))),(0,o.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,o.kt)("span",{parentName:"span",className:"base"},(0,o.kt)("span",{parentName:"span",className:"strut",style:{height:"0.6833em"}}),(0,o.kt)("span",{parentName:"span",className:"mord mathnormal",style:{marginRight:"0.10903em"}},"N")))))," unique consecutive characters.")),(0,o.kt)("h3",{id:"solution-5"},"Solution"),(0,o.kt)("p",null,"A lot of different approaches, knowing that we are dealing with input consisting\nsolely of ASCII letters, I bit the bullet and went with sliding window and\nconstructing sets from that window, checking if the set is as big as the window."),(0,o.kt)("p",null,"One possible optimization could consist of keeping a bit-vector (i.e. ",(0,o.kt)("inlineCode",{parentName:"p"},"usize"),"\nvariable) of encountered characters and updating it as we go. However this has\na different issue and that is removal of the characters from the left side of the\nwindow. We don't know if the same character is not included later on."),(0,o.kt)("p",null,"Other option is to do similar thing, but keeping the frequencies of the letters,\nand again knowing we have only ASCII letters we can optimize by having a vector\nof 26 elements that keeps count for each lowercase letter."),(0,o.kt)("h2",{id:"day-7-no-space-left-on-device"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/7"},"Day 7: No Space Left On Device")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Let's simulate ",(0,o.kt)("a",{parentName:"p",href:"https://www.man7.org/linux/man-pages/man1/du.1.html"},(0,o.kt)("inlineCode",{parentName:"a"},"du"))," to get some stats about our file system and then pinpoint\ndirectories that take a lot of space and should be deleted.")),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"I was waiting for this moment, and yet it got me!\n",(0,o.kt)("em",{parentName:"p"},"imagine me swearing for hours"))),(0,o.kt)("h3",{id:"solution-6"},"Solution"),(0,o.kt)("p",null,"We need to \u201c",(0,o.kt)("em",{parentName:"p"},"build"),"\u201d a file system from the input that is given in a following form:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"$ cd /\n$ ls\ndir a\n14848514 b.txt\n8504156 c.dat\ndir d\n$ cd a\n$ ls\ndir e\n29116 f\n2557 g\n62596 h.lst\n$ cd e\n$ ls\n584 i\n$ cd ..\n$ cd ..\n$ cd d\n$ ls\n4060174 j\n8033020 d.log\n5626152 d.ext\n7214296 k\n")),(0,o.kt)("p",null,"There are few ways in which you can achieve this and also you can assume some\npreconditions, but why would we do that, right? :)"),(0,o.kt)("p",null,"You can \u201cslap\u201d this in either ",(0,o.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/collections/struct.HashMap.html"},(0,o.kt)("inlineCode",{parentName:"a"},"HashMap"))," or ",(0,o.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/collections/struct.BTreeMap.html"},(0,o.kt)("inlineCode",{parentName:"a"},"BTreeMap"))," and call it a day.\nAnd that would be boring\u2026"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"BTreeMap")," is quite fitting for this, don't you think?")),(0,o.kt)("p",null,"I always wanted to try allocation on heap in Rust, so I chose to implement a tree.\nI fought with the ",(0,o.kt)("inlineCode",{parentName:"p"},"Box<T>")," for some time and was losing\u2026"),(0,o.kt)("p",null,"Then I looked up some implementations of trees or linked lists and decided to try\n",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<Cell<T>>"),". And I got my ",(0,o.kt)("em",{parentName:"p"},"ass whopped")," by the compiler once again. /o\\"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"Box<T>")," represents a dynamically allocated memory on heap. It is a single pointer,\nyou can imagine this as ",(0,o.kt)("inlineCode",{parentName:"p"},"std::unique_ptr<T>")," in C++."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"Rc<T>")," represents a dynamically allocated memory on heap. On top of that it is\n",(0,o.kt)("em",{parentName:"p"},"reference counted")," (that's what the ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc")," stands for). You can imagine this as\n",(0,o.kt)("inlineCode",{parentName:"p"},"std::shared_ptr<T>")," in C++."),(0,o.kt)("p",{parentName:"admonition"},"Now the fun stuff. Neither of them lets you ",(0,o.kt)("strong",{parentName:"p"},"mutate")," the contents of the memory."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"Cell<T>")," allows you to mutate the memory. Can be used reasonably with types that\ncan be copied, because the memory safety is guaranteed by copying the contents\nwhen there is more than one ",(0,o.kt)("strong",{parentName:"p"},"mutable")," reference to the memory."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"RefCell<T>")," is similar to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Cell<T>"),", but the borrowing rules (how many mutable\nreferences are present) are checked dynamically."),(0,o.kt)("p",{parentName:"admonition"},"So in the end, if you want something like ",(0,o.kt)("inlineCode",{parentName:"p"},"std::shared_ptr<T>")," in Rust, you want\nto have ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<RefCell<T>>"),".")),(0,o.kt)("p",null,"So, how are we going to represent the file system then? We will use an enumeration,\nhehe, which is an algebraic data type that can store some stuff in itself \ud83d\ude29"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"type FileHandle = Rc<RefCell<AocFile>>;\n\n#[derive(Debug)]\nenum AocFile {\n File(usize),\n Directory(BTreeMap<String, FileHandle>),\n}\n")),(0,o.kt)("p",null,"Let's go over it! ",(0,o.kt)("inlineCode",{parentName:"p"},"FileHandle")," represents dynamically allocated ",(0,o.kt)("inlineCode",{parentName:"p"},"AocFile"),", not\nmuch to discuss. What does the ",(0,o.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]")," do though? It lets us to print\nout the value of that enumeration, it's derived, so it's not as good as if we had\nimplemented it ourselves, but it's good enough for debugging, hence the name."),(0,o.kt)("p",null,"Now to the fun part! ",(0,o.kt)("inlineCode",{parentName:"p"},"AocFile")," value can be represented in two ways:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"File(usize)"),", e.g. ",(0,o.kt)("inlineCode",{parentName:"li"},"AocFile::File(123)")," and we can pattern match it, if we\nneed to"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Directory(BTreeMap<String, FileHandle>)")," will represent the directory and will\ncontain map matching the name of the files (or directories) within to their\nrespective file handles")),(0,o.kt)("p",null,"I will omit the details about constructing this file system, cause there are a lot\nof technicalities introduced by the nature of the input. However if you are\ninterested, you can have a look at my solution."),(0,o.kt)("p",null,"We need to find small enough directories and also find the smallest directory that\nwill free enough space. Now the question is, how could we do that. And there are\nmultiple ways I will describe."),(0,o.kt)("p",null,"I have chosen to implement ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Catamorphism#Tree_fold"},(0,o.kt)("em",{parentName:"a"},"tree catamorphism"))," \ud83d\ude29. It is basically a fold\nover a tree data structure. We descent down into the leaves and propagate computed\nresults all the way to the root. You can also notice that this approach is very\nsimilar to ",(0,o.kt)("em",{parentName:"p"},"dynamic programming"),", we find overlapping sections of the computation\nand try to minimize the additional work (in this case: we need to know sizes of\nour descendants, but we have already been there)."),(0,o.kt)("p",null,"Another approach that has been suggested to me few days later is running DFS on\nthe graph. And, funnily enough, we would still need to combine what we found in\nthe branches where we descent. So in the end, it would work very similarly to my\nsolution."),(0,o.kt)("p",null,"One of the more exotic options would be precomputing the required information at\nthe same time as parsing. That could be done by adding additional fields to the\nnodes which would allow storing such information and updating it as we construct\nthe file system."),(0,o.kt)("h2",{id:"post-mortem"},"Post Mortem"),(0,o.kt)("p",null,"Things that have been brought up in the discussion later on."),(0,o.kt)("h3",{id:"rct-vs-rcrefcellt"},(0,o.kt)("inlineCode",{parentName:"h3"},"Rc<T>")," vs ",(0,o.kt)("inlineCode",{parentName:"h3"},"Rc<RefCell<T>>")),(0,o.kt)("p",null,"It has been brought up that I have a contradicting statement regarding the\ndynamically allocated memory. Specifically:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"You can imagine ",(0,o.kt)("inlineCode",{parentName:"li"},"Rc<T>")," as an ",(0,o.kt)("inlineCode",{parentName:"li"},"std::shared_ptr<T>")," (in C++)"),(0,o.kt)("li",{parentName:"ul"},"When you want an equivalent of ",(0,o.kt)("inlineCode",{parentName:"li"},"std::shared_ptr<T>"),", you want to use\n",(0,o.kt)("inlineCode",{parentName:"li"},"Rc<RefCell<T>>"))),(0,o.kt)("p",null,"Now, in Rust it is a bit more complicated, because the type that represents the\n\u201cshared pointer\u201d is ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<T>"),". What ",(0,o.kt)("inlineCode",{parentName:"p"},"RefCell<T>")," does is making sure that there is\nonly one \u201cowner\u201d of a mutable reference at a time (and dynamically, as opposed\nto the ",(0,o.kt)("inlineCode",{parentName:"p"},"Cell<T>"),")."),(0,o.kt)("p",null,"Therefore to be precise and correct about the equivalents of ",(0,o.kt)("inlineCode",{parentName:"p"},"std::shared_ptr<T>"),"\nin Rust, we can say that"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"Rc<T>")," is an equivalent of a ",(0,o.kt)("inlineCode",{parentName:"li"},"const std::shared_ptr<T>"),","),(0,o.kt)("li",{parentName:"ul"},"and ",(0,o.kt)("inlineCode",{parentName:"li"},"Rc<RefCell<T>>")," is an equivalent of a ",(0,o.kt)("inlineCode",{parentName:"li"},"std::shared_ptr<T>"),".")),(0,o.kt)("p",null,"You can easily see that they only differ in the mutability. (And even that is not\nas simple as it seems, because there is also ",(0,o.kt)("inlineCode",{parentName:"p"},"Cell<T>"),")"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e25b3183.1c50e16b.js b/assets/js/e25b3183.1c50e16b.js new file mode 100644 index 0000000..347c500 --- /dev/null +++ b/assets/js/e25b3183.1c50e16b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6],{5934:i=>{i.exports=JSON.parse('{"label":"top-down-dp","permalink":"/ib002/tags/top-down-dp","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"recursion/pyramid-slide-down","title":"Introduction to dynamic programming","description":"Solving a problem in different ways.\\n","permalink":"/ib002/recursion/pyramid-slide-down"}]}')}}]); \ No newline at end of file diff --git a/assets/js/e89da83e.a63c019a.js b/assets/js/e89da83e.a63c019a.js new file mode 100644 index 0000000..02612b9 --- /dev/null +++ b/assets/js/e89da83e.a63c019a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8757],{7416:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/leetcode","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/eb7cc117.55f4bd7d.js b/assets/js/eb7cc117.55f4bd7d.js new file mode 100644 index 0000000..6b81567 --- /dev/null +++ b/assets/js/eb7cc117.55f4bd7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[143],{3635:e=>{e.exports=JSON.parse('{"label":"red-black trees","permalink":"/ib002/tags/red-black-trees","allTagsPath":"/ib002/tags","count":2,"items":[{"id":"rb-trees/rules","title":"On the rules of the red-black tree","description":"Shower thoughts on the rules of the red-black tree.\\n","permalink":"/ib002/rb-trees/rules"},{"id":"rb-trees/applications","title":"Pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f","description":"Uk\xe1zka pou\u017eit\xed \u010derveno-\u010dern\xfdch strom\u016f v standardn\xedch kni\u017enic\xedch zn\xe1m\xfdch jazyk\u016f.\\n","permalink":"/ib002/rb-trees/applications"}]}')}}]); \ No newline at end of file diff --git a/assets/js/edfd2a45.1bede75c.js b/assets/js/edfd2a45.1bede75c.js new file mode 100644 index 0000000..9f23acf --- /dev/null +++ b/assets/js/edfd2a45.1bede75c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[7248],{1955:e=>{e.exports=JSON.parse('{"label":"karel","permalink":"/ib002/tags/karel","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"recursion/karel-1","title":"Recursion and backtracking with Robot Karel","description":"A problem with too many restrictions.\\n","permalink":"/ib002/recursion/karel-1"}]}')}}]); \ No newline at end of file diff --git a/assets/js/f48be158.eaa96907.js b/assets/js/f48be158.eaa96907.js new file mode 100644 index 0000000..cc4fa37 --- /dev/null +++ b/assets/js/f48be158.eaa96907.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[4064],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>c});var a=n(7294);function o(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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),u=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=u(n),h=o,c=d["".concat(s,".").concat(h)]||d[h]||m[h]||i;return n?a.createElement(c,r(r({ref:t},p),{},{components:n})):a.createElement(c,r({ref:t},p))}));function c(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:o,r[1]=l;for(var u=2;u<i;u++)r[u]=n[u];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}h.displayName="MDXCreateElement"},9859:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(7462),o=(n(7294),n(3905));const i={title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},r=void 0,l={permalink:"/blog/aoc-2022/3rd-week",editUrl:"https://gitlab.com/mfocko/blog/tree/main/blog/aoc-2022/03-week-3.md",source:"@site/blog/aoc-2022/03-week-3.md",title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00:00.000Z",formattedDate:"July 6, 2023",tags:[{label:"advent-of-code",permalink:"/blog/tags/advent-of-code"},{label:"advent-of-code-2022",permalink:"/blog/tags/advent-of-code-2022"},{label:"rust",permalink:"/blog/tags/rust"}],readingTime:11.565,hasTruncateMarker:!0,authors:[{name:"Matej Focko",email:"me+blog@mfocko.xyz",title:"a.k.a. @mf",url:"https://gitlab.com/mfocko",imageURL:"https://github.com/mfocko.png",key:"mf"}],frontMatter:{title:"3rd week of Advent of Code '22 in Rust",description:"Surviving third week in Rust.",date:"2023-07-06T21:00",slug:"aoc-2022/3rd-week",authors:"mf",tags:["advent-of-code","advent-of-code-2022","rust"],hide_table_of_contents:!1},prevItem:{title:"4th week of Advent of Code '22 in Rust",permalink:"/blog/aoc-2022/4th-week"},nextItem:{title:"Sort the matrix diagonally",permalink:"/blog/leetcode/sort-diagonally"}},s={authorsImageUrls:[void 0]},u=[{value:"Day 15: Beacon Exclusion Zone",id:"day-15-beacon-exclusion-zone",level:2},{value:"Solution",id:"solution",level:3},{value:"Day 16: Proboscidea Volcanium",id:"day-16-proboscidea-volcanium",level:2},{value:"Solution",id:"solution-1",level:3},{value:"Indexing in graph",id:"indexing-in-graph",level:4},{value:"Cartesian product",id:"cartesian-product",level:4},{value:"\u201cImplementing\u201d an iterator",id:"implementing-an-iterator",level:4},{value:"Day 17: Pyroclastic Flow",id:"day-17-pyroclastic-flow",level:2},{value:"Solution",id:"solution-2",level:3},{value:"Collision detection",id:"collision-detection",level:4},{value:"Infinite iterator",id:"infinite-iterator",level:4},{value:"Day 18: Boiling Boulders",id:"day-18-boiling-boulders",level:2},{value:"Solution",id:"solution-3",level:3},{value:"Day 19: Not Enough Minerals",id:"day-19-not-enough-minerals",level:2},{value:"Solution",id:"solution-4",level:3},{value:"Day 20: Grove Positioning System",id:"day-20-grove-positioning-system",level:2},{value:"Solution",id:"solution-5",level:3},{value:"<code>.borrow_mut()</code>",id:"borrow_mut",level:4},{value:"<code>.borrow_mut()</code> on <code>Rc<RefCell<T>></code>",id:"borrow_mut-on-rcrefcellt",level:5},{value:"<code>BorrowMut</code> trait",id:"borrowmut-trait",level:5},{value:"Conflict",id:"conflict",level:5},{value:"Day 21: Monkey Math",id:"day-21-monkey-math",level:2},{value:"Solution",id:"solution-6",level:3},{value:"<code>Default</code> trait",id:"default-trait",level:4},{value:"Abusing negation",id:"abusing-negation",level:4}],p={toc:u},d="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Let's go through the third week of ",(0,o.kt)("a",{parentName:"p",href:"https://adventofcode.com"},(0,o.kt)("em",{parentName:"a"},"Advent of Code"))," in Rust."),(0,o.kt)("h2",{id:"day-15-beacon-exclusion-zone"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/15"},"Day 15: Beacon Exclusion Zone")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Triangulating a distress beacon based on the information from the sensors.")),(0,o.kt)("h3",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Relatively easy thing to implement, no major Rust issues hit."),(0,o.kt)("h2",{id:"day-16-proboscidea-volcanium"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/16"},"Day 16: Proboscidea Volcanium")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Finding a max flow in a graph given some time constraints.")),(0,o.kt)("h3",{id:"solution-1"},"Solution"),(0,o.kt)("p",null,"I have used some interesting things to implement this and make it easier for me."),(0,o.kt)("h4",{id:"indexing-in-graph"},"Indexing in graph"),(0,o.kt)("p",null,"I have come across a situation where I needed to keep more information regarding\nthe graph\u2026 In that case you can, of course, create a structure and keep it in,\nbut once you have multiple members in the structure it gets harder to work with\nsince you need to address the fields in the structure. When you work with graph,\nyou frequently need to access the vertices and in this case it felt a lot easier\nto implement the indexing in a graph, rather than explicitly access the\nunderlying data structure."),(0,o.kt)("p",null,"Here you can see a rather short snippet from the solution that allows you to\n\u201cindex\u201d the graph:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"impl Index<&str> for Graph {\n type Output = Vertex;\n\n fn index(&self, index: &str) -> &Self::Output {\n &self.g[index]\n }\n}\n")),(0,o.kt)("h4",{id:"cartesian-product"},"Cartesian product"),(0,o.kt)("p",null,"During the implementation I had to utilize Floyd-Warshall algorithm for finding\nthe shortest path between pairs of vertices and utilized the ",(0,o.kt)("inlineCode",{parentName:"p"},"iproduct!")," macro\nfrom the ",(0,o.kt)("a",{parentName:"p",href:"https://crates.io/crates/itertools"},(0,o.kt)("inlineCode",{parentName:"a"},"itertools")),". It is a very useful higher-order function that allows\nyou to keep the nesting of the loops at a minimum level while still maintaining\nthe same functionality."),(0,o.kt)("h4",{id:"implementing-an-iterator"},"\u201cImplementing\u201d an iterator"),(0,o.kt)("p",null,"For the second part, you get to split the work between 2 actors. That way you\ncan achieve higher efficiency of the whole process that you're planning, but it\nalso makes it harder to evaluate algorithmically, since you need to check the\ndifferent ways the work can be split."),(0,o.kt)("p",null,"Being affected by ",(0,o.kt)("em",{parentName:"p"},"functional programming brain damage"),"\u2122\ufe0f, I have chosen to\ndo this part by function that returns an iterator over the possible ways:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"fn pairings(\n valves: &BTreeSet<String>,\n) -> impl Iterator<Item = (BTreeSet<String>, BTreeSet<String>)> + '_ {\n let mapping = valves.iter().collect_vec();\n\n let max_mask = 1 << (valves.len() - 1);\n\n (0..max_mask).map(move |mask| {\n let mut elephant = BTreeSet::new();\n let mut human = BTreeSet::new();\n\n for (i, &v) in mapping.iter().enumerate() {\n if (mask & (1 << i)) == 0 {\n human.insert(v.clone());\n } else {\n elephant.insert(v.clone());\n }\n }\n\n (human, elephant)\n })\n}\n")),(0,o.kt)("h2",{id:"day-17-pyroclastic-flow"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/17"},"Day 17: Pyroclastic Flow")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Simulating an autonomous Tetris where pieces get affected by a series of jets of\nhot gas.")),(0,o.kt)("h3",{id:"solution-2"},"Solution"),(0,o.kt)("p",null,"Similarly to the previous day I have created some iterators \ud83d\ude04"),(0,o.kt)("h4",{id:"collision-detection"},"Collision detection"),(0,o.kt)("p",null,"Once you need to check for collisions it is very helpful to be able to just\niterate through the positions that can actually collide with the wall or other\npiece."),(0,o.kt)("p",null,"To get the desired behaviour, you can just compose few smaller functions:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"fn occupied(shape: &[Vec<char>]) -> impl Iterator<Item = Position> + '_ {\n shape.iter().enumerate().flat_map(|(y, row)| {\n row.iter().enumerate().filter_map(move |(x, c)| {\n if c == &'#' {\n Some(Vector2D::new(x as isize, y as isize))\n } else {\n None\n }\n })\n })\n}\n")),(0,o.kt)("p",null,"In the end, we get relative positions which we can adjust later when given the\nspecific positions from iterator. You can see some interesting parts in this:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},".enumerate()")," allows us to get both the indices (coordinates) and the line\nor, later on, the character itself,"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},".flat_map()")," flattens the iterator, i.e. when we return another iterator,\nthey just get chained instead of iterating over iterators (which sounds pretty\ndisturbing, doesn't it?),"),(0,o.kt)("li",{parentName:"ul"},"and finally ",(0,o.kt)("inlineCode",{parentName:"li"},".filter_map()")," which is pretty similar to the \u201cbasic\u201d ",(0,o.kt)("inlineCode",{parentName:"li"},".map()"),"\nwith a one, key, difference that it expects the items of an iterator to be\nmapped to an ",(0,o.kt)("inlineCode",{parentName:"li"},"Option<T>")," from which it ignores nothing (as in ",(0,o.kt)("inlineCode",{parentName:"li"},"None")," \ud83d\ude09)\nand also unwraps the values from ",(0,o.kt)("inlineCode",{parentName:"li"},"Some(\u2026)"),".")),(0,o.kt)("h4",{id:"infinite-iterator"},"Infinite iterator"),(0,o.kt)("p",null,"In the solution we cycle through both Tetris-like shapes that fall down and the\njets that move our pieces around. Initially I have implemented my own infinite\niterator that just yields the indices. It is a very simple, yet powerful, piece\nof code:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"struct InfiniteIndex {\n size: usize,\n i: usize,\n}\n\nimpl InfiniteIndex {\n fn new(size: usize) -> InfiniteIndex {\n InfiniteIndex { size, i: size - 1 }\n }\n}\n\nimpl Iterator for InfiniteIndex {\n type Item = usize;\n\n fn next(&mut self) -> Option<Self::Item> {\n self.i = (self.i + 1) % self.size;\n Some(self.i)\n }\n}\n")),(0,o.kt)("p",null,"However when I'm looking at the code now, it doesn't really make much sense\u2026\nGuess what, we can use a built-in function that is implemented on iterators for\nthat! The function is called ",(0,o.kt)("inlineCode",{parentName:"p"},".cycle()")),(0,o.kt)("p",null,"On the other hand, I am not going to switch to that function, since it would\nintroduce an another myriad of issues caused by the fact that I create iterators\nright away in the constructor of my structure and the iterators would borrow\nboth the jets and shapes which would introduce a lifetime dependency into the\nstructure."),(0,o.kt)("h2",{id:"day-18-boiling-boulders"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/18"},"Day 18: Boiling Boulders")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Let's compute a surface area of some obsidian approximated via coordinates of\ncubes.")),(0,o.kt)("h3",{id:"solution-3"},"Solution"),(0,o.kt)("p",null,"This day is kinda interesting, because it shows how easily you can complicate the\nproblem and also how much can you screw yourself over with the optimization and\n\u201csmart\u201d approach."),(0,o.kt)("p",null,"For the first part you need to find the surface area of an obsidian that is\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\nof already added cubes, and check if the newly added cube touches any face of any\nother cube. Simple, and with a ",(0,o.kt)("inlineCode",{parentName:"p"},"BTreeSet")," relatively efficient way to do it."),(0,o.kt)("p",null,"However the second part lets you on a secret that there may be some surface area\nfrom the \u201cinside\u201d too and you want to know only the one from the outside of the\nobsidian. I have seen some solutions later, but if you check your data, you might\nnotice that the bounding box of all the cubes isn't that big at all. Therefore I\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\nBFS turning all the lava on the outside into the air. Now you just need to check\ncubes and count how many of their faces touch the air."),(0,o.kt)("h2",{id:"day-19-not-enough-minerals"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/19"},"Day 19: Not Enough Minerals")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Finding out the best strategy for building robots to collect geodes.")),(0,o.kt)("h3",{id:"solution-4"},"Solution"),(0,o.kt)("p",null,"Not much interesting stuff to mention apart from the suggestion to never believe\nthat the default implementation given by ",(0,o.kt)("inlineCode",{parentName:"p"},"derive")," macro is what you want, it\ndoesn't have to be. \ud83d\ude04"),(0,o.kt)("h2",{id:"day-20-grove-positioning-system"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/20"},"Day 20: Grove Positioning System")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Shuffling around the ",(0,o.kt)("em",{parentName:"p"},"circular linked list")," to find the coordinates.")),(0,o.kt)("p",null,"Now, small rant for this day is in place. They've never mentioned that coordinates\ncan repeat and therefore the values are non-unique. This is something that did\nnot happen in the given sample, but was present in the user input. It took \xbba lot\xab\nto realize that this is the issue."),(0,o.kt)("h3",{id:"solution-5"},"Solution"),(0,o.kt)("p",null,"I have tried implementing a circular linked list for this\u2026 and I have failed\nmiserably. To be fair, I still have no clue why. It was \u201cfun\u201d to play around with\nthe ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<RefCell<T>>"),". In the end I failed on ",(0,o.kt)("em",{parentName:"p"},"wrong answer"),". I have also encountered\na rather interesting issue with ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," method being used on ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<RefCell<T>>"),"."),(0,o.kt)("h4",{id:"borrow_mut"},(0,o.kt)("inlineCode",{parentName:"h4"},".borrow_mut()")),(0,o.kt)("p",null,"Consider the following snippet of the code (taken from the documentation):"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},'use std::cell::{RefCell, RefMut};\nuse std::collections::HashMap;\nuse std::rc::Rc;\n// use std::borrow::BorrowMut;\n\nfn main() {\n let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));\n // Create a new block to limit the scope of the dynamic borrow\n {\n let mut map: RefMut<_> = shared_map.borrow_mut();\n map.insert("africa", 92388);\n map.insert("kyoto", 11837);\n map.insert("piccadilly", 11826);\n map.insert("marbles", 38);\n }\n\n // Note that if we had not let the previous borrow of the cache fall out\n // of scope then the subsequent borrow would cause a dynamic thread panic.\n // This is the major hazard of using `RefCell`.\n let total: i32 = shared_map.borrow().values().sum();\n println!("{total}");\n}\n')),(0,o.kt)("p",null,"We allocate a hash map on the heap and then in the inner block, we borrow it as\na mutable reference, so that we can use it."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"It is a very primitive example for ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<RefCell<T>>")," and mutable borrow.")),(0,o.kt)("p",null,"If you uncomment the 4th line with ",(0,o.kt)("inlineCode",{parentName:"p"},"use std::borrow::BorrowMut;"),", you cannot\ncompile the code anymore, because of"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"}," Compiling playground v0.0.1 (/playground)\nerror[E0308]: mismatched types\n --\x3e src/main.rs:10:34\n |\n10 | let mut map: RefMut<_> = shared_map.borrow_mut();\n | --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference\n | |\n | expected due to this\n |\n = note: expected struct `RefMut<'_, _>`\n found mutable reference `&mut Rc<RefCell<HashMap<_, _>>>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:11:13\n |\n11 | map.insert(\"africa\", 92388);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:12:13\n |\n12 | map.insert(\"kyoto\", 11837);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:13:13\n |\n13 | map.insert(\"piccadilly\", 11826);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nerror[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope\n --\x3e src/main.rs:14:13\n |\n14 | map.insert(\"marbles\", 38);\n | ^^^^^^ method not found in `RefMut<'_, _>`\n\nSome errors have detailed explanations: E0308, E0599.\nFor more information about an error, try `rustc --explain E0308`.\nerror: could not compile `playground` due to 5 previous errors\n")),(0,o.kt)("p",null,"It might seem ",(0,o.kt)("strong",{parentName:"p"},"a bit")," ridiculous. However, I got to a point where the compiler\nsuggested ",(0,o.kt)("inlineCode",{parentName:"p"},"use std::borrow::BorrowMut;")," and it resulted in breaking parts of the\ncode that worked previously. I think it may be a good idea to go over what is\nhappening here."),(0,o.kt)("h5",{id:"borrow_mut-on-rcrefcellt"},(0,o.kt)("inlineCode",{parentName:"h5"},".borrow_mut()")," on ",(0,o.kt)("inlineCode",{parentName:"h5"},"Rc<RefCell<T>>")),(0,o.kt)("p",null,"Let's consider a variable ",(0,o.kt)("inlineCode",{parentName:"p"},"x")," of type ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<RefCell<T>>"),". What happens when you\ncall ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," on it? We can look at the ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc")," type, and\u2026 hang on! There is\nneither ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," method or ",(0,o.kt)("inlineCode",{parentName:"p"},"BorrowMut")," trait implemented. How can we do it\nthen?"),(0,o.kt)("p",null,"Let's go further and we can see that ",(0,o.kt)("inlineCode",{parentName:"p"},"RefCell<T>")," implements a ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()"),"\nmethod. OK, but how can we call it on the ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<T>"),"? Easily! ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<T>")," implements\n",(0,o.kt)("inlineCode",{parentName:"p"},"Deref<T>")," and therefore you can call methods on ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<T>")," objects as if they were\n",(0,o.kt)("inlineCode",{parentName:"p"},"T")," objects. If we read on ",(0,o.kt)("em",{parentName:"p"},(0,o.kt)("inlineCode",{parentName:"em"},"Deref")," coercion"),", we can see the following:"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"If ",(0,o.kt)("inlineCode",{parentName:"p"},"T")," implements ",(0,o.kt)("inlineCode",{parentName:"p"},"Deref<Target = U>"),", \u2026:"),(0,o.kt)("ul",{parentName:"blockquote"},(0,o.kt)("li",{parentName:"ul"},"\u2026"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"T")," implicitly implements all the (immutable) methods of the type ",(0,o.kt)("inlineCode",{parentName:"li"},"U"),"."))),(0,o.kt)("p",null,"What is the requirement for the ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," on ",(0,o.kt)("inlineCode",{parentName:"p"},"RefCell<T>"),"? Well, it needs\n",(0,o.kt)("inlineCode",{parentName:"p"},"&self"),", so the ",(0,o.kt)("inlineCode",{parentName:"p"},"Deref")," implements the ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," for the ",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<RefCell<T>>"),"."),(0,o.kt)("h5",{id:"borrowmut-trait"},(0,o.kt)("inlineCode",{parentName:"h5"},"BorrowMut")," trait"),(0,o.kt)("p",null,"I have not been able to find a lot on this trait. My guess is that it provides a\nmethod instead of a syntactic sugar (",(0,o.kt)("inlineCode",{parentName:"p"},"&mut x"),") for the mutable borrow. And also\nit provides default implementations for the types:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"impl BorrowMut<str> for String\n\nimpl<T> BorrowMut<T> for &mut T\nwhere\n T: ?Sized,\n\nimpl<T> BorrowMut<T> for T\nwhere\n T: ?Sized,\n\nimpl<T, A> BorrowMut<[T]> for Vec<T, A>\nwhere\n A: Allocator,\n\nimpl<T, A> BorrowMut<T> for Box<T, A>\nwhere\n A: Allocator,\n T: ?Sized,\n\nimpl<T, const N: usize> BorrowMut<[T]> for [T; N]\n")),(0,o.kt)("h5",{id:"conflict"},"Conflict"),(0,o.kt)("p",null,"Now the question is why did it break the code\u2026 My first take was that the type\n",(0,o.kt)("inlineCode",{parentName:"p"},"Rc<RefCell<T>>")," has some ",(0,o.kt)("em",{parentName:"p"},"specialized")," implementation of the ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," and\nthe ",(0,o.kt)("inlineCode",{parentName:"p"},"use")," overrides it with the default, which is true ",(0,o.kt)("strong",{parentName:"p"},"in a sense"),". However\nthere is no ",(0,o.kt)("em",{parentName:"p"},"specialized")," implementation. Let's have a look at the trait and the\ntype signature on the ",(0,o.kt)("inlineCode",{parentName:"p"},"RefCell<T>"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"// trait\npub trait BorrowMut<Borrowed>: Borrow<Borrowed>\nwhere\n Borrowed: ?Sized,\n{\n fn borrow_mut(&mut self) -> &mut Borrowed;\n}\n\n// \u2039RefCell<T>.borrow_mut()\u203a type signature\npub fn borrow_mut(&self) -> RefMut<'_, T>\n")),(0,o.kt)("p",null,"I think that we can definitely agree on the fact that ",(0,o.kt)("inlineCode",{parentName:"p"},"RefMut<'_, T>")," is not the\n",(0,o.kt)("inlineCode",{parentName:"p"},"RefCell<T>"),"."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"In my opinion"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"RefCell<T>")," implements a ",(0,o.kt)("strong",{parentName:"p"},"separate")," ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," rather\nthan implementing the interface, because it ",(0,o.kt)("strong",{parentName:"p"},"cannot")," satisfy the type requirements\nof the trait."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"I wonder how are we expected to deal with this conflict, if and when, we need\nboth the ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," of the trait and ",(0,o.kt)("inlineCode",{parentName:"p"},".borrow_mut()")," of the ",(0,o.kt)("inlineCode",{parentName:"p"},"RefCell<T>"),".")),(0,o.kt)("admonition",{title:"Fun fact",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"I was suggested by the compiler to do ",(0,o.kt)("inlineCode",{parentName:"p"},"use std::borrow::BorrowMut;")," and break the\ncode."),(0,o.kt)("p",{parentName:"admonition"},"So much for the ",(0,o.kt)("em",{parentName:"p"},"almighty")," and ",(0,o.kt)("em",{parentName:"p"},"helpful")," compiler\u2026")),(0,o.kt)("h2",{id:"day-21-monkey-math"},(0,o.kt)("a",{parentName:"h2",href:"https://adventofcode.com/2022/day/21"},"Day 21: Monkey Math")),(0,o.kt)("admonition",{title:"tl;dr",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Computing an expression tree and then also finding ideal value for a node.")),(0,o.kt)("h3",{id:"solution-6"},"Solution"),(0,o.kt)("p",null,"Relatively simple, until you get to the 2nd part where you start to practice\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\nthough :) Let's go through the details."),(0,o.kt)("h4",{id:"default-trait"},(0,o.kt)("inlineCode",{parentName:"h4"},"Default")," trait"),(0,o.kt)("p",null,"For the first time and twice I had a need to have a default value for my types,\nenumerations in this case. Rust offers a very nice trait",(0,o.kt)("sup",{parentName:"p",id:"fnref-1-990909"},(0,o.kt)("a",{parentName:"sup",href:"#fn-1-990909",className:"footnote-ref"},"1"))," that is described\nas:"),(0,o.kt)("blockquote",null,(0,o.kt)("p",{parentName:"blockquote"},"A trait for giving a type a useful default value.")),(0,o.kt)("p",null,"I guess it sums it up nicely. The more interesting part about this is the fact\nthat you can use the ",(0,o.kt)("em",{parentName:"p"},"macro machinery")," to save yourself some typing. If you have\nenumeration of which the default value doesn't bear any parameter, you can just\ndo",(0,o.kt)("sup",{parentName:"p",id:"fnref-2-990909"},(0,o.kt)("a",{parentName:"sup",href:"#fn-2-990909",className:"footnote-ref"},"2")),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(Default)]\nenum Color {\n #[default]\n White,\n Gray,\n Black,\n}\n")),(0,o.kt)("h4",{id:"abusing-negation"},"Abusing negation"),(0,o.kt)("p",null,"If you want to use a ",(0,o.kt)("em",{parentName:"p"},"unary minus")," operator on your own type, you can implement\na ",(0,o.kt)("inlineCode",{parentName:"p"},"Neg")," trait",(0,o.kt)("sup",{parentName:"p",id:"fnref-3-990909"},(0,o.kt)("a",{parentName:"sup",href:"#fn-3-990909",className:"footnote-ref"},"3")),". I was dealing with a binary tree and needed a way how to look\nat the other side, so I have just implemented the negation for flipping between\nleft and right \ud83d\ude04"),(0,o.kt)("div",{className:"footnotes"},(0,o.kt)("hr",{parentName:"div"}),(0,o.kt)("ol",{parentName:"div"},(0,o.kt)("li",{parentName:"ol",id:"fn-1-990909"},(0,o.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/default/trait.Default.html"},(0,o.kt)("inlineCode",{parentName:"a"},"Default"))," docs",(0,o.kt)("a",{parentName:"li",href:"#fnref-1-990909",className:"footnote-backref"},"\u21a9")),(0,o.kt)("li",{parentName:"ol",id:"fn-2-990909"},"Pardon my example from the graph algorithms ;)",(0,o.kt)("a",{parentName:"li",href:"#fnref-2-990909",className:"footnote-backref"},"\u21a9")),(0,o.kt)("li",{parentName:"ol",id:"fn-3-990909"},(0,o.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.Neg.html"},(0,o.kt)("inlineCode",{parentName:"a"},"Neg"))," docs",(0,o.kt)("a",{parentName:"li",href:"#fnref-3-990909",className:"footnote-backref"},"\u21a9")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f533ef4a.13c50ab8.js b/assets/js/f533ef4a.13c50ab8.js new file mode 100644 index 0000000..1cc3c85 --- /dev/null +++ b/assets/js/f533ef4a.13c50ab8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[2160],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var r=n(7294);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(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),m=a,h=u["".concat(s,".").concat(m)]||u[m]||d[m]||i;return n?r.createElement(h,o(o({ref:t},c),{},{components:n})):r.createElement(h,o({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,o[1]=l;for(var p=2;p<i;p++)o[p]=n[p];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},6489:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const i={id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},o=void 0,l={unversionedId:"bonuses/seminar-05-06",id:"bonuses/seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n",source:"@site/pb071/bonuses/05-06.md",sourceDirName:"bonuses",slug:"/bonuses/seminar-05-06",permalink:"/pb071/bonuses/seminar-05-06",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/bonuses/05-06.md",tags:[],version:"current",lastUpdatedAt:1694108971,formattedLastUpdatedAt:"Sep 7, 2023",frontMatter:{id:"seminar-05-06",title:"5th and 6th seminar",description:"200IQ encryption.\n"},sidebar:"autogeneratedBar",previous:{title:"4th seminar",permalink:"/pb071/bonuses/seminar-04"},next:{title:"8th seminar",permalink:"/pb071/bonuses/seminar-08"}},s={},p=[{value:"Introduction",id:"introduction",level:2},{value:"Task no. 1: Reverse (0.5 K\u20a1)",id:"task-no-1-reverse-05-k",level:3},{value:"Task no. 2: Vigen\xe8re (0.5 K\u20a1)",id:"task-no-2-vigen\xe8re-05-k",level:3},{value:"Bonus part (0.5 K\u20a1)",id:"bonus-part-05-k",level:4},{value:"Task no. 3: Bit madness (0.5 K\u20a1)",id:"task-no-3-bit-madness-05-k",level:3},{value:"Task no. 4: All combined to BMP (0.5 K\u20a1)",id:"task-no-4-all-combined-to-bmp-05-k",level:3},{value:"Submitting",id:"submitting",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"For this bonus you can get at maximum 2.5 K\u20a1."),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"pathname:///files/pb071/bonuses/05-06.tar.gz"},"Source")),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"In this bonus you will implement few functions that will be used together for\nimplementing a very special cipher."),(0,a.kt)("h3",{id:"task-no-1-reverse-05-k"},"Task no. 1: Reverse (0.5 K\u20a1)"),(0,a.kt)("p",null,"Write a function ",(0,a.kt)("inlineCode",{parentName:"p"},"char* reverse(const char* text)")," that returns copy of the input\nstring in reversed order (also uppercase)."),(0,a.kt)("p",null,"In case you are given ",(0,a.kt)("inlineCode",{parentName:"p"},"NULL"),", return ",(0,a.kt)("inlineCode",{parentName:"p"},"NULL"),"."),(0,a.kt)("p",null,"Example (more in tests):"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-c"},'char* reversed = reverse("Hello world!");\n\nprintf("%s\\n", reversed);\n// "!DLROW OLLEH"\n\nif (reversed != NULL) {\n free(reversed);\n}\n')),(0,a.kt)("h3",{id:"task-no-2-vigen\xe8re-05-k"},"Task no. 2: Vigen\xe8re (0.5 K\u20a1)"),(0,a.kt)("p",null,"Vigen\xe8re cipher is similar to the Caesar cipher, but you also have a key that is\nused for encrypting (or decrypting)."),(0,a.kt)("p",null,"Your task is to write two functions:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"char* vigenere_encrypt(const char* key, const char* text)")," for encrypting"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"char* vigenere_decrypt(const char* key, const char* text)")," for decrypting")),(0,a.kt)("p",null,"In both of those you should return uppercase characters."),(0,a.kt)("p",null,"Meaning of the parameters you are given:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"key")," - String that represents key that is used for ","*","crypting. It consists of\none word and can have only characters of the alphabet. Does not matter if they\nare uppercase or lowercase."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"text")," - String that is to be ","*","crypted.")),(0,a.kt)("p",null,"Function returns address of the encrypted (or decrypted) string. Or ",(0,a.kt)("inlineCode",{parentName:"p"},"NULL")," in case\nerror occurs."),(0,a.kt)("p",null,"Example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-c"},'char *encrypted = vigenere_encrypt("CoMPuTeR", "Hello world!");\n\nprintf("%s\\n", encrypted);\n// "JSXAI PSINR!"\n\nif (encrypted != NULL) {\n free(encrypted)\n}\n')),(0,a.kt)("h4",{id:"bonus-part-05-k"},"Bonus part (0.5 K\u20a1)"),(0,a.kt)("p",null,"If you can utilize helper function that would do both encrypting and decrypting,\nyou can gain 0.5 K\u20a1."),(0,a.kt)("p",null,"Usage of ",(0,a.kt)("inlineCode",{parentName:"p"},"true"),"/",(0,a.kt)("inlineCode",{parentName:"p"},"false")," to decide path in code is prohibited. It leads to merging\nof both functions into one. Point of this part is to discover a way to do this\ngenerically in such way that there are no separate paths for one or the other. One\nfunction with no branching for both of them, parametrization is your friend :)"),(0,a.kt)("h3",{id:"task-no-3-bit-madness-05-k"},"Task no. 3: Bit madness (0.5 K\u20a1)"),(0,a.kt)("p",null,"This is a state of the art crypto. Please do not share :)"),(0,a.kt)("p",null,"For encrypting:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Split the character that is to be encrypted in halves (4 and 4 bits each)."),(0,a.kt)("li",{parentName:"ol"},"Bits in 1st half are to be split into pairs. Swap bits in those pairs."),(0,a.kt)("li",{parentName:"ol"},"Then use the 4 bits that you created in the 2nd step for ",(0,a.kt)("inlineCode",{parentName:"li"},"XOR")," with the other\n4 bits.")),(0,a.kt)("p",null,"This simple and ingenious principle will be illustrated on the following example.\nString we want to encrypt is ",(0,a.kt)("inlineCode",{parentName:"p"},"Hello world!"),". We need to encrypt each letter separately,\nso we will demonstrate on letter ",(0,a.kt)("inlineCode",{parentName:"p"},"H"),":"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Letter ",(0,a.kt)("inlineCode",{parentName:"p"},"H")," is represented in ASCII as ",(0,a.kt)("inlineCode",{parentName:"p"},"72"),"."),(0,a.kt)("p",{parentName:"li"},(0,a.kt)("inlineCode",{parentName:"p"},"72")," represented in binary is: ",(0,a.kt)("inlineCode",{parentName:"p"},"01001000"),". So first 4 bits are: ",(0,a.kt)("inlineCode",{parentName:"p"},"0100")," and last\n4 bits are ",(0,a.kt)("inlineCode",{parentName:"p"},"1000"),".")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"First half of bits (",(0,a.kt)("inlineCode",{parentName:"p"},"0100"),") consists of 2 pairs (",(0,a.kt)("inlineCode",{parentName:"p"},"01")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"00"),") which we swap\n(",(0,a.kt)("inlineCode",{parentName:"p"},"01 ~> 10")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"00 ~> 00"),"). That way we get ",(0,a.kt)("inlineCode",{parentName:"p"},"1000"),".")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"That half is used for xor with the other 4 bits:"),(0,a.kt)("pre",{parentName:"li"},(0,a.kt)("code",{parentName:"pre"}," 1000 // second half\nXOR 1000 // first half after 2nd step\n--------\n 0000\n"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Now we combine both halves (first one is ",(0,a.kt)("inlineCode",{parentName:"p"},"1000"),", which we got from the 2nd step\nand second one is ",(0,a.kt)("inlineCode",{parentName:"p"},"0000"),", which we got from the 3rd step) and get ",(0,a.kt)("inlineCode",{parentName:"p"},"10000000"),",\nwhich is encrypted character ",(0,a.kt)("inlineCode",{parentName:"p"},"H")," using this method."))),(0,a.kt)("p",null,"In case of decryption, reverse those steps."),(0,a.kt)("p",null,"Your task is to implement functions:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"unsigned char* bit_encrypt(const char* text)")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"char* bit_decrypt(const unsigned char* text)"))),(0,a.kt)("p",null,"Example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-c"},'unsigned char* encrypted = bit_encrypt("Hello world!");\n\nfor (int i = 0; i < 12;i++) {\n printf("%x ", encrypted[i]);\n //80 9c 95 95 96 11 bc 96 b9 95 9d 10\n}\n\nif (encrypted != NULL) {\n free(encrypted);\n}\n')),(0,a.kt)("h3",{id:"task-no-4-all-combined-to-bmp-05-k"},"Task no. 4: All combined to BMP (0.5 K\u20a1)"),(0,a.kt)("p",null,"Authors of the BMP cipher are non-disclosed :)"),(0,a.kt)("p",null,"Create pair of functions:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"unsigned char* bmp_encrypt(const char* key, const char* text)")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"char* bmp_decrypt(const char* key, const unsigned char* text)"))),(0,a.kt)("p",null,"BMP cipher consists of following steps for encrypting:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Reverse the input string"),(0,a.kt)("li",{parentName:"ol"},"Use Vigenere on the string you got from step #1"),(0,a.kt)("li",{parentName:"ol"},"Use bit madness on the string you got from step #2")),(0,a.kt)("p",null,"For decrypting, reverse the steps."),(0,a.kt)("h2",{id:"submitting"},"Submitting"),(0,a.kt)("p",null,"In case you have any questions, feel free to reach out to me."),(0,a.kt)("hr",null),(0,a.kt)("p",null,"Ideally submit the assignment through the merge request. Step-by-step tutorial is\npresent ",(0,a.kt)("a",{parentName:"p",href:"../mr"},"here"),". For setting assignee my xlogin is ",(0,a.kt)("inlineCode",{parentName:"p"},"xfocko"),"."),(0,a.kt)("p",null,"In case you do not want to experiment on GitLab, send me the source code via email,\nbut please prefix subject with: ",(0,a.kt)("inlineCode",{parentName:"p"},"[PB071/14][seminar-05-06]")),(0,a.kt)("p",null,"Deadline for the submission of the bonus is ",(0,a.kt)("strong",{parentName:"p"},"April 21th 24:00"),"."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f60c832f.d6dc7ae0.js b/assets/js/f60c832f.d6dc7ae0.js new file mode 100644 index 0000000..b92731e --- /dev/null +++ b/assets/js/f60c832f.d6dc7ae0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[9611],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function m(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),l=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,p=m(e,["components","mdxType","originalType","parentName"]),u=l(a),d=r,h=u["".concat(s,".").concat(d)]||u[d]||c[d]||i;return a?n.createElement(h,o(o({ref:t},p),{},{components:a})):n.createElement(h,o({ref:t},p))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=d;var m={};for(var s in t)hasOwnProperty.call(t,s)&&(m[s]=t[s]);m.originalType=e,m[u]="string"==typeof e?e:r,o[1]=m;for(var l=2;l<i;l++)o[l]=a[l];return n.createElement.apply(null,o)}return n.createElement.apply(null,a)}d.displayName="MDXCreateElement"},2490:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>m,toc:()=>l});var n=a(7462),r=(a(7294),a(3905));const i={slug:"garbage_collect",title:"Practice exam B",description:"Garbage everywhere\u2026\n",last_update:{date:new Date("2023-05-08T00:00:00.000Z")}},o="Garbage Collection",m={unversionedId:"pexam/b-garbage_collect",id:"pexam/b-garbage_collect",title:"Practice exam B",description:"Garbage everywhere\u2026\n",source:"@site/pb071/pexam/b-garbage_collect.md",sourceDirName:"pexam",slug:"/pexam/garbage_collect",permalink:"/pb071/pexam/garbage_collect",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/pb071/pexam/b-garbage_collect.md",tags:[],version:"current",lastUpdatedAt:1683504e3,formattedLastUpdatedAt:"May 8, 2023",frontMatter:{slug:"garbage_collect",title:"Practice exam B",description:"Garbage everywhere\u2026\n",last_update:{date:"2023-05-08T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Practice Exams",permalink:"/pb071/category/practice-exams"},next:{title:"Practice exam C",permalink:"/pb071/pexam/cams"}},s={},l=[{value:"Format of the shell history",id:"format-of-the-shell-history",level:2},{value:"Format of the output",id:"format-of-the-output",level:2},{value:"<code>-gt \u2039min_size\u203a</code>",id:"-gt-min_size",level:3},{value:"<code>-f \u2039total_size\u203a \u2039min_unused\u203a</code>",id:"-f-total_size-min_unused",level:3},{value:"Example usage",id:"example-usage",level:2},{value:"Requirements and notes",id:"requirements-and-notes",level:2}],p={toc:l},u="wrapper";function c(e){let{components:t,...a}=e;return(0,r.kt)(u,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"garbage-collection"},"Garbage Collection"),(0,r.kt)("admonition",{title:"Exam environment",type:"caution"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"During the exam you will be provided with a barebone ",(0,r.kt)("em",{parentName:"li"},"exam session")," on the\n",(0,r.kt)("em",{parentName:"li"},"faculty computers"),"."),(0,r.kt)("li",{parentName:"ul"},"In browser you are only allowed to have the following tabs open:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.cppreference.com"},"C documentation")),(0,r.kt)("li",{parentName:"ul"},"page containing the assignment"))),(0,r.kt)("li",{parentName:"ul"},"You ",(0,r.kt)("strong",{parentName:"li"},"are not")," allowed to use your own source code, e.g. prepared beforehand\nor from the seminars."),(0,r.kt)("li",{parentName:"ul"},"You have ",(0,r.kt)("strong",{parentName:"li"},"5 minutes")," to read through the assignment and ask any follow-up\nquestions should be there something unclear."),(0,r.kt)("li",{parentName:"ul"},"You have ",(0,r.kt)("strong",{parentName:"li"},"60 minutes")," to work on the assignment, afterward your work will be\ndiscussed with your seminar tutor."))),(0,r.kt)("p",null,"You have gotten into a trouble during your regular upgrade of your archLinux",(0,r.kt)("sup",{parentName:"p",id:"fnref-1"},(0,r.kt)("a",{parentName:"sup",href:"#fn-1",className:"footnote-ref"},"1")),"\ninstallation\u2026 You've been carelessly running the upgrades for months and forgot\nabout clearing up the caches."),(0,r.kt)("p",null,"Your task is to write a program ",(0,r.kt)("inlineCode",{parentName:"p"},"garbage_collect")," that will evaluate the shell\nhistory provided as a file and will try to find files or directories that are\nsuspiciously big and decide which of them should be deleted to free some space."),(0,r.kt)("h2",{id:"format-of-the-shell-history"},"Format of the shell history"),(0,r.kt)("p",null,"You are provided one file consisting of the captured buffer of the terminal. You\ncan see only two commands being used:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"cd \u2039somewhere\u203a")," that changes the current working directory."),(0,r.kt)("p",{parentName:"li"},"At the beginning you start in the root of the filesystem (i.e. ",(0,r.kt)("inlineCode",{parentName:"p"},"/"),")."),(0,r.kt)("p",{parentName:"li"},"You are ",(0,r.kt)("strong",{parentName:"p"},"guaranteed")," that ",(0,r.kt)("inlineCode",{parentName:"p"},"\u2039somewhere\u203a")," is:"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},".")," that is a current working directory (i.e. does nothing),"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"..")," that moves you up one level (in case you are in ",(0,r.kt)("inlineCode",{parentName:"li"},"/"),", does nothing), or"),(0,r.kt)("li",{parentName:"ul"},"is a valid directory in the current working directory.")),(0,r.kt)("admonition",{parentName:"li",type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"There are no guarantees or restrictions on the names of the files or\ndirectories!"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"ls")," that will list files in the current working directory and their\nrespective sizes. If there is a directory in the current working it has ",(0,r.kt)("inlineCode",{parentName:"p"},"dir"),"\ninstead of the size."))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ ls\ndir a\n14848514 b.txt\n8504156 c.dat\ndir d\n$ cd a\n$ cd .\n$ cd .\n$ cd .\n$ ls\ndir e\n29116 f\n2557 g\n62596 h.lst\n$ cd e\n$ ls\n584 i\n$ cd ..\n$ cd ..\n$ cd d\n$ ls\n4060174 j\n8033020 d.log\n5626152 d.ext\n7214296 k\n")),(0,r.kt)("p",null,"For this input, you will get following file system:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"- / (dir, size=48381165)\n - a (dir, size=94853)\n - e (dir, size=584)\n - i (file, size=584)\n - f (file, size=29116)\n - g (file, size=2557)\n - h.lst (file, size=62596)\n - b.txt (file, size=14848514)\n - c.dat (file, size=8504156)\n - d (dir, size=24933642)\n - j (file, size=4060174)\n - d.log (file, size=8033020)\n - d.ext (file, size=5626152)\n - k (file, size=7214296)\n")),(0,r.kt)("h2",{id:"format-of-the-output"},"Format of the output"),(0,r.kt)("p",null,"Your program should support 2 switches:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"-gt \u2039min_size\u203a")," that will print out suspiciously big files."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"-f \u2039total_size\u203a \u2039min_unused\u203a")," that will print out a file to be deleted.")),(0,r.kt)("h3",{id:"-gt-min_size"},(0,r.kt)("inlineCode",{parentName:"h3"},"-gt \u2039min_size\u203a")),(0,r.kt)("p",null,"With this switch you are provided one additional argument:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"min_size")," that is the lower bound (inclusive) for size of any file or\ndirectory that is supposed to be listed.")),(0,r.kt)("p",null,"When your program is being run with this switch, it is is supposed to print out\nall files ",(0,r.kt)("strong",{parentName:"p"},"and")," directories that are bigger than the provided ",(0,r.kt)("inlineCode",{parentName:"p"},"min_size"),"."),(0,r.kt)("h3",{id:"-f-total_size-min_unused"},(0,r.kt)("inlineCode",{parentName:"h3"},"-f \u2039total_size\u203a \u2039min_unused\u203a")),(0,r.kt)("p",null,"With this switch you are provided two additional arguments:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"total_size")," that is a total size of the filesystem",(0,r.kt)("sup",{parentName:"li",id:"fnref-2"},(0,r.kt)("a",{parentName:"sup",href:"#fn-2",className:"footnote-ref"},"2")),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"min_unused")," that is a minimum of free space required for an upgrade.")),(0,r.kt)("p",null,"Your program should find ",(0,r.kt)("strong",{parentName:"p"},"exactly one")," file or a directory that is of the\nsmallest size, but big enough to free enough space for the upgrade to proceed."),(0,r.kt)("p",null,"In other words, if that file or directory is deleted, following should hold:"),(0,r.kt)("div",{className:"math math-display"},(0,r.kt)("span",{parentName:"div",className:"katex-display"},(0,r.kt)("span",{parentName:"span",className:"katex"},(0,r.kt)("span",{parentName:"span",className:"katex-mathml"},(0,r.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},(0,r.kt)("semantics",{parentName:"math"},(0,r.kt)("mrow",{parentName:"semantics"},(0,r.kt)("mrow",{parentName:"mrow"},(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"t"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"o"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"t"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"a"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"l"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"_"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"s"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"i"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"z"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"e")),(0,r.kt)("mo",{parentName:"mrow"},"\u2212"),(0,r.kt)("mrow",{parentName:"mrow"},(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"u"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"s"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"e"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"d")),(0,r.kt)("mo",{parentName:"mrow"},"\u2265"),(0,r.kt)("mrow",{parentName:"mrow"},(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"m"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"i"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"n"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"_"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"u"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"n"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"u"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"s"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"e"),(0,r.kt)("mi",{parentName:"mrow",mathvariant:"monospace"},"d"))),(0,r.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathtt{total\\_size} - \\mathtt{used} \\geq \\mathtt{min\\_unused}")))),(0,r.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,r.kt)("span",{parentName:"span",className:"base"},(0,r.kt)("span",{parentName:"span",className:"strut",style:{height:"0.7063em",verticalAlign:"-0.0951em"}}),(0,r.kt)("span",{parentName:"span",className:"mord"},(0,r.kt)("span",{parentName:"span",className:"mord mathtt"},"total_size")),(0,r.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}}),(0,r.kt)("span",{parentName:"span",className:"mbin"},"\u2212"),(0,r.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2222em"}})),(0,r.kt)("span",{parentName:"span",className:"base"},(0,r.kt)("span",{parentName:"span",className:"strut",style:{height:"0.7719em",verticalAlign:"-0.136em"}}),(0,r.kt)("span",{parentName:"span",className:"mord"},(0,r.kt)("span",{parentName:"span",className:"mord mathtt"},"used")),(0,r.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}}),(0,r.kt)("span",{parentName:"span",className:"mrel"},"\u2265"),(0,r.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.2778em"}})),(0,r.kt)("span",{parentName:"span",className:"base"},(0,r.kt)("span",{parentName:"span",className:"strut",style:{height:"0.7063em",verticalAlign:"-0.0951em"}}),(0,r.kt)("span",{parentName:"span",className:"mord"},(0,r.kt)("span",{parentName:"span",className:"mord mathtt"},"min_unused"))))))),(0,r.kt)("h2",{id:"example-usage"},"Example usage"),(0,r.kt)("p",null,"You can have a look at the example usage of your program. We can run your\nprogram from the shell like"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ ./garbage_collect shell_history.txt -gt 10000000\n24933642 /d\n14848514 /b.txt\n48381165 /\n\n$ ./garbage_collect shell_history.txt -f 70000000 30000000\n24933642 /d\n")),(0,r.kt)("h2",{id:"requirements-and-notes"},"Requirements and notes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Define ",(0,r.kt)("strong",{parentName:"li"},"structures")," (and ",(0,r.kt)("strong",{parentName:"li"},"enumerations"),", if applicable) for the parsed\ninformation from the files."),(0,r.kt)("li",{parentName:"ul"},"For keeping the \u201crecords\u201d, use some ",(0,r.kt)("strong",{parentName:"li"},"dynamic")," data structure.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Don't forget to consider pros and cons of using ",(0,r.kt)("em",{parentName:"li"},"specific")," data structures\nbefore going through implementing."))),(0,r.kt)("li",{parentName:"ul"},"You ",(0,r.kt)("strong",{parentName:"li"},"are not required")," to produce 1:1 output to the provided examples, they\nare just a hint to not waste your time tinkering with a user experience."),(0,r.kt)("li",{parentName:"ul"},"If any of the operations on the input files should fail,\n",(0,r.kt)("strong",{parentName:"li"},"you are expected to")," handle the situation ",(0,r.kt)("em",{parentName:"li"},"accordingly"),"."),(0,r.kt)("li",{parentName:"ul"},"Failures of any other common functions (e.g. functions used for memory\nmanagement) should be handled in ",(0,r.kt)("strong",{parentName:"li"},"the same way")," as they were in the\nhomeworks and seminars."),(0,r.kt)("li",{parentName:"ul"},"Your program ",(0,r.kt)("strong",{parentName:"li"},"must free")," all the resources before exiting.")),(0,r.kt)("div",{className:"footnotes"},(0,r.kt)("hr",{parentName:"div"}),(0,r.kt)("ol",{parentName:"div"},(0,r.kt)("li",{parentName:"ol",id:"fn-1"},"Also applies to Fedora, but\u2026 we use arch btw \ud83d\ude09",(0,r.kt)("a",{parentName:"li",href:"#fnref-1",className:"footnote-backref"},"\u21a9")),(0,r.kt)("li",{parentName:"ol",id:"fn-2"},"duh!",(0,r.kt)("a",{parentName:"li",href:"#fnref-2",className:"footnote-backref"},"\u21a9")))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fcc91f97.acb581ec.js b/assets/js/fcc91f97.acb581ec.js new file mode 100644 index 0000000..cae1f66 --- /dev/null +++ b/assets/js/fcc91f97.acb581ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[6234],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>d});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?i(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):i(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var m=n.createContext({}),l=function(e){var t=n.useContext(m),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},p=function(e){var t=l(e.components);return n.createElement(m.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,m=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),c=l(a),u=r,d=c["".concat(m,".").concat(u)]||c[u]||h[u]||i;return a?n.createElement(d,s(s({ref:t},p),{},{components:a})):n.createElement(d,s({ref:t},p))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,s=new Array(i);s[0]=u;var o={};for(var m in t)hasOwnProperty.call(t,m)&&(o[m]=t[m]);o.originalType=e,o[c]="string"==typeof e?e:r,s[1]=o;for(var l=2;l<i;l++)s[l]=a[l];return n.createElement.apply(null,s)}return n.createElement.apply(null,a)}u.displayName="MDXCreateElement"},4507:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>m,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var n=a(7462),r=(a(7294),a(3905));const i={id:"iterative-and-iterators",title:"Iterative algorithms via iterators",description:"Iterative DFS using iterators.\n",tags:["csharp","graphs","iterators","iterative"],last_update:{date:new Date("2021-05-18T00:00:00.000Z")}},s=void 0,o={unversionedId:"graphs/iterative-and-iterators",id:"graphs/iterative-and-iterators",title:"Iterative algorithms via iterators",description:"Iterative DFS using iterators.\n",source:"@site/ib002/10-graphs/2021-05-18-iterative-and-iterators.md",sourceDirName:"10-graphs",slug:"/graphs/iterative-and-iterators",permalink:"/ib002/graphs/iterative-and-iterators",draft:!1,editUrl:"https://gitlab.com/mfocko/blog/tree/main/ib002/10-graphs/2021-05-18-iterative-and-iterators.md",tags:[{label:"csharp",permalink:"/ib002/tags/csharp"},{label:"graphs",permalink:"/ib002/tags/graphs"},{label:"iterators",permalink:"/ib002/tags/iterators"},{label:"iterative",permalink:"/ib002/tags/iterative"}],version:"current",lastUpdatedAt:1621296e3,formattedLastUpdatedAt:"May 18, 2021",frontMatter:{id:"iterative-and-iterators",title:"Iterative algorithms via iterators",description:"Iterative DFS using iterators.\n",tags:["csharp","graphs","iterators","iterative"],last_update:{date:"2021-05-18T00:00:00.000Z"}},sidebar:"autogeneratedBar",previous:{title:"Graphs",permalink:"/ib002/category/graphs"},next:{title:"Distance boundaries from BFS tree on undirected graphs",permalink:"/ib002/graphs/bfs-tree"}},m={},l=[{value:"Introduction",id:"introduction",level:2},{value:"Different implementations",id:"different-implementations",level:2},{value:"Recursive DFS implementation from exercises without colors",id:"recursive-dfs-implementation-from-exercises-without-colors",level:3},{value:"Iterative DFS from the exercises",id:"iterative-dfs-from-the-exercises",level:3},{value:"My iterative with path in stack",id:"my-iterative-with-path-in-stack",level:3},{value:"My iterative solution with iterators",id:"my-iterative-solution-with-iterators",level:3},{value:"Implementation",id:"implementation",level:2}],p={toc:l},c="wrapper";function h(e){let{components:t,...a}=e;return(0,r.kt)(c,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"pathname:///files/ib002/graphs/iterative-and-iterators.tar.gz"},"Source code used later on."))),(0,r.kt)("p",null,"As we have talked on the seminar, iterative approach to implementing DFS is not very intuitive and is a very easy way how to create an incorrect implementation."),(0,r.kt)("p",null,"On the other hand, we have seen iterative implementation in the exercises and I have also prepared two from which one was similar to recursive implementation without colors from exercises and the other one used features of high-level languages."),(0,r.kt)("h2",{id:"different-implementations"},"Different implementations"),(0,r.kt)("h3",{id:"recursive-dfs-implementation-from-exercises-without-colors"},"Recursive DFS implementation from exercises without colors"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ada",metastring:"showLineNumbers",showLineNumbers:!0},"function VisitedDFS(u: Vertex, visited: VertexSet) return VertexSet is\n v: Vertex;\nbegin\n visited.Union(To_Set(u));\n\n for v in u.successors loop\n if not Contains(visited, v) then\n visited := visitedDFS(v, Visited);\n end if;\n end loop;\n\n return visited;\nend VisitedDFS;\n")),(0,r.kt)("p",null,"This implementation is correct, does the DFS traversal as it should, however it has one \u201csmallish\u201d downside and that is the time complexity. The usage of set raises the time complexity, of course it is implementation dependant. However in case of either RB-tree or hash-table implementation, we get look-up in time ",(0,r.kt)("span",{parentName:"p",className:"math math-inline"},(0,r.kt)("span",{parentName:"span",className:"katex"},(0,r.kt)("span",{parentName:"span",className:"katex-mathml"},(0,r.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,r.kt)("semantics",{parentName:"math"},(0,r.kt)("mrow",{parentName:"semantics"},(0,r.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,r.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,r.kt)("mi",{parentName:"mrow"},"n"),(0,r.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,r.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(n)")))),(0,r.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,r.kt)("span",{parentName:"span",className:"base"},(0,r.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,r.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,r.kt)("span",{parentName:"span",className:"mopen"},"("),(0,r.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,r.kt)("span",{parentName:"span",className:"mclose"},")")))))," for hash-table in worst-case or ",(0,r.kt)("span",{parentName:"p",className:"math math-inline"},(0,r.kt)("span",{parentName:"span",className:"katex"},(0,r.kt)("span",{parentName:"span",className:"katex-mathml"},(0,r.kt)("math",{parentName:"span",xmlns:"http://www.w3.org/1998/Math/MathML"},(0,r.kt)("semantics",{parentName:"math"},(0,r.kt)("mrow",{parentName:"semantics"},(0,r.kt)("mi",{parentName:"mrow",mathvariant:"script"},"O"),(0,r.kt)("mo",{parentName:"mrow",stretchy:"false"},"("),(0,r.kt)("mi",{parentName:"mrow"},"log"),(0,r.kt)("mo",{parentName:"mrow"},"\u2061"),(0,r.kt)("mi",{parentName:"mrow"},"n"),(0,r.kt)("mo",{parentName:"mrow",stretchy:"false"},")")),(0,r.kt)("annotation",{parentName:"semantics",encoding:"application/x-tex"},"\\mathcal{O}(\\log n)")))),(0,r.kt)("span",{parentName:"span",className:"katex-html","aria-hidden":"true"},(0,r.kt)("span",{parentName:"span",className:"base"},(0,r.kt)("span",{parentName:"span",className:"strut",style:{height:"1em",verticalAlign:"-0.25em"}}),(0,r.kt)("span",{parentName:"span",className:"mord mathcal",style:{marginRight:"0.02778em"}},"O"),(0,r.kt)("span",{parentName:"span",className:"mopen"},"("),(0,r.kt)("span",{parentName:"span",className:"mop"},"lo",(0,r.kt)("span",{parentName:"span",style:{marginRight:"0.01389em"}},"g")),(0,r.kt)("span",{parentName:"span",className:"mspace",style:{marginRight:"0.1667em"}}),(0,r.kt)("span",{parentName:"span",className:"mord mathnormal"},"n"),(0,r.kt)("span",{parentName:"span",className:"mclose"},")")))))," for the other in the worst-case. Both are not ideal compared to checking color on vertex."),(0,r.kt)("h3",{id:"iterative-dfs-from-the-exercises"},"Iterative DFS from the exercises"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ada",metastring:"showLineNumbers",showLineNumbers:!0},"procedure IterDFS(u: Vertex) is\n stack: StateVector;\n i, time: Integer;\n v: Vertex;\nbegin\n stack.Append(VertexState(u, 0));\n u.color := Gray;\n time := 1;\n u.d := time;\n\n while not stack.Is_Empty loop\n u := stack.Last_Element.Vertex;\n i := stack.Last_Element.NextIndex;\n stack.Delete_Last;\n\n if i < u.successors.Length then\n -- search is not finished, is pushed back to stack\n stack.Append(VertexState(u, k + 1));\n\n v := u.successors.Element(i);\n if v.color = White then\n stack.Append(VertexState(v, 0));\n v.color := Gray;\n time := time + 1;\n v.d := time;\n end if;\n else\n -- u has no other successors, we can finish the search\n time := time + 1;\n u.f := time;\n u.color := Black;\n end if;\n end loop;\n\nend IterDFS;\n")),(0,r.kt)("p",null,"As we can see, there is some ordering in which we search through the successors. Time complexity is OK, stack holds at most all vertices (they must be on the current path)."),(0,r.kt)("h3",{id:"my-iterative-with-path-in-stack"},"My iterative with path in stack"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ada",metastring:"showLineNumbers",showLineNumbers:!0},"procedure DFS(start: Vertex) is\n path: VertexVector;\n time: Integer;\n hasSuccessor: Bool;\n successor: Vertex;\nbegin\n path.Append(start);\n time := 1;\n\n start.d := time;\n start.color := Gray;\n\n while not path.Is_Empty loop\n hasSuccessor := false;\n\n for successor in path.Last_Element.successors loop\n if successor.color = White then\n hasSuccessor := true;\n\n successor.d := time + 1;\n successor.color := Gray;\n time := time + 1;\n\n path.Append(successor);\n\n exit;\n end if;\n end loop;\n\n if not hasSuccessor then\n path.Last_Element.f := time + 1;\n path.Last_Element.color := Black;\n\n time := time + 1;\n path.Delete_Last;\n end if;\n\n end loop;\nend DFS;\n")),(0,r.kt)("p",null,"This approach is similar to the iterative solution from the exercises, but it does not keep the index of the next successor, therefore it always iterates through all of them, which raises the time complexity."),(0,r.kt)("h3",{id:"my-iterative-solution-with-iterators"},"My iterative solution with iterators"),(0,r.kt)("p",null,"On the other hand, we do not actually have to depend on the representation of the graph. In this case, we just ",(0,r.kt)("em",{parentName:"p"},"somehow")," obtain the iterator (which yields all of the succesors) and keep it in the stack."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-ada",metastring:"showLineNumbers",showLineNumbers:!0},"procedure DFS(start: Vertex) is\n path: StateVector;\n time: Integer;\n current: State;\n nextVertex: Vertex;\nbegin\n path.Append(State(start));\n time := 1;\n\n start.d := time;\n start.color := Gray;\n\n while not path.Is_Empty loop\n current := path.Last_Element;\n\n if not Move_Next(current.successors) then\n path.Delete_Last;\n\n time := time + 1;\n current.vertex.f := time;\n\n current.vertex.color := Black;\n else if current.successors.Value.color = white then\n nextVertex := current.successors.Value;\n\n time := time + 1;\n nextVertex.d := time;\n\n nextVertex.color := Gray;\n\n path.Append(State(nextVertex));\n end if;\n end loop;\nend DFS;\n")),(0,r.kt)("p",null,"( The way we manipulate with the iterators is closest to the C# implementation. Apart from the ",(0,r.kt)("inlineCode",{parentName:"p"},"Iterator")," thing :) In case you tried to implement it in C++, you would more than likely need to change the check, since you would get first successor right at the beginning )"),(0,r.kt)("p",null,"So here we don't keep indices, but the iterators. We can also check existence of other successors easily: by the iterator moving after the last successor."),(0,r.kt)("p",null,"Closer explanation of the ",(0,r.kt)("em",{parentName:"p"},"iterator shenanigans")," follows. In the beginning, either ",(0,r.kt)("inlineCode",{parentName:"p"},"start")," or when pushing new vertex, we are pushing an iterator that points ",(0,r.kt)("em",{parentName:"p"},"just before")," the first successor. When populating ",(0,r.kt)("inlineCode",{parentName:"p"},"lastVertex")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"successors")," in the ",(0,r.kt)("inlineCode",{parentName:"p"},"while"),"-loop, we take the element from the top of the stack. ",(0,r.kt)("inlineCode",{parentName:"p"},"MoveNext")," returns ",(0,r.kt)("inlineCode",{parentName:"p"},"true")," if there is an element, i.e. successor in this case. If it returns ",(0,r.kt)("inlineCode",{parentName:"p"},"false")," we have nothing to do and we pop the vertex from the stack (also set finishing time and color). If we have successor we check if it has been already visited or not. If has not, we set discovery time and color accordingly, also we add it to stack."),(0,r.kt)("h2",{id:"implementation"},"Implementation"),(0,r.kt)("p",null,"In case you want to play around with the code. At the beginning there is a link to the C# implementation that can be used. It has a basic representation of graph and includes BFS/DFS implementation in classes."),(0,r.kt)("p",null,"In ",(0,r.kt)("inlineCode",{parentName:"p"},"Program.cs")," you can also find a method that returns graph we used on the seminar."))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd0b1e16.7f8a8c44.js b/assets/js/fd0b1e16.7f8a8c44.js new file mode 100644 index 0000000..586ec36 --- /dev/null +++ b/assets/js/fd0b1e16.7f8a8c44.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[5388],{955:i=>{i.exports=JSON.parse('{"label":"bottom-up-dp","permalink":"/ib002/tags/bottom-up-dp","allTagsPath":"/ib002/tags","count":1,"items":[{"id":"recursion/pyramid-slide-down","title":"Introduction to dynamic programming","description":"Solving a problem in different ways.\\n","permalink":"/ib002/recursion/pyramid-slide-down"}]}')}}]); \ No newline at end of file diff --git a/assets/js/ff472cd9.4ff57c91.js b/assets/js/ff472cd9.4ff57c91.js new file mode 100644 index 0000000..cf8216a --- /dev/null +++ b/assets/js/ff472cd9.4ff57c91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfi=self.webpackChunkfi||[]).push([[8643],{7122:a=>{a.exports=JSON.parse('{"label":"iterators","permalink":"/blog/tags/iterators","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file diff --git a/assets/js/main.9283b308.js b/assets/js/main.9283b308.js new file mode 100644 index 0000000..faea5e5 --- /dev/null +++ b/assets/js/main.9283b308.js @@ -0,0 +1,2 @@ +/*! For license information please see main.9283b308.js.LICENSE.txt */ +(self.webpackChunkfi=self.webpackChunkfi||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){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"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,4524)),"@theme/BlogTagsListPage",4524],"0220f5fc":[()=>n.e(1378).then(n.t.bind(n,5804,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-blog/blog/plugin-route-context-module-100.json",5804],"0608d96f":[()=>n.e(7568).then(n.t.bind(n,7158,19)),"~blog/blog/blog-tags-vps-843-list.json",7158],"09bc59e7":[()=>n.e(4932).then(n.t.bind(n,3649,19)),"~docs/ib002/category-ib-002-autogeneratedbar-category-graphs-387.json",3649],"0bfe45d5":[()=>n.e(4269).then(n.t.bind(n,3847,19)),"~blog/blog/blog-tags-rust-0c9-list.json",3847],"0fcbc6ca":[()=>Promise.all([n.e(532),n.e(1851)]).then(n.bind(n,9900)),"@site/src/pages/talks.tsx",9900],"146d9b84":[()=>n.e(9300).then(n.t.bind(n,6671,19)),"~blog/blog/blog-tags-admin-b05-list.json",6671],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(8954),n.e(7918)]).then(n.bind(n,5154)),"@theme/DocItem",5154],"18f481e4":[()=>n.e(6057).then(n.t.bind(n,1738,19)),"~docs/ib002/tag-ib-002-tags-java-086.json",1738],"19d7c045":[()=>n.e(4637).then(n.t.bind(n,7772,19)),"~blog/blog/blog-tags-advent-of-code-49f.json",7772],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,9172)),"@theme/SearchPage",9172],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1bebd4ed":[()=>n.e(404).then(n.t.bind(n,9623,19)),"~docs/pb071/version-current-metadata-prop-751.json",9623],"1e2009d3":[()=>n.e(3906).then(n.bind(n,2131)),"@site/ib002/08-rb-trees/2022-04-05-applications.md",2131],"1e298f0c":[()=>n.e(2732).then(n.t.bind(n,3467,19)),"~docs/ib002/tag-ib-002-tags-bfs-346.json",3467],"22a175ec":[()=>Promise.all([n.e(532),n.e(6890)]).then(n.bind(n,707)),"@site/src/pages/contributions.tsx",707],"2523321d":[()=>n.e(9193).then(n.bind(n,5998)),"@site/pb071/bonuses/08.md",5998],27470891:[()=>n.e(4972).then(n.t.bind(n,9249,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-docs/pb071/plugin-route-context-module-100.json",9249],"280c26e1":[()=>n.e(5529).then(n.t.bind(n,3272,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-docs/ib002/plugin-route-context-module-100.json",3272],29694455:[()=>n.e(3388).then(n.t.bind(n,9828,19)),"~blog/blog/blog-tags-iterators-977-list.json",9828],"2a09abcd":[()=>n.e(1246).then(n.bind(n,3903)),"@site/ib002/10-graphs/2022-04-30-bfs-tree.md",3903],"3011a4c0":[()=>n.e(7926).then(n.t.bind(n,1670,19)),"~blog/blog/blog-tags-copr-70b-list.json",1670],"337bc122":[()=>n.e(1731).then(n.bind(n,8378)),"@site/pb071/00-intro-pb071.md",8378],"3593220c":[()=>n.e(8167).then(n.t.bind(n,2947,19)),"~docs/ib002/tag-ib-002-tags-greedy-99b.json",2947],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,727)),"@theme/DocTagsListPage",727],"377f3aa1":[()=>n.e(1011).then(n.bind(n,3248)),"@site/blog/aoc-2022/02-week-2.md",3248],"37cf4872":[()=>n.e(7979).then(n.t.bind(n,821,19)),"~docs/ib002/tag-ib-002-tags-postconditions-162.json",821],"3aef4518":[()=>n.e(1505).then(n.t.bind(n,1921,19)),"~docs/ib002/tag-ib-002-tags-iterative-678.json",1921],"3da4b779":[()=>n.e(2177).then(n.bind(n,8180)),"@site/blog/aoc-2022/04-week-4.md",8180],"3de247b5":[()=>Promise.all([n.e(532),n.e(3184)]).then(n.bind(n,5306)),"@site/ib002/08-rb-trees/2023-06-10-rules.md",5306],"4200b1a9":[()=>n.e(866).then(n.t.bind(n,4612,19)),"~blog/blog/blog-archive-80c.json",4612],"4621632b":[()=>n.e(3519).then(n.t.bind(n,9760,19)),"~blog/blog/blog-tags-cpp-7c7-list.json",9760],"4688cd57":[()=>n.e(932).then(n.t.bind(n,2647,19)),"~docs/pb071/category-pb-071-autogeneratedbar-category-bonuses-855.json",2647],"470a9204":[()=>n.e(3936).then(n.t.bind(n,4439,19)),"~docs/ib002/tag-ib-002-tags-applications-a68.json",4439],"4c4e9f30":[()=>n.e(7883).then(n.t.bind(n,7803,19)),"~docs/ib002/tag-ib-002-tags-exponential-5c3.json",7803],"4e286f4e":[()=>n.e(1501).then(n.bind(n,6038)),"@site/ib002/04-recursion/2022-11-29-karel-1.md",6038],"4edd2021":[()=>n.e(5975).then(n.t.bind(n,1705,19)),"~blog/blog/blog-tags-cpp-7c7.json",1705],"4ee12fa2":[()=>n.e(7963).then(n.bind(n,9258)),"@site/pb161/00-intro-pb161.md",9258],51624505:[()=>n.e(3731).then(n.bind(n,905)),"@site/blog/aoc-2022/00-intro.md",905],"52bff962":[()=>n.e(9710).then(n.t.bind(n,1193,19)),"~docs/ib002/tags-list-current-prop-15a.json",1193],"52f2a5bf":[()=>n.e(5430).then(n.t.bind(n,1387,19)),"~blog/blog/blog-tags-red-hat-df4.json",1387],"58dd4fbd":[()=>n.e(3340).then(n.t.bind(n,3047,19)),"~docs/ib002/tag-ib-002-tags-c-d4e.json",3047],"5af27364":[()=>n.e(3502).then(n.t.bind(n,3162,19)),"~docs/ib002/tag-ib-002-tags-balanced-trees-896.json",3162],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"62d847b3":[()=>n.e(8520).then(n.t.bind(n,1901,19)),"~blog/blog/blog-tags-advent-of-code-2022-3db-list.json",1901],"66d5ef6c":[()=>n.e(9228).then(n.t.bind(n,4087,19)),"~blog/blog/blog-tags-tags-4c2.json",4087],"6875c492":[()=>Promise.all([n.e(532),n.e(8954),n.e(6048),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"713b7838":[()=>n.e(2167).then(n.bind(n,6652)),"@site/pb071/bonuses/04.md",6652],"73d5f13d":[()=>n.e(7555).then(n.t.bind(n,3974,19)),"~docs/ib002/tag-ib-002-tags-iterators-e30.json",3974],"74c2e0e9":[()=>n.e(3528).then(n.t.bind(n,2235,19)),"~docs/ib002/tag-ib-002-tags-backtracking-737.json",2235],"75316eff":[()=>n.e(4287).then(n.t.bind(n,5603,19)),"~docs/ib002/tag-ib-002-tags-python-65c.json",5603],"75cccf44":[()=>n.e(4256).then(n.bind(n,634)),"@site/blog/leetcode/sort-matrix-diagonally.md?truncated=true",634],"765ea78b":[()=>n.e(3039).then(n.t.bind(n,3010,19)),"~blog/blog/blog-tags-\ud83c\udfed-551.json",3010],"788cc978":[()=>n.e(9157).then(n.bind(n,3506)),"@site/ib002/03-time-complexity/2021-03-31-extend.md",3506],"7cf94373":[()=>n.e(3095).then(n.bind(n,1010)),"@site/pb071/bonuses/10.md",1010],"7d580cdb":[()=>n.e(8442).then(n.bind(n,7527)),"@site/ib002/04-recursion/2023-08-17-pyramid-slide-down.md",7527],"82b3b723":[()=>n.e(5787).then(n.t.bind(n,6564,19)),"~docs/ib002/tag-ib-002-tags-dynamic-programming-5f1.json",6564],"834ed470":[()=>n.e(3223).then(n.bind(n,6454)),"@site/ib002/00-intro-ib002.md",6454],"83bf91d3":[()=>n.e(7823).then(n.bind(n,1187)),"@site/pb071/mr.md",1187],"8418981c":[()=>n.e(5383).then(n.t.bind(n,1930,19)),"~docs/ib002/tag-ib-002-tags-recursion-36f.json",1930],"86cd1460":[()=>n.e(1235).then(n.t.bind(n,8968,19)),"~blog/blog/blog-tags-leetcode-042.json",8968],"8b1802c5":[()=>n.e(8480).then(n.t.bind(n,832,19)),"~blog/blog/blog-tags-advent-of-code-49f-list.json",832],"8c0e532b":[()=>n.e(822).then(n.t.bind(n,3968,19)),"~blog/blog/blog-tags-vps-843.json",3968],"8e1fadd0":[()=>n.e(6554).then(n.t.bind(n,9278,19)),"~docs/ib002/category-ib-002-autogeneratedbar-category-algorithms-and-correctness-947.json",9278],"90425ffc":[()=>n.e(8769).then(n.bind(n,3167)),"@site/pb071/bonuses/03.md",3167],"9287eafd":[()=>n.e(5521).then(n.t.bind(n,716,19)),"~blog/blog/blog-tags-rust-0c9.json",716],"94036ea2":[()=>n.e(4477).then(n.t.bind(n,6996,19)),"~docs/pb161/version-current-metadata-prop-751.json",6996],"95b96bb9":[()=>n.e(3561).then(n.t.bind(n,4577,19)),"~blog/blog/blog-post-list-prop-blog.json",4577],"95be84b6":[()=>n.e(3835).then(n.t.bind(n,1820,19)),"~docs/ib002/tag-ib-002-tags-csharp-684.json",1820],"95f41f0b":[()=>n.e(9385).then(n.bind(n,6534)),"@site/blog/aoc-2022/01-week-1.md?truncated=true",6534],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9eb50c57":[()=>n.e(7509).then(n.bind(n,6239)),"@site/ib002/02-algorithms-correctness/2021-03-18-postcondition-ambiguity.md",6239],a082abd3:[()=>n.e(8786).then(n.t.bind(n,3276,19)),"~blog/blog/blog-tags-admin-b05.json",3276],a2be6ffb:[()=>n.e(4800).then(n.bind(n,5185)),"@site/pb161/environment.md",5185],a6a48ea2:[()=>n.e(3618).then(n.bind(n,8763)),"@site/blog/aoc-2022/02-week-2.md?truncated=true",8763],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(8954),n.e(6048),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a7098721:[()=>n.e(1050).then(n.t.bind(n,6615,19)),"~blog/blog/blog-c06.json",6615],a7d8226e:[()=>n.e(516).then(n.t.bind(n,4475,19)),"~docs/ib002/category-ib-002-autogeneratedbar-category-asymptotic-notation-and-time-complexity-5a5.json",4475],a80747a0:[()=>n.e(5824).then(n.t.bind(n,4464,19)),"~blog/blog/blog-tags-advent-of-code-2022-3db.json",4464],ab2721d4:[()=>n.e(7755).then(n.bind(n,861)),"@site/blog/aoc-2022/04-week-4.md?truncated=true",861],af8b72a7:[()=>n.e(5658).then(n.bind(n,3650)),"@site/blog/2023-08-02-copr.md?truncated=true",3650],b0067e0a:[()=>n.e(1272).then(n.t.bind(n,2611,19)),"~docs/ib002/version-current-metadata-prop-751.json",2611],b0291f37:[()=>n.e(6097).then(n.t.bind(n,7085,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],b25fbc58:[()=>n.e(9197).then(n.t.bind(n,5617,19)),"~blog/blog/blog-tags-\ud83c\udfed-551-list.json",5617],b2c263ce:[()=>n.e(6192).then(n.t.bind(n,8379,19)),"~docs/ib002/category-ib-002-autogeneratedbar-category-recursion-061.json",8379],b45dccf0:[()=>n.e(9679).then(n.t.bind(n,8296,19)),"~blog/blog/blog-tags-copr-70b.json",8296],b5a32f14:[()=>n.e(2433).then(n.bind(n,9746)),"@site/blog/2023-08-02-copr.md",9746],b9b1ccdc:[()=>n.e(9044).then(n.bind(n,284)),"@site/pb071/pexam/c-cams.md",284],bb882650:[()=>n.e(8091).then(n.bind(n,6974)),"@site/blog/aoc-2022/03-week-3.md?truncated=true",6974],be4da062:[()=>n.e(6498).then(n.t.bind(n,4436,19)),"~docs/ib002/tag-ib-002-tags-time-complexity-7a0.json",4436],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c8cbffbd:[()=>n.e(9814).then(n.t.bind(n,4166,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-docs/pb161/plugin-route-context-module-100.json",4166],ccc49370:[()=>Promise.all([n.e(532),n.e(8954),n.e(6048),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],cfa2b263:[()=>n.e(3086).then(n.bind(n,6031)),"@site/blog/leetcode/sort-matrix-diagonally.md",6031],d02d148d:[()=>n.e(7780).then(n.t.bind(n,9221,19)),"~docs/ib002/tag-ib-002-tags-testing-4cc.json",9221],d5ca4423:[()=>n.e(5126).then(n.t.bind(n,1032,19)),"~docs/ib002/tag-ib-002-tags-sorting-23e.json",1032],d661cf04:[()=>n.e(6112).then(n.t.bind(n,8194,19)),"~docs/pb071/category-pb-071-autogeneratedbar-category-practice-exams-a48.json",8194],d675395f:[()=>n.e(2741).then(n.t.bind(n,5745,19)),"/home/runner/work/blog/blog/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],d74d369f:[()=>n.e(9479).then(n.t.bind(n,2231,19)),"~docs/ib002/category-ib-002-autogeneratedbar-category-red-black-trees-6b6.json",2231],d79dd549:[()=>n.e(5169).then(n.t.bind(n,9261,19)),"~blog/blog/blog-tags-red-hat-df4-list.json",9261],d7f7fb17:[()=>n.e(1171).then(n.bind(n,8049)),"@site/blog/aoc-2022/00-intro.md?truncated=true",8049],d9adc206:[()=>n.e(4252).then(n.t.bind(n,6297,19)),"~docs/ib002/tag-ib-002-tags-dynamic-array-119.json",6297],dadfcff0:[()=>n.e(7624).then(n.t.bind(n,3095,19)),"~docs/ib002/tag-ib-002-tags-graphs-c81.json",3095],df203c0f:[()=>n.e(9924).then(n.bind(n,1298)),"@theme/DocTagDocListPage",1298],dff2ebad:[()=>n.e(146).then(n.bind(n,577)),"@site/blog/aoc-2022/01-week-1.md",577],e25b3183:[()=>n.e(6).then(n.t.bind(n,5934,19)),"~docs/ib002/tag-ib-002-tags-top-down-dp-cc1.json",5934],e89da83e:[()=>n.e(8757).then(n.t.bind(n,7416,19)),"~blog/blog/blog-tags-leetcode-042-list.json",7416],eb7cc117:[()=>n.e(143).then(n.t.bind(n,3635,19)),"~docs/ib002/tag-ib-002-tags-red-black-trees-22f.json",3635],edfd2a45:[()=>n.e(7248).then(n.t.bind(n,1955,19)),"~docs/ib002/tag-ib-002-tags-karel-bbc.json",1955],f48be158:[()=>n.e(4064).then(n.bind(n,9859)),"@site/blog/aoc-2022/03-week-3.md",9859],f533ef4a:[()=>n.e(2160).then(n.bind(n,6489)),"@site/pb071/bonuses/05-06.md",6489],f60c832f:[()=>n.e(9611).then(n.bind(n,2490)),"@site/pb071/pexam/b-garbage_collect.md",2490],fcc91f97:[()=>n.e(6234).then(n.bind(n,4507)),"@site/ib002/10-graphs/2021-05-18-iterative-and-iterators.md",4507],fd0b1e16:[()=>n.e(5388).then(n.t.bind(n,955,19)),"~docs/ib002/tag-ib-002-tags-bottom-up-dp-3a4.json",955],ff472cd9:[()=>n.e(8643).then(n.t.bind(n,7122,19)),"~blog/blog/blog-tags-iterators-977.json",7122]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("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%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("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"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(7515).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],g=(0,u.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));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 o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/blog",component:f("/blog","a0e"),exact:!0},{path:"/blog/2023/08/02/copr",component:f("/blog/2023/08/02/copr","75c"),exact:!0},{path:"/blog/aoc-2022/1st-week",component:f("/blog/aoc-2022/1st-week","0fa"),exact:!0},{path:"/blog/aoc-2022/2nd-week",component:f("/blog/aoc-2022/2nd-week","0be"),exact:!0},{path:"/blog/aoc-2022/3rd-week",component:f("/blog/aoc-2022/3rd-week","2f7"),exact:!0},{path:"/blog/aoc-2022/4th-week",component:f("/blog/aoc-2022/4th-week","9fd"),exact:!0},{path:"/blog/aoc-2022/intro",component:f("/blog/aoc-2022/intro","645"),exact:!0},{path:"/blog/archive",component:f("/blog/archive","db3"),exact:!0},{path:"/blog/leetcode/sort-diagonally",component:f("/blog/leetcode/sort-diagonally","819"),exact:!0},{path:"/blog/tags",component:f("/blog/tags","726"),exact:!0},{path:"/blog/tags/\ud83c\udfed",component:f("/blog/tags/\ud83c\udfed","fa9"),exact:!0},{path:"/blog/tags/admin",component:f("/blog/tags/admin","3a8"),exact:!0},{path:"/blog/tags/advent-of-code",component:f("/blog/tags/advent-of-code","3ce"),exact:!0},{path:"/blog/tags/advent-of-code-2022",component:f("/blog/tags/advent-of-code-2022","a9b"),exact:!0},{path:"/blog/tags/copr",component:f("/blog/tags/copr","dd4"),exact:!0},{path:"/blog/tags/cpp",component:f("/blog/tags/cpp","d2e"),exact:!0},{path:"/blog/tags/iterators",component:f("/blog/tags/iterators","f8b"),exact:!0},{path:"/blog/tags/leetcode",component:f("/blog/tags/leetcode","238"),exact:!0},{path:"/blog/tags/red-hat",component:f("/blog/tags/red-hat","06b"),exact:!0},{path:"/blog/tags/rust",component:f("/blog/tags/rust","576"),exact:!0},{path:"/blog/tags/vps",component:f("/blog/tags/vps","afb"),exact:!0},{path:"/contributions",component:f("/contributions","c6e"),exact:!0},{path:"/ib002/tags",component:f("/ib002/tags","139"),exact:!0},{path:"/ib002/tags/applications",component:f("/ib002/tags/applications","bd0"),exact:!0},{path:"/ib002/tags/backtracking",component:f("/ib002/tags/backtracking","e79"),exact:!0},{path:"/ib002/tags/balanced-trees",component:f("/ib002/tags/balanced-trees","633"),exact:!0},{path:"/ib002/tags/bfs",component:f("/ib002/tags/bfs","2b0"),exact:!0},{path:"/ib002/tags/bottom-up-dp",component:f("/ib002/tags/bottom-up-dp","bfd"),exact:!0},{path:"/ib002/tags/c",component:f("/ib002/tags/c","41d"),exact:!0},{path:"/ib002/tags/csharp",component:f("/ib002/tags/csharp","e02"),exact:!0},{path:"/ib002/tags/dynamic-array",component:f("/ib002/tags/dynamic-array","a76"),exact:!0},{path:"/ib002/tags/dynamic-programming",component:f("/ib002/tags/dynamic-programming","5f1"),exact:!0},{path:"/ib002/tags/exponential",component:f("/ib002/tags/exponential","3dd"),exact:!0},{path:"/ib002/tags/graphs",component:f("/ib002/tags/graphs","b40"),exact:!0},{path:"/ib002/tags/greedy",component:f("/ib002/tags/greedy","f4e"),exact:!0},{path:"/ib002/tags/iterative",component:f("/ib002/tags/iterative","81e"),exact:!0},{path:"/ib002/tags/iterators",component:f("/ib002/tags/iterators","a31"),exact:!0},{path:"/ib002/tags/java",component:f("/ib002/tags/java","99a"),exact:!0},{path:"/ib002/tags/karel",component:f("/ib002/tags/karel","a44"),exact:!0},{path:"/ib002/tags/postconditions",component:f("/ib002/tags/postconditions","5a4"),exact:!0},{path:"/ib002/tags/python",component:f("/ib002/tags/python","2cd"),exact:!0},{path:"/ib002/tags/recursion",component:f("/ib002/tags/recursion","1ae"),exact:!0},{path:"/ib002/tags/red-black-trees",component:f("/ib002/tags/red-black-trees","2b4"),exact:!0},{path:"/ib002/tags/sorting",component:f("/ib002/tags/sorting","90a"),exact:!0},{path:"/ib002/tags/testing",component:f("/ib002/tags/testing","b13"),exact:!0},{path:"/ib002/tags/time-complexity",component:f("/ib002/tags/time-complexity","01e"),exact:!0},{path:"/ib002/tags/top-down-dp",component:f("/ib002/tags/top-down-dp","e81"),exact:!0},{path:"/search",component:f("/search","49e"),exact:!0},{path:"/talks",component:f("/talks","cdf"),exact:!0},{path:"/ib002",component:f("/ib002","092"),routes:[{path:"/ib002/",component:f("/ib002/","e66"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/algorithms-correctness/postcondition-ambiguity",component:f("/ib002/algorithms-correctness/postcondition-ambiguity","760"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/category/algorithms-and-correctness",component:f("/ib002/category/algorithms-and-correctness","cde"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/category/asymptotic-notation-and-time-complexity",component:f("/ib002/category/asymptotic-notation-and-time-complexity","b3d"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/category/graphs",component:f("/ib002/category/graphs","eb5"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/category/recursion",component:f("/ib002/category/recursion","39b"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/category/red-black-trees",component:f("/ib002/category/red-black-trees","e0c"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/graphs/bfs-tree",component:f("/ib002/graphs/bfs-tree","aaa"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/graphs/iterative-and-iterators",component:f("/ib002/graphs/iterative-and-iterators","489"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/rb-trees/applications",component:f("/ib002/rb-trees/applications","cfb"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/rb-trees/rules",component:f("/ib002/rb-trees/rules","35f"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/recursion/karel-1",component:f("/ib002/recursion/karel-1","11c"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/recursion/pyramid-slide-down",component:f("/ib002/recursion/pyramid-slide-down","73a"),exact:!0,sidebar:"autogeneratedBar"},{path:"/ib002/time-complexity/extend",component:f("/ib002/time-complexity/extend","712"),exact:!0,sidebar:"autogeneratedBar"}]},{path:"/pb071",component:f("/pb071","f28"),routes:[{path:"/pb071/",component:f("/pb071/","66f"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/bonuses/seminar-03",component:f("/pb071/bonuses/seminar-03","86d"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/bonuses/seminar-04",component:f("/pb071/bonuses/seminar-04","7d6"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/bonuses/seminar-05-06",component:f("/pb071/bonuses/seminar-05-06","c41"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/bonuses/seminar-08",component:f("/pb071/bonuses/seminar-08","487"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/bonuses/seminar-10",component:f("/pb071/bonuses/seminar-10","8b8"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/category/bonuses",component:f("/pb071/category/bonuses","995"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/category/practice-exams",component:f("/pb071/category/practice-exams","066"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/mr",component:f("/pb071/mr","a43"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/pexam/cams",component:f("/pb071/pexam/cams","a0c"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb071/pexam/garbage_collect",component:f("/pb071/pexam/garbage_collect","0af"),exact:!0,sidebar:"autogeneratedBar"}]},{path:"/pb161",component:f("/pb161","bca"),routes:[{path:"/pb161/",component:f("/pb161/","726"),exact:!0,sidebar:"autogeneratedBar"},{path:"/pb161/environment",component:f("/pb161/environment","a0b"),exact:!0,sidebar:"autogeneratedBar"}]},{path:"/",component:f("/","dfb"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(7439),n(7800)];var c=n(723),u=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),g=n(2263),h=n(4996),b=n(6668),v=n(833),y=n(4711),w=n(9727),k=n(3320),E=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,u.TH)();return e+(0,h.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function x(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(_,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const T=new Map;function C(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,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 A=n(8934),L=n(8940);function P(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 a=s.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)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:a}),P("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?P("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=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),I(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 r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const R=O,M="__docusaurus-base-url-issue-banner-container",D="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function $(e){return`\nwindow['${F}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${F}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${D}" 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="${B}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${B}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function j(){const{siteConfig:{baseUrl:e}}=(0,g.Z)();return(0,r.useLayoutEffect)((()=>{window[F]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,$(e))),r.createElement("div",{id:M}))}function z(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement(j,null):null}function U(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,g.Z)(),i=(0,h.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var Z=n(4763);function H(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(Z.Z,null,r.createElement(L.M,null,r.createElement(A.t,null,r.createElement(f,null,r.createElement(U,null),r.createElement(x,null),r.createElement(z,null),r.createElement(R,{location:C(t)},e)))))}var G=n(6887);const V=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 a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.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 W=n(9670);const q=new Set,Y=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!K()&&!Y.has(e)&&!q.has(e))(e))return!1;q.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,W.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?V(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!Y.has(e))(e)&&(Y.add(e),I(e))},Q=Object.freeze(X);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;I(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"pb071":{"path":"/pb071","versions":[{"name":"current","label":"Next","isLast":true,"path":"/pb071","mainDocId":"pb071-intro","docs":[{"id":"bonuses/seminar-03","path":"/pb071/bonuses/seminar-03","sidebar":"autogeneratedBar"},{"id":"bonuses/seminar-04","path":"/pb071/bonuses/seminar-04","sidebar":"autogeneratedBar"},{"id":"bonuses/seminar-05-06","path":"/pb071/bonuses/seminar-05-06","sidebar":"autogeneratedBar"},{"id":"bonuses/seminar-08","path":"/pb071/bonuses/seminar-08","sidebar":"autogeneratedBar"},{"id":"bonuses/seminar-10","path":"/pb071/bonuses/seminar-10","sidebar":"autogeneratedBar"},{"id":"mr","path":"/pb071/mr","sidebar":"autogeneratedBar"},{"id":"pb071-intro","path":"/pb071/","sidebar":"autogeneratedBar"},{"id":"pexam/b-garbage_collect","path":"/pb071/pexam/garbage_collect","sidebar":"autogeneratedBar"},{"id":"pexam/c-cams","path":"/pb071/pexam/cams","sidebar":"autogeneratedBar"},{"id":"/category/bonuses","path":"/pb071/category/bonuses","sidebar":"autogeneratedBar"},{"id":"/category/practice-exams","path":"/pb071/category/practice-exams","sidebar":"autogeneratedBar"}],"draftIds":[],"sidebars":{"autogeneratedBar":{"link":{"path":"/pb071/","label":"pb071-intro"}}}}],"breadcrumbs":true},"pb161":{"path":"/pb161","versions":[{"name":"current","label":"Next","isLast":true,"path":"/pb161","mainDocId":"pb161-intro","docs":[{"id":"environment","path":"/pb161/environment","sidebar":"autogeneratedBar"},{"id":"pb161-intro","path":"/pb161/","sidebar":"autogeneratedBar"}],"draftIds":[],"sidebars":{"autogeneratedBar":{"link":{"path":"/pb161/","label":"pb161-intro"}}}}],"breadcrumbs":true},"ib002":{"path":"/ib002","versions":[{"name":"current","label":"Next","isLast":true,"path":"/ib002","mainDocId":"ib002-intro","docs":[{"id":"algorithms-correctness/postcondition-ambiguity","path":"/ib002/algorithms-correctness/postcondition-ambiguity","sidebar":"autogeneratedBar"},{"id":"graphs/bfs-tree","path":"/ib002/graphs/bfs-tree","sidebar":"autogeneratedBar"},{"id":"graphs/iterative-and-iterators","path":"/ib002/graphs/iterative-and-iterators","sidebar":"autogeneratedBar"},{"id":"ib002-intro","path":"/ib002/","sidebar":"autogeneratedBar"},{"id":"rb-trees/applications","path":"/ib002/rb-trees/applications","sidebar":"autogeneratedBar"},{"id":"rb-trees/rules","path":"/ib002/rb-trees/rules","sidebar":"autogeneratedBar"},{"id":"recursion/karel-1","path":"/ib002/recursion/karel-1","sidebar":"autogeneratedBar"},{"id":"recursion/pyramid-slide-down","path":"/ib002/recursion/pyramid-slide-down","sidebar":"autogeneratedBar"},{"id":"time-complexity/extend","path":"/ib002/time-complexity/extend","sidebar":"autogeneratedBar"},{"id":"/category/algorithms-and-correctness","path":"/ib002/category/algorithms-and-correctness","sidebar":"autogeneratedBar"},{"id":"/category/asymptotic-notation-and-time-complexity","path":"/ib002/category/asymptotic-notation-and-time-complexity","sidebar":"autogeneratedBar"},{"id":"/category/recursion","path":"/ib002/category/recursion","sidebar":"autogeneratedBar"},{"id":"/category/red-black-trees","path":"/ib002/category/red-black-trees","sidebar":"autogeneratedBar"},{"id":"/category/graphs","path":"/ib002/category/graphs","sidebar":"autogeneratedBar"}],"draftIds":[],"sidebars":{"autogeneratedBar":{"link":{"path":"/ib002/","label":"ib002-intro"}}}}],"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 l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.4.1"},"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.1"},"docusaurus-plugin-sass":{"type":"package","name":"docusaurus-plugin-sass","version":"0.2.5"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"2.4.1"}}}'),c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(7452);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(c,{error:t}))}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function u(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(u,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.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??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),c=n(412);const u=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:k}=(0,d.C)(),E=(0,a.useContext)(u),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const _=f||p;const x=(0,s.Z)(_),T=_?.replace("pathname://","");let C=void 0!==T?(A=T,b&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;C&&x&&(C=(0,i.applyTrailingSlash)(C,{trailingSlash:y,baseUrl:w}));const L=(0,a.useRef)(!1),P=n?o.OL:o.rU,N=c.Z.canUseIntersectionObserver,I=(0,a.useRef)(),O=()=>{L.current||null==C||(window.docusaurus.preload(C),L.current=!0)};(0,a.useEffect)((()=>(!N&&x&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&I.current&&I.current.disconnect()})),[I,C,N,x]);const R=C?.startsWith("#")??!1,M=!C||!x||R;return M||h||E.collectLink(C),M?a.createElement("a",(0,r.Z)({ref:S,href:C},_&&!x&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(P,(0,r.Z)({},v,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,N&&e&&x&&(I.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(I.current.unobserve(e),I.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),I.current.observe(e))},to:C},n&&{isActive:g,activeClassName:m}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);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 o=n(7529);function i(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 o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=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 l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(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:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>m,_r:()=>d,Jo:()=>v,zh:()=>f,yW:()=>h,gB:()=>g});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&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 o}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function g(e){return f(e).versions}function h(e){const t=f(e);return l(t)}function b(e){const t=f(e),{pathname:n}=(0,r.TH)();return c(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(9462)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("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"}))}},7452:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Pt});var r=n(7294),a=n(6010),o=n(4763),i=n(833),l=n(7462),s=n(6550),c=n(5999),u=n(5936);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,c.I)({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 g(e){const t=e.children??m,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var h=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:v.skipToContent})}var w=n(6668),k=n(9689);function E(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function _(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const x={content:"content_knG7"};function T(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(x.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const C={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:C.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:C.announcementBarPlaceholder}),r.createElement(T,{className:C.announcementBarContent}),i&&r.createElement(_,{onClick:n,className:C.announcementBarClose}))}var L=n(3163),P=n(2466);var N=n(902),I=n(3102);const O=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,I.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(O.Provider,{value:n},t)}function M(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function D(){const e=(0,r.useContext)(O);if(!e)throw new N.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,I.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:M(o)})),[a,o,t])}function B(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=D();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var F=n(2949),$=n(2389);function j(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 Z(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,$.Z)(),s=(0,c.I)({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"===o?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(U.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!l&&U.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(j,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),r.createElement(z,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})))}const H=r.memo(Z),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,F.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var W=n(1327);function q(){return r.createElement(W.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({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()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(q,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const f=(0,Q.Z)(a),p=(0,Q.Z)(t),m=(0,Q.Z)(o,{forcePrependBaseUrl:!0}),g=i&&o&&!(0,J.Z)(o),h=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,g&&r.createElement(te.Z,c&&{width:12,height:12}))};return o?r.createElement(X.Z,(0,l.Z)({href:u?m:o},d,h)):r.createElement(X.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(p)},d,h))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const c=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.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)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ze,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),p()}}),c.children??c.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(Ze,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ue;return r.createElement(a,n)}var pe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("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";function he(){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 be=n(830),ve=["translations"];function ye(){return ye=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},ye.apply(this,arguments)}function we(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,a,o=[],i=!0,l=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(o.push(r.value),!t||o.length!==t);i=!0);}catch(s){l=!0,a=s}finally{try{i||null==n.return||n.return()}finally{if(l)throw a}}return o}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return ke(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 ke(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 ke(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 Ee(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Se="Ctrl";var _e=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=Ee(e,ve),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,c=void 0===s?"Search":s,u=we((0,r.useState)(null),2),d=u[0],f=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Se))}),[]),r.createElement("button",ye({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(be.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?r.createElement(he,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),xe=n(5742),Te=n(6177),Ce=n(239),Ae=n(3320);var Le=n(3935);const Pe={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({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,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({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,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({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,c.I)({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,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Ne=null;function Ie(e){let{hit:t,children:n}=e;return r.createElement(X.Z,{to:t.url},n)}function Oe(e){let{state:t,onClose:n}=e;const a=(0,Te.M)();return r.createElement(X.Z,{to:a(t.query),onClick:n},r.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Re(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,se.Z)(),c=(0,Ce.l)(),u=function(){const{locale:e,tags:t}=(0,Ae._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(u,d):d,p={...o.searchParameters,facetFilters:f},m=(0,s.k6)(),g=(0,r.useRef)(null),h=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Ne?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,1426)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Ne=t}))),[]),E=(0,r.useCallback)((()=>{k().then((()=>{g.current=document.createElement("div"),document.body.insertBefore(g.current,document.body.firstChild),v(!0)}))}),[k,v]),S=(0,r.useCallback)((()=>{v(!1),g.current?.remove()}),[v]),_=(0,r.useCallback)((e=>{k().then((()=>{v(!0),w(e.key)}))}),[k,v,w]),x=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(a,t)?window.location.href=t:m.push(t)}}).current,T=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:c(e.url)}))))).current,C=(0,r.useMemo)((()=>e=>r.createElement(Oe,(0,l.Z)({},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,a=e.onClose,o=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?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:b,onOpen:E,onClose:S,onInput:_,searchButtonRef:h}),r.createElement(r.Fragment,null,r.createElement(xe.Z,null,r.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(_e,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:E,ref:h,translations:Pe.button}),b&&Ne&&g.current&&(0,Le.createPortal)(r.createElement(Ne,(0,l.Z)({onClose:S,initialScrollY:window.scrollY,initialQuery:y,navigator:x,transformItems:T,hitComponent:Ie,transformSearchClient:A},o.searchPagePath&&{resultsFooterComponent:C},o,{searchParameters:p,placeholder:Pe.placeholder,translations:Pe.modal})),g.current))}function Me(){const{siteConfig:e}=(0,se.Z)();return r.createElement(Re,e.themeConfig.algolia)}const De={searchBox:"searchBox_ZlJk"};function Be(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,De.searchBox)},t)}var Fe=n(143),$e=n(3438);var je=n(373);const ze=e=>e.docs.find((t=>t.id===e.mainDocId));const Ue={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,s.TH)(),g=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;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":""}})),...a],h=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:ge}),h),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Be,{className:n},r.createElement(Me,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Fe.Iw)(a),s=(0,$e.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Fe.Iw)(a),s=(0,$e.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,$e.lO)(a)[0],s=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,Fe.Iw)(n),m=(0,Fe.gB)(n),{savePreferredVersionName:g}=(0,je.J)(n),h=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??ze(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...i],b=(0,$e.lO)(n)[0],v=t&&h.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:ze(b).path;return h.length<=1?r.createElement(oe,(0,l.Z)({},u,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.Z)({},u,{mobile:t,label:v,to:y,items:h,isActive:a?()=>!1:void 0}))}};function Ze(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ue[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function He(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ze,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ge(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{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)"},"\u2190 Back to main menu"))}function Ve(){const e=0===(0,w.L)().navbar.items.length,t=D();return r.createElement(r.Fragment,null,!e&&r.createElement(Ge,{onClick:()=>t.hide()}),t.content)}function We(){const e=(0,L.e)();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?r.createElement(B,{header:r.createElement(K,null),primaryMenu:r.createElement(He,null),secondaryMenu:r.createElement(Ve,null)}):null}const qe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ke(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,P.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(a.current)return void(a.current=!1);const l=r?.scrollY,s=document.documentElement.scrollHeight-o.current,c=window.innerHeight;l&&i>=l?n(!1):i+c<s&&n(!0)})),(0,u.S)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[qe.navbarHideable,!s&&qe.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ye,{onClick:i.toggle}),r.createElement(We,null))}var Xe=n(8780);const Qe={errorBoundaryError:"errorBoundaryError_a6uf"};function Je(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function et(e){let{error:t}=e;const n=(0,Xe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Qe.errorBoundaryError},n)}class tt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const nt="right";function rt(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function at(){const{toggle:e,shown:t}=(0,L.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({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"},r.createElement(rt,null))}const ot={colorModeToggle:"colorModeToggle_DEke"};function it(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(tt,{key:t,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})},r.createElement(Ze,e)))))}function lt(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function st(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??nt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(lt,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(at,null),r.createElement(q,null),r.createElement(it,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(it,{items:a}),r.createElement(V,{className:ot.colorModeToggle}),!o&&r.createElement(Be,null,r.createElement(Me,null)))})}function ct(){return r.createElement(Ke,null,r.createElement(st,null))}function ut(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,c=(0,Q.Z)(n),u=(0,Q.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:c},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function dt(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(ut,{item:t}))}function ft(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(dt,{key:t,item:e})))))}function pt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(ft,{key:t,column:e}))))}function mt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function gt(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(ut,{item:t})}function ht(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(gt,{item:e}),t.length!==n+1&&r.createElement(mt,null))))))}function bt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(pt,{columns:t}):r.createElement(ht,{links:t})}var vt=n(941);const yt={footerLogoLink:"footerLogoLink_BH7S"};function wt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(vt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:yt.footerLogoLink,target:t.target},r.createElement(wt,{logo:t})):r.createElement(wt,{logo:t})}function Et(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function St(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function _t(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(St,{style:o,links:n&&n.length>0&&r.createElement(bt,{links:n}),logo:a&&r.createElement(kt,{logo:a}),copyright:t&&r.createElement(Et,{copyright:t})})}const xt=r.memo(_t),Tt=(0,N.Qc)([F.S,k.pl,P.OC,je.L5,i.VC,function(e){let{children:t}=e;return r.createElement(I.n2,null,r.createElement(L.M,null,r.createElement(R,null,t)))}]);function Ct(e){let{children:t}=e;return r.createElement(Tt,null,t)}function At(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Je,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(et,{error:t})))))}const Lt={mainWrapper:"mainWrapper_z2l0"};function Pt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:c}=e;return(0,b.t)(),r.createElement(Ct,null,r.createElement(i.d,{title:s,description:c}),r.createElement(y,null),r.createElement(A,null),r.createElement(ct,null),r.createElement("div",{id:d,className:(0,a.Z)(h.k.wrapper.main,Lt.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(At,e)},t)),!n&&r.createElement(xt,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:c}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(c?.href||"/"),g=n?"":t,h=c?.alt??g;return a.createElement(o.Z,(0,r.Z)({to:m},p,c?.target&&{target:c.target}),c&&a.createElement(u,{logo:c,alt:h,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],u)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>h});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?c:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??l}`,height:`${t}px`}}function s(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?c:u}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const c=(0,a.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:o}),a.createElement(t,{ref:c,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(c.current,n),i?.(n))},className:l},r)}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function h(e){let{lazy:t,...n}=e;const r=t?g:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{o(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),c="theme",u=(0,i.WA)(c),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{u.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(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||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>h,Oh:()=>y});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(3438),s=n(902),c=n(12);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(u(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function h(e){let{children:t}=e;return l.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function y(){const e=(0,a._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(null===e)throw new a.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>f});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),l=n(6668),s=n(902);const c=r.createContext(void 0);function u(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[s,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(s)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:s})),[e,n,u,s])}function d(e){let{children:t}=e;const n=u();return r.createElement(c.Provider,{value:n},t)}function f(){const e=r.useContext(c);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>l,M:()=>s});var r=n(7294),a=n(2263),o=n(1980);const i="q";function l(){return(0,o.Nc)(i)}function s(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,a.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function c(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>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",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:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},3438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>x,Wl:()=>m,_F:()=>v,cE:()=>f,hI:()=>_,jA:()=>g,lO:()=>k,oz:()=>E,s1:()=>w,vY:()=>S,xz:()=>p});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(4477),c=n(1116),u=n(7392),d=n(8596);const f=!!i._r;function p(e){const t=(0,s.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function m(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=m(t);if(e)return e}}}function g(){const{pathname:e}=(0,a.TH)(),t=(0,c.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||b(e.items,t))}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,a].filter(Boolean))),[t,n,a])}function E(e,t){const n=k(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=k(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- ${(0,u.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:c}}function x(e){return e.filter((e=>"category"!==e.type||!!m(e)))}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(2263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>c,Rb:()=>l,_X:()=>s});var r=n(7294),a=n(6550),o=n(1688),i=n(902);function l(e){!function(e){const t=(0,a.k6)(),n=(0,i.zX)(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,a.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function c(e){const t=s(e)??"",n=function(){const e=(0,a.k6)();return(0,r.useCallback)(((t,n,r)=>{const a=new URLSearchParams(e.location.search);n?a.set(t,n):a.delete(t),(r?.push?e.push:e.replace)({search:a.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),c=n(2128);function u(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const u=(0,c.p)(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return 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 s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8022:(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,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>s,RF:()=>d,o5:()=>f});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(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 r.createElement(l.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=c(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:a}}function p(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"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 a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(a-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),a=n(2263),o=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>u});var r=n(7294),a=n(1688);const o="localStorage";function i(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function l(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 c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(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=l(t?.persistence);return null===n?c:{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),i({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),i({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),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,a.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(7294),a=n(8022),o=n(4996),i=n(6278);function l(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.F)(t,o.href))return r;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(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[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,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(a,o)}},4143:(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]}},8780: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 a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(a&&(a+=" "),a+=n);else for(t in e)e[t]&&(a&&(a+=" "),a+=t);return a}n.d(t,{Z:()=>a});const a=function(){for(var e,t,n=0,a="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(a&&(a+=" "),a+=t);return a}},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>T,ob:()=>p,PP:()=>A,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;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("/")||[],l=e&&a(e),s=t&&a(t),c=l||s;if(e&&a(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,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(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 f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!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 g=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),g||(0,l.Z)(!1);var t,n=window.history,a=(-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,o=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,c=i.forceRefresh,w=void 0!==c&&c,k=i.getUserConfirmation,E=void 0===k?h:k,S=i.keyLength,_=void 0===S?6:S,x=e.basename?d(s(e.basename)):"";function T(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return x&&(o=u(o,x)),p(o,r,n)}function C(){return Math.random().toString(36).substr(2,_)}var A=m();function L(e){(0,r.Z)(z,e),z.length=n.length,A.notifyListeners(z.location,z.action)}function P(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||O(T(e.state))}function N(){O(T(y()))}var I=!1;function O(e){if(I)I=!1,L();else{A.confirmTransitionTo(e,"POP",E,(function(t){t?L({action:"POP",location:e}):function(e){var t=z.location,n=M.indexOf(t.key);-1===n&&(n=0);var r=M.indexOf(e.key);-1===r&&(r=0);var a=n-r;a&&(I=!0,B(a))}(e)}))}}var R=T(y()),M=[R.key];function D(e){return x+f(e)}function B(e){n.go(e)}var F=0;function $(e){1===(F+=e)&&1===e?(window.addEventListener(b,P),o&&window.addEventListener(v,N)):0===F&&(window.removeEventListener(b,P),o&&window.removeEventListener(v,N))}var j=!1;var z={length:n.length,action:"POP",location:R,createHref:D,push:function(e,t){var r="PUSH",o=p(e,t,C(),z.location);A.confirmTransitionTo(o,r,E,(function(e){if(e){var t=D(o),i=o.key,l=o.state;if(a)if(n.pushState({key:i,state:l},null,t),w)window.location.href=t;else{var s=M.indexOf(z.location.key),c=M.slice(0,s+1);c.push(o.key),M=c,L({action:r,location:o})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,C(),z.location);A.confirmTransitionTo(o,r,E,(function(e){if(e){var t=D(o),i=o.key,l=o.state;if(a)if(n.replaceState({key:i,state:l},null,t),w)window.location.replace(t);else{var s=M.indexOf(z.location.key);-1!==s&&(M[s]=o.key),L({action:r,location:o})}else window.location.replace(t)}}))},go:B,goBack:function(){B(-1)},goForward:function(){B(1)},block:function(e){void 0===e&&(e=!1);var t=A.setPrompt(e);return j||($(1),j=!0),function(){return j&&(j=!1,$(-1)),t()}},listen:function(e){var t=A.appendListener(e);return $(1),function(){$(-1),t()}}};return z}var k="hashchange",E={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:s},slash:{encodePath:s,decodePath:s}};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 x(e){window.location.replace(S(window.location.href)+"#"+e)}function T(e){void 0===e&&(e={}),g||(0,l.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,o=void 0===a?h:a,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(s(e.basename)):"",v=E[c],y=v.encodePath,w=v.decodePath;function T(){var e=w(_());return b&&(e=u(e,b)),p(e)}var C=m();function A(e){(0,r.Z)(j,e),j.length=t.length,C.notifyListeners(j.location,j.action)}var L=!1,P=null;function N(){var e,t,n=_(),r=y(n);if(n!==r)x(r);else{var a=T(),i=j.location;if(!L&&(t=a,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(P===f(a))return;P=null,function(e){if(L)L=!1,A();else{var t="POP";C.confirmTransitionTo(e,t,o,(function(n){n?A({action:t,location:e}):function(e){var t=j.location,n=M.lastIndexOf(f(t));-1===n&&(n=0);var r=M.lastIndexOf(f(e));-1===r&&(r=0);var a=n-r;a&&(L=!0,D(a))}(e)}))}}(a)}}var I=_(),O=y(I);I!==O&&x(O);var R=T(),M=[f(R)];function D(e){t.go(e)}var B=0;function F(e){1===(B+=e)&&1===e?window.addEventListener(k,N):0===B&&window.removeEventListener(k,N)}var $=!1;var j={length:t.length,action:"POP",location:R,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+y(b+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,j.location);C.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=y(b+t);if(_()!==a){P=t,function(e){window.location.hash=e}(a);var o=M.lastIndexOf(f(j.location)),i=M.slice(0,o+1);i.push(t),M=i,A({action:n,location:r})}else A()}}))},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,j.location);C.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=y(b+t);_()!==a&&(P=t,x(a));var o=M.indexOf(f(j.location));-1!==o&&(M[o]=t),A({action:n,location:r})}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=C.setPrompt(e);return $||(F(1),$=!0),function(){return $&&($=!1,F(-1)),t()}},listen:function(e){var t=C.appendListener(e);return F(1),function(){F(-1),t()}}};return j}function C(e,t,n){return Math.min(Math.max(e,t),n)}function A(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,l=void 0===i?0:i,s=t.keyLength,c=void 0===s?6:s,u=m();function d(e){(0,r.Z)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function g(){return Math.random().toString(36).substr(2,c)}var h=C(l,0,o.length-1),b=o.map((function(e){return p(e,void 0,"string"==typeof e?g():e.key||g())})),v=f;function y(e){var t=C(w.index+e,0,w.entries.length-1),r=w.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:b.length,action:"POP",location:b[h],index:h,entries:b,createHref:v,push:function(e,t){var r="PUSH",a=p(e,t,g(),w.location);u.confirmTransitionTo(a,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},8679:(e,t,n)=>{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={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},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h<i.length;++h){var b=i[h];if(!(o[b]||r&&r[b]||g&&g[b]||l&&l[b])){var v=f(n,b);try{c(t,b,v)}catch(y){}}}}return t}},1143:e=>{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=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,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},7439:(e,t,n)=>{"use strict";n.r(t)},2497:(e,t,n)=>{"use strict";n.r(t)},7800:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;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 a(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}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=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{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)*a(Math.random()*t,.1,.95)),t=a(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 a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),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&&p(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 l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=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,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s<arguments.length;s++){for(var c in o=Object(arguments[s]))n.call(o,c)&&(l[c]=o[c]);if(t){i=t(o);for(var u=0;u<i.length;u++)r.call(o,i[u])&&(l[i[u]]=o[i[u]])}}return l}},7410:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(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 a,o;switch(n=n||{},r.util.type(t)){case"Object":if(o=r.util.objId(t),n[o])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return o=r.util.objId(t),n[o]?n[o]:(a=[],n[o]=a,t.forEach((function(t,r){a[r]=e(t,n)})),a);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 a=e.classList;if(a.contains(t))return!0;if(a.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 a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var s in n)n.hasOwnProperty(s)&&(i[s]=n[s]);n.hasOwnProperty(l)||(i[l]=o[l])}var c=a[e];return a[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var l in t)if(t.hasOwnProperty(l)){n.call(t,l,t[l],a||l);var s=t[l],c=r.util.type(s);"Object"!==c||o[i(s)]?"Array"!==c||o[i(s)]||(o[i(s)]=!0,e(s,n,l,o)):(o[i(s)]=!0,e(s,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return r.hooks.run("before-tokenize",o),o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var a=new l;return s(a,a.head,e),i(e,a,t,a.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(a)},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 a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(e,t,n,l,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var m=0;m<p.length;++m){if(d&&d.cause==f+","+m)return;var g=p[m],h=g.inside,b=!!g.lookbehind,v=!!g.greedy,y=g.alias;if(v&&!g.pattern.global){var w=g.pattern.toString().match(/[imsuy]*$/)[0];g.pattern=RegExp(g.pattern.source,w+"g")}for(var k=g.pattern||g,E=l.next,S=u;E!==t.tail&&!(d&&S>=d.reach);S+=E.value.length,E=E.next){var _=E.value;if(t.length>e.length)return;if(!(_ instanceof a)){var x,T=1;if(v){if(!(x=o(k,S,e,b))||x.index>=e.length)break;var C=x.index,A=x.index+x[0].length,L=S;for(L+=E.value.length;C>=L;)L+=(E=E.next).value.length;if(S=L-=E.value.length,E.value instanceof a)continue;for(var P=E;P!==t.tail&&(L<A||"string"==typeof P.value);P=P.next)T++,L+=P.value.length;T--,_=e.slice(S,L),x.index-=S}else if(!(x=o(k,0,_,b)))continue;C=x.index;var N=x[0],I=_.slice(0,C),O=_.slice(C+N.length),R=S+_.length;d&&R>d.reach&&(d.reach=R);var M=E.prev;if(I&&(M=s(t,M,I),S+=I.length),c(t,M,T),E=s(t,M,new a(f,h?r.tokenize(N,h):N,y,N)),O&&s(t,E,O),T>1){var D={cause:f+","+m,reach:R};i(e,t,n,E.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function l(){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 s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var o={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(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var l="";for(var s in o.attributes)l+=" "+s+'="'+(o.attributes[s]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+l+">"+o.content+"</"+o.tag+">"},r}(),a=r;r.default=r,a.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"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var r={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.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:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.shell=e.languages.bash}(a),a.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:/[{}[\];(),.:]/},a.languages.c=a.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|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.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},a.languages.c.string],char:a.languages.c.char,comment:a.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:a.languages.c}}}}),a.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 a.languages.c.boolean,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"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,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;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;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("\\[(?:[^[\\]\"']|"+n.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":[n,{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}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={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|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:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.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}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.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:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.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:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.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:a.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"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.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")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],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"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\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})),o=/"(?:[^"\\\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"(?:"+a+"|"+o+")"}))),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(o),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}(a),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,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;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("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),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 a=t[n];if("code"===a.type){var o=a.content[1],i=a.content[3];if(o&&i&&"code-language"===o.type&&"code-block"===i.type&&"string"==typeof o.content){var l=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),s="language-"+(l=(/[a-z][\w-]*/i.exec(l)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,s]:i.alias.push(s):i.alias=[s]}}else e(a.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,a=t.classes.length;r<a;r++){var o=t.classes[r],c=/language-(.+)/.exec(o);if(c){n=c[1];break}}var u,d=e.languages[n];if(d)t.content=e.highlight((u=t.content,u.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),s(n);var r=l[t];return r||e}))),d,n);else if(n&&"none"!==n&&e.plugins.autoloader){var f="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=f,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(f);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var i=RegExp(e.languages.markup.tag.pattern.source,"gi"),l={amp:"&",lt:"<",gt:">",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.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:a.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+/},a.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 a=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),a.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),a.length>0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s<l;s++){var c=t[s];"variable"===c.type&&a.indexOf(c.content)>=0&&p(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!1}return!0}function f(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],l=i.content;if("punctuation"===i.type&&"string"==typeof l)if(e.test(l))a++;else if(r.test(l)&&0===--a)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),a.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,a=r.inside["interpolation-punctuation"],o=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 l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return u[n]=a,n})).join(""),n,r),f=Object.keys(u);return i=0,function e(t){for(var n=0;n<t.length;n++){if(i>=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,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 d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r<a;r++){var o=n[r];if("string"!=typeof o){var i=o.content;if(Array.isArray(i))if("template-string"===o.type){var l=i[1];if(3===i.length&&"string"!=typeof l&&"embedded-code"===l.type){var s=f(l),c=l.alias,d=Array.isArray(c)?c[0]:c,p=e.languages[d];if(!p)continue;i[1]=u(s,p,d)}}else t(i);else"string"!=typeof i&&t([i])}}}(t.tokens)}))}(a),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}(a),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 a=n[r],o=e.languages.javascript[a];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[a]={pattern:o});var i=o.inside||{};o.inside=i,i["maybe-class-name"]=/^[A-Z][\s\S]*/}}(a),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\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:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r<t.length;r++){var a=t[r],o=!1;if("string"!=typeof a&&("tag"===a.type&&a.content[0]&&"tag"===a.content[0].type?"</"===a.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(s+=i(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.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/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s<l.length&&!(a>=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.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 a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.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:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.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/}),a.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 a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?: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|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)\b/i,{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,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},5795:()=>{Prism.languages.ada={comment:/--.*/,string:/"(?:""|[^"\r\f\n])*"/,number:[{pattern:/\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i},{pattern:/\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i}],attribute:{pattern:/\b'\w+/,alias:"attr-name"},keyword:/\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,boolean:/\b(?:false|true)\b/i,operator:/<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,punctuation:/\.\.?|[,;():]/,char:/'.'/,variable:/\b[a-z](?:\w)*\b/i}},7874:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.sh=e.languages.bash,e.languages.shell=e.languages.bash}(Prism)},9016:()=>{!function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,r){return RegExp(t(e,n),r||"")}function r(e,t){for(var n=0;n<t;n++)e=e.replace(/<<self>>/g,(function(){return"(?:"+e+")"}));return e.replace(/<<self>>/g,"[^\\s\\S]")}var a="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",o="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",l="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function s(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var c=s(o),u=RegExp(s(a+" "+o+" "+i+" "+l)),d=s(o+" "+i+" "+l),f=s(a+" "+o+" "+l),p=r(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source,2),m=r(/\((?:[^()]|<<self>>)*\)/.source,2),g=/@?\b[A-Za-z_]\w*\b/.source,h=t(/<<0>>(?:\s*<<1>>)?/.source,[g,p]),b=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,h]),v=/\[\s*(?:,\s*)*\]/.source,y=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[b,v]),w=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,m,v]),k=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[w]),E=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[k,b,v]),S={keyword:u,punctuation:/[<>()?,.:[\]]/},_=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,x=/"(?:\\.|[^\\"\r\n])*"/.source,T=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[T]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[x]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[b]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[g,E]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[g]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[c,h]),lookbehind:!0,inside:S},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[b]),lookbehind:!0,inside:S},{pattern:n(/(\bwhere\s+)<<0>>/.source,[g]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[y]),lookbehind:!0,inside:S},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[E,f,g]),inside:S}],keyword:u,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[g]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[g]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[m]),lookbehind:!0,alias:"class-name",inside:S},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[E,b]),inside:S,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[E]),lookbehind:!0,inside:S,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[g,p]),inside:{function:n(/^<<0>>/.source,[g]),generic:{pattern:RegExp(p),alias:"class-name",inside:S}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[c,h,g,E,u.source,m,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[h,m]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:u,"class-name":{pattern:RegExp(E),greedy:!0,inside:S},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var C=x+"|"+_,A=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[C]),L=r(t(/[^"'/()]|<<0>>|\(<<self>>*\)/.source,[A]),2),P=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,N=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[b,L]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[P,N]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[P]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[L]),inside:e.languages.csharp},"class-name":{pattern:RegExp(b),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var I=/:[^}\r\n]+/.source,O=r(t(/[^"'/()]|<<0>>|\(<<self>>*\)/.source,[A]),2),R=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[O,I]),M=r(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source,[C]),2),D=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[M,I]);function B(t,r){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[r,I]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[R]),lookbehind:!0,greedy:!0,inside:B(R,O)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[D]),lookbehind:!0,greedy:!0,inside:B(D,M)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism)},397:()=>{!function(e){var t="(?:"+[/[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,/-?(?:\.\d+|\d+(?:\.\d*)?)/.source,/"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,/<(?:[^<>]|(?!<!--)<(?:[^<>"']|"[^"]*"|'[^']*')+>|<!--(?:[^-]|-(?!->))*-->)*>/.source].join("|")+")",n={markup:{pattern:/(^<)[\s\S]+(?=>$)/,lookbehind:!0,alias:["language-markup","language-html","language-xml"],inside:e.languages.markup}};function r(e,n){return RegExp(e.replace(/<ID>/g,(function(){return t})),n)}e.languages.dot={comment:{pattern:/\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,greedy:!0},"graph-name":{pattern:r(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)<ID>/.source,"i"),lookbehind:!0,greedy:!0,alias:"class-name",inside:n},"attr-value":{pattern:r(/(=[ \t\r\n]*)<ID>/.source),lookbehind:!0,greedy:!0,inside:n},"attr-name":{pattern:r(/([\[;, \t\r\n])<ID>(?=[ \t\r\n]*=)/.source),lookbehind:!0,greedy:!0,inside:n},keyword:/\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,"compass-point":{pattern:/(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,lookbehind:!0,alias:"builtin"},node:{pattern:r(/(^|[^-.\w\x80-\uFFFF\\])<ID>/.source),lookbehind:!0,greedy:!0,inside:n},operator:/[=:]|-[->]/,punctuation:/[\[\]{};,]/},e.languages.gv=e.languages.dot}(Prism)},1295:()=>{Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,lookbehind:!0},char:{pattern:/'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,alias:"string"},string:{pattern:/"(?:[^\\"]|\\(?:\S|\s+\\))*"/,greedy:!0},keyword:/\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,"import-statement":{pattern:/(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,lookbehind:!0,inside:{keyword:/\b(?:as|hiding|import|qualified)\b/,punctuation:/\./}},builtin:/\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:[{pattern:/`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,greedy:!0},{pattern:/(\s)\.(?=\s)/,lookbehind:!0},/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/],hvariable:{pattern:/\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,inside:{punctuation:/\./}},constant:{pattern:/\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,inside:{punctuation:/\./}},punctuation:/[{}[\];(),.:]/},Prism.languages.hs=Prism.languages.haskell},2503:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},8704:()=>{Prism.languages.nix={comment:{pattern:/\/\*[\s\S]*?\*\/|#.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,greedy:!0,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,lookbehind:!0,inside:null}}},url:[/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,{pattern:/([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\$(?=\{)/,alias:"important"},number:/\b\d+\b/,keyword:/\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,function:/\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,boolean:/\b(?:false|true)\b/,operator:/[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,punctuation:/[{}()[\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside=Prism.languages.nix},3210:()=>{Prism.languages.pascal={directive:{pattern:/\{\$[\s\S]*?\}/,greedy:!0,alias:["marco","property"]},comment:{pattern:/\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,greedy:!0},string:{pattern:/(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,greedy:!0},asm:{pattern:/(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,lookbehind:!0,greedy:!0,inside:null},keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/(?:[&%]\d+|\$[a-f\d]+)/i,/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/},Prism.languages.pascal.asm.inside=Prism.languages.extend("pascal",{asm:void 0,keyword:void 0,operator:void 0}),Prism.languages.objectpascal=Prism.languages.pascal},9385:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},767:()=>{!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}(Prism)},9462:(e,t,n)=>{var r={"./prism-ada":5795,"./prism-bash":7874,"./prism-csharp":9016,"./prism-dot":397,"./prism-haskell":1295,"./prism-java":2503,"./prism-nix":8704,"./prism-pascal":3210,"./prism-ruby":9385,"./prism-rust":767};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=9462},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=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 l.name="Invariant Violation",l}}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:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(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."}if(!r)throw Error(i(227));var l=new Set,s={};function c(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(s[e]=t,e=0;e<t.length;e++)l.add(t[e])}var d=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),f=/^[: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]*$/,p=Object.prototype.hasOwnProperty,m={},g={};function h(e,t,n,r,a,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[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];b[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[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){b[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function w(e,t,n,r){var a=b.hasOwnProperty(t)?b[t]:null;(null!==a?0===a.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,a,r)&&(n=null),r||null===a?function(e){return!!p.call(g,e)||!p.call(m,e)&&(f.test(e)?g[e]=!0:(m[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=null===n?3!==a.type&&"":n:(t=a.attributeName,r=a.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(a=a.type)||4===a&&!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(v,y);b[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(v,y);b[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(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var k=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,E=60103,S=60106,_=60107,x=60108,T=60114,C=60109,A=60110,L=60112,P=60113,N=60120,I=60115,O=60116,R=60121,M=60128,D=60129,B=60130,F=60131;if("function"==typeof Symbol&&Symbol.for){var $=Symbol.for;E=$("react.element"),S=$("react.portal"),_=$("react.fragment"),x=$("react.strict_mode"),T=$("react.profiler"),C=$("react.provider"),A=$("react.context"),L=$("react.forward_ref"),P=$("react.suspense"),N=$("react.suspense_list"),I=$("react.memo"),O=$("react.lazy"),R=$("react.block"),$("react.scope"),M=$("react.opaque.id"),D=$("react.debug_trace_mode"),B=$("react.offscreen"),F=$("react.legacy_hidden")}var j,z="function"==typeof Symbol&&Symbol.iterator;function U(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=z&&e[z]||e["@@iterator"])?e:null}function Z(e){if(void 0===j)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);j=t&&t[1]||""}return"\n"+j+e}var H=!1;function G(e,t){if(!e||H)return"";H=!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(s){var r=s}Reflect.construct(e,[],t)}else{try{t.call()}catch(s){r=s}e.call(t.prototype)}else{try{throw Error()}catch(s){r=s}e()}}catch(s){if(s&&r&&"string"==typeof s.stack){for(var a=s.stack.split("\n"),o=r.stack.split("\n"),i=a.length-1,l=o.length-1;1<=i&&0<=l&&a[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(a[i]!==o[l]){if(1!==i||1!==l)do{if(i--,0>--l||a[i]!==o[l])return"\n"+a[i].replace(" at new "," at ")}while(1<=i&&0<=l);break}}}finally{H=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Z(e):""}function V(e){switch(e.tag){case 5:return Z(e.type);case 16:return Z("Lazy");case 13:return Z("Suspense");case 19:return Z("SuspenseList");case 0:case 2:case 15:return e=G(e.type,!1);case 11:return e=G(e.type.render,!1);case 22:return e=G(e.type._render,!1);case 1:return e=G(e.type,!0);default:return""}}function W(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 _:return"Fragment";case S:return"Portal";case T:return"Profiler";case x:return"StrictMode";case P:return"Suspense";case N:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case C:return(e._context.displayName||"Context")+".Provider";case L:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case I:return W(e.type);case R:return W(e._render);case O:t=e._payload,e=e._init;try{return W(e(t))}catch(n){}}return null}function q(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function Y(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function K(e){e._valueTracker||(e._valueTracker=function(e){var t=Y(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 a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.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 X(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Y(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(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 J(e,t){var n=t.checked;return a({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=q(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 te(e,t){null!=(t=t.checked)&&w(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=q(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")?ae(e,t.type,n):t.hasOwnProperty("defaultValue")&&ae(e,t.type,q(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function re(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 ae(e,t,n){"number"===t&&Q(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=a({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ie(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+q(n),t=null,a=0;a<e.length;a++){if(e[a].value===n)return e[a].selected=!0,void(r&&(e[a].defaultSelected=!0));null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function le(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return a({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function se(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:q(n)}}function ce(e,t){var n=q(t.value),r=q(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 ue(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function fe(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 pe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?fe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var me,ge,he=(ge=function(e,t){if(e.namespaceURI!==de.svg||"innerHTML"in e)e.innerHTML=t;else{for((me=me||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=me.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 ge(e,t)}))}:ge);function be(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 ve={animationIterationCount:!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},ye=["Webkit","ms","Moz","O"];function we(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ve.hasOwnProperty(e)&&ve[e]?(""+t).trim():t+"px"}function ke(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),a=we(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}Object.keys(ve).forEach((function(e){ye.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ve[t]=ve[e]}))}));var Ee=a({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 Se(e,t){if(t){if(Ee[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function _e(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}}function xe(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Te=null,Ce=null,Ae=null;function Le(e){if(e=na(e)){if("function"!=typeof Te)throw Error(i(280));var t=e.stateNode;t&&(t=aa(t),Te(e.stateNode,e.type,t))}}function Pe(e){Ce?Ae?Ae.push(e):Ae=[e]:Ce=e}function Ne(){if(Ce){var e=Ce,t=Ae;if(Ae=Ce=null,Le(e),t)for(e=0;e<t.length;e++)Le(t[e])}}function Ie(e,t){return e(t)}function Oe(e,t,n,r,a){return e(t,n,r,a)}function Re(){}var Me=Ie,De=!1,Be=!1;function Fe(){null===Ce&&null===Ae||(Re(),Ne())}function $e(e,t){var n=e.stateNode;if(null===n)return null;var r=aa(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(i(231,t,typeof n));return n}var je=!1;if(d)try{var ze={};Object.defineProperty(ze,"passive",{get:function(){je=!0}}),window.addEventListener("test",ze,ze),window.removeEventListener("test",ze,ze)}catch(ge){je=!1}function Ue(e,t,n,r,a,o,i,l,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var Ze=!1,He=null,Ge=!1,Ve=null,We={onError:function(e){Ze=!0,He=e}};function qe(e,t,n,r,a,o,i,l,s){Ze=!1,He=null,Ue.apply(We,arguments)}function Ye(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Ke(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 Xe(e){if(Ye(e)!==e)throw Error(i(188))}function Qe(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ye(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var o=a.alternate;if(null===o){if(null!==(r=a.return)){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return Xe(a),e;if(o===r)return Xe(a),t;o=o.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=o;else{for(var l=!1,s=a.child;s;){if(s===n){l=!0,n=a,r=o;break}if(s===r){l=!0,r=a,n=o;break}s=s.sibling}if(!l){for(s=o.child;s;){if(s===n){l=!0,n=o,r=a;break}if(s===r){l=!0,r=o,n=a;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function Je(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var et,tt,nt,rt,at=!1,ot=[],it=null,lt=null,st=null,ct=new Map,ut=new Map,dt=[],ft="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 pt(e,t,n,r,a){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:a,targetContainers:[r]}}function mt(e,t){switch(e){case"focusin":case"focusout":it=null;break;case"dragenter":case"dragleave":lt=null;break;case"mouseover":case"mouseout":st=null;break;case"pointerover":case"pointerout":ct.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ut.delete(t.pointerId)}}function gt(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e=pt(t,n,r,a,o),null!==t&&(null!==(t=na(t))&&tt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a),e)}function ht(e){var t=ta(e.target);if(null!==t){var n=Ye(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ke(n)))return e.blockedOn=t,void rt(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){nt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function bt(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=na(n))&&tt(t),e.blockedOn=n,!1;t.shift()}return!0}function vt(e,t,n){bt(e)&&n.delete(t)}function yt(){for(at=!1;0<ot.length;){var e=ot[0];if(null!==e.blockedOn){null!==(e=na(e.blockedOn))&&et(e);break}for(var t=e.targetContainers;0<t.length;){var n=Qt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&ot.shift()}null!==it&&bt(it)&&(it=null),null!==lt&&bt(lt)&&(lt=null),null!==st&&bt(st)&&(st=null),ct.forEach(vt),ut.forEach(vt)}function wt(e,t){e.blockedOn===t&&(e.blockedOn=null,at||(at=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,yt)))}function kt(e){function t(t){return wt(t,e)}if(0<ot.length){wt(ot[0],e);for(var n=1;n<ot.length;n++){var r=ot[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==it&&wt(it,e),null!==lt&&wt(lt,e),null!==st&&wt(st,e),ct.forEach(t),ut.forEach(t),n=0;n<dt.length;n++)(r=dt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<dt.length&&null===(n=dt[0]).blockedOn;)ht(n),null===n.blockedOn&&dt.shift()}function Et(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var St={animationend:Et("Animation","AnimationEnd"),animationiteration:Et("Animation","AnimationIteration"),animationstart:Et("Animation","AnimationStart"),transitionend:Et("Transition","TransitionEnd")},_t={},xt={};function Tt(e){if(_t[e])return _t[e];if(!St[e])return e;var t,n=St[e];for(t in n)if(n.hasOwnProperty(t)&&t in xt)return _t[e]=n[t];return e}d&&(xt=document.createElement("div").style,"AnimationEvent"in window||(delete St.animationend.animation,delete St.animationiteration.animation,delete St.animationstart.animation),"TransitionEvent"in window||delete St.transitionend.transition);var Ct=Tt("animationend"),At=Tt("animationiteration"),Lt=Tt("animationstart"),Pt=Tt("transitionend"),Nt=new Map,It=new Map,Ot=["abort","abort",Ct,"animationEnd",At,"animationIteration",Lt,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Pt,"transitionEnd","waiting","waiting"];function Rt(e,t){for(var n=0;n<e.length;n+=2){var r=e[n],a=e[n+1];a="on"+(a[0].toUpperCase()+a.slice(1)),It.set(r,t),Nt.set(r,a),c(a,[r])}}(0,o.unstable_now)();var Mt=8;function Dt(e){if(0!=(1&e))return Mt=15,1;if(0!=(2&e))return Mt=14,2;if(0!=(4&e))return Mt=13,4;var t=24&e;return 0!==t?(Mt=12,t):0!=(32&e)?(Mt=11,32):0!==(t=192&e)?(Mt=10,t):0!=(256&e)?(Mt=9,256):0!==(t=3584&e)?(Mt=8,t):0!=(4096&e)?(Mt=7,4096):0!==(t=4186112&e)?(Mt=6,t):0!==(t=62914560&e)?(Mt=5,t):67108864&e?(Mt=4,67108864):0!=(134217728&e)?(Mt=3,134217728):0!==(t=805306368&e)?(Mt=2,t):0!=(1073741824&e)?(Mt=1,1073741824):(Mt=8,e)}function Bt(e,t){var n=e.pendingLanes;if(0===n)return Mt=0;var r=0,a=0,o=e.expiredLanes,i=e.suspendedLanes,l=e.pingedLanes;if(0!==o)r=o,a=Mt=15;else if(0!==(o=134217727&n)){var s=o&~i;0!==s?(r=Dt(s),a=Mt):0!==(l&=o)&&(r=Dt(l),a=Mt)}else 0!==(o=n&~i)?(r=Dt(o),a=Mt):0!==l&&(r=Dt(l),a=Mt);if(0===r)return 0;if(r=n&((0>(r=31-Zt(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0==(t&i)){if(Dt(t),a<=Mt)return t;Mt=a}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)a=1<<(n=31-Zt(t)),r|=e[n],t&=~a;return r}function Ft(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function $t(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=jt(24&~t))?$t(10,t):e;case 10:return 0===(e=jt(192&~t))?$t(8,t):e;case 8:return 0===(e=jt(3584&~t))&&(0===(e=jt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=jt(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function jt(e){return e&-e}function zt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ut(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-Zt(t)]=n}var Zt=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ht(e)/Gt|0)|0},Ht=Math.log,Gt=Math.LN2;var Vt=o.unstable_UserBlockingPriority,Wt=o.unstable_runWithPriority,qt=!0;function Yt(e,t,n,r){De||Re();var a=Xt,o=De;De=!0;try{Oe(a,e,t,n,r)}finally{(De=o)||Fe()}}function Kt(e,t,n,r){Wt(Vt,Xt.bind(null,e,t,n,r))}function Xt(e,t,n,r){var a;if(qt)if((a=0==(4&t))&&0<ot.length&&-1<ft.indexOf(e))e=pt(null,e,t,n,r),ot.push(e);else{var o=Qt(e,t,n,r);if(null===o)a&&mt(e,r);else{if(a){if(-1<ft.indexOf(e))return e=pt(o,e,t,n,r),void ot.push(e);if(function(e,t,n,r,a){switch(t){case"focusin":return it=gt(it,e,t,n,r,a),!0;case"dragenter":return lt=gt(lt,e,t,n,r,a),!0;case"mouseover":return st=gt(st,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return ct.set(o,gt(ct.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,ut.set(o,gt(ut.get(o)||null,e,t,n,r,a)),!0}return!1}(o,e,t,n,r))return;mt(e,r)}Rr(e,t,r,null,n)}}}function Qt(e,t,n,r){var a=xe(r);if(null!==(a=ta(a))){var o=Ye(a);if(null===o)a=null;else{var i=o.tag;if(13===i){if(null!==(a=Ke(o)))return a;a=null}else if(3===i){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;a=null}else o!==a&&(a=null)}}return Rr(e,t,r,a,n),null}var Jt=null,en=null,tn=null;function nn(){if(tn)return tn;var e,t,n=en,r=n.length,a="value"in Jt?Jt.value:Jt.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return tn=a.slice(e,1<t?1-t:void 0)}function rn(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 an(){return!0}function on(){return!1}function ln(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?an:on,this.isPropagationStopped=on,this}return a(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=an)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=an)},persist:function(){},isPersistent:an}),t}var sn,cn,un,dn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},fn=ln(dn),pn=a({},dn,{view:0,detail:0}),mn=ln(pn),gn=a({},pn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Cn,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!==un&&(un&&"mousemove"===e.type?(sn=e.screenX-un.screenX,cn=e.screenY-un.screenY):cn=sn=0,un=e),sn)},movementY:function(e){return"movementY"in e?e.movementY:cn}}),hn=ln(gn),bn=ln(a({},gn,{dataTransfer:0})),vn=ln(a({},pn,{relatedTarget:0})),yn=ln(a({},dn,{animationName:0,elapsedTime:0,pseudoElement:0})),wn=a({},dn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),kn=ln(wn),En=ln(a({},dn,{data:0})),Sn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},_n={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"},xn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Tn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=xn[e])&&!!t[e]}function Cn(){return Tn}var An=a({},pn,{key:function(e){if(e.key){var t=Sn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=rn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?_n[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Cn,charCode:function(e){return"keypress"===e.type?rn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?rn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Ln=ln(An),Pn=ln(a({},gn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Nn=ln(a({},pn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Cn})),In=ln(a({},dn,{propertyName:0,elapsedTime:0,pseudoElement:0})),On=a({},gn,{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}),Rn=ln(On),Mn=[9,13,27,32],Dn=d&&"CompositionEvent"in window,Bn=null;d&&"documentMode"in document&&(Bn=document.documentMode);var Fn=d&&"TextEvent"in window&&!Bn,$n=d&&(!Dn||Bn&&8<Bn&&11>=Bn),jn=String.fromCharCode(32),zn=!1;function Un(e,t){switch(e){case"keyup":return-1!==Mn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Zn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Hn=!1;var Gn={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 Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Gn[e.type]:"textarea"===t}function Wn(e,t,n,r){Pe(r),0<(t=Dr(t,"onChange")).length&&(n=new fn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var qn=null,Yn=null;function Kn(e){Ar(e,0)}function Xn(e){if(X(ra(e)))return e}function Qn(e,t){if("change"===e)return t}var Jn=!1;if(d){var er;if(d){var tr="oninput"in document;if(!tr){var nr=document.createElement("div");nr.setAttribute("oninput","return;"),tr="function"==typeof nr.oninput}er=tr}else er=!1;Jn=er&&(!document.documentMode||9<document.documentMode)}function rr(){qn&&(qn.detachEvent("onpropertychange",ar),Yn=qn=null)}function ar(e){if("value"===e.propertyName&&Xn(Yn)){var t=[];if(Wn(t,Yn,e,xe(e)),e=Kn,De)e(t);else{De=!0;try{Ie(e,t)}finally{De=!1,Fe()}}}}function or(e,t,n){"focusin"===e?(rr(),Yn=n,(qn=t).attachEvent("onpropertychange",ar)):"focusout"===e&&rr()}function ir(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Xn(Yn)}function lr(e,t){if("click"===e)return Xn(t)}function sr(e,t){if("input"===e||"change"===e)return Xn(t)}var cr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},ur=Object.prototype.hasOwnProperty;function dr(e,t){if(cr(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++)if(!ur.call(t,n[r])||!cr(e[n[r]],t[n[r]]))return!1;return!0}function fr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function pr(e,t){var n,r=fr(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=fr(r)}}function mr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?mr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function gr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function hr(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)}var br=d&&"documentMode"in document&&11>=document.documentMode,vr=null,yr=null,wr=null,kr=!1;function Er(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;kr||null==vr||vr!==Q(r)||("selectionStart"in(r=vr)&&hr(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},wr&&dr(wr,r)||(wr=r,0<(r=Dr(yr,"onSelect")).length&&(t=new fn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}Rt("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),Rt("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),Rt(Ot,2);for(var Sr="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),_r=0;_r<Sr.length;_r++)It.set(Sr[_r],0);u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),c("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),c("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),c("onBeforeInput",["compositionend","keypress","textInput","paste"]),c("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var xr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Tr=new Set("cancel close invalid load scroll toggle".split(" ").concat(xr));function Cr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,a,o,l,s,c){if(qe.apply(this,arguments),Ze){if(!Ze)throw Error(i(198));var u=He;Ze=!1,He=null,Ge||(Ge=!0,Ve=u)}}(r,t,void 0,e),e.currentTarget=null}function Ar(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var l=r[i],s=l.instance,c=l.currentTarget;if(l=l.listener,s!==o&&a.isPropagationStopped())break e;Cr(a,l,c),o=s}else for(i=0;i<r.length;i++){if(s=(l=r[i]).instance,c=l.currentTarget,l=l.listener,s!==o&&a.isPropagationStopped())break e;Cr(a,l,c),o=s}}}if(Ge)throw e=Ve,Ge=!1,Ve=null,e}function Lr(e,t){var n=oa(t),r=e+"__bubble";n.has(r)||(Or(t,e,2,!1),n.add(r))}var Pr="_reactListening"+Math.random().toString(36).slice(2);function Nr(e){e[Pr]||(e[Pr]=!0,l.forEach((function(t){Tr.has(t)||Ir(t,!1,e,null),Ir(t,!0,e,null)})))}function Ir(e,t,n,r){var a=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==r&&!t&&Tr.has(e)){if("scroll"!==e)return;a|=2,o=r}var i=oa(o),l=e+"__"+(t?"capture":"bubble");i.has(l)||(t&&(a|=4),Or(o,e,a,t),i.add(l))}function Or(e,t,n,r){var a=It.get(t);switch(void 0===a?2:a){case 0:a=Yt;break;case 1:a=Kt;break;default:a=Xt}n=a.bind(null,t,n,e),a=void 0,!je||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function Rr(e,t,n,r,a){var o=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 l=r.stateNode.containerInfo;if(l===a||8===l.nodeType&&l.parentNode===a)break;if(4===i)for(i=r.return;null!==i;){var s=i.tag;if((3===s||4===s)&&((s=i.stateNode.containerInfo)===a||8===s.nodeType&&s.parentNode===a))return;i=i.return}for(;null!==l;){if(null===(i=ta(l)))return;if(5===(s=i.tag)||6===s){r=o=i;continue e}l=l.parentNode}}r=r.return}!function(e,t,n){if(Be)return e(t,n);Be=!0;try{return Me(e,t,n)}finally{Be=!1,Fe()}}((function(){var r=o,a=xe(n),i=[];e:{var l=Nt.get(e);if(void 0!==l){var s=fn,c=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":s=Ln;break;case"focusin":c="focus",s=vn;break;case"focusout":c="blur",s=vn;break;case"beforeblur":case"afterblur":s=vn;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":s=hn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=Nn;break;case Ct:case At:case Lt:s=yn;break;case Pt:s=In;break;case"scroll":s=mn;break;case"wheel":s=Rn;break;case"copy":case"cut":case"paste":s=kn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=Pn}var u=0!=(4&t),d=!u&&"scroll"===e,f=u?null!==l?l+"Capture":null:l;u=[];for(var p,m=r;null!==m;){var g=(p=m).stateNode;if(5===p.tag&&null!==g&&(p=g,null!==f&&(null!=(g=$e(m,f))&&u.push(Mr(m,g,p)))),d)break;m=m.return}0<u.length&&(l=new s(l,c,null,n,a),i.push({event:l,listeners:u}))}}if(0==(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(c=n.relatedTarget||n.fromElement)||!ta(c)&&!c[Jr])&&(s||l)&&(l=a.window===a?a:(l=a.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(c=(c=n.relatedTarget||n.toElement)?ta(c):null)&&(c!==(d=Ye(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(s=null,c=r),s!==c)){if(u=hn,g="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(u=Pn,g="onPointerLeave",f="onPointerEnter",m="pointer"),d=null==s?l:ra(s),p=null==c?l:ra(c),(l=new u(g,m+"leave",s,n,a)).target=d,l.relatedTarget=p,g=null,ta(a)===r&&((u=new u(f,m+"enter",c,n,a)).target=p,u.relatedTarget=d,g=u),d=g,s&&c)e:{for(f=c,m=0,p=u=s;p;p=Br(p))m++;for(p=0,g=f;g;g=Br(g))p++;for(;0<m-p;)u=Br(u),m--;for(;0<p-m;)f=Br(f),p--;for(;m--;){if(u===f||null!==f&&u===f.alternate)break e;u=Br(u),f=Br(f)}u=null}else u=null;null!==s&&Fr(i,l,s,u,!1),null!==c&&null!==d&&Fr(i,d,c,u,!0)}if("select"===(s=(l=r?ra(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var h=Qn;else if(Vn(l))if(Jn)h=sr;else{h=ir;var b=or}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(h=lr);switch(h&&(h=h(e,r))?Wn(i,h,n,a):(b&&b(e,l,r),"focusout"===e&&(b=l._wrapperState)&&b.controlled&&"number"===l.type&&ae(l,"number",l.value)),b=r?ra(r):window,e){case"focusin":(Vn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,wr=null);break;case"focusout":wr=yr=vr=null;break;case"mousedown":kr=!0;break;case"contextmenu":case"mouseup":case"dragend":kr=!1,Er(i,n,a);break;case"selectionchange":if(br)break;case"keydown":case"keyup":Er(i,n,a)}var v;if(Dn)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 Hn?Un(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&($n&&"ko"!==n.locale&&(Hn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Hn&&(v=nn()):(en="value"in(Jt=a)?Jt.value:Jt.textContent,Hn=!0)),0<(b=Dr(r,y)).length&&(y=new En(y,e,null,n,a),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=Zn(n))&&(y.data=v))),(v=Fn?function(e,t){switch(e){case"compositionend":return Zn(t);case"keypress":return 32!==t.which?null:(zn=!0,jn);case"textInput":return(e=t.data)===jn&&zn?null:e;default:return null}}(e,n):function(e,t){if(Hn)return"compositionend"===e||!Dn&&Un(e,t)?(e=nn(),tn=en=Jt=null,Hn=!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 $n&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Dr(r,"onBeforeInput")).length&&(a=new En("onBeforeInput","beforeinput",null,n,a),i.push({event:a,listeners:r}),a.data=v))}Ar(i,t)}))}function Mr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Dr(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;5===a.tag&&null!==o&&(a=o,null!=(o=$e(e,n))&&r.unshift(Mr(e,o,a)),null!=(o=$e(e,t))&&r.push(Mr(e,o,a))),e=e.return}return r}function Br(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Fr(e,t,n,r,a){for(var o=t._reactName,i=[];null!==n&&n!==r;){var l=n,s=l.alternate,c=l.stateNode;if(null!==s&&s===r)break;5===l.tag&&null!==c&&(l=c,a?null!=(s=$e(n,o))&&i.unshift(Mr(n,s,l)):a||null!=(s=$e(n,o))&&i.push(Mr(n,s,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function $r(){}var jr=null,zr=null;function Ur(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function Zr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Hr="function"==typeof setTimeout?setTimeout:void 0,Gr="function"==typeof clearTimeout?clearTimeout:void 0;function Vr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function Wr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function qr(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 Yr=0;var Kr=Math.random().toString(36).slice(2),Xr="__reactFiber$"+Kr,Qr="__reactProps$"+Kr,Jr="__reactContainer$"+Kr,ea="__reactEvents$"+Kr;function ta(e){var t=e[Xr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Xr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=qr(e);null!==e;){if(n=e[Xr])return n;e=qr(e)}return t}n=(e=n).parentNode}return null}function na(e){return!(e=e[Xr]||e[Jr])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ra(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function aa(e){return e[Qr]||null}function oa(e){var t=e[ea];return void 0===t&&(t=e[ea]=new Set),t}var ia=[],la=-1;function sa(e){return{current:e}}function ca(e){0>la||(e.current=ia[la],ia[la]=null,la--)}function ua(e,t){la++,ia[la]=e.current,e.current=t}var da={},fa=sa(da),pa=sa(!1),ma=da;function ga(e,t){var n=e.type.contextTypes;if(!n)return da;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a,o={};for(a in n)o[a]=t[a];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function ha(e){return null!=(e=e.childContextTypes)}function ba(){ca(pa),ca(fa)}function va(e,t,n){if(fa.current!==da)throw Error(i(168));ua(fa,t),ua(pa,n)}function ya(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in e))throw Error(i(108,W(t)||"Unknown",o));return a({},n,r)}function wa(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||da,ma=fa.current,ua(fa,e),ua(pa,pa.current),!0}function ka(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=ya(e,t,ma),r.__reactInternalMemoizedMergedChildContext=e,ca(pa),ca(fa),ua(fa,e)):ca(pa),ua(pa,n)}var Ea=null,Sa=null,_a=o.unstable_runWithPriority,xa=o.unstable_scheduleCallback,Ta=o.unstable_cancelCallback,Ca=o.unstable_shouldYield,Aa=o.unstable_requestPaint,La=o.unstable_now,Pa=o.unstable_getCurrentPriorityLevel,Na=o.unstable_ImmediatePriority,Ia=o.unstable_UserBlockingPriority,Oa=o.unstable_NormalPriority,Ra=o.unstable_LowPriority,Ma=o.unstable_IdlePriority,Da={},Ba=void 0!==Aa?Aa:function(){},Fa=null,$a=null,ja=!1,za=La(),Ua=1e4>za?La:function(){return La()-za};function Za(){switch(Pa()){case Na:return 99;case Ia:return 98;case Oa:return 97;case Ra:return 96;case Ma:return 95;default:throw Error(i(332))}}function Ha(e){switch(e){case 99:return Na;case 98:return Ia;case 97:return Oa;case 96:return Ra;case 95:return Ma;default:throw Error(i(332))}}function Ga(e,t){return e=Ha(e),_a(e,t)}function Va(e,t,n){return e=Ha(e),xa(e,t,n)}function Wa(){if(null!==$a){var e=$a;$a=null,Ta(e)}qa()}function qa(){if(!ja&&null!==Fa){ja=!0;var e=0;try{var t=Fa;Ga(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fa=null}catch(n){throw null!==Fa&&(Fa=Fa.slice(e+1)),xa(Na,Wa),n}finally{ja=!1}}}var Ya=k.ReactCurrentBatchConfig;function Ka(e,t){if(e&&e.defaultProps){for(var n in t=a({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Xa=sa(null),Qa=null,Ja=null,eo=null;function to(){eo=Ja=Qa=null}function no(e){var t=Xa.current;ca(Xa),e.type._context._currentValue=t}function ro(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function ao(e,t){Qa=e,eo=Ja=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(Di=!0),e.firstContext=null)}function oo(e,t){if(eo!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(eo=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Ja){if(null===Qa)throw Error(i(308));Ja=t,Qa.dependencies={lanes:0,firstContext:t,responders:null}}else Ja=Ja.next=t;return e._currentValue}var io=!1;function lo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function so(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 co(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function uo(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function fo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=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===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function po(e,t,n,r){var o=e.updateQueue;io=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var c=s,u=c.next;c.next=null,null===l?i=u:l.next=u,l=c;var d=e.alternate;if(null!==d){var f=(d=d.updateQueue).lastBaseUpdate;f!==l&&(null===f?d.firstBaseUpdate=u:f.next=u,d.lastBaseUpdate=c)}}if(null!==i){for(f=o.baseState,l=0,d=u=c=null;;){s=i.lane;var p=i.eventTime;if((r&s)===s){null!==d&&(d=d.next={eventTime:p,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var m=e,g=i;switch(s=t,p=n,g.tag){case 1:if("function"==typeof(m=g.payload)){f=m.call(p,f,s);break e}f=m;break e;case 3:m.flags=-4097&m.flags|64;case 0:if(null==(s="function"==typeof(m=g.payload)?m.call(p,f,s):m))break e;f=a({},f,s);break e;case 2:io=!0}}null!==i.callback&&(e.flags|=32,null===(s=o.effects)?o.effects=[i]:s.push(i))}else p={eventTime:p,lane:s,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===d?(u=d=p,c=f):d=d.next=p,l|=s;if(null===(i=i.next)){if(null===(s=o.shared.pending))break;i=s.next,s.next=null,o.lastBaseUpdate=s,o.shared.pending=null}}null===d&&(c=f),o.baseState=c,o.firstBaseUpdate=u,o.lastBaseUpdate=d,zl|=l,e.lanes=l,e.memoizedState=f}}function mo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(null!==a){if(r.callback=null,r=n,"function"!=typeof a)throw Error(i(191,a));a.call(r)}}}var go=(new r.Component).refs;function ho(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:a({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var bo={isMounted:function(e){return!!(e=e._reactInternals)&&Ye(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=fs(),a=ps(e),o=co(r,a);o.payload=t,null!=n&&(o.callback=n),uo(e,o),ms(e,a,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=fs(),a=ps(e),o=co(r,a);o.tag=1,o.payload=t,null!=n&&(o.callback=n),uo(e,o),ms(e,a,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=fs(),r=ps(e),a=co(n,r);a.tag=2,null!=t&&(a.callback=t),uo(e,a),ms(e,r,n)}};function vo(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!dr(n,r)||!dr(a,o))}function yo(e,t,n){var r=!1,a=da,o=t.contextType;return"object"==typeof o&&null!==o?o=oo(o):(a=ha(t)?ma:fa.current,o=(r=null!=(r=t.contextTypes))?ga(e,a):da),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=bo,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=o),t}function wo(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&&bo.enqueueReplaceState(t,t.state,null)}function ko(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs=go,lo(e);var o=t.contextType;"object"==typeof o&&null!==o?a.context=oo(o):(o=ha(t)?ma:fa.current,a.context=ga(e,o)),po(e,n,a,r),a.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(ho(e,t,o,n),a.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(t=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),t!==a.state&&bo.enqueueReplaceState(a,a.state,null),po(e,n,a,r),a.state=e.memoizedState),"function"==typeof a.componentDidMount&&(e.flags|=4)}var Eo=Array.isArray;function So(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(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var a=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=r.refs;t===go&&(t=r.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function _o(e,t){if("textarea"!==e.type)throw Error(i(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function xo(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}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 a(e,t){return(e=Vs(e,t)).index=0,e.sibling=null,e}function o(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):n}function l(t){return e&&null===t.alternate&&(t.flags=2),t}function s(e,t,n,r){return null===t||6!==t.tag?((t=Ks(n,e.mode,r)).return=e,t):((t=a(t,n)).return=e,t)}function c(e,t,n,r){return null!==t&&t.elementType===n.type?((r=a(t,n.props)).ref=So(e,t,n),r.return=e,r):((r=Ws(n.type,n.key,n.props,null,e.mode,r)).ref=So(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=Xs(n,e.mode,r)).return=e,t):((t=a(t,n.children||[])).return=e,t)}function d(e,t,n,r,o){return null===t||7!==t.tag?((t=qs(n,e.mode,r,o)).return=e,t):((t=a(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Ks(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case E:return(n=Ws(t.type,t.key,t.props,null,e.mode,n)).ref=So(e,null,t),n.return=e,n;case S:return(t=Xs(t,e.mode,n)).return=e,t}if(Eo(t)||U(t))return(t=qs(t,e.mode,n,null)).return=e,t;_o(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==a?null:s(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case E:return n.key===a?n.type===_?d(e,t,n.props.children,r,a):c(e,t,n,r):null;case S:return n.key===a?u(e,t,n,r):null}if(Eo(n)||U(n))return null!==a?null:d(e,t,n,r,null);_o(e,n)}return null}function m(e,t,n,r,a){if("string"==typeof r||"number"==typeof r)return s(t,e=e.get(n)||null,""+r,a);if("object"==typeof r&&null!==r){switch(r.$$typeof){case E:return e=e.get(null===r.key?n:r.key)||null,r.type===_?d(t,e,r.props.children,a,r.key):c(t,e,r,a);case S:return u(t,e=e.get(null===r.key?n:r.key)||null,r,a)}if(Eo(r)||U(r))return d(t,e=e.get(n)||null,r,a,null);_o(t,r)}return null}function g(a,i,l,s){for(var c=null,u=null,d=i,g=i=0,h=null;null!==d&&g<l.length;g++){d.index>g?(h=d,d=null):h=d.sibling;var b=p(a,d,l[g],s);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(a,d),i=o(b,i,g),null===u?c=b:u.sibling=b,u=b,d=h}if(g===l.length)return n(a,d),c;if(null===d){for(;g<l.length;g++)null!==(d=f(a,l[g],s))&&(i=o(d,i,g),null===u?c=d:u.sibling=d,u=d);return c}for(d=r(a,d);g<l.length;g++)null!==(h=m(d,a,g,l[g],s))&&(e&&null!==h.alternate&&d.delete(null===h.key?g:h.key),i=o(h,i,g),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(a,e)})),c}function h(a,l,s,c){var u=U(s);if("function"!=typeof u)throw Error(i(150));if(null==(s=u.call(s)))throw Error(i(151));for(var d=u=null,g=l,h=l=0,b=null,v=s.next();null!==g&&!v.done;h++,v=s.next()){g.index>h?(b=g,g=null):b=g.sibling;var y=p(a,g,v.value,c);if(null===y){null===g&&(g=b);break}e&&g&&null===y.alternate&&t(a,g),l=o(y,l,h),null===d?u=y:d.sibling=y,d=y,g=b}if(v.done)return n(a,g),u;if(null===g){for(;!v.done;h++,v=s.next())null!==(v=f(a,v.value,c))&&(l=o(v,l,h),null===d?u=v:d.sibling=v,d=v);return u}for(g=r(a,g);!v.done;h++,v=s.next())null!==(v=m(g,a,h,v.value,c))&&(e&&null!==v.alternate&&g.delete(null===v.key?h:v.key),l=o(v,l,h),null===d?u=v:d.sibling=v,d=v);return e&&g.forEach((function(e){return t(a,e)})),u}return function(e,r,o,s){var c="object"==typeof o&&null!==o&&o.type===_&&null===o.key;c&&(o=o.props.children);var u="object"==typeof o&&null!==o;if(u)switch(o.$$typeof){case E:e:{for(u=o.key,c=r;null!==c;){if(c.key===u){if(7===c.tag){if(o.type===_){n(e,c.sibling),(r=a(c,o.props.children)).return=e,e=r;break e}}else if(c.elementType===o.type){n(e,c.sibling),(r=a(c,o.props)).ref=So(e,c,o),r.return=e,e=r;break e}n(e,c);break}t(e,c),c=c.sibling}o.type===_?((r=qs(o.props.children,e.mode,s,o.key)).return=e,e=r):((s=Ws(o.type,o.key,o.props,null,e.mode,s)).ref=So(e,r,o),s.return=e,e=s)}return l(e);case S:e:{for(c=o.key;null!==r;){if(r.key===c){if(4===r.tag&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),(r=a(r,o.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Xs(o,e.mode,s)).return=e,e=r}return l(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==r&&6===r.tag?(n(e,r.sibling),(r=a(r,o)).return=e,e=r):(n(e,r),(r=Ks(o,e.mode,s)).return=e,e=r),l(e);if(Eo(o))return g(e,r,o,s);if(U(o))return h(e,r,o,s);if(u&&_o(e,o),void 0===o&&!c)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,W(e.type)||"Component"))}return n(e,r)}}var To=xo(!0),Co=xo(!1),Ao={},Lo=sa(Ao),Po=sa(Ao),No=sa(Ao);function Io(e){if(e===Ao)throw Error(i(174));return e}function Oo(e,t){switch(ua(No,t),ua(Po,e),ua(Lo,Ao),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:pe(null,"");break;default:t=pe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ca(Lo),ua(Lo,t)}function Ro(){ca(Lo),ca(Po),ca(No)}function Mo(e){Io(No.current);var t=Io(Lo.current),n=pe(t,e.type);t!==n&&(ua(Po,e),ua(Lo,n))}function Do(e){Po.current===e&&(ca(Lo),ca(Po))}var Bo=sa(0);function Fo(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!=(64&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 $o=null,jo=null,zo=!1;function Uo(e,t){var n=Hs(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Zo(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,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Ho(e){if(zo){var t=jo;if(t){var n=t;if(!Zo(e,t)){if(!(t=Wr(n.nextSibling))||!Zo(e,t))return e.flags=-1025&e.flags|2,zo=!1,void($o=e);Uo($o,n)}$o=e,jo=Wr(t.firstChild)}else e.flags=-1025&e.flags|2,zo=!1,$o=e}}function Go(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;$o=e}function Vo(e){if(e!==$o)return!1;if(!zo)return Go(e),zo=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!Zr(t,e.memoizedProps))for(t=jo;t;)Uo(e,t),t=Wr(t.nextSibling);if(Go(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){jo=Wr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}jo=null}}else jo=$o?Wr(e.stateNode.nextSibling):null;return!0}function Wo(){jo=$o=null,zo=!1}var qo=[];function Yo(){for(var e=0;e<qo.length;e++)qo[e]._workInProgressVersionPrimary=null;qo.length=0}var Ko=k.ReactCurrentDispatcher,Xo=k.ReactCurrentBatchConfig,Qo=0,Jo=null,ei=null,ti=null,ni=!1,ri=!1;function ai(){throw Error(i(321))}function oi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!cr(e[n],t[n]))return!1;return!0}function ii(e,t,n,r,a,o){if(Qo=o,Jo=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Ko.current=null===e||null===e.memoizedState?Ii:Oi,e=n(r,a),ri){o=0;do{if(ri=!1,!(25>o))throw Error(i(301));o+=1,ti=ei=null,t.updateQueue=null,Ko.current=Ri,e=n(r,a)}while(ri)}if(Ko.current=Ni,t=null!==ei&&null!==ei.next,Qo=0,ti=ei=Jo=null,ni=!1,t)throw Error(i(300));return e}function li(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ti?Jo.memoizedState=ti=e:ti=ti.next=e,ti}function si(){if(null===ei){var e=Jo.alternate;e=null!==e?e.memoizedState:null}else e=ei.next;var t=null===ti?Jo.memoizedState:ti.next;if(null!==t)ti=t,ei=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ei=e).memoizedState,baseState:ei.baseState,baseQueue:ei.baseQueue,queue:ei.queue,next:null},null===ti?Jo.memoizedState=ti=e:ti=ti.next=e}return ti}function ci(e,t){return"function"==typeof t?t(e):t}function ui(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=ei,a=r.baseQueue,o=n.pending;if(null!==o){if(null!==a){var l=a.next;a.next=o.next,o.next=l}r.baseQueue=a=o,n.pending=null}if(null!==a){a=a.next,r=r.baseState;var s=l=o=null,c=a;do{var u=c.lane;if((Qo&u)===u)null!==s&&(s=s.next={lane:0,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null}),r=c.eagerReducer===e?c.eagerState:e(r,c.action);else{var d={lane:u,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null};null===s?(l=s=d,o=r):s=s.next=d,Jo.lanes|=u,zl|=u}c=c.next}while(null!==c&&c!==a);null===s?o=r:s.next=l,cr(r,t.memoizedState)||(Di=!0),t.memoizedState=r,t.baseState=o,t.baseQueue=s,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function di(e){var t=si(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,o=t.memoizedState;if(null!==a){n.pending=null;var l=a=a.next;do{o=e(o,l.action),l=l.next}while(l!==a);cr(o,t.memoizedState)||(Di=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function fi(e,t,n){var r=t._getVersion;r=r(t._source);var a=t._workInProgressVersionPrimary;if(null!==a?e=a===r:(e=e.mutableReadLanes,(e=(Qo&e)===e)&&(t._workInProgressVersionPrimary=r,qo.push(t))),e)return n(t._source);throw qo.push(t),Error(i(350))}function pi(e,t,n,r){var a=Ol;if(null===a)throw Error(i(349));var o=t._getVersion,l=o(t._source),s=Ko.current,c=s.useState((function(){return fi(a,t,n)})),u=c[1],d=c[0];c=ti;var f=e.memoizedState,p=f.refs,m=p.getSnapshot,g=f.source;f=f.subscribe;var h=Jo;return e.memoizedState={refs:p,source:t,subscribe:r},s.useEffect((function(){p.getSnapshot=n,p.setSnapshot=u;var e=o(t._source);if(!cr(l,e)){e=n(t._source),cr(d,e)||(u(e),e=ps(h),a.mutableReadLanes|=e&a.pendingLanes),e=a.mutableReadLanes,a.entangledLanes|=e;for(var r=a.entanglements,i=e;0<i;){var s=31-Zt(i),c=1<<s;r[s]|=e,i&=~c}}}),[n,t,r]),s.useEffect((function(){return r(t._source,(function(){var e=p.getSnapshot,n=p.setSnapshot;try{n(e(t._source));var r=ps(h);a.mutableReadLanes|=r&a.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,r]),cr(m,n)&&cr(g,t)&&cr(f,r)||((e={pending:null,dispatch:null,lastRenderedReducer:ci,lastRenderedState:d}).dispatch=u=Pi.bind(null,Jo,e),c.queue=e,c.baseQueue=null,d=fi(a,t,n),c.memoizedState=c.baseState=d),d}function mi(e,t,n){return pi(si(),e,t,n)}function gi(e){var t=li();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ci,lastRenderedState:e}).dispatch=Pi.bind(null,Jo,e),[t.memoizedState,e]}function hi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=Jo.updateQueue)?(t={lastEffect:null},Jo.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(e){return e={current:e},li().memoizedState=e}function vi(){return si().memoizedState}function yi(e,t,n,r){var a=li();Jo.flags|=e,a.memoizedState=hi(1|t,n,void 0,void 0===r?null:r)}function wi(e,t,n,r){var a=si();r=void 0===r?null:r;var o=void 0;if(null!==ei){var i=ei.memoizedState;if(o=i.destroy,null!==r&&oi(r,i.deps))return void hi(t,n,o,r)}Jo.flags|=e,a.memoizedState=hi(1|t,n,o,r)}function ki(e,t){return yi(516,4,e,t)}function Ei(e,t){return wi(516,4,e,t)}function Si(e,t){return wi(4,2,e,t)}function _i(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 xi(e,t,n){return n=null!=n?n.concat([e]):null,wi(4,2,_i.bind(null,t,e),n)}function Ti(){}function Ci(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&oi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ai(e,t){var n=si();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&oi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Li(e,t){var n=Za();Ga(98>n?98:n,(function(){e(!0)})),Ga(97<n?97:n,(function(){var n=Xo.transition;Xo.transition=1;try{e(!1),t()}finally{Xo.transition=n}}))}function Pi(e,t,n){var r=fs(),a=ps(e),o={lane:a,action:n,eagerReducer:null,eagerState:null,next:null},i=t.pending;if(null===i?o.next=o:(o.next=i.next,i.next=o),t.pending=o,i=e.alternate,e===Jo||null!==i&&i===Jo)ri=ni=!0;else{if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var l=t.lastRenderedState,s=i(l,n);if(o.eagerReducer=i,o.eagerState=s,cr(s,l))return}catch(c){}ms(e,a,r)}}var Ni={readContext:oo,useCallback:ai,useContext:ai,useEffect:ai,useImperativeHandle:ai,useLayoutEffect:ai,useMemo:ai,useReducer:ai,useRef:ai,useState:ai,useDebugValue:ai,useDeferredValue:ai,useTransition:ai,useMutableSource:ai,useOpaqueIdentifier:ai,unstable_isNewReconciler:!1},Ii={readContext:oo,useCallback:function(e,t){return li().memoizedState=[e,void 0===t?null:t],e},useContext:oo,useEffect:ki,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,yi(4,2,_i.bind(null,t,e),n)},useLayoutEffect:function(e,t){return yi(4,2,e,t)},useMemo:function(e,t){var n=li();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=li();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Pi.bind(null,Jo,e),[r.memoizedState,e]},useRef:bi,useState:gi,useDebugValue:Ti,useDeferredValue:function(e){var t=gi(e),n=t[0],r=t[1];return ki((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=gi(!1),t=e[0];return bi(e=Li.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=li();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},pi(r,e,t,n)},useOpaqueIdentifier:function(){if(zo){var e=!1,t=function(e){return{$$typeof:M,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Yr++).toString(36))),Error(i(355))})),n=gi(t)[1];return 0==(2&Jo.mode)&&(Jo.flags|=516,hi(5,(function(){n("r:"+(Yr++).toString(36))}),void 0,null)),t}return gi(t="r:"+(Yr++).toString(36)),t},unstable_isNewReconciler:!1},Oi={readContext:oo,useCallback:Ci,useContext:oo,useEffect:Ei,useImperativeHandle:xi,useLayoutEffect:Si,useMemo:Ai,useReducer:ui,useRef:vi,useState:function(){return ui(ci)},useDebugValue:Ti,useDeferredValue:function(e){var t=ui(ci),n=t[0],r=t[1];return Ei((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=ui(ci)[0];return[vi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return ui(ci)[0]},unstable_isNewReconciler:!1},Ri={readContext:oo,useCallback:Ci,useContext:oo,useEffect:Ei,useImperativeHandle:xi,useLayoutEffect:Si,useMemo:Ai,useReducer:di,useRef:vi,useState:function(){return di(ci)},useDebugValue:Ti,useDeferredValue:function(e){var t=di(ci),n=t[0],r=t[1];return Ei((function(){var t=Xo.transition;Xo.transition=1;try{r(e)}finally{Xo.transition=t}}),[e]),n},useTransition:function(){var e=di(ci)[0];return[vi().current,e]},useMutableSource:mi,useOpaqueIdentifier:function(){return di(ci)[0]},unstable_isNewReconciler:!1},Mi=k.ReactCurrentOwner,Di=!1;function Bi(e,t,n,r){t.child=null===e?Co(t,null,n,r):To(t,e.child,n,r)}function Fi(e,t,n,r,a){n=n.render;var o=t.ref;return ao(t,a),r=ii(e,t,n,r,o,a),null===e||Di?(t.flags|=1,Bi(e,t,r,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,ol(e,t,a))}function $i(e,t,n,r,a,o){if(null===e){var i=n.type;return"function"!=typeof i||Gs(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Ws(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,ji(e,t,i,r,a,o))}return i=e.child,0==(a&o)&&(a=i.memoizedProps,(n=null!==(n=n.compare)?n:dr)(a,r)&&e.ref===t.ref)?ol(e,t,o):(t.flags|=1,(e=Vs(i,r)).ref=t.ref,e.return=t,t.child=e)}function ji(e,t,n,r,a,o){if(null!==e&&dr(e.memoizedProps,r)&&e.ref===t.ref){if(Di=!1,0==(o&a))return t.lanes=e.lanes,ol(e,t,o);0!=(16384&e.flags)&&(Di=!0)}return Zi(e,t,n,r,o)}function zi(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode||"unstable-defer-without-hiding"===r.mode)if(0==(4&t.mode))t.memoizedState={baseLanes:0},Es(t,n);else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},Es(t,e),null;t.memoizedState={baseLanes:0},Es(t,null!==o?o.baseLanes:n)}else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,Es(t,r);return Bi(e,t,a,n),t.child}function Ui(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function Zi(e,t,n,r,a){var o=ha(n)?ma:fa.current;return o=ga(t,o),ao(t,a),n=ii(e,t,n,r,o,a),null===e||Di?(t.flags|=1,Bi(e,t,n,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,ol(e,t,a))}function Hi(e,t,n,r,a){if(ha(n)){var o=!0;wa(t)}else o=!1;if(ao(t,a),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),yo(t,n,r),ko(t,n,r,a),r=!0;else if(null===e){var i=t.stateNode,l=t.memoizedProps;i.props=l;var s=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=oo(c):c=ga(t,c=ha(n)?ma:fa.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==r||s!==c)&&wo(t,i,r,c),io=!1;var f=t.memoizedState;i.state=f,po(t,r,i,a),s=t.memoizedState,l!==r||f!==s||pa.current||io?("function"==typeof u&&(ho(t,n,u,r),s=t.memoizedState),(l=io||vo(t,n,l,r,f,s,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|=4)):("function"==typeof i.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=c,r=l):("function"==typeof i.componentDidMount&&(t.flags|=4),r=!1)}else{i=t.stateNode,so(e,t),l=t.memoizedProps,c=t.type===t.elementType?l:Ka(t.type,l),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(s=n.contextType)&&null!==s?s=oo(s):s=ga(t,s=ha(n)?ma:fa.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==d||f!==s)&&wo(t,i,r,s),io=!1,f=t.memoizedState,i.state=f,po(t,r,i,a);var m=t.memoizedState;l!==d||f!==m||pa.current||io?("function"==typeof p&&(ho(t,n,p,r),m=t.memoizedState),(c=io||vo(t,n,c,r,f,m,s))?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,m,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,m,s)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=m),i.props=r,i.state=m,i.context=s,r=c):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),r=!1)}return Gi(e,t,n,r,o,a)}function Gi(e,t,n,r,a,o){Ui(e,t);var i=0!=(64&t.flags);if(!r&&!i)return a&&ka(t,n,!1),ol(e,t,o);r=t.stateNode,Mi.current=t;var l=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=To(t,e.child,null,o),t.child=To(t,null,l,o)):Bi(e,t,l,o),t.memoizedState=r.state,a&&ka(t,n,!0),t.child}function Vi(e){var t=e.stateNode;t.pendingContext?va(0,t.pendingContext,t.pendingContext!==t.context):t.context&&va(0,t.context,!1),Oo(e,t.containerInfo)}var Wi,qi,Yi,Ki,Xi={dehydrated:null,retryLane:0};function Qi(e,t,n){var r,a=t.pendingProps,o=Bo.current,i=!1;return(r=0!=(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&0!=(2&o)),r?(i=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===a.fallback||!0===a.unstable_avoidThisFallback||(o|=1),ua(Bo,1&o),null===e?(void 0!==a.fallback&&Ho(t),e=a.children,o=a.fallback,i?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,e):"number"==typeof a.unstable_expectedLoadTime?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Xi,t.lanes=33554432,e):((n=Ys({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(a=tl(e,t,a.children,a.fallback,n),i=t.child,o=e.child.memoizedState,i.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},i.childLanes=e.childLanes&~n,t.memoizedState=Xi,a):(n=el(e,t,a.children,n),t.memoizedState=null,n))}function Ji(e,t,n,r){var a=e.mode,o=e.child;return t={mode:"hidden",children:t},0==(2&a)&&null!==o?(o.childLanes=0,o.pendingProps=t):o=Ys(t,a,0,null),n=qs(n,a,r,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function el(e,t,n,r){var a=e.child;return e=a.sibling,n=Vs(a,{mode:"visible",children:n}),0==(2&t.mode)&&(n.lanes=r),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function tl(e,t,n,r,a){var o=t.mode,i=e.child;e=i.sibling;var l={mode:"hidden",children:n};return 0==(2&o)&&t.child!==i?((n=t.child).childLanes=0,n.pendingProps=l,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Vs(i,l),null!==e?r=Vs(e,r):(r=qs(r,o,a,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function nl(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ro(e.return,t)}function rl(e,t,n,r,a,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a,lastEffect:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=a,i.lastEffect=o)}function al(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(Bi(e,t,r.children,n),0!=(2&(r=Bo.current)))r=1&r|2,t.flags|=64;else{if(null!==e&&0!=(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&nl(e,n);else if(19===e.tag)nl(e,n);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(ua(Bo,r),0==(2&t.mode))t.memoizedState=null;else switch(a){case"forwards":for(n=t.child,a=null;null!==n;)null!==(e=n.alternate)&&null===Fo(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),rl(t,!1,a,n,o,t.lastEffect);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===Fo(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}rl(t,!0,n,null,o,t.lastEffect);break;case"together":rl(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function ol(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),zl|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Vs(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Vs(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function il(e,t){if(!zo)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 ll(e,t,n){var r=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return ha(t.type)&&ba(),null;case 3:return Ro(),ca(pa),ca(fa),Yo(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Vo(t)?t.flags|=4:r.hydrate||(t.flags|=256)),qi(t),null;case 5:Do(t);var o=Io(No.current);if(n=t.type,null!==e&&null!=t.stateNode)Yi(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(i(166));return null}if(e=Io(Lo.current),Vo(t)){r=t.stateNode,n=t.type;var l=t.memoizedProps;switch(r[Xr]=t,r[Qr]=l,n){case"dialog":Lr("cancel",r),Lr("close",r);break;case"iframe":case"object":case"embed":Lr("load",r);break;case"video":case"audio":for(e=0;e<xr.length;e++)Lr(xr[e],r);break;case"source":Lr("error",r);break;case"img":case"image":case"link":Lr("error",r),Lr("load",r);break;case"details":Lr("toggle",r);break;case"input":ee(r,l),Lr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!l.multiple},Lr("invalid",r);break;case"textarea":se(r,l),Lr("invalid",r)}for(var c in Se(n,l),e=null,l)l.hasOwnProperty(c)&&(o=l[c],"children"===c?"string"==typeof o?r.textContent!==o&&(e=["children",o]):"number"==typeof o&&r.textContent!==""+o&&(e=["children",""+o]):s.hasOwnProperty(c)&&null!=o&&"onScroll"===c&&Lr("scroll",r));switch(n){case"input":K(r),re(r,l,!0);break;case"textarea":K(r),ue(r);break;case"select":case"option":break;default:"function"==typeof l.onClick&&(r.onclick=$r)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(c=9===o.nodeType?o:o.ownerDocument,e===de.html&&(e=fe(n)),e===de.html?"script"===n?((e=c.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=c.createElement(n,{is:r.is}):(e=c.createElement(n),"select"===n&&(c=e,r.multiple?c.multiple=!0:r.size&&(c.size=r.size))):e=c.createElementNS(e,n),e[Xr]=t,e[Qr]=r,Wi(e,t,!1,!1),t.stateNode=e,c=_e(n,r),n){case"dialog":Lr("cancel",e),Lr("close",e),o=r;break;case"iframe":case"object":case"embed":Lr("load",e),o=r;break;case"video":case"audio":for(o=0;o<xr.length;o++)Lr(xr[o],e);o=r;break;case"source":Lr("error",e),o=r;break;case"img":case"image":case"link":Lr("error",e),Lr("load",e),o=r;break;case"details":Lr("toggle",e),o=r;break;case"input":ee(e,r),o=J(e,r),Lr("invalid",e);break;case"option":o=oe(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=a({},r,{value:void 0}),Lr("invalid",e);break;case"textarea":se(e,r),o=le(e,r),Lr("invalid",e);break;default:o=r}Se(n,o);var u=o;for(l in u)if(u.hasOwnProperty(l)){var d=u[l];"style"===l?ke(e,d):"dangerouslySetInnerHTML"===l?null!=(d=d?d.__html:void 0)&&he(e,d):"children"===l?"string"==typeof d?("textarea"!==n||""!==d)&&be(e,d):"number"==typeof d&&be(e,""+d):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&(s.hasOwnProperty(l)?null!=d&&"onScroll"===l&&Lr("scroll",e):null!=d&&w(e,l,d,c))}switch(n){case"input":K(e),re(e,r,!1);break;case"textarea":K(e),ue(e);break;case"option":null!=r.value&&e.setAttribute("value",""+q(r.value));break;case"select":e.multiple=!!r.multiple,null!=(l=r.value)?ie(e,!!r.multiple,l,!1):null!=r.defaultValue&&ie(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=$r)}Ur(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Ki(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));n=Io(No.current),Io(Lo.current),Vo(t)?(r=t.stateNode,n=t.memoizedProps,r[Xr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Xr]=t,t.stateNode=r)}return null;case 13:return ca(Bo),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Vo(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Bo.current)?0===Fl&&(Fl=3):(0!==Fl&&3!==Fl||(Fl=4),null===Ol||0==(134217727&zl)&&0==(134217727&Ul)||vs(Ol,Ml))),(r||n)&&(t.flags|=4),null);case 4:return Ro(),qi(t),null===e&&Nr(t.stateNode.containerInfo),null;case 10:return no(t),null;case 19:if(ca(Bo),null===(r=t.memoizedState))return null;if(l=0!=(64&t.flags),null===(c=r.rendering))if(l)il(r,!1);else{if(0!==Fl||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(c=Fo(e))){for(t.flags|=64,il(r,!1),null!==(l=c.updateQueue)&&(t.updateQueue=l,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(l=n).flags&=2,l.nextEffect=null,l.firstEffect=null,l.lastEffect=null,null===(c=l.alternate)?(l.childLanes=0,l.lanes=e,l.child=null,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=c.childLanes,l.lanes=c.lanes,l.child=c.child,l.memoizedProps=c.memoizedProps,l.memoizedState=c.memoizedState,l.updateQueue=c.updateQueue,l.type=c.type,e=c.dependencies,l.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return ua(Bo,1&Bo.current|2),t.child}e=e.sibling}null!==r.tail&&Ua()>Vl&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432)}else{if(!l)if(null!==(e=Fo(c))){if(t.flags|=64,l=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),il(r,!0),null===r.tail&&"hidden"===r.tailMode&&!c.alternate&&!zo)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*Ua()-r.renderingStartTime>Vl&&1073741824!==n&&(t.flags|=64,l=!0,il(r,!1),t.lanes=33554432);r.isBackwards?(c.sibling=t.child,t.child=c):(null!==(n=r.last)?n.sibling=c:t.child=c,r.last=c)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=Ua(),n.sibling=null,t=Bo.current,ua(Bo,l?1&t|2:1&t),n):null;case 23:case 24:return Ss(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(i(156,t.tag))}function sl(e){switch(e.tag){case 1:ha(e.type)&&ba();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Ro(),ca(pa),ca(fa),Yo(),0!=(64&(t=e.flags)))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Do(e),null;case 13:return ca(Bo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return ca(Bo),null;case 4:return Ro(),null;case 10:return no(e),null;case 23:case 24:return Ss(),null;default:return null}}function cl(e,t){try{var n="",r=t;do{n+=V(r),r=r.return}while(r);var a=n}catch(o){a="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:a}}function ul(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}Wi=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}},qi=function(){},Yi=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Io(Lo.current);var i,l=null;switch(n){case"input":o=J(e,o),r=J(e,r),l=[];break;case"option":o=oe(e,o),r=oe(e,r),l=[];break;case"select":o=a({},o,{value:void 0}),r=a({},r,{value:void 0}),l=[];break;case"textarea":o=le(e,o),r=le(e,r),l=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=$r)}for(d in Se(n,r),n=null,o)if(!r.hasOwnProperty(d)&&o.hasOwnProperty(d)&&null!=o[d])if("style"===d){var c=o[d];for(i in c)c.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(s.hasOwnProperty(d)?l||(l=[]):(l=l||[]).push(d,null));for(d in r){var u=r[d];if(c=null!=o?o[d]:void 0,r.hasOwnProperty(d)&&u!==c&&(null!=u||null!=c))if("style"===d)if(c){for(i in c)!c.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&c[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(l||(l=[]),l.push(d,n)),n=u;else"dangerouslySetInnerHTML"===d?(u=u?u.__html:void 0,c=c?c.__html:void 0,null!=u&&c!==u&&(l=l||[]).push(d,u)):"children"===d?"string"!=typeof u&&"number"!=typeof u||(l=l||[]).push(d,""+u):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(s.hasOwnProperty(d)?(null!=u&&"onScroll"===d&&Lr("scroll",e),l||c===u||(l=[])):"object"==typeof u&&null!==u&&u.$$typeof===M?u.toString():(l=l||[]).push(d,u))}n&&(l=l||[]).push("style",n);var d=l;(t.updateQueue=d)&&(t.flags|=4)}},Ki=function(e,t,n,r){n!==r&&(t.flags|=4)};var dl="function"==typeof WeakMap?WeakMap:Map;function fl(e,t,n){(n=co(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Kl||(Kl=!0,Xl=r),ul(0,t)},n}function pl(e,t,n){(n=co(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var a=t.value;n.payload=function(){return ul(0,t),r(a)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Ql?Ql=new Set([this]):Ql.add(this),ul(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var ml="function"==typeof WeakSet?WeakSet:Set;function gl(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){js(e,n)}else t.current=null}function hl(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Ka(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Vr(t.stateNode.containerInfo))}throw Error(i(163))}function bl(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var r=e.create;e.destroy=r()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var a=e;r=a.next,0!=(4&(a=a.tag))&&0!=(1&a)&&(Bs(n,e),Ds(n,e)),e=r}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(r=n.elementType===n.type?t.memoizedProps:Ka(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&mo(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}mo(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&Ur(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&kt(n)))))}throw Error(i(163))}function vl(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)"function"==typeof(r=r.style).setProperty?r.setProperty("display","none","important"):r.display="none";else{r=n.stateNode;var a=n.memoizedProps.style;a=null!=a&&a.hasOwnProperty("display")?a.display:null,r.style.display=we("display",a)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function yl(e,t){if(Sa&&"function"==typeof Sa.onCommitFiberUnmount)try{Sa.onCommitFiberUnmount(Ea,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var r=n,a=r.destroy;if(r=r.tag,void 0!==a)if(0!=(4&r))Bs(t,n);else{r=t;try{a()}catch(o){js(r,o)}}n=n.next}while(n!==e)}break;case 1:if(gl(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){js(t,o)}break;case 5:gl(t);break;case 4:xl(e,t)}}function wl(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function kl(e){return 5===e.tag||3===e.tag||4===e.tag}function El(e){e:{for(var t=e.return;null!==t;){if(kl(t))break e;t=t.return}throw Error(i(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(i(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||kl(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}r?Sl(e,n,t):_l(e,n,t)}function Sl(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,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=$r));else if(4!==r&&null!==(e=e.child))for(Sl(e,t,n),e=e.sibling;null!==e;)Sl(e,t,n),e=e.sibling}function _l(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(_l(e,t,n),e=e.sibling;null!==e;)_l(e,t,n),e=e.sibling}function xl(e,t){for(var n,r,a=t,o=!1;;){if(!o){o=a.return;e:for(;;){if(null===o)throw Error(i(160));switch(n=o.stateNode,o.tag){case 5:r=!1;break e;case 3:case 4:n=n.containerInfo,r=!0;break e}o=o.return}o=!0}if(5===a.tag||6===a.tag){e:for(var l=e,s=a,c=s;;)if(yl(l,c),null!==c.child&&4!==c.tag)c.child.return=c,c=c.child;else{if(c===s)break e;for(;null===c.sibling;){if(null===c.return||c.return===s)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}r?(l=n,s=a.stateNode,8===l.nodeType?l.parentNode.removeChild(s):l.removeChild(s)):n.removeChild(a.stateNode)}else if(4===a.tag){if(null!==a.child){n=a.stateNode.containerInfo,r=!0,a.child.return=a,a=a.child;continue}}else if(yl(e,a),null!==a.child){a.child.return=a,a=a.child;continue}if(a===t)break;for(;null===a.sibling;){if(null===a.return||a.return===t)return;4===(a=a.return).tag&&(o=!1)}a.sibling.return=a.return,a=a.sibling}}function Tl(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var r=n=n.next;do{3==(3&r.tag)&&(e=r.destroy,r.destroy=void 0,void 0!==e&&e()),r=r.next}while(r!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){r=t.memoizedProps;var a=null!==e?e.memoizedProps:r;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Qr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),_e(e,a),t=_e(e,r),a=0;a<o.length;a+=2){var l=o[a],s=o[a+1];"style"===l?ke(n,s):"dangerouslySetInnerHTML"===l?he(n,s):"children"===l?be(n,s):w(n,l,s,t)}switch(e){case"input":ne(n,r);break;case"textarea":ce(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(o=r.value)?ie(n,!!r.multiple,o,!1):e!==!!r.multiple&&(null!=r.defaultValue?ie(n,!!r.multiple,r.defaultValue,!0):ie(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(i(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,kt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Gl=Ua(),vl(t.child,!0)),void Cl(t);case 19:return void Cl(t);case 23:case 24:return void vl(t,null!==t.memoizedState)}throw Error(i(163))}function Cl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new ml),t.forEach((function(t){var r=Us.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Al(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var Ll=Math.ceil,Pl=k.ReactCurrentDispatcher,Nl=k.ReactCurrentOwner,Il=0,Ol=null,Rl=null,Ml=0,Dl=0,Bl=sa(0),Fl=0,$l=null,jl=0,zl=0,Ul=0,Zl=0,Hl=null,Gl=0,Vl=1/0;function Wl(){Vl=Ua()+500}var ql,Yl=null,Kl=!1,Xl=null,Ql=null,Jl=!1,es=null,ts=90,ns=[],rs=[],as=null,os=0,is=null,ls=-1,ss=0,cs=0,us=null,ds=!1;function fs(){return 0!=(48&Il)?Ua():-1!==ls?ls:ls=Ua()}function ps(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===Za()?1:2;if(0===ss&&(ss=jl),0!==Ya.transition){0!==cs&&(cs=null!==Hl?Hl.pendingLanes:0),e=ss;var t=4186112&~cs;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=Za(),0!=(4&Il)&&98===e?e=$t(12,ss):e=$t(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),ss),e}function ms(e,t,n){if(50<os)throw os=0,is=null,Error(i(185));if(null===(e=gs(e,t)))return null;Ut(e,t,n),e===Ol&&(Ul|=t,4===Fl&&vs(e,Ml));var r=Za();1===t?0!=(8&Il)&&0==(48&Il)?ys(e):(hs(e,n),0===Il&&(Wl(),Wa())):(0==(4&Il)||98!==r&&99!==r||(null===as?as=new Set([e]):as.add(e)),hs(e,n)),Hl=e}function gs(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}function hs(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,a=e.pingedLanes,o=e.expirationTimes,l=e.pendingLanes;0<l;){var s=31-Zt(l),c=1<<s,u=o[s];if(-1===u){if(0==(c&r)||0!=(c&a)){u=t,Dt(c);var d=Mt;o[s]=10<=d?u+250:6<=d?u+5e3:-1}}else u<=t&&(e.expiredLanes|=c);l&=~c}if(r=Bt(e,e===Ol?Ml:0),t=Mt,0===r)null!==n&&(n!==Da&&Ta(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Da&&Ta(n)}15===t?(n=ys.bind(null,e),null===Fa?(Fa=[n],$a=xa(Na,qa)):Fa.push(n),n=Da):14===t?n=Va(99,ys.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(i(358,e))}}(t),n=Va(n,bs.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bs(e){if(ls=-1,cs=ss=0,0!=(48&Il))throw Error(i(327));var t=e.callbackNode;if(Ms()&&e.callbackNode!==t)return null;var n=Bt(e,e===Ol?Ml:0);if(0===n)return null;var r=n,a=Il;Il|=16;var o=Ts();for(Ol===e&&Ml===r||(Wl(),_s(e,r));;)try{Ls();break}catch(s){xs(e,s)}if(to(),Pl.current=o,Il=a,null!==Rl?r=0:(Ol=null,Ml=0,r=Fl),0!=(jl&Ul))_s(e,0);else if(0!==r){if(2===r&&(Il|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(n=Ft(e))&&(r=Cs(e,n))),1===r)throw t=$l,_s(e,0),vs(e,n),hs(e,Ua()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(i(345));case 2:case 5:Is(e);break;case 3:if(vs(e,n),(62914560&n)===n&&10<(r=Gl+500-Ua())){if(0!==Bt(e,0))break;if(((a=e.suspendedLanes)&n)!==n){fs(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=Hr(Is.bind(null,e),r);break}Is(e);break;case 4:if(vs(e,n),(4186112&n)===n)break;for(r=e.eventTimes,a=-1;0<n;){var l=31-Zt(n);o=1<<l,(l=r[l])>a&&(a=l),n&=~o}if(n=a,10<(n=(120>(n=Ua()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Ll(n/1960))-n)){e.timeoutHandle=Hr(Is.bind(null,e),n);break}Is(e);break;default:throw Error(i(329))}}return hs(e,Ua()),e.callbackNode===t?bs.bind(null,e):null}function vs(e,t){for(t&=~Zl,t&=~Ul,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Zt(t),r=1<<n;e[n]=-1,t&=~r}}function ys(e){if(0!=(48&Il))throw Error(i(327));if(Ms(),e===Ol&&0!=(e.expiredLanes&Ml)){var t=Ml,n=Cs(e,t);0!=(jl&Ul)&&(n=Cs(e,t=Bt(e,t)))}else n=Cs(e,t=Bt(e,0));if(0!==e.tag&&2===n&&(Il|=64,e.hydrate&&(e.hydrate=!1,Vr(e.containerInfo)),0!==(t=Ft(e))&&(n=Cs(e,t))),1===n)throw n=$l,_s(e,0),vs(e,t),hs(e,Ua()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Is(e),hs(e,Ua()),null}function ws(e,t){var n=Il;Il|=1;try{return e(t)}finally{0===(Il=n)&&(Wl(),Wa())}}function ks(e,t){var n=Il;Il&=-2,Il|=8;try{return e(t)}finally{0===(Il=n)&&(Wl(),Wa())}}function Es(e,t){ua(Bl,Dl),Dl|=t,jl|=t}function Ss(){Dl=Bl.current,ca(Bl)}function _s(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Gr(n)),null!==Rl)for(n=Rl.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&ba();break;case 3:Ro(),ca(pa),ca(fa),Yo();break;case 5:Do(r);break;case 4:Ro();break;case 13:case 19:ca(Bo);break;case 10:no(r);break;case 23:case 24:Ss()}n=n.return}Ol=e,Rl=Vs(e.current,null),Ml=Dl=jl=t,Fl=0,$l=null,Zl=Ul=zl=0}function xs(e,t){for(;;){var n=Rl;try{if(to(),Ko.current=Ni,ni){for(var r=Jo.memoizedState;null!==r;){var a=r.queue;null!==a&&(a.pending=null),r=r.next}ni=!1}if(Qo=0,ti=ei=Jo=null,ri=!1,Nl.current=null,null===n||null===n.return){Fl=1,$l=t,Rl=null;break}e:{var o=e,i=n.return,l=n,s=t;if(t=Ml,l.flags|=2048,l.firstEffect=l.lastEffect=null,null!==s&&"object"==typeof s&&"function"==typeof s.then){var c=s;if(0==(2&l.mode)){var u=l.alternate;u?(l.updateQueue=u.updateQueue,l.memoizedState=u.memoizedState,l.lanes=u.lanes):(l.updateQueue=null,l.memoizedState=null)}var d=0!=(1&Bo.current),f=i;do{var p;if(p=13===f.tag){var m=f.memoizedState;if(null!==m)p=null!==m.dehydrated;else{var g=f.memoizedProps;p=void 0!==g.fallback&&(!0!==g.unstable_avoidThisFallback||!d)}}if(p){var h=f.updateQueue;if(null===h){var b=new Set;b.add(c),f.updateQueue=b}else h.add(c);if(0==(2&f.mode)){if(f.flags|=64,l.flags|=16384,l.flags&=-2981,1===l.tag)if(null===l.alternate)l.tag=17;else{var v=co(-1,1);v.tag=2,uo(l,v)}l.lanes|=1;break e}s=void 0,l=t;var y=o.pingCache;if(null===y?(y=o.pingCache=new dl,s=new Set,y.set(c,s)):void 0===(s=y.get(c))&&(s=new Set,y.set(c,s)),!s.has(l)){s.add(l);var w=zs.bind(null,o,c,l);c.then(w,w)}f.flags|=4096,f.lanes=t;break e}f=f.return}while(null!==f);s=Error((W(l.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Fl&&(Fl=2),s=cl(s,l),f=i;do{switch(f.tag){case 3:o=s,f.flags|=4096,t&=-t,f.lanes|=t,fo(f,fl(0,o,t));break e;case 1:o=s;var k=f.type,E=f.stateNode;if(0==(64&f.flags)&&("function"==typeof k.getDerivedStateFromError||null!==E&&"function"==typeof E.componentDidCatch&&(null===Ql||!Ql.has(E)))){f.flags|=4096,t&=-t,f.lanes|=t,fo(f,pl(f,o,t));break e}}f=f.return}while(null!==f)}Ns(n)}catch(S){t=S,Rl===n&&null!==n&&(Rl=n=n.return);continue}break}}function Ts(){var e=Pl.current;return Pl.current=Ni,null===e?Ni:e}function Cs(e,t){var n=Il;Il|=16;var r=Ts();for(Ol===e&&Ml===t||_s(e,t);;)try{As();break}catch(a){xs(e,a)}if(to(),Il=n,Pl.current=r,null!==Rl)throw Error(i(261));return Ol=null,Ml=0,Fl}function As(){for(;null!==Rl;)Ps(Rl)}function Ls(){for(;null!==Rl&&!Ca();)Ps(Rl)}function Ps(e){var t=ql(e.alternate,e,Dl);e.memoizedProps=e.pendingProps,null===t?Ns(e):Rl=t,Nl.current=null}function Ns(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ll(n,t,Dl)))return void(Rl=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Dl)||0==(4&n.mode)){for(var r=0,a=n.child;null!==a;)r|=a.lanes|a.childLanes,a=a.sibling;n.childLanes=r}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=sl(t)))return n.flags&=2047,void(Rl=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Rl=t);Rl=t=e}while(null!==t);0===Fl&&(Fl=5)}function Is(e){var t=Za();return Ga(99,Os.bind(null,e,t)),null}function Os(e,t){do{Ms()}while(null!==es);if(0!=(48&Il))throw Error(i(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null;var r=n.lanes|n.childLanes,a=r,o=e.pendingLanes&~a;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=a,e.mutableReadLanes&=a,e.entangledLanes&=a,a=e.entanglements;for(var l=e.eventTimes,s=e.expirationTimes;0<o;){var c=31-Zt(o),u=1<<c;a[c]=0,l[c]=-1,s[c]=-1,o&=~u}if(null!==as&&0==(24&r)&&as.has(e)&&as.delete(e),e===Ol&&(Rl=Ol=null,Ml=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(a=Il,Il|=32,Nl.current=null,jr=qt,hr(l=gr())){if("selectionStart"in l)s={start:l.selectionStart,end:l.selectionEnd};else e:if(s=(s=l.ownerDocument)&&s.defaultView||window,(u=s.getSelection&&s.getSelection())&&0!==u.rangeCount){s=u.anchorNode,o=u.anchorOffset,c=u.focusNode,u=u.focusOffset;try{s.nodeType,c.nodeType}catch(T){s=null;break e}var d=0,f=-1,p=-1,m=0,g=0,h=l,b=null;t:for(;;){for(var v;h!==s||0!==o&&3!==h.nodeType||(f=d+o),h!==c||0!==u&&3!==h.nodeType||(p=d+u),3===h.nodeType&&(d+=h.nodeValue.length),null!==(v=h.firstChild);)b=h,h=v;for(;;){if(h===l)break t;if(b===s&&++m===o&&(f=d),b===c&&++g===u&&(p=d),null!==(v=h.nextSibling))break;b=(h=b).parentNode}h=v}s=-1===f||-1===p?null:{start:f,end:p}}else s=null;s=s||{start:0,end:0}}else s=null;zr={focusedElem:l,selectionRange:s},qt=!1,us=null,ds=!1,Yl=r;do{try{Rs()}catch(T){if(null===Yl)throw Error(i(330));js(Yl,T),Yl=Yl.nextEffect}}while(null!==Yl);us=null,Yl=r;do{try{for(l=e;null!==Yl;){var y=Yl.flags;if(16&y&&be(Yl.stateNode,""),128&y){var w=Yl.alternate;if(null!==w){var k=w.ref;null!==k&&("function"==typeof k?k(null):k.current=null)}}switch(1038&y){case 2:El(Yl),Yl.flags&=-3;break;case 6:El(Yl),Yl.flags&=-3,Tl(Yl.alternate,Yl);break;case 1024:Yl.flags&=-1025;break;case 1028:Yl.flags&=-1025,Tl(Yl.alternate,Yl);break;case 4:Tl(Yl.alternate,Yl);break;case 8:xl(l,s=Yl);var E=s.alternate;wl(s),null!==E&&wl(E)}Yl=Yl.nextEffect}}catch(T){if(null===Yl)throw Error(i(330));js(Yl,T),Yl=Yl.nextEffect}}while(null!==Yl);if(k=zr,w=gr(),y=k.focusedElem,l=k.selectionRange,w!==y&&y&&y.ownerDocument&&mr(y.ownerDocument.documentElement,y)){null!==l&&hr(y)&&(w=l.start,void 0===(k=l.end)&&(k=w),"selectionStart"in y?(y.selectionStart=w,y.selectionEnd=Math.min(k,y.value.length)):(k=(w=y.ownerDocument||document)&&w.defaultView||window).getSelection&&(k=k.getSelection(),s=y.textContent.length,E=Math.min(l.start,s),l=void 0===l.end?E:Math.min(l.end,s),!k.extend&&E>l&&(s=l,l=E,E=s),s=pr(y,E),o=pr(y,l),s&&o&&(1!==k.rangeCount||k.anchorNode!==s.node||k.anchorOffset!==s.offset||k.focusNode!==o.node||k.focusOffset!==o.offset)&&((w=w.createRange()).setStart(s.node,s.offset),k.removeAllRanges(),E>l?(k.addRange(w),k.extend(o.node,o.offset)):(w.setEnd(o.node,o.offset),k.addRange(w))))),w=[];for(k=y;k=k.parentNode;)1===k.nodeType&&w.push({element:k,left:k.scrollLeft,top:k.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<w.length;y++)(k=w[y]).element.scrollLeft=k.left,k.element.scrollTop=k.top}qt=!!jr,zr=jr=null,e.current=n,Yl=r;do{try{for(y=e;null!==Yl;){var S=Yl.flags;if(36&S&&bl(y,Yl.alternate,Yl),128&S){w=void 0;var _=Yl.ref;if(null!==_){var x=Yl.stateNode;Yl.tag,w=x,"function"==typeof _?_(w):_.current=w}}Yl=Yl.nextEffect}}catch(T){if(null===Yl)throw Error(i(330));js(Yl,T),Yl=Yl.nextEffect}}while(null!==Yl);Yl=null,Ba(),Il=a}else e.current=n;if(Jl)Jl=!1,es=e,ts=t;else for(Yl=r;null!==Yl;)t=Yl.nextEffect,Yl.nextEffect=null,8&Yl.flags&&((S=Yl).sibling=null,S.stateNode=null),Yl=t;if(0===(r=e.pendingLanes)&&(Ql=null),1===r?e===is?os++:(os=0,is=e):os=0,n=n.stateNode,Sa&&"function"==typeof Sa.onCommitFiberRoot)try{Sa.onCommitFiberRoot(Ea,n,void 0,64==(64&n.current.flags))}catch(T){}if(hs(e,Ua()),Kl)throw Kl=!1,e=Xl,Xl=null,e;return 0!=(8&Il)||Wa(),null}function Rs(){for(;null!==Yl;){var e=Yl.alternate;ds||null===us||(0!=(8&Yl.flags)?Je(Yl,us)&&(ds=!0):13===Yl.tag&&Al(e,Yl)&&Je(Yl,us)&&(ds=!0));var t=Yl.flags;0!=(256&t)&&hl(e,Yl),0==(512&t)||Jl||(Jl=!0,Va(97,(function(){return Ms(),null}))),Yl=Yl.nextEffect}}function Ms(){if(90!==ts){var e=97<ts?97:ts;return ts=90,Ga(e,Fs)}return!1}function Ds(e,t){ns.push(t,e),Jl||(Jl=!0,Va(97,(function(){return Ms(),null})))}function Bs(e,t){rs.push(t,e),Jl||(Jl=!0,Va(97,(function(){return Ms(),null})))}function Fs(){if(null===es)return!1;var e=es;if(es=null,0!=(48&Il))throw Error(i(331));var t=Il;Il|=32;var n=rs;rs=[];for(var r=0;r<n.length;r+=2){var a=n[r],o=n[r+1],l=a.destroy;if(a.destroy=void 0,"function"==typeof l)try{l()}catch(c){if(null===o)throw Error(i(330));js(o,c)}}for(n=ns,ns=[],r=0;r<n.length;r+=2){a=n[r],o=n[r+1];try{var s=a.create;a.destroy=s()}catch(c){if(null===o)throw Error(i(330));js(o,c)}}for(s=e.current.firstEffect;null!==s;)e=s.nextEffect,s.nextEffect=null,8&s.flags&&(s.sibling=null,s.stateNode=null),s=e;return Il=t,Wa(),!0}function $s(e,t,n){uo(e,t=fl(0,t=cl(n,t),1)),t=fs(),null!==(e=gs(e,1))&&(Ut(e,1,t),hs(e,t))}function js(e,t){if(3===e.tag)$s(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){$s(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Ql||!Ql.has(r))){var a=pl(n,e=cl(t,e),1);if(uo(n,a),a=fs(),null!==(n=gs(n,1)))Ut(n,1,a),hs(n,a);else if("function"==typeof r.componentDidCatch&&(null===Ql||!Ql.has(r)))try{r.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function zs(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=fs(),e.pingedLanes|=e.suspendedLanes&n,Ol===e&&(Ml&n)===n&&(4===Fl||3===Fl&&(62914560&Ml)===Ml&&500>Ua()-Gl?_s(e,0):Zl|=n),hs(e,t)}function Us(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===Za()?1:2:(0===ss&&(ss=jl),0===(t=jt(62914560&~ss))&&(t=4194304))),n=fs(),null!==(e=gs(e,t))&&(Ut(e,t,n),hs(e,n))}function Zs(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.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Hs(e,t,n,r){return new Zs(e,t,n,r)}function Gs(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Vs(e,t){var n=e.alternate;return null===n?((n=Hs(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.nextEffect=null,n.firstEffect=null,n.lastEffect=null),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 Ws(e,t,n,r,a,o){var l=2;if(r=e,"function"==typeof e)Gs(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case _:return qs(n.children,a,o,t);case D:l=8,a|=16;break;case x:l=8,a|=1;break;case T:return(e=Hs(12,n,t,8|a)).elementType=T,e.type=T,e.lanes=o,e;case P:return(e=Hs(13,n,t,a)).type=P,e.elementType=P,e.lanes=o,e;case N:return(e=Hs(19,n,t,a)).elementType=N,e.lanes=o,e;case B:return Ys(n,a,o,t);case F:return(e=Hs(24,n,t,a)).elementType=F,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case C:l=10;break e;case A:l=9;break e;case L:l=11;break e;case I:l=14;break e;case O:l=16,r=null;break e;case R:l=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Hs(l,n,t,a)).elementType=e,t.type=r,t.lanes=o,t}function qs(e,t,n,r){return(e=Hs(7,e,r,t)).lanes=n,e}function Ys(e,t,n,r){return(e=Hs(23,e,r,t)).elementType=B,e.lanes=n,e}function Ks(e,t,n){return(e=Hs(6,e,null,t)).lanes=n,e}function Xs(e,t,n){return(t=Hs(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Qs(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=zt(0),this.expirationTimes=zt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=zt(0),this.mutableSourceEagerHydrationData=null}function Js(e,t,n,r){var a=t.current,o=fs(),l=ps(a);e:if(n){t:{if(Ye(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var s=n;do{switch(s.tag){case 3:s=s.stateNode.context;break t;case 1:if(ha(s.type)){s=s.stateNode.__reactInternalMemoizedMergedChildContext;break t}}s=s.return}while(null!==s);throw Error(i(171))}if(1===n.tag){var c=n.type;if(ha(c)){n=ya(n,c,s);break e}}n=s}else n=da;return null===t.context?t.context=n:t.pendingContext=n,(t=co(o,l)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),uo(a,t),ms(a,l,o),l}function ec(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function tc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nc(e,t){tc(e,t),(e=e.alternate)&&tc(e,t)}function rc(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Qs(e,t,null!=n&&!0===n.hydrate),t=Hs(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,lo(t),e[Jr]=n.current,Nr(8===e.nodeType?e.parentNode:e),r)for(e=0;e<r.length;e++){var a=(t=r[e])._getVersion;a=a(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,a]:n.mutableSourceEagerHydrationData.push(t,a)}this._internalRoot=n}function ac(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function oc(e,t,n,r,a){var o=n._reactRootContainer;if(o){var i=o._internalRoot;if("function"==typeof a){var l=a;a=function(){var e=ec(i);l.call(e)}}Js(t,i,e,a)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new rc(e,0,t?{hydrate:!0}:void 0)}(n,r),i=o._internalRoot,"function"==typeof a){var s=a;a=function(){var e=ec(i);s.call(e)}}ks((function(){Js(t,i,e,a)}))}return ec(i)}function ic(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!ac(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:S,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}ql=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||pa.current)Di=!0;else{if(0==(n&r)){switch(Di=!1,t.tag){case 3:Vi(t),Wo();break;case 5:Mo(t);break;case 1:ha(t.type)&&wa(t);break;case 4:Oo(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var a=t.type._context;ua(Xa,a._currentValue),a._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Qi(e,t,n):(ua(Bo,1&Bo.current),null!==(t=ol(e,t,n))?t.sibling:null);ua(Bo,1&Bo.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(64&e.flags)){if(r)return al(e,t,n);t.flags|=64}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),ua(Bo,Bo.current),r)break;return null;case 23:case 24:return t.lanes=0,zi(e,t,n)}return ol(e,t,n)}Di=0!=(16384&e.flags)}else Di=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=ga(t,fa.current),ao(t,n),a=ii(null,t,r,e,a,n),t.flags|=1,"object"==typeof a&&null!==a&&"function"==typeof a.render&&void 0===a.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,ha(r)){var o=!0;wa(t)}else o=!1;t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,lo(t);var l=r.getDerivedStateFromProps;"function"==typeof l&&ho(t,r,l,e),a.updater=bo,t.stateNode=a,a._reactInternals=t,ko(t,r,e,n),t=Gi(null,t,r,!0,o,n)}else t.tag=0,Bi(null,t,a,n),t=t.child;return t;case 16:a=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=(o=a._init)(a._payload),t.type=a,o=t.tag=function(e){if("function"==typeof e)return Gs(e)?1:0;if(null!=e){if((e=e.$$typeof)===L)return 11;if(e===I)return 14}return 2}(a),e=Ka(a,e),o){case 0:t=Zi(null,t,a,e,n);break e;case 1:t=Hi(null,t,a,e,n);break e;case 11:t=Fi(null,t,a,e,n);break e;case 14:t=$i(null,t,a,Ka(a.type,e),r,n);break e}throw Error(i(306,a,""))}return t;case 0:return r=t.type,a=t.pendingProps,Zi(e,t,r,a=t.elementType===r?a:Ka(r,a),n);case 1:return r=t.type,a=t.pendingProps,Hi(e,t,r,a=t.elementType===r?a:Ka(r,a),n);case 3:if(Vi(t),r=t.updateQueue,null===e||null===r)throw Error(i(282));if(r=t.pendingProps,a=null!==(a=t.memoizedState)?a.element:null,so(e,t),po(t,r,null,n),(r=t.memoizedState.element)===a)Wo(),t=ol(e,t,n);else{if((o=(a=t.stateNode).hydrate)&&(jo=Wr(t.stateNode.containerInfo.firstChild),$o=t,o=zo=!0),o){if(null!=(e=a.mutableSourceEagerHydrationData))for(a=0;a<e.length;a+=2)(o=e[a])._workInProgressVersionPrimary=e[a+1],qo.push(o);for(n=Co(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else Bi(e,t,r,n),Wo();t=t.child}return t;case 5:return Mo(t),null===e&&Ho(t),r=t.type,a=t.pendingProps,o=null!==e?e.memoizedProps:null,l=a.children,Zr(r,a)?l=null:null!==o&&Zr(r,o)&&(t.flags|=16),Ui(e,t),Bi(e,t,l,n),t.child;case 6:return null===e&&Ho(t),null;case 13:return Qi(e,t,n);case 4:return Oo(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=To(t,null,r,n):Bi(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,Fi(e,t,r,a=t.elementType===r?a:Ka(r,a),n);case 7:return Bi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Bi(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,a=t.pendingProps,l=t.memoizedProps,o=a.value;var s=t.type._context;if(ua(Xa,s._currentValue),s._currentValue=o,null!==l)if(s=l.value,0===(o=cr(s,o)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(s,o):1073741823))){if(l.children===a.children&&!pa.current){t=ol(e,t,n);break e}}else for(null!==(s=t.child)&&(s.return=t);null!==s;){var c=s.dependencies;if(null!==c){l=s.child;for(var u=c.firstContext;null!==u;){if(u.context===r&&0!=(u.observedBits&o)){1===s.tag&&((u=co(-1,n&-n)).tag=2,uo(s,u)),s.lanes|=n,null!==(u=s.alternate)&&(u.lanes|=n),ro(s.return,n),c.lanes|=n;break}u=u.next}}else l=10===s.tag&&s.type===t.type?null:s.child;if(null!==l)l.return=s;else for(l=s;null!==l;){if(l===t){l=null;break}if(null!==(s=l.sibling)){s.return=l.return,l=s;break}l=l.return}s=l}Bi(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=(o=t.pendingProps).children,ao(t,n),r=r(a=oo(a,o.unstable_observedBits)),t.flags|=1,Bi(e,t,r,n),t.child;case 14:return o=Ka(a=t.type,t.pendingProps),$i(e,t,a,o=Ka(a.type,o),r,n);case 15:return ji(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:Ka(r,a),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,ha(r)?(e=!0,wa(t)):e=!1,ao(t,n),yo(t,r,a),ko(t,r,a,n),Gi(null,t,r,!0,e,n);case 19:return al(e,t,n);case 23:case 24:return zi(e,t,n)}throw Error(i(156,t.tag))},rc.prototype.render=function(e){Js(e,this._internalRoot,null,null)},rc.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Js(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(ms(e,4,fs()),nc(e,4))},tt=function(e){13===e.tag&&(ms(e,67108864,fs()),nc(e,67108864))},nt=function(e){if(13===e.tag){var t=fs(),n=ps(e);ms(e,n,t),nc(e,n)}},rt=function(e,t){return t()},Te=function(e,t,n){switch(t){case"input":if(ne(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 a=aa(r);if(!a)throw Error(i(90));X(r),ne(r,a)}}}break;case"textarea":ce(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Ie=ws,Oe=function(e,t,n,r,a){var o=Il;Il|=4;try{return Ga(98,e.bind(null,t,n,r,a))}finally{0===(Il=o)&&(Wl(),Wa())}},Re=function(){0==(49&Il)&&(function(){if(null!==as){var e=as;as=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,hs(e,Ua())}))}Wa()}(),Ms())},Me=function(e,t){var n=Il;Il|=2;try{return e(t)}finally{0===(Il=n)&&(Wl(),Wa())}};var lc={Events:[na,ra,aa,Pe,Ne,Ms,{current:!1}]},sc={findFiberByHostInstance:ta,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},cc={bundleType:sc.bundleType,version:sc.version,rendererPackageName:sc.rendererPackageName,rendererConfig:sc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:k.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Qe(e))?null:e.stateNode},findFiberByHostInstance:sc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var uc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!uc.isDisabled&&uc.supportsFiber)try{Ea=uc.inject(cc),Sa=uc}catch(ge){}}t.createPortal=ic,t.hydrate=function(e,t,n){if(!ac(t))throw Error(i(200));return oc(null,e,t,!0,n)}},3935:(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(4448)},9590:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(!o(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!o(s.value[1],i.get(s.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();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!=s--;)if(e[s]!==i[s])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((l=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(i,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!o(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>G,ql:()=>J});var r=n(7294),a=n(5697),o=n.n(a),i=n(9590),l=n.n(i),s=n(1143),c=n.n(s),u=n(6774),d=n.n(u);function f(){return f=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},f.apply(this,arguments)}function p(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 g(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}var h={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"]},w=Object.keys(h).map((function(e){return h[e]})),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},E=Object.keys(k).reduce((function(e,t){return e[k[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,h.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},x=function(e){return S(e,"onChangeClientState")||function(){}},T=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},C=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])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 a={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var l=o[i],s=l.toLowerCase();-1===t.indexOf(s)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===s&&"stylesheet"===e[s].toLowerCase()||(n=s),-1===t.indexOf(l)||"innerHTML"!==l&&"cssText"!==l&&"itemprop"!==l||(n=l)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),a[n]||(a[n]={}),!r[n][c]&&(a[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(a),i=0;i<o.length;i+=1){var l=o[i],s=f({},r[l],a[l]);r[l]=s}return e}),[]).reverse()},L=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},P=function(e){return Array.isArray(e)?e.join(""):e},N=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}},I=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},O=[h.NOSCRIPT,h.SCRIPT,h.STYLE],R=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,"'")},M=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}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[k[n]||n]=e[n],t}),t)},B=function(e,t){return t.map((function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),r.createElement(e,o)}))},F=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=D(n,a),[r.createElement(h.TITLE,o,e)];var e,n,a,o},toString:function(){return function(e,t,n,r){var a=M(n),o=P(t);return a?"<"+e+' data-rh="true" '+a+">"+R(o,r)+"</"+e+">":"<"+e+' data-rh="true">'+R(o,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return M(t)}};default:return{toComponent:function(){return B(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+R(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===O.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},$=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,a=N(e.metaTags,y),o=N(t,b),i=N(n,v);return{priorityMethods:{toComponent:function(){return[].concat(B(h.META,a.priority),B(h.LINK,o.priority),B(h.SCRIPT,i.priority))},toString:function(){return F(h.META,a.priority,r)+" "+F(h.LINK,o.priority,r)+" "+F(h.SCRIPT,i.priority,r)}},metaTags:a.default,linkTags:o.default,scriptTags:i.default}}(e);p=m.priorityMethods,u=m.linkTags,d=m.metaTags,f=m.scriptTags}return{priority:p,base:F(h.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",a,r),link:F(h.LINK,u,r),meta:F(h.META,d,r),noscript:F(h.NOSCRIPT,o,r),script:F(h.SCRIPT,f,r),style:F(h.STYLE,i,r),title:F(h.TITLE,{title:s,titleAttributes:c},r)}},j=[],z=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?j:n.instances},add:function(e){(n.canUseDOM?j:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?j:n.instances).indexOf(e);(n.canUseDOM?j:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=$({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=r.createContext({}),Z=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new z(r.props.context,t.canUseDOM),r}return p(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:o().shape({helmet:o().shape()}),children:o().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,r.isEqualNode(e)}))?o.splice(n,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),l=0;l<i.length;l+=1){var s=i[l],c=t[s]||"";n.getAttribute(s)!==c&&n.setAttribute(s,c),-1===a.indexOf(s)&&a.push(s);var u=o.indexOf(s);-1!==u&&o.splice(u,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},q=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(h.BODY,e.bodyAttributes),W(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=P(e)),W(h.TITLE,t)}(u,d);var f={baseTag:V(h.BASE,n),linkTags:V(h.LINK,a),metaTags:V(h.META,o),noscriptTags:V(h.NOSCRIPT,i),scriptTags:V(h.SCRIPT,s),styleTags:V(h.STYLE,c)},p={},m={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(m[e]=f[e].oldTags)})),t&&t(),l(e,p,m)},Y=null,K=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(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,a=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:C(["href"],e),bodyAttributes:T("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:T("htmlAttributes",e),linkTags:A(h.LINK,["rel","href"],e),metaTags:A(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:A(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:x(e),scriptTags:A(h.SCRIPT,["src","innerHTML"],e),styleTags:A(h.STYLE,["cssText"],e),title:_(e),titleAttributes:T("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});G.canUseDOM?(t=o,Y&&cancelAnimationFrame(Y),t.defer?Y=requestAnimationFrame((function(){q(t,(function(){Y=null}))})):(q(t),Y=null)):$&&(a=$(o)),r(a)},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);K.propTypes={context:Z.isRequired},K.displayName="HelmetDispatcher";var X=["children"],Q=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!l()(I(this.props,"helmetData"),I(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.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 f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case h.BODY:return f({},a,{bodyAttributes:f({},o)});case h.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.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 "+w.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,a={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,i=g(r,X),l=Object.keys(i).reduce((function(e,t){return e[E[t]||t]=i[t],e}),{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,o),s){case h.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:l,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=g(e,Q),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof z||(o=new z(o.context,o.instances)),o?r.createElement(K,f({},a,{context:o.value,helmetData:void 0})):r.createElement(U.Consumer,null,(function(e){return r.createElement(K,f({},a,{context:e}))}))},t}(r.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},9921:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=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,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,g=n?Symbol.for("react.memo"):60115,h=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,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case o:case l:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case h:case g:case s:return e;default:return t}}case a:return t}}}function E(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=s,t.Element=r,t.ForwardRef=f,t.Fragment=o,t.Lazy=h,t.Memo=g,t.Portal=a,t.Profiler=l,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return E(e)||k(e)===u},t.isConcurrentMode=E,t.isContextConsumer=function(e){return k(e)===c},t.isContextProvider=function(e){return k(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===f},t.isFragment=function(e){return k(e)===o},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===g},t.isPortal=function(e){return k(e)===a},t.isProfiler=function(e){return k(e)===l},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===l||e===i||e===p||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===g||e.$$typeof===s||e.$$typeof===c||e.$$typeof===f||e.$$typeof===v||e.$$typeof===y||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},9864:(e,t,n)=>{"use strict";e.exports=n(9921)},8356:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(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 l=n(7294),s=n(5697),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 f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.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 p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),g=null;function h(){return g||(g=e(m.loader)),g.promise}return c.push(h),"function"==typeof m.webpack&&u.push((function(){if((0,m.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),f=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),g=e(m.loader),r._loadModule()})),h(),r.state={error:g.error,pastDelay:!1,timedOut:!1,loading:g.loading,loaded:g.loaded},r}r(n,t),n.preload=function(){return h()};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)})),g.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:g.error,loaded:g.loaded,loading:g.loading}),e._clearTimeouts()};g.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?l.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}(l.Component),o(d,"contextTypes",{loadable:s.shape({report:s.func.isRequired})}),f}function g(e){return m(d,e)}g.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)};var h=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 l.Children.only(this.props.children)},t}(l.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)}))}o(h,"propTypes",{report:s.func.isRequired}),o(h,"childContextTypes",{loadable:s.shape({report:s.func.isRequired}).isRequired}),g.Capture=h,g.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},g.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=g},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>l,f:()=>i});var r=n(6550),a=n(7462),o=n(7294);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var a=e.path?(0,r.LX)(t,e):n.length?n[n.length-1].match:r.F0.computeRootMatch(t);return a&&(n.push({route:e,match:a}),e.routes&&i(e.routes,t,n)),a})),n}function l(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.rs,n,e.map((function(e,n){return o.createElement(r.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.Z)({},n,t,{route:e}))}})}))):null}},3727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>y,VK:()=>u,rU:()=>h});var r=n(6550),a=n(5068),o=n(7294),i=n(9318),l=n(7462),s=n(3366),c=n(8776),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.lX)(t.props),t}return(0,a.Z)(t,e),t.prototype.render=function(){return o.createElement(r.F0,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var d=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},p=function(e){return e},m=o.forwardRef;void 0===m&&(m=p);var g=m((function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,s.Z)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,l.Z)({},i,{onClick:function(e){try{a&&a(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=p!==m&&t||n,o.createElement("a",u)}));var h=m((function(e,t){var n=e.component,a=void 0===n?g:n,u=e.replace,h=e.to,b=e.innerRef,v=(0,s.Z)(e,["component","replace","to","innerRef"]);return o.createElement(r.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=e.history,r=f(d(h,e.location),e.location),s=r?n.createHref(r):"",g=(0,l.Z)({},v,{href:s,navigate:function(){var t=d(h,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(f(t));(u||r?n.replace:n.push)(t)}});return p!==m?g.ref=t||b:g.innerRef=b,o.createElement(a,g)}))})),b=function(e){return e},v=o.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,p=e.activeStyle,m=e.className,g=e.exact,y=e.isActive,w=e.location,k=e.sensitive,E=e.strict,S=e.style,_=e.to,x=e.innerRef,T=(0,s.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=w||e.location,i=f(d(_,n),n),s=i.pathname,C=s&&s.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),A=C?(0,r.LX)(n.pathname,{path:C,exact:g,sensitive:k,strict:E}):null,L=!!(y?y(A,n):A),P="function"==typeof m?m(L):m,N="function"==typeof S?S(L):S;L&&(P=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(" ")}(P,u),N=(0,l.Z)({},N,p));var I=(0,l.Z)({"aria-current":L&&a||null,className:P,style:N,to:i},T);return b!==v?I.ref=t||x:I.innerRef=x,o.createElement(h,I)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>_,F0:()=>y,LX:()=>S,TH:()=>O,k6:()=>I,rs:()=>P,s6:()=>v});var r=n(5068),a=n(7294),o=n(5697),i=n.n(o),l=n(9318),s=n(8776),c=n(7462),u=n(9658),d=n.n(u),f=(n(9864),n(3366)),p=(n(8679),1073741823),m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var g=a.createContext||function(e,t){var n,o,l="__create-react-context-"+function(){var e="__global_unique_id__";return m[e]=(m[e]||0)+1}()+"__",s=function(e){function n(){for(var t,n,r,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return(t=e.call.apply(e,[this].concat(o))||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.Z)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[l]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;((o=r)===(i=a)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(r,a):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},a.render=function(){return this.props.children},n}(a.Component);s.childContextTypes=((n={})[l]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];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.Z)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},a.componentDidMount=function(){this.context[l]&&this.context[l].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},a.componentWillUnmount=function(){this.context[l]&&this.context[l].off(this.onUpdate)},a.getValue=function(){return this.context[l]?this.context[l].get():e},a.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(a.Component);return c.contextTypes=((o={})[l]=i().object,o),{Provider:s,Consumer:c}},h=function(e){var t=g();return t.displayName=e,t},b=h("Router-History"),v=h("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.Z)(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 a.createElement(v.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component;a.Component;var w={},k=1e4,E=0;function S(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,a=n.exact,o=void 0!==a&&a,i=n.strict,l=void 0!==i&&i,s=n.sensitive,c=void 0!==s&&s;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=w[n]||(w[n]={});if(r[e])return r[e];var a=[],o={regexp:d()(e,a,t),keys:a};return E<k&&(r[e]=o,E++),o}(n,{end:o,strict:l,sensitive:c}),a=r.regexp,i=r.keys,s=a.exec(e);if(!s)return null;var u=s[0],f=s.slice(1),p=e===u;return o&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var _=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(v.Consumer,null,(function(t){t||(0,s.Z)(!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,o=(0,c.Z)({},t,{location:n,match:r}),i=e.props,l=i.children,u=i.component,d=i.render;return Array.isArray(l)&&function(e){return 0===a.Children.count(e)}(l)&&(l=null),a.createElement(v.Provider,{value:o},o.match?l?"function"==typeof l?l(o):l:u?a.createElement(u,o):d?d(o):null:"function"==typeof l?l(o):null)}))},t}(a.Component);function x(e){return"/"===e.charAt(0)?e:"/"+e}function T(e,t){if(!e)return t;var n=x(e);return 0!==t.pathname.indexOf(n)?t:(0,c.Z)({},t,{pathname:t.pathname.substr(n.length)})}function C(e){return"string"==typeof e?e:(0,l.Ep)(e)}function A(e){return function(){(0,s.Z)(!1)}}function L(){}a.Component;var P=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(v.Consumer,null,(function(t){t||(0,s.Z)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,(function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(o.pathname,(0,c.Z)({},e.props,{path:i})):t.match}})),r?a.cloneElement(n,{location:o,computedMatch:r}):null}))},t}(a.Component);var N=a.useContext;function I(){return N(b)}function O(){return N(v).location}},9658:(e,t,n)=>{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],g=n[2],h=n[3],b=n[4],v=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=g&&null!=m&&m!==g,E="+"===y||"*"===y,S="?"===y||"*"===y,_=n[2]||u,x=b||v;r.push({name:h||o++,prefix:g||"",delimiter:_,optional:S,repeat:E,partial:k,asterisk:!!w,pattern:x?c(x):w?".*":"[^"+s(_)+"]+?"})}}return i<e.length&&(l+=e.substr(i)),l&&r.push(l),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=new RegExp("^(?:"+e[a].pattern+")$",d(t)));return function(t,a){for(var o="",l=t||{},s=(a||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=l[u.name];if(null==f){if(u.optional){u.partial&&(o+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=s(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):s(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');o+=u.prefix+d}}else o+=u}return o}}function s(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 f(e,t,n){r(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,o=!1!==n.end,i="",l=0;l<e.length;l++){var c=e[l];if("string"==typeof c)i+=s(c);else{var f=s(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var m=s(n.delimiter||"/"),g=i.slice(-m.length)===m;return a||(i=(g?i.slice(0,-m.length):i)+"(?:"+m+"(?=$))?"),i+=o?"$":a&&g?"":"(?="+m+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(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=[],a=0;a<e.length;a++)r.push(p(e[a],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},2408:(e,t,n)=>{"use strict";var r=n(7418),a=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,l=60110,s=60112;t.Suspense=60113;var c=60115,u=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;a=d("react.element"),o=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),l=d("react.context"),s=d("react.forward_ref"),t.Suspense=d("react.suspense"),c=d("react.memo"),u=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(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 m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g={};function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=h.prototype;var y=v.prototype=new b;y.constructor=v,r(y,h.prototype),y.isPureReactComponent=!0;var w={current:null},k=Object.prototype.hasOwnProperty,E={key:!0,ref:!0,__self:!0,__source:!0};function S(e,t,n){var r,o={},i=null,l=null;if(null!=t)for(r in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,r)&&!E.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(1===s)o.children=n;else if(1<s){for(var c=Array(s),u=0;u<s;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(r in s=e.defaultProps)void 0===o[r]&&(o[r]=s[r]);return{$$typeof:a,type:e,key:i,ref:l,props:o,_owner:w.current}}function _(e){return"object"==typeof e&&null!==e&&e.$$typeof===a}var x=/\/+/g;function T(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 C(e,t,n,r,i){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case a:case o:s=!0}}if(s)return i=i(s=e),e=""===r?"."+T(s,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(x,"$&/")+"/"),C(i,t,n,"",(function(e){return e}))):null!=i&&(_(i)&&(i=function(e,t){return{$$typeof:a,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||s&&s.key===i.key?"":(""+i.key).replace(x,"$&/")+"/")+e)),t.push(i)),1;if(s=0,r=""===r?".":r+":",Array.isArray(e))for(var c=0;c<e.length;c++){var u=r+T(l=e[c],c);s+=C(l,t,n,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;!(l=e.next()).done;)s+=C(l=l.value,t,n,u=r+T(l,c++),i);else if("object"===l)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return s}function A(e,t,n){if(null==e)return e;var r=[],a=0;return C(e,r,"","",(function(e){return t.call(n,e,a++)})),r}function L(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var P={current:null};function N(){var e=P.current;if(null===e)throw Error(p(321));return e}var I={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:w,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:A,forEach:function(e,t,n){A(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return A(e,(function(){t++})),t},toArray:function(e){return A(e,(function(e){return e}))||[]},only:function(e){if(!_(e))throw Error(p(143));return e}},t.Component=h,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=I,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var o=r({},e.props),i=e.key,l=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(l=t.ref,s=w.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(u in t)k.call(t,u)&&!E.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==c?c[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){c=Array(u);for(var d=0;d<u;d++)c[d]=arguments[d+2];o.children=c}return{$$typeof:a,type:e.type,key:i,ref:l,props:o,_owner:s}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:l,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=S,t.createFactory=function(e){var t=S.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:s,render:e}},t.isValidElement=_,t.lazy=function(e){return{$$typeof:u,_payload:{_status:-1,_result:e},_init:L}},t.memo=function(e,t){return{$$typeof:c,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return N().useCallback(e,t)},t.useContext=function(e,t){return N().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return N().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return N().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return N().useLayoutEffect(e,t)},t.useMemo=function(e,t){return N().useMemo(e,t)},t.useReducer=function(e,t,n){return N().useReducer(e,t,n)},t.useRef=function(e){return N().useRef(e)},t.useState=function(e){return N().useState(e)},t.version="17.0.2"},7294:(e,t,n)=>{"use strict";e.exports=n(2408)},53:(e,t)=>{"use strict";var n,r,a,o;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var c=null,u=null,d=function(){if(null!==c)try{var e=t.unstable_now();c(!0,e),c=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==c?setTimeout(n,0,e):(c=e,setTimeout(d,0))},r=function(e,t){u=setTimeout(e,t)},a=function(){clearTimeout(u)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var m=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof m&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var g=!1,h=null,b=-1,v=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},o=function(){},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"):v=0<e?Math.floor(1e3/e):5};var w=new MessageChannel,k=w.port2;w.port1.onmessage=function(){if(null!==h){var e=t.unstable_now();y=e+v;try{h(!0,e)?k.postMessage(null):(g=!1,h=null)}catch(n){throw k.postMessage(null),n}}else g=!1},n=function(e){h=e,g||(g=!0,k.postMessage(null))},r=function(e,n){b=f((function(){e(t.unstable_now())}),n)},a=function(){p(b),b=-1}}function E(e,t){var n=e.length;e.push(t);e:for(;;){var r=n-1>>>1,a=e[r];if(!(void 0!==a&&0<x(a,t)))break e;e[r]=t,e[n]=a,n=r}}function S(e){return void 0===(e=e[0])?null:e}function _(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,a=e.length;r<a;){var o=2*(r+1)-1,i=e[o],l=o+1,s=e[l];if(void 0!==i&&0>x(i,n))void 0!==s&&0>x(s,i)?(e[r]=s,e[l]=n,r=l):(e[r]=i,e[o]=n,r=o);else{if(!(void 0!==s&&0>x(s,n)))break e;e[r]=s,e[l]=n,r=l}}}return t}return null}function x(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var T=[],C=[],A=1,L=null,P=3,N=!1,I=!1,O=!1;function R(e){for(var t=S(C);null!==t;){if(null===t.callback)_(C);else{if(!(t.startTime<=e))break;_(C),t.sortIndex=t.expirationTime,E(T,t)}t=S(C)}}function M(e){if(O=!1,R(e),!I)if(null!==S(T))I=!0,n(D);else{var t=S(C);null!==t&&r(M,t.startTime-e)}}function D(e,n){I=!1,O&&(O=!1,a()),N=!0;var o=P;try{for(R(n),L=S(T);null!==L&&(!(L.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=L.callback;if("function"==typeof i){L.callback=null,P=L.priorityLevel;var l=i(L.expirationTime<=n);n=t.unstable_now(),"function"==typeof l?L.callback=l:L===S(T)&&_(T),R(n)}else _(T);L=S(T)}if(null!==L)var s=!0;else{var c=S(C);null!==c&&r(M,c.startTime-n),s=!1}return s}finally{L=null,P=o,N=!1}}var B=o;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(){I||N||(I=!0,n(D))},t.unstable_getCurrentPriorityLevel=function(){return P},t.unstable_getFirstCallbackNode=function(){return S(T)},t.unstable_next=function(e){switch(P){case 1:case 2:case 3:var t=3;break;default:t=P}var n=P;P=t;try{return e()}finally{P=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=B,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=P;P=e;try{return t()}finally{P=n}},t.unstable_scheduleCallback=function(e,o,i){var l=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?l+i:l:i=l,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:A++,callback:o,priorityLevel:e,startTime:i,expirationTime:s=i+s,sortIndex:-1},i>l?(e.sortIndex=i,E(C,e),null===S(T)&&e===S(C)&&(O?a():O=!0,r(M,i-l))):(e.sortIndex=s,E(T,e),I||N||(I=!0,n(D))),e},t.unstable_wrapCallback=function(e){var t=P;return function(){var n=P;P=t;try{return e.apply(this,arguments)}finally{P=n}}}},3840:(e,t,n)=>{"use strict";e.exports=n(53)},6774:e=>{e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(t),s=0;s<o.length;s++){var c=o[s];if(!l(c))return!1;var u=e[c],d=t[c];if(!1===(a=n?n.call(r,u,d,c):void 0)||void 0===a&&u!==d)return!1}return!0}},3250:(e,t,n)=>{"use strict";var r=n(7294);var a="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,i=r.useEffect,l=r.useLayoutEffect,s=r.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!a(e,n)}catch(r){return!0}}var u="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),r=o({inst:{value:n,getSnapshot:t}}),a=r[0].inst,u=r[1];return l((function(){a.value=n,a.getSnapshot=t,c(a)&&u({inst:a})}),[e,n,t]),i((function(){return c(a)&&u({inst:a}),e((function(){c(a)&&u({inst:a})}))}),[e]),s(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:u},1688:(e,t,n)=>{"use strict";e.exports=n(3250)},6809:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"mf",tagline:"blog and additional materials for courses at \u03c6",url:"https://blog.mfocko.xyz",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"throw",favicon:"img/favicon.ico",i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:!1,blog:!1,theme:{customCss:["/home/runner/work/blog/blog/src/css/custom.scss","/home/runner/work/blog/blog/src/css/jetbrains_mono.css"]}}]],plugins:[["@docusaurus/plugin-content-docs",{id:"ib002",path:"ib002",routeBasePath:"ib002",sidebarPath:"/home/runner/work/blog/blog/sidebars.js",showLastUpdateTime:!0,editUrl:"https://gitlab.com/mfocko/blog/tree/main",remarkPlugins:[null],rehypePlugins:[null]}],["@docusaurus/plugin-content-docs",{id:"pb071",path:"pb071",routeBasePath:"pb071",sidebarPath:"/home/runner/work/blog/blog/sidebars.js",showLastUpdateTime:!0,editUrl:"https://gitlab.com/mfocko/blog/tree/main",remarkPlugins:[null],rehypePlugins:[null]}],["@docusaurus/plugin-content-docs",{id:"pb161",path:"pb161",routeBasePath:"pb161",sidebarPath:"/home/runner/work/blog/blog/sidebars.js",showLastUpdateTime:!0,editUrl:"https://gitlab.com/mfocko/blog/tree/main",remarkPlugins:[null],rehypePlugins:[null]}],["@docusaurus/plugin-content-blog",{id:"blog",routeBasePath:"blog",path:"./blog",feedOptions:{type:"all",description:"mf's blog"},editUrl:"https://gitlab.com/mfocko/blog/tree/main",remarkPlugins:[null],rehypePlugins:[null]}],"docusaurus-plugin-sass"],stylesheets:[{href:"https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css",type:"text/css",integrity:"sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM",crossorigin:"anonymous"}],themeConfig:{navbar:{title:"mf",items:[{type:"dropdown",label:"Additional FI MU materials",items:[{type:"doc",docId:"ib002-intro",docsPluginId:"ib002",label:"IB002: Algorithms"},{type:"doc",docId:"pb071-intro",docsPluginId:"pb071",label:"PB071: C"},{type:"doc",docId:"pb161-intro",docsPluginId:"pb161",label:"PB161: C++"}],position:"left"},{to:"contributions",label:"Contributions",position:"left"},{to:"talks",label:"Talks",position:"left"},{to:"blog",position:"right",label:"Blog"}],hideOnScroll:!1},footer:{style:"dark",copyright:"Copyright \xa9 2023 Matej Focko.",links:[{title:"Git",items:[{label:"GitHub",href:"https://github.com/mfocko"},{label:"GitLab",href:"https://gitlab.com/mfocko"},{label:"Gitea (self-hosted)",href:"https://git.mfocko.xyz/mfocko"}]},{title:"Social #1",items:[{label:"LinkedIn",href:"https://www.linkedin.com/in/mfocko/"},{label:"Fosstodon",href:"https://fosstodon.org/@m4tt_314"},{label:"Hachyderm.io",href:"https://hachyderm.io/@m4tt_314"}]},{title:"Social #2",items:[{label:"Twitter",href:"https://twitter.com/m4tt_314"},{label:"Twitch",href:"https://twitch.tv/m4tt_314"},{label:"Ko-fi",href:"https://ko-fi.com/m4tt_314"}]}]},prism:{theme:{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)"}}]},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:["ada","bash","csharp","dot","haskell","java","nix","pascal","ruby","rust"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},docs:{sidebar:{hideable:!0,autoCollapseCategories:!1},versionPersistence:"localStorage"},mermaid:{options:{fontFamily:"Iosevka,'Iosevka Term','Cascadia Code','JetBrains Mono','Fira Code',monospace"},theme:{dark:"dark",light:"default"}},algolia:{appId:"0VXRFPR4QF",apiKey:"9d4d452117cfaaae3e51b9568e22aa16",indexName:"mfocko",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},markdown:{mermaid:!0},themes:["@docusaurus/theme-mermaid"],baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},scripts:[],headTags:[],clientModules:[],titleDelimiter:"|",noIndex:!1}},7462:(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,{Z:()=>r})},5068:(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 a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{Z:()=>a})},3366:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}n.d(t,{Z:()=>r})},8776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=!0,a="Invariant failed";function o(e,t){if(!e){if(r)throw new Error(a);var n="function"==typeof t?t():t,o=n?"".concat(a,": ").concat(n):a;throw new Error(o)}}},7529:e=>{"use strict";e.exports={}},6887:e=>{"use strict";e.exports=JSON.parse('{"/blog-a0e":{"__comp":"a6aa9e1f","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"af8b72a7"},{"content":"ab2721d4"},{"content":"bb882650"},{"content":"75cccf44"},{"content":"a6a48ea2"},{"content":"95f41f0b"},{"content":"d7f7fb17"}],"metadata":"a7098721"},"/blog/2023/08/02/copr-75c":{"__comp":"ccc49370","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","content":"b5a32f14"},"/blog/aoc-2022/1st-week-0fa":{"__comp":"ccc49370","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","content":"dff2ebad"},"/blog/aoc-2022/2nd-week-0be":{"__comp":"ccc49370","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","content":"377f3aa1"},"/blog/aoc-2022/3rd-week-2f7":{"__comp":"ccc49370","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","content":"f48be158"},"/blog/aoc-2022/4th-week-9fd":{"__comp":"ccc49370","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","content":"3da4b779"},"/blog/aoc-2022/intro-645":{"__comp":"ccc49370","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","content":"51624505"},"/blog/archive-db3":{"__comp":"9e4087bc","__context":{"plugin":"0220f5fc"},"archive":"4200b1a9"},"/blog/leetcode/sort-diagonally-819":{"__comp":"ccc49370","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","content":"cfa2b263"},"/blog/tags-726":{"__comp":"01a85c17","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","tags":"66d5ef6c"},"/blog/tags/\ud83c\udfed-fa9":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"af8b72a7"}],"tag":"765ea78b","listMetadata":"b25fbc58"},"/blog/tags/admin-3a8":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"af8b72a7"}],"tag":"a082abd3","listMetadata":"146d9b84"},"/blog/tags/advent-of-code-3ce":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"ab2721d4"},{"content":"bb882650"},{"content":"a6a48ea2"},{"content":"95f41f0b"},{"content":"d7f7fb17"}],"tag":"19d7c045","listMetadata":"8b1802c5"},"/blog/tags/advent-of-code-2022-a9b":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"ab2721d4"},{"content":"bb882650"},{"content":"a6a48ea2"},{"content":"95f41f0b"},{"content":"d7f7fb17"}],"tag":"a80747a0","listMetadata":"62d847b3"},"/blog/tags/copr-dd4":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"af8b72a7"}],"tag":"b45dccf0","listMetadata":"3011a4c0"},"/blog/tags/cpp-d2e":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"75cccf44"}],"tag":"4edd2021","listMetadata":"4621632b"},"/blog/tags/iterators-f8b":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"75cccf44"}],"tag":"ff472cd9","listMetadata":"29694455"},"/blog/tags/leetcode-238":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"75cccf44"}],"tag":"86cd1460","listMetadata":"e89da83e"},"/blog/tags/red-hat-06b":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"af8b72a7"}],"tag":"52f2a5bf","listMetadata":"d79dd549"},"/blog/tags/rust-576":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"ab2721d4"},{"content":"bb882650"},{"content":"a6a48ea2"},{"content":"95f41f0b"},{"content":"d7f7fb17"}],"tag":"9287eafd","listMetadata":"0bfe45d5"},"/blog/tags/vps-afb":{"__comp":"6875c492","__context":{"plugin":"0220f5fc"},"sidebar":"95b96bb9","items":[{"content":"af8b72a7"}],"tag":"8c0e532b","listMetadata":"0608d96f"},"/contributions-c6e":{"__comp":"22a175ec","__context":{"plugin":"d675395f"},"config":"5e9f5e1a"},"/ib002/tags-139":{"__comp":"3720c009","__context":{"plugin":"280c26e1"},"tags":"52bff962"},"/ib002/tags/applications-bd0":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"470a9204"},"/ib002/tags/backtracking-e79":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"74c2e0e9"},"/ib002/tags/balanced-trees-633":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"5af27364"},"/ib002/tags/bfs-2b0":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"1e298f0c"},"/ib002/tags/bottom-up-dp-bfd":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"fd0b1e16"},"/ib002/tags/c-41d":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"58dd4fbd"},"/ib002/tags/csharp-e02":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"95be84b6"},"/ib002/tags/dynamic-array-a76":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"d9adc206"},"/ib002/tags/dynamic-programming-5f1":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"82b3b723"},"/ib002/tags/exponential-3dd":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"4c4e9f30"},"/ib002/tags/graphs-b40":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"dadfcff0"},"/ib002/tags/greedy-f4e":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"3593220c"},"/ib002/tags/iterative-81e":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"3aef4518"},"/ib002/tags/iterators-a31":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"73d5f13d"},"/ib002/tags/java-99a":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"18f481e4"},"/ib002/tags/karel-a44":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"edfd2a45"},"/ib002/tags/postconditions-5a4":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"37cf4872"},"/ib002/tags/python-2cd":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"75316eff"},"/ib002/tags/recursion-1ae":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"8418981c"},"/ib002/tags/red-black-trees-2b4":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"eb7cc117"},"/ib002/tags/sorting-90a":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"d5ca4423"},"/ib002/tags/testing-b13":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"d02d148d"},"/ib002/tags/time-complexity-01e":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"be4da062"},"/ib002/tags/top-down-dp-e81":{"__comp":"df203c0f","__context":{"plugin":"280c26e1"},"tag":"e25b3183"},"/search-49e":{"__comp":"1a4e3797","__context":{"plugin":"b0291f37"}},"/talks-cdf":{"__comp":"0fcbc6ca","__context":{"plugin":"d675395f"},"config":"5e9f5e1a"},"/ib002-092":{"__comp":"1be78505","__context":{"plugin":"280c26e1"},"versionMetadata":"b0067e0a"},"/ib002/-e66":{"__comp":"17896441","content":"834ed470"},"/ib002/algorithms-correctness/postcondition-ambiguity-760":{"__comp":"17896441","content":"9eb50c57"},"/ib002/category/algorithms-and-correctness-cde":{"__comp":"14eb3368","categoryGeneratedIndex":"8e1fadd0"},"/ib002/category/asymptotic-notation-and-time-complexity-b3d":{"__comp":"14eb3368","categoryGeneratedIndex":"a7d8226e"},"/ib002/category/graphs-eb5":{"__comp":"14eb3368","categoryGeneratedIndex":"09bc59e7"},"/ib002/category/recursion-39b":{"__comp":"14eb3368","categoryGeneratedIndex":"b2c263ce"},"/ib002/category/red-black-trees-e0c":{"__comp":"14eb3368","categoryGeneratedIndex":"d74d369f"},"/ib002/graphs/bfs-tree-aaa":{"__comp":"17896441","content":"2a09abcd"},"/ib002/graphs/iterative-and-iterators-489":{"__comp":"17896441","content":"fcc91f97"},"/ib002/rb-trees/applications-cfb":{"__comp":"17896441","content":"1e2009d3"},"/ib002/rb-trees/rules-35f":{"__comp":"17896441","content":"3de247b5"},"/ib002/recursion/karel-1-11c":{"__comp":"17896441","content":"4e286f4e"},"/ib002/recursion/pyramid-slide-down-73a":{"__comp":"17896441","content":"7d580cdb"},"/ib002/time-complexity/extend-712":{"__comp":"17896441","content":"788cc978"},"/pb071-f28":{"__comp":"1be78505","__context":{"plugin":"27470891"},"versionMetadata":"1bebd4ed"},"/pb071/-66f":{"__comp":"17896441","content":"337bc122"},"/pb071/bonuses/seminar-03-86d":{"__comp":"17896441","content":"90425ffc"},"/pb071/bonuses/seminar-04-7d6":{"__comp":"17896441","content":"713b7838"},"/pb071/bonuses/seminar-05-06-c41":{"__comp":"17896441","content":"f533ef4a"},"/pb071/bonuses/seminar-08-487":{"__comp":"17896441","content":"2523321d"},"/pb071/bonuses/seminar-10-8b8":{"__comp":"17896441","content":"7cf94373"},"/pb071/category/bonuses-995":{"__comp":"14eb3368","categoryGeneratedIndex":"4688cd57"},"/pb071/category/practice-exams-066":{"__comp":"14eb3368","categoryGeneratedIndex":"d661cf04"},"/pb071/mr-a43":{"__comp":"17896441","content":"83bf91d3"},"/pb071/pexam/cams-a0c":{"__comp":"17896441","content":"b9b1ccdc"},"/pb071/pexam/garbage_collect-0af":{"__comp":"17896441","content":"f60c832f"},"/pb161-bca":{"__comp":"1be78505","__context":{"plugin":"c8cbffbd"},"versionMetadata":"94036ea2"},"/pb161/-726":{"__comp":"17896441","content":"4ee12fa2"},"/pb161/environment-a0b":{"__comp":"17896441","content":"a2be6ffb"},"/-dfb":{"__comp":"c4f5d8e4","__context":{"plugin":"d675395f"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[532],(()=>{return t=9383,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.9283b308.js.LICENSE.txt b/assets/js/main.9283b308.js.LICENSE.txt new file mode 100644 index 0000000..eb75d69 --- /dev/null +++ b/assets/js/main.9283b308.js.LICENSE.txt @@ -0,0 +1,63 @@ +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +/** + * @license React + * use-sync-external-store-shim.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT <https://opensource.org/licenses/MIT> + * @author Lea Verou <https://lea.verou.me> + * @namespace + * @public + */ + +/** @license React v0.20.2 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v17.0.2 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v17.0.2 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/runtime~main.be793c46.js b/assets/js/runtime~main.be793c46.js new file mode 100644 index 0000000..f95901b --- /dev/null +++ b/assets/js/runtime~main.be793c46.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,f,a,c,d={},b={};function t(e){var f=b[e];if(void 0!==f)return f.exports;var a=b[e]={exports:{}};return d[e].call(a.exports,a,a.exports,t),a.exports}t.m=d,e=[],t.O=(f,a,c,d)=>{if(!a){var b=1/0;for(i=0;i<e.length;i++){a=e[i][0],c=e[i][1],d=e[i][2];for(var r=!0,o=0;o<a.length;o++)(!1&d||b>=d)&&Object.keys(t.O).every((e=>t.O[e](a[o])))?a.splice(o--,1):(r=!1,d<b&&(b=d));if(r){e.splice(i--,1);var n=c();void 0!==n&&(f=n)}}return f}d=d||0;for(var i=e.length;i>0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[a,c,d]},t.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return t.d(f,{a:f}),f},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var d=Object.create(null);t.r(d);var b={};f=f||[null,a({}),a([]),a(a)];for(var r=2&c&&e;"object"==typeof r&&!~f.indexOf(r);r=a(r))Object.getOwnPropertyNames(r).forEach((f=>b[f]=()=>e[f]));return b.default=()=>e,t.d(d,b),d},t.d=(e,f)=>{for(var a in f)t.o(f,a)&&!t.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:f[a]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((f,a)=>(t.f[a](e,f),f)),[])),t.u=e=>"assets/js/"+({6:"e25b3183",143:"eb7cc117",146:"dff2ebad",404:"1bebd4ed",516:"a7d8226e",822:"8c0e532b",866:"4200b1a9",932:"4688cd57",1011:"377f3aa1",1050:"a7098721",1171:"d7f7fb17",1235:"86cd1460",1246:"2a09abcd",1272:"b0067e0a",1378:"0220f5fc",1501:"4e286f4e",1505:"3aef4518",1731:"337bc122",1851:"0fcbc6ca",2160:"f533ef4a",2167:"713b7838",2177:"3da4b779",2433:"b5a32f14",2732:"1e298f0c",2741:"d675395f",3039:"765ea78b",3086:"cfa2b263",3089:"a6aa9e1f",3095:"7cf94373",3184:"3de247b5",3223:"834ed470",3340:"58dd4fbd",3388:"29694455",3502:"5af27364",3519:"4621632b",3528:"74c2e0e9",3561:"95b96bb9",3608:"9e4087bc",3618:"a6a48ea2",3731:"51624505",3751:"3720c009",3835:"95be84b6",3906:"1e2009d3",3936:"470a9204",4013:"01a85c17",4064:"f48be158",4195:"c4f5d8e4",4252:"d9adc206",4256:"75cccf44",4269:"0bfe45d5",4287:"75316eff",4477:"94036ea2",4637:"19d7c045",4800:"a2be6ffb",4932:"09bc59e7",4972:"27470891",5126:"d5ca4423",5169:"d79dd549",5383:"8418981c",5388:"fd0b1e16",5430:"52f2a5bf",5521:"9287eafd",5529:"280c26e1",5658:"af8b72a7",5787:"82b3b723",5824:"a80747a0",5975:"4edd2021",6057:"18f481e4",6097:"b0291f37",6103:"ccc49370",6112:"d661cf04",6192:"b2c263ce",6234:"fcc91f97",6498:"be4da062",6554:"8e1fadd0",6890:"22a175ec",7248:"edfd2a45",7509:"9eb50c57",7555:"73d5f13d",7568:"0608d96f",7624:"dadfcff0",7755:"ab2721d4",7780:"d02d148d",7823:"83bf91d3",7883:"4c4e9f30",7918:"17896441",7920:"1a4e3797",7926:"3011a4c0",7963:"4ee12fa2",7979:"37cf4872",8091:"bb882650",8167:"3593220c",8442:"7d580cdb",8480:"8b1802c5",8520:"62d847b3",8610:"6875c492",8643:"ff472cd9",8757:"e89da83e",8769:"90425ffc",8786:"a082abd3",9044:"b9b1ccdc",9157:"788cc978",9193:"2523321d",9197:"b25fbc58",9228:"66d5ef6c",9300:"146d9b84",9385:"95f41f0b",9479:"d74d369f",9514:"1be78505",9611:"f60c832f",9679:"b45dccf0",9710:"52bff962",9814:"c8cbffbd",9817:"14eb3368",9924:"df203c0f"}[e]||e)+"."+{6:"1c50e16b",143:"55f4bd7d",146:"0c0a899d",404:"a838562f",516:"dabdb919",822:"9cbc1be0",866:"e4798bae",932:"4f084bfb",1011:"4c98e03e",1050:"ef506174",1171:"fd985da7",1235:"733128af",1246:"15946a52",1272:"68fd3778",1378:"5b1b8f6e",1426:"d90fc9fa",1501:"b0df1295",1505:"ae37468c",1731:"a2fd825d",1851:"e8ea4c91",2160:"13c50ab8",2167:"e5a05e06",2177:"a33bbff3",2433:"3c491fc9",2732:"caf61e40",2741:"567b4609",3039:"eff9c6dc",3086:"c19c407b",3089:"c08b78c4",3095:"f790d5a8",3184:"66851c3c",3223:"690ec9f0",3340:"f45f89fa",3388:"a2e2c1d7",3502:"400470ed",3519:"f101cb78",3528:"fc48acce",3561:"aefbf3b7",3608:"dadc79bc",3618:"d5faeb42",3731:"ab30cae6",3751:"996e811f",3835:"0463fc28",3906:"7e268ae7",3936:"f961c4a3",4013:"02ca9acb",4064:"eaa96907",4195:"05fc7105",4252:"4d3c59b2",4256:"5b6f1b34",4269:"58ce388b",4287:"a7b24a88",4477:"8be2e014",4637:"18dfd0ba",4800:"f8d1346f",4932:"64a221ae",4972:"d509d6e4",5126:"c7f8ab3b",5169:"ee10504b",5383:"3eb99a51",5388:"7f8a8c44",5430:"f6c9442b",5521:"8885dd15",5529:"27c7a6b1",5658:"1e28998e",5787:"fdccb1de",5824:"4dc03a81",5975:"47ff14e6",6048:"83823b1f",6057:"35406774",6097:"5b91d377",6103:"6c86d4f9",6112:"70911e61",6192:"01869630",6234:"acb581ec",6316:"0ca4149a",6498:"4dfd3eed",6554:"b5230023",6890:"a5706cf0",6945:"04a6ca6a",7248:"1bede75c",7509:"bc586b34",7515:"45da5915",7555:"2c8e245a",7568:"ee46e047",7624:"3cd22a72",7724:"0fff5da7",7755:"e0b371f9",7780:"0cb68506",7823:"21975b05",7883:"f247e2b4",7918:"a160e7e2",7920:"48f1640b",7926:"573f9325",7963:"74d68d7b",7979:"0b06d100",8091:"671a659f",8167:"04c28473",8442:"71718a61",8480:"6f267f4c",8520:"06e10519",8610:"2d487359",8643:"4ff57c91",8757:"a63c019a",8769:"955d8c56",8786:"1797976b",8894:"de4803df",8954:"296edd99",9044:"859f8a18",9157:"4f78c34d",9193:"50613303",9197:"c6b468d1",9228:"fc107ca5",9300:"996dfbcb",9385:"79e14732",9479:"ab677fcf",9487:"b3a824a3",9514:"65bfdbb1",9611:"d6dc7ae0",9679:"5fcb5182",9710:"6e8cadd8",9814:"a55be3a0",9817:"9c4e865a",9924:"1c48be56"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),c={},t.l=(e,f,a,d)=>{if(c[e])c[e].push(f);else{var b,r;if(void 0!==a)for(var o=document.getElementsByTagName("script"),n=0;n<o.length;n++){var i=o[n];if(i.getAttribute("src")==e||i.getAttribute("data-webpack")=="fi:"+a){b=i;break}}b||(r=!0,(b=document.createElement("script")).charset="utf-8",b.timeout=120,t.nc&&b.setAttribute("nonce",t.nc),b.setAttribute("data-webpack","fi:"+a),b.src=e),c[e]=[f];var u=(f,a)=>{b.onerror=b.onload=null,clearTimeout(l);var d=c[e];if(delete c[e],b.parentNode&&b.parentNode.removeChild(b),d&&d.forEach((e=>e(a))),f)return f(a)},l=setTimeout(u.bind(null,void 0,{type:"timeout",target:b}),12e4);b.onerror=u.bind(null,b.onerror),b.onload=u.bind(null,b.onload),r&&document.head.appendChild(b)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={17896441:"7918",27470891:"4972",29694455:"3388",51624505:"3731",e25b3183:"6",eb7cc117:"143",dff2ebad:"146","1bebd4ed":"404",a7d8226e:"516","8c0e532b":"822","4200b1a9":"866","4688cd57":"932","377f3aa1":"1011",a7098721:"1050",d7f7fb17:"1171","86cd1460":"1235","2a09abcd":"1246",b0067e0a:"1272","0220f5fc":"1378","4e286f4e":"1501","3aef4518":"1505","337bc122":"1731","0fcbc6ca":"1851",f533ef4a:"2160","713b7838":"2167","3da4b779":"2177",b5a32f14:"2433","1e298f0c":"2732",d675395f:"2741","765ea78b":"3039",cfa2b263:"3086",a6aa9e1f:"3089","7cf94373":"3095","3de247b5":"3184","834ed470":"3223","58dd4fbd":"3340","5af27364":"3502","4621632b":"3519","74c2e0e9":"3528","95b96bb9":"3561","9e4087bc":"3608",a6a48ea2:"3618","3720c009":"3751","95be84b6":"3835","1e2009d3":"3906","470a9204":"3936","01a85c17":"4013",f48be158:"4064",c4f5d8e4:"4195",d9adc206:"4252","75cccf44":"4256","0bfe45d5":"4269","75316eff":"4287","94036ea2":"4477","19d7c045":"4637",a2be6ffb:"4800","09bc59e7":"4932",d5ca4423:"5126",d79dd549:"5169","8418981c":"5383",fd0b1e16:"5388","52f2a5bf":"5430","9287eafd":"5521","280c26e1":"5529",af8b72a7:"5658","82b3b723":"5787",a80747a0:"5824","4edd2021":"5975","18f481e4":"6057",b0291f37:"6097",ccc49370:"6103",d661cf04:"6112",b2c263ce:"6192",fcc91f97:"6234",be4da062:"6498","8e1fadd0":"6554","22a175ec":"6890",edfd2a45:"7248","9eb50c57":"7509","73d5f13d":"7555","0608d96f":"7568",dadfcff0:"7624",ab2721d4:"7755",d02d148d:"7780","83bf91d3":"7823","4c4e9f30":"7883","1a4e3797":"7920","3011a4c0":"7926","4ee12fa2":"7963","37cf4872":"7979",bb882650:"8091","3593220c":"8167","7d580cdb":"8442","8b1802c5":"8480","62d847b3":"8520","6875c492":"8610",ff472cd9:"8643",e89da83e:"8757","90425ffc":"8769",a082abd3:"8786",b9b1ccdc:"9044","788cc978":"9157","2523321d":"9193",b25fbc58:"9197","66d5ef6c":"9228","146d9b84":"9300","95f41f0b":"9385",d74d369f:"9479","1be78505":"9514",f60c832f:"9611",b45dccf0:"9679","52bff962":"9710",c8cbffbd:"9814","14eb3368":"9817",df203c0f:"9924"}[e]||e,t.p+t.u(e)},(()=>{var e={1303:0,532:0};t.f.j=(f,a)=>{var c=t.o(e,f)?e[f]:void 0;if(0!==c)if(c)a.push(c[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var d=new Promise(((a,d)=>c=e[f]=[a,d]));a.push(c[2]=d);var b=t.p+t.u(f),r=new Error;t.l(b,(a=>{if(t.o(e,f)&&(0!==(c=e[f])&&(e[f]=void 0),c)){var d=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;r.message="Loading chunk "+f+" failed.\n("+d+": "+b+")",r.name="ChunkLoadError",r.type=d,r.request=b,c[1](r)}}),"chunk-"+f,f)}},t.O.j=f=>0===e[f];var f=(f,a)=>{var c,d,b=a[0],r=a[1],o=a[2],n=0;if(b.some((f=>0!==e[f]))){for(c in r)t.o(r,c)&&(t.m[c]=r[c]);if(o)var i=o(t)}for(f&&f(a);n<b.length;n++)d=b[n],t.o(e,d)&&e[d]&&e[d][0](),e[d]=0;return t.O(i)},a=self.webpackChunkfi=self.webpackChunkfi||[];a.forEach(f.bind(null,0)),a.push=f.bind(null,a.push.bind(a))})()})(); \ No newline at end of file diff --git a/blog/2023/08/02/copr/index.html b/blog/2023/08/02/copr/index.html new file mode 100644 index 0000000..15fe6e0 --- /dev/null +++ b/blog/2023/08/02/copr/index.html @@ -0,0 +1,67 @@ +<!doctype html> +<html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-blog"> +<head> +<meta charset="UTF-8"> +<meta name="generator" content="Docusaurus v2.4.1"> +<title data-rh="true">How can Copr help with broken dependencies | mf + + + + + + + + + + + + + +
+

How can Copr help with broken dependencies

· 4 min read
Matej Focko

When you decide to run Fedora on your VPS, you might get screwed over by using +random repositories…

When I “reserved” my VPS1 back in June '20, I slapped Fedora on it without +thinking. I bet 99% of people would say that I'm crazy for doing such thing2, +BUT I've been using Fedora on my PCs for some time already and it felt very +stable and natural to just use, even for VPS.

One of the first things I've done was setting up a mail server. You may guess +what's the fun part about having a mail server… Yes, it's all the spam you +receive and only then you realize how much “crap” gets filtered on free mail +services. To battle this problem I chose to use +rspamd that had CentOS support, but someone +had a Copr repository that I used to +install it.

How does Copr repositories work?

If you have ever used Ubuntu, you might be familiar with the concept since it is +very close to PPAs.

tl;dr of the whole process consists of

  1. enabling the Copr repository, and
  2. installing the desired package.

So in shell you would do

# dnf copr enable ‹copr-repository›
# dnf install ‹package-from-the-repository›

And… that's it! Nothing else needed! Simple, right? And literally same process +as you would do for the PPA.

AUR

On the other hand, if you are familiar with the archLinux, you definitely know +AUR and what it can do for you. Copr repository is pretty similar, but the +packages are prebuilt in Copr and Copr repositories can carry the required +dependencies for said packages, which simplifies the distribution, and can even +help with installing singular packages (when you just need the dependency, not +everything).

My issue

Now you might wonder how would I use it on my VPS. It's rather simple, once in +6 months a new Fedora release comes out. And you need to upgrade to newer +release… You don't need to do it right away and for such setup it probably isn't +even recommended.

tip

Fedora releases are supported for a year, i.e. they live 6 months till the next +release and then another 6 months till another release.

Some people prefer to run one version “behind”. If you ever decide to run it on +your home server or in a similar setup, it might be a pretty good idea to +follow. I'm using the “latest greatest”, cause why not 😄

One way or another, you still need to bump the release every six months, unless +you'd bump 2 releases at once every year, which would be a decision, since, at +least I, cannot see any benefits in it… You don't go for “stability”, cause once +a year you switch to the latest release and then, before you bump, you use one +year old software, so you're not even using the latest.

Fast-forward 2 years in the future, new Fedora release came out (October '22) +and I was doing an upgrade. Dependencies of the rspamd have been updated and +rspamd builds in Copr have failed and no one fixed it. Cool, so now I can +upgrade, but can either ignore the dependencies or uninstall the rspamd…

How can Copr help?

I have managed to find +specfile for the +rspamd package that they use for CentOS. There were some files apart from the +specfile, so I had to make an SRPM locally and then… I just uploaded the SRPM +to the Copr to +build +an RPM.

I have switched the previous Copr repository for rspamd with my own and happily +proceeded with the upgrade.

Conclusion

Copr is heavily used for testing builds on the upstream with +Packit. However, as you can see, it is possible to use it +very well for packaging your own stuff and avoiding issues (such as the one +I have described above), if need be.


  1. vpsFree.cz
  2. Even though I've been running archLinux on some Raspberry Pi's and also +on one of my “home servers”, before getting the VPS. You could say I like +to live on the edge…
+ + + + \ No newline at end of file diff --git a/blog/aoc-2022/1st-week/index.html b/blog/aoc-2022/1st-week/index.html new file mode 100644 index 0000000..d0562bf --- /dev/null +++ b/blog/aoc-2022/1st-week/index.html @@ -0,0 +1,111 @@ + + + + + +1st week of Advent of Code '22 in Rust | mf + + + + + + + + + + + + + +
+

1st week of Advent of Code '22 in Rust

· 13 min read
Matej Focko

Let's go through the first week of Advent of Code in Rust.

note

If you wish to have a look at the solutions, you can follow them on my GitLab. +More specifically in the /src/bin/.

I will try to summarize my experience with using Rust for the AoC. Trying it out +ages ago, I believe it will be pain and suffering, but we will see. For each +day I will also try to give a tl;dr of the problem, so that you can better imagine +the relation to my woes or 👍 moments.

Day 1: Calorie Counting

tl;dr

As the name suggests, we get the calories of the food contained in the elves +backpacks and we want to choose the elf that has the most food ;)

Wakey wakey!

Programming in Rust at 6am definitely hits. I've also forgotten to mention how I +handle samples. With each puzzle you usually get a sample input and expected +output. You can use them to verify that your solution works, or usually doesn't.

At first I've decided to put asserts into my main, something like

assert_eq!(part_1(&sample), 24000);
info!("Part 1: {}", part_1(&input));

assert_eq!(part_2(&sample), 45000);
info!("Part 2: {}", part_2(&input));

However, once you get further, the sample input may take some time to run itself. +So in the end, I have decided to turn them into unit tests:

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_part_1() {
let sample = parse_input("samples/day01.txt");
assert_eq!(part_1(&sample), 24000);
}

#[test]
fn test_part_2() {
let sample = parse_input("samples/day01.txt");
assert_eq!(part_2(&sample), 45000);
}
}

And later on I have noticed, it's hard to tell the difference between the days, +so I further renamed the mod from generic tests to reflect the days.

Also after finishing the first day puzzle, I have installed an sccache to +cache the builds, so that the build time is lower, cause it was kinda unbearable.

Solution

Well, it's a pretty simple problem. You just take the input, sum the calories and +find the biggest one. However, if we try to generalize to more than the biggest +one, the fun appears. We have few options:

  • keep all the calories, sort them, take what we need
  • keep all the calories and use max heap
  • use min heap and maintain at most N calories that we need

Day 2: Rock Paper Scissors

tl;dr

You want to know what score did you achieve while playing Rock Paper Scissors. +And then you want to be strategic about it.

Apart from the technical details of the puzzle, it went relatively smooth.

Solution

I took relatively naïve approach and then tried to simplify it.

Day 3: Rucksack Reorganization

tl;dr

Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you +want to find the common item among those compartments. Each of them has priority, +you care only about the sum.

This is the day where I started to fight the compiler and neither of us decided +to give up. Let's dive into it \o/

Fun fact

Fighting the compiler took me 30 minutes.

We need to find a common item among 2 collections, that's an easy task, right? +We can construct 2 sets and find an intersection:

let top: HashSet<i32> = [1, 2, 3].iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].iter().collect();

Now, the first issue that we encounter is caused by the fact that we are using +a slice (the […]), iterator of that returns references to the numbers. +And we get immediately yelled at by the compiler, because the numbers are discarded +after running the .collect. To fix this, we can use .into_iter:

let top: HashSet<i32> = [1, 2, 3].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].into_iter().collect();

This way the numbers will get copied instead of referenced. OK, let's find the +intersection of those 2 collections:

println!("Common elements: {:?}", top.intersection(&bottom));
Common elements: [3]
caution

Notice that we need to do &bottom. It explicitly specifies that .intersection +borrows the bottom, i.e. takes an immutable reference to it.

That's what we want, right? Looks like it! \o/

Next part wants us to find the common element among all of the backpacks. OK, so +that should be fairly easy, we have an intersection and we want to find intersection +over all of them.

Let's have a look at the type of the .intersection

pub fn intersection<'a>(
    &'a self,
    other: &'a HashSet<T, S>
) -> Intersection<'a, T, S>

OK… Huh… But we have an example there!

let intersection: HashSet<_> = a.intersection(&b).collect();

Cool, that's all we need.

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
println!("Intersection: {:?}", intersection);
Intersection: {3, 4}

Cool, so let's do the intersection with the top_2:

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
println!("Intersection: {:?}", intersection);

And we get yelled at by the compiler:

error[E0308]: mismatched types
--> src/main.rs:10:58
|
10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
| ------------ ^^^^^^ expected `&i32`, found `i32`
| |
| arguments to this function are incorrect
|
= note: expected reference `&HashSet<&i32>`
found reference `&HashSet<i32>`

/o\ What the hell is going on here? Well, the funny thing is, that this operation +doesn't return the elements themselves, but the references to them and when we pass +the third set, it has just the values themselves, without any references.

tip

It may seem as a very weird decision, but in fact it makes some sense… It allows +you to do intersection of items that may not be possible to copy. Overall this is +a “tax” for having a borrow checker drilling your ass having your back and +making sure you're not doing something naughty that may cause an undefined +behavior.

To resolve this we need to get an iterator that clones the elements:

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();
println!("Intersection: {:?}", intersection);
Intersection: {4}

Solution

The approach is pretty simple, if you omit the 1on1 with the compiler. You just +have some fun with the set operations :)

Day 4: Camp Cleanup

tl;dr

Elves are cleaning up the camp and they got overlapping sections to clean up. +Find how many overlap and can take the day off.

RangeInclusive is your friend not an enemy :)

Solution

Relatively easy, you just need to parse the input and know what you want. Rust's +RangeInclusive type helped a lot, cause it took care of all abstractions.

Day 5: Supply Stacks

tl;dr

Let's play with stacks of crates.

Very easy problem with very annoying input. You can judge yourself:

    [D]    
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

Good luck transforming that into something reasonable :)

Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

Solution

For the initial solution I went with a manual solution (as in I have done all +the work. Later on I have decided to explore the std and interface of the +std::vec::Vec and found split_off which takes an index and splits (duh) +the vector:

let mut vec = vec![1, 2, 3];
let vec2 = vec.split_off(1);
assert_eq!(vec, [1]);
assert_eq!(vec2, [2, 3]);

This helped me simplify my solution a lot and also get rid of some edge cases.

Day 6: Tuning Trouble

tl;dr

Finding start of the message in a very weird protocol. Start of the message is +denoted by NN unique consecutive characters.

Solution

A lot of different approaches, knowing that we are dealing with input consisting +solely of ASCII letters, I bit the bullet and went with sliding window and +constructing sets from that window, checking if the set is as big as the window.

One possible optimization could consist of keeping a bit-vector (i.e. usize +variable) of encountered characters and updating it as we go. However this has +a different issue and that is removal of the characters from the left side of the +window. We don't know if the same character is not included later on.

Other option is to do similar thing, but keeping the frequencies of the letters, +and again knowing we have only ASCII letters we can optimize by having a vector +of 26 elements that keeps count for each lowercase letter.

Day 7: No Space Left On Device

tl;dr

Let's simulate du to get some stats about our file system and then pinpoint +directories that take a lot of space and should be deleted.

I was waiting for this moment, and yet it got me! +imagine me swearing for hours

Solution

We need to “build” a file system from the input that is given in a following form:

$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k

There are few ways in which you can achieve this and also you can assume some +preconditions, but why would we do that, right? :)

You can “slap” this in either HashMap or BTreeMap and call it a day. +And that would be boring…

tip

BTreeMap is quite fitting for this, don't you think?

I always wanted to try allocation on heap in Rust, so I chose to implement a tree. +I fought with the Box<T> for some time and was losing…

Then I looked up some implementations of trees or linked lists and decided to try +Rc<Cell<T>>. And I got my ass whopped by the compiler once again. /o\

tip

Box<T> represents a dynamically allocated memory on heap. It is a single pointer, +you can imagine this as std::unique_ptr<T> in C++.

Rc<T> represents a dynamically allocated memory on heap. On top of that it is +reference counted (that's what the Rc stands for). You can imagine this as +std::shared_ptr<T> in C++.

Now the fun stuff. Neither of them lets you mutate the contents of the memory.

Cell<T> allows you to mutate the memory. Can be used reasonably with types that +can be copied, because the memory safety is guaranteed by copying the contents +when there is more than one mutable reference to the memory.

RefCell<T> is similar to the Cell<T>, but the borrowing rules (how many mutable +references are present) are checked dynamically.

So in the end, if you want something like std::shared_ptr<T> in Rust, you want +to have Rc<RefCell<T>>.

So, how are we going to represent the file system then? We will use an enumeration, +hehe, which is an algebraic data type that can store some stuff in itself 😩

type FileHandle = Rc<RefCell<AocFile>>;

#[derive(Debug)]
enum AocFile {
File(usize),
Directory(BTreeMap<String, FileHandle>),
}

Let's go over it! FileHandle represents dynamically allocated AocFile, not +much to discuss. What does the #[derive(Debug)] do though? It lets us to print +out the value of that enumeration, it's derived, so it's not as good as if we had +implemented it ourselves, but it's good enough for debugging, hence the name.

Now to the fun part! AocFile value can be represented in two ways:

  • File(usize), e.g. AocFile::File(123) and we can pattern match it, if we +need to
  • Directory(BTreeMap<String, FileHandle>) will represent the directory and will +contain map matching the name of the files (or directories) within to their +respective file handles

I will omit the details about constructing this file system, cause there are a lot +of technicalities introduced by the nature of the input. However if you are +interested, you can have a look at my solution.

We need to find small enough directories and also find the smallest directory that +will free enough space. Now the question is, how could we do that. And there are +multiple ways I will describe.

I have chosen to implement tree catamorphism 😩. It is basically a fold +over a tree data structure. We descent down into the leaves and propagate computed +results all the way to the root. You can also notice that this approach is very +similar to dynamic programming, we find overlapping sections of the computation +and try to minimize the additional work (in this case: we need to know sizes of +our descendants, but we have already been there).

Another approach that has been suggested to me few days later is running DFS on +the graph. And, funnily enough, we would still need to combine what we found in +the branches where we descent. So in the end, it would work very similarly to my +solution.

One of the more exotic options would be precomputing the required information at +the same time as parsing. That could be done by adding additional fields to the +nodes which would allow storing such information and updating it as we construct +the file system.

Post Mortem

Things that have been brought up in the discussion later on.

Rc<T> vs Rc<RefCell<T>>

It has been brought up that I have a contradicting statement regarding the +dynamically allocated memory. Specifically:

  • You can imagine Rc<T> as an std::shared_ptr<T> (in C++)
  • When you want an equivalent of std::shared_ptr<T>, you want to use +Rc<RefCell<T>>

Now, in Rust it is a bit more complicated, because the type that represents the +“shared pointer” is Rc<T>. What RefCell<T> does is making sure that there is +only one “owner” of a mutable reference at a time (and dynamically, as opposed +to the Cell<T>).

Therefore to be precise and correct about the equivalents of std::shared_ptr<T> +in Rust, we can say that

  • Rc<T> is an equivalent of a const std::shared_ptr<T>,
  • and Rc<RefCell<T>> is an equivalent of a std::shared_ptr<T>.

You can easily see that they only differ in the mutability. (And even that is not +as simple as it seems, because there is also Cell<T>)

+ + + + \ No newline at end of file diff --git a/blog/aoc-2022/2nd-week/index.html b/blog/aoc-2022/2nd-week/index.html new file mode 100644 index 0000000..30811dd --- /dev/null +++ b/blog/aoc-2022/2nd-week/index.html @@ -0,0 +1,172 @@ + + + + + +2nd week of Advent of Code '22 in Rust | mf + + + + + + + + + + + + + +
+

2nd week of Advent of Code '22 in Rust

· 21 min read
Matej Focko

Let's go through the second week of Advent of Code in Rust.

Day 8: Treetop Tree House

tl;dr

We get a forest and we want to know how many trees are visible from the outside. +Apart from that we want to find the best view.

Nothing interesting. We are moving around 2D map though. And indexing can get a +bit painful when doing so, let's refactor it a bit ;) During the preparation for +the AoC, I have written Vector2D and now it's time to extend it with indexing +of Vec of Vecs. In my solution I was manipulating with indices in the following +way:

  • swapping them
  • checking whether they are correct indices for the Vec<Vec<T>>
  • indexing Vec<Vec<T>> with them
caution

I'm getting familiar with Rust and starting to “abuse” it… While doing so, I'm +also uncovering some “features” that I don't really like. Therefore I will mark +all of my rants with thicc «↯» mark and will try to “lock” them into their +own “box of hell”.

Swapping indices

Relatively simple implementation, just take the values, swap them and return new +vector.

impl<T: Copy> Vector2D<T> {
pub fn swap(&self) -> Self {
Self {
x: self.y,
y: self.x,
}
}
}

Pretty straight-forward implementation, but let's talk about the T: Copy. We +need to use it, since we are returning a new vector, with swapped values. +If we had values that cannot be copied, the only thing we could do, would be a +vector of references (and it would also introduce a lifetime, to which we'll get +later on). This is pretty similar with the operations on sets from the first week.

Indexing Vec

I will start with the indexing, cause bound-checking is a bit more… complicated +than I would like to.

pub fn index<'a, T, U>(v: &'a [Vec<U>], idx: &Vector2D<T>) -> &'a U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}

Let's talk about this mess… Body of the function is probably the most easy part +and should not be hard to understand, we just take the x and y and convert +them both to usize type that can be used later on for indexing.

The type signature of the function is where the fun is at 😉 We are trying +to convert unknown type to usize, so we must bound the T as a type that can +be converted to usize, that's how we got usize: TryFrom<T> which basically +says that usize must implement TryFrom<T> trait and therefore allows us to +convert the indices to actual usize indices. Using .unwrap() also forces us +to bound the error that can occur when converting T into usize, that's how +we get <usize as TryFrom<T>>::Error: Debug which loosely means

error during conversion of T into usize must implement Debug, +i.e. can be printed in some way or other

T: Copy is required by .try_into() which takes T by-value.

And now we are left only with the first line of the definition.

note

Skilled Rustaceans might notice that this implementation is rather flaky and can +break in multiple places at once. I'll get back to it…

Let's split it in multiple parts:

  • v: &'a [Vec<U>] represents the 2D Vec, we are indexing, Vec implements +Slice trait and clippy recommends using &[T] to &Vec<T>, exact details +are unknown to me
  • idx: &Vector2D<T> represents the indices which we use, we take them by +reference to avoid an unnecessary copy
  • -> &'a U means that we are returning a reference to some value of type U. +Now the question is what does the 'a mean, we can also see it as a generic +type declared along T and U. And the answer is relatively simple, 'a +represents a lifetime. We take the v by a reference and return a reference, +borrow checker validates all of the borrows (or references), so we need to +specify that our returned value has the same lifetime as the vector we have +taken by a reference, i.e. returned reference must live at least as long as the +v. This way we can “be sure” that the returned reference is valid.
Issues

First issue that our implementation has is the fact that we cannot get a mutable +reference out of that function. This could be easily resolved by introducing new +function, e.g. index_mut. Which I have actually done while writing this part:

pub fn index_mut<'a, T, U>(v: &'a mut [Vec<U>], idx: &Vector2D<T>) -> &'a mut U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&mut v[y][x]
}
«↯» Why can't we use one function?

When we consider a Vec<T>, we don't need to consider containers as T, Rust +implements indexing as traits Index<T> and IndexMut<T> that do the dirty work +behind syntactic sugar of container[idx].

However, implementing of traits is not allowed for external types, i.e. types +that you haven't defined yourself. This means that you can implement indexing +over containers that you have implemented yourself, but you cannot use your own +types for indexing “built-in” types.

Another part of this rabbit hole is trait SliceIndex<T> that is of a relevance +because of

impl<T, I> Index<I> for [T]
where
I: SliceIndex<[T]>

impl<T, I, A> Index<I> for Vec<T, A>
where
I: SliceIndex<[T]>,
A: Allocator

impl<T, I, const N: usize> Index<I> for [T; N]
where
[T]: Index<I>

In other words, if your type implements SliceIndex<T> trait, it can be used +for indexing. As of now, this trait has all of its required methods experimental +and is marked as unsafe.

Another problem is a requirement for indexing either [Vec<T>] or Vec<Vec<T>>. +This requirement could be countered by removing inner type Vec<T> and constraining +it by a trait Index (or IndexMut respectively) in a following way

pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D<T>) -> &'a C::Output
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
C: Index<usize>
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}

Given this, we can also give a more meaningful typename for indexing type, such +as I.

Checking bounds

Now we can get to the boundary checks, it is very similar, but a more… dirty. +First approach that came up was to convert the indices in Vector2D to usize, +but when you add the indices up, e.g. when checking the neighbors, you can end +up with negative values which, unlike in C++, causes an error (instead of underflow +that you can use to your advantage; you can easily guess how).

So how can we approach this then? Well… we will convert the bounds instead of +the indices and that lead us to:

pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
usize: TryInto<T>,
<usize as TryInto<T>>::Error: Debug,
T: PartialOrd + Copy,
{
idx.y >= 0.try_into().unwrap()
&& idx.y < v.len().try_into().unwrap()
&& idx.x >= 0.try_into().unwrap()
&& idx.x
< v[TryInto::<usize>::try_into(idx.y).unwrap()]
.len()
.try_into()
.unwrap()
}

You can tell that it's definitely a shitty code. Let's improve it now! We will +get back to the original idea, but do it better. We know that we cannot convert +negative values into usize, but we also know that conversion like that +returns a Result<T, E> which we can use to our advantage.

pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
T: Copy,
usize: TryFrom<T>,
{
usize::try_from(idx.y)
.and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))
.unwrap_or(false)
}

Result<T, E> is a type similar to Either in Haskell and it allows us to chain +multiple operations on correct results or propagate the original error without +doing anything. Let's dissect it one-by-one.

try_from is a method implemented in TryFrom trait, that allows you to convert +types and either successfully convert them or fail (with a reasonable error). This +method returns Result<T, E>.

We call and_then on that result, let's have a look at the type signature of +and_then, IMO it explains more than enough:

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> Result<U, E>

OK… So it takes the result and a function and returns another result with +different value and different error. However we can see that the function, which +represents an operation on a result, takes just the value, i.e. it doesn't care +about any previous error. To make it short:

and_then allows us to run an operation, which can fail, on the correct result

We parsed a y index and now we try to convert the x index with try_from +again, but on that result we use map rather than and_then, why would that be?

pub fn map<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> U

Huh… map performs an operation that cannot fail. And finally we use +unwrap_or which takes the value from result, or in case of an error returns the +default that we define.

How does this work then? If y is negative, the conversion fails and the error +propagates all the way to unwrap_or, if y can be a correct usize value, then +we do the same with x. If x is negative, we propagate the error as with y, +and if it's not, then we check whether it exceeds the higher bounds or not.

Solution

Relatively simple, you just need follow the rules and not get too smart, otherwise +it will get back at you.

Day 9: Rope Bridge

tl;dr

We get a rope with knots and we want to track how many different positions are +visited with the rope's tail.

By this day, I have come to a conclusion that current skeleton for each day +generates a lot of boilerplate. And even though it can be easily copied, it's +just a waste of space and unnecessary code. Let's “simplify” this (on one end +while creating monster on the other end). I've gone through what we need in the +preparations for the AoC. Let's sum up our requirements:

  • parsing
  • part 1 & 2
  • running on sample / input
  • tests

Parsing and implementation of both parts is code that changes each day and we +cannot do anything about it. However running and testing can be simplified!

Let's introduce and export a new module solution that will take care of all of +this. We will start by introducing a trait for each day.

pub trait Solution<Input, Output: Display> {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input;

fn part_1(input: &Input) -> Output;
fn part_2(input: &Input) -> Output;
}

This does a lot of work for us already, we have defined a trait and for each day +we will create a structure representing a specific day. That structure will also +implement the Solution trait.

Now we need to get rid of the boilerplate, we can't get rid of the main function, +but we can at least move out the functionality.

fn run(type_of_input: &str) -> Result<()>
where
Self: Sized,
{
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = Self::parse_input(format!("{}s/{}.txt", type_of_input, Self::day()));

info!("Part 1: {}", Self::part_1(&input));
info!("Part 2: {}", Self::part_2(&input));

Ok(())
}

fn main() -> Result<()>
where
Self: Sized,
{
Self::run("input")
}

This is all part of the Solution trait, which can implement methods while being +dependent on what is provided by the implementing types. In this case, we just +need to bound the Output type to implement Display that is necessary for the +info! and format string there.

Now we can get to first of the nasty things we are going to do… And it is the +day() method that you can see being used when constructing path to the input +file. That method will generate a name of the file, e.g. day01 and we know that +we can somehow deduce it from the structure name, given we name it reasonably.

fn day() -> String {
let mut day = String::from(type_name::<Self>().split("::").next().unwrap());
day.make_ascii_lowercase();

day.to_string()
}
type_name

This feature is still experimental and considered to be internal, it is not +advised to use it any production code.

And now we can get to the nastiest stuff 😩 We will generate the tests!

We want to be able to generate tests for sample input in a following way:

test_sample!(day_01, Day01, 42, 69);

There's not much we can do, so we will write a macro to generate the tests for us.

#[macro_export]
macro_rules! test_sample {
($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {
#[cfg(test)]
mod $mod_name {
use super::*;

#[test]
fn test_part_1() {
let sample =
$day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));
assert_eq!($day_struct::part_1(&sample), $part_1);
}

#[test]
fn test_part_2() {
let sample =
$day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));
assert_eq!($day_struct::part_2(&sample), $part_2);
}
}
};
}

We have used it in a similar way as macros in C/C++, one of the things that we +can use to our advantage is defining “type” of the parameters for the macro. All +parameters have their name prefixed with $ sign and you can define various “forms” +of your macro. Let's go through it!

We have following parameters:

  • $mod_name which represents the name for the module with tests, it is typed +with ident which means that we want a valid identifier to be passed in.
  • $day_struct represents the structure that will be used for tests, it is typed +with tt which represents a token tree, in our case it is a type.
  • $part_X represents the expected output for the Xth part and is of type expr +which literally means an expression.

Apart from that we need to use #[macro_export] to mark the macro as exported +for usage outside of the module. Now our skeleton looks like:

use aoc_2022::*;

type Input = String;
type Output = String;

struct DayXX;
impl Solution<Input, Output> for DayXX {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
file_to_string(pathname)
}

fn part_1(input: &Input) -> Output {
todo!()
}

fn part_2(input: &Input) -> Output {
todo!()
}
}

fn main() -> Result<()> {
// DayXX::run("sample")
DayXX::main()
}

// test_sample!(day_XX, DayXX, , );

Solution

Not much to talk about, it is relatively easy to simulate.

Day 10: Cathode-Ray Tube

tl;dr

Emulating basic arithmetic operations on a CPU and drawing on CRT based on the +CPU's accumulator.

In this day I have discovered an issue with my design of the Solution trait. +And the issue is caused by different types of Output for the part 1 and part 2.

Problem is relatively simple and consists of simulating a CPU, I have approached +it in a following way:

fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {
instructions
.iter()
.fold(State::new(), |state, instruction| {
state.execute(instruction, &mut out)
});

out
}

We just take the instructions, we have some state of the CPU and we execute the +instructions one-by-one. Perfect usage of the fold (or reduce as you may know +it from other languages).

You can also see that we have an Output type, so the question is how can we fix +that problem. And the answer is very simple and functional. Rust allows you to +have an enumeration that can bear some other values apart from the type itself.

tip

We could've seen something like this with the Result<T, E> type that can be +defined as

enum Result<T, E> {
Ok(T),
Err(E)
}
What does that mean though?

When we have an Ok value, it has the result itself, and when we get an Err +value, it has the error. This also allows us to handle results in a rather +pretty way:

match do_something(x) {
Ok(y) => {
println!("SUCCESS: {}", y);
},
Err(y) => {
eprintln!("ERROR: {}", y);
}
}

My solution has a following outline:

fn execute(&self, i: &Instruction, output: &mut Output) -> State {
// execute the instruction

// collect results if necessary
match output {
Output::Part1(x) => self.execute_part_1(y, x),
Output::Part2(x) => self.execute_part_2(y, x),
}

// return the obtained state
new_state
}

You might think that it's a perfectly reasonable thing to do. Yes, but notice +that the match statement doesn't collect the changes in any way and also we +pass output by &mut, so it is shared across each iteration of the fold.

The dirty and ingenious thing is that xs are passed by &mut too and therefore +they are directly modified by the helper functions. To sum it up and let it sit

We are collecting the result into an enumeration that is shared +across all iterations of fold.

Solution

Similar to Day 9, but there are some technical details that can get you.

Day 11: Monkey in the Middle

tl;dr

Simulation of monkeys throwing stuff around and measuring your stress levels +while your stuff is being passed around.

I think I decided to use regular expressions here for the first time, cause +parsing the input was a pain.

Also I didn't expect to implement Euclidean algorithm in Rust…

Solution

Again, we're just running a simulation. Though I must admit it was very easy to +make a small technical mistakes that could affect the final results very late.

Day 12: Hill Climbing Algorithm

tl;dr

Finding shortest path up the hill and also shortest path down to the ground while +also rolling down the hill…

As I have said in the tl;dr, we are looking for the shortest path, but the start +and goal differ for the part 1 and 2. So I have decided to refactor my solution +to a BFS algorithm that takes necessary parameters via functions:

fn bfs<F, G>(
graph: &[Vec<char>], start: &Position, has_edge: F, is_target: G
) -> Option<usize>
where
F: Fn(&[Vec<char>], &Position, &Position) -> bool,
G: Fn(&[Vec<char>], &Position) -> bool

We pass the initial vertex from the caller and everything else is left to the BFS +algorithm, based on the has_edge and is_target functions.

This was easy! And that is not very usual in Rust once you want to pass around +functions. 👀

Solution

Looking for the shortest path… Must be Dijkstra, right? Nope! Half of the +Reddit got jebaited though. In all fairness, nothing stops you from implementing +the Dijkstra's algorithm for finding the shortest path, but if you know that +all connected vertices are in a unit (actually d=1d = 1) distance from each other, +then you know that running Dijkstra is equivalent to running BFS, only with worse +time complexity, because of the priority heap instead of the queue.

Day 13: Distress Signal

tl;dr

Processing packets with structured data from the distress signal.

You can implement a lot of traits if you want to. It is imperative to implement +ordering on the packets. I had a typo, so I also proceeded to implement a Display +trait for debugging purposes:

impl Display for Packet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Packet::Integer(x) => write!(f, "{x}"),
Packet::List(lst) => write!(f, "[{}]", lst.iter().map(|p| format!("{p}")).join(",")),
}
}
}

Solution

A lot of technical details… Parsing is nasty too…

Day 14: Regolith Reservoir

tl;dr

Let's simulate falling sand grain-by-grain.

Again, both parts are relatively similar with minimal changes, so it is a good +idea to refactor it a bit. Similar approach to the BFS above. Also this is the +first day where I ran into efficiency issues and had to redo my solution to speed +it up just a bit.

Solution

Tedious.

Post Mortem

Indexing

I was asked about the indexing after publishing the blog. And truly it is rather +complicated topic, especially after releasing SliceIndex<I> trait. I couldn't +leave it be, so I tried to implement the Index and IndexMut trait.

note

I have also mentioned that the SliceIndex trait is unsafe, but truth be told, +only unsafe part are the 2 methods that are named *unchecked*. Anyways, I will +be implementing the Index* traits for now, rather than the SliceIndex.

It's relatively straightforward…

impl<I, C> Index<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}

We can see a lot of similarities to the implementation of index and index_mut +functions. In the end, they are 1:1, just wrapped in the trait that provides a +syntax sugar for container[idx].

note

I have also switched from using the TryFrom to TryInto trait, since it better +matches what we are using, the .try_into rather than usize::try_from.

Also implementing TryFrom automatically provides you with a TryInto trait, +since it is relatively easy to implement. Just compare the following:

pub trait TryFrom<T>: Sized {
type Error;

fn try_from(value: T) -> Result<Self, Self::Error>;
}

pub trait TryInto<T>: Sized {
type Error;

fn try_into(self) -> Result<T, Self::Error>;
}

OK, so we have our trait implemented, we should be able to use container[index], +right? Yes… but actually no 😦

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:26:18
|
26 | if trees[pos] > tallest {
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:30:28
|
30 | max(tallest, trees[pos])
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<isize>`
--> src/bin/day08.rs:52:28
|
52 | let max_height = trees[position];
| ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<isize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<isize>>`

Why? We have it implemented for the slices ([C]), why doesn't it work? Well, +the fun part consists of the fact that in other place, where we were using it, +we were passing the &[Vec<T>], but this is coming from a helper functions that +take &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for +those. Just for the slices. 🤯 What are we going to do about it?

We can either start copy-pasting or be smarter about it… I choose to be smarter, +so let's implement a macro! The only difference across the implementations are +the types of the outer containers. Implementation doesn't differ at all!

Implementing the macro can be done in a following way:

macro_rules! generate_indices {
($container:ty) => {
impl<I, C> Index<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}
};
}

And now we can simply do

generate_indices!(VecDeque<C>);
generate_indices!([C]);
generate_indices!(Vec<C>);
// generate_indices!([C; N], const N: usize);

The last type (I took the inspiration from the implementations of the Index and +IndexMut traits) is a bit problematic, because of the const N: usize part, +which I haven't managed to be able to parse. And that's how I got rid of the error.

note

If I were to use 2D-indexing over [C; N] slices, I'd probably just go with the +copy-paste, cause the cost of this “monstrosity” outweighs the benefits of no DRY.

Cause of the problem

This issue is relatively funny. If you don't use any type aliases, just the raw +types, you'll get suggested certain changes by the clippy. For example if you +consider the following piece of code

fn get_sum(nums: &Vec<i32>) -> i32 {
nums.iter().sum()
}

fn main() {
let nums = vec![1, 2, 3];
println!("Sum: {}", get_sum(&nums));
}

and you run clippy on it, you will get

Checking playground v0.0.1 (/playground)
warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do
--> src/main.rs:1:18
|
1 | fn get_sum(nums: &Vec<i32>) -> i32 {
| ^^^^^^^^^ help: change this to: `&[i32]`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg
= note: `#[warn(clippy::ptr_arg)]` on by default

warning: `playground` (bin "playground") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.61s

However, if you introduce a type alias, such as

type Numbers = Vec<i32>;

Then clippy won't say anything, cause there is literally nothing to suggest. +However the outcome is not the same…

+ + + + \ No newline at end of file diff --git a/blog/aoc-2022/3rd-week/index.html b/blog/aoc-2022/3rd-week/index.html new file mode 100644 index 0000000..dd9c8ec --- /dev/null +++ b/blog/aoc-2022/3rd-week/index.html @@ -0,0 +1,112 @@ + + + + + +3rd week of Advent of Code '22 in Rust | mf + + + + + + + + + + + + + +
+

3rd week of Advent of Code '22 in Rust

· 12 min read
Matej Focko

Let's go through the third week of Advent of Code in Rust.

Day 15: Beacon Exclusion Zone

tl;dr

Triangulating a distress beacon based on the information from the sensors.

Solution

Relatively easy thing to implement, no major Rust issues hit.

Day 16: Proboscidea Volcanium

tl;dr

Finding a max flow in a graph given some time constraints.

Solution

I have used some interesting things to implement this and make it easier for me.

Indexing in graph

I have come across a situation where I needed to keep more information regarding +the graph… In that case you can, of course, create a structure and keep it in, +but once you have multiple members in the structure it gets harder to work with +since you need to address the fields in the structure. When you work with graph, +you frequently need to access the vertices and in this case it felt a lot easier +to implement the indexing in a graph, rather than explicitly access the +underlying data structure.

Here you can see a rather short snippet from the solution that allows you to +“index” the graph:

impl Index<&str> for Graph {
type Output = Vertex;

fn index(&self, index: &str) -> &Self::Output {
&self.g[index]
}
}

Cartesian product

During the implementation I had to utilize Floyd-Warshall algorithm for finding +the shortest path between pairs of vertices and utilized the iproduct! macro +from the itertools. It is a very useful higher-order function that allows +you to keep the nesting of the loops at a minimum level while still maintaining +the same functionality.

“Implementing” an iterator

For the second part, you get to split the work between 2 actors. That way you +can achieve higher efficiency of the whole process that you're planning, but it +also makes it harder to evaluate algorithmically, since you need to check the +different ways the work can be split.

Being affected by functional programming brain damage™️, I have chosen to +do this part by function that returns an iterator over the possible ways:

fn pairings(
valves: &BTreeSet<String>,
) -> impl Iterator<Item = (BTreeSet<String>, BTreeSet<String>)> + '_ {
let mapping = valves.iter().collect_vec();

let max_mask = 1 << (valves.len() - 1);

(0..max_mask).map(move |mask| {
let mut elephant = BTreeSet::new();
let mut human = BTreeSet::new();

for (i, &v) in mapping.iter().enumerate() {
if (mask & (1 << i)) == 0 {
human.insert(v.clone());
} else {
elephant.insert(v.clone());
}
}

(human, elephant)
})
}

Day 17: Pyroclastic Flow

tl;dr

Simulating an autonomous Tetris where pieces get affected by a series of jets of +hot gas.

Solution

Similarly to the previous day I have created some iterators 😄

Collision detection

Once you need to check for collisions it is very helpful to be able to just +iterate through the positions that can actually collide with the wall or other +piece.

To get the desired behaviour, you can just compose few smaller functions:

fn occupied(shape: &[Vec<char>]) -> impl Iterator<Item = Position> + '_ {
shape.iter().enumerate().flat_map(|(y, row)| {
row.iter().enumerate().filter_map(move |(x, c)| {
if c == &'#' {
Some(Vector2D::new(x as isize, y as isize))
} else {
None
}
})
})
}

In the end, we get relative positions which we can adjust later when given the +specific positions from iterator. You can see some interesting parts in this:

  • .enumerate() allows us to get both the indices (coordinates) and the line +or, later on, the character itself,
  • .flat_map() flattens the iterator, i.e. when we return another iterator, +they just get chained instead of iterating over iterators (which sounds pretty +disturbing, doesn't it?),
  • and finally .filter_map() which is pretty similar to the “basic” .map() +with a one, key, difference that it expects the items of an iterator to be +mapped to an Option<T> from which it ignores nothing (as in None 😉) +and also unwraps the values from Some(…).

Infinite iterator

In the solution we cycle through both Tetris-like shapes that fall down and the +jets that move our pieces around. Initially I have implemented my own infinite +iterator that just yields the indices. It is a very simple, yet powerful, piece +of code:

struct InfiniteIndex {
size: usize,
i: usize,
}

impl InfiniteIndex {
fn new(size: usize) -> InfiniteIndex {
InfiniteIndex { size, i: size - 1 }
}
}

impl Iterator for InfiniteIndex {
type Item = usize;

fn next(&mut self) -> Option<Self::Item> {
self.i = (self.i + 1) % self.size;
Some(self.i)
}
}

However when I'm looking at the code now, it doesn't really make much sense… +Guess what, we can use a built-in function that is implemented on iterators for +that! The function is called .cycle()

On the other hand, I am not going to switch to that function, since it would +introduce an another myriad of issues caused by the fact that I create iterators +right away in the constructor of my structure and the iterators would borrow +both the jets and shapes which would introduce a lifetime dependency into the +structure.

Day 18: Boiling Boulders

tl;dr

Let's compute a surface area of some obsidian approximated via coordinates of +cubes.

Solution

This day is kinda interesting, because it shows how easily you can complicate the +problem and also how much can you screw yourself over with the optimization and +“smart” approach.

For the first part you need to find the surface area of an obsidian that is +approximated by cubes. Now, that is a very easy thing to do, just keep the track +of already added cubes, and check if the newly added cube touches any face of any +other cube. Simple, and with a BTreeSet relatively efficient way to do it.

However the second part lets you on a secret that there may be some surface area +from the “inside” too and you want to know only the one from the outside of the +obsidian. I have seen some solutions later, but if you check your data, you might +notice that the bounding box of all the cubes isn't that big at all. Therefore I +chose to pre-construct the box beforehand, fill in the cubes and then just run a +BFS turning all the lava on the outside into the air. Now you just need to check +cubes and count how many of their faces touch the air.

Day 19: Not Enough Minerals

tl;dr

Finding out the best strategy for building robots to collect geodes.

Solution

Not much interesting stuff to mention apart from the suggestion to never believe +that the default implementation given by derive macro is what you want, it +doesn't have to be. 😄

Day 20: Grove Positioning System

tl;dr

Shuffling around the circular linked list to find the coordinates.

Now, small rant for this day is in place. They've never mentioned that coordinates +can repeat and therefore the values are non-unique. This is something that did +not happen in the given sample, but was present in the user input. It took »a lot« +to realize that this is the issue.

Solution

I have tried implementing a circular linked list for this… and I have failed +miserably. To be fair, I still have no clue why. It was “fun” to play around with +the Rc<RefCell<T>>. In the end I failed on wrong answer. I have also encountered +a rather interesting issue with .borrow_mut() method being used on Rc<RefCell<T>>.

.borrow_mut()

Consider the following snippet of the code (taken from the documentation):

use std::cell::{RefCell, RefMut};
use std::collections::HashMap;
use std::rc::Rc;
// use std::borrow::BorrowMut;

fn main() {
let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
// Create a new block to limit the scope of the dynamic borrow
{
let mut map: RefMut<_> = shared_map.borrow_mut();
map.insert("africa", 92388);
map.insert("kyoto", 11837);
map.insert("piccadilly", 11826);
map.insert("marbles", 38);
}

// Note that if we had not let the previous borrow of the cache fall out
// of scope then the subsequent borrow would cause a dynamic thread panic.
// This is the major hazard of using `RefCell`.
let total: i32 = shared_map.borrow().values().sum();
println!("{total}");
}

We allocate a hash map on the heap and then in the inner block, we borrow it as +a mutable reference, so that we can use it.

note

It is a very primitive example for Rc<RefCell<T>> and mutable borrow.

If you uncomment the 4th line with use std::borrow::BorrowMut;, you cannot +compile the code anymore, because of

   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
--> src/main.rs:10:34
|
10 | let mut map: RefMut<_> = shared_map.borrow_mut();
| --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference
| |
| expected due to this
|
= note: expected struct `RefMut<'_, _>`
found mutable reference `&mut Rc<RefCell<HashMap<_, _>>>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:11:13
|
11 | map.insert("africa", 92388);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:12:13
|
12 | map.insert("kyoto", 11837);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:13:13
|
13 | map.insert("piccadilly", 11826);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:14:13
|
14 | map.insert("marbles", 38);
| ^^^^^^ method not found in `RefMut<'_, _>`

Some errors have detailed explanations: E0308, E0599.
For more information about an error, try `rustc --explain E0308`.
error: could not compile `playground` due to 5 previous errors

It might seem a bit ridiculous. However, I got to a point where the compiler +suggested use std::borrow::BorrowMut; and it resulted in breaking parts of the +code that worked previously. I think it may be a good idea to go over what is +happening here.

.borrow_mut() on Rc<RefCell<T>>

Let's consider a variable x of type Rc<RefCell<T>>. What happens when you +call .borrow_mut() on it? We can look at the Rc type, and… hang on! There is +neither .borrow_mut() method or BorrowMut trait implemented. How can we do it +then?

Let's go further and we can see that RefCell<T> implements a .borrow_mut() +method. OK, but how can we call it on the Rc<T>? Easily! Rc<T> implements +Deref<T> and therefore you can call methods on Rc<T> objects as if they were +T objects. If we read on Deref coercion, we can see the following:

If T implements Deref<Target = U>, …:

  • T implicitly implements all the (immutable) methods of the type U.

What is the requirement for the .borrow_mut() on RefCell<T>? Well, it needs +&self, so the Deref implements the .borrow_mut() for the Rc<RefCell<T>>.

BorrowMut trait

I have not been able to find a lot on this trait. My guess is that it provides a +method instead of a syntactic sugar (&mut x) for the mutable borrow. And also +it provides default implementations for the types:

impl BorrowMut<str> for String

impl<T> BorrowMut<T> for &mut T
where
T: ?Sized,

impl<T> BorrowMut<T> for T
where
T: ?Sized,

impl<T, A> BorrowMut<[T]> for Vec<T, A>
where
A: Allocator,

impl<T, A> BorrowMut<T> for Box<T, A>
where
A: Allocator,
T: ?Sized,

impl<T, const N: usize> BorrowMut<[T]> for [T; N]
Conflict

Now the question is why did it break the code… My first take was that the type +Rc<RefCell<T>> has some specialized implementation of the .borrow_mut() and +the use overrides it with the default, which is true in a sense. However +there is no specialized implementation. Let's have a look at the trait and the +type signature on the RefCell<T>:

// trait
pub trait BorrowMut<Borrowed>: Borrow<Borrowed>
where
Borrowed: ?Sized,
{
fn borrow_mut(&mut self) -> &mut Borrowed;
}

// ‹RefCell<T>.borrow_mut()› type signature
pub fn borrow_mut(&self) -> RefMut<'_, T>

I think that we can definitely agree on the fact that RefMut<'_, T> is not the +RefCell<T>.

In my opinion, RefCell<T> implements a separate .borrow_mut() rather +than implementing the interface, because it cannot satisfy the type requirements +of the trait.

caution

I wonder how are we expected to deal with this conflict, if and when, we need +both the .borrow_mut() of the trait and .borrow_mut() of the RefCell<T>.

Fun fact

I was suggested by the compiler to do use std::borrow::BorrowMut; and break the +code.

So much for the almighty and helpful compiler…

Day 21: Monkey Math

tl;dr

Computing an expression tree and then also finding ideal value for a node.

Solution

Relatively simple, until you get to the 2nd part where you start to practice +a lot of the copy-paste. I have managed to sneak some perverted stuff in there +though :) Let's go through the details.

Default trait

For the first time and twice I had a need to have a default value for my types, +enumerations in this case. Rust offers a very nice trait1 that is described +as:

A trait for giving a type a useful default value.

I guess it sums it up nicely. The more interesting part about this is the fact +that you can use the macro machinery to save yourself some typing. If you have +enumeration of which the default value doesn't bear any parameter, you can just +do2:

#[derive(Default)]
enum Color {
#[default]
White,
Gray,
Black,
}

Abusing negation

If you want to use a unary minus operator on your own type, you can implement +a Neg trait3. I was dealing with a binary tree and needed a way how to look +at the other side, so I have just implemented the negation for flipping between +left and right 😄


  1. Default docs
  2. Pardon my example from the graph algorithms ;)
  3. Neg docs
+ + + + \ No newline at end of file diff --git a/blog/aoc-2022/4th-week/index.html b/blog/aoc-2022/4th-week/index.html new file mode 100644 index 0000000..520111b --- /dev/null +++ b/blog/aoc-2022/4th-week/index.html @@ -0,0 +1,136 @@ + + + + + +4th week of Advent of Code '22 in Rust | mf + + + + + + + + + + + + + +
+

4th week of Advent of Code '22 in Rust

· 16 min read
Matej Focko

Let's go through the fourth week of Advent of Code in Rust.

Day 22: Monkey Map

tl;dr

Simulating a movement on a 2D map with given instructions. Map becomes a cube in +the 2nd part…

Rant

This was the most obnoxious problem of this year… and a lot of Rust issues have +been hit.

Solution

It seems like a very simple problem to solve, but with very obnoxious changes in +the 2nd part and also it's relatively hard to decompose »properly«.

Column iterator

In the first part of the problem it was needed to know the boundaries of each +row and column, since I stored them in Vec<Vec<char>> and padded with spaces +to ensure I have a rectangular 2D “array”. However when you wanted to go through +each row and column to determine the boundaries, it was very easy to do for the +rows (cause each row is a Vec element), but not for the columns, since they +span multiple rows.

For this use case I have implemented my own column iterator:

pub struct ColumnIterator<'a, T> {
map: &'a [Vec<T>],
column: usize,

i: usize,
}

impl<'a, T> ColumnIterator<'a, T> {
pub fn new(map: &'a [Vec<T>], column: usize) -> ColumnIterator<'a, T> {
Self { map, column, i: 0 }
}
}

impl<'a, T> Iterator for ColumnIterator<'a, T> {
type Item = &'a T;

fn next(&mut self) -> Option<Self::Item> {
if self.i >= self.map.len() {
return None;
}

self.i += 1;
Some(&self.map[self.i - 1][self.column])
}
}

Given this piece of an iterator, it is very easy to factor out the common +functionality between the rows and columns into:

let mut find_boundaries = |constructor: fn(usize) -> Orientation,
iterator: &mut dyn Iterator<Item = &char>,
upper_bound,
i| {
let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');
let start = first_non_empty.next().unwrap().0 as isize;

let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');
let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;

boundaries.insert(constructor(i), start..end);
};

And then use it as such:

// construct all horizontal boundaries
(0..map.len()).for_each(|row| {
find_boundaries(
Orientation::horizontal,
&mut map[row].iter(),
map[row].len(),
row,
);
});

// construct all vertical boundaries
(0..map[0].len()).for_each(|col| {
find_boundaries(
Orientation::vertical,
&mut ColumnIterator::new(&map, col),
map.len(),
col,
);
});

Walking around the map

Once the 2nd part got introduced, you start to think about a way how not to +copy-paste a lot of stuff (I haven't avoided it anyways…). In this problem, I've +chosen to introduce a trait (i.e. interface) for 2D and 3D walker.

trait Wrap: Clone {
type State;

// simulation
fn is_blocked(&self) -> bool;
fn step(&mut self, steps: isize);
fn turn_left(&mut self);
fn turn_right(&mut self);

// movement
fn next(&self) -> (Self::State, Direction);

// final answer
fn answer(&self) -> Output;
}

Each walker maintains its own state and also provides the functions that are +used during the simulation. The “promised” methods are separated into:

  • simulation-related: that are used during the simulation from the .fold()
  • movement-related: just a one method that holds most of the logic differences +between 2D and 3D
  • final answer: which extracts the proof of solution from the +implementation-specific walker

Both 2D and 3D versions borrow the original input and therefore you must +annotate the lifetime of it:

struct Wrap2D<'a> {
input: &'a Input,
position: Position,
direction: Direction,
}
impl<'a> Wrap2D<'a> {
fn new(input: &'a Input) -> Wrap2D<'a> {
// …

Problems

I have used a lot of closures for this problem and once I introduced a parameter +that was of unknown type (apart from the fact it implements a specific trait), I +got suggested a “fix” for the compilation error that resulted in something that +was not possible to parse, cause it, more than likely, violated the grammar.

In a similar fashion, I have been suggested changes that led to a code that +didn't make sense by just looking at it (there was no need to try the changes), +for example one suggested change in the closure parameter caused disapperance of +the parameter name. 😄

Clippy

I have to admit that Clippy was rather helpful here, I'll include two examples +of rather smart suggestions.

When writing the parsing for this problem, the first thing I have spotted on the +char was the .is_digit() function that takes a radix as a parameter. Clippy +noticed that I use radix = 10 and suggested switching to .is_ascii_digit() +that does exactly the same thing:

-                .take_while(|c| c.is_digit(10))
+ .take_while(|c| c.is_ascii_digit())

Another useful suggestion appeared when working with the iterators and I wanted +to get the nn-th element from it. You know the .skip(), you know the +.next(), just “slap” them together and we're done for 😁 Well, I got +suggested to use .nth() that does exactly the combination of the two mentioned +methods on iterators:

-            match it.clone().skip(skip).next().unwrap() {
+ match it.clone().nth(skip).unwrap() {

Day 23: Unstable Diffusion

tl;dr

Simulating movement of elves around with a set of specific rules.

Solution

There's not much to mention since it's just a cellular automaton simulation +(even though the AoC rules for cellular automatons usually get out of hand +😉).

Although I had a need to determine boundaries of the elves' positions and ended +up with a nasty DRY violation. Knowing that you you're looking for maximum and +minimum that are, of course, exactly the same except for initial values and +comparators, it looks like a rather simple fix, but typing in Rust is something +else, right? In the end I settled for a function that computes both boundaries +without any duplication while using a closure:

fn get_bounds(positions: &Input) -> (Vector2D<isize>, Vector2D<isize>) {
let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {
positions
.iter()
.fold(Vector2D::new(init, init), |acc, elf| {
Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))
})
};

(f(isize::MAX, &min::<isize>), f(isize::MIN, &max::<isize>))
}

This function returns a pair of 2D vectors that represent opposite points of the +bounding rectangle of all elves.

You might ask why would we need a closure and the answer is that positions +cannot be captured from within the nested function, only via closure. One more +fun fact on top of that is the type of the comparator

&dyn Fn(isize, isize) -> isize

Once we remove the dyn keyword, compiler yells at us and also includes a way +how to get a more thorough explanation of the error by running

$ rustc --explain E0782

which shows us

Trait objects must include the `dyn` keyword.

Erroneous code example:

```
trait Foo {}
fn test(arg: Box<Foo>) {} // error!
```

Trait objects are a way to call methods on types that are not known until
runtime but conform to some trait.

Trait objects should be formed with `Box<dyn Foo>`, but in the code above
`dyn` is left off.

This makes it harder to see that `arg` is a trait object and not a
simply a heap allocated type called `Foo`.

To fix this issue, add `dyn` before the trait name.

```
trait Foo {}
fn test(arg: Box<dyn Foo>) {} // ok!
```

This used to be allowed before edition 2021, but is now an error.
Rant

Not all of the explanations are helpful though, in some cases they might be even +more confusing than helpful, since they address very simple use cases.

As you can see, even in this case there are two sides to the explanations:

  • it explains why you need to use dyn, but
  • it still mentions that trait objects need to be heap-allocated via Box<T> +that, as you can see in my snippet, does not apply here 😄 IMO it's +caused by the fact that we are borrowing it and therefore we don't need to +care about the size or whereabouts of it.
C++ parallel

If you dive into the explanation above, you can notice that the Box<dyn Trait> +pattern is very helpful for using types that are not known during compile-time. +You would use a very similar approach in C++ when parsing some data structure +from input (let's say JSON for example).

On the other hand, in this case, it doesn't really make much sense, cause you +can clearly see that the types are known during the compile-time, which in +C++ could be easily resolved by templating the helper function.

Day 24: Blizzard Basin

tl;dr

Navigating your way through a basin with series of blizzards that move around +you as you move.

caution

It's second to last day and I went “bonkers” on the Rust 😄 Proceed to +read Solution part on your own risk.

Solution

You are given a map with blizzards all over the place and you're supposed to +find the minimum time it requires you to walk through the basin without getting +in any of the blizzards.

Breakdown

Relatively simple, yet a bit annoying, approach can be taken. It's technically +a shortest-path algorithm implementation with some relaxation restrictions and +being able to stay on one position for some time, so each vertex of the graph +is determined by the position on the map and the timestamp. I have chosen to +use Vector3D<usize>, since x and y attributes can be used for the position +and, well, let's use z for a timestamp, cause why not, right? 😉

Evaluating the blizzards

caution

I think that this is the most perverted abuse of the traits in the whole 4 weeks +of AoC in Rust…

The blizzards move along their respective directions in time and loop around in +their respective row/column. Each vertex holds position and time, so we can +just index the basin with the vertex itself, right? Yes, we can 😈

Fun fact

While writing this part, I've recognized unnecessary verbosity in the code and +cleaned it up a bit. The changed version is shown here and the original was just +more verbose.

I'll skip the boring parts of checking bounds and entry/exit of the basin 😉 +We can easily calculate positions of the blizzards using a modular arithmetics:

impl Index<Position> for Basin {
type Output = char;

fn index(&self, index: Position) -> &Self::Output {
// ‹skipped boring parts›

// We need to account for the loops of the blizzards
let width = self.cols - 2;
let height = self.rows - 2;

let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;
[
(
index.y() as usize,
blizzard_origin(width, -1, index.z(), index.x()),
'>',
),
(
index.y() as usize,
blizzard_origin(width, 1, index.z(), index.x()),
'<',
),
(
blizzard_origin(height, -1, index.z(), index.y()),
index.x() as usize,
'v',
),
(
blizzard_origin(height, 1, index.z(), index.y()),
index.x() as usize,
'^',
),
]
.iter()
.find_map(|&(y, x, direction)| {
if self.map[y][x] == direction {
Some(&self.map[y][x])
} else {
None
}
})
.unwrap_or(&'.')
}
}

As you can see, there is an expression for calculating the original position and +it's used multiple times, so why not take it out to a lambda, right? 😉

I couldn't get the rustfmt to format the for-loop nicely, so I've just +decided to go with iterating over an elements of a slice. I have used, once +again, a combination of two functions (find_map in this case) to do 2 things +at once and at the end, if we haven't found any blizzard, we just return the +empty space.

I think it's a very nice (and naughty) way how to use the Index trait, don't +you think?

Shortest-path algorithm

For the shortest path you can choose and adjust any of the common shortest-path +algorithms, in my case, I have decided to use A* instead of Dijkstra's +algorithm, since it better reflects the cost function.

Comparison of costs

With the Dijkstra's algorithm I would proceed with the time attribute used as +a priority for the queue.

Whereas with the A*, I have chosen to use both time and Manhattan distance +that promotes vertices closer to the exit and with a minimum time taken.

Cost function is, of course, a closure 😉

let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());

And also for checking the possible moves from the current vertex, I have +implemented, yet another, closure that yields an iterator with the next moves:

let next_positions = |p| {
[(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]
.iter()
.filter_map(move |&(x, y, t)| {
let next_p = p + Vector3D::new(x, y, t);

if basin[next_p] == '.' {
Some(next_p)
} else {
None
}
})
};

Min-heap

In this case I had a need to use the priority queue taking the elements with the +lowest cost as the prioritized ones. Rust only offers you the BinaryHeap and +that is a max-heap. One of the ways how to achieve a min-heap is to put the +elements in wrapped in a Reverse (as is even showed in the linked docs of +the BinaryHeap). However the wrapping affects the type of the heap and also +popping the most prioritized elements yields values wrapped in the Reverse.

For this purpose I have just taken the max-heap and wrapped it as a whole in a +separate structure providing just the desired methods:

use std::cmp::{Ord, Reverse};
use std::collections::BinaryHeap;

pub struct MinHeap<T> {
heap: BinaryHeap<Reverse<T>>,
}

impl<T: Ord> MinHeap<T> {
pub fn new() -> MinHeap<T> {
MinHeap {
heap: BinaryHeap::new(),
}
}

pub fn push(&mut self, item: T) {
self.heap.push(Reverse(item))
}

pub fn pop(&mut self) -> Option<T> {
self.heap.pop().map(|Reverse(x)| x)
}
}

impl<T: Ord> Default for MinHeap<T> {
fn default() -> Self {
Self::new()
}
}

Rest is just the algorithm implementation which is not that interesting.

Day 25: Full of Hot Air

tl;dr

Playing around with a numbers in a special base.

Getting flashbacks to the IB111 Foundations of Programming… Very nice “problem” +with a rather easy solution, as the last day always seems to be.

Solution

Implementing 2 functions, converting from the SNAFU base and back to the SNAFU +base representation. Let's do a bit more though! I have implemented two functions:

  • from_snafu
  • to_snafu

Now it is apparent that all I do is number to string and string to number. Hmm… +that sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers +and implement the traits that we need.

Let's start with a structure:

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct SNAFU {
value: i64,
}

Converting from &str

We will start by implementing the FromStr trait that will help us parse our input. +This is rather simple, I can just take the from_snafu function, copy-paste it +into the from_str method and the number I get will be wrapped in Result and +SNAFU structure.

Converting to String

This is more fun. In some cases you need to implement only one trait and others +are automatically implemented using that one trait. In our case, if you look in +the documentation, you can see that ToString trait is automatically implemented +for any type that implements Display trait.

Let's implement the Display trait then. We should be able to use the to_snafu +function and just take the self.value from the SNAFU structure.

And for the convenience of tests, we can also implement a rather simple From<i64> +trait for the SNAFU.

Adjusting the code

After those changes we need to adjust the code and tests.

Parsing of the input is very easy, before we have used the lines, now we parse +everything:

     fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
- file_to_lines(pathname)
+ file_to_structs(pathname)
}

Part 1 needs to be adjusted a bit too:

     fn part_1(input: &Input) -> Output {
- to_snafu(input.iter().map(|s| from_snafu(s)).sum())
+ SNAFU::from(input.iter().map(|s| s.value).sum::<i64>()).to_string()
}

You can also see that it simplifies the meaning a bit and it is more explicit than +the previous versions.

And for the tests:

     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}

Summary

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

Finished advent calendar :smile:

Advent of Code

This year was quite fun, even though most of the solutions and posts came in +later on (cough in '23 cough). Day 22 was the most obnoxious one… And also +it feels like I used priority queues and tree data structures a lot 👀

with Rust

I must admit that a lot of compiler warnings and errors were very useful. Even +though I still found some instances where they didn't help at all or cause even +worse issues than I had. Compilation times have been addressed with the caching.

Building my first tree data structure in Rust has been a very “interesting” +journey. Being able to write a more generic BFS algorithm that allows you to not +duplicate code while still mantaining the desired functionality contributes to +a very readable code.

I am definitely much more aware of the basic things that bloated Python is +missing, yet Rust has them…

Using explicit types and writing down placeholder functions with todo!() +macros is very pleasant, since it allows you to easily navigate the type system +during the development when you don't even need to be sure how are you going to +put the smaller pieces together.

I have used a plethora of traits and also implemented some of them to either be +idiomatic, or exploit the syntactic sugar they offer. Deriving the default trait +implementation is also very helpful in a lot of cases, e.g. debugging output, +copying, equality comparison, etc.

I confess to touching more “cursed” parts of the Rust, such as macros to +declutter the copy-paste for tests or writing my own structures that need to +carry a lifetime for their own fields.

tl;dr Relatively pleasant language until you hit brick wall 😉


See you next year! Maybe in Rust, maybe not 🙃

+ + + + \ No newline at end of file diff --git a/blog/aoc-2022/intro/index.html b/blog/aoc-2022/intro/index.html new file mode 100644 index 0000000..8963ab4 --- /dev/null +++ b/blog/aoc-2022/intro/index.html @@ -0,0 +1,91 @@ + + + + + +Advent of Code '22 in Rust | mf + + + + + + + + + + + + + +
+

Advent of Code '22 in Rust

· 9 min read
Matej Focko

Let's talk about the preparations for this year's Advent of Code.

Choosing a language

When choosing a language for AoC, you usually want a language that gives you a +quick feedback which allows you to iterate quickly to the solution of the puzzle. +One of the most common choices is Python, many people also use JavaScript or Ruby.

Given the competitive nature of the AoC and popularity among competitive programming, +C++ might be also a very good choice. Only if you are familiar with it, I guess…

If you want a challenge, you might also choose to rotate the languages each day. +Though I prefer to use only one language.

For this year I have been deciding between Rust, C++ and Pascal or Ada.

I have tried Rust last year and have survived with it for 3 days and then gave +up and switched to Kotlin, which was pretty good given it is “Java undercover”. +I pretty much like the ideas behind Rust, I am not sure about the whole cult and +implementation of those ideas though. After some years with C/C++, I would say +that Rust feels too safe for my taste and tries to “punish me” even for the +most trivial things.

C++ is a very robust, but also comes with a wide variety of options providing you +the ability to shoot yourself in the leg. I have tried to solve few days of previous +Advent of Code events, it was relatively easy to solve the problems in C++, given +that I do not admit writing my own iterator for enumerate

Pascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a +pretty nice standard library that offers enough to be able to quickly solve some +problems in it. However the toolkit is questionable :/

Choosing libraries

Preparations for Rust

All of the sources, later on including solutions, can be found at my +GitLab.

Toolkit

Since we are using Rust, we are going to use a Cargo and more than likely VSCode +with rust-analyzer. Because of my choice of libraries, we will also introduce +a .envrc file that can be used by direnv, which allows you to set specific +environment variables when you enter a directory. In our case, we will use

# to show nice backtrace when using the color-eyre
export RUST_BACKTRACE=1

# to catch logs generated by tracing
export RUST_LOG=trace

And for the one of the most obnoxious things ever, we will use a script to download +the inputs instead of “clicking, opening and copying to a file1. There is +no need to be fancy, so we will adjust Python script by Martin2.

#!/usr/bin/env python3

import datetime
import yaml
import requests
import sys


def load_config():
with open("env.yaml", "r") as f:
js = yaml.load(f, Loader=yaml.Loader)
return js["session"], js["year"]


def get_input(session, year, day):
return requests.get(
f"https://adventofcode.com/{year}/day/{day}/input",
cookies={"session": session},
headers={
"User-Agent": "{repo} by {mail}".format(
repo="gitlab.com/mfocko/advent-of-code-2022",
mail="me@mfocko.xyz",
)
},
).content.decode("utf-8")


def main():
day = datetime.datetime.now().day
if len(sys.argv) == 2:
day = sys.argv[1]

session, year = load_config()
problem_input = get_input(session, year, day)

with open(f"./inputs/day{day:>02}.txt", "w") as f:
f.write(problem_input)


if __name__ == "__main__":
main()

If the script is called without any arguments, it will deduce the day from the +system, so we do not need to change the day every morning. It also requires a +configuration file:

# env.yaml
session: ‹your session cookie›
year: 2022

Libraries

Looking at the list of the libraries, I have chosen “a lot” of them. Let's walk +through each of them.

tracing and tracing-subscriber are the crates that can be used for tracing +and logging of your Rust programs, there are also other crates that can help you +with providing backtrace to the Sentry in case you have deployed your application +somewhere and you want to watch over it. In our use case we will just utilize the +macros for debugging in the terminal.

thiserror, anyhow and color-eyre are used for error reporting. +thiserror is a very good choice for libraries, cause it extends the Error +from the std and allows you to create more convenient error types. Next is +anyhow which kinda builds on top of the thiserror and provides you with simpler +error handling in binaries3. And finally we have color-eyre which, as I found +out later, is a colorful (wink wink) extension of eyre which is fork of anyhow +while supporting customized reports.

In the end I have decided to remove thiserror and anyhow, since first one is +suitable for libraries and the latter was basically fully replaced by {color-,}eyre.

regex and lazy_static are a very good and also, I hope, self-explanatory +combination. lazy_static allows you to have static variables that must be initialized +during runtime.

itertools provides some nice extensions to the iterators from the std.

My own “library”

When creating the crate for this year's Advent of Code, I have chosen a library +type. Even though standard library is huge, some things might not be included and +also we can follow KISS. I have 2 modules that my “library” exports, one for +parsing and one for 2D vector (that gets used quite often during Advent of Code).

Key part is, of course, processing the input and my library exports following +functions that get used a lot:

/// Reads file to the string.
pub fn file_to_string<P: AsRef<Path>>(pathname: P) -> String;

/// Reads file and returns it as a vector of characters.
pub fn file_to_chars<P: AsRef<Path>>(pathname: P) -> Vec<char>;

/// Reads file and returns a vector of parsed structures. Expects each structure
/// on its own line in the file. And `T` needs to implement `FromStr` trait.
pub fn file_to_structs<P: AsRef<Path>, T: FromStr>(pathname: P) -> Vec<T>
where
<T as FromStr>::Err: Debug;

/// Converts iterator over strings to a vector of parsed structures. `T` needs
/// to implement `FromStr` trait and its error must derive `Debug` trait.
pub fn strings_to_structs<T: FromStr, U>(
iter: impl Iterator<Item = U>
) -> Vec<T>
where
<T as std::str::FromStr>::Err: std::fmt::Debug,
U: Deref<Target = str>;

/// Reads file and returns it as a vector of its lines.
pub fn file_to_lines<P: AsRef<Path>>(pathname: P) -> Vec<String>;

As for the vector, I went with a rather simple implementation that allows only +addition of the vectors for now and accessing the elements via functions x() +and y(). Also the vector is generic, so we can use it with any numeric type we +need.

Skeleton

We can also prepare a template to quickly bootstrap each of the days. We know +that each puzzle has 2 parts, which means that we can start with 2 functions that +will solve them.

fn part1(input: &Input) -> Output {
todo!()
}

fn part2(input: &Input) -> Output {
todo!()
}

Both functions take reference to the input and return some output (in majority +of puzzles, it is the same type). todo!() can be used as a nice placeholder, +it also causes a panic when reached and we could also provide some string with +an explanation, e.g. todo!("part 1"). We have not given functions a specific +type and to avoid as much copy-paste as possible, we will introduce type aliases.

type Input = String;
type Output = i32;
tip

This allows us to quickly adjust the types only in one place without the need to +do regex-replace or replace them manually.

For each day we get a personalized input that is provided as a text file. Almost +all the time, we would like to get some structured type out of that input, and +therefore it makes sense to introduce a new function that will provide the parsing +of the input.

fn parse_input(path: &str) -> Input {
todo!()
}

This “parser” will take a path to the file, just in case we would like to run the +sample instead of input.

OK, so now we can write a main function that will take all of the pieces and +run them.

fn main() {
let input = parse_input("inputs/dayXX.txt");

println!("Part 1: {}", part_1(&input));
println!("Part 2: {}", part_2(&input));
}

This would definitely do :) But we have installed a few libraries and we want to +use them. In this part we are going to utilize tracing (for tracing, duh…) +and color-eyre (for better error reporting, e.g. from parsing).

fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = parse_input("inputs/dayXX.txt");

info!("Part 1: {}", part_1(&input));
info!("Part 2: {}", part_2(&input));

Ok(())
}

The first statement will set up tracing and configure it to print out the logs to +terminal, based on the environment variable. We also change the formatting a bit, +since we do not need all the fancy features of the logger. Pure initialization +would get us logs like this:

2022-12-11T19:53:19.975343Z  INFO day01: Part 1: 0

However after running that command, we will get the following:

 INFO src/bin/day01.rs:35: Part 1: 0

And the color_eyre::install()? is quite straightforward. We just initialize the +error reporting by color eyre.

caution

Notice that we had to add Ok(()) to the end of the function and adjust the +return type of the main to Result<()>. It is caused by the color eyre that +can be installed only once and therefore it can fail, that is how we got the ? +at the end of the ::install which unwraps the »result« of the installation.

Overall we will get to a template like this:

use aoc_2022::*;

use color_eyre::eyre::Result;
use tracing::info;
use tracing_subscriber::EnvFilter;

type Input = String;
type Output = i32;

fn parse_input(path: &str) -> Input {
todo!()
}

fn part1(input: &Input) -> Output {
todo!()
}

fn part2(input: &Input) -> Output {
todo!()
}

fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = parse_input("inputs/dayXX.txt");

info!("Part 1: {}", part_1(&input));
info!("Part 2: {}", part_2(&input));

Ok(())
}

  1. Copy-pasting might be a relaxing thing to do, but you can also discover +nasty stuff about your PC. See this Reddit post and the comment.
  2. GitHub profile
  3. Even though you can use it even for libraries, but handling errors from +libraries using anyhow is nasty… You will be the stinky one ;)
+ + + + \ No newline at end of file diff --git a/blog/archive/index.html b/blog/archive/index.html new file mode 100644 index 0000000..066479b --- /dev/null +++ b/blog/archive/index.html @@ -0,0 +1,25 @@ + + + + + +Archive | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/atom.xml b/blog/atom.xml new file mode 100644 index 0000000..83c5d6b --- /dev/null +++ b/blog/atom.xml @@ -0,0 +1,751 @@ + + + https://blog.mfocko.xyz/blog + mf Blog + 2023-08-02T00:00:00.000Z + https://github.com/jpmonette/feed + + mf's blog + https://blog.mfocko.xyz/img/favicon.ico + + <![CDATA[How can Copr help with broken dependencies]]> + https://blog.mfocko.xyz/blog/2023/08/02/copr + + 2023-08-02T00:00:00.000Z + + When you decide to run Fedora on your VPS, you might get screwed over by using +random repositories…

When I “reserved” my VPS1 back in June '20, I slapped Fedora on it without +thinking. I bet 99% of people would say that I'm crazy for doing such thing2, +BUT I've been using Fedora on my PCs for some time already and it felt very +stable and natural to just use, even for VPS.

One of the first things I've done was setting up a mail server. You may guess +what's the fun part about having a mail server… Yes, it's all the spam you +receive and only then you realize how much “crap” gets filtered on free mail +services. To battle this problem I chose to use +rspamd that had CentOS support, but someone +had a Copr repository that I used to +install it.

How does Copr repositories work?

If you have ever used Ubuntu, you might be familiar with the concept since it is +very close to PPAs.

tl;dr of the whole process consists of

  1. enabling the Copr repository, and
  2. installing the desired package.

So in shell you would do

# dnf copr enable ‹copr-repository›
# dnf install ‹package-from-the-repository›

And… that's it! Nothing else needed! Simple, right? And literally same process +as you would do for the PPA.

AUR

On the other hand, if you are familiar with the archLinux, you definitely know +AUR and what it can do for you. Copr repository is pretty similar, but the +packages are prebuilt in Copr and Copr repositories can carry the required +dependencies for said packages, which simplifies the distribution, and can even +help with installing singular packages (when you just need the dependency, not +everything).

My issue

Now you might wonder how would I use it on my VPS. It's rather simple, once in +6 months a new Fedora release comes out. And you need to upgrade to newer +release… You don't need to do it right away and for such setup it probably isn't +even recommended.

tip

Fedora releases are supported for a year, i.e. they live 6 months till the next +release and then another 6 months till another release.

Some people prefer to run one version “behind”. If you ever decide to run it on +your home server or in a similar setup, it might be a pretty good idea to +follow. I'm using the “latest greatest”, cause why not 😄

One way or another, you still need to bump the release every six months, unless +you'd bump 2 releases at once every year, which would be a decision, since, at +least I, cannot see any benefits in it… You don't go for “stability”, cause once +a year you switch to the latest release and then, before you bump, you use one +year old software, so you're not even using the latest.

Fast-forward 2 years in the future, new Fedora release came out (October '22) +and I was doing an upgrade. Dependencies of the rspamd have been updated and +rspamd builds in Copr have failed and no one fixed it. Cool, so now I can +upgrade, but can either ignore the dependencies or uninstall the rspamd…

How can Copr help?

I have managed to find +specfile for the +rspamd package that they use for CentOS. There were some files apart from the +specfile, so I had to make an SRPM locally and then… I just uploaded the SRPM +to the Copr to +build +an RPM.

I have switched the previous Copr repository for rspamd with my own and happily +proceeded with the upgrade.

Conclusion

Copr is heavily used for testing builds on the upstream with +Packit. However, as you can see, it is possible to use it +very well for packaging your own stuff and avoiding issues (such as the one +I have described above), if need be.


  1. vpsFree.cz
  2. Even though I've been running archLinux on some Raspberry Pi's and also +on one of my “home servers”, before getting the VPS. You could say I like +to live on the edge…
]]>
+ + Matej Focko + me+blog@mfocko.xyz + https://gitlab.com/mfocko + + + + + + +
+ + <![CDATA[4th week of Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/4th-week + + 2023-07-07T15:14:00.000Z + + Let's go through the fourth week of Advent of Code in Rust.

Day 22: Monkey Map

tl;dr

Simulating a movement on a 2D map with given instructions. Map becomes a cube in +the 2nd part…

Rant

This was the most obnoxious problem of this year… and a lot of Rust issues have +been hit.

Solution

It seems like a very simple problem to solve, but with very obnoxious changes in +the 2nd part and also it's relatively hard to decompose »properly«.

Column iterator

In the first part of the problem it was needed to know the boundaries of each +row and column, since I stored them in Vec<Vec<char>> and padded with spaces +to ensure I have a rectangular 2D “array”. However when you wanted to go through +each row and column to determine the boundaries, it was very easy to do for the +rows (cause each row is a Vec element), but not for the columns, since they +span multiple rows.

For this use case I have implemented my own column iterator:

pub struct ColumnIterator<'a, T> {
map: &'a [Vec<T>],
column: usize,

i: usize,
}

impl<'a, T> ColumnIterator<'a, T> {
pub fn new(map: &'a [Vec<T>], column: usize) -> ColumnIterator<'a, T> {
Self { map, column, i: 0 }
}
}

impl<'a, T> Iterator for ColumnIterator<'a, T> {
type Item = &'a T;

fn next(&mut self) -> Option<Self::Item> {
if self.i >= self.map.len() {
return None;
}

self.i += 1;
Some(&self.map[self.i - 1][self.column])
}
}

Given this piece of an iterator, it is very easy to factor out the common +functionality between the rows and columns into:

let mut find_boundaries = |constructor: fn(usize) -> Orientation,
iterator: &mut dyn Iterator<Item = &char>,
upper_bound,
i| {
let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');
let start = first_non_empty.next().unwrap().0 as isize;

let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');
let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;

boundaries.insert(constructor(i), start..end);
};

And then use it as such:

// construct all horizontal boundaries
(0..map.len()).for_each(|row| {
find_boundaries(
Orientation::horizontal,
&mut map[row].iter(),
map[row].len(),
row,
);
});

// construct all vertical boundaries
(0..map[0].len()).for_each(|col| {
find_boundaries(
Orientation::vertical,
&mut ColumnIterator::new(&map, col),
map.len(),
col,
);
});

Walking around the map

Once the 2nd part got introduced, you start to think about a way how not to +copy-paste a lot of stuff (I haven't avoided it anyways…). In this problem, I've +chosen to introduce a trait (i.e. interface) for 2D and 3D walker.

trait Wrap: Clone {
type State;

// simulation
fn is_blocked(&self) -> bool;
fn step(&mut self, steps: isize);
fn turn_left(&mut self);
fn turn_right(&mut self);

// movement
fn next(&self) -> (Self::State, Direction);

// final answer
fn answer(&self) -> Output;
}

Each walker maintains its own state and also provides the functions that are +used during the simulation. The “promised” methods are separated into:

  • simulation-related: that are used during the simulation from the .fold()
  • movement-related: just a one method that holds most of the logic differences +between 2D and 3D
  • final answer: which extracts the proof of solution from the +implementation-specific walker

Both 2D and 3D versions borrow the original input and therefore you must +annotate the lifetime of it:

struct Wrap2D<'a> {
input: &'a Input,
position: Position,
direction: Direction,
}
impl<'a> Wrap2D<'a> {
fn new(input: &'a Input) -> Wrap2D<'a> {
// …

Problems

I have used a lot of closures for this problem and once I introduced a parameter +that was of unknown type (apart from the fact it implements a specific trait), I +got suggested a “fix” for the compilation error that resulted in something that +was not possible to parse, cause it, more than likely, violated the grammar.

In a similar fashion, I have been suggested changes that led to a code that +didn't make sense by just looking at it (there was no need to try the changes), +for example one suggested change in the closure parameter caused disapperance of +the parameter name. 😄

Clippy

I have to admit that Clippy was rather helpful here, I'll include two examples +of rather smart suggestions.

When writing the parsing for this problem, the first thing I have spotted on the +char was the .is_digit() function that takes a radix as a parameter. Clippy +noticed that I use radix = 10 and suggested switching to .is_ascii_digit() +that does exactly the same thing:

-                .take_while(|c| c.is_digit(10))
+ .take_while(|c| c.is_ascii_digit())

Another useful suggestion appeared when working with the iterators and I wanted +to get the nn-th element from it. You know the .skip(), you know the +.next(), just “slap” them together and we're done for 😁 Well, I got +suggested to use .nth() that does exactly the combination of the two mentioned +methods on iterators:

-            match it.clone().skip(skip).next().unwrap() {
+ match it.clone().nth(skip).unwrap() {

Day 23: Unstable Diffusion

tl;dr

Simulating movement of elves around with a set of specific rules.

Solution

There's not much to mention since it's just a cellular automaton simulation +(even though the AoC rules for cellular automatons usually get out of hand +😉).

Although I had a need to determine boundaries of the elves' positions and ended +up with a nasty DRY violation. Knowing that you you're looking for maximum and +minimum that are, of course, exactly the same except for initial values and +comparators, it looks like a rather simple fix, but typing in Rust is something +else, right? In the end I settled for a function that computes both boundaries +without any duplication while using a closure:

fn get_bounds(positions: &Input) -> (Vector2D<isize>, Vector2D<isize>) {
let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {
positions
.iter()
.fold(Vector2D::new(init, init), |acc, elf| {
Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))
})
};

(f(isize::MAX, &min::<isize>), f(isize::MIN, &max::<isize>))
}

This function returns a pair of 2D vectors that represent opposite points of the +bounding rectangle of all elves.

You might ask why would we need a closure and the answer is that positions +cannot be captured from within the nested function, only via closure. One more +fun fact on top of that is the type of the comparator

&dyn Fn(isize, isize) -> isize

Once we remove the dyn keyword, compiler yells at us and also includes a way +how to get a more thorough explanation of the error by running

$ rustc --explain E0782

which shows us

Trait objects must include the `dyn` keyword.

Erroneous code example:

```
trait Foo {}
fn test(arg: Box<Foo>) {} // error!
```

Trait objects are a way to call methods on types that are not known until
runtime but conform to some trait.

Trait objects should be formed with `Box<dyn Foo>`, but in the code above
`dyn` is left off.

This makes it harder to see that `arg` is a trait object and not a
simply a heap allocated type called `Foo`.

To fix this issue, add `dyn` before the trait name.

```
trait Foo {}
fn test(arg: Box<dyn Foo>) {} // ok!
```

This used to be allowed before edition 2021, but is now an error.
Rant

Not all of the explanations are helpful though, in some cases they might be even +more confusing than helpful, since they address very simple use cases.

As you can see, even in this case there are two sides to the explanations:

  • it explains why you need to use dyn, but
  • it still mentions that trait objects need to be heap-allocated via Box<T> +that, as you can see in my snippet, does not apply here 😄 IMO it's +caused by the fact that we are borrowing it and therefore we don't need to +care about the size or whereabouts of it.
C++ parallel

If you dive into the explanation above, you can notice that the Box<dyn Trait> +pattern is very helpful for using types that are not known during compile-time. +You would use a very similar approach in C++ when parsing some data structure +from input (let's say JSON for example).

On the other hand, in this case, it doesn't really make much sense, cause you +can clearly see that the types are known during the compile-time, which in +C++ could be easily resolved by templating the helper function.

Day 24: Blizzard Basin

tl;dr

Navigating your way through a basin with series of blizzards that move around +you as you move.

caution

It's second to last day and I went “bonkers” on the Rust 😄 Proceed to +read Solution part on your own risk.

Solution

You are given a map with blizzards all over the place and you're supposed to +find the minimum time it requires you to walk through the basin without getting +in any of the blizzards.

Breakdown

Relatively simple, yet a bit annoying, approach can be taken. It's technically +a shortest-path algorithm implementation with some relaxation restrictions and +being able to stay on one position for some time, so each vertex of the graph +is determined by the position on the map and the timestamp. I have chosen to +use Vector3D<usize>, since x and y attributes can be used for the position +and, well, let's use z for a timestamp, cause why not, right? 😉

Evaluating the blizzards

caution

I think that this is the most perverted abuse of the traits in the whole 4 weeks +of AoC in Rust…

The blizzards move along their respective directions in time and loop around in +their respective row/column. Each vertex holds position and time, so we can +just index the basin with the vertex itself, right? Yes, we can 😈

Fun fact

While writing this part, I've recognized unnecessary verbosity in the code and +cleaned it up a bit. The changed version is shown here and the original was just +more verbose.

I'll skip the boring parts of checking bounds and entry/exit of the basin 😉 +We can easily calculate positions of the blizzards using a modular arithmetics:

impl Index<Position> for Basin {
type Output = char;

fn index(&self, index: Position) -> &Self::Output {
// ‹skipped boring parts›

// We need to account for the loops of the blizzards
let width = self.cols - 2;
let height = self.rows - 2;

let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;
[
(
index.y() as usize,
blizzard_origin(width, -1, index.z(), index.x()),
'>',
),
(
index.y() as usize,
blizzard_origin(width, 1, index.z(), index.x()),
'<',
),
(
blizzard_origin(height, -1, index.z(), index.y()),
index.x() as usize,
'v',
),
(
blizzard_origin(height, 1, index.z(), index.y()),
index.x() as usize,
'^',
),
]
.iter()
.find_map(|&(y, x, direction)| {
if self.map[y][x] == direction {
Some(&self.map[y][x])
} else {
None
}
})
.unwrap_or(&'.')
}
}

As you can see, there is an expression for calculating the original position and +it's used multiple times, so why not take it out to a lambda, right? 😉

I couldn't get the rustfmt to format the for-loop nicely, so I've just +decided to go with iterating over an elements of a slice. I have used, once +again, a combination of two functions (find_map in this case) to do 2 things +at once and at the end, if we haven't found any blizzard, we just return the +empty space.

I think it's a very nice (and naughty) way how to use the Index trait, don't +you think?

Shortest-path algorithm

For the shortest path you can choose and adjust any of the common shortest-path +algorithms, in my case, I have decided to use A* instead of Dijkstra's +algorithm, since it better reflects the cost function.

Comparison of costs

With the Dijkstra's algorithm I would proceed with the time attribute used as +a priority for the queue.

Whereas with the A*, I have chosen to use both time and Manhattan distance +that promotes vertices closer to the exit and with a minimum time taken.

Cost function is, of course, a closure 😉

let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());

And also for checking the possible moves from the current vertex, I have +implemented, yet another, closure that yields an iterator with the next moves:

let next_positions = |p| {
[(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]
.iter()
.filter_map(move |&(x, y, t)| {
let next_p = p + Vector3D::new(x, y, t);

if basin[next_p] == '.' {
Some(next_p)
} else {
None
}
})
};

Min-heap

In this case I had a need to use the priority queue taking the elements with the +lowest cost as the prioritized ones. Rust only offers you the BinaryHeap and +that is a max-heap. One of the ways how to achieve a min-heap is to put the +elements in wrapped in a Reverse (as is even showed in the linked docs of +the BinaryHeap). However the wrapping affects the type of the heap and also +popping the most prioritized elements yields values wrapped in the Reverse.

For this purpose I have just taken the max-heap and wrapped it as a whole in a +separate structure providing just the desired methods:

use std::cmp::{Ord, Reverse};
use std::collections::BinaryHeap;

pub struct MinHeap<T> {
heap: BinaryHeap<Reverse<T>>,
}

impl<T: Ord> MinHeap<T> {
pub fn new() -> MinHeap<T> {
MinHeap {
heap: BinaryHeap::new(),
}
}

pub fn push(&mut self, item: T) {
self.heap.push(Reverse(item))
}

pub fn pop(&mut self) -> Option<T> {
self.heap.pop().map(|Reverse(x)| x)
}
}

impl<T: Ord> Default for MinHeap<T> {
fn default() -> Self {
Self::new()
}
}

Rest is just the algorithm implementation which is not that interesting.

Day 25: Full of Hot Air

tl;dr

Playing around with a numbers in a special base.

Getting flashbacks to the IB111 Foundations of Programming… Very nice “problem” +with a rather easy solution, as the last day always seems to be.

Solution

Implementing 2 functions, converting from the SNAFU base and back to the SNAFU +base representation. Let's do a bit more though! I have implemented two functions:

  • from_snafu
  • to_snafu

Now it is apparent that all I do is number to string and string to number. Hmm… +that sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers +and implement the traits that we need.

Let's start with a structure:

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct SNAFU {
value: i64,
}

Converting from &str

We will start by implementing the FromStr trait that will help us parse our input. +This is rather simple, I can just take the from_snafu function, copy-paste it +into the from_str method and the number I get will be wrapped in Result and +SNAFU structure.

Converting to String

This is more fun. In some cases you need to implement only one trait and others +are automatically implemented using that one trait. In our case, if you look in +the documentation, you can see that ToString trait is automatically implemented +for any type that implements Display trait.

Let's implement the Display trait then. We should be able to use the to_snafu +function and just take the self.value from the SNAFU structure.

And for the convenience of tests, we can also implement a rather simple From<i64> +trait for the SNAFU.

Adjusting the code

After those changes we need to adjust the code and tests.

Parsing of the input is very easy, before we have used the lines, now we parse +everything:

     fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
- file_to_lines(pathname)
+ file_to_structs(pathname)
}

Part 1 needs to be adjusted a bit too:

     fn part_1(input: &Input) -> Output {
- to_snafu(input.iter().map(|s| from_snafu(s)).sum())
+ SNAFU::from(input.iter().map(|s| s.value).sum::<i64>()).to_string()
}

You can also see that it simplifies the meaning a bit and it is more explicit than +the previous versions.

And for the tests:

     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}

Summary

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

Finished advent calendar :smile:

Advent of Code

This year was quite fun, even though most of the solutions and posts came in +later on (cough in '23 cough). Day 22 was the most obnoxious one… And also +it feels like I used priority queues and tree data structures a lot 👀

with Rust

I must admit that a lot of compiler warnings and errors were very useful. Even +though I still found some instances where they didn't help at all or cause even +worse issues than I had. Compilation times have been addressed with the caching.

Building my first tree data structure in Rust has been a very “interesting” +journey. Being able to write a more generic BFS algorithm that allows you to not +duplicate code while still mantaining the desired functionality contributes to +a very readable code.

I am definitely much more aware of the basic things that bloated Python is +missing, yet Rust has them…

Using explicit types and writing down placeholder functions with todo!() +macros is very pleasant, since it allows you to easily navigate the type system +during the development when you don't even need to be sure how are you going to +put the smaller pieces together.

I have used a plethora of traits and also implemented some of them to either be +idiomatic, or exploit the syntactic sugar they offer. Deriving the default trait +implementation is also very helpful in a lot of cases, e.g. debugging output, +copying, equality comparison, etc.

I confess to touching more “cursed” parts of the Rust, such as macros to +declutter the copy-paste for tests or writing my own structures that need to +carry a lifetime for their own fields.

tl;dr Relatively pleasant language until you hit brick wall 😉


See you next year! Maybe in Rust, maybe not 🙃

]]>
+ + Matej Focko + me+blog@mfocko.xyz + https://gitlab.com/mfocko + + + + +
+ + <![CDATA[3rd week of Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/3rd-week + + 2023-07-06T21:00:00.000Z + + Let's go through the third week of Advent of Code in Rust.

Day 15: Beacon Exclusion Zone

tl;dr

Triangulating a distress beacon based on the information from the sensors.

Solution

Relatively easy thing to implement, no major Rust issues hit.

Day 16: Proboscidea Volcanium

tl;dr

Finding a max flow in a graph given some time constraints.

Solution

I have used some interesting things to implement this and make it easier for me.

Indexing in graph

I have come across a situation where I needed to keep more information regarding +the graph… In that case you can, of course, create a structure and keep it in, +but once you have multiple members in the structure it gets harder to work with +since you need to address the fields in the structure. When you work with graph, +you frequently need to access the vertices and in this case it felt a lot easier +to implement the indexing in a graph, rather than explicitly access the +underlying data structure.

Here you can see a rather short snippet from the solution that allows you to +“index” the graph:

impl Index<&str> for Graph {
type Output = Vertex;

fn index(&self, index: &str) -> &Self::Output {
&self.g[index]
}
}

Cartesian product

During the implementation I had to utilize Floyd-Warshall algorithm for finding +the shortest path between pairs of vertices and utilized the iproduct! macro +from the itertools. It is a very useful higher-order function that allows +you to keep the nesting of the loops at a minimum level while still maintaining +the same functionality.

“Implementing” an iterator

For the second part, you get to split the work between 2 actors. That way you +can achieve higher efficiency of the whole process that you're planning, but it +also makes it harder to evaluate algorithmically, since you need to check the +different ways the work can be split.

Being affected by functional programming brain damage™️, I have chosen to +do this part by function that returns an iterator over the possible ways:

fn pairings(
valves: &BTreeSet<String>,
) -> impl Iterator<Item = (BTreeSet<String>, BTreeSet<String>)> + '_ {
let mapping = valves.iter().collect_vec();

let max_mask = 1 << (valves.len() - 1);

(0..max_mask).map(move |mask| {
let mut elephant = BTreeSet::new();
let mut human = BTreeSet::new();

for (i, &v) in mapping.iter().enumerate() {
if (mask & (1 << i)) == 0 {
human.insert(v.clone());
} else {
elephant.insert(v.clone());
}
}

(human, elephant)
})
}

Day 17: Pyroclastic Flow

tl;dr

Simulating an autonomous Tetris where pieces get affected by a series of jets of +hot gas.

Solution

Similarly to the previous day I have created some iterators 😄

Collision detection

Once you need to check for collisions it is very helpful to be able to just +iterate through the positions that can actually collide with the wall or other +piece.

To get the desired behaviour, you can just compose few smaller functions:

fn occupied(shape: &[Vec<char>]) -> impl Iterator<Item = Position> + '_ {
shape.iter().enumerate().flat_map(|(y, row)| {
row.iter().enumerate().filter_map(move |(x, c)| {
if c == &'#' {
Some(Vector2D::new(x as isize, y as isize))
} else {
None
}
})
})
}

In the end, we get relative positions which we can adjust later when given the +specific positions from iterator. You can see some interesting parts in this:

  • .enumerate() allows us to get both the indices (coordinates) and the line +or, later on, the character itself,
  • .flat_map() flattens the iterator, i.e. when we return another iterator, +they just get chained instead of iterating over iterators (which sounds pretty +disturbing, doesn't it?),
  • and finally .filter_map() which is pretty similar to the “basic” .map() +with a one, key, difference that it expects the items of an iterator to be +mapped to an Option<T> from which it ignores nothing (as in None 😉) +and also unwraps the values from Some(…).

Infinite iterator

In the solution we cycle through both Tetris-like shapes that fall down and the +jets that move our pieces around. Initially I have implemented my own infinite +iterator that just yields the indices. It is a very simple, yet powerful, piece +of code:

struct InfiniteIndex {
size: usize,
i: usize,
}

impl InfiniteIndex {
fn new(size: usize) -> InfiniteIndex {
InfiniteIndex { size, i: size - 1 }
}
}

impl Iterator for InfiniteIndex {
type Item = usize;

fn next(&mut self) -> Option<Self::Item> {
self.i = (self.i + 1) % self.size;
Some(self.i)
}
}

However when I'm looking at the code now, it doesn't really make much sense… +Guess what, we can use a built-in function that is implemented on iterators for +that! The function is called .cycle()

On the other hand, I am not going to switch to that function, since it would +introduce an another myriad of issues caused by the fact that I create iterators +right away in the constructor of my structure and the iterators would borrow +both the jets and shapes which would introduce a lifetime dependency into the +structure.

Day 18: Boiling Boulders

tl;dr

Let's compute a surface area of some obsidian approximated via coordinates of +cubes.

Solution

This day is kinda interesting, because it shows how easily you can complicate the +problem and also how much can you screw yourself over with the optimization and +“smart” approach.

For the first part you need to find the surface area of an obsidian that is +approximated by cubes. Now, that is a very easy thing to do, just keep the track +of already added cubes, and check if the newly added cube touches any face of any +other cube. Simple, and with a BTreeSet relatively efficient way to do it.

However the second part lets you on a secret that there may be some surface area +from the “inside” too and you want to know only the one from the outside of the +obsidian. I have seen some solutions later, but if you check your data, you might +notice that the bounding box of all the cubes isn't that big at all. Therefore I +chose to pre-construct the box beforehand, fill in the cubes and then just run a +BFS turning all the lava on the outside into the air. Now you just need to check +cubes and count how many of their faces touch the air.

Day 19: Not Enough Minerals

tl;dr

Finding out the best strategy for building robots to collect geodes.

Solution

Not much interesting stuff to mention apart from the suggestion to never believe +that the default implementation given by derive macro is what you want, it +doesn't have to be. 😄

Day 20: Grove Positioning System

tl;dr

Shuffling around the circular linked list to find the coordinates.

Now, small rant for this day is in place. They've never mentioned that coordinates +can repeat and therefore the values are non-unique. This is something that did +not happen in the given sample, but was present in the user input. It took »a lot« +to realize that this is the issue.

Solution

I have tried implementing a circular linked list for this… and I have failed +miserably. To be fair, I still have no clue why. It was “fun” to play around with +the Rc<RefCell<T>>. In the end I failed on wrong answer. I have also encountered +a rather interesting issue with .borrow_mut() method being used on Rc<RefCell<T>>.

.borrow_mut()

Consider the following snippet of the code (taken from the documentation):

use std::cell::{RefCell, RefMut};
use std::collections::HashMap;
use std::rc::Rc;
// use std::borrow::BorrowMut;

fn main() {
let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
// Create a new block to limit the scope of the dynamic borrow
{
let mut map: RefMut<_> = shared_map.borrow_mut();
map.insert("africa", 92388);
map.insert("kyoto", 11837);
map.insert("piccadilly", 11826);
map.insert("marbles", 38);
}

// Note that if we had not let the previous borrow of the cache fall out
// of scope then the subsequent borrow would cause a dynamic thread panic.
// This is the major hazard of using `RefCell`.
let total: i32 = shared_map.borrow().values().sum();
println!("{total}");
}

We allocate a hash map on the heap and then in the inner block, we borrow it as +a mutable reference, so that we can use it.

note

It is a very primitive example for Rc<RefCell<T>> and mutable borrow.

If you uncomment the 4th line with use std::borrow::BorrowMut;, you cannot +compile the code anymore, because of

   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
--> src/main.rs:10:34
|
10 | let mut map: RefMut<_> = shared_map.borrow_mut();
| --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference
| |
| expected due to this
|
= note: expected struct `RefMut<'_, _>`
found mutable reference `&mut Rc<RefCell<HashMap<_, _>>>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:11:13
|
11 | map.insert("africa", 92388);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:12:13
|
12 | map.insert("kyoto", 11837);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:13:13
|
13 | map.insert("piccadilly", 11826);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:14:13
|
14 | map.insert("marbles", 38);
| ^^^^^^ method not found in `RefMut<'_, _>`

Some errors have detailed explanations: E0308, E0599.
For more information about an error, try `rustc --explain E0308`.
error: could not compile `playground` due to 5 previous errors

It might seem a bit ridiculous. However, I got to a point where the compiler +suggested use std::borrow::BorrowMut; and it resulted in breaking parts of the +code that worked previously. I think it may be a good idea to go over what is +happening here.

.borrow_mut() on Rc<RefCell<T>>

Let's consider a variable x of type Rc<RefCell<T>>. What happens when you +call .borrow_mut() on it? We can look at the Rc type, and… hang on! There is +neither .borrow_mut() method or BorrowMut trait implemented. How can we do it +then?

Let's go further and we can see that RefCell<T> implements a .borrow_mut() +method. OK, but how can we call it on the Rc<T>? Easily! Rc<T> implements +Deref<T> and therefore you can call methods on Rc<T> objects as if they were +T objects. If we read on Deref coercion, we can see the following:

If T implements Deref<Target = U>, …:

  • T implicitly implements all the (immutable) methods of the type U.

What is the requirement for the .borrow_mut() on RefCell<T>? Well, it needs +&self, so the Deref implements the .borrow_mut() for the Rc<RefCell<T>>.

BorrowMut trait

I have not been able to find a lot on this trait. My guess is that it provides a +method instead of a syntactic sugar (&mut x) for the mutable borrow. And also +it provides default implementations for the types:

impl BorrowMut<str> for String

impl<T> BorrowMut<T> for &mut T
where
T: ?Sized,

impl<T> BorrowMut<T> for T
where
T: ?Sized,

impl<T, A> BorrowMut<[T]> for Vec<T, A>
where
A: Allocator,

impl<T, A> BorrowMut<T> for Box<T, A>
where
A: Allocator,
T: ?Sized,

impl<T, const N: usize> BorrowMut<[T]> for [T; N]
Conflict

Now the question is why did it break the code… My first take was that the type +Rc<RefCell<T>> has some specialized implementation of the .borrow_mut() and +the use overrides it with the default, which is true in a sense. However +there is no specialized implementation. Let's have a look at the trait and the +type signature on the RefCell<T>:

// trait
pub trait BorrowMut<Borrowed>: Borrow<Borrowed>
where
Borrowed: ?Sized,
{
fn borrow_mut(&mut self) -> &mut Borrowed;
}

// ‹RefCell<T>.borrow_mut()› type signature
pub fn borrow_mut(&self) -> RefMut<'_, T>

I think that we can definitely agree on the fact that RefMut<'_, T> is not the +RefCell<T>.

In my opinion, RefCell<T> implements a separate .borrow_mut() rather +than implementing the interface, because it cannot satisfy the type requirements +of the trait.

caution

I wonder how are we expected to deal with this conflict, if and when, we need +both the .borrow_mut() of the trait and .borrow_mut() of the RefCell<T>.

Fun fact

I was suggested by the compiler to do use std::borrow::BorrowMut; and break the +code.

So much for the almighty and helpful compiler…

Day 21: Monkey Math

tl;dr

Computing an expression tree and then also finding ideal value for a node.

Solution

Relatively simple, until you get to the 2nd part where you start to practice +a lot of the copy-paste. I have managed to sneak some perverted stuff in there +though :) Let's go through the details.

Default trait

For the first time and twice I had a need to have a default value for my types, +enumerations in this case. Rust offers a very nice trait1 that is described +as:

A trait for giving a type a useful default value.

I guess it sums it up nicely. The more interesting part about this is the fact +that you can use the macro machinery to save yourself some typing. If you have +enumeration of which the default value doesn't bear any parameter, you can just +do2:

#[derive(Default)]
enum Color {
#[default]
White,
Gray,
Black,
}

Abusing negation

If you want to use a unary minus operator on your own type, you can implement +a Neg trait3. I was dealing with a binary tree and needed a way how to look +at the other side, so I have just implemented the negation for flipping between +left and right 😄


  1. Default docs
  2. Pardon my example from the graph algorithms ;)
  3. Neg docs
]]>
+ + Matej Focko + me+blog@mfocko.xyz + https://gitlab.com/mfocko + + + + +
+ + <![CDATA[Sort the matrix diagonally]]> + https://blog.mfocko.xyz/blog/leetcode/sort-diagonally + + 2023-03-04T23:15:00.000Z + + Let's try to solve one of the LeetCode challenges in easy and hard mode at the +same time.

Problem description

A matrix diagonal is a diagonal line of cells starting from some cell in +either the topmost row or leftmost column and going in the bottom-right direction +until reaching the matrix's end. For example, the matrix diagonal starting +from mat[2][0], where mat is a 6 x 3 matrix, includes cells mat[2][0], +mat[3][1], and mat[4][2].

Given an m x n matrix mat of integers, sort each matrix diagonal in ascending +order and return the resulting matrix.

Example

Image describing the problem

Skeleton and initial adjustments

We are given the following skeleton for the C++ and the given challenge:

class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};

The task is to sort the passed matrix diagonally and then return it. First of all, +I don't like to solve this in a web browser, so we'll need to adjust it accordingly +for running it locally. We'll start by including the vector header and using +fully-qualified namespaces1 and also adding few tests:

#include <cassert>
#include <vector>

using matrix = std::vector<std::vector<int>>;

class Solution {
public:
matrix diagonalSort(matrix& mat)
{
}
};

static void test_case_1()
{
// Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
// Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },
std::vector { 2, 2, 1, 2 },
std::vector { 1, 1, 1, 2 } })
== std::vector { std::vector { 1, 1, 1, 1 },
std::vector { 1, 2, 2, 2 },
std::vector { 1, 2, 3, 3 } }));
}

static void test_case_2()
{
// Input: mat =
// [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
// Output:
// [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },
std::vector { 23, 55, 17, 45, 15, 52 },
std::vector { 75, 31, 36, 44, 58, 8 },
std::vector { 22, 27, 33, 25, 68, 4 },
std::vector { 84, 28, 14, 11, 5, 50 } })
== std::vector { std::vector { 5, 17, 4, 1, 52, 7 },
std::vector { 11, 11, 25, 45, 8, 69 },
std::vector { 14, 23, 25, 44, 58, 15 },
std::vector { 22, 27, 31, 36, 50, 66 },
std::vector { 84, 28, 75, 33, 55, 68 } }));
}

int main()
{
test_case_1();
test_case_2();

return 0;
}

We need to return the matrix, but we're given a reference to the input matrix. We +can easily abuse the C++ here and just switch the reference to value, this way +the matrix will be copied when passed to the function, we can sort the copy and +just return it back. And we also get yelled by the compiler for the fact that the +method doesn't return anything yet, so to make it “shut up” we will just return +the input for now:

-    matrix diagonalSort(matrix& mat)
+ matrix diagonalSort(matrix mat)
{
+ return mat;
}

Now, we get the copy and we're good to go.

Naïve solution

As you may know, C++ offers a plethora of functions that can be used to your +advantage, given that you know how to “bend” the data structures accordingly.

What does that mean for us? Well, we have an std::sort, we can use it, right? +Let's have a look at it:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );

This overload is more than we need. What does it do? It just sorts the elements +in the range [first, last) using operator< on them. We can't sort the whole +matrix using this, but… we can sort just »one« diagonal without doing much work +on our end.

What is the RandomIt type though? If we look more into the documentation, we +can easily find the requirements for it and also learn that it's a random access +iterator and allows swapping its values at the same time.

Random access iterator

What is the random access iterator though? We can find it in a documentation +and see the following description:

A LegacyRandomAccessIterator is a LegacyBidirectionalIterator +that can be moved to point to any element in constant time.

After that we can see all the requirements for it being listed. I don't feel like +reading them right now, so we will just use it and see where the compilation blows +up, i.e. “compiler-assisted development2 if you will ;)

Now we know that we can use std::sort to sort the diagonal itself, but we also +need to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to +someone else3. And that way we get

matrix diagonalSort(matrix mat)
{
// we iterate over the diagonals
for (auto d : diagonals(mat)) {
// and we sort each diagonal
std::sort(d.begin(), d.end());
}

// we take the matrix by copy, so we can sort in-situ and return the copy
// that we sorted
return mat;
}

This solution looks very simple, doesn't it? Well, cause it is. +Let's try compiling it:

matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]
for (auto d : diagonals(mat)) {
^
Found compiler error(s).
make: *** [makefile:14: tidy] Error 1

OK, seems about right. We haven't implemented the diagonals yet. And based on +what we've written so far, we need a function or a class diagonals that will +give us the diagonals we need.

Implementing the diagonals

Cool, so we need the function that will let us go through each and every diagonal +in our matrix. We use the for-range loop, so whatever we get back from the +diagonals must support .begin() and .end(). Since I am a masochist, we will +do such functionality for a matrix of any type, not just the int from the challenge.

As I said, we need to be able to

  • construct the object
  • get the beginning
  • get the end (the “sentinel”)
template <typename T>
class diagonals {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& _matrix;

public:
diagonals(matrix_t& m)
: _matrix(m)
{
}
diagonals_iter begin()
{
/* TODO */
}
diagonals_iter end()
{
/* TODO */
}
};

Now we have a diagonals that we can use to go through the diagonals. We haven't +implemented the core of it yet. Let's go through what we have for now.

We have a templated class with templated T that is used as a placeholder for any +type we would store in the matrix. Because I'm lazy, I have defined the matrix_t +type that is a “shortcut” for std::vector<std::vector<T>>, so I don't have to +type it out all the time. Of course, we need to store the matrix, we are given, +as a private attribute. And then just have the constructor and the 2 methods we +need for the for-range.

Iterating over diagonals

Now that we have an object that will allow us to iterate through the diagonals, +we need to implement the iterating itself. We need to go through all of them, so +we have multiple options how to do so. I have decided to start from the “main” +diagonal that starts at (0, 0) index and then proceed with the diagonals starting +in the first row, followed by the rest of the diagonals in the first column.

We need to be able to tell that we've iterated through all of them, and also we +need to know which diagonal is next. For that purpose we will pass the indices +of the first cell on the diagonal. That way we can always tell how to move forward.

We will start by updating the begin and end to reflect our choice accordingly.

diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }
diagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }

For the begin we return the first diagonal that starts at (0, 0). And because +we have decided to do the diagonals in the first column at the end, the first +diagonal that is not a valid one is the one at (0, height). Apart from the +indices, we also need to pass reference to the matrix itself.

note

You may have noticed that we also include the diagonals that have length 1, +specifically the ones at (0, height - 1) and (width - 1, 0). We are implementing +an iterator that should not care about the way it's being used. Therefore, we +don't care about the fact they don't need to be sorted.

Cool, let's leave the iterator itself to someone else, right?4

Implementing the iterator over diagonals

We can start with a simple skeleton based on the information that we pass from +the diagonals. Also to utilize the matrix_t and also contain implementation +details hidden away, we will put this code into the diagonals class.

class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}
};

In this case we will be implementing a “simple” forward iterator, so we don't +need to implement a lot. Notably it will be:

  • inequality operator (we need to know when we reach the end and have nothing to +iterate over)
  • preincrementation operator (we need to be able to move around the iterable)
  • dereference operator (we need to be able to retrieve the objects we iterate +over)
class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator!=(const diagonals_iter& rhs) const
{
// iterators are not equal if they reference different matrices, or
// their positions differ
return m != rhs.m || x != rhs.x || y != rhs.y;
}

diagonals_iter& operator++()
{
if (y != 0) {
// iterating through diagonals down the first column
y++;
return *this;
}

// iterating the diagonals along the first row
x++;
if (x == m.front().size()) {
// switching to diagonals in the first column
x = 0;
y++;
}

return *this;
}

diagonal<T> operator*() const { return diagonal { m, x, y }; }
};

Let's go one-by-one. Inequality operator is rather simple, just compare iterator's +attributes field-by-field. If you think about it, checking inequality of two 2D +vectors may be a bit inefficient, therefore, we can swap around and check it as +a last thing.

-        return m != rhs.m || x != rhs.x || y != rhs.y;
+ return x != rhs.x || y != rhs.y || m != rhs.m;

Preincrementation is where the magic happens. If you have a better look, you can +see two branches of this operation:

  1. When y != 0 (we're iterating over the diagonals in the first column) +In this case, we just bump the row and we're done.
  2. When y == 0 (we're iterating over the diagonals in the first row) +In this case, we bump the column and check if we haven't gotten out of bounds, +i.e. the end of the first row. If we get out of the bounds, we're continuing +with the second diagonal in the first column.

Dereferencing the iterator must “yield” something. In our case it will be the +diagonal that we want to sort. For sorting we need just the iterators that can +move around said diagonal. The simplest thing, we can do, is to delegate it to +something else. In our case it will be a class called diagonal.

Implementing the diagonal itself

After implementing the iterator over diagonals, we know that all we need to describe +a diagonal is the matrix itself and the “start” of the diagonal (row and column). +And we also know that the diagonal must provide some iterators for the std::sort +function. We can start with the following skeleton:

template <typename T>
class diagonal {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& matrix;
std::size_t x;
std::size_t y;

public:
diagonal(matrix_t& matrix, std::size_t x, std::size_t y)
: matrix(matrix)
, x(x)
, y(y)
{
}

diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }

diagonal_iter end() const
{
auto max_x = matrix[y].size();
auto max_y = matrix.size();

// we need to find the distance in which we get out of bounds (either in
// column or row)
auto steps = std::min(max_x - x, max_y - y);

return diagonal_iter { matrix, x + steps, y + steps };
}
};

Initialization is rather simple, we just “keep” the stuff we get, begin is the +simplest, we just delegate.

In case of the end, it gets more complicated. We need to know where is the “end” +of the diagonal. Since end should point to the first element “after” the iterable, +we know that it's the first position of the iterator where either y becomes +matrix.size() or x becomes matrix[y].size(). Also we are moving along diagonal, +duh, therefore we can deduce the first “position” afterwards by minimal amount of +steps to get out of the any column or row, hence std::min(max_x - x, max_y - y). +Final position is then computed simply by adding the steps to the beginning of +the diagonal.

Now we just need to finish the iterator for the diagonal itself and we're done.

Implementing diagonal_iter

This part is the hardest from all we need to do. It's because of the requirements +of the std::sort that requires us to implement a random access iterator. I have +briefly described it above, and “in a nutshell” it means that we need to implement +an iterator that can move in constant time along the diagonal in any amount of +steps.

Let's go through all of the functionality that our iterator needs to support to +be used in std::sort. We need the usual operations like:

  • equality/inequality
  • incrementation
  • dereferencing

We will also add all the types that our iterator uses with the category of the +iterator, i.e. what interface it supports:

class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }
};

This is pretty similar to the previous iterator, but now we need to implement the +remaining requirements of the random access iterator. Let's see what those are:

  • decrementation - cause we need to be able to move backwards too, since random access iterator extends the interface of bidirectional iterator
  • moving the iterator in either direction by steps given as an integer
  • being able to tell the distance between two iterators
  • define an ordering on the iterators

Let's fill them in:

class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }

// exactly opposite to the incrementation
diagonal_iter operator--()
{
x--;
y--;
return *this;
}

// moving ‹n› steps back is same as calling decrementation ‹n›-times, so we
// can just return a new iterator and subtract ‹n› from both coordinates in
// the matrix
diagonal_iter operator-(difference_type n) const
{
return diagonal_iter { m, x - n, y - n };
}

// here we assume that we are given two iterators on the same diagonal
difference_type operator-(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x - rhs.x;
}

// counterpart of moving ‹n› steps backwards
diagonal_iter operator+(difference_type n) const
{
return diagonal_iter { m, x + n, y + n };
}

// we compare the coordinates, and also assume that those 2 iterators are
// lying on the same diagonal
bool operator<(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x < rhs.x && y < rhs.y;
}
};

At this point we could probably try and compile it, right? If we do so, we will +get yelled at by a compiler for the following reasons:

/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __next;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here
std::__unguarded_linear_insert(__i,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]
std::__unguarded_linear_insert(__i,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal<int>::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]
__unguarded_linear_insert(_RandomAccessIterator __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __cut;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop<diagonal<int>::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__introsort_loop(__first, __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^

That's a lot of noise, isn't it? Let's focus on the important parts:

/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]

matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^

Ah! We have a reference in our iterator, and this prevents us from having a copy +assignment operator (that is used “somewhere” in the sorting algorithm). Well… +Let's just wrap it!

# we need to keep a different type than reference
- matrix_t& m;
+ std::reference_wrapper<matrix_t> m;

# in comparison we need to get the reference out of the wrapper first
- return x == rhs.x && y == rhs.y && m == rhs.m;
+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();

# same when we return a reference to the “cell” in the matrix
- reference operator*() const { return m[y][x]; }
+ reference operator*() const { return m.get()[y][x]; }

# and finally in the assertions that we set for the “distance” and “less than”
- assert(m == rhs.m);
+ assert(m.get() == rhs.m.get());

We're done now! We have written an iterator over diagonals for a 2D vector. You can have a look at the final result here.


  1. just because I'm used to it and don't care about your opinion ;)
  2. exercise at your own risk
  3. me in 5 minutes in fact, but don't make me scared
  4. me in the next section…
]]>
+ + Matej Focko + me+blog@mfocko.xyz + https://gitlab.com/mfocko + + + + +
+ + <![CDATA[2nd week of Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/2nd-week + + 2022-12-25T23:15:00.000Z + + Let's go through the second week of Advent of Code in Rust.

Day 8: Treetop Tree House

tl;dr

We get a forest and we want to know how many trees are visible from the outside. +Apart from that we want to find the best view.

Nothing interesting. We are moving around 2D map though. And indexing can get a +bit painful when doing so, let's refactor it a bit ;) During the preparation for +the AoC, I have written Vector2D and now it's time to extend it with indexing +of Vec of Vecs. In my solution I was manipulating with indices in the following +way:

  • swapping them
  • checking whether they are correct indices for the Vec<Vec<T>>
  • indexing Vec<Vec<T>> with them
caution

I'm getting familiar with Rust and starting to “abuse” it… While doing so, I'm +also uncovering some “features” that I don't really like. Therefore I will mark +all of my rants with thicc «↯» mark and will try to “lock” them into their +own “box of hell”.

Swapping indices

Relatively simple implementation, just take the values, swap them and return new +vector.

impl<T: Copy> Vector2D<T> {
pub fn swap(&self) -> Self {
Self {
x: self.y,
y: self.x,
}
}
}

Pretty straight-forward implementation, but let's talk about the T: Copy. We +need to use it, since we are returning a new vector, with swapped values. +If we had values that cannot be copied, the only thing we could do, would be a +vector of references (and it would also introduce a lifetime, to which we'll get +later on). This is pretty similar with the operations on sets from the first week.

Indexing Vec

I will start with the indexing, cause bound-checking is a bit more… complicated +than I would like to.

pub fn index<'a, T, U>(v: &'a [Vec<U>], idx: &Vector2D<T>) -> &'a U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}

Let's talk about this mess… Body of the function is probably the most easy part +and should not be hard to understand, we just take the x and y and convert +them both to usize type that can be used later on for indexing.

The type signature of the function is where the fun is at 😉 We are trying +to convert unknown type to usize, so we must bound the T as a type that can +be converted to usize, that's how we got usize: TryFrom<T> which basically +says that usize must implement TryFrom<T> trait and therefore allows us to +convert the indices to actual usize indices. Using .unwrap() also forces us +to bound the error that can occur when converting T into usize, that's how +we get <usize as TryFrom<T>>::Error: Debug which loosely means

error during conversion of T into usize must implement Debug, +i.e. can be printed in some way or other

T: Copy is required by .try_into() which takes T by-value.

And now we are left only with the first line of the definition.

note

Skilled Rustaceans might notice that this implementation is rather flaky and can +break in multiple places at once. I'll get back to it…

Let's split it in multiple parts:

  • v: &'a [Vec<U>] represents the 2D Vec, we are indexing, Vec implements +Slice trait and clippy recommends using &[T] to &Vec<T>, exact details +are unknown to me
  • idx: &Vector2D<T> represents the indices which we use, we take them by +reference to avoid an unnecessary copy
  • -> &'a U means that we are returning a reference to some value of type U. +Now the question is what does the 'a mean, we can also see it as a generic +type declared along T and U. And the answer is relatively simple, 'a +represents a lifetime. We take the v by a reference and return a reference, +borrow checker validates all of the borrows (or references), so we need to +specify that our returned value has the same lifetime as the vector we have +taken by a reference, i.e. returned reference must live at least as long as the +v. This way we can “be sure” that the returned reference is valid.
Issues

First issue that our implementation has is the fact that we cannot get a mutable +reference out of that function. This could be easily resolved by introducing new +function, e.g. index_mut. Which I have actually done while writing this part:

pub fn index_mut<'a, T, U>(v: &'a mut [Vec<U>], idx: &Vector2D<T>) -> &'a mut U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&mut v[y][x]
}
«↯» Why can't we use one function?

When we consider a Vec<T>, we don't need to consider containers as T, Rust +implements indexing as traits Index<T> and IndexMut<T> that do the dirty work +behind syntactic sugar of container[idx].

However, implementing of traits is not allowed for external types, i.e. types +that you haven't defined yourself. This means that you can implement indexing +over containers that you have implemented yourself, but you cannot use your own +types for indexing “built-in” types.

Another part of this rabbit hole is trait SliceIndex<T> that is of a relevance +because of

impl<T, I> Index<I> for [T]
where
I: SliceIndex<[T]>

impl<T, I, A> Index<I> for Vec<T, A>
where
I: SliceIndex<[T]>,
A: Allocator

impl<T, I, const N: usize> Index<I> for [T; N]
where
[T]: Index<I>

In other words, if your type implements SliceIndex<T> trait, it can be used +for indexing. As of now, this trait has all of its required methods experimental +and is marked as unsafe.

Another problem is a requirement for indexing either [Vec<T>] or Vec<Vec<T>>. +This requirement could be countered by removing inner type Vec<T> and constraining +it by a trait Index (or IndexMut respectively) in a following way

pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D<T>) -> &'a C::Output
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
C: Index<usize>
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}

Given this, we can also give a more meaningful typename for indexing type, such +as I.

Checking bounds

Now we can get to the boundary checks, it is very similar, but a more… dirty. +First approach that came up was to convert the indices in Vector2D to usize, +but when you add the indices up, e.g. when checking the neighbors, you can end +up with negative values which, unlike in C++, causes an error (instead of underflow +that you can use to your advantage; you can easily guess how).

So how can we approach this then? Well… we will convert the bounds instead of +the indices and that lead us to:

pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
usize: TryInto<T>,
<usize as TryInto<T>>::Error: Debug,
T: PartialOrd + Copy,
{
idx.y >= 0.try_into().unwrap()
&& idx.y < v.len().try_into().unwrap()
&& idx.x >= 0.try_into().unwrap()
&& idx.x
< v[TryInto::<usize>::try_into(idx.y).unwrap()]
.len()
.try_into()
.unwrap()
}

You can tell that it's definitely a shitty code. Let's improve it now! We will +get back to the original idea, but do it better. We know that we cannot convert +negative values into usize, but we also know that conversion like that +returns a Result<T, E> which we can use to our advantage.

pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
T: Copy,
usize: TryFrom<T>,
{
usize::try_from(idx.y)
.and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))
.unwrap_or(false)
}

Result<T, E> is a type similar to Either in Haskell and it allows us to chain +multiple operations on correct results or propagate the original error without +doing anything. Let's dissect it one-by-one.

try_from is a method implemented in TryFrom trait, that allows you to convert +types and either successfully convert them or fail (with a reasonable error). This +method returns Result<T, E>.

We call and_then on that result, let's have a look at the type signature of +and_then, IMO it explains more than enough:

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> Result<U, E>

OK… So it takes the result and a function and returns another result with +different value and different error. However we can see that the function, which +represents an operation on a result, takes just the value, i.e. it doesn't care +about any previous error. To make it short:

and_then allows us to run an operation, which can fail, on the correct result

We parsed a y index and now we try to convert the x index with try_from +again, but on that result we use map rather than and_then, why would that be?

pub fn map<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> U

Huh… map performs an operation that cannot fail. And finally we use +unwrap_or which takes the value from result, or in case of an error returns the +default that we define.

How does this work then? If y is negative, the conversion fails and the error +propagates all the way to unwrap_or, if y can be a correct usize value, then +we do the same with x. If x is negative, we propagate the error as with y, +and if it's not, then we check whether it exceeds the higher bounds or not.

Solution

Relatively simple, you just need follow the rules and not get too smart, otherwise +it will get back at you.

Day 9: Rope Bridge

tl;dr

We get a rope with knots and we want to track how many different positions are +visited with the rope's tail.

By this day, I have come to a conclusion that current skeleton for each day +generates a lot of boilerplate. And even though it can be easily copied, it's +just a waste of space and unnecessary code. Let's “simplify” this (on one end +while creating monster on the other end). I've gone through what we need in the +preparations for the AoC. Let's sum up our requirements:

  • parsing
  • part 1 & 2
  • running on sample / input
  • tests

Parsing and implementation of both parts is code that changes each day and we +cannot do anything about it. However running and testing can be simplified!

Let's introduce and export a new module solution that will take care of all of +this. We will start by introducing a trait for each day.

pub trait Solution<Input, Output: Display> {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input;

fn part_1(input: &Input) -> Output;
fn part_2(input: &Input) -> Output;
}

This does a lot of work for us already, we have defined a trait and for each day +we will create a structure representing a specific day. That structure will also +implement the Solution trait.

Now we need to get rid of the boilerplate, we can't get rid of the main function, +but we can at least move out the functionality.

fn run(type_of_input: &str) -> Result<()>
where
Self: Sized,
{
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = Self::parse_input(format!("{}s/{}.txt", type_of_input, Self::day()));

info!("Part 1: {}", Self::part_1(&input));
info!("Part 2: {}", Self::part_2(&input));

Ok(())
}

fn main() -> Result<()>
where
Self: Sized,
{
Self::run("input")
}

This is all part of the Solution trait, which can implement methods while being +dependent on what is provided by the implementing types. In this case, we just +need to bound the Output type to implement Display that is necessary for the +info! and format string there.

Now we can get to first of the nasty things we are going to do… And it is the +day() method that you can see being used when constructing path to the input +file. That method will generate a name of the file, e.g. day01 and we know that +we can somehow deduce it from the structure name, given we name it reasonably.

fn day() -> String {
let mut day = String::from(type_name::<Self>().split("::").next().unwrap());
day.make_ascii_lowercase();

day.to_string()
}
type_name

This feature is still experimental and considered to be internal, it is not +advised to use it any production code.

And now we can get to the nastiest stuff 😩 We will generate the tests!

We want to be able to generate tests for sample input in a following way:

test_sample!(day_01, Day01, 42, 69);

There's not much we can do, so we will write a macro to generate the tests for us.

#[macro_export]
macro_rules! test_sample {
($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {
#[cfg(test)]
mod $mod_name {
use super::*;

#[test]
fn test_part_1() {
let sample =
$day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));
assert_eq!($day_struct::part_1(&sample), $part_1);
}

#[test]
fn test_part_2() {
let sample =
$day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));
assert_eq!($day_struct::part_2(&sample), $part_2);
}
}
};
}

We have used it in a similar way as macros in C/C++, one of the things that we +can use to our advantage is defining “type” of the parameters for the macro. All +parameters have their name prefixed with $ sign and you can define various “forms” +of your macro. Let's go through it!

We have following parameters:

  • $mod_name which represents the name for the module with tests, it is typed +with ident which means that we want a valid identifier to be passed in.
  • $day_struct represents the structure that will be used for tests, it is typed +with tt which represents a token tree, in our case it is a type.
  • $part_X represents the expected output for the Xth part and is of type expr +which literally means an expression.

Apart from that we need to use #[macro_export] to mark the macro as exported +for usage outside of the module. Now our skeleton looks like:

use aoc_2022::*;

type Input = String;
type Output = String;

struct DayXX;
impl Solution<Input, Output> for DayXX {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
file_to_string(pathname)
}

fn part_1(input: &Input) -> Output {
todo!()
}

fn part_2(input: &Input) -> Output {
todo!()
}
}

fn main() -> Result<()> {
// DayXX::run("sample")
DayXX::main()
}

// test_sample!(day_XX, DayXX, , );

Solution

Not much to talk about, it is relatively easy to simulate.

Day 10: Cathode-Ray Tube

tl;dr

Emulating basic arithmetic operations on a CPU and drawing on CRT based on the +CPU's accumulator.

In this day I have discovered an issue with my design of the Solution trait. +And the issue is caused by different types of Output for the part 1 and part 2.

Problem is relatively simple and consists of simulating a CPU, I have approached +it in a following way:

fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {
instructions
.iter()
.fold(State::new(), |state, instruction| {
state.execute(instruction, &mut out)
});

out
}

We just take the instructions, we have some state of the CPU and we execute the +instructions one-by-one. Perfect usage of the fold (or reduce as you may know +it from other languages).

You can also see that we have an Output type, so the question is how can we fix +that problem. And the answer is very simple and functional. Rust allows you to +have an enumeration that can bear some other values apart from the type itself.

tip

We could've seen something like this with the Result<T, E> type that can be +defined as

enum Result<T, E> {
Ok(T),
Err(E)
}
What does that mean though?

When we have an Ok value, it has the result itself, and when we get an Err +value, it has the error. This also allows us to handle results in a rather +pretty way:

match do_something(x) {
Ok(y) => {
println!("SUCCESS: {}", y);
},
Err(y) => {
eprintln!("ERROR: {}", y);
}
}

My solution has a following outline:

fn execute(&self, i: &Instruction, output: &mut Output) -> State {
// execute the instruction

// collect results if necessary
match output {
Output::Part1(x) => self.execute_part_1(y, x),
Output::Part2(x) => self.execute_part_2(y, x),
}

// return the obtained state
new_state
}

You might think that it's a perfectly reasonable thing to do. Yes, but notice +that the match statement doesn't collect the changes in any way and also we +pass output by &mut, so it is shared across each iteration of the fold.

The dirty and ingenious thing is that xs are passed by &mut too and therefore +they are directly modified by the helper functions. To sum it up and let it sit

We are collecting the result into an enumeration that is shared +across all iterations of fold.

Solution

Similar to Day 9, but there are some technical details that can get you.

Day 11: Monkey in the Middle

tl;dr

Simulation of monkeys throwing stuff around and measuring your stress levels +while your stuff is being passed around.

I think I decided to use regular expressions here for the first time, cause +parsing the input was a pain.

Also I didn't expect to implement Euclidean algorithm in Rust…

Solution

Again, we're just running a simulation. Though I must admit it was very easy to +make a small technical mistakes that could affect the final results very late.

Day 12: Hill Climbing Algorithm

tl;dr

Finding shortest path up the hill and also shortest path down to the ground while +also rolling down the hill…

As I have said in the tl;dr, we are looking for the shortest path, but the start +and goal differ for the part 1 and 2. So I have decided to refactor my solution +to a BFS algorithm that takes necessary parameters via functions:

fn bfs<F, G>(
graph: &[Vec<char>], start: &Position, has_edge: F, is_target: G
) -> Option<usize>
where
F: Fn(&[Vec<char>], &Position, &Position) -> bool,
G: Fn(&[Vec<char>], &Position) -> bool

We pass the initial vertex from the caller and everything else is left to the BFS +algorithm, based on the has_edge and is_target functions.

This was easy! And that is not very usual in Rust once you want to pass around +functions. 👀

Solution

Looking for the shortest path… Must be Dijkstra, right? Nope! Half of the +Reddit got jebaited though. In all fairness, nothing stops you from implementing +the Dijkstra's algorithm for finding the shortest path, but if you know that +all connected vertices are in a unit (actually d=1d = 1) distance from each other, +then you know that running Dijkstra is equivalent to running BFS, only with worse +time complexity, because of the priority heap instead of the queue.

Day 13: Distress Signal

tl;dr

Processing packets with structured data from the distress signal.

You can implement a lot of traits if you want to. It is imperative to implement +ordering on the packets. I had a typo, so I also proceeded to implement a Display +trait for debugging purposes:

impl Display for Packet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Packet::Integer(x) => write!(f, "{x}"),
Packet::List(lst) => write!(f, "[{}]", lst.iter().map(|p| format!("{p}")).join(",")),
}
}
}

Solution

A lot of technical details… Parsing is nasty too…

Day 14: Regolith Reservoir

tl;dr

Let's simulate falling sand grain-by-grain.

Again, both parts are relatively similar with minimal changes, so it is a good +idea to refactor it a bit. Similar approach to the BFS above. Also this is the +first day where I ran into efficiency issues and had to redo my solution to speed +it up just a bit.

Solution

Tedious.

Post Mortem

Indexing

I was asked about the indexing after publishing the blog. And truly it is rather +complicated topic, especially after releasing SliceIndex<I> trait. I couldn't +leave it be, so I tried to implement the Index and IndexMut trait.

note

I have also mentioned that the SliceIndex trait is unsafe, but truth be told, +only unsafe part are the 2 methods that are named *unchecked*. Anyways, I will +be implementing the Index* traits for now, rather than the SliceIndex.

It's relatively straightforward…

impl<I, C> Index<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}

We can see a lot of similarities to the implementation of index and index_mut +functions. In the end, they are 1:1, just wrapped in the trait that provides a +syntax sugar for container[idx].

note

I have also switched from using the TryFrom to TryInto trait, since it better +matches what we are using, the .try_into rather than usize::try_from.

Also implementing TryFrom automatically provides you with a TryInto trait, +since it is relatively easy to implement. Just compare the following:

pub trait TryFrom<T>: Sized {
type Error;

fn try_from(value: T) -> Result<Self, Self::Error>;
}

pub trait TryInto<T>: Sized {
type Error;

fn try_into(self) -> Result<T, Self::Error>;
}

OK, so we have our trait implemented, we should be able to use container[index], +right? Yes… but actually no 😦

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:26:18
|
26 | if trees[pos] > tallest {
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:30:28
|
30 | max(tallest, trees[pos])
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<isize>`
--> src/bin/day08.rs:52:28
|
52 | let max_height = trees[position];
| ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<isize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<isize>>`

Why? We have it implemented for the slices ([C]), why doesn't it work? Well, +the fun part consists of the fact that in other place, where we were using it, +we were passing the &[Vec<T>], but this is coming from a helper functions that +take &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for +those. Just for the slices. 🤯 What are we going to do about it?

We can either start copy-pasting or be smarter about it… I choose to be smarter, +so let's implement a macro! The only difference across the implementations are +the types of the outer containers. Implementation doesn't differ at all!

Implementing the macro can be done in a following way:

macro_rules! generate_indices {
($container:ty) => {
impl<I, C> Index<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}
};
}

And now we can simply do

generate_indices!(VecDeque<C>);
generate_indices!([C]);
generate_indices!(Vec<C>);
// generate_indices!([C; N], const N: usize);

The last type (I took the inspiration from the implementations of the Index and +IndexMut traits) is a bit problematic, because of the const N: usize part, +which I haven't managed to be able to parse. And that's how I got rid of the error.

note

If I were to use 2D-indexing over [C; N] slices, I'd probably just go with the +copy-paste, cause the cost of this “monstrosity” outweighs the benefits of no DRY.

Cause of the problem

This issue is relatively funny. If you don't use any type aliases, just the raw +types, you'll get suggested certain changes by the clippy. For example if you +consider the following piece of code

fn get_sum(nums: &Vec<i32>) -> i32 {
nums.iter().sum()
}

fn main() {
let nums = vec![1, 2, 3];
println!("Sum: {}", get_sum(&nums));
}

and you run clippy on it, you will get

Checking playground v0.0.1 (/playground)
warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do
--> src/main.rs:1:18
|
1 | fn get_sum(nums: &Vec<i32>) -> i32 {
| ^^^^^^^^^ help: change this to: `&[i32]`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg
= note: `#[warn(clippy::ptr_arg)]` on by default

warning: `playground` (bin "playground") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.61s

However, if you introduce a type alias, such as

type Numbers = Vec<i32>;

Then clippy won't say anything, cause there is literally nothing to suggest. +However the outcome is not the same…

]]>
+ + Matej Focko + me+blog@mfocko.xyz + https://gitlab.com/mfocko + + + + +
+ + <![CDATA[1st week of Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/1st-week + + 2022-12-15T01:15:00.000Z + + Let's go through the first week of Advent of Code in Rust.

note

If you wish to have a look at the solutions, you can follow them on my GitLab. +More specifically in the /src/bin/.

I will try to summarize my experience with using Rust for the AoC. Trying it out +ages ago, I believe it will be pain and suffering, but we will see. For each +day I will also try to give a tl;dr of the problem, so that you can better imagine +the relation to my woes or 👍 moments.

Day 1: Calorie Counting

tl;dr

As the name suggests, we get the calories of the food contained in the elves +backpacks and we want to choose the elf that has the most food ;)

Wakey wakey!

Programming in Rust at 6am definitely hits. I've also forgotten to mention how I +handle samples. With each puzzle you usually get a sample input and expected +output. You can use them to verify that your solution works, or usually doesn't.

At first I've decided to put asserts into my main, something like

assert_eq!(part_1(&sample), 24000);
info!("Part 1: {}", part_1(&input));

assert_eq!(part_2(&sample), 45000);
info!("Part 2: {}", part_2(&input));

However, once you get further, the sample input may take some time to run itself. +So in the end, I have decided to turn them into unit tests:

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_part_1() {
let sample = parse_input("samples/day01.txt");
assert_eq!(part_1(&sample), 24000);
}

#[test]
fn test_part_2() {
let sample = parse_input("samples/day01.txt");
assert_eq!(part_2(&sample), 45000);
}
}

And later on I have noticed, it's hard to tell the difference between the days, +so I further renamed the mod from generic tests to reflect the days.

Also after finishing the first day puzzle, I have installed an sccache to +cache the builds, so that the build time is lower, cause it was kinda unbearable.

Solution

Well, it's a pretty simple problem. You just take the input, sum the calories and +find the biggest one. However, if we try to generalize to more than the biggest +one, the fun appears. We have few options:

  • keep all the calories, sort them, take what we need
  • keep all the calories and use max heap
  • use min heap and maintain at most N calories that we need

Day 2: Rock Paper Scissors

tl;dr

You want to know what score did you achieve while playing Rock Paper Scissors. +And then you want to be strategic about it.

Apart from the technical details of the puzzle, it went relatively smooth.

Solution

I took relatively naïve approach and then tried to simplify it.

Day 3: Rucksack Reorganization

tl;dr

Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you +want to find the common item among those compartments. Each of them has priority, +you care only about the sum.

This is the day where I started to fight the compiler and neither of us decided +to give up. Let's dive into it \o/

Fun fact

Fighting the compiler took me 30 minutes.

We need to find a common item among 2 collections, that's an easy task, right? +We can construct 2 sets and find an intersection:

let top: HashSet<i32> = [1, 2, 3].iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].iter().collect();

Now, the first issue that we encounter is caused by the fact that we are using +a slice (the […]), iterator of that returns references to the numbers. +And we get immediately yelled at by the compiler, because the numbers are discarded +after running the .collect. To fix this, we can use .into_iter:

let top: HashSet<i32> = [1, 2, 3].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].into_iter().collect();

This way the numbers will get copied instead of referenced. OK, let's find the +intersection of those 2 collections:

println!("Common elements: {:?}", top.intersection(&bottom));
Common elements: [3]
caution

Notice that we need to do &bottom. It explicitly specifies that .intersection +borrows the bottom, i.e. takes an immutable reference to it.

That's what we want, right? Looks like it! \o/

Next part wants us to find the common element among all of the backpacks. OK, so +that should be fairly easy, we have an intersection and we want to find intersection +over all of them.

Let's have a look at the type of the .intersection

pub fn intersection<'a>(
    &'a self,
    other: &'a HashSet<T, S>
) -> Intersection<'a, T, S>

OK… Huh… But we have an example there!

let intersection: HashSet<_> = a.intersection(&b).collect();

Cool, that's all we need.

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
println!("Intersection: {:?}", intersection);
Intersection: {3, 4}

Cool, so let's do the intersection with the top_2:

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
println!("Intersection: {:?}", intersection);

And we get yelled at by the compiler:

error[E0308]: mismatched types
--> src/main.rs:10:58
|
10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
| ------------ ^^^^^^ expected `&i32`, found `i32`
| |
| arguments to this function are incorrect
|
= note: expected reference `&HashSet<&i32>`
found reference `&HashSet<i32>`

/o\ What the hell is going on here? Well, the funny thing is, that this operation +doesn't return the elements themselves, but the references to them and when we pass +the third set, it has just the values themselves, without any references.

tip

It may seem as a very weird decision, but in fact it makes some sense… It allows +you to do intersection of items that may not be possible to copy. Overall this is +a “tax” for having a borrow checker drilling your ass having your back and +making sure you're not doing something naughty that may cause an undefined +behavior.

To resolve this we need to get an iterator that clones the elements:

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();
println!("Intersection: {:?}", intersection);
Intersection: {4}

Solution

The approach is pretty simple, if you omit the 1on1 with the compiler. You just +have some fun with the set operations :)

Day 4: Camp Cleanup

tl;dr

Elves are cleaning up the camp and they got overlapping sections to clean up. +Find how many overlap and can take the day off.

RangeInclusive is your friend not an enemy :)

Solution

Relatively easy, you just need to parse the input and know what you want. Rust's +RangeInclusive type helped a lot, cause it took care of all abstractions.

Day 5: Supply Stacks

tl;dr

Let's play with stacks of crates.

Very easy problem with very annoying input. You can judge yourself:

    [D]    
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

Good luck transforming that into something reasonable :)

Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

Solution

For the initial solution I went with a manual solution (as in I have done all +the work. Later on I have decided to explore the std and interface of the +std::vec::Vec and found split_off which takes an index and splits (duh) +the vector:

let mut vec = vec![1, 2, 3];
let vec2 = vec.split_off(1);
assert_eq!(vec, [1]);
assert_eq!(vec2, [2, 3]);

This helped me simplify my solution a lot and also get rid of some edge cases.

Day 6: Tuning Trouble

tl;dr

Finding start of the message in a very weird protocol. Start of the message is +denoted by NN unique consecutive characters.

Solution

A lot of different approaches, knowing that we are dealing with input consisting +solely of ASCII letters, I bit the bullet and went with sliding window and +constructing sets from that window, checking if the set is as big as the window.

One possible optimization could consist of keeping a bit-vector (i.e. usize +variable) of encountered characters and updating it as we go. However this has +a different issue and that is removal of the characters from the left side of the +window. We don't know if the same character is not included later on.

Other option is to do similar thing, but keeping the frequencies of the letters, +and again knowing we have only ASCII letters we can optimize by having a vector +of 26 elements that keeps count for each lowercase letter.

Day 7: No Space Left On Device

tl;dr

Let's simulate du to get some stats about our file system and then pinpoint +directories that take a lot of space and should be deleted.

I was waiting for this moment, and yet it got me! +imagine me swearing for hours

Solution

We need to “build” a file system from the input that is given in a following form:

$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k

There are few ways in which you can achieve this and also you can assume some +preconditions, but why would we do that, right? :)

You can “slap” this in either HashMap or BTreeMap and call it a day. +And that would be boring…

tip

BTreeMap is quite fitting for this, don't you think?

I always wanted to try allocation on heap in Rust, so I chose to implement a tree. +I fought with the Box<T> for some time and was losing…

Then I looked up some implementations of trees or linked lists and decided to try +Rc<Cell<T>>. And I got my ass whopped by the compiler once again. /o\

tip

Box<T> represents a dynamically allocated memory on heap. It is a single pointer, +you can imagine this as std::unique_ptr<T> in C++.

Rc<T> represents a dynamically allocated memory on heap. On top of that it is +reference counted (that's what the Rc stands for). You can imagine this as +std::shared_ptr<T> in C++.

Now the fun stuff. Neither of them lets you mutate the contents of the memory.

Cell<T> allows you to mutate the memory. Can be used reasonably with types that +can be copied, because the memory safety is guaranteed by copying the contents +when there is more than one mutable reference to the memory.

RefCell<T> is similar to the Cell<T>, but the borrowing rules (how many mutable +references are present) are checked dynamically.

So in the end, if you want something like std::shared_ptr<T> in Rust, you want +to have Rc<RefCell<T>>.

So, how are we going to represent the file system then? We will use an enumeration, +hehe, which is an algebraic data type that can store some stuff in itself 😩

type FileHandle = Rc<RefCell<AocFile>>;

#[derive(Debug)]
enum AocFile {
File(usize),
Directory(BTreeMap<String, FileHandle>),
}

Let's go over it! FileHandle represents dynamically allocated AocFile, not +much to discuss. What does the #[derive(Debug)] do though? It lets us to print +out the value of that enumeration, it's derived, so it's not as good as if we had +implemented it ourselves, but it's good enough for debugging, hence the name.

Now to the fun part! AocFile value can be represented in two ways:

  • File(usize), e.g. AocFile::File(123) and we can pattern match it, if we +need to
  • Directory(BTreeMap<String, FileHandle>) will represent the directory and will +contain map matching the name of the files (or directories) within to their +respective file handles

I will omit the details about constructing this file system, cause there are a lot +of technicalities introduced by the nature of the input. However if you are +interested, you can have a look at my solution.

We need to find small enough directories and also find the smallest directory that +will free enough space. Now the question is, how could we do that. And there are +multiple ways I will describe.

I have chosen to implement tree catamorphism 😩. It is basically a fold +over a tree data structure. We descent down into the leaves and propagate computed +results all the way to the root. You can also notice that this approach is very +similar to dynamic programming, we find overlapping sections of the computation +and try to minimize the additional work (in this case: we need to know sizes of +our descendants, but we have already been there).

Another approach that has been suggested to me few days later is running DFS on +the graph. And, funnily enough, we would still need to combine what we found in +the branches where we descent. So in the end, it would work very similarly to my +solution.

One of the more exotic options would be precomputing the required information at +the same time as parsing. That could be done by adding additional fields to the +nodes which would allow storing such information and updating it as we construct +the file system.

Post Mortem

Things that have been brought up in the discussion later on.

Rc<T> vs Rc<RefCell<T>>

It has been brought up that I have a contradicting statement regarding the +dynamically allocated memory. Specifically:

  • You can imagine Rc<T> as an std::shared_ptr<T> (in C++)
  • When you want an equivalent of std::shared_ptr<T>, you want to use +Rc<RefCell<T>>

Now, in Rust it is a bit more complicated, because the type that represents the +“shared pointer” is Rc<T>. What RefCell<T> does is making sure that there is +only one “owner” of a mutable reference at a time (and dynamically, as opposed +to the Cell<T>).

Therefore to be precise and correct about the equivalents of std::shared_ptr<T> +in Rust, we can say that

  • Rc<T> is an equivalent of a const std::shared_ptr<T>,
  • and Rc<RefCell<T>> is an equivalent of a std::shared_ptr<T>.

You can easily see that they only differ in the mutability. (And even that is not +as simple as it seems, because there is also Cell<T>)

]]>
+ + Matej Focko + me+blog@mfocko.xyz + https://gitlab.com/mfocko + + + + +
+ + <![CDATA[Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/intro + + 2022-12-14T21:45:00.000Z + + Let's talk about the preparations for this year's Advent of Code.

Choosing a language

When choosing a language for AoC, you usually want a language that gives you a +quick feedback which allows you to iterate quickly to the solution of the puzzle. +One of the most common choices is Python, many people also use JavaScript or Ruby.

Given the competitive nature of the AoC and popularity among competitive programming, +C++ might be also a very good choice. Only if you are familiar with it, I guess…

If you want a challenge, you might also choose to rotate the languages each day. +Though I prefer to use only one language.

For this year I have been deciding between Rust, C++ and Pascal or Ada.

I have tried Rust last year and have survived with it for 3 days and then gave +up and switched to Kotlin, which was pretty good given it is “Java undercover”. +I pretty much like the ideas behind Rust, I am not sure about the whole cult and +implementation of those ideas though. After some years with C/C++, I would say +that Rust feels too safe for my taste and tries to “punish me” even for the +most trivial things.

C++ is a very robust, but also comes with a wide variety of options providing you +the ability to shoot yourself in the leg. I have tried to solve few days of previous +Advent of Code events, it was relatively easy to solve the problems in C++, given +that I do not admit writing my own iterator for enumerate

Pascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a +pretty nice standard library that offers enough to be able to quickly solve some +problems in it. However the toolkit is questionable :/

Choosing libraries

Preparations for Rust

All of the sources, later on including solutions, can be found at my +GitLab.

Toolkit

Since we are using Rust, we are going to use a Cargo and more than likely VSCode +with rust-analyzer. Because of my choice of libraries, we will also introduce +a .envrc file that can be used by direnv, which allows you to set specific +environment variables when you enter a directory. In our case, we will use

# to show nice backtrace when using the color-eyre
export RUST_BACKTRACE=1

# to catch logs generated by tracing
export RUST_LOG=trace

And for the one of the most obnoxious things ever, we will use a script to download +the inputs instead of “clicking, opening and copying to a file1. There is +no need to be fancy, so we will adjust Python script by Martin2.

#!/usr/bin/env python3

import datetime
import yaml
import requests
import sys


def load_config():
with open("env.yaml", "r") as f:
js = yaml.load(f, Loader=yaml.Loader)
return js["session"], js["year"]


def get_input(session, year, day):
return requests.get(
f"https://adventofcode.com/{year}/day/{day}/input",
cookies={"session": session},
headers={
"User-Agent": "{repo} by {mail}".format(
repo="gitlab.com/mfocko/advent-of-code-2022",
mail="me@mfocko.xyz",
)
},
).content.decode("utf-8")


def main():
day = datetime.datetime.now().day
if len(sys.argv) == 2:
day = sys.argv[1]

session, year = load_config()
problem_input = get_input(session, year, day)

with open(f"./inputs/day{day:>02}.txt", "w") as f:
f.write(problem_input)


if __name__ == "__main__":
main()

If the script is called without any arguments, it will deduce the day from the +system, so we do not need to change the day every morning. It also requires a +configuration file:

# env.yaml
session: ‹your session cookie›
year: 2022

Libraries

Looking at the list of the libraries, I have chosen “a lot” of them. Let's walk +through each of them.

tracing and tracing-subscriber are the crates that can be used for tracing +and logging of your Rust programs, there are also other crates that can help you +with providing backtrace to the Sentry in case you have deployed your application +somewhere and you want to watch over it. In our use case we will just utilize the +macros for debugging in the terminal.

thiserror, anyhow and color-eyre are used for error reporting. +thiserror is a very good choice for libraries, cause it extends the Error +from the std and allows you to create more convenient error types. Next is +anyhow which kinda builds on top of the thiserror and provides you with simpler +error handling in binaries3. And finally we have color-eyre which, as I found +out later, is a colorful (wink wink) extension of eyre which is fork of anyhow +while supporting customized reports.

In the end I have decided to remove thiserror and anyhow, since first one is +suitable for libraries and the latter was basically fully replaced by {color-,}eyre.

regex and lazy_static are a very good and also, I hope, self-explanatory +combination. lazy_static allows you to have static variables that must be initialized +during runtime.

itertools provides some nice extensions to the iterators from the std.

My own “library”

When creating the crate for this year's Advent of Code, I have chosen a library +type. Even though standard library is huge, some things might not be included and +also we can follow KISS. I have 2 modules that my “library” exports, one for +parsing and one for 2D vector (that gets used quite often during Advent of Code).

Key part is, of course, processing the input and my library exports following +functions that get used a lot:

/// Reads file to the string.
pub fn file_to_string<P: AsRef<Path>>(pathname: P) -> String;

/// Reads file and returns it as a vector of characters.
pub fn file_to_chars<P: AsRef<Path>>(pathname: P) -> Vec<char>;

/// Reads file and returns a vector of parsed structures. Expects each structure
/// on its own line in the file. And `T` needs to implement `FromStr` trait.
pub fn file_to_structs<P: AsRef<Path>, T: FromStr>(pathname: P) -> Vec<T>
where
<T as FromStr>::Err: Debug;

/// Converts iterator over strings to a vector of parsed structures. `T` needs
/// to implement `FromStr` trait and its error must derive `Debug` trait.
pub fn strings_to_structs<T: FromStr, U>(
iter: impl Iterator<Item = U>
) -> Vec<T>
where
<T as std::str::FromStr>::Err: std::fmt::Debug,
U: Deref<Target = str>;

/// Reads file and returns it as a vector of its lines.
pub fn file_to_lines<P: AsRef<Path>>(pathname: P) -> Vec<String>;

As for the vector, I went with a rather simple implementation that allows only +addition of the vectors for now and accessing the elements via functions x() +and y(). Also the vector is generic, so we can use it with any numeric type we +need.

Skeleton

We can also prepare a template to quickly bootstrap each of the days. We know +that each puzzle has 2 parts, which means that we can start with 2 functions that +will solve them.

fn part1(input: &Input) -> Output {
todo!()
}

fn part2(input: &Input) -> Output {
todo!()
}

Both functions take reference to the input and return some output (in majority +of puzzles, it is the same type). todo!() can be used as a nice placeholder, +it also causes a panic when reached and we could also provide some string with +an explanation, e.g. todo!("part 1"). We have not given functions a specific +type and to avoid as much copy-paste as possible, we will introduce type aliases.

type Input = String;
type Output = i32;
tip

This allows us to quickly adjust the types only in one place without the need to +do regex-replace or replace them manually.

For each day we get a personalized input that is provided as a text file. Almost +all the time, we would like to get some structured type out of that input, and +therefore it makes sense to introduce a new function that will provide the parsing +of the input.

fn parse_input(path: &str) -> Input {
todo!()
}

This “parser” will take a path to the file, just in case we would like to run the +sample instead of input.

OK, so now we can write a main function that will take all of the pieces and +run them.

fn main() {
let input = parse_input("inputs/dayXX.txt");

println!("Part 1: {}", part_1(&input));
println!("Part 2: {}", part_2(&input));
}

This would definitely do :) But we have installed a few libraries and we want to +use them. In this part we are going to utilize tracing (for tracing, duh…) +and color-eyre (for better error reporting, e.g. from parsing).

fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = parse_input("inputs/dayXX.txt");

info!("Part 1: {}", part_1(&input));
info!("Part 2: {}", part_2(&input));

Ok(())
}

The first statement will set up tracing and configure it to print out the logs to +terminal, based on the environment variable. We also change the formatting a bit, +since we do not need all the fancy features of the logger. Pure initialization +would get us logs like this:

2022-12-11T19:53:19.975343Z  INFO day01: Part 1: 0

However after running that command, we will get the following:

 INFO src/bin/day01.rs:35: Part 1: 0

And the color_eyre::install()? is quite straightforward. We just initialize the +error reporting by color eyre.

caution

Notice that we had to add Ok(()) to the end of the function and adjust the +return type of the main to Result<()>. It is caused by the color eyre that +can be installed only once and therefore it can fail, that is how we got the ? +at the end of the ::install which unwraps the »result« of the installation.

Overall we will get to a template like this:

use aoc_2022::*;

use color_eyre::eyre::Result;
use tracing::info;
use tracing_subscriber::EnvFilter;

type Input = String;
type Output = i32;

fn parse_input(path: &str) -> Input {
todo!()
}

fn part1(input: &Input) -> Output {
todo!()
}

fn part2(input: &Input) -> Output {
todo!()
}

fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = parse_input("inputs/dayXX.txt");

info!("Part 1: {}", part_1(&input));
info!("Part 2: {}", part_2(&input));

Ok(())
}

  1. Copy-pasting might be a relaxing thing to do, but you can also discover +nasty stuff about your PC. See this Reddit post and the comment.
  2. GitHub profile
  3. Even though you can use it even for libraries, but handling errors from +libraries using anyhow is nasty… You will be the stinky one ;)
]]>
+ + Matej Focko + me+blog@mfocko.xyz + https://gitlab.com/mfocko + + + + +
+
\ No newline at end of file diff --git a/blog/feed.json b/blog/feed.json new file mode 100644 index 0000000..3dda5a8 --- /dev/null +++ b/blog/feed.json @@ -0,0 +1,129 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": "mf Blog", + "home_page_url": "https://blog.mfocko.xyz/blog", + "description": "mf's blog", + "items": [ + { + "id": "https://blog.mfocko.xyz/blog/2023/08/02/copr", + "content_html": "

When you decide to run Fedora on your VPS, you might get screwed over by using\nrandom repositories…

When I “reserved” my VPS1 back in June '20, I slapped Fedora on it without\nthinking. I bet 99% of people would say that I'm crazy for doing such thing2,\nBUT I've been using Fedora on my PCs for some time already and it felt very\nstable and natural to just use, even for VPS.

One of the first things I've done was setting up a mail server. You may guess\nwhat's the fun part about having a mail server… Yes, it's all the spam you\nreceive and only then you realize how much “crap” gets filtered on free mail\nservices. To battle this problem I chose to use\nrspamd that had CentOS support, but someone\nhad a Copr repository that I used to\ninstall it.

How does Copr repositories work?

If you have ever used Ubuntu, you might be familiar with the concept since it is\nvery close to PPAs.

tl;dr of the whole process consists of

  1. enabling the Copr repository, and
  2. installing the desired package.

So in shell you would do

# dnf copr enable ‹copr-repository›
# dnf install ‹package-from-the-repository›

And… that's it! Nothing else needed! Simple, right? And literally same process\nas you would do for the PPA.

AUR

On the other hand, if you are familiar with the archLinux, you definitely know\nAUR and what it can do for you. Copr repository is pretty similar, but the\npackages are prebuilt in Copr and Copr repositories can carry the required\ndependencies for said packages, which simplifies the distribution, and can even\nhelp with installing singular packages (when you just need the dependency, not\neverything).

My issue

Now you might wonder how would I use it on my VPS. It's rather simple, once in\n6 months a new Fedora release comes out. And you need to upgrade to newer\nrelease… You don't need to do it right away and for such setup it probably isn't\neven recommended.

tip

Fedora releases are supported for a year, i.e. they live 6 months till the next\nrelease and then another 6 months till another release.

Some people prefer to run one version “behind”. If you ever decide to run it on\nyour home server or in a similar setup, it might be a pretty good idea to\nfollow. I'm using the “latest greatest”, cause why not 😄

One way or another, you still need to bump the release every six months, unless\nyou'd bump 2 releases at once every year, which would be a decision, since, at\nleast I, cannot see any benefits in it… You don't go for “stability”, cause once\na year you switch to the latest release and then, before you bump, you use one\nyear old software, so you're not even using the latest.

Fast-forward 2 years in the future, new Fedora release came out (October '22)\nand I was doing an upgrade. Dependencies of the rspamd have been updated and\nrspamd builds in Copr have failed and no one fixed it. Cool, so now I can\nupgrade, but can either ignore the dependencies or uninstall the rspamd…

How can Copr help?

I have managed to find\nspecfile for the\nrspamd package that they use for CentOS. There were some files apart from the\nspecfile, so I had to make an SRPM locally and then… I just uploaded the SRPM\nto the Copr to\nbuild\nan RPM.

I have switched the previous Copr repository for rspamd with my own and happily\nproceeded with the upgrade.

Conclusion

Copr is heavily used for testing builds on the upstream with\nPackit. However, as you can see, it is possible to use it\nvery well for packaging your own stuff and avoiding issues (such as the one\nI have described above), if need be.


  1. vpsFree.cz
  2. Even though I've been running archLinux on some Raspberry Pi's and also\non one of my “home servers”, before getting the VPS. You could say I like\nto live on the edge…
", + "url": "https://blog.mfocko.xyz/blog/2023/08/02/copr", + "title": "How can Copr help with broken dependencies", + "summary": "Copr comes to save you when maintainer doesn't care.", + "date_modified": "2023-08-02T00:00:00.000Z", + "author": { + "name": "Matej Focko", + "url": "https://gitlab.com/mfocko" + }, + "tags": [ + "🏭", + "red-hat", + "copr", + "admin", + "vps" + ] + }, + { + "id": "https://blog.mfocko.xyz/blog/aoc-2022/4th-week", + "content_html": "

Let's go through the fourth week of Advent of Code in Rust.

Day 22: Monkey Map

tl;dr

Simulating a movement on a 2D map with given instructions. Map becomes a cube in\nthe 2nd part…

Rant

This was the most obnoxious problem of this year… and a lot of Rust issues have\nbeen hit.

Solution

It seems like a very simple problem to solve, but with very obnoxious changes in\nthe 2nd part and also it's relatively hard to decompose »properly«.

Column iterator

In the first part of the problem it was needed to know the boundaries of each\nrow and column, since I stored them in Vec<Vec<char>> and padded with spaces\nto ensure I have a rectangular 2D “array”. However when you wanted to go through\neach row and column to determine the boundaries, it was very easy to do for the\nrows (cause each row is a Vec element), but not for the columns, since they\nspan multiple rows.

For this use case I have implemented my own column iterator:

pub struct ColumnIterator<'a, T> {
map: &'a [Vec<T>],
column: usize,

i: usize,
}

impl<'a, T> ColumnIterator<'a, T> {
pub fn new(map: &'a [Vec<T>], column: usize) -> ColumnIterator<'a, T> {
Self { map, column, i: 0 }
}
}

impl<'a, T> Iterator for ColumnIterator<'a, T> {
type Item = &'a T;

fn next(&mut self) -> Option<Self::Item> {
if self.i >= self.map.len() {
return None;
}

self.i += 1;
Some(&self.map[self.i - 1][self.column])
}
}

Given this piece of an iterator, it is very easy to factor out the common\nfunctionality between the rows and columns into:

let mut find_boundaries = |constructor: fn(usize) -> Orientation,
iterator: &mut dyn Iterator<Item = &char>,
upper_bound,
i| {
let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');
let start = first_non_empty.next().unwrap().0 as isize;

let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');
let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;

boundaries.insert(constructor(i), start..end);
};

And then use it as such:

// construct all horizontal boundaries
(0..map.len()).for_each(|row| {
find_boundaries(
Orientation::horizontal,
&mut map[row].iter(),
map[row].len(),
row,
);
});

// construct all vertical boundaries
(0..map[0].len()).for_each(|col| {
find_boundaries(
Orientation::vertical,
&mut ColumnIterator::new(&map, col),
map.len(),
col,
);
});

Walking around the map

Once the 2nd part got introduced, you start to think about a way how not to\ncopy-paste a lot of stuff (I haven't avoided it anyways…). In this problem, I've\nchosen to introduce a trait (i.e. interface) for 2D and 3D walker.

trait Wrap: Clone {
type State;

// simulation
fn is_blocked(&self) -> bool;
fn step(&mut self, steps: isize);
fn turn_left(&mut self);
fn turn_right(&mut self);

// movement
fn next(&self) -> (Self::State, Direction);

// final answer
fn answer(&self) -> Output;
}

Each walker maintains its own state and also provides the functions that are\nused during the simulation. The “promised” methods are separated into:

  • simulation-related: that are used during the simulation from the .fold()
  • movement-related: just a one method that holds most of the logic differences\nbetween 2D and 3D
  • final answer: which extracts the proof of solution from the\nimplementation-specific walker

Both 2D and 3D versions borrow the original input and therefore you must\nannotate the lifetime of it:

struct Wrap2D<'a> {
input: &'a Input,
position: Position,
direction: Direction,
}
impl<'a> Wrap2D<'a> {
fn new(input: &'a Input) -> Wrap2D<'a> {
// …

Problems

I have used a lot of closures for this problem and once I introduced a parameter\nthat was of unknown type (apart from the fact it implements a specific trait), I\ngot suggested a “fix” for the compilation error that resulted in something that\nwas not possible to parse, cause it, more than likely, violated the grammar.

In a similar fashion, I have been suggested changes that led to a code that\ndidn't make sense by just looking at it (there was no need to try the changes),\nfor example one suggested change in the closure parameter caused disapperance of\nthe parameter name. 😄

Clippy

I have to admit that Clippy was rather helpful here, I'll include two examples\nof rather smart suggestions.

When writing the parsing for this problem, the first thing I have spotted on the\nchar was the .is_digit() function that takes a radix as a parameter. Clippy\nnoticed that I use radix = 10 and suggested switching to .is_ascii_digit()\nthat does exactly the same thing:

-                .take_while(|c| c.is_digit(10))
+ .take_while(|c| c.is_ascii_digit())

Another useful suggestion appeared when working with the iterators and I wanted\nto get the nnn-th element from it. You know the .skip(), you know the\n.next(), just “slap” them together and we're done for 😁 Well, I got\nsuggested to use .nth() that does exactly the combination of the two mentioned\nmethods on iterators:

-            match it.clone().skip(skip).next().unwrap() {
+ match it.clone().nth(skip).unwrap() {

Day 23: Unstable Diffusion

tl;dr

Simulating movement of elves around with a set of specific rules.

Solution

There's not much to mention since it's just a cellular automaton simulation\n(even though the AoC rules for cellular automatons usually get out of hand\n😉).

Although I had a need to determine boundaries of the elves' positions and ended\nup with a nasty DRY violation. Knowing that you you're looking for maximum and\nminimum that are, of course, exactly the same except for initial values and\ncomparators, it looks like a rather simple fix, but typing in Rust is something\nelse, right? In the end I settled for a function that computes both boundaries\nwithout any duplication while using a closure:

fn get_bounds(positions: &Input) -> (Vector2D<isize>, Vector2D<isize>) {
let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {
positions
.iter()
.fold(Vector2D::new(init, init), |acc, elf| {
Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))
})
};

(f(isize::MAX, &min::<isize>), f(isize::MIN, &max::<isize>))
}

This function returns a pair of 2D vectors that represent opposite points of the\nbounding rectangle of all elves.

You might ask why would we need a closure and the answer is that positions\ncannot be captured from within the nested function, only via closure. One more\nfun fact on top of that is the type of the comparator

&dyn Fn(isize, isize) -> isize

Once we remove the dyn keyword, compiler yells at us and also includes a way\nhow to get a more thorough explanation of the error by running

$ rustc --explain E0782

which shows us

Trait objects must include the `dyn` keyword.

Erroneous code example:

```
trait Foo {}
fn test(arg: Box<Foo>) {} // error!
```

Trait objects are a way to call methods on types that are not known until
runtime but conform to some trait.

Trait objects should be formed with `Box<dyn Foo>`, but in the code above
`dyn` is left off.

This makes it harder to see that `arg` is a trait object and not a
simply a heap allocated type called `Foo`.

To fix this issue, add `dyn` before the trait name.

```
trait Foo {}
fn test(arg: Box<dyn Foo>) {} // ok!
```

This used to be allowed before edition 2021, but is now an error.
Rant

Not all of the explanations are helpful though, in some cases they might be even\nmore confusing than helpful, since they address very simple use cases.

As you can see, even in this case there are two sides to the explanations:

  • it explains why you need to use dyn, but
  • it still mentions that trait objects need to be heap-allocated via Box<T>\nthat, as you can see in my snippet, does not apply here 😄 IMO it's\ncaused by the fact that we are borrowing it and therefore we don't need to\ncare about the size or whereabouts of it.
C++ parallel

If you dive into the explanation above, you can notice that the Box<dyn Trait>\npattern is very helpful for using types that are not known during compile-time.\nYou would use a very similar approach in C++ when parsing some data structure\nfrom input (let's say JSON for example).

On the other hand, in this case, it doesn't really make much sense, cause you\ncan clearly see that the types are known during the compile-time, which in\nC++ could be easily resolved by templating the helper function.

Day 24: Blizzard Basin

tl;dr

Navigating your way through a basin with series of blizzards that move around\nyou as you move.

caution

It's second to last day and I went “bonkers” on the Rust 😄 Proceed to\nread Solution part on your own risk.

Solution

You are given a map with blizzards all over the place and you're supposed to\nfind the minimum time it requires you to walk through the basin without getting\nin any of the blizzards.

Breakdown

Relatively simple, yet a bit annoying, approach can be taken. It's technically\na shortest-path algorithm implementation with some relaxation restrictions and\nbeing able to stay on one position for some time, so each vertex of the graph\nis determined by the position on the map and the timestamp. I have chosen to\nuse Vector3D<usize>, since x and y attributes can be used for the position\nand, well, let's use z for a timestamp, cause why not, right? 😉

Evaluating the blizzards

caution

I think that this is the most perverted abuse of the traits in the whole 4 weeks\nof AoC in Rust…

The blizzards move along their respective directions in time and loop around in\ntheir respective row/column. Each vertex holds position and time, so we can\njust index the basin with the vertex itself, right? Yes, we can 😈

Fun fact

While writing this part, I've recognized unnecessary verbosity in the code and\ncleaned it up a bit. The changed version is shown here and the original was just\nmore verbose.

I'll skip the boring parts of checking bounds and entry/exit of the basin 😉\nWe can easily calculate positions of the blizzards using a modular arithmetics:

impl Index<Position> for Basin {
type Output = char;

fn index(&self, index: Position) -> &Self::Output {
// ‹skipped boring parts›

// We need to account for the loops of the blizzards
let width = self.cols - 2;
let height = self.rows - 2;

let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;
[
(
index.y() as usize,
blizzard_origin(width, -1, index.z(), index.x()),
'>',
),
(
index.y() as usize,
blizzard_origin(width, 1, index.z(), index.x()),
'<',
),
(
blizzard_origin(height, -1, index.z(), index.y()),
index.x() as usize,
'v',
),
(
blizzard_origin(height, 1, index.z(), index.y()),
index.x() as usize,
'^',
),
]
.iter()
.find_map(|&(y, x, direction)| {
if self.map[y][x] == direction {
Some(&self.map[y][x])
} else {
None
}
})
.unwrap_or(&'.')
}
}

As you can see, there is an expression for calculating the original position and\nit's used multiple times, so why not take it out to a lambda, right? 😉

I couldn't get the rustfmt to format the for-loop nicely, so I've just\ndecided to go with iterating over an elements of a slice. I have used, once\nagain, a combination of two functions (find_map in this case) to do 2 things\nat once and at the end, if we haven't found any blizzard, we just return the\nempty space.

I think it's a very nice (and naughty) way how to use the Index trait, don't\nyou think?

Shortest-path algorithm

For the shortest path you can choose and adjust any of the common shortest-path\nalgorithms, in my case, I have decided to use A* instead of Dijkstra's\nalgorithm, since it better reflects the cost function.

Comparison of costs

With the Dijkstra's algorithm I would proceed with the time attribute used as\na priority for the queue.

Whereas with the A*, I have chosen to use both time and Manhattan distance\nthat promotes vertices closer to the exit and with a minimum time taken.

Cost function is, of course, a closure 😉

let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());

And also for checking the possible moves from the current vertex, I have\nimplemented, yet another, closure that yields an iterator with the next moves:

let next_positions = |p| {
[(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]
.iter()
.filter_map(move |&(x, y, t)| {
let next_p = p + Vector3D::new(x, y, t);

if basin[next_p] == '.' {
Some(next_p)
} else {
None
}
})
};

Min-heap

In this case I had a need to use the priority queue taking the elements with the\nlowest cost as the prioritized ones. Rust only offers you the BinaryHeap and\nthat is a max-heap. One of the ways how to achieve a min-heap is to put the\nelements in wrapped in a Reverse (as is even showed in the linked docs of\nthe BinaryHeap). However the wrapping affects the type of the heap and also\npopping the most prioritized elements yields values wrapped in the Reverse.

For this purpose I have just taken the max-heap and wrapped it as a whole in a\nseparate structure providing just the desired methods:

use std::cmp::{Ord, Reverse};
use std::collections::BinaryHeap;

pub struct MinHeap<T> {
heap: BinaryHeap<Reverse<T>>,
}

impl<T: Ord> MinHeap<T> {
pub fn new() -> MinHeap<T> {
MinHeap {
heap: BinaryHeap::new(),
}
}

pub fn push(&mut self, item: T) {
self.heap.push(Reverse(item))
}

pub fn pop(&mut self) -> Option<T> {
self.heap.pop().map(|Reverse(x)| x)
}
}

impl<T: Ord> Default for MinHeap<T> {
fn default() -> Self {
Self::new()
}
}

Rest is just the algorithm implementation which is not that interesting.

Day 25: Full of Hot Air

tl;dr

Playing around with a numbers in a special base.

Getting flashbacks to the IB111 Foundations of Programming… Very nice “problem”\nwith a rather easy solution, as the last day always seems to be.

Solution

Implementing 2 functions, converting from the SNAFU base and back to the SNAFU\nbase representation. Let's do a bit more though! I have implemented two functions:

  • from_snafu
  • to_snafu

Now it is apparent that all I do is number to string and string to number. Hmm…\nthat sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers\nand implement the traits that we need.

Let's start with a structure:

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct SNAFU {
value: i64,
}

Converting from &str

We will start by implementing the FromStr trait that will help us parse our input.\nThis is rather simple, I can just take the from_snafu function, copy-paste it\ninto the from_str method and the number I get will be wrapped in Result and\nSNAFU structure.

Converting to String

This is more fun. In some cases you need to implement only one trait and others\nare automatically implemented using that one trait. In our case, if you look in\nthe documentation, you can see that ToString trait is automatically implemented\nfor any type that implements Display trait.

Let's implement the Display trait then. We should be able to use the to_snafu\nfunction and just take the self.value from the SNAFU structure.

And for the convenience of tests, we can also implement a rather simple From<i64>\ntrait for the SNAFU.

Adjusting the code

After those changes we need to adjust the code and tests.

Parsing of the input is very easy, before we have used the lines, now we parse\neverything:

     fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
- file_to_lines(pathname)
+ file_to_structs(pathname)
}

Part 1 needs to be adjusted a bit too:

     fn part_1(input: &Input) -> Output {
- to_snafu(input.iter().map(|s| from_snafu(s)).sum())
+ SNAFU::from(input.iter().map(|s| s.value).sum::<i64>()).to_string()
}

You can also see that it simplifies the meaning a bit and it is more explicit than\nthe previous versions.

And for the tests:

     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}

Summary

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

\"Finished

Advent of Code

This year was quite fun, even though most of the solutions and posts came in\nlater on (cough in '23 cough). Day 22 was the most obnoxious one… And also\nit feels like I used priority queues and tree data structures a lot 👀

with Rust

I must admit that a lot of compiler warnings and errors were very useful. Even\nthough I still found some instances where they didn't help at all or cause even\nworse issues than I had. Compilation times have been addressed with the caching.

Building my first tree data structure in Rust has been a very “interesting”\njourney. Being able to write a more generic BFS algorithm that allows you to not\nduplicate code while still mantaining the desired functionality contributes to\na very readable code.

I am definitely much more aware of the basic things that bloated Python is\nmissing, yet Rust has them…

Using explicit types and writing down placeholder functions with todo!()\nmacros is very pleasant, since it allows you to easily navigate the type system\nduring the development when you don't even need to be sure how are you going to\nput the smaller pieces together.

I have used a plethora of traits and also implemented some of them to either be\nidiomatic, or exploit the syntactic sugar they offer. Deriving the default trait\nimplementation is also very helpful in a lot of cases, e.g. debugging output,\ncopying, equality comparison, etc.

I confess to touching more “cursed” parts of the Rust, such as macros to\ndeclutter the copy-paste for tests or writing my own structures that need to\ncarry a lifetime for their own fields.

tl;dr Relatively pleasant language until you hit brick wall 😉


See you next year! Maybe in Rust, maybe not 🙃

", + "url": "https://blog.mfocko.xyz/blog/aoc-2022/4th-week", + "title": "4th week of Advent of Code '22 in Rust", + "summary": "Surviving fourth week in Rust.", + "date_modified": "2023-07-07T15:14:00.000Z", + "author": { + "name": "Matej Focko", + "url": "https://gitlab.com/mfocko" + }, + "tags": [ + "advent-of-code", + "advent-of-code-2022", + "rust" + ] + }, + { + "id": "https://blog.mfocko.xyz/blog/aoc-2022/3rd-week", + "content_html": "

Let's go through the third week of Advent of Code in Rust.

Day 15: Beacon Exclusion Zone

tl;dr

Triangulating a distress beacon based on the information from the sensors.

Solution

Relatively easy thing to implement, no major Rust issues hit.

Day 16: Proboscidea Volcanium

tl;dr

Finding a max flow in a graph given some time constraints.

Solution

I have used some interesting things to implement this and make it easier for me.

Indexing in graph

I have come across a situation where I needed to keep more information regarding\nthe graph… In that case you can, of course, create a structure and keep it in,\nbut once you have multiple members in the structure it gets harder to work with\nsince you need to address the fields in the structure. When you work with graph,\nyou frequently need to access the vertices and in this case it felt a lot easier\nto implement the indexing in a graph, rather than explicitly access the\nunderlying data structure.

Here you can see a rather short snippet from the solution that allows you to\n“index” the graph:

impl Index<&str> for Graph {
type Output = Vertex;

fn index(&self, index: &str) -> &Self::Output {
&self.g[index]
}
}

Cartesian product

During the implementation I had to utilize Floyd-Warshall algorithm for finding\nthe shortest path between pairs of vertices and utilized the iproduct! macro\nfrom the itertools. It is a very useful higher-order function that allows\nyou to keep the nesting of the loops at a minimum level while still maintaining\nthe same functionality.

“Implementing” an iterator

For the second part, you get to split the work between 2 actors. That way you\ncan achieve higher efficiency of the whole process that you're planning, but it\nalso makes it harder to evaluate algorithmically, since you need to check the\ndifferent ways the work can be split.

Being affected by functional programming brain damage™️, I have chosen to\ndo this part by function that returns an iterator over the possible ways:

fn pairings(
valves: &BTreeSet<String>,
) -> impl Iterator<Item = (BTreeSet<String>, BTreeSet<String>)> + '_ {
let mapping = valves.iter().collect_vec();

let max_mask = 1 << (valves.len() - 1);

(0..max_mask).map(move |mask| {
let mut elephant = BTreeSet::new();
let mut human = BTreeSet::new();

for (i, &v) in mapping.iter().enumerate() {
if (mask & (1 << i)) == 0 {
human.insert(v.clone());
} else {
elephant.insert(v.clone());
}
}

(human, elephant)
})
}

Day 17: Pyroclastic Flow

tl;dr

Simulating an autonomous Tetris where pieces get affected by a series of jets of\nhot gas.

Solution

Similarly to the previous day I have created some iterators 😄

Collision detection

Once you need to check for collisions it is very helpful to be able to just\niterate through the positions that can actually collide with the wall or other\npiece.

To get the desired behaviour, you can just compose few smaller functions:

fn occupied(shape: &[Vec<char>]) -> impl Iterator<Item = Position> + '_ {
shape.iter().enumerate().flat_map(|(y, row)| {
row.iter().enumerate().filter_map(move |(x, c)| {
if c == &'#' {
Some(Vector2D::new(x as isize, y as isize))
} else {
None
}
})
})
}

In the end, we get relative positions which we can adjust later when given the\nspecific positions from iterator. You can see some interesting parts in this:

  • .enumerate() allows us to get both the indices (coordinates) and the line\nor, later on, the character itself,
  • .flat_map() flattens the iterator, i.e. when we return another iterator,\nthey just get chained instead of iterating over iterators (which sounds pretty\ndisturbing, doesn't it?),
  • and finally .filter_map() which is pretty similar to the “basic” .map()\nwith a one, key, difference that it expects the items of an iterator to be\nmapped to an Option<T> from which it ignores nothing (as in None 😉)\nand also unwraps the values from Some(…).

Infinite iterator

In the solution we cycle through both Tetris-like shapes that fall down and the\njets that move our pieces around. Initially I have implemented my own infinite\niterator that just yields the indices. It is a very simple, yet powerful, piece\nof code:

struct InfiniteIndex {
size: usize,
i: usize,
}

impl InfiniteIndex {
fn new(size: usize) -> InfiniteIndex {
InfiniteIndex { size, i: size - 1 }
}
}

impl Iterator for InfiniteIndex {
type Item = usize;

fn next(&mut self) -> Option<Self::Item> {
self.i = (self.i + 1) % self.size;
Some(self.i)
}
}

However when I'm looking at the code now, it doesn't really make much sense…\nGuess what, we can use a built-in function that is implemented on iterators for\nthat! The function is called .cycle()

On the other hand, I am not going to switch to that function, since it would\nintroduce an another myriad of issues caused by the fact that I create iterators\nright away in the constructor of my structure and the iterators would borrow\nboth the jets and shapes which would introduce a lifetime dependency into the\nstructure.

Day 18: Boiling Boulders

tl;dr

Let's compute a surface area of some obsidian approximated via coordinates of\ncubes.

Solution

This day is kinda interesting, because it shows how easily you can complicate the\nproblem and also how much can you screw yourself over with the optimization and\n“smart” approach.

For the first part you need to find the surface area of an obsidian that is\napproximated by cubes. Now, that is a very easy thing to do, just keep the track\nof already added cubes, and check if the newly added cube touches any face of any\nother cube. Simple, and with a BTreeSet relatively efficient way to do it.

However the second part lets you on a secret that there may be some surface area\nfrom the “inside” too and you want to know only the one from the outside of the\nobsidian. I have seen some solutions later, but if you check your data, you might\nnotice that the bounding box of all the cubes isn't that big at all. Therefore I\nchose to pre-construct the box beforehand, fill in the cubes and then just run a\nBFS turning all the lava on the outside into the air. Now you just need to check\ncubes and count how many of their faces touch the air.

Day 19: Not Enough Minerals

tl;dr

Finding out the best strategy for building robots to collect geodes.

Solution

Not much interesting stuff to mention apart from the suggestion to never believe\nthat the default implementation given by derive macro is what you want, it\ndoesn't have to be. 😄

Day 20: Grove Positioning System

tl;dr

Shuffling around the circular linked list to find the coordinates.

Now, small rant for this day is in place. They've never mentioned that coordinates\ncan repeat and therefore the values are non-unique. This is something that did\nnot happen in the given sample, but was present in the user input. It took »a lot«\nto realize that this is the issue.

Solution

I have tried implementing a circular linked list for this… and I have failed\nmiserably. To be fair, I still have no clue why. It was “fun” to play around with\nthe Rc<RefCell<T>>. In the end I failed on wrong answer. I have also encountered\na rather interesting issue with .borrow_mut() method being used on Rc<RefCell<T>>.

.borrow_mut()

Consider the following snippet of the code (taken from the documentation):

use std::cell::{RefCell, RefMut};
use std::collections::HashMap;
use std::rc::Rc;
// use std::borrow::BorrowMut;

fn main() {
let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
// Create a new block to limit the scope of the dynamic borrow
{
let mut map: RefMut<_> = shared_map.borrow_mut();
map.insert(\"africa\", 92388);
map.insert(\"kyoto\", 11837);
map.insert(\"piccadilly\", 11826);
map.insert(\"marbles\", 38);
}

// Note that if we had not let the previous borrow of the cache fall out
// of scope then the subsequent borrow would cause a dynamic thread panic.
// This is the major hazard of using `RefCell`.
let total: i32 = shared_map.borrow().values().sum();
println!(\"{total}\");
}

We allocate a hash map on the heap and then in the inner block, we borrow it as\na mutable reference, so that we can use it.

note

It is a very primitive example for Rc<RefCell<T>> and mutable borrow.

If you uncomment the 4th line with use std::borrow::BorrowMut;, you cannot\ncompile the code anymore, because of

   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
--> src/main.rs:10:34
|
10 | let mut map: RefMut<_> = shared_map.borrow_mut();
| --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference
| |
| expected due to this
|
= note: expected struct `RefMut<'_, _>`
found mutable reference `&mut Rc<RefCell<HashMap<_, _>>>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:11:13
|
11 | map.insert(\"africa\", 92388);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:12:13
|
12 | map.insert(\"kyoto\", 11837);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:13:13
|
13 | map.insert(\"piccadilly\", 11826);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:14:13
|
14 | map.insert(\"marbles\", 38);
| ^^^^^^ method not found in `RefMut<'_, _>`

Some errors have detailed explanations: E0308, E0599.
For more information about an error, try `rustc --explain E0308`.
error: could not compile `playground` due to 5 previous errors

It might seem a bit ridiculous. However, I got to a point where the compiler\nsuggested use std::borrow::BorrowMut; and it resulted in breaking parts of the\ncode that worked previously. I think it may be a good idea to go over what is\nhappening here.

.borrow_mut() on Rc<RefCell<T>>

Let's consider a variable x of type Rc<RefCell<T>>. What happens when you\ncall .borrow_mut() on it? We can look at the Rc type, and… hang on! There is\nneither .borrow_mut() method or BorrowMut trait implemented. How can we do it\nthen?

Let's go further and we can see that RefCell<T> implements a .borrow_mut()\nmethod. OK, but how can we call it on the Rc<T>? Easily! Rc<T> implements\nDeref<T> and therefore you can call methods on Rc<T> objects as if they were\nT objects. If we read on Deref coercion, we can see the following:

If T implements Deref<Target = U>, …:

  • T implicitly implements all the (immutable) methods of the type U.

What is the requirement for the .borrow_mut() on RefCell<T>? Well, it needs\n&self, so the Deref implements the .borrow_mut() for the Rc<RefCell<T>>.

BorrowMut trait

I have not been able to find a lot on this trait. My guess is that it provides a\nmethod instead of a syntactic sugar (&mut x) for the mutable borrow. And also\nit provides default implementations for the types:

impl BorrowMut<str> for String

impl<T> BorrowMut<T> for &mut T
where
T: ?Sized,

impl<T> BorrowMut<T> for T
where
T: ?Sized,

impl<T, A> BorrowMut<[T]> for Vec<T, A>
where
A: Allocator,

impl<T, A> BorrowMut<T> for Box<T, A>
where
A: Allocator,
T: ?Sized,

impl<T, const N: usize> BorrowMut<[T]> for [T; N]
Conflict

Now the question is why did it break the code… My first take was that the type\nRc<RefCell<T>> has some specialized implementation of the .borrow_mut() and\nthe use overrides it with the default, which is true in a sense. However\nthere is no specialized implementation. Let's have a look at the trait and the\ntype signature on the RefCell<T>:

// trait
pub trait BorrowMut<Borrowed>: Borrow<Borrowed>
where
Borrowed: ?Sized,
{
fn borrow_mut(&mut self) -> &mut Borrowed;
}

// ‹RefCell<T>.borrow_mut()› type signature
pub fn borrow_mut(&self) -> RefMut<'_, T>

I think that we can definitely agree on the fact that RefMut<'_, T> is not the\nRefCell<T>.

In my opinion, RefCell<T> implements a separate .borrow_mut() rather\nthan implementing the interface, because it cannot satisfy the type requirements\nof the trait.

caution

I wonder how are we expected to deal with this conflict, if and when, we need\nboth the .borrow_mut() of the trait and .borrow_mut() of the RefCell<T>.

Fun fact

I was suggested by the compiler to do use std::borrow::BorrowMut; and break the\ncode.

So much for the almighty and helpful compiler…

Day 21: Monkey Math

tl;dr

Computing an expression tree and then also finding ideal value for a node.

Solution

Relatively simple, until you get to the 2nd part where you start to practice\na lot of the copy-paste. I have managed to sneak some perverted stuff in there\nthough :) Let's go through the details.

Default trait

For the first time and twice I had a need to have a default value for my types,\nenumerations in this case. Rust offers a very nice trait1 that is described\nas:

A trait for giving a type a useful default value.

I guess it sums it up nicely. The more interesting part about this is the fact\nthat you can use the macro machinery to save yourself some typing. If you have\nenumeration of which the default value doesn't bear any parameter, you can just\ndo2:

#[derive(Default)]
enum Color {
#[default]
White,
Gray,
Black,
}

Abusing negation

If you want to use a unary minus operator on your own type, you can implement\na Neg trait3. I was dealing with a binary tree and needed a way how to look\nat the other side, so I have just implemented the negation for flipping between\nleft and right 😄


  1. Default docs
  2. Pardon my example from the graph algorithms ;)
  3. Neg docs
", + "url": "https://blog.mfocko.xyz/blog/aoc-2022/3rd-week", + "title": "3rd week of Advent of Code '22 in Rust", + "summary": "Surviving third week in Rust.", + "date_modified": "2023-07-06T21:00:00.000Z", + "author": { + "name": "Matej Focko", + "url": "https://gitlab.com/mfocko" + }, + "tags": [ + "advent-of-code", + "advent-of-code-2022", + "rust" + ] + }, + { + "id": "https://blog.mfocko.xyz/blog/leetcode/sort-diagonally", + "content_html": "

Let's try to solve one of the LeetCode challenges in easy and hard mode at the\nsame time.

Problem description

A matrix diagonal is a diagonal line of cells starting from some cell in\neither the topmost row or leftmost column and going in the bottom-right direction\nuntil reaching the matrix's end. For example, the matrix diagonal starting\nfrom mat[2][0], where mat is a 6 x 3 matrix, includes cells mat[2][0],\nmat[3][1], and mat[4][2].

Given an m x n matrix mat of integers, sort each matrix diagonal in ascending\norder and return the resulting matrix.

Example

\"Image

Skeleton and initial adjustments

We are given the following skeleton for the C++ and the given challenge:

class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};

The task is to sort the passed matrix diagonally and then return it. First of all,\nI don't like to solve this in a web browser, so we'll need to adjust it accordingly\nfor running it locally. We'll start by including the vector header and using\nfully-qualified namespaces1 and also adding few tests:

#include <cassert>
#include <vector>

using matrix = std::vector<std::vector<int>>;

class Solution {
public:
matrix diagonalSort(matrix& mat)
{
}
};

static void test_case_1()
{
// Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
// Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },
std::vector { 2, 2, 1, 2 },
std::vector { 1, 1, 1, 2 } })
== std::vector { std::vector { 1, 1, 1, 1 },
std::vector { 1, 2, 2, 2 },
std::vector { 1, 2, 3, 3 } }));
}

static void test_case_2()
{
// Input: mat =
// [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
// Output:
// [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },
std::vector { 23, 55, 17, 45, 15, 52 },
std::vector { 75, 31, 36, 44, 58, 8 },
std::vector { 22, 27, 33, 25, 68, 4 },
std::vector { 84, 28, 14, 11, 5, 50 } })
== std::vector { std::vector { 5, 17, 4, 1, 52, 7 },
std::vector { 11, 11, 25, 45, 8, 69 },
std::vector { 14, 23, 25, 44, 58, 15 },
std::vector { 22, 27, 31, 36, 50, 66 },
std::vector { 84, 28, 75, 33, 55, 68 } }));
}

int main()
{
test_case_1();
test_case_2();

return 0;
}

We need to return the matrix, but we're given a reference to the input matrix. We\ncan easily abuse the C++ here and just switch the reference to value, this way\nthe matrix will be copied when passed to the function, we can sort the copy and\njust return it back. And we also get yelled by the compiler for the fact that the\nmethod doesn't return anything yet, so to make it “shut up” we will just return\nthe input for now:

-    matrix diagonalSort(matrix& mat)
+ matrix diagonalSort(matrix mat)
{
+ return mat;
}

Now, we get the copy and we're good to go.

Naïve solution

As you may know, C++ offers a plethora of functions that can be used to your\nadvantage, given that you know how to “bend” the data structures accordingly.

What does that mean for us? Well, we have an std::sort, we can use it, right?\nLet's have a look at it:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );

This overload is more than we need. What does it do? It just sorts the elements\nin the range [first, last) using operator< on them. We can't sort the whole\nmatrix using this, but… we can sort just »one« diagonal without doing much work\non our end.

What is the RandomIt type though? If we look more into the documentation, we\ncan easily find the requirements for it and also learn that it's a random access\niterator and allows swapping its values at the same time.

Random access iterator

What is the random access iterator though? We can find it in a documentation\nand see the following description:

A LegacyRandomAccessIterator is a LegacyBidirectionalIterator\nthat can be moved to point to any element in constant time.

After that we can see all the requirements for it being listed. I don't feel like\nreading them right now, so we will just use it and see where the compilation blows\nup, i.e. “compiler-assisted development2 if you will ;)

Now we know that we can use std::sort to sort the diagonal itself, but we also\nneed to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to\nsomeone else3. And that way we get

matrix diagonalSort(matrix mat)
{
// we iterate over the diagonals
for (auto d : diagonals(mat)) {
// and we sort each diagonal
std::sort(d.begin(), d.end());
}

// we take the matrix by copy, so we can sort in-situ and return the copy
// that we sorted
return mat;
}

This solution looks very simple, doesn't it? Well, cause it is.\nLet's try compiling it:

matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]
for (auto d : diagonals(mat)) {
^
Found compiler error(s).
make: *** [makefile:14: tidy] Error 1

OK, seems about right. We haven't implemented the diagonals yet. And based on\nwhat we've written so far, we need a function or a class diagonals that will\ngive us the diagonals we need.

Implementing the diagonals

Cool, so we need the function that will let us go through each and every diagonal\nin our matrix. We use the for-range loop, so whatever we get back from the\ndiagonals must support .begin() and .end(). Since I am a masochist, we will\ndo such functionality for a matrix of any type, not just the int from the challenge.

As I said, we need to be able to

  • construct the object
  • get the beginning
  • get the end (the “sentinel”)
template <typename T>
class diagonals {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& _matrix;

public:
diagonals(matrix_t& m)
: _matrix(m)
{
}
diagonals_iter begin()
{
/* TODO */
}
diagonals_iter end()
{
/* TODO */
}
};

Now we have a diagonals that we can use to go through the diagonals. We haven't\nimplemented the core of it yet. Let's go through what we have for now.

We have a templated class with templated T that is used as a placeholder for any\ntype we would store in the matrix. Because I'm lazy, I have defined the matrix_t\ntype that is a “shortcut” for std::vector<std::vector<T>>, so I don't have to\ntype it out all the time. Of course, we need to store the matrix, we are given,\nas a private attribute. And then just have the constructor and the 2 methods we\nneed for the for-range.

Iterating over diagonals

Now that we have an object that will allow us to iterate through the diagonals,\nwe need to implement the iterating itself. We need to go through all of them, so\nwe have multiple options how to do so. I have decided to start from the “main”\ndiagonal that starts at (0, 0) index and then proceed with the diagonals starting\nin the first row, followed by the rest of the diagonals in the first column.

We need to be able to tell that we've iterated through all of them, and also we\nneed to know which diagonal is next. For that purpose we will pass the indices\nof the first cell on the diagonal. That way we can always tell how to move forward.

We will start by updating the begin and end to reflect our choice accordingly.

diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }
diagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }

For the begin we return the first diagonal that starts at (0, 0). And because\nwe have decided to do the diagonals in the first column at the end, the first\ndiagonal that is not a valid one is the one at (0, height). Apart from the\nindices, we also need to pass reference to the matrix itself.

note

You may have noticed that we also include the diagonals that have length 1,\nspecifically the ones at (0, height - 1) and (width - 1, 0). We are implementing\nan iterator that should not care about the way it's being used. Therefore, we\ndon't care about the fact they don't need to be sorted.

Cool, let's leave the iterator itself to someone else, right?4

Implementing the iterator over diagonals

We can start with a simple skeleton based on the information that we pass from\nthe diagonals. Also to utilize the matrix_t and also contain implementation\ndetails hidden away, we will put this code into the diagonals class.

class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}
};

In this case we will be implementing a “simple” forward iterator, so we don't\nneed to implement a lot. Notably it will be:

  • inequality operator (we need to know when we reach the end and have nothing to\niterate over)
  • preincrementation operator (we need to be able to move around the iterable)
  • dereference operator (we need to be able to retrieve the objects we iterate\nover)
class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator!=(const diagonals_iter& rhs) const
{
// iterators are not equal if they reference different matrices, or
// their positions differ
return m != rhs.m || x != rhs.x || y != rhs.y;
}

diagonals_iter& operator++()
{
if (y != 0) {
// iterating through diagonals down the first column
y++;
return *this;
}

// iterating the diagonals along the first row
x++;
if (x == m.front().size()) {
// switching to diagonals in the first column
x = 0;
y++;
}

return *this;
}

diagonal<T> operator*() const { return diagonal { m, x, y }; }
};

Let's go one-by-one. Inequality operator is rather simple, just compare iterator's\nattributes field-by-field. If you think about it, checking inequality of two 2D\nvectors may be a bit inefficient, therefore, we can swap around and check it as\na last thing.

-        return m != rhs.m || x != rhs.x || y != rhs.y;
+ return x != rhs.x || y != rhs.y || m != rhs.m;

Preincrementation is where the magic happens. If you have a better look, you can\nsee two branches of this operation:

  1. When y != 0 (we're iterating over the diagonals in the first column)\nIn this case, we just bump the row and we're done.
  2. When y == 0 (we're iterating over the diagonals in the first row)\nIn this case, we bump the column and check if we haven't gotten out of bounds,\ni.e. the end of the first row. If we get out of the bounds, we're continuing\nwith the second diagonal in the first column.

Dereferencing the iterator must “yield” something. In our case it will be the\ndiagonal that we want to sort. For sorting we need just the iterators that can\nmove around said diagonal. The simplest thing, we can do, is to delegate it to\nsomething else. In our case it will be a class called diagonal.

Implementing the diagonal itself

After implementing the iterator over diagonals, we know that all we need to describe\na diagonal is the matrix itself and the “start” of the diagonal (row and column).\nAnd we also know that the diagonal must provide some iterators for the std::sort\nfunction. We can start with the following skeleton:

template <typename T>
class diagonal {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& matrix;
std::size_t x;
std::size_t y;

public:
diagonal(matrix_t& matrix, std::size_t x, std::size_t y)
: matrix(matrix)
, x(x)
, y(y)
{
}

diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }

diagonal_iter end() const
{
auto max_x = matrix[y].size();
auto max_y = matrix.size();

// we need to find the distance in which we get out of bounds (either in
// column or row)
auto steps = std::min(max_x - x, max_y - y);

return diagonal_iter { matrix, x + steps, y + steps };
}
};

Initialization is rather simple, we just “keep” the stuff we get, begin is the\nsimplest, we just delegate.

In case of the end, it gets more complicated. We need to know where is the “end”\nof the diagonal. Since end should point to the first element “after” the iterable,\nwe know that it's the first position of the iterator where either y becomes\nmatrix.size() or x becomes matrix[y].size(). Also we are moving along diagonal,\nduh, therefore we can deduce the first “position” afterwards by minimal amount of\nsteps to get out of the any column or row, hence std::min(max_x - x, max_y - y).\nFinal position is then computed simply by adding the steps to the beginning of\nthe diagonal.

Now we just need to finish the iterator for the diagonal itself and we're done.

Implementing diagonal_iter

This part is the hardest from all we need to do. It's because of the requirements\nof the std::sort that requires us to implement a random access iterator. I have\nbriefly described it above, and “in a nutshell” it means that we need to implement\nan iterator that can move in constant time along the diagonal in any amount of\nsteps.

Let's go through all of the functionality that our iterator needs to support to\nbe used in std::sort. We need the usual operations like:

  • equality/inequality
  • incrementation
  • dereferencing

We will also add all the types that our iterator uses with the category of the\niterator, i.e. what interface it supports:

class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }
};

This is pretty similar to the previous iterator, but now we need to implement the\nremaining requirements of the random access iterator. Let's see what those are:

  • decrementation - cause we need to be able to move backwards too, since random access iterator extends the interface of bidirectional iterator
  • moving the iterator in either direction by steps given as an integer
  • being able to tell the distance between two iterators
  • define an ordering on the iterators

Let's fill them in:

class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }

// exactly opposite to the incrementation
diagonal_iter operator--()
{
x--;
y--;
return *this;
}

// moving ‹n› steps back is same as calling decrementation ‹n›-times, so we
// can just return a new iterator and subtract ‹n› from both coordinates in
// the matrix
diagonal_iter operator-(difference_type n) const
{
return diagonal_iter { m, x - n, y - n };
}

// here we assume that we are given two iterators on the same diagonal
difference_type operator-(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x - rhs.x;
}

// counterpart of moving ‹n› steps backwards
diagonal_iter operator+(difference_type n) const
{
return diagonal_iter { m, x + n, y + n };
}

// we compare the coordinates, and also assume that those 2 iterators are
// lying on the same diagonal
bool operator<(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x < rhs.x && y < rhs.y;
}
};

At this point we could probably try and compile it, right? If we do so, we will\nget yelled at by a compiler for the following reasons:

/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __next;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here
std::__unguarded_linear_insert(__i,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]
std::__unguarded_linear_insert(__i,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal<int>::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]
__unguarded_linear_insert(_RandomAccessIterator __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __cut;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop<diagonal<int>::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__introsort_loop(__first, __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^

That's a lot of noise, isn't it? Let's focus on the important parts:

/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]

matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^

Ah! We have a reference in our iterator, and this prevents us from having a copy\nassignment operator (that is used “somewhere” in the sorting algorithm). Well…\nLet's just wrap it!

# we need to keep a different type than reference
- matrix_t& m;
+ std::reference_wrapper<matrix_t> m;

# in comparison we need to get the reference out of the wrapper first
- return x == rhs.x && y == rhs.y && m == rhs.m;
+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();

# same when we return a reference to the “cell” in the matrix
- reference operator*() const { return m[y][x]; }
+ reference operator*() const { return m.get()[y][x]; }

# and finally in the assertions that we set for the “distance” and “less than”
- assert(m == rhs.m);
+ assert(m.get() == rhs.m.get());

We're done now! We have written an iterator over diagonals for a 2D vector. You can have a look at the final result here.


  1. just because I'm used to it and don't care about your opinion ;)
  2. exercise at your own risk
  3. me in 5 minutes in fact, but don't make me scared
  4. me in the next section…
", + "url": "https://blog.mfocko.xyz/blog/leetcode/sort-diagonally", + "title": "Sort the matrix diagonally", + "summary": "Compiler assisted development.", + "date_modified": "2023-03-04T23:15:00.000Z", + "author": { + "name": "Matej Focko", + "url": "https://gitlab.com/mfocko" + }, + "tags": [ + "cpp", + "leetcode", + "iterators" + ] + }, + { + "id": "https://blog.mfocko.xyz/blog/aoc-2022/2nd-week", + "content_html": "

Let's go through the second week of Advent of Code in Rust.

Day 8: Treetop Tree House

tl;dr

We get a forest and we want to know how many trees are visible from the outside.\nApart from that we want to find the best view.

Nothing interesting. We are moving around 2D map though. And indexing can get a\nbit painful when doing so, let's refactor it a bit ;) During the preparation for\nthe AoC, I have written Vector2D and now it's time to extend it with indexing\nof Vec of Vecs. In my solution I was manipulating with indices in the following\nway:

  • swapping them
  • checking whether they are correct indices for the Vec<Vec<T>>
  • indexing Vec<Vec<T>> with them
caution

I'm getting familiar with Rust and starting to “abuse” it… While doing so, I'm\nalso uncovering some “features” that I don't really like. Therefore I will mark\nall of my rants with thicc «↯» mark and will try to “lock” them into their\nown “box of hell”.

Swapping indices

Relatively simple implementation, just take the values, swap them and return new\nvector.

impl<T: Copy> Vector2D<T> {
pub fn swap(&self) -> Self {
Self {
x: self.y,
y: self.x,
}
}
}

Pretty straight-forward implementation, but let's talk about the T: Copy. We\nneed to use it, since we are returning a new vector, with swapped values.\nIf we had values that cannot be copied, the only thing we could do, would be a\nvector of references (and it would also introduce a lifetime, to which we'll get\nlater on). This is pretty similar with the operations on sets from the first week.

Indexing Vec

I will start with the indexing, cause bound-checking is a bit more… complicated\nthan I would like to.

pub fn index<'a, T, U>(v: &'a [Vec<U>], idx: &Vector2D<T>) -> &'a U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}

Let's talk about this mess… Body of the function is probably the most easy part\nand should not be hard to understand, we just take the x and y and convert\nthem both to usize type that can be used later on for indexing.

The type signature of the function is where the fun is at 😉 We are trying\nto convert unknown type to usize, so we must bound the T as a type that can\nbe converted to usize, that's how we got usize: TryFrom<T> which basically\nsays that usize must implement TryFrom<T> trait and therefore allows us to\nconvert the indices to actual usize indices. Using .unwrap() also forces us\nto bound the error that can occur when converting T into usize, that's how\nwe get <usize as TryFrom<T>>::Error: Debug which loosely means

error during conversion of T into usize must implement Debug,\ni.e. can be printed in some way or other

T: Copy is required by .try_into() which takes T by-value.

And now we are left only with the first line of the definition.

note

Skilled Rustaceans might notice that this implementation is rather flaky and can\nbreak in multiple places at once. I'll get back to it…

Let's split it in multiple parts:

  • v: &'a [Vec<U>] represents the 2D Vec, we are indexing, Vec implements\nSlice trait and clippy recommends using &[T] to &Vec<T>, exact details\nare unknown to me
  • idx: &Vector2D<T> represents the indices which we use, we take them by\nreference to avoid an unnecessary copy
  • -> &'a U means that we are returning a reference to some value of type U.\nNow the question is what does the 'a mean, we can also see it as a generic\ntype declared along T and U. And the answer is relatively simple, 'a\nrepresents a lifetime. We take the v by a reference and return a reference,\nborrow checker validates all of the borrows (or references), so we need to\nspecify that our returned value has the same lifetime as the vector we have\ntaken by a reference, i.e. returned reference must live at least as long as the\nv. This way we can “be sure” that the returned reference is valid.
Issues

First issue that our implementation has is the fact that we cannot get a mutable\nreference out of that function. This could be easily resolved by introducing new\nfunction, e.g. index_mut. Which I have actually done while writing this part:

pub fn index_mut<'a, T, U>(v: &'a mut [Vec<U>], idx: &Vector2D<T>) -> &'a mut U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&mut v[y][x]
}
«↯» Why can't we use one function?

When we consider a Vec<T>, we don't need to consider containers as T, Rust\nimplements indexing as traits Index<T> and IndexMut<T> that do the dirty work\nbehind syntactic sugar of container[idx].

However, implementing of traits is not allowed for external types, i.e. types\nthat you haven't defined yourself. This means that you can implement indexing\nover containers that you have implemented yourself, but you cannot use your own\ntypes for indexing “built-in” types.

Another part of this rabbit hole is trait SliceIndex<T> that is of a relevance\nbecause of

impl<T, I> Index<I> for [T]
where
I: SliceIndex<[T]>

impl<T, I, A> Index<I> for Vec<T, A>
where
I: SliceIndex<[T]>,
A: Allocator

impl<T, I, const N: usize> Index<I> for [T; N]
where
[T]: Index<I>

In other words, if your type implements SliceIndex<T> trait, it can be used\nfor indexing. As of now, this trait has all of its required methods experimental\nand is marked as unsafe.

Another problem is a requirement for indexing either [Vec<T>] or Vec<Vec<T>>.\nThis requirement could be countered by removing inner type Vec<T> and constraining\nit by a trait Index (or IndexMut respectively) in a following way

pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D<T>) -> &'a C::Output
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
C: Index<usize>
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}

Given this, we can also give a more meaningful typename for indexing type, such\nas I.

Checking bounds

Now we can get to the boundary checks, it is very similar, but a more… dirty.\nFirst approach that came up was to convert the indices in Vector2D to usize,\nbut when you add the indices up, e.g. when checking the neighbors, you can end\nup with negative values which, unlike in C++, causes an error (instead of underflow\nthat you can use to your advantage; you can easily guess how).

So how can we approach this then? Well… we will convert the bounds instead of\nthe indices and that lead us to:

pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
usize: TryInto<T>,
<usize as TryInto<T>>::Error: Debug,
T: PartialOrd + Copy,
{
idx.y >= 0.try_into().unwrap()
&& idx.y < v.len().try_into().unwrap()
&& idx.x >= 0.try_into().unwrap()
&& idx.x
< v[TryInto::<usize>::try_into(idx.y).unwrap()]
.len()
.try_into()
.unwrap()
}

You can tell that it's definitely a shitty code. Let's improve it now! We will\nget back to the original idea, but do it better. We know that we cannot convert\nnegative values into usize, but we also know that conversion like that\nreturns a Result<T, E> which we can use to our advantage.

pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
T: Copy,
usize: TryFrom<T>,
{
usize::try_from(idx.y)
.and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))
.unwrap_or(false)
}

Result<T, E> is a type similar to Either in Haskell and it allows us to chain\nmultiple operations on correct results or propagate the original error without\ndoing anything. Let's dissect it one-by-one.

try_from is a method implemented in TryFrom trait, that allows you to convert\ntypes and either successfully convert them or fail (with a reasonable error). This\nmethod returns Result<T, E>.

We call and_then on that result, let's have a look at the type signature of\nand_then, IMO it explains more than enough:

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> Result<U, E>

OK… So it takes the result and a function and returns another result with\ndifferent value and different error. However we can see that the function, which\nrepresents an operation on a result, takes just the value, i.e. it doesn't care\nabout any previous error. To make it short:

and_then allows us to run an operation, which can fail, on the correct result

We parsed a y index and now we try to convert the x index with try_from\nagain, but on that result we use map rather than and_then, why would that be?

pub fn map<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> U

Huh… map performs an operation that cannot fail. And finally we use\nunwrap_or which takes the value from result, or in case of an error returns the\ndefault that we define.

How does this work then? If y is negative, the conversion fails and the error\npropagates all the way to unwrap_or, if y can be a correct usize value, then\nwe do the same with x. If x is negative, we propagate the error as with y,\nand if it's not, then we check whether it exceeds the higher bounds or not.

Solution

Relatively simple, you just need follow the rules and not get too smart, otherwise\nit will get back at you.

Day 9: Rope Bridge

tl;dr

We get a rope with knots and we want to track how many different positions are\nvisited with the rope's tail.

By this day, I have come to a conclusion that current skeleton for each day\ngenerates a lot of boilerplate. And even though it can be easily copied, it's\njust a waste of space and unnecessary code. Let's “simplify” this (on one end\nwhile creating monster on the other end). I've gone through what we need in the\npreparations for the AoC. Let's sum up our requirements:

  • parsing
  • part 1 & 2
  • running on sample / input
  • tests

Parsing and implementation of both parts is code that changes each day and we\ncannot do anything about it. However running and testing can be simplified!

Let's introduce and export a new module solution that will take care of all of\nthis. We will start by introducing a trait for each day.

pub trait Solution<Input, Output: Display> {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input;

fn part_1(input: &Input) -> Output;
fn part_2(input: &Input) -> Output;
}

This does a lot of work for us already, we have defined a trait and for each day\nwe will create a structure representing a specific day. That structure will also\nimplement the Solution trait.

Now we need to get rid of the boilerplate, we can't get rid of the main function,\nbut we can at least move out the functionality.

fn run(type_of_input: &str) -> Result<()>
where
Self: Sized,
{
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = Self::parse_input(format!(\"{}s/{}.txt\", type_of_input, Self::day()));

info!(\"Part 1: {}\", Self::part_1(&input));
info!(\"Part 2: {}\", Self::part_2(&input));

Ok(())
}

fn main() -> Result<()>
where
Self: Sized,
{
Self::run(\"input\")
}

This is all part of the Solution trait, which can implement methods while being\ndependent on what is provided by the implementing types. In this case, we just\nneed to bound the Output type to implement Display that is necessary for the\ninfo! and format string there.

Now we can get to first of the nasty things we are going to do… And it is the\nday() method that you can see being used when constructing path to the input\nfile. That method will generate a name of the file, e.g. day01 and we know that\nwe can somehow deduce it from the structure name, given we name it reasonably.

fn day() -> String {
let mut day = String::from(type_name::<Self>().split(\"::\").next().unwrap());
day.make_ascii_lowercase();

day.to_string()
}
type_name

This feature is still experimental and considered to be internal, it is not\nadvised to use it any production code.

And now we can get to the nastiest stuff 😩 We will generate the tests!

We want to be able to generate tests for sample input in a following way:

test_sample!(day_01, Day01, 42, 69);

There's not much we can do, so we will write a macro to generate the tests for us.

#[macro_export]
macro_rules! test_sample {
($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {
#[cfg(test)]
mod $mod_name {
use super::*;

#[test]
fn test_part_1() {
let sample =
$day_struct::parse_input(&format!(\"samples/{}.txt\", $day_struct::day()));
assert_eq!($day_struct::part_1(&sample), $part_1);
}

#[test]
fn test_part_2() {
let sample =
$day_struct::parse_input(&format!(\"samples/{}.txt\", $day_struct::day()));
assert_eq!($day_struct::part_2(&sample), $part_2);
}
}
};
}

We have used it in a similar way as macros in C/C++, one of the things that we\ncan use to our advantage is defining “type” of the parameters for the macro. All\nparameters have their name prefixed with $ sign and you can define various “forms”\nof your macro. Let's go through it!

We have following parameters:

  • $mod_name which represents the name for the module with tests, it is typed\nwith ident which means that we want a valid identifier to be passed in.
  • $day_struct represents the structure that will be used for tests, it is typed\nwith tt which represents a token tree, in our case it is a type.
  • $part_X represents the expected output for the Xth part and is of type expr\nwhich literally means an expression.

Apart from that we need to use #[macro_export] to mark the macro as exported\nfor usage outside of the module. Now our skeleton looks like:

use aoc_2022::*;

type Input = String;
type Output = String;

struct DayXX;
impl Solution<Input, Output> for DayXX {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
file_to_string(pathname)
}

fn part_1(input: &Input) -> Output {
todo!()
}

fn part_2(input: &Input) -> Output {
todo!()
}
}

fn main() -> Result<()> {
// DayXX::run(\"sample\")
DayXX::main()
}

// test_sample!(day_XX, DayXX, , );

Solution

Not much to talk about, it is relatively easy to simulate.

Day 10: Cathode-Ray Tube

tl;dr

Emulating basic arithmetic operations on a CPU and drawing on CRT based on the\nCPU's accumulator.

In this day I have discovered an issue with my design of the Solution trait.\nAnd the issue is caused by different types of Output for the part 1 and part 2.

Problem is relatively simple and consists of simulating a CPU, I have approached\nit in a following way:

fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {
instructions
.iter()
.fold(State::new(), |state, instruction| {
state.execute(instruction, &mut out)
});

out
}

We just take the instructions, we have some state of the CPU and we execute the\ninstructions one-by-one. Perfect usage of the fold (or reduce as you may know\nit from other languages).

You can also see that we have an Output type, so the question is how can we fix\nthat problem. And the answer is very simple and functional. Rust allows you to\nhave an enumeration that can bear some other values apart from the type itself.

tip

We could've seen something like this with the Result<T, E> type that can be\ndefined as

enum Result<T, E> {
Ok(T),
Err(E)
}
What does that mean though?

When we have an Ok value, it has the result itself, and when we get an Err\nvalue, it has the error. This also allows us to handle results in a rather\npretty way:

match do_something(x) {
Ok(y) => {
println!(\"SUCCESS: {}\", y);
},
Err(y) => {
eprintln!(\"ERROR: {}\", y);
}
}

My solution has a following outline:

fn execute(&self, i: &Instruction, output: &mut Output) -> State {
// execute the instruction

// collect results if necessary
match output {
Output::Part1(x) => self.execute_part_1(y, x),
Output::Part2(x) => self.execute_part_2(y, x),
}

// return the obtained state
new_state
}

You might think that it's a perfectly reasonable thing to do. Yes, but notice\nthat the match statement doesn't collect the changes in any way and also we\npass output by &mut, so it is shared across each iteration of the fold.

The dirty and ingenious thing is that xs are passed by &mut too and therefore\nthey are directly modified by the helper functions. To sum it up and let it sit

We are collecting the result into an enumeration that is shared\nacross all iterations of fold.

Solution

Similar to Day 9, but there are some technical details that can get you.

Day 11: Monkey in the Middle

tl;dr

Simulation of monkeys throwing stuff around and measuring your stress levels\nwhile your stuff is being passed around.

I think I decided to use regular expressions here for the first time, cause\nparsing the input was a pain.

Also I didn't expect to implement Euclidean algorithm in Rust…

Solution

Again, we're just running a simulation. Though I must admit it was very easy to\nmake a small technical mistakes that could affect the final results very late.

Day 12: Hill Climbing Algorithm

tl;dr

Finding shortest path up the hill and also shortest path down to the ground while\nalso rolling down the hill…

As I have said in the tl;dr, we are looking for the shortest path, but the start\nand goal differ for the part 1 and 2. So I have decided to refactor my solution\nto a BFS algorithm that takes necessary parameters via functions:

fn bfs<F, G>(
graph: &[Vec<char>], start: &Position, has_edge: F, is_target: G
) -> Option<usize>
where
F: Fn(&[Vec<char>], &Position, &Position) -> bool,
G: Fn(&[Vec<char>], &Position) -> bool

We pass the initial vertex from the caller and everything else is left to the BFS\nalgorithm, based on the has_edge and is_target functions.

This was easy! And that is not very usual in Rust once you want to pass around\nfunctions. 👀

Solution

Looking for the shortest path… Must be Dijkstra, right? Nope! Half of the\nReddit got jebaited though. In all fairness, nothing stops you from implementing\nthe Dijkstra's algorithm for finding the shortest path, but if you know that\nall connected vertices are in a unit (actually d=1d = 1d=1) distance from each other,\nthen you know that running Dijkstra is equivalent to running BFS, only with worse\ntime complexity, because of the priority heap instead of the queue.

Day 13: Distress Signal

tl;dr

Processing packets with structured data from the distress signal.

You can implement a lot of traits if you want to. It is imperative to implement\nordering on the packets. I had a typo, so I also proceeded to implement a Display\ntrait for debugging purposes:

impl Display for Packet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Packet::Integer(x) => write!(f, \"{x}\"),
Packet::List(lst) => write!(f, \"[{}]\", lst.iter().map(|p| format!(\"{p}\")).join(\",\")),
}
}
}

Solution

A lot of technical details… Parsing is nasty too…

Day 14: Regolith Reservoir

tl;dr

Let's simulate falling sand grain-by-grain.

Again, both parts are relatively similar with minimal changes, so it is a good\nidea to refactor it a bit. Similar approach to the BFS above. Also this is the\nfirst day where I ran into efficiency issues and had to redo my solution to speed\nit up just a bit.

Solution

Tedious.

Post Mortem

Indexing

I was asked about the indexing after publishing the blog. And truly it is rather\ncomplicated topic, especially after releasing SliceIndex<I> trait. I couldn't\nleave it be, so I tried to implement the Index and IndexMut trait.

note

I have also mentioned that the SliceIndex trait is unsafe, but truth be told,\nonly unsafe part are the 2 methods that are named *unchecked*. Anyways, I will\nbe implementing the Index* traits for now, rather than the SliceIndex.

It's relatively straightforward…

impl<I, C> Index<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}

We can see a lot of similarities to the implementation of index and index_mut\nfunctions. In the end, they are 1:1, just wrapped in the trait that provides a\nsyntax sugar for container[idx].

note

I have also switched from using the TryFrom to TryInto trait, since it better\nmatches what we are using, the .try_into rather than usize::try_from.

Also implementing TryFrom automatically provides you with a TryInto trait,\nsince it is relatively easy to implement. Just compare the following:

pub trait TryFrom<T>: Sized {
type Error;

fn try_from(value: T) -> Result<Self, Self::Error>;
}

pub trait TryInto<T>: Sized {
type Error;

fn try_into(self) -> Result<T, Self::Error>;
}

OK, so we have our trait implemented, we should be able to use container[index],\nright? Yes… but actually no 😦

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:26:18
|
26 | if trees[pos] > tallest {
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:30:28
|
30 | max(tallest, trees[pos])
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<isize>`
--> src/bin/day08.rs:52:28
|
52 | let max_height = trees[position];
| ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<isize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<isize>>`

Why? We have it implemented for the slices ([C]), why doesn't it work? Well,\nthe fun part consists of the fact that in other place, where we were using it,\nwe were passing the &[Vec<T>], but this is coming from a helper functions that\ntake &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for\nthose. Just for the slices. 🤯 What are we going to do about it?

We can either start copy-pasting or be smarter about it… I choose to be smarter,\nso let's implement a macro! The only difference across the implementations are\nthe types of the outer containers. Implementation doesn't differ at all!

Implementing the macro can be done in a following way:

macro_rules! generate_indices {
($container:ty) => {
impl<I, C> Index<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}
};
}

And now we can simply do

generate_indices!(VecDeque<C>);
generate_indices!([C]);
generate_indices!(Vec<C>);
// generate_indices!([C; N], const N: usize);

The last type (I took the inspiration from the implementations of the Index and\nIndexMut traits) is a bit problematic, because of the const N: usize part,\nwhich I haven't managed to be able to parse. And that's how I got rid of the error.

note

If I were to use 2D-indexing over [C; N] slices, I'd probably just go with the\ncopy-paste, cause the cost of this “monstrosity” outweighs the benefits of no DRY.

Cause of the problem

This issue is relatively funny. If you don't use any type aliases, just the raw\ntypes, you'll get suggested certain changes by the clippy. For example if you\nconsider the following piece of code

fn get_sum(nums: &Vec<i32>) -> i32 {
nums.iter().sum()
}

fn main() {
let nums = vec![1, 2, 3];
println!(\"Sum: {}\", get_sum(&nums));
}

and you run clippy on it, you will get

Checking playground v0.0.1 (/playground)
warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do
--> src/main.rs:1:18
|
1 | fn get_sum(nums: &Vec<i32>) -> i32 {
| ^^^^^^^^^ help: change this to: `&[i32]`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg
= note: `#[warn(clippy::ptr_arg)]` on by default

warning: `playground` (bin \"playground\") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.61s

However, if you introduce a type alias, such as

type Numbers = Vec<i32>;

Then clippy won't say anything, cause there is literally nothing to suggest.\nHowever the outcome is not the same…

", + "url": "https://blog.mfocko.xyz/blog/aoc-2022/2nd-week", + "title": "2nd week of Advent of Code '22 in Rust", + "summary": "Surviving second week in Rust.", + "date_modified": "2022-12-25T23:15:00.000Z", + "author": { + "name": "Matej Focko", + "url": "https://gitlab.com/mfocko" + }, + "tags": [ + "advent-of-code", + "advent-of-code-2022", + "rust" + ] + }, + { + "id": "https://blog.mfocko.xyz/blog/aoc-2022/1st-week", + "content_html": "

Let's go through the first week of Advent of Code in Rust.

note

If you wish to have a look at the solutions, you can follow them on my GitLab.\nMore specifically in the /src/bin/.

I will try to summarize my experience with using Rust for the AoC. Trying it out\nages ago, I believe it will be pain and suffering, but we will see. For each\nday I will also try to give a tl;dr of the problem, so that you can better imagine\nthe relation to my woes or 👍 moments.

Day 1: Calorie Counting

tl;dr

As the name suggests, we get the calories of the food contained in the elves\nbackpacks and we want to choose the elf that has the most food ;)

Wakey wakey!

Programming in Rust at 6am definitely hits. I've also forgotten to mention how I\nhandle samples. With each puzzle you usually get a sample input and expected\noutput. You can use them to verify that your solution works, or usually doesn't.

At first I've decided to put asserts into my main, something like

assert_eq!(part_1(&sample), 24000);
info!(\"Part 1: {}\", part_1(&input));

assert_eq!(part_2(&sample), 45000);
info!(\"Part 2: {}\", part_2(&input));

However, once you get further, the sample input may take some time to run itself.\nSo in the end, I have decided to turn them into unit tests:

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_part_1() {
let sample = parse_input(\"samples/day01.txt\");
assert_eq!(part_1(&sample), 24000);
}

#[test]
fn test_part_2() {
let sample = parse_input(\"samples/day01.txt\");
assert_eq!(part_2(&sample), 45000);
}
}

And later on I have noticed, it's hard to tell the difference between the days,\nso I further renamed the mod from generic tests to reflect the days.

Also after finishing the first day puzzle, I have installed an sccache to\ncache the builds, so that the build time is lower, cause it was kinda unbearable.

Solution

Well, it's a pretty simple problem. You just take the input, sum the calories and\nfind the biggest one. However, if we try to generalize to more than the biggest\none, the fun appears. We have few options:

  • keep all the calories, sort them, take what we need
  • keep all the calories and use max heap
  • use min heap and maintain at most N calories that we need

Day 2: Rock Paper Scissors

tl;dr

You want to know what score did you achieve while playing Rock Paper Scissors.\nAnd then you want to be strategic about it.

Apart from the technical details of the puzzle, it went relatively smooth.

Solution

I took relatively naïve approach and then tried to simplify it.

Day 3: Rucksack Reorganization

tl;dr

Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you\nwant to find the common item among those compartments. Each of them has priority,\nyou care only about the sum.

This is the day where I started to fight the compiler and neither of us decided\nto give up. Let's dive into it \\o/

Fun fact

Fighting the compiler took me 30 minutes.

We need to find a common item among 2 collections, that's an easy task, right?\nWe can construct 2 sets and find an intersection:

let top: HashSet<i32> = [1, 2, 3].iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].iter().collect();

Now, the first issue that we encounter is caused by the fact that we are using\na slice (the […]), iterator of that returns references to the numbers.\nAnd we get immediately yelled at by the compiler, because the numbers are discarded\nafter running the .collect. To fix this, we can use .into_iter:

let top: HashSet<i32> = [1, 2, 3].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].into_iter().collect();

This way the numbers will get copied instead of referenced. OK, let's find the\nintersection of those 2 collections:

println!(\"Common elements: {:?}\", top.intersection(&bottom));
Common elements: [3]
caution

Notice that we need to do &bottom. It explicitly specifies that .intersection\nborrows the bottom, i.e. takes an immutable reference to it.

That's what we want, right? Looks like it! \\o/

Next part wants us to find the common element among all of the backpacks. OK, so\nthat should be fairly easy, we have an intersection and we want to find intersection\nover all of them.

Let's have a look at the type of the .intersection

pub fn intersection<'a>(
    &'a self,
    other: &'a HashSet<T, S>
) -> Intersection<'a, T, S>

OK… Huh… But we have an example there!

let intersection: HashSet<_> = a.intersection(&b).collect();

Cool, that's all we need.

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
println!(\"Intersection: {:?}\", intersection);
Intersection: {3, 4}

Cool, so let's do the intersection with the top_2:

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
println!(\"Intersection: {:?}\", intersection);

And we get yelled at by the compiler:

error[E0308]: mismatched types
--> src/main.rs:10:58
|
10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
| ------------ ^^^^^^ expected `&i32`, found `i32`
| |
| arguments to this function are incorrect
|
= note: expected reference `&HashSet<&i32>`
found reference `&HashSet<i32>`

/o\\ What the hell is going on here? Well, the funny thing is, that this operation\ndoesn't return the elements themselves, but the references to them and when we pass\nthe third set, it has just the values themselves, without any references.

tip

It may seem as a very weird decision, but in fact it makes some sense… It allows\nyou to do intersection of items that may not be possible to copy. Overall this is\na “tax” for having a borrow checker drilling your ass having your back and\nmaking sure you're not doing something naughty that may cause an undefined\nbehavior.

To resolve this we need to get an iterator that clones the elements:

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();
println!(\"Intersection: {:?}\", intersection);
Intersection: {4}

Solution

The approach is pretty simple, if you omit the 1on1 with the compiler. You just\nhave some fun with the set operations :)

Day 4: Camp Cleanup

tl;dr

Elves are cleaning up the camp and they got overlapping sections to clean up.\nFind how many overlap and can take the day off.

RangeInclusive is your friend not an enemy :)

Solution

Relatively easy, you just need to parse the input and know what you want. Rust's\nRangeInclusive type helped a lot, cause it took care of all abstractions.

Day 5: Supply Stacks

tl;dr

Let's play with stacks of crates.

Very easy problem with very annoying input. You can judge yourself:

    [D]    
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

Good luck transforming that into something reasonable :)

Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

Solution

For the initial solution I went with a manual solution (as in I have done all\nthe work. Later on I have decided to explore the std and interface of the\nstd::vec::Vec and found split_off which takes an index and splits (duh)\nthe vector:

let mut vec = vec![1, 2, 3];
let vec2 = vec.split_off(1);
assert_eq!(vec, [1]);
assert_eq!(vec2, [2, 3]);

This helped me simplify my solution a lot and also get rid of some edge cases.

Day 6: Tuning Trouble

tl;dr

Finding start of the message in a very weird protocol. Start of the message is\ndenoted by NNN unique consecutive characters.

Solution

A lot of different approaches, knowing that we are dealing with input consisting\nsolely of ASCII letters, I bit the bullet and went with sliding window and\nconstructing sets from that window, checking if the set is as big as the window.

One possible optimization could consist of keeping a bit-vector (i.e. usize\nvariable) of encountered characters and updating it as we go. However this has\na different issue and that is removal of the characters from the left side of the\nwindow. We don't know if the same character is not included later on.

Other option is to do similar thing, but keeping the frequencies of the letters,\nand again knowing we have only ASCII letters we can optimize by having a vector\nof 26 elements that keeps count for each lowercase letter.

Day 7: No Space Left On Device

tl;dr

Let's simulate du to get some stats about our file system and then pinpoint\ndirectories that take a lot of space and should be deleted.

I was waiting for this moment, and yet it got me!\nimagine me swearing for hours

Solution

We need to “build” a file system from the input that is given in a following form:

$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k

There are few ways in which you can achieve this and also you can assume some\npreconditions, but why would we do that, right? :)

You can “slap” this in either HashMap or BTreeMap and call it a day.\nAnd that would be boring…

tip

BTreeMap is quite fitting for this, don't you think?

I always wanted to try allocation on heap in Rust, so I chose to implement a tree.\nI fought with the Box<T> for some time and was losing…

Then I looked up some implementations of trees or linked lists and decided to try\nRc<Cell<T>>. And I got my ass whopped by the compiler once again. /o\\

tip

Box<T> represents a dynamically allocated memory on heap. It is a single pointer,\nyou can imagine this as std::unique_ptr<T> in C++.

Rc<T> represents a dynamically allocated memory on heap. On top of that it is\nreference counted (that's what the Rc stands for). You can imagine this as\nstd::shared_ptr<T> in C++.

Now the fun stuff. Neither of them lets you mutate the contents of the memory.

Cell<T> allows you to mutate the memory. Can be used reasonably with types that\ncan be copied, because the memory safety is guaranteed by copying the contents\nwhen there is more than one mutable reference to the memory.

RefCell<T> is similar to the Cell<T>, but the borrowing rules (how many mutable\nreferences are present) are checked dynamically.

So in the end, if you want something like std::shared_ptr<T> in Rust, you want\nto have Rc<RefCell<T>>.

So, how are we going to represent the file system then? We will use an enumeration,\nhehe, which is an algebraic data type that can store some stuff in itself 😩

type FileHandle = Rc<RefCell<AocFile>>;

#[derive(Debug)]
enum AocFile {
File(usize),
Directory(BTreeMap<String, FileHandle>),
}

Let's go over it! FileHandle represents dynamically allocated AocFile, not\nmuch to discuss. What does the #[derive(Debug)] do though? It lets us to print\nout the value of that enumeration, it's derived, so it's not as good as if we had\nimplemented it ourselves, but it's good enough for debugging, hence the name.

Now to the fun part! AocFile value can be represented in two ways:

  • File(usize), e.g. AocFile::File(123) and we can pattern match it, if we\nneed to
  • Directory(BTreeMap<String, FileHandle>) will represent the directory and will\ncontain map matching the name of the files (or directories) within to their\nrespective file handles

I will omit the details about constructing this file system, cause there are a lot\nof technicalities introduced by the nature of the input. However if you are\ninterested, you can have a look at my solution.

We need to find small enough directories and also find the smallest directory that\nwill free enough space. Now the question is, how could we do that. And there are\nmultiple ways I will describe.

I have chosen to implement tree catamorphism 😩. It is basically a fold\nover a tree data structure. We descent down into the leaves and propagate computed\nresults all the way to the root. You can also notice that this approach is very\nsimilar to dynamic programming, we find overlapping sections of the computation\nand try to minimize the additional work (in this case: we need to know sizes of\nour descendants, but we have already been there).

Another approach that has been suggested to me few days later is running DFS on\nthe graph. And, funnily enough, we would still need to combine what we found in\nthe branches where we descent. So in the end, it would work very similarly to my\nsolution.

One of the more exotic options would be precomputing the required information at\nthe same time as parsing. That could be done by adding additional fields to the\nnodes which would allow storing such information and updating it as we construct\nthe file system.

Post Mortem

Things that have been brought up in the discussion later on.

Rc<T> vs Rc<RefCell<T>>

It has been brought up that I have a contradicting statement regarding the\ndynamically allocated memory. Specifically:

  • You can imagine Rc<T> as an std::shared_ptr<T> (in C++)
  • When you want an equivalent of std::shared_ptr<T>, you want to use\nRc<RefCell<T>>

Now, in Rust it is a bit more complicated, because the type that represents the\n“shared pointer” is Rc<T>. What RefCell<T> does is making sure that there is\nonly one “owner” of a mutable reference at a time (and dynamically, as opposed\nto the Cell<T>).

Therefore to be precise and correct about the equivalents of std::shared_ptr<T>\nin Rust, we can say that

  • Rc<T> is an equivalent of a const std::shared_ptr<T>,
  • and Rc<RefCell<T>> is an equivalent of a std::shared_ptr<T>.

You can easily see that they only differ in the mutability. (And even that is not\nas simple as it seems, because there is also Cell<T>)

", + "url": "https://blog.mfocko.xyz/blog/aoc-2022/1st-week", + "title": "1st week of Advent of Code '22 in Rust", + "summary": "Surviving first week in Rust.", + "date_modified": "2022-12-15T01:15:00.000Z", + "author": { + "name": "Matej Focko", + "url": "https://gitlab.com/mfocko" + }, + "tags": [ + "advent-of-code", + "advent-of-code-2022", + "rust" + ] + }, + { + "id": "https://blog.mfocko.xyz/blog/aoc-2022/intro", + "content_html": "

Let's talk about the preparations for this year's Advent of Code.

Choosing a language

When choosing a language for AoC, you usually want a language that gives you a\nquick feedback which allows you to iterate quickly to the solution of the puzzle.\nOne of the most common choices is Python, many people also use JavaScript or Ruby.

Given the competitive nature of the AoC and popularity among competitive programming,\nC++ might be also a very good choice. Only if you are familiar with it, I guess…

If you want a challenge, you might also choose to rotate the languages each day.\nThough I prefer to use only one language.

For this year I have been deciding between Rust, C++ and Pascal or Ada.

I have tried Rust last year and have survived with it for 3 days and then gave\nup and switched to Kotlin, which was pretty good given it is “Java undercover”.\nI pretty much like the ideas behind Rust, I am not sure about the whole cult and\nimplementation of those ideas though. After some years with C/C++, I would say\nthat Rust feels too safe for my taste and tries to “punish me” even for the\nmost trivial things.

C++ is a very robust, but also comes with a wide variety of options providing you\nthe ability to shoot yourself in the leg. I have tried to solve few days of previous\nAdvent of Code events, it was relatively easy to solve the problems in C++, given\nthat I do not admit writing my own iterator for enumerate

Pascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a\npretty nice standard library that offers enough to be able to quickly solve some\nproblems in it. However the toolkit is questionable :/

Choosing libraries

Preparations for Rust

All of the sources, later on including solutions, can be found at my\nGitLab.

Toolkit

Since we are using Rust, we are going to use a Cargo and more than likely VSCode\nwith rust-analyzer. Because of my choice of libraries, we will also introduce\na .envrc file that can be used by direnv, which allows you to set specific\nenvironment variables when you enter a directory. In our case, we will use

# to show nice backtrace when using the color-eyre
export RUST_BACKTRACE=1

# to catch logs generated by tracing
export RUST_LOG=trace

And for the one of the most obnoxious things ever, we will use a script to download\nthe inputs instead of “clicking, opening and copying to a file1. There is\nno need to be fancy, so we will adjust Python script by Martin2.

#!/usr/bin/env python3

import datetime
import yaml
import requests
import sys


def load_config():
with open(\"env.yaml\", \"r\") as f:
js = yaml.load(f, Loader=yaml.Loader)
return js[\"session\"], js[\"year\"]


def get_input(session, year, day):
return requests.get(
f\"https://adventofcode.com/{year}/day/{day}/input\",
cookies={\"session\": session},
headers={
\"User-Agent\": \"{repo} by {mail}\".format(
repo=\"gitlab.com/mfocko/advent-of-code-2022\",
mail=\"me@mfocko.xyz\",
)
},
).content.decode(\"utf-8\")


def main():
day = datetime.datetime.now().day
if len(sys.argv) == 2:
day = sys.argv[1]

session, year = load_config()
problem_input = get_input(session, year, day)

with open(f\"./inputs/day{day:>02}.txt\", \"w\") as f:
f.write(problem_input)


if __name__ == \"__main__\":
main()

If the script is called without any arguments, it will deduce the day from the\nsystem, so we do not need to change the day every morning. It also requires a\nconfiguration file:

# env.yaml
session: ‹your session cookie›
year: 2022

Libraries

Looking at the list of the libraries, I have chosen “a lot” of them. Let's walk\nthrough each of them.

tracing and tracing-subscriber are the crates that can be used for tracing\nand logging of your Rust programs, there are also other crates that can help you\nwith providing backtrace to the Sentry in case you have deployed your application\nsomewhere and you want to watch over it. In our use case we will just utilize the\nmacros for debugging in the terminal.

thiserror, anyhow and color-eyre are used for error reporting.\nthiserror is a very good choice for libraries, cause it extends the Error\nfrom the std and allows you to create more convenient error types. Next is\nanyhow which kinda builds on top of the thiserror and provides you with simpler\nerror handling in binaries3. And finally we have color-eyre which, as I found\nout later, is a colorful (wink wink) extension of eyre which is fork of anyhow\nwhile supporting customized reports.

In the end I have decided to remove thiserror and anyhow, since first one is\nsuitable for libraries and the latter was basically fully replaced by {color-,}eyre.

regex and lazy_static are a very good and also, I hope, self-explanatory\ncombination. lazy_static allows you to have static variables that must be initialized\nduring runtime.

itertools provides some nice extensions to the iterators from the std.

My own “library”

When creating the crate for this year's Advent of Code, I have chosen a library\ntype. Even though standard library is huge, some things might not be included and\nalso we can follow KISS. I have 2 modules that my “library” exports, one for\nparsing and one for 2D vector (that gets used quite often during Advent of Code).

Key part is, of course, processing the input and my library exports following\nfunctions that get used a lot:

/// Reads file to the string.
pub fn file_to_string<P: AsRef<Path>>(pathname: P) -> String;

/// Reads file and returns it as a vector of characters.
pub fn file_to_chars<P: AsRef<Path>>(pathname: P) -> Vec<char>;

/// Reads file and returns a vector of parsed structures. Expects each structure
/// on its own line in the file. And `T` needs to implement `FromStr` trait.
pub fn file_to_structs<P: AsRef<Path>, T: FromStr>(pathname: P) -> Vec<T>
where
<T as FromStr>::Err: Debug;

/// Converts iterator over strings to a vector of parsed structures. `T` needs
/// to implement `FromStr` trait and its error must derive `Debug` trait.
pub fn strings_to_structs<T: FromStr, U>(
iter: impl Iterator<Item = U>
) -> Vec<T>
where
<T as std::str::FromStr>::Err: std::fmt::Debug,
U: Deref<Target = str>;

/// Reads file and returns it as a vector of its lines.
pub fn file_to_lines<P: AsRef<Path>>(pathname: P) -> Vec<String>;

As for the vector, I went with a rather simple implementation that allows only\naddition of the vectors for now and accessing the elements via functions x()\nand y(). Also the vector is generic, so we can use it with any numeric type we\nneed.

Skeleton

We can also prepare a template to quickly bootstrap each of the days. We know\nthat each puzzle has 2 parts, which means that we can start with 2 functions that\nwill solve them.

fn part1(input: &Input) -> Output {
todo!()
}

fn part2(input: &Input) -> Output {
todo!()
}

Both functions take reference to the input and return some output (in majority\nof puzzles, it is the same type). todo!() can be used as a nice placeholder,\nit also causes a panic when reached and we could also provide some string with\nan explanation, e.g. todo!(\"part 1\"). We have not given functions a specific\ntype and to avoid as much copy-paste as possible, we will introduce type aliases.

type Input = String;
type Output = i32;
tip

This allows us to quickly adjust the types only in one place without the need to\ndo regex-replace or replace them manually.

For each day we get a personalized input that is provided as a text file. Almost\nall the time, we would like to get some structured type out of that input, and\ntherefore it makes sense to introduce a new function that will provide the parsing\nof the input.

fn parse_input(path: &str) -> Input {
todo!()
}

This “parser” will take a path to the file, just in case we would like to run the\nsample instead of input.

OK, so now we can write a main function that will take all of the pieces and\nrun them.

fn main() {
let input = parse_input(\"inputs/dayXX.txt\");

println!(\"Part 1: {}\", part_1(&input));
println!(\"Part 2: {}\", part_2(&input));
}

This would definitely do :) But we have installed a few libraries and we want to\nuse them. In this part we are going to utilize tracing (for tracing, duh…)\nand color-eyre (for better error reporting, e.g. from parsing).

fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = parse_input(\"inputs/dayXX.txt\");

info!(\"Part 1: {}\", part_1(&input));
info!(\"Part 2: {}\", part_2(&input));

Ok(())
}

The first statement will set up tracing and configure it to print out the logs to\nterminal, based on the environment variable. We also change the formatting a bit,\nsince we do not need all the fancy features of the logger. Pure initialization\nwould get us logs like this:

2022-12-11T19:53:19.975343Z  INFO day01: Part 1: 0

However after running that command, we will get the following:

 INFO src/bin/day01.rs:35: Part 1: 0

And the color_eyre::install()? is quite straightforward. We just initialize the\nerror reporting by color eyre.

caution

Notice that we had to add Ok(()) to the end of the function and adjust the\nreturn type of the main to Result<()>. It is caused by the color eyre that\ncan be installed only once and therefore it can fail, that is how we got the ?\nat the end of the ::install which unwraps the »result« of the installation.

Overall we will get to a template like this:

use aoc_2022::*;

use color_eyre::eyre::Result;
use tracing::info;
use tracing_subscriber::EnvFilter;

type Input = String;
type Output = i32;

fn parse_input(path: &str) -> Input {
todo!()
}

fn part1(input: &Input) -> Output {
todo!()
}

fn part2(input: &Input) -> Output {
todo!()
}

fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = parse_input(\"inputs/dayXX.txt\");

info!(\"Part 1: {}\", part_1(&input));
info!(\"Part 2: {}\", part_2(&input));

Ok(())
}

  1. Copy-pasting might be a relaxing thing to do, but you can also discover\nnasty stuff about your PC. See this Reddit post and the comment.
  2. GitHub profile
  3. Even though you can use it even for libraries, but handling errors from\nlibraries using anyhow is nasty… You will be the stinky one ;)
", + "url": "https://blog.mfocko.xyz/blog/aoc-2022/intro", + "title": "Advent of Code '22 in Rust", + "summary": "Preparing for Advent of Code '22.", + "date_modified": "2022-12-14T21:45:00.000Z", + "author": { + "name": "Matej Focko", + "url": "https://gitlab.com/mfocko" + }, + "tags": [ + "advent-of-code", + "advent-of-code-2022", + "rust" + ] + } + ] +} \ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..c891b3c --- /dev/null +++ b/blog/index.html @@ -0,0 +1,27 @@ + + + + + +Blog | mf + + + + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/blog/leetcode/sort-diagonally/index.html b/blog/leetcode/sort-diagonally/index.html new file mode 100644 index 0000000..524fb4b --- /dev/null +++ b/blog/leetcode/sort-diagonally/index.html @@ -0,0 +1,113 @@ + + + + + +Sort the matrix diagonally | mf + + + + + + + + + + + + + +
+

Sort the matrix diagonally

· 17 min read
Matej Focko

Let's try to solve one of the LeetCode challenges in easy and hard mode at the +same time.

Problem description

A matrix diagonal is a diagonal line of cells starting from some cell in +either the topmost row or leftmost column and going in the bottom-right direction +until reaching the matrix's end. For example, the matrix diagonal starting +from mat[2][0], where mat is a 6 x 3 matrix, includes cells mat[2][0], +mat[3][1], and mat[4][2].

Given an m x n matrix mat of integers, sort each matrix diagonal in ascending +order and return the resulting matrix.

Example

Image describing the problem

Skeleton and initial adjustments

We are given the following skeleton for the C++ and the given challenge:

class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};

The task is to sort the passed matrix diagonally and then return it. First of all, +I don't like to solve this in a web browser, so we'll need to adjust it accordingly +for running it locally. We'll start by including the vector header and using +fully-qualified namespaces1 and also adding few tests:

#include <cassert>
#include <vector>

using matrix = std::vector<std::vector<int>>;

class Solution {
public:
matrix diagonalSort(matrix& mat)
{
}
};

static void test_case_1()
{
// Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
// Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },
std::vector { 2, 2, 1, 2 },
std::vector { 1, 1, 1, 2 } })
== std::vector { std::vector { 1, 1, 1, 1 },
std::vector { 1, 2, 2, 2 },
std::vector { 1, 2, 3, 3 } }));
}

static void test_case_2()
{
// Input: mat =
// [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
// Output:
// [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },
std::vector { 23, 55, 17, 45, 15, 52 },
std::vector { 75, 31, 36, 44, 58, 8 },
std::vector { 22, 27, 33, 25, 68, 4 },
std::vector { 84, 28, 14, 11, 5, 50 } })
== std::vector { std::vector { 5, 17, 4, 1, 52, 7 },
std::vector { 11, 11, 25, 45, 8, 69 },
std::vector { 14, 23, 25, 44, 58, 15 },
std::vector { 22, 27, 31, 36, 50, 66 },
std::vector { 84, 28, 75, 33, 55, 68 } }));
}

int main()
{
test_case_1();
test_case_2();

return 0;
}

We need to return the matrix, but we're given a reference to the input matrix. We +can easily abuse the C++ here and just switch the reference to value, this way +the matrix will be copied when passed to the function, we can sort the copy and +just return it back. And we also get yelled by the compiler for the fact that the +method doesn't return anything yet, so to make it “shut up” we will just return +the input for now:

-    matrix diagonalSort(matrix& mat)
+ matrix diagonalSort(matrix mat)
{
+ return mat;
}

Now, we get the copy and we're good to go.

Naïve solution

As you may know, C++ offers a plethora of functions that can be used to your +advantage, given that you know how to “bend” the data structures accordingly.

What does that mean for us? Well, we have an std::sort, we can use it, right? +Let's have a look at it:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );

This overload is more than we need. What does it do? It just sorts the elements +in the range [first, last) using operator< on them. We can't sort the whole +matrix using this, but… we can sort just »one« diagonal without doing much work +on our end.

What is the RandomIt type though? If we look more into the documentation, we +can easily find the requirements for it and also learn that it's a random access +iterator and allows swapping its values at the same time.

Random access iterator

What is the random access iterator though? We can find it in a documentation +and see the following description:

A LegacyRandomAccessIterator is a LegacyBidirectionalIterator +that can be moved to point to any element in constant time.

After that we can see all the requirements for it being listed. I don't feel like +reading them right now, so we will just use it and see where the compilation blows +up, i.e. “compiler-assisted development2 if you will ;)

Now we know that we can use std::sort to sort the diagonal itself, but we also +need to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to +someone else3. And that way we get

matrix diagonalSort(matrix mat)
{
// we iterate over the diagonals
for (auto d : diagonals(mat)) {
// and we sort each diagonal
std::sort(d.begin(), d.end());
}

// we take the matrix by copy, so we can sort in-situ and return the copy
// that we sorted
return mat;
}

This solution looks very simple, doesn't it? Well, cause it is. +Let's try compiling it:

matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]
for (auto d : diagonals(mat)) {
^
Found compiler error(s).
make: *** [makefile:14: tidy] Error 1

OK, seems about right. We haven't implemented the diagonals yet. And based on +what we've written so far, we need a function or a class diagonals that will +give us the diagonals we need.

Implementing the diagonals

Cool, so we need the function that will let us go through each and every diagonal +in our matrix. We use the for-range loop, so whatever we get back from the +diagonals must support .begin() and .end(). Since I am a masochist, we will +do such functionality for a matrix of any type, not just the int from the challenge.

As I said, we need to be able to

  • construct the object
  • get the beginning
  • get the end (the “sentinel”)
template <typename T>
class diagonals {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& _matrix;

public:
diagonals(matrix_t& m)
: _matrix(m)
{
}
diagonals_iter begin()
{
/* TODO */
}
diagonals_iter end()
{
/* TODO */
}
};

Now we have a diagonals that we can use to go through the diagonals. We haven't +implemented the core of it yet. Let's go through what we have for now.

We have a templated class with templated T that is used as a placeholder for any +type we would store in the matrix. Because I'm lazy, I have defined the matrix_t +type that is a “shortcut” for std::vector<std::vector<T>>, so I don't have to +type it out all the time. Of course, we need to store the matrix, we are given, +as a private attribute. And then just have the constructor and the 2 methods we +need for the for-range.

Iterating over diagonals

Now that we have an object that will allow us to iterate through the diagonals, +we need to implement the iterating itself. We need to go through all of them, so +we have multiple options how to do so. I have decided to start from the “main” +diagonal that starts at (0, 0) index and then proceed with the diagonals starting +in the first row, followed by the rest of the diagonals in the first column.

We need to be able to tell that we've iterated through all of them, and also we +need to know which diagonal is next. For that purpose we will pass the indices +of the first cell on the diagonal. That way we can always tell how to move forward.

We will start by updating the begin and end to reflect our choice accordingly.

diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }
diagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }

For the begin we return the first diagonal that starts at (0, 0). And because +we have decided to do the diagonals in the first column at the end, the first +diagonal that is not a valid one is the one at (0, height). Apart from the +indices, we also need to pass reference to the matrix itself.

note

You may have noticed that we also include the diagonals that have length 1, +specifically the ones at (0, height - 1) and (width - 1, 0). We are implementing +an iterator that should not care about the way it's being used. Therefore, we +don't care about the fact they don't need to be sorted.

Cool, let's leave the iterator itself to someone else, right?4

Implementing the iterator over diagonals

We can start with a simple skeleton based on the information that we pass from +the diagonals. Also to utilize the matrix_t and also contain implementation +details hidden away, we will put this code into the diagonals class.

class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}
};

In this case we will be implementing a “simple” forward iterator, so we don't +need to implement a lot. Notably it will be:

  • inequality operator (we need to know when we reach the end and have nothing to +iterate over)
  • preincrementation operator (we need to be able to move around the iterable)
  • dereference operator (we need to be able to retrieve the objects we iterate +over)
class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator!=(const diagonals_iter& rhs) const
{
// iterators are not equal if they reference different matrices, or
// their positions differ
return m != rhs.m || x != rhs.x || y != rhs.y;
}

diagonals_iter& operator++()
{
if (y != 0) {
// iterating through diagonals down the first column
y++;
return *this;
}

// iterating the diagonals along the first row
x++;
if (x == m.front().size()) {
// switching to diagonals in the first column
x = 0;
y++;
}

return *this;
}

diagonal<T> operator*() const { return diagonal { m, x, y }; }
};

Let's go one-by-one. Inequality operator is rather simple, just compare iterator's +attributes field-by-field. If you think about it, checking inequality of two 2D +vectors may be a bit inefficient, therefore, we can swap around and check it as +a last thing.

-        return m != rhs.m || x != rhs.x || y != rhs.y;
+ return x != rhs.x || y != rhs.y || m != rhs.m;

Preincrementation is where the magic happens. If you have a better look, you can +see two branches of this operation:

  1. When y != 0 (we're iterating over the diagonals in the first column) +In this case, we just bump the row and we're done.
  2. When y == 0 (we're iterating over the diagonals in the first row) +In this case, we bump the column and check if we haven't gotten out of bounds, +i.e. the end of the first row. If we get out of the bounds, we're continuing +with the second diagonal in the first column.

Dereferencing the iterator must “yield” something. In our case it will be the +diagonal that we want to sort. For sorting we need just the iterators that can +move around said diagonal. The simplest thing, we can do, is to delegate it to +something else. In our case it will be a class called diagonal.

Implementing the diagonal itself

After implementing the iterator over diagonals, we know that all we need to describe +a diagonal is the matrix itself and the “start” of the diagonal (row and column). +And we also know that the diagonal must provide some iterators for the std::sort +function. We can start with the following skeleton:

template <typename T>
class diagonal {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& matrix;
std::size_t x;
std::size_t y;

public:
diagonal(matrix_t& matrix, std::size_t x, std::size_t y)
: matrix(matrix)
, x(x)
, y(y)
{
}

diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }

diagonal_iter end() const
{
auto max_x = matrix[y].size();
auto max_y = matrix.size();

// we need to find the distance in which we get out of bounds (either in
// column or row)
auto steps = std::min(max_x - x, max_y - y);

return diagonal_iter { matrix, x + steps, y + steps };
}
};

Initialization is rather simple, we just “keep” the stuff we get, begin is the +simplest, we just delegate.

In case of the end, it gets more complicated. We need to know where is the “end” +of the diagonal. Since end should point to the first element “after” the iterable, +we know that it's the first position of the iterator where either y becomes +matrix.size() or x becomes matrix[y].size(). Also we are moving along diagonal, +duh, therefore we can deduce the first “position” afterwards by minimal amount of +steps to get out of the any column or row, hence std::min(max_x - x, max_y - y). +Final position is then computed simply by adding the steps to the beginning of +the diagonal.

Now we just need to finish the iterator for the diagonal itself and we're done.

Implementing diagonal_iter

This part is the hardest from all we need to do. It's because of the requirements +of the std::sort that requires us to implement a random access iterator. I have +briefly described it above, and “in a nutshell” it means that we need to implement +an iterator that can move in constant time along the diagonal in any amount of +steps.

Let's go through all of the functionality that our iterator needs to support to +be used in std::sort. We need the usual operations like:

  • equality/inequality
  • incrementation
  • dereferencing

We will also add all the types that our iterator uses with the category of the +iterator, i.e. what interface it supports:

class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }
};

This is pretty similar to the previous iterator, but now we need to implement the +remaining requirements of the random access iterator. Let's see what those are:

  • decrementation - cause we need to be able to move backwards too, since random access iterator extends the interface of bidirectional iterator
  • moving the iterator in either direction by steps given as an integer
  • being able to tell the distance between two iterators
  • define an ordering on the iterators

Let's fill them in:

class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }

// exactly opposite to the incrementation
diagonal_iter operator--()
{
x--;
y--;
return *this;
}

// moving ‹n› steps back is same as calling decrementation ‹n›-times, so we
// can just return a new iterator and subtract ‹n› from both coordinates in
// the matrix
diagonal_iter operator-(difference_type n) const
{
return diagonal_iter { m, x - n, y - n };
}

// here we assume that we are given two iterators on the same diagonal
difference_type operator-(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x - rhs.x;
}

// counterpart of moving ‹n› steps backwards
diagonal_iter operator+(difference_type n) const
{
return diagonal_iter { m, x + n, y + n };
}

// we compare the coordinates, and also assume that those 2 iterators are
// lying on the same diagonal
bool operator<(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x < rhs.x && y < rhs.y;
}
};

At this point we could probably try and compile it, right? If we do so, we will +get yelled at by a compiler for the following reasons:

/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __next;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here
std::__unguarded_linear_insert(__i,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]
std::__unguarded_linear_insert(__i,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal<int>::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]
__unguarded_linear_insert(_RandomAccessIterator __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __cut;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop<diagonal<int>::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__introsort_loop(__first, __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^

That's a lot of noise, isn't it? Let's focus on the important parts:

/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]

matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^

Ah! We have a reference in our iterator, and this prevents us from having a copy +assignment operator (that is used “somewhere” in the sorting algorithm). Well… +Let's just wrap it!

# we need to keep a different type than reference
- matrix_t& m;
+ std::reference_wrapper<matrix_t> m;

# in comparison we need to get the reference out of the wrapper first
- return x == rhs.x && y == rhs.y && m == rhs.m;
+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();

# same when we return a reference to the “cell” in the matrix
- reference operator*() const { return m[y][x]; }
+ reference operator*() const { return m.get()[y][x]; }

# and finally in the assertions that we set for the “distance” and “less than”
- assert(m == rhs.m);
+ assert(m.get() == rhs.m.get());

We're done now! We have written an iterator over diagonals for a 2D vector. You can have a look at the final result here.


  1. just because I'm used to it and don't care about your opinion ;)
  2. exercise at your own risk
  3. me in 5 minutes in fact, but don't make me scared
  4. me in the next section…
+ + + + \ No newline at end of file diff --git a/blog/rss.xml b/blog/rss.xml new file mode 100644 index 0000000..207b0b3 --- /dev/null +++ b/blog/rss.xml @@ -0,0 +1,725 @@ + + + + mf Blog + https://blog.mfocko.xyz/blog + mf's blog + Wed, 02 Aug 2023 00:00:00 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + en + + <![CDATA[How can Copr help with broken dependencies]]> + https://blog.mfocko.xyz/blog/2023/08/02/copr + https://blog.mfocko.xyz/blog/2023/08/02/copr + Wed, 02 Aug 2023 00:00:00 GMT + + When you decide to run Fedora on your VPS, you might get screwed over by using +random repositories…

When I “reserved” my VPS1 back in June '20, I slapped Fedora on it without +thinking. I bet 99% of people would say that I'm crazy for doing such thing2, +BUT I've been using Fedora on my PCs for some time already and it felt very +stable and natural to just use, even for VPS.

One of the first things I've done was setting up a mail server. You may guess +what's the fun part about having a mail server… Yes, it's all the spam you +receive and only then you realize how much “crap” gets filtered on free mail +services. To battle this problem I chose to use +rspamd that had CentOS support, but someone +had a Copr repository that I used to +install it.

How does Copr repositories work?

If you have ever used Ubuntu, you might be familiar with the concept since it is +very close to PPAs.

tl;dr of the whole process consists of

  1. enabling the Copr repository, and
  2. installing the desired package.

So in shell you would do

# dnf copr enable ‹copr-repository›
# dnf install ‹package-from-the-repository›

And… that's it! Nothing else needed! Simple, right? And literally same process +as you would do for the PPA.

AUR

On the other hand, if you are familiar with the archLinux, you definitely know +AUR and what it can do for you. Copr repository is pretty similar, but the +packages are prebuilt in Copr and Copr repositories can carry the required +dependencies for said packages, which simplifies the distribution, and can even +help with installing singular packages (when you just need the dependency, not +everything).

My issue

Now you might wonder how would I use it on my VPS. It's rather simple, once in +6 months a new Fedora release comes out. And you need to upgrade to newer +release… You don't need to do it right away and for such setup it probably isn't +even recommended.

tip

Fedora releases are supported for a year, i.e. they live 6 months till the next +release and then another 6 months till another release.

Some people prefer to run one version “behind”. If you ever decide to run it on +your home server or in a similar setup, it might be a pretty good idea to +follow. I'm using the “latest greatest”, cause why not 😄

One way or another, you still need to bump the release every six months, unless +you'd bump 2 releases at once every year, which would be a decision, since, at +least I, cannot see any benefits in it… You don't go for “stability”, cause once +a year you switch to the latest release and then, before you bump, you use one +year old software, so you're not even using the latest.

Fast-forward 2 years in the future, new Fedora release came out (October '22) +and I was doing an upgrade. Dependencies of the rspamd have been updated and +rspamd builds in Copr have failed and no one fixed it. Cool, so now I can +upgrade, but can either ignore the dependencies or uninstall the rspamd…

How can Copr help?

I have managed to find +specfile for the +rspamd package that they use for CentOS. There were some files apart from the +specfile, so I had to make an SRPM locally and then… I just uploaded the SRPM +to the Copr to +build +an RPM.

I have switched the previous Copr repository for rspamd with my own and happily +proceeded with the upgrade.

Conclusion

Copr is heavily used for testing builds on the upstream with +Packit. However, as you can see, it is possible to use it +very well for packaging your own stuff and avoiding issues (such as the one +I have described above), if need be.


  1. vpsFree.cz
  2. Even though I've been running archLinux on some Raspberry Pi's and also +on one of my “home servers”, before getting the VPS. You could say I like +to live on the edge…
]]>
+ me+blog@mfocko.xyz (Matej Focko) + 🏭 + red-hat + copr + admin + vps +
+ + <![CDATA[4th week of Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/4th-week + https://blog.mfocko.xyz/blog/aoc-2022/4th-week + Fri, 07 Jul 2023 15:14:00 GMT + + Let's go through the fourth week of Advent of Code in Rust.

Day 22: Monkey Map

tl;dr

Simulating a movement on a 2D map with given instructions. Map becomes a cube in +the 2nd part…

Rant

This was the most obnoxious problem of this year… and a lot of Rust issues have +been hit.

Solution

It seems like a very simple problem to solve, but with very obnoxious changes in +the 2nd part and also it's relatively hard to decompose »properly«.

Column iterator

In the first part of the problem it was needed to know the boundaries of each +row and column, since I stored them in Vec<Vec<char>> and padded with spaces +to ensure I have a rectangular 2D “array”. However when you wanted to go through +each row and column to determine the boundaries, it was very easy to do for the +rows (cause each row is a Vec element), but not for the columns, since they +span multiple rows.

For this use case I have implemented my own column iterator:

pub struct ColumnIterator<'a, T> {
map: &'a [Vec<T>],
column: usize,

i: usize,
}

impl<'a, T> ColumnIterator<'a, T> {
pub fn new(map: &'a [Vec<T>], column: usize) -> ColumnIterator<'a, T> {
Self { map, column, i: 0 }
}
}

impl<'a, T> Iterator for ColumnIterator<'a, T> {
type Item = &'a T;

fn next(&mut self) -> Option<Self::Item> {
if self.i >= self.map.len() {
return None;
}

self.i += 1;
Some(&self.map[self.i - 1][self.column])
}
}

Given this piece of an iterator, it is very easy to factor out the common +functionality between the rows and columns into:

let mut find_boundaries = |constructor: fn(usize) -> Orientation,
iterator: &mut dyn Iterator<Item = &char>,
upper_bound,
i| {
let mut first_non_empty = iterator.enumerate().skip_while(|&(_, &c)| c == ' ');
let start = first_non_empty.next().unwrap().0 as isize;

let mut last_non_empty = first_non_empty.skip_while(|&(_, &c)| c != ' ');
let end = last_non_empty.next().unwrap_or((upper_bound, &'_')).0 as isize;

boundaries.insert(constructor(i), start..end);
};

And then use it as such:

// construct all horizontal boundaries
(0..map.len()).for_each(|row| {
find_boundaries(
Orientation::horizontal,
&mut map[row].iter(),
map[row].len(),
row,
);
});

// construct all vertical boundaries
(0..map[0].len()).for_each(|col| {
find_boundaries(
Orientation::vertical,
&mut ColumnIterator::new(&map, col),
map.len(),
col,
);
});

Walking around the map

Once the 2nd part got introduced, you start to think about a way how not to +copy-paste a lot of stuff (I haven't avoided it anyways…). In this problem, I've +chosen to introduce a trait (i.e. interface) for 2D and 3D walker.

trait Wrap: Clone {
type State;

// simulation
fn is_blocked(&self) -> bool;
fn step(&mut self, steps: isize);
fn turn_left(&mut self);
fn turn_right(&mut self);

// movement
fn next(&self) -> (Self::State, Direction);

// final answer
fn answer(&self) -> Output;
}

Each walker maintains its own state and also provides the functions that are +used during the simulation. The “promised” methods are separated into:

  • simulation-related: that are used during the simulation from the .fold()
  • movement-related: just a one method that holds most of the logic differences +between 2D and 3D
  • final answer: which extracts the proof of solution from the +implementation-specific walker

Both 2D and 3D versions borrow the original input and therefore you must +annotate the lifetime of it:

struct Wrap2D<'a> {
input: &'a Input,
position: Position,
direction: Direction,
}
impl<'a> Wrap2D<'a> {
fn new(input: &'a Input) -> Wrap2D<'a> {
// …

Problems

I have used a lot of closures for this problem and once I introduced a parameter +that was of unknown type (apart from the fact it implements a specific trait), I +got suggested a “fix” for the compilation error that resulted in something that +was not possible to parse, cause it, more than likely, violated the grammar.

In a similar fashion, I have been suggested changes that led to a code that +didn't make sense by just looking at it (there was no need to try the changes), +for example one suggested change in the closure parameter caused disapperance of +the parameter name. 😄

Clippy

I have to admit that Clippy was rather helpful here, I'll include two examples +of rather smart suggestions.

When writing the parsing for this problem, the first thing I have spotted on the +char was the .is_digit() function that takes a radix as a parameter. Clippy +noticed that I use radix = 10 and suggested switching to .is_ascii_digit() +that does exactly the same thing:

-                .take_while(|c| c.is_digit(10))
+ .take_while(|c| c.is_ascii_digit())

Another useful suggestion appeared when working with the iterators and I wanted +to get the nn-th element from it. You know the .skip(), you know the +.next(), just “slap” them together and we're done for 😁 Well, I got +suggested to use .nth() that does exactly the combination of the two mentioned +methods on iterators:

-            match it.clone().skip(skip).next().unwrap() {
+ match it.clone().nth(skip).unwrap() {

Day 23: Unstable Diffusion

tl;dr

Simulating movement of elves around with a set of specific rules.

Solution

There's not much to mention since it's just a cellular automaton simulation +(even though the AoC rules for cellular automatons usually get out of hand +😉).

Although I had a need to determine boundaries of the elves' positions and ended +up with a nasty DRY violation. Knowing that you you're looking for maximum and +minimum that are, of course, exactly the same except for initial values and +comparators, it looks like a rather simple fix, but typing in Rust is something +else, right? In the end I settled for a function that computes both boundaries +without any duplication while using a closure:

fn get_bounds(positions: &Input) -> (Vector2D<isize>, Vector2D<isize>) {
let f = |init, cmp: &dyn Fn(isize, isize) -> isize| {
positions
.iter()
.fold(Vector2D::new(init, init), |acc, elf| {
Vector2D::new(cmp(acc.x(), elf.x()), cmp(acc.y(), elf.y()))
})
};

(f(isize::MAX, &min::<isize>), f(isize::MIN, &max::<isize>))
}

This function returns a pair of 2D vectors that represent opposite points of the +bounding rectangle of all elves.

You might ask why would we need a closure and the answer is that positions +cannot be captured from within the nested function, only via closure. One more +fun fact on top of that is the type of the comparator

&dyn Fn(isize, isize) -> isize

Once we remove the dyn keyword, compiler yells at us and also includes a way +how to get a more thorough explanation of the error by running

$ rustc --explain E0782

which shows us

Trait objects must include the `dyn` keyword.

Erroneous code example:

```
trait Foo {}
fn test(arg: Box<Foo>) {} // error!
```

Trait objects are a way to call methods on types that are not known until
runtime but conform to some trait.

Trait objects should be formed with `Box<dyn Foo>`, but in the code above
`dyn` is left off.

This makes it harder to see that `arg` is a trait object and not a
simply a heap allocated type called `Foo`.

To fix this issue, add `dyn` before the trait name.

```
trait Foo {}
fn test(arg: Box<dyn Foo>) {} // ok!
```

This used to be allowed before edition 2021, but is now an error.
Rant

Not all of the explanations are helpful though, in some cases they might be even +more confusing than helpful, since they address very simple use cases.

As you can see, even in this case there are two sides to the explanations:

  • it explains why you need to use dyn, but
  • it still mentions that trait objects need to be heap-allocated via Box<T> +that, as you can see in my snippet, does not apply here 😄 IMO it's +caused by the fact that we are borrowing it and therefore we don't need to +care about the size or whereabouts of it.
C++ parallel

If you dive into the explanation above, you can notice that the Box<dyn Trait> +pattern is very helpful for using types that are not known during compile-time. +You would use a very similar approach in C++ when parsing some data structure +from input (let's say JSON for example).

On the other hand, in this case, it doesn't really make much sense, cause you +can clearly see that the types are known during the compile-time, which in +C++ could be easily resolved by templating the helper function.

Day 24: Blizzard Basin

tl;dr

Navigating your way through a basin with series of blizzards that move around +you as you move.

caution

It's second to last day and I went “bonkers” on the Rust 😄 Proceed to +read Solution part on your own risk.

Solution

You are given a map with blizzards all over the place and you're supposed to +find the minimum time it requires you to walk through the basin without getting +in any of the blizzards.

Breakdown

Relatively simple, yet a bit annoying, approach can be taken. It's technically +a shortest-path algorithm implementation with some relaxation restrictions and +being able to stay on one position for some time, so each vertex of the graph +is determined by the position on the map and the timestamp. I have chosen to +use Vector3D<usize>, since x and y attributes can be used for the position +and, well, let's use z for a timestamp, cause why not, right? 😉

Evaluating the blizzards

caution

I think that this is the most perverted abuse of the traits in the whole 4 weeks +of AoC in Rust…

The blizzards move along their respective directions in time and loop around in +their respective row/column. Each vertex holds position and time, so we can +just index the basin with the vertex itself, right? Yes, we can 😈

Fun fact

While writing this part, I've recognized unnecessary verbosity in the code and +cleaned it up a bit. The changed version is shown here and the original was just +more verbose.

I'll skip the boring parts of checking bounds and entry/exit of the basin 😉 +We can easily calculate positions of the blizzards using a modular arithmetics:

impl Index<Position> for Basin {
type Output = char;

fn index(&self, index: Position) -> &Self::Output {
// ‹skipped boring parts›

// We need to account for the loops of the blizzards
let width = self.cols - 2;
let height = self.rows - 2;

let blizzard_origin = |size, d, t, i| ((i - 1 + size + d * (t % size)) % size + 1) as usize;
[
(
index.y() as usize,
blizzard_origin(width, -1, index.z(), index.x()),
'>',
),
(
index.y() as usize,
blizzard_origin(width, 1, index.z(), index.x()),
'<',
),
(
blizzard_origin(height, -1, index.z(), index.y()),
index.x() as usize,
'v',
),
(
blizzard_origin(height, 1, index.z(), index.y()),
index.x() as usize,
'^',
),
]
.iter()
.find_map(|&(y, x, direction)| {
if self.map[y][x] == direction {
Some(&self.map[y][x])
} else {
None
}
})
.unwrap_or(&'.')
}
}

As you can see, there is an expression for calculating the original position and +it's used multiple times, so why not take it out to a lambda, right? 😉

I couldn't get the rustfmt to format the for-loop nicely, so I've just +decided to go with iterating over an elements of a slice. I have used, once +again, a combination of two functions (find_map in this case) to do 2 things +at once and at the end, if we haven't found any blizzard, we just return the +empty space.

I think it's a very nice (and naughty) way how to use the Index trait, don't +you think?

Shortest-path algorithm

For the shortest path you can choose and adjust any of the common shortest-path +algorithms, in my case, I have decided to use A* instead of Dijkstra's +algorithm, since it better reflects the cost function.

Comparison of costs

With the Dijkstra's algorithm I would proceed with the time attribute used as +a priority for the queue.

Whereas with the A*, I have chosen to use both time and Manhattan distance +that promotes vertices closer to the exit and with a minimum time taken.

Cost function is, of course, a closure 😉

let cost = |p: Position| p.z() as usize + exit.y().abs_diff(p.y()) + exit.x().abs_diff(p.x());

And also for checking the possible moves from the current vertex, I have +implemented, yet another, closure that yields an iterator with the next moves:

let next_positions = |p| {
[(0, 0, 1), (0, -1, 1), (0, 1, 1), (-1, 0, 1), (1, 0, 1)]
.iter()
.filter_map(move |&(x, y, t)| {
let next_p = p + Vector3D::new(x, y, t);

if basin[next_p] == '.' {
Some(next_p)
} else {
None
}
})
};

Min-heap

In this case I had a need to use the priority queue taking the elements with the +lowest cost as the prioritized ones. Rust only offers you the BinaryHeap and +that is a max-heap. One of the ways how to achieve a min-heap is to put the +elements in wrapped in a Reverse (as is even showed in the linked docs of +the BinaryHeap). However the wrapping affects the type of the heap and also +popping the most prioritized elements yields values wrapped in the Reverse.

For this purpose I have just taken the max-heap and wrapped it as a whole in a +separate structure providing just the desired methods:

use std::cmp::{Ord, Reverse};
use std::collections::BinaryHeap;

pub struct MinHeap<T> {
heap: BinaryHeap<Reverse<T>>,
}

impl<T: Ord> MinHeap<T> {
pub fn new() -> MinHeap<T> {
MinHeap {
heap: BinaryHeap::new(),
}
}

pub fn push(&mut self, item: T) {
self.heap.push(Reverse(item))
}

pub fn pop(&mut self) -> Option<T> {
self.heap.pop().map(|Reverse(x)| x)
}
}

impl<T: Ord> Default for MinHeap<T> {
fn default() -> Self {
Self::new()
}
}

Rest is just the algorithm implementation which is not that interesting.

Day 25: Full of Hot Air

tl;dr

Playing around with a numbers in a special base.

Getting flashbacks to the IB111 Foundations of Programming… Very nice “problem” +with a rather easy solution, as the last day always seems to be.

Solution

Implementing 2 functions, converting from the SNAFU base and back to the SNAFU +base representation. Let's do a bit more though! I have implemented two functions:

  • from_snafu
  • to_snafu

Now it is apparent that all I do is number to string and string to number. Hmm… +that sounds familiar, doesn't it? Let's introduce a structure for the SNAFU numbers +and implement the traits that we need.

Let's start with a structure:

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct SNAFU {
value: i64,
}

Converting from &str

We will start by implementing the FromStr trait that will help us parse our input. +This is rather simple, I can just take the from_snafu function, copy-paste it +into the from_str method and the number I get will be wrapped in Result and +SNAFU structure.

Converting to String

This is more fun. In some cases you need to implement only one trait and others +are automatically implemented using that one trait. In our case, if you look in +the documentation, you can see that ToString trait is automatically implemented +for any type that implements Display trait.

Let's implement the Display trait then. We should be able to use the to_snafu +function and just take the self.value from the SNAFU structure.

And for the convenience of tests, we can also implement a rather simple From<i64> +trait for the SNAFU.

Adjusting the code

After those changes we need to adjust the code and tests.

Parsing of the input is very easy, before we have used the lines, now we parse +everything:

     fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
- file_to_lines(pathname)
+ file_to_structs(pathname)
}

Part 1 needs to be adjusted a bit too:

     fn part_1(input: &Input) -> Output {
- to_snafu(input.iter().map(|s| from_snafu(s)).sum())
+ SNAFU::from(input.iter().map(|s| s.value).sum::<i64>()).to_string()
}

You can also see that it simplifies the meaning a bit and it is more explicit than +the previous versions.

And for the tests:

     #[test]
fn test_from() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(from_snafu(s), *n);
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(s.parse::<SNAFU>().unwrap().value, n);
}
}

#[test]
fn test_to() {
- for (n, s) in EXAMPLES.iter() {
- assert_eq!(to_snafu(*n), s.to_string());
+ for (&n, s) in EXAMPLES.iter() {
+ assert_eq!(SNAFU::from(n).to_string(), s.to_string());
}

Summary

Let's wrap the whole thing up! Keeping in mind both AoC and the Rust…

Finished advent calendar :smile:

Advent of Code

This year was quite fun, even though most of the solutions and posts came in +later on (cough in '23 cough). Day 22 was the most obnoxious one… And also +it feels like I used priority queues and tree data structures a lot 👀

with Rust

I must admit that a lot of compiler warnings and errors were very useful. Even +though I still found some instances where they didn't help at all or cause even +worse issues than I had. Compilation times have been addressed with the caching.

Building my first tree data structure in Rust has been a very “interesting” +journey. Being able to write a more generic BFS algorithm that allows you to not +duplicate code while still mantaining the desired functionality contributes to +a very readable code.

I am definitely much more aware of the basic things that bloated Python is +missing, yet Rust has them…

Using explicit types and writing down placeholder functions with todo!() +macros is very pleasant, since it allows you to easily navigate the type system +during the development when you don't even need to be sure how are you going to +put the smaller pieces together.

I have used a plethora of traits and also implemented some of them to either be +idiomatic, or exploit the syntactic sugar they offer. Deriving the default trait +implementation is also very helpful in a lot of cases, e.g. debugging output, +copying, equality comparison, etc.

I confess to touching more “cursed” parts of the Rust, such as macros to +declutter the copy-paste for tests or writing my own structures that need to +carry a lifetime for their own fields.

tl;dr Relatively pleasant language until you hit brick wall 😉


See you next year! Maybe in Rust, maybe not 🙃

]]>
+ me+blog@mfocko.xyz (Matej Focko) + advent-of-code + advent-of-code-2022 + rust +
+ + <![CDATA[3rd week of Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/3rd-week + https://blog.mfocko.xyz/blog/aoc-2022/3rd-week + Thu, 06 Jul 2023 21:00:00 GMT + + Let's go through the third week of Advent of Code in Rust.

Day 15: Beacon Exclusion Zone

tl;dr

Triangulating a distress beacon based on the information from the sensors.

Solution

Relatively easy thing to implement, no major Rust issues hit.

Day 16: Proboscidea Volcanium

tl;dr

Finding a max flow in a graph given some time constraints.

Solution

I have used some interesting things to implement this and make it easier for me.

Indexing in graph

I have come across a situation where I needed to keep more information regarding +the graph… In that case you can, of course, create a structure and keep it in, +but once you have multiple members in the structure it gets harder to work with +since you need to address the fields in the structure. When you work with graph, +you frequently need to access the vertices and in this case it felt a lot easier +to implement the indexing in a graph, rather than explicitly access the +underlying data structure.

Here you can see a rather short snippet from the solution that allows you to +“index” the graph:

impl Index<&str> for Graph {
type Output = Vertex;

fn index(&self, index: &str) -> &Self::Output {
&self.g[index]
}
}

Cartesian product

During the implementation I had to utilize Floyd-Warshall algorithm for finding +the shortest path between pairs of vertices and utilized the iproduct! macro +from the itertools. It is a very useful higher-order function that allows +you to keep the nesting of the loops at a minimum level while still maintaining +the same functionality.

“Implementing” an iterator

For the second part, you get to split the work between 2 actors. That way you +can achieve higher efficiency of the whole process that you're planning, but it +also makes it harder to evaluate algorithmically, since you need to check the +different ways the work can be split.

Being affected by functional programming brain damage™️, I have chosen to +do this part by function that returns an iterator over the possible ways:

fn pairings(
valves: &BTreeSet<String>,
) -> impl Iterator<Item = (BTreeSet<String>, BTreeSet<String>)> + '_ {
let mapping = valves.iter().collect_vec();

let max_mask = 1 << (valves.len() - 1);

(0..max_mask).map(move |mask| {
let mut elephant = BTreeSet::new();
let mut human = BTreeSet::new();

for (i, &v) in mapping.iter().enumerate() {
if (mask & (1 << i)) == 0 {
human.insert(v.clone());
} else {
elephant.insert(v.clone());
}
}

(human, elephant)
})
}

Day 17: Pyroclastic Flow

tl;dr

Simulating an autonomous Tetris where pieces get affected by a series of jets of +hot gas.

Solution

Similarly to the previous day I have created some iterators 😄

Collision detection

Once you need to check for collisions it is very helpful to be able to just +iterate through the positions that can actually collide with the wall or other +piece.

To get the desired behaviour, you can just compose few smaller functions:

fn occupied(shape: &[Vec<char>]) -> impl Iterator<Item = Position> + '_ {
shape.iter().enumerate().flat_map(|(y, row)| {
row.iter().enumerate().filter_map(move |(x, c)| {
if c == &'#' {
Some(Vector2D::new(x as isize, y as isize))
} else {
None
}
})
})
}

In the end, we get relative positions which we can adjust later when given the +specific positions from iterator. You can see some interesting parts in this:

  • .enumerate() allows us to get both the indices (coordinates) and the line +or, later on, the character itself,
  • .flat_map() flattens the iterator, i.e. when we return another iterator, +they just get chained instead of iterating over iterators (which sounds pretty +disturbing, doesn't it?),
  • and finally .filter_map() which is pretty similar to the “basic” .map() +with a one, key, difference that it expects the items of an iterator to be +mapped to an Option<T> from which it ignores nothing (as in None 😉) +and also unwraps the values from Some(…).

Infinite iterator

In the solution we cycle through both Tetris-like shapes that fall down and the +jets that move our pieces around. Initially I have implemented my own infinite +iterator that just yields the indices. It is a very simple, yet powerful, piece +of code:

struct InfiniteIndex {
size: usize,
i: usize,
}

impl InfiniteIndex {
fn new(size: usize) -> InfiniteIndex {
InfiniteIndex { size, i: size - 1 }
}
}

impl Iterator for InfiniteIndex {
type Item = usize;

fn next(&mut self) -> Option<Self::Item> {
self.i = (self.i + 1) % self.size;
Some(self.i)
}
}

However when I'm looking at the code now, it doesn't really make much sense… +Guess what, we can use a built-in function that is implemented on iterators for +that! The function is called .cycle()

On the other hand, I am not going to switch to that function, since it would +introduce an another myriad of issues caused by the fact that I create iterators +right away in the constructor of my structure and the iterators would borrow +both the jets and shapes which would introduce a lifetime dependency into the +structure.

Day 18: Boiling Boulders

tl;dr

Let's compute a surface area of some obsidian approximated via coordinates of +cubes.

Solution

This day is kinda interesting, because it shows how easily you can complicate the +problem and also how much can you screw yourself over with the optimization and +“smart” approach.

For the first part you need to find the surface area of an obsidian that is +approximated by cubes. Now, that is a very easy thing to do, just keep the track +of already added cubes, and check if the newly added cube touches any face of any +other cube. Simple, and with a BTreeSet relatively efficient way to do it.

However the second part lets you on a secret that there may be some surface area +from the “inside” too and you want to know only the one from the outside of the +obsidian. I have seen some solutions later, but if you check your data, you might +notice that the bounding box of all the cubes isn't that big at all. Therefore I +chose to pre-construct the box beforehand, fill in the cubes and then just run a +BFS turning all the lava on the outside into the air. Now you just need to check +cubes and count how many of their faces touch the air.

Day 19: Not Enough Minerals

tl;dr

Finding out the best strategy for building robots to collect geodes.

Solution

Not much interesting stuff to mention apart from the suggestion to never believe +that the default implementation given by derive macro is what you want, it +doesn't have to be. 😄

Day 20: Grove Positioning System

tl;dr

Shuffling around the circular linked list to find the coordinates.

Now, small rant for this day is in place. They've never mentioned that coordinates +can repeat and therefore the values are non-unique. This is something that did +not happen in the given sample, but was present in the user input. It took »a lot« +to realize that this is the issue.

Solution

I have tried implementing a circular linked list for this… and I have failed +miserably. To be fair, I still have no clue why. It was “fun” to play around with +the Rc<RefCell<T>>. In the end I failed on wrong answer. I have also encountered +a rather interesting issue with .borrow_mut() method being used on Rc<RefCell<T>>.

.borrow_mut()

Consider the following snippet of the code (taken from the documentation):

use std::cell::{RefCell, RefMut};
use std::collections::HashMap;
use std::rc::Rc;
// use std::borrow::BorrowMut;

fn main() {
let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
// Create a new block to limit the scope of the dynamic borrow
{
let mut map: RefMut<_> = shared_map.borrow_mut();
map.insert("africa", 92388);
map.insert("kyoto", 11837);
map.insert("piccadilly", 11826);
map.insert("marbles", 38);
}

// Note that if we had not let the previous borrow of the cache fall out
// of scope then the subsequent borrow would cause a dynamic thread panic.
// This is the major hazard of using `RefCell`.
let total: i32 = shared_map.borrow().values().sum();
println!("{total}");
}

We allocate a hash map on the heap and then in the inner block, we borrow it as +a mutable reference, so that we can use it.

note

It is a very primitive example for Rc<RefCell<T>> and mutable borrow.

If you uncomment the 4th line with use std::borrow::BorrowMut;, you cannot +compile the code anymore, because of

   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
--> src/main.rs:10:34
|
10 | let mut map: RefMut<_> = shared_map.borrow_mut();
| --------- ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `RefMut`, found mutable reference
| |
| expected due to this
|
= note: expected struct `RefMut<'_, _>`
found mutable reference `&mut Rc<RefCell<HashMap<_, _>>>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:11:13
|
11 | map.insert("africa", 92388);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:12:13
|
12 | map.insert("kyoto", 11837);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:13:13
|
13 | map.insert("piccadilly", 11826);
| ^^^^^^ method not found in `RefMut<'_, _>`

error[E0599]: no method named `insert` found for struct `RefMut<'_, _>` in the current scope
--> src/main.rs:14:13
|
14 | map.insert("marbles", 38);
| ^^^^^^ method not found in `RefMut<'_, _>`

Some errors have detailed explanations: E0308, E0599.
For more information about an error, try `rustc --explain E0308`.
error: could not compile `playground` due to 5 previous errors

It might seem a bit ridiculous. However, I got to a point where the compiler +suggested use std::borrow::BorrowMut; and it resulted in breaking parts of the +code that worked previously. I think it may be a good idea to go over what is +happening here.

.borrow_mut() on Rc<RefCell<T>>

Let's consider a variable x of type Rc<RefCell<T>>. What happens when you +call .borrow_mut() on it? We can look at the Rc type, and… hang on! There is +neither .borrow_mut() method or BorrowMut trait implemented. How can we do it +then?

Let's go further and we can see that RefCell<T> implements a .borrow_mut() +method. OK, but how can we call it on the Rc<T>? Easily! Rc<T> implements +Deref<T> and therefore you can call methods on Rc<T> objects as if they were +T objects. If we read on Deref coercion, we can see the following:

If T implements Deref<Target = U>, …:

  • T implicitly implements all the (immutable) methods of the type U.

What is the requirement for the .borrow_mut() on RefCell<T>? Well, it needs +&self, so the Deref implements the .borrow_mut() for the Rc<RefCell<T>>.

BorrowMut trait

I have not been able to find a lot on this trait. My guess is that it provides a +method instead of a syntactic sugar (&mut x) for the mutable borrow. And also +it provides default implementations for the types:

impl BorrowMut<str> for String

impl<T> BorrowMut<T> for &mut T
where
T: ?Sized,

impl<T> BorrowMut<T> for T
where
T: ?Sized,

impl<T, A> BorrowMut<[T]> for Vec<T, A>
where
A: Allocator,

impl<T, A> BorrowMut<T> for Box<T, A>
where
A: Allocator,
T: ?Sized,

impl<T, const N: usize> BorrowMut<[T]> for [T; N]
Conflict

Now the question is why did it break the code… My first take was that the type +Rc<RefCell<T>> has some specialized implementation of the .borrow_mut() and +the use overrides it with the default, which is true in a sense. However +there is no specialized implementation. Let's have a look at the trait and the +type signature on the RefCell<T>:

// trait
pub trait BorrowMut<Borrowed>: Borrow<Borrowed>
where
Borrowed: ?Sized,
{
fn borrow_mut(&mut self) -> &mut Borrowed;
}

// ‹RefCell<T>.borrow_mut()› type signature
pub fn borrow_mut(&self) -> RefMut<'_, T>

I think that we can definitely agree on the fact that RefMut<'_, T> is not the +RefCell<T>.

In my opinion, RefCell<T> implements a separate .borrow_mut() rather +than implementing the interface, because it cannot satisfy the type requirements +of the trait.

caution

I wonder how are we expected to deal with this conflict, if and when, we need +both the .borrow_mut() of the trait and .borrow_mut() of the RefCell<T>.

Fun fact

I was suggested by the compiler to do use std::borrow::BorrowMut; and break the +code.

So much for the almighty and helpful compiler…

Day 21: Monkey Math

tl;dr

Computing an expression tree and then also finding ideal value for a node.

Solution

Relatively simple, until you get to the 2nd part where you start to practice +a lot of the copy-paste. I have managed to sneak some perverted stuff in there +though :) Let's go through the details.

Default trait

For the first time and twice I had a need to have a default value for my types, +enumerations in this case. Rust offers a very nice trait1 that is described +as:

A trait for giving a type a useful default value.

I guess it sums it up nicely. The more interesting part about this is the fact +that you can use the macro machinery to save yourself some typing. If you have +enumeration of which the default value doesn't bear any parameter, you can just +do2:

#[derive(Default)]
enum Color {
#[default]
White,
Gray,
Black,
}

Abusing negation

If you want to use a unary minus operator on your own type, you can implement +a Neg trait3. I was dealing with a binary tree and needed a way how to look +at the other side, so I have just implemented the negation for flipping between +left and right 😄


  1. Default docs
  2. Pardon my example from the graph algorithms ;)
  3. Neg docs
]]>
+ me+blog@mfocko.xyz (Matej Focko) + advent-of-code + advent-of-code-2022 + rust +
+ + <![CDATA[Sort the matrix diagonally]]> + https://blog.mfocko.xyz/blog/leetcode/sort-diagonally + https://blog.mfocko.xyz/blog/leetcode/sort-diagonally + Sat, 04 Mar 2023 23:15:00 GMT + + Let's try to solve one of the LeetCode challenges in easy and hard mode at the +same time.

Problem description

A matrix diagonal is a diagonal line of cells starting from some cell in +either the topmost row or leftmost column and going in the bottom-right direction +until reaching the matrix's end. For example, the matrix diagonal starting +from mat[2][0], where mat is a 6 x 3 matrix, includes cells mat[2][0], +mat[3][1], and mat[4][2].

Given an m x n matrix mat of integers, sort each matrix diagonal in ascending +order and return the resulting matrix.

Example

Image describing the problem

Skeleton and initial adjustments

We are given the following skeleton for the C++ and the given challenge:

class Solution {
public:
vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {

}
};

The task is to sort the passed matrix diagonally and then return it. First of all, +I don't like to solve this in a web browser, so we'll need to adjust it accordingly +for running it locally. We'll start by including the vector header and using +fully-qualified namespaces1 and also adding few tests:

#include <cassert>
#include <vector>

using matrix = std::vector<std::vector<int>>;

class Solution {
public:
matrix diagonalSort(matrix& mat)
{
}
};

static void test_case_1()
{
// Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
// Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 },
std::vector { 2, 2, 1, 2 },
std::vector { 1, 1, 1, 2 } })
== std::vector { std::vector { 1, 1, 1, 1 },
std::vector { 1, 2, 2, 2 },
std::vector { 1, 2, 3, 3 } }));
}

static void test_case_2()
{
// Input: mat =
// [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
// Output:
// [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]

Solution s;
assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 },
std::vector { 23, 55, 17, 45, 15, 52 },
std::vector { 75, 31, 36, 44, 58, 8 },
std::vector { 22, 27, 33, 25, 68, 4 },
std::vector { 84, 28, 14, 11, 5, 50 } })
== std::vector { std::vector { 5, 17, 4, 1, 52, 7 },
std::vector { 11, 11, 25, 45, 8, 69 },
std::vector { 14, 23, 25, 44, 58, 15 },
std::vector { 22, 27, 31, 36, 50, 66 },
std::vector { 84, 28, 75, 33, 55, 68 } }));
}

int main()
{
test_case_1();
test_case_2();

return 0;
}

We need to return the matrix, but we're given a reference to the input matrix. We +can easily abuse the C++ here and just switch the reference to value, this way +the matrix will be copied when passed to the function, we can sort the copy and +just return it back. And we also get yelled by the compiler for the fact that the +method doesn't return anything yet, so to make it “shut up” we will just return +the input for now:

-    matrix diagonalSort(matrix& mat)
+ matrix diagonalSort(matrix mat)
{
+ return mat;
}

Now, we get the copy and we're good to go.

Naïve solution

As you may know, C++ offers a plethora of functions that can be used to your +advantage, given that you know how to “bend” the data structures accordingly.

What does that mean for us? Well, we have an std::sort, we can use it, right? +Let's have a look at it:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );

This overload is more than we need. What does it do? It just sorts the elements +in the range [first, last) using operator< on them. We can't sort the whole +matrix using this, but… we can sort just »one« diagonal without doing much work +on our end.

What is the RandomIt type though? If we look more into the documentation, we +can easily find the requirements for it and also learn that it's a random access +iterator and allows swapping its values at the same time.

Random access iterator

What is the random access iterator though? We can find it in a documentation +and see the following description:

A LegacyRandomAccessIterator is a LegacyBidirectionalIterator +that can be moved to point to any element in constant time.

After that we can see all the requirements for it being listed. I don't feel like +reading them right now, so we will just use it and see where the compilation blows +up, i.e. “compiler-assisted development2 if you will ;)

Now we know that we can use std::sort to sort the diagonal itself, but we also +need to get the diagonals somehow. I'm rather lazy, so I'll just delegate it to +someone else3. And that way we get

matrix diagonalSort(matrix mat)
{
// we iterate over the diagonals
for (auto d : diagonals(mat)) {
// and we sort each diagonal
std::sort(d.begin(), d.end());
}

// we take the matrix by copy, so we can sort in-situ and return the copy
// that we sorted
return mat;
}

This solution looks very simple, doesn't it? Well, cause it is. +Let's try compiling it:

matrix-sort.cpp:11:23: error: use of undeclared identifier 'diagonals' [clang-diagnostic-error]
for (auto d : diagonals(mat)) {
^
Found compiler error(s).
make: *** [makefile:14: tidy] Error 1

OK, seems about right. We haven't implemented the diagonals yet. And based on +what we've written so far, we need a function or a class diagonals that will +give us the diagonals we need.

Implementing the diagonals

Cool, so we need the function that will let us go through each and every diagonal +in our matrix. We use the for-range loop, so whatever we get back from the +diagonals must support .begin() and .end(). Since I am a masochist, we will +do such functionality for a matrix of any type, not just the int from the challenge.

As I said, we need to be able to

  • construct the object
  • get the beginning
  • get the end (the “sentinel”)
template <typename T>
class diagonals {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& _matrix;

public:
diagonals(matrix_t& m)
: _matrix(m)
{
}
diagonals_iter begin()
{
/* TODO */
}
diagonals_iter end()
{
/* TODO */
}
};

Now we have a diagonals that we can use to go through the diagonals. We haven't +implemented the core of it yet. Let's go through what we have for now.

We have a templated class with templated T that is used as a placeholder for any +type we would store in the matrix. Because I'm lazy, I have defined the matrix_t +type that is a “shortcut” for std::vector<std::vector<T>>, so I don't have to +type it out all the time. Of course, we need to store the matrix, we are given, +as a private attribute. And then just have the constructor and the 2 methods we +need for the for-range.

Iterating over diagonals

Now that we have an object that will allow us to iterate through the diagonals, +we need to implement the iterating itself. We need to go through all of them, so +we have multiple options how to do so. I have decided to start from the “main” +diagonal that starts at (0, 0) index and then proceed with the diagonals starting +in the first row, followed by the rest of the diagonals in the first column.

We need to be able to tell that we've iterated through all of them, and also we +need to know which diagonal is next. For that purpose we will pass the indices +of the first cell on the diagonal. That way we can always tell how to move forward.

We will start by updating the begin and end to reflect our choice accordingly.

diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; }
diagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; }

For the begin we return the first diagonal that starts at (0, 0). And because +we have decided to do the diagonals in the first column at the end, the first +diagonal that is not a valid one is the one at (0, height). Apart from the +indices, we also need to pass reference to the matrix itself.

note

You may have noticed that we also include the diagonals that have length 1, +specifically the ones at (0, height - 1) and (width - 1, 0). We are implementing +an iterator that should not care about the way it's being used. Therefore, we +don't care about the fact they don't need to be sorted.

Cool, let's leave the iterator itself to someone else, right?4

Implementing the iterator over diagonals

We can start with a simple skeleton based on the information that we pass from +the diagonals. Also to utilize the matrix_t and also contain implementation +details hidden away, we will put this code into the diagonals class.

class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}
};

In this case we will be implementing a “simple” forward iterator, so we don't +need to implement a lot. Notably it will be:

  • inequality operator (we need to know when we reach the end and have nothing to +iterate over)
  • preincrementation operator (we need to be able to move around the iterable)
  • dereference operator (we need to be able to retrieve the objects we iterate +over)
class diagonals_iter {
matrix_t& m;
std::size_t x;
std::size_t y;

public:
diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator!=(const diagonals_iter& rhs) const
{
// iterators are not equal if they reference different matrices, or
// their positions differ
return m != rhs.m || x != rhs.x || y != rhs.y;
}

diagonals_iter& operator++()
{
if (y != 0) {
// iterating through diagonals down the first column
y++;
return *this;
}

// iterating the diagonals along the first row
x++;
if (x == m.front().size()) {
// switching to diagonals in the first column
x = 0;
y++;
}

return *this;
}

diagonal<T> operator*() const { return diagonal { m, x, y }; }
};

Let's go one-by-one. Inequality operator is rather simple, just compare iterator's +attributes field-by-field. If you think about it, checking inequality of two 2D +vectors may be a bit inefficient, therefore, we can swap around and check it as +a last thing.

-        return m != rhs.m || x != rhs.x || y != rhs.y;
+ return x != rhs.x || y != rhs.y || m != rhs.m;

Preincrementation is where the magic happens. If you have a better look, you can +see two branches of this operation:

  1. When y != 0 (we're iterating over the diagonals in the first column) +In this case, we just bump the row and we're done.
  2. When y == 0 (we're iterating over the diagonals in the first row) +In this case, we bump the column and check if we haven't gotten out of bounds, +i.e. the end of the first row. If we get out of the bounds, we're continuing +with the second diagonal in the first column.

Dereferencing the iterator must “yield” something. In our case it will be the +diagonal that we want to sort. For sorting we need just the iterators that can +move around said diagonal. The simplest thing, we can do, is to delegate it to +something else. In our case it will be a class called diagonal.

Implementing the diagonal itself

After implementing the iterator over diagonals, we know that all we need to describe +a diagonal is the matrix itself and the “start” of the diagonal (row and column). +And we also know that the diagonal must provide some iterators for the std::sort +function. We can start with the following skeleton:

template <typename T>
class diagonal {
using matrix_t = std::vector<std::vector<T>>;

matrix_t& matrix;
std::size_t x;
std::size_t y;

public:
diagonal(matrix_t& matrix, std::size_t x, std::size_t y)
: matrix(matrix)
, x(x)
, y(y)
{
}

diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; }

diagonal_iter end() const
{
auto max_x = matrix[y].size();
auto max_y = matrix.size();

// we need to find the distance in which we get out of bounds (either in
// column or row)
auto steps = std::min(max_x - x, max_y - y);

return diagonal_iter { matrix, x + steps, y + steps };
}
};

Initialization is rather simple, we just “keep” the stuff we get, begin is the +simplest, we just delegate.

In case of the end, it gets more complicated. We need to know where is the “end” +of the diagonal. Since end should point to the first element “after” the iterable, +we know that it's the first position of the iterator where either y becomes +matrix.size() or x becomes matrix[y].size(). Also we are moving along diagonal, +duh, therefore we can deduce the first “position” afterwards by minimal amount of +steps to get out of the any column or row, hence std::min(max_x - x, max_y - y). +Final position is then computed simply by adding the steps to the beginning of +the diagonal.

Now we just need to finish the iterator for the diagonal itself and we're done.

Implementing diagonal_iter

This part is the hardest from all we need to do. It's because of the requirements +of the std::sort that requires us to implement a random access iterator. I have +briefly described it above, and “in a nutshell” it means that we need to implement +an iterator that can move in constant time along the diagonal in any amount of +steps.

Let's go through all of the functionality that our iterator needs to support to +be used in std::sort. We need the usual operations like:

  • equality/inequality
  • incrementation
  • dereferencing

We will also add all the types that our iterator uses with the category of the +iterator, i.e. what interface it supports:

class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }
};

This is pretty similar to the previous iterator, but now we need to implement the +remaining requirements of the random access iterator. Let's see what those are:

  • decrementation - cause we need to be able to move backwards too, since random access iterator extends the interface of bidirectional iterator
  • moving the iterator in either direction by steps given as an integer
  • being able to tell the distance between two iterators
  • define an ordering on the iterators

Let's fill them in:

class diagonal_iter {
// we need to keep reference to the matrix itself
matrix_t& m;

// we need to be able to tell our current position
std::size_t x;
std::size_t y;

public:
using difference_type = std::ptrdiff_t;
using value_type = T;
using pointer = T*;
using reference = T&;
using iterator_category = std::random_access_iterator_tag;

diagonal_iter(matrix_t& matrix,
std::size_t x,
std::size_t y)
: m(matrix)
, x(x)
, y(y)
{
}

bool operator==(const diagonal_iter& rhs) const
{
return x == rhs.x && y == rhs.y && m == rhs.m;
}

diagonal_iter& operator++()
{
// we are moving along the diagonal, so we increment both ‹x› and ‹y› at
// the same time
x++;
y++;
return *this;
}

reference operator*() const { return m[y][x]; }

// exactly opposite to the incrementation
diagonal_iter operator--()
{
x--;
y--;
return *this;
}

// moving ‹n› steps back is same as calling decrementation ‹n›-times, so we
// can just return a new iterator and subtract ‹n› from both coordinates in
// the matrix
diagonal_iter operator-(difference_type n) const
{
return diagonal_iter { m, x - n, y - n };
}

// here we assume that we are given two iterators on the same diagonal
difference_type operator-(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x - rhs.x;
}

// counterpart of moving ‹n› steps backwards
diagonal_iter operator+(difference_type n) const
{
return diagonal_iter { m, x + n, y + n };
}

// we compare the coordinates, and also assume that those 2 iterators are
// lying on the same diagonal
bool operator<(const diagonal_iter& rhs) const
{
assert(m == rhs.m);
return x < rhs.x && y < rhs.y;
}
};

At this point we could probably try and compile it, right? If we do so, we will +get yelled at by a compiler for the following reasons:

/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __next;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1817:11: note: in instantiation of function template specialization 'std::__unguarded_linear_insert<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Val_less_iter>' requested here
std::__unguarded_linear_insert(__i,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1849:9: note: in instantiation of function template specialization 'std::__insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1830:2: error: no matching function for call to '__unguarded_linear_insert' [clang-diagnostic-error]
std::__unguarded_linear_insert(__i,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1850:9: note: in instantiation of function template specialization 'std::__unguarded_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1940:9: note: in instantiation of function template specialization 'std::__final_insertion_sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__final_insertion_sort(__first, __last, __comp);
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1782:5: note: candidate template ignored: substitution failure [with _RandomAccessIterator = diagonal<int>::diagonal_iter, _Compare = __gnu_cxx::__ops::_Val_less_iter]
__unguarded_linear_insert(_RandomAccessIterator __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1923:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]
__last = __cut;
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1937:9: note: in instantiation of function template specialization 'std::__introsort_loop<diagonal<int>::diagonal_iter, long, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__introsort_loop(__first, __last,
^
/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:4820:12: note: in instantiation of function template specialization 'std::__sort<diagonal<int>::diagonal_iter, __gnu_cxx::__ops::_Iter_less_iter>' requested here
std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
^
matrix-sort.cpp:161:18: note: in instantiation of function template specialization 'std::sort<diagonal<int>::diagonal_iter>' requested here
std::sort(d.begin(), d.end());
^
matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^

That's a lot of noise, isn't it? Let's focus on the important parts:

/usr/bin/../lib/gcc/x86_64-redhat-linux/12/../../../../include/c++/12/bits/stl_algo.h:1792:11: error: object of type 'diagonal<int>::diagonal_iter' cannot be assigned because its copy assignment operator is implicitly deleted [clang-diagnostic-error]

matrix-sort.cpp:17:19: note: copy assignment operator of 'diagonal_iter' is implicitly deleted because field 'm' is of reference type 'diagonal<int>::matrix_t &' (aka 'vector<std::vector<int>> &')
matrix_t& m;
^

Ah! We have a reference in our iterator, and this prevents us from having a copy +assignment operator (that is used “somewhere” in the sorting algorithm). Well… +Let's just wrap it!

# we need to keep a different type than reference
- matrix_t& m;
+ std::reference_wrapper<matrix_t> m;

# in comparison we need to get the reference out of the wrapper first
- return x == rhs.x && y == rhs.y && m == rhs.m;
+ return x == rhs.x && y == rhs.y && m.get() == rhs.m.get();

# same when we return a reference to the “cell” in the matrix
- reference operator*() const { return m[y][x]; }
+ reference operator*() const { return m.get()[y][x]; }

# and finally in the assertions that we set for the “distance” and “less than”
- assert(m == rhs.m);
+ assert(m.get() == rhs.m.get());

We're done now! We have written an iterator over diagonals for a 2D vector. You can have a look at the final result here.


  1. just because I'm used to it and don't care about your opinion ;)
  2. exercise at your own risk
  3. me in 5 minutes in fact, but don't make me scared
  4. me in the next section…
]]>
+ me+blog@mfocko.xyz (Matej Focko) + cpp + leetcode + iterators +
+ + <![CDATA[2nd week of Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/2nd-week + https://blog.mfocko.xyz/blog/aoc-2022/2nd-week + Sun, 25 Dec 2022 23:15:00 GMT + + Let's go through the second week of Advent of Code in Rust.

Day 8: Treetop Tree House

tl;dr

We get a forest and we want to know how many trees are visible from the outside. +Apart from that we want to find the best view.

Nothing interesting. We are moving around 2D map though. And indexing can get a +bit painful when doing so, let's refactor it a bit ;) During the preparation for +the AoC, I have written Vector2D and now it's time to extend it with indexing +of Vec of Vecs. In my solution I was manipulating with indices in the following +way:

  • swapping them
  • checking whether they are correct indices for the Vec<Vec<T>>
  • indexing Vec<Vec<T>> with them
caution

I'm getting familiar with Rust and starting to “abuse” it… While doing so, I'm +also uncovering some “features” that I don't really like. Therefore I will mark +all of my rants with thicc «↯» mark and will try to “lock” them into their +own “box of hell”.

Swapping indices

Relatively simple implementation, just take the values, swap them and return new +vector.

impl<T: Copy> Vector2D<T> {
pub fn swap(&self) -> Self {
Self {
x: self.y,
y: self.x,
}
}
}

Pretty straight-forward implementation, but let's talk about the T: Copy. We +need to use it, since we are returning a new vector, with swapped values. +If we had values that cannot be copied, the only thing we could do, would be a +vector of references (and it would also introduce a lifetime, to which we'll get +later on). This is pretty similar with the operations on sets from the first week.

Indexing Vec

I will start with the indexing, cause bound-checking is a bit more… complicated +than I would like to.

pub fn index<'a, T, U>(v: &'a [Vec<U>], idx: &Vector2D<T>) -> &'a U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}

Let's talk about this mess… Body of the function is probably the most easy part +and should not be hard to understand, we just take the x and y and convert +them both to usize type that can be used later on for indexing.

The type signature of the function is where the fun is at 😉 We are trying +to convert unknown type to usize, so we must bound the T as a type that can +be converted to usize, that's how we got usize: TryFrom<T> which basically +says that usize must implement TryFrom<T> trait and therefore allows us to +convert the indices to actual usize indices. Using .unwrap() also forces us +to bound the error that can occur when converting T into usize, that's how +we get <usize as TryFrom<T>>::Error: Debug which loosely means

error during conversion of T into usize must implement Debug, +i.e. can be printed in some way or other

T: Copy is required by .try_into() which takes T by-value.

And now we are left only with the first line of the definition.

note

Skilled Rustaceans might notice that this implementation is rather flaky and can +break in multiple places at once. I'll get back to it…

Let's split it in multiple parts:

  • v: &'a [Vec<U>] represents the 2D Vec, we are indexing, Vec implements +Slice trait and clippy recommends using &[T] to &Vec<T>, exact details +are unknown to me
  • idx: &Vector2D<T> represents the indices which we use, we take them by +reference to avoid an unnecessary copy
  • -> &'a U means that we are returning a reference to some value of type U. +Now the question is what does the 'a mean, we can also see it as a generic +type declared along T and U. And the answer is relatively simple, 'a +represents a lifetime. We take the v by a reference and return a reference, +borrow checker validates all of the borrows (or references), so we need to +specify that our returned value has the same lifetime as the vector we have +taken by a reference, i.e. returned reference must live at least as long as the +v. This way we can “be sure” that the returned reference is valid.
Issues

First issue that our implementation has is the fact that we cannot get a mutable +reference out of that function. This could be easily resolved by introducing new +function, e.g. index_mut. Which I have actually done while writing this part:

pub fn index_mut<'a, T, U>(v: &'a mut [Vec<U>], idx: &Vector2D<T>) -> &'a mut U
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&mut v[y][x]
}
«↯» Why can't we use one function?

When we consider a Vec<T>, we don't need to consider containers as T, Rust +implements indexing as traits Index<T> and IndexMut<T> that do the dirty work +behind syntactic sugar of container[idx].

However, implementing of traits is not allowed for external types, i.e. types +that you haven't defined yourself. This means that you can implement indexing +over containers that you have implemented yourself, but you cannot use your own +types for indexing “built-in” types.

Another part of this rabbit hole is trait SliceIndex<T> that is of a relevance +because of

impl<T, I> Index<I> for [T]
where
I: SliceIndex<[T]>

impl<T, I, A> Index<I> for Vec<T, A>
where
I: SliceIndex<[T]>,
A: Allocator

impl<T, I, const N: usize> Index<I> for [T; N]
where
[T]: Index<I>

In other words, if your type implements SliceIndex<T> trait, it can be used +for indexing. As of now, this trait has all of its required methods experimental +and is marked as unsafe.

Another problem is a requirement for indexing either [Vec<T>] or Vec<Vec<T>>. +This requirement could be countered by removing inner type Vec<T> and constraining +it by a trait Index (or IndexMut respectively) in a following way

pub fn index<'a, C, T>(v: &'a [C], idx: &Vector2D<T>) -> &'a C::Output
where
usize: TryFrom<T>,
<usize as TryFrom<T>>::Error: Debug,
T: Copy,
C: Index<usize>
{
let (x, y): (usize, usize) = (idx.x.try_into().unwrap(), idx.y.try_into().unwrap());
&v[y][x]
}

Given this, we can also give a more meaningful typename for indexing type, such +as I.

Checking bounds

Now we can get to the boundary checks, it is very similar, but a more… dirty. +First approach that came up was to convert the indices in Vector2D to usize, +but when you add the indices up, e.g. when checking the neighbors, you can end +up with negative values which, unlike in C++, causes an error (instead of underflow +that you can use to your advantage; you can easily guess how).

So how can we approach this then? Well… we will convert the bounds instead of +the indices and that lead us to:

pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
usize: TryInto<T>,
<usize as TryInto<T>>::Error: Debug,
T: PartialOrd + Copy,
{
idx.y >= 0.try_into().unwrap()
&& idx.y < v.len().try_into().unwrap()
&& idx.x >= 0.try_into().unwrap()
&& idx.x
< v[TryInto::<usize>::try_into(idx.y).unwrap()]
.len()
.try_into()
.unwrap()
}

You can tell that it's definitely a shitty code. Let's improve it now! We will +get back to the original idea, but do it better. We know that we cannot convert +negative values into usize, but we also know that conversion like that +returns a Result<T, E> which we can use to our advantage.

pub fn in_range<T, U>(v: &[Vec<U>], idx: &Vector2D<T>) -> bool
where
T: Copy,
usize: TryFrom<T>,
{
usize::try_from(idx.y)
.and_then(|y| usize::try_from(idx.x).map(|x| y < v.len() && x < v[y].len()))
.unwrap_or(false)
}

Result<T, E> is a type similar to Either in Haskell and it allows us to chain +multiple operations on correct results or propagate the original error without +doing anything. Let's dissect it one-by-one.

try_from is a method implemented in TryFrom trait, that allows you to convert +types and either successfully convert them or fail (with a reasonable error). This +method returns Result<T, E>.

We call and_then on that result, let's have a look at the type signature of +and_then, IMO it explains more than enough:

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> Result<U, E>

OK… So it takes the result and a function and returns another result with +different value and different error. However we can see that the function, which +represents an operation on a result, takes just the value, i.e. it doesn't care +about any previous error. To make it short:

and_then allows us to run an operation, which can fail, on the correct result

We parsed a y index and now we try to convert the x index with try_from +again, but on that result we use map rather than and_then, why would that be?

pub fn map<U, F>(self, op: F) -> Result<U, E>
where
F: FnOnce(T) -> U

Huh… map performs an operation that cannot fail. And finally we use +unwrap_or which takes the value from result, or in case of an error returns the +default that we define.

How does this work then? If y is negative, the conversion fails and the error +propagates all the way to unwrap_or, if y can be a correct usize value, then +we do the same with x. If x is negative, we propagate the error as with y, +and if it's not, then we check whether it exceeds the higher bounds or not.

Solution

Relatively simple, you just need follow the rules and not get too smart, otherwise +it will get back at you.

Day 9: Rope Bridge

tl;dr

We get a rope with knots and we want to track how many different positions are +visited with the rope's tail.

By this day, I have come to a conclusion that current skeleton for each day +generates a lot of boilerplate. And even though it can be easily copied, it's +just a waste of space and unnecessary code. Let's “simplify” this (on one end +while creating monster on the other end). I've gone through what we need in the +preparations for the AoC. Let's sum up our requirements:

  • parsing
  • part 1 & 2
  • running on sample / input
  • tests

Parsing and implementation of both parts is code that changes each day and we +cannot do anything about it. However running and testing can be simplified!

Let's introduce and export a new module solution that will take care of all of +this. We will start by introducing a trait for each day.

pub trait Solution<Input, Output: Display> {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input;

fn part_1(input: &Input) -> Output;
fn part_2(input: &Input) -> Output;
}

This does a lot of work for us already, we have defined a trait and for each day +we will create a structure representing a specific day. That structure will also +implement the Solution trait.

Now we need to get rid of the boilerplate, we can't get rid of the main function, +but we can at least move out the functionality.

fn run(type_of_input: &str) -> Result<()>
where
Self: Sized,
{
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = Self::parse_input(format!("{}s/{}.txt", type_of_input, Self::day()));

info!("Part 1: {}", Self::part_1(&input));
info!("Part 2: {}", Self::part_2(&input));

Ok(())
}

fn main() -> Result<()>
where
Self: Sized,
{
Self::run("input")
}

This is all part of the Solution trait, which can implement methods while being +dependent on what is provided by the implementing types. In this case, we just +need to bound the Output type to implement Display that is necessary for the +info! and format string there.

Now we can get to first of the nasty things we are going to do… And it is the +day() method that you can see being used when constructing path to the input +file. That method will generate a name of the file, e.g. day01 and we know that +we can somehow deduce it from the structure name, given we name it reasonably.

fn day() -> String {
let mut day = String::from(type_name::<Self>().split("::").next().unwrap());
day.make_ascii_lowercase();

day.to_string()
}
type_name

This feature is still experimental and considered to be internal, it is not +advised to use it any production code.

And now we can get to the nastiest stuff 😩 We will generate the tests!

We want to be able to generate tests for sample input in a following way:

test_sample!(day_01, Day01, 42, 69);

There's not much we can do, so we will write a macro to generate the tests for us.

#[macro_export]
macro_rules! test_sample {
($mod_name:ident, $day_struct:tt, $part_1:expr, $part_2:expr) => {
#[cfg(test)]
mod $mod_name {
use super::*;

#[test]
fn test_part_1() {
let sample =
$day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));
assert_eq!($day_struct::part_1(&sample), $part_1);
}

#[test]
fn test_part_2() {
let sample =
$day_struct::parse_input(&format!("samples/{}.txt", $day_struct::day()));
assert_eq!($day_struct::part_2(&sample), $part_2);
}
}
};
}

We have used it in a similar way as macros in C/C++, one of the things that we +can use to our advantage is defining “type” of the parameters for the macro. All +parameters have their name prefixed with $ sign and you can define various “forms” +of your macro. Let's go through it!

We have following parameters:

  • $mod_name which represents the name for the module with tests, it is typed +with ident which means that we want a valid identifier to be passed in.
  • $day_struct represents the structure that will be used for tests, it is typed +with tt which represents a token tree, in our case it is a type.
  • $part_X represents the expected output for the Xth part and is of type expr +which literally means an expression.

Apart from that we need to use #[macro_export] to mark the macro as exported +for usage outside of the module. Now our skeleton looks like:

use aoc_2022::*;

type Input = String;
type Output = String;

struct DayXX;
impl Solution<Input, Output> for DayXX {
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
file_to_string(pathname)
}

fn part_1(input: &Input) -> Output {
todo!()
}

fn part_2(input: &Input) -> Output {
todo!()
}
}

fn main() -> Result<()> {
// DayXX::run("sample")
DayXX::main()
}

// test_sample!(day_XX, DayXX, , );

Solution

Not much to talk about, it is relatively easy to simulate.

Day 10: Cathode-Ray Tube

tl;dr

Emulating basic arithmetic operations on a CPU and drawing on CRT based on the +CPU's accumulator.

In this day I have discovered an issue with my design of the Solution trait. +And the issue is caused by different types of Output for the part 1 and part 2.

Problem is relatively simple and consists of simulating a CPU, I have approached +it in a following way:

fn evaluate_instructions(instructions: &[Instruction], mut out: Output) -> Output {
instructions
.iter()
.fold(State::new(), |state, instruction| {
state.execute(instruction, &mut out)
});

out
}

We just take the instructions, we have some state of the CPU and we execute the +instructions one-by-one. Perfect usage of the fold (or reduce as you may know +it from other languages).

You can also see that we have an Output type, so the question is how can we fix +that problem. And the answer is very simple and functional. Rust allows you to +have an enumeration that can bear some other values apart from the type itself.

tip

We could've seen something like this with the Result<T, E> type that can be +defined as

enum Result<T, E> {
Ok(T),
Err(E)
}
What does that mean though?

When we have an Ok value, it has the result itself, and when we get an Err +value, it has the error. This also allows us to handle results in a rather +pretty way:

match do_something(x) {
Ok(y) => {
println!("SUCCESS: {}", y);
},
Err(y) => {
eprintln!("ERROR: {}", y);
}
}

My solution has a following outline:

fn execute(&self, i: &Instruction, output: &mut Output) -> State {
// execute the instruction

// collect results if necessary
match output {
Output::Part1(x) => self.execute_part_1(y, x),
Output::Part2(x) => self.execute_part_2(y, x),
}

// return the obtained state
new_state
}

You might think that it's a perfectly reasonable thing to do. Yes, but notice +that the match statement doesn't collect the changes in any way and also we +pass output by &mut, so it is shared across each iteration of the fold.

The dirty and ingenious thing is that xs are passed by &mut too and therefore +they are directly modified by the helper functions. To sum it up and let it sit

We are collecting the result into an enumeration that is shared +across all iterations of fold.

Solution

Similar to Day 9, but there are some technical details that can get you.

Day 11: Monkey in the Middle

tl;dr

Simulation of monkeys throwing stuff around and measuring your stress levels +while your stuff is being passed around.

I think I decided to use regular expressions here for the first time, cause +parsing the input was a pain.

Also I didn't expect to implement Euclidean algorithm in Rust…

Solution

Again, we're just running a simulation. Though I must admit it was very easy to +make a small technical mistakes that could affect the final results very late.

Day 12: Hill Climbing Algorithm

tl;dr

Finding shortest path up the hill and also shortest path down to the ground while +also rolling down the hill…

As I have said in the tl;dr, we are looking for the shortest path, but the start +and goal differ for the part 1 and 2. So I have decided to refactor my solution +to a BFS algorithm that takes necessary parameters via functions:

fn bfs<F, G>(
graph: &[Vec<char>], start: &Position, has_edge: F, is_target: G
) -> Option<usize>
where
F: Fn(&[Vec<char>], &Position, &Position) -> bool,
G: Fn(&[Vec<char>], &Position) -> bool

We pass the initial vertex from the caller and everything else is left to the BFS +algorithm, based on the has_edge and is_target functions.

This was easy! And that is not very usual in Rust once you want to pass around +functions. 👀

Solution

Looking for the shortest path… Must be Dijkstra, right? Nope! Half of the +Reddit got jebaited though. In all fairness, nothing stops you from implementing +the Dijkstra's algorithm for finding the shortest path, but if you know that +all connected vertices are in a unit (actually d=1d = 1) distance from each other, +then you know that running Dijkstra is equivalent to running BFS, only with worse +time complexity, because of the priority heap instead of the queue.

Day 13: Distress Signal

tl;dr

Processing packets with structured data from the distress signal.

You can implement a lot of traits if you want to. It is imperative to implement +ordering on the packets. I had a typo, so I also proceeded to implement a Display +trait for debugging purposes:

impl Display for Packet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Packet::Integer(x) => write!(f, "{x}"),
Packet::List(lst) => write!(f, "[{}]", lst.iter().map(|p| format!("{p}")).join(",")),
}
}
}

Solution

A lot of technical details… Parsing is nasty too…

Day 14: Regolith Reservoir

tl;dr

Let's simulate falling sand grain-by-grain.

Again, both parts are relatively similar with minimal changes, so it is a good +idea to refactor it a bit. Similar approach to the BFS above. Also this is the +first day where I ran into efficiency issues and had to redo my solution to speed +it up just a bit.

Solution

Tedious.

Post Mortem

Indexing

I was asked about the indexing after publishing the blog. And truly it is rather +complicated topic, especially after releasing SliceIndex<I> trait. I couldn't +leave it be, so I tried to implement the Index and IndexMut trait.

note

I have also mentioned that the SliceIndex trait is unsafe, but truth be told, +only unsafe part are the 2 methods that are named *unchecked*. Anyways, I will +be implementing the Index* traits for now, rather than the SliceIndex.

It's relatively straightforward…

impl<I, C> Index<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for [C]
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}

We can see a lot of similarities to the implementation of index and index_mut +functions. In the end, they are 1:1, just wrapped in the trait that provides a +syntax sugar for container[idx].

note

I have also switched from using the TryFrom to TryInto trait, since it better +matches what we are using, the .try_into rather than usize::try_from.

Also implementing TryFrom automatically provides you with a TryInto trait, +since it is relatively easy to implement. Just compare the following:

pub trait TryFrom<T>: Sized {
type Error;

fn try_from(value: T) -> Result<Self, Self::Error>;
}

pub trait TryInto<T>: Sized {
type Error;

fn try_into(self) -> Result<T, Self::Error>;
}

OK, so we have our trait implemented, we should be able to use container[index], +right? Yes… but actually no 😦

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:26:18
|
26 | if trees[pos] > tallest {
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<usize>`
--> src/bin/day08.rs:30:28
|
30 | max(tallest, trees[pos])
| ^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<usize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<usize>>`

error[E0277]: the type `[std::vec::Vec<i8>]` cannot be indexed by `aoc_2022::Vector2D<isize>`
--> src/bin/day08.rs:52:28
|
52 | let max_height = trees[position];
| ^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<i8>]>` is not implemented for `aoc_2022::Vector2D<isize>`
= note: required for `std::vec::Vec<std::vec::Vec<i8>>` to implement `std::ops::Index<aoc_2022::Vector2D<isize>>`

Why? We have it implemented for the slices ([C]), why doesn't it work? Well, +the fun part consists of the fact that in other place, where we were using it, +we were passing the &[Vec<T>], but this is coming from a helper functions that +take &Vec<Vec<T>> instead. And… we don't implement Index and IndexMut for +those. Just for the slices. 🤯 What are we going to do about it?

We can either start copy-pasting or be smarter about it… I choose to be smarter, +so let's implement a macro! The only difference across the implementations are +the types of the outer containers. Implementation doesn't differ at all!

Implementing the macro can be done in a following way:

macro_rules! generate_indices {
($container:ty) => {
impl<I, C> Index<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: Index<usize>,
{
type Output = C::Output;

fn index(&self, index: Vector2D<I>) -> &Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&self[y][x]
}
}

impl<I, C> IndexMut<Vector2D<I>> for $container
where
I: Copy + TryInto<usize>,
<I as TryInto<usize>>::Error: Debug,
C: IndexMut<usize>,
{
fn index_mut(&mut self, index: Vector2D<I>) -> &mut Self::Output {
let (x, y): (usize, usize) =
(index.x.try_into().unwrap(), index.y.try_into().unwrap());
&mut self[y][x]
}
}
};
}

And now we can simply do

generate_indices!(VecDeque<C>);
generate_indices!([C]);
generate_indices!(Vec<C>);
// generate_indices!([C; N], const N: usize);

The last type (I took the inspiration from the implementations of the Index and +IndexMut traits) is a bit problematic, because of the const N: usize part, +which I haven't managed to be able to parse. And that's how I got rid of the error.

note

If I were to use 2D-indexing over [C; N] slices, I'd probably just go with the +copy-paste, cause the cost of this “monstrosity” outweighs the benefits of no DRY.

Cause of the problem

This issue is relatively funny. If you don't use any type aliases, just the raw +types, you'll get suggested certain changes by the clippy. For example if you +consider the following piece of code

fn get_sum(nums: &Vec<i32>) -> i32 {
nums.iter().sum()
}

fn main() {
let nums = vec![1, 2, 3];
println!("Sum: {}", get_sum(&nums));
}

and you run clippy on it, you will get

Checking playground v0.0.1 (/playground)
warning: writing `&Vec` instead of `&[_]` involves a new object where a slice will do
--> src/main.rs:1:18
|
1 | fn get_sum(nums: &Vec<i32>) -> i32 {
| ^^^^^^^^^ help: change this to: `&[i32]`
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg
= note: `#[warn(clippy::ptr_arg)]` on by default

warning: `playground` (bin "playground") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.61s

However, if you introduce a type alias, such as

type Numbers = Vec<i32>;

Then clippy won't say anything, cause there is literally nothing to suggest. +However the outcome is not the same…

]]>
+ me+blog@mfocko.xyz (Matej Focko) + advent-of-code + advent-of-code-2022 + rust +
+ + <![CDATA[1st week of Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/1st-week + https://blog.mfocko.xyz/blog/aoc-2022/1st-week + Thu, 15 Dec 2022 01:15:00 GMT + + Let's go through the first week of Advent of Code in Rust.

note

If you wish to have a look at the solutions, you can follow them on my GitLab. +More specifically in the /src/bin/.

I will try to summarize my experience with using Rust for the AoC. Trying it out +ages ago, I believe it will be pain and suffering, but we will see. For each +day I will also try to give a tl;dr of the problem, so that you can better imagine +the relation to my woes or 👍 moments.

Day 1: Calorie Counting

tl;dr

As the name suggests, we get the calories of the food contained in the elves +backpacks and we want to choose the elf that has the most food ;)

Wakey wakey!

Programming in Rust at 6am definitely hits. I've also forgotten to mention how I +handle samples. With each puzzle you usually get a sample input and expected +output. You can use them to verify that your solution works, or usually doesn't.

At first I've decided to put asserts into my main, something like

assert_eq!(part_1(&sample), 24000);
info!("Part 1: {}", part_1(&input));

assert_eq!(part_2(&sample), 45000);
info!("Part 2: {}", part_2(&input));

However, once you get further, the sample input may take some time to run itself. +So in the end, I have decided to turn them into unit tests:

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_part_1() {
let sample = parse_input("samples/day01.txt");
assert_eq!(part_1(&sample), 24000);
}

#[test]
fn test_part_2() {
let sample = parse_input("samples/day01.txt");
assert_eq!(part_2(&sample), 45000);
}
}

And later on I have noticed, it's hard to tell the difference between the days, +so I further renamed the mod from generic tests to reflect the days.

Also after finishing the first day puzzle, I have installed an sccache to +cache the builds, so that the build time is lower, cause it was kinda unbearable.

Solution

Well, it's a pretty simple problem. You just take the input, sum the calories and +find the biggest one. However, if we try to generalize to more than the biggest +one, the fun appears. We have few options:

  • keep all the calories, sort them, take what we need
  • keep all the calories and use max heap
  • use min heap and maintain at most N calories that we need

Day 2: Rock Paper Scissors

tl;dr

You want to know what score did you achieve while playing Rock Paper Scissors. +And then you want to be strategic about it.

Apart from the technical details of the puzzle, it went relatively smooth.

Solution

I took relatively naïve approach and then tried to simplify it.

Day 3: Rucksack Reorganization

tl;dr

Let's go reorganize elves' backpacks! Each backpacks has 2 compartments and you +want to find the common item among those compartments. Each of them has priority, +you care only about the sum.

This is the day where I started to fight the compiler and neither of us decided +to give up. Let's dive into it \o/

Fun fact

Fighting the compiler took me 30 minutes.

We need to find a common item among 2 collections, that's an easy task, right? +We can construct 2 sets and find an intersection:

let top: HashSet<i32> = [1, 2, 3].iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].iter().collect();

Now, the first issue that we encounter is caused by the fact that we are using +a slice (the […]), iterator of that returns references to the numbers. +And we get immediately yelled at by the compiler, because the numbers are discarded +after running the .collect. To fix this, we can use .into_iter:

let top: HashSet<i32> = [1, 2, 3].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5].into_iter().collect();

This way the numbers will get copied instead of referenced. OK, let's find the +intersection of those 2 collections:

println!("Common elements: {:?}", top.intersection(&bottom));
Common elements: [3]
caution

Notice that we need to do &bottom. It explicitly specifies that .intersection +borrows the bottom, i.e. takes an immutable reference to it.

That's what we want, right? Looks like it! \o/

Next part wants us to find the common element among all of the backpacks. OK, so +that should be fairly easy, we have an intersection and we want to find intersection +over all of them.

Let's have a look at the type of the .intersection

pub fn intersection<'a>(
    &'a self,
    other: &'a HashSet<T, S>
) -> Intersection<'a, T, S>

OK… Huh… But we have an example there!

let intersection: HashSet<_> = a.intersection(&b).collect();

Cool, that's all we need.

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
println!("Intersection: {:?}", intersection);
Intersection: {3, 4}

Cool, so let's do the intersection with the top_2:

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
println!("Intersection: {:?}", intersection);

And we get yelled at by the compiler:

error[E0308]: mismatched types
--> src/main.rs:10:58
|
10 | let intersection: HashSet<_> = intersection.intersection(&top_2).collect();
| ------------ ^^^^^^ expected `&i32`, found `i32`
| |
| arguments to this function are incorrect
|
= note: expected reference `&HashSet<&i32>`
found reference `&HashSet<i32>`

/o\ What the hell is going on here? Well, the funny thing is, that this operation +doesn't return the elements themselves, but the references to them and when we pass +the third set, it has just the values themselves, without any references.

tip

It may seem as a very weird decision, but in fact it makes some sense… It allows +you to do intersection of items that may not be possible to copy. Overall this is +a “tax” for having a borrow checker drilling your ass having your back and +making sure you're not doing something naughty that may cause an undefined +behavior.

To resolve this we need to get an iterator that clones the elements:

let top: HashSet<i32> = [1, 2, 3, 4].into_iter().collect();
let bottom: HashSet<i32> = [3, 4, 5, 6].into_iter().collect();
let top_2: HashSet<i32> = [2, 3, 4, 5, 6].into_iter().collect();
let bottom_2: HashSet<i32> = [4, 5, 6].into_iter().collect();

let intersection: HashSet<_> = top.intersection(&bottom).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&top_2).cloned().collect();
let intersection: HashSet<_> = intersection.intersection(&bottom_2).cloned().collect();
println!("Intersection: {:?}", intersection);
Intersection: {4}

Solution

The approach is pretty simple, if you omit the 1on1 with the compiler. You just +have some fun with the set operations :)

Day 4: Camp Cleanup

tl;dr

Elves are cleaning up the camp and they got overlapping sections to clean up. +Find how many overlap and can take the day off.

RangeInclusive is your friend not an enemy :)

Solution

Relatively easy, you just need to parse the input and know what you want. Rust's +RangeInclusive type helped a lot, cause it took care of all abstractions.

Day 5: Supply Stacks

tl;dr

Let's play with stacks of crates.

Very easy problem with very annoying input. You can judge yourself:

    [D]    
[N] [C]
[Z] [M] [P]
1 2 3

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

Good luck transforming that into something reasonable :)

Fun fact

Took me 40 minutes to parse this reasonably, including fighting the compiler.

Solution

For the initial solution I went with a manual solution (as in I have done all +the work. Later on I have decided to explore the std and interface of the +std::vec::Vec and found split_off which takes an index and splits (duh) +the vector:

let mut vec = vec![1, 2, 3];
let vec2 = vec.split_off(1);
assert_eq!(vec, [1]);
assert_eq!(vec2, [2, 3]);

This helped me simplify my solution a lot and also get rid of some edge cases.

Day 6: Tuning Trouble

tl;dr

Finding start of the message in a very weird protocol. Start of the message is +denoted by NN unique consecutive characters.

Solution

A lot of different approaches, knowing that we are dealing with input consisting +solely of ASCII letters, I bit the bullet and went with sliding window and +constructing sets from that window, checking if the set is as big as the window.

One possible optimization could consist of keeping a bit-vector (i.e. usize +variable) of encountered characters and updating it as we go. However this has +a different issue and that is removal of the characters from the left side of the +window. We don't know if the same character is not included later on.

Other option is to do similar thing, but keeping the frequencies of the letters, +and again knowing we have only ASCII letters we can optimize by having a vector +of 26 elements that keeps count for each lowercase letter.

Day 7: No Space Left On Device

tl;dr

Let's simulate du to get some stats about our file system and then pinpoint +directories that take a lot of space and should be deleted.

I was waiting for this moment, and yet it got me! +imagine me swearing for hours

Solution

We need to “build” a file system from the input that is given in a following form:

$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k

There are few ways in which you can achieve this and also you can assume some +preconditions, but why would we do that, right? :)

You can “slap” this in either HashMap or BTreeMap and call it a day. +And that would be boring…

tip

BTreeMap is quite fitting for this, don't you think?

I always wanted to try allocation on heap in Rust, so I chose to implement a tree. +I fought with the Box<T> for some time and was losing…

Then I looked up some implementations of trees or linked lists and decided to try +Rc<Cell<T>>. And I got my ass whopped by the compiler once again. /o\

tip

Box<T> represents a dynamically allocated memory on heap. It is a single pointer, +you can imagine this as std::unique_ptr<T> in C++.

Rc<T> represents a dynamically allocated memory on heap. On top of that it is +reference counted (that's what the Rc stands for). You can imagine this as +std::shared_ptr<T> in C++.

Now the fun stuff. Neither of them lets you mutate the contents of the memory.

Cell<T> allows you to mutate the memory. Can be used reasonably with types that +can be copied, because the memory safety is guaranteed by copying the contents +when there is more than one mutable reference to the memory.

RefCell<T> is similar to the Cell<T>, but the borrowing rules (how many mutable +references are present) are checked dynamically.

So in the end, if you want something like std::shared_ptr<T> in Rust, you want +to have Rc<RefCell<T>>.

So, how are we going to represent the file system then? We will use an enumeration, +hehe, which is an algebraic data type that can store some stuff in itself 😩

type FileHandle = Rc<RefCell<AocFile>>;

#[derive(Debug)]
enum AocFile {
File(usize),
Directory(BTreeMap<String, FileHandle>),
}

Let's go over it! FileHandle represents dynamically allocated AocFile, not +much to discuss. What does the #[derive(Debug)] do though? It lets us to print +out the value of that enumeration, it's derived, so it's not as good as if we had +implemented it ourselves, but it's good enough for debugging, hence the name.

Now to the fun part! AocFile value can be represented in two ways:

  • File(usize), e.g. AocFile::File(123) and we can pattern match it, if we +need to
  • Directory(BTreeMap<String, FileHandle>) will represent the directory and will +contain map matching the name of the files (or directories) within to their +respective file handles

I will omit the details about constructing this file system, cause there are a lot +of technicalities introduced by the nature of the input. However if you are +interested, you can have a look at my solution.

We need to find small enough directories and also find the smallest directory that +will free enough space. Now the question is, how could we do that. And there are +multiple ways I will describe.

I have chosen to implement tree catamorphism 😩. It is basically a fold +over a tree data structure. We descent down into the leaves and propagate computed +results all the way to the root. You can also notice that this approach is very +similar to dynamic programming, we find overlapping sections of the computation +and try to minimize the additional work (in this case: we need to know sizes of +our descendants, but we have already been there).

Another approach that has been suggested to me few days later is running DFS on +the graph. And, funnily enough, we would still need to combine what we found in +the branches where we descent. So in the end, it would work very similarly to my +solution.

One of the more exotic options would be precomputing the required information at +the same time as parsing. That could be done by adding additional fields to the +nodes which would allow storing such information and updating it as we construct +the file system.

Post Mortem

Things that have been brought up in the discussion later on.

Rc<T> vs Rc<RefCell<T>>

It has been brought up that I have a contradicting statement regarding the +dynamically allocated memory. Specifically:

  • You can imagine Rc<T> as an std::shared_ptr<T> (in C++)
  • When you want an equivalent of std::shared_ptr<T>, you want to use +Rc<RefCell<T>>

Now, in Rust it is a bit more complicated, because the type that represents the +“shared pointer” is Rc<T>. What RefCell<T> does is making sure that there is +only one “owner” of a mutable reference at a time (and dynamically, as opposed +to the Cell<T>).

Therefore to be precise and correct about the equivalents of std::shared_ptr<T> +in Rust, we can say that

  • Rc<T> is an equivalent of a const std::shared_ptr<T>,
  • and Rc<RefCell<T>> is an equivalent of a std::shared_ptr<T>.

You can easily see that they only differ in the mutability. (And even that is not +as simple as it seems, because there is also Cell<T>)

]]>
+ me+blog@mfocko.xyz (Matej Focko) + advent-of-code + advent-of-code-2022 + rust +
+ + <![CDATA[Advent of Code '22 in Rust]]> + https://blog.mfocko.xyz/blog/aoc-2022/intro + https://blog.mfocko.xyz/blog/aoc-2022/intro + Wed, 14 Dec 2022 21:45:00 GMT + + Let's talk about the preparations for this year's Advent of Code.

Choosing a language

When choosing a language for AoC, you usually want a language that gives you a +quick feedback which allows you to iterate quickly to the solution of the puzzle. +One of the most common choices is Python, many people also use JavaScript or Ruby.

Given the competitive nature of the AoC and popularity among competitive programming, +C++ might be also a very good choice. Only if you are familiar with it, I guess…

If you want a challenge, you might also choose to rotate the languages each day. +Though I prefer to use only one language.

For this year I have been deciding between Rust, C++ and Pascal or Ada.

I have tried Rust last year and have survived with it for 3 days and then gave +up and switched to Kotlin, which was pretty good given it is “Java undercover”. +I pretty much like the ideas behind Rust, I am not sure about the whole cult and +implementation of those ideas though. After some years with C/C++, I would say +that Rust feels too safe for my taste and tries to “punish me” even for the +most trivial things.

C++ is a very robust, but also comes with a wide variety of options providing you +the ability to shoot yourself in the leg. I have tried to solve few days of previous +Advent of Code events, it was relatively easy to solve the problems in C++, given +that I do not admit writing my own iterator for enumerate

Pascal or Ada were meme choices :) Ada is heavily inspired by Pascal and has a +pretty nice standard library that offers enough to be able to quickly solve some +problems in it. However the toolkit is questionable :/

Choosing libraries

Preparations for Rust

All of the sources, later on including solutions, can be found at my +GitLab.

Toolkit

Since we are using Rust, we are going to use a Cargo and more than likely VSCode +with rust-analyzer. Because of my choice of libraries, we will also introduce +a .envrc file that can be used by direnv, which allows you to set specific +environment variables when you enter a directory. In our case, we will use

# to show nice backtrace when using the color-eyre
export RUST_BACKTRACE=1

# to catch logs generated by tracing
export RUST_LOG=trace

And for the one of the most obnoxious things ever, we will use a script to download +the inputs instead of “clicking, opening and copying to a file1. There is +no need to be fancy, so we will adjust Python script by Martin2.

#!/usr/bin/env python3

import datetime
import yaml
import requests
import sys


def load_config():
with open("env.yaml", "r") as f:
js = yaml.load(f, Loader=yaml.Loader)
return js["session"], js["year"]


def get_input(session, year, day):
return requests.get(
f"https://adventofcode.com/{year}/day/{day}/input",
cookies={"session": session},
headers={
"User-Agent": "{repo} by {mail}".format(
repo="gitlab.com/mfocko/advent-of-code-2022",
mail="me@mfocko.xyz",
)
},
).content.decode("utf-8")


def main():
day = datetime.datetime.now().day
if len(sys.argv) == 2:
day = sys.argv[1]

session, year = load_config()
problem_input = get_input(session, year, day)

with open(f"./inputs/day{day:>02}.txt", "w") as f:
f.write(problem_input)


if __name__ == "__main__":
main()

If the script is called without any arguments, it will deduce the day from the +system, so we do not need to change the day every morning. It also requires a +configuration file:

# env.yaml
session: ‹your session cookie›
year: 2022

Libraries

Looking at the list of the libraries, I have chosen “a lot” of them. Let's walk +through each of them.

tracing and tracing-subscriber are the crates that can be used for tracing +and logging of your Rust programs, there are also other crates that can help you +with providing backtrace to the Sentry in case you have deployed your application +somewhere and you want to watch over it. In our use case we will just utilize the +macros for debugging in the terminal.

thiserror, anyhow and color-eyre are used for error reporting. +thiserror is a very good choice for libraries, cause it extends the Error +from the std and allows you to create more convenient error types. Next is +anyhow which kinda builds on top of the thiserror and provides you with simpler +error handling in binaries3. And finally we have color-eyre which, as I found +out later, is a colorful (wink wink) extension of eyre which is fork of anyhow +while supporting customized reports.

In the end I have decided to remove thiserror and anyhow, since first one is +suitable for libraries and the latter was basically fully replaced by {color-,}eyre.

regex and lazy_static are a very good and also, I hope, self-explanatory +combination. lazy_static allows you to have static variables that must be initialized +during runtime.

itertools provides some nice extensions to the iterators from the std.

My own “library”

When creating the crate for this year's Advent of Code, I have chosen a library +type. Even though standard library is huge, some things might not be included and +also we can follow KISS. I have 2 modules that my “library” exports, one for +parsing and one for 2D vector (that gets used quite often during Advent of Code).

Key part is, of course, processing the input and my library exports following +functions that get used a lot:

/// Reads file to the string.
pub fn file_to_string<P: AsRef<Path>>(pathname: P) -> String;

/// Reads file and returns it as a vector of characters.
pub fn file_to_chars<P: AsRef<Path>>(pathname: P) -> Vec<char>;

/// Reads file and returns a vector of parsed structures. Expects each structure
/// on its own line in the file. And `T` needs to implement `FromStr` trait.
pub fn file_to_structs<P: AsRef<Path>, T: FromStr>(pathname: P) -> Vec<T>
where
<T as FromStr>::Err: Debug;

/// Converts iterator over strings to a vector of parsed structures. `T` needs
/// to implement `FromStr` trait and its error must derive `Debug` trait.
pub fn strings_to_structs<T: FromStr, U>(
iter: impl Iterator<Item = U>
) -> Vec<T>
where
<T as std::str::FromStr>::Err: std::fmt::Debug,
U: Deref<Target = str>;

/// Reads file and returns it as a vector of its lines.
pub fn file_to_lines<P: AsRef<Path>>(pathname: P) -> Vec<String>;

As for the vector, I went with a rather simple implementation that allows only +addition of the vectors for now and accessing the elements via functions x() +and y(). Also the vector is generic, so we can use it with any numeric type we +need.

Skeleton

We can also prepare a template to quickly bootstrap each of the days. We know +that each puzzle has 2 parts, which means that we can start with 2 functions that +will solve them.

fn part1(input: &Input) -> Output {
todo!()
}

fn part2(input: &Input) -> Output {
todo!()
}

Both functions take reference to the input and return some output (in majority +of puzzles, it is the same type). todo!() can be used as a nice placeholder, +it also causes a panic when reached and we could also provide some string with +an explanation, e.g. todo!("part 1"). We have not given functions a specific +type and to avoid as much copy-paste as possible, we will introduce type aliases.

type Input = String;
type Output = i32;
tip

This allows us to quickly adjust the types only in one place without the need to +do regex-replace or replace them manually.

For each day we get a personalized input that is provided as a text file. Almost +all the time, we would like to get some structured type out of that input, and +therefore it makes sense to introduce a new function that will provide the parsing +of the input.

fn parse_input(path: &str) -> Input {
todo!()
}

This “parser” will take a path to the file, just in case we would like to run the +sample instead of input.

OK, so now we can write a main function that will take all of the pieces and +run them.

fn main() {
let input = parse_input("inputs/dayXX.txt");

println!("Part 1: {}", part_1(&input));
println!("Part 2: {}", part_2(&input));
}

This would definitely do :) But we have installed a few libraries and we want to +use them. In this part we are going to utilize tracing (for tracing, duh…) +and color-eyre (for better error reporting, e.g. from parsing).

fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = parse_input("inputs/dayXX.txt");

info!("Part 1: {}", part_1(&input));
info!("Part 2: {}", part_2(&input));

Ok(())
}

The first statement will set up tracing and configure it to print out the logs to +terminal, based on the environment variable. We also change the formatting a bit, +since we do not need all the fancy features of the logger. Pure initialization +would get us logs like this:

2022-12-11T19:53:19.975343Z  INFO day01: Part 1: 0

However after running that command, we will get the following:

 INFO src/bin/day01.rs:35: Part 1: 0

And the color_eyre::install()? is quite straightforward. We just initialize the +error reporting by color eyre.

caution

Notice that we had to add Ok(()) to the end of the function and adjust the +return type of the main to Result<()>. It is caused by the color eyre that +can be installed only once and therefore it can fail, that is how we got the ? +at the end of the ::install which unwraps the »result« of the installation.

Overall we will get to a template like this:

use aoc_2022::*;

use color_eyre::eyre::Result;
use tracing::info;
use tracing_subscriber::EnvFilter;

type Input = String;
type Output = i32;

fn parse_input(path: &str) -> Input {
todo!()
}

fn part1(input: &Input) -> Output {
todo!()
}

fn part2(input: &Input) -> Output {
todo!()
}

fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.with_target(false)
.with_file(true)
.with_line_number(true)
.without_time()
.compact()
.init();
color_eyre::install()?;

let input = parse_input("inputs/dayXX.txt");

info!("Part 1: {}", part_1(&input));
info!("Part 2: {}", part_2(&input));

Ok(())
}

  1. Copy-pasting might be a relaxing thing to do, but you can also discover +nasty stuff about your PC. See this Reddit post and the comment.
  2. GitHub profile
  3. Even though you can use it even for libraries, but handling errors from +libraries using anyhow is nasty… You will be the stinky one ;)
]]>
+ me+blog@mfocko.xyz (Matej Focko) + advent-of-code + advent-of-code-2022 + rust +
+
+
\ No newline at end of file diff --git a/blog/tags/admin/index.html b/blog/tags/admin/index.html new file mode 100644 index 0000000..7e56e26 --- /dev/null +++ b/blog/tags/admin/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "admin" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/advent-of-code-2022/index.html b/blog/tags/advent-of-code-2022/index.html new file mode 100644 index 0000000..d5cdae2 --- /dev/null +++ b/blog/tags/advent-of-code-2022/index.html @@ -0,0 +1,25 @@ + + + + + +5 posts tagged with "advent-of-code-2022" | mf + + + + + + + + + + + + + +
+

5 posts tagged with "advent-of-code-2022"

View All Tags
+ + + + \ No newline at end of file diff --git a/blog/tags/advent-of-code/index.html b/blog/tags/advent-of-code/index.html new file mode 100644 index 0000000..208449c --- /dev/null +++ b/blog/tags/advent-of-code/index.html @@ -0,0 +1,25 @@ + + + + + +5 posts tagged with "advent-of-code" | mf + + + + + + + + + + + + + +
+

5 posts tagged with "advent-of-code"

View All Tags
+ + + + \ No newline at end of file diff --git a/blog/tags/copr/index.html b/blog/tags/copr/index.html new file mode 100644 index 0000000..3a160b1 --- /dev/null +++ b/blog/tags/copr/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "copr" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/cpp/index.html b/blog/tags/cpp/index.html new file mode 100644 index 0000000..7776db8 --- /dev/null +++ b/blog/tags/cpp/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "cpp" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html new file mode 100644 index 0000000..4a82b73 --- /dev/null +++ b/blog/tags/index.html @@ -0,0 +1,25 @@ + + + + + +Tags | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/iterators/index.html b/blog/tags/iterators/index.html new file mode 100644 index 0000000..400c077 --- /dev/null +++ b/blog/tags/iterators/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "iterators" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/leetcode/index.html b/blog/tags/leetcode/index.html new file mode 100644 index 0000000..12ef649 --- /dev/null +++ b/blog/tags/leetcode/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "leetcode" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/red-hat/index.html b/blog/tags/red-hat/index.html new file mode 100644 index 0000000..778decd --- /dev/null +++ b/blog/tags/red-hat/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "red-hat" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/rust/index.html b/blog/tags/rust/index.html new file mode 100644 index 0000000..586fc4e --- /dev/null +++ b/blog/tags/rust/index.html @@ -0,0 +1,25 @@ + + + + + +5 posts tagged with "rust" | mf + + + + + + + + + + + + + +
+

5 posts tagged with "rust"

View All Tags
+ + + + \ No newline at end of file diff --git a/blog/tags/vps/index.html b/blog/tags/vps/index.html new file mode 100644 index 0000000..54bb7df --- /dev/null +++ b/blog/tags/vps/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "vps" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/tags/🏭/index.html b/blog/tags/🏭/index.html new file mode 100644 index 0000000..0162360 --- /dev/null +++ b/blog/tags/🏭/index.html @@ -0,0 +1,26 @@ + + + + + +One post tagged with "🏭" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributions/index.html b/contributions/index.html new file mode 100644 index 0000000..276a3df --- /dev/null +++ b/contributions/index.html @@ -0,0 +1,25 @@ + + + + + +Contributions | mf + + + + + + + + + + + + + +
+

Contributions

Many of my contributions to open-source projects.

Fedora Infrastructure Ansible

Description

Collection of Ansible playbooks that powers the Fedora Infrastructure.

Contribution

I have adjusted the groups in the Bodhi playbooks after Packit has been granted the privileges to propose updates without restrictions.

Bodhi

Description

Bodhi is a web-system that facilitates the process of publishing updates for a Fedora-based software distribution.

Contribution

I have adjusted the client, so that it doesn't show secrets in terminal when you log in to the Bodhi via browser.

Gluetool Modules Collection

Description

Modules for gluetool — a command line centric framework usable for glueing modules into a pipeline.

Contribution
  • I have proposed a possible implementation of git merging that was later on extended.
  • I have tried to help out with Copr module after they deprecated older version of their API.

Pagure

Description

Pagure is a git-centered forge, python based using pygit2.

Contribution

I have added an API endpoint for reopening pull requests.

Copr

Description

RPM build system - upstream for Copr.

Contribution
  • Supporting external repositories for custom SRPM build method.
  • Allowing admins of Copr repositories to build without the need to ask for explicit builder permissions.

python-gitlab

Description

A python wrapper for the GitLab API.

Contribution

I have contributed support for the merge_ref on merge requests that hasn't been supported, yet it was present in the GitLab API.

PatternFly React

Description

A set of React components for the PatternFly project.

Contribution

When working on Packit Dashboard, I have spotted smaller bugs that were present in this project and fixed them upstream to provide better experience for our users.

Fira Code

Description

Free monospaced font with programming ligatures.

Contribution

I have set up a GitHub Action for building the font on each push to the default branch allowing users to install bleeding edge version of the font.

nixpkgs

Description

Nixpkgs is a collection of over 80,000 software packages that can be installed with the Nix package manager. It also implements NixOS, a purely-functional Linux distribution.

Contribution

When I was trying out the nixpkgs, I have tried to bump .NET Core to the latest version. My changes haven't been accepted as they required bumping of multiple more packages that depended upon the .NET Core.

Darcula

Description

A theme for Visual Studio Code based on Darcula theme from Jetbrains IDEs.

Contribution

I have contributed support for diff files, though the project doesn't seem to be live anymore, so it hasn't been accepted as of now.

Packit

Description

An open source project aiming to ease the integration of your project with Fedora Linux, CentOS Stream and other distributions.

Contribution

Have a look at my pull requests.

Snitch

Description

Language agnostic tool that collects TODOs in the source code and reports them as Issues.

Contribution
  • Environment variable support for self-hosted GitLab instances
  • GitLab support

Karel the Robot

Description

Karel the robot is in general an educational programming language for beginners, created by Richard E. Pattis. This is implementation of Karel the Robot for C programming language.

This project is used for educational purposes at TUKE.

Contribution

I have contributed some refactoring tips to the author of the library.

+ + + + \ No newline at end of file diff --git a/files/blog/leetcode/sort-matrix-diagonally/makefile b/files/blog/leetcode/sort-matrix-diagonally/makefile new file mode 100644 index 0000000..07bbd28 --- /dev/null +++ b/files/blog/leetcode/sort-matrix-diagonally/makefile @@ -0,0 +1,16 @@ +CXX=clang++ +CXXFLAGS=-std=c++20 -Wall -Wextra -Werror -g -pedantic + +test: matrix-sort + ./matrix-sort + +matrix-sort: format tidy + $(CXX) $(CXXFLAGS) matrix-sort.cpp -o matrix-sort + +format: + clang-format -i -style=webkit *.cpp + +tidy: + clang-tidy *.cpp -- $(CXXFLAGS) + +.PHONY: matrix-sort format tidy \ No newline at end of file diff --git a/files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp b/files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp new file mode 100644 index 0000000..209b02a --- /dev/null +++ b/files/blog/leetcode/sort-matrix-diagonally/matrix-sort.cpp @@ -0,0 +1,229 @@ +#include +#include +#include + +using matrix = std::vector>; + +template +class diagonal { + using matrix_t = std::vector>; + + matrix_t& matrix; + std::size_t x; + std::size_t y; + + class diagonal_iter { + // we need to keep reference to the matrix itself + std::reference_wrapper m; + + // we need to be able to tell our current position + std::size_t x; + std::size_t y; + + public: + using difference_type = std::ptrdiff_t; + using value_type = T; + using pointer = T*; + using reference = T&; + using iterator_category = std::random_access_iterator_tag; + + diagonal_iter(matrix_t& matrix, + std::size_t x, + std::size_t y) + : m(matrix) + , x(x) + , y(y) + { + } + + bool operator==(const diagonal_iter& rhs) const + { + return x == rhs.x && y == rhs.y && m.get() == rhs.m.get(); + } + + diagonal_iter& operator++() + { + // we are moving along the diagonal, so we increment both ‹x› and ‹y› + // at the same time + x++; + y++; + return *this; + } + + reference operator*() const { return m.get()[y][x]; } + + // exactly opposite to the incrementation + diagonal_iter operator--() + { + x--; + y--; + return *this; + } + + // moving ‹n› steps back is same as calling decrementation ‹n›-times, so + // we can just return a new iterator and subtract ‹n› from both + // coordinates in the matrix + diagonal_iter operator-(difference_type n) const + { + return diagonal_iter { m, x - n, y - n }; + } + + // here we assume that we are given two iterators on the same diagonal + difference_type operator-(const diagonal_iter& rhs) const + { + assert(m.get() == rhs.m.get()); + return x - rhs.x; + } + + // counterpart of moving ‹n› steps backwards + diagonal_iter operator+(difference_type n) const + { + return diagonal_iter { m, x + n, y + n }; + } + + // we compare the coordinates, and also assume that those 2 iterators are + // lying on the same diagonal + bool operator<(const diagonal_iter& rhs) const + { + assert(m.get() == rhs.m.get()); + return x < rhs.x && y < rhs.y; + } + }; + +public: + diagonal(matrix_t& matrix, std::size_t x, std::size_t y) + : matrix(matrix) + , x(x) + , y(y) + { + } + + diagonal_iter begin() const { return diagonal_iter { matrix, x, y }; } + + diagonal_iter end() const + { + auto max_x = matrix[y].size(); + auto max_y = matrix.size(); + + // we need to find the distance in which we get out of bounds (either in + // column or row) + auto steps = std::min(max_x - x, max_y - y); + + return diagonal_iter { matrix, x + steps, y + steps }; + } +}; + +template +class diagonals { + using matrix_t = std::vector>; + + class diagonals_iter { + matrix_t& m; + std::size_t x; + std::size_t y; + + public: + diagonals_iter(matrix_t& matrix, std::size_t x, std::size_t y) + : m(matrix) + , x(x) + , y(y) + { + } + + bool operator!=(const diagonals_iter& rhs) const + { + // iterators are not equal if they reference different matrices, or + // their positions differ + return x != rhs.x || y != rhs.y || m != rhs.m; + } + + diagonals_iter& operator++() + { + if (y != 0) { + // iterating through diagonals down the first column + y++; + return *this; + } + + // iterating the diagonals along the first row + x++; + if (x == m.front().size()) { + // switching to diagonals in the first column + x = 0; + y++; + } + + return *this; + } + + diagonal operator*() const { return diagonal { m, x, y }; } + }; + + matrix_t& _matrix; + +public: + diagonals(matrix_t& m) + : _matrix(m) + { + } + diagonals_iter begin() { return diagonals_iter { _matrix, 0, 0 }; } + diagonals_iter end() { return diagonals_iter { _matrix, 0, _matrix.size() }; } +}; + +class Solution { +public: + matrix diagonalSort(matrix mat) + { + // we iterate over the diagonals + for (auto d : diagonals(mat)) { + // and we sort each diagonal + std::sort(d.begin(), d.end()); + } + + // we take the matrix by copy, so we can sort in-situ and return the copy + // that we sorted + return mat; + } +}; + +static void test_case_1() +{ + // Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]] + // Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]] + + Solution s; + assert((s.diagonalSort(std::vector { std::vector { 3, 3, 1, 1 }, + std::vector { 2, 2, 1, 2 }, + std::vector { 1, 1, 1, 2 } }) + == std::vector { std::vector { 1, 1, 1, 1 }, + std::vector { 1, 2, 2, 2 }, + std::vector { 1, 2, 3, 3 } })); +} + +static void test_case_2() +{ + // Input: mat = + // [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]] + // Output: + // [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]] + + Solution s; + assert((s.diagonalSort(std::vector { std::vector { 11, 25, 66, 1, 69, 7 }, + std::vector { 23, 55, 17, 45, 15, 52 }, + std::vector { 75, 31, 36, 44, 58, 8 }, + std::vector { 22, 27, 33, 25, 68, 4 }, + std::vector { 84, 28, 14, 11, 5, 50 } }) + == std::vector { std::vector { 5, 17, 4, 1, 52, 7 }, + std::vector { 11, 11, 25, 45, 8, 69 }, + std::vector { 14, 23, 25, 44, 58, 15 }, + std::vector { 22, 27, 31, 36, 50, 66 }, + std::vector { 84, 28, 75, 33, 55, 68 } })); +} + +int main() +{ + test_case_1(); + test_case_2(); + + return 0; +} \ No newline at end of file diff --git a/files/ib002/algorithms-correctness/postcondition-ambiguity/test_sort.py b/files/ib002/algorithms-correctness/postcondition-ambiguity/test_sort.py new file mode 100644 index 0000000..c616f8f --- /dev/null +++ b/files/ib002/algorithms-correctness/postcondition-ambiguity/test_sort.py @@ -0,0 +1,139 @@ +from hypothesis import given, settings +from hypothesis.strategies import integers, lists +import pytest + +import itertools + + +def compare_by_value(pair): + """ + Takes a pair from enumerate in form: `index, value` and returns the value + + Args: + pair (Tuple[int, T]): Index and element from the iterator at the index. + + Returns: + Element from the pair. + """ + index, value = pair + return value + + +def maximum(arr, n): + """ + Finds index of maximum element of first n elements in list. + + Args: + arr (List): List of values. + n (int): Upper bound of index where to search for maximum (inclusive). + + Returns: + Index of a maximum element in `arr[:n]`. + """ + first_n_elements = itertools.islice(enumerate(arr), n) + index, value = max(first_n_elements, key=compare_by_value) + return index + + +# Precondition: n = |A| +# Loop invariant: +# A[i + 1 : n] is sorted AND +# all elements of A[i + 1 : n] are bigger or equal to the other elements +# Postcondition: A is sorted +def select_sort(arr, n): + """ + Sorts list `arr` using select sort algorithm. + + Args: + arr (List): List of values. + n (int): Size of the list. + + Returns: + Sorted list `arr`. + """ + assert n == len(arr) + + check_loop_invariant(arr, n, n) + for i in reversed(range(1, n)): + j = maximum(arr, i + 1) + arr[i], arr[j] = arr[j], arr[i] + + check_loop_invariant(arr, n, i) + + return arr + + +def broken_select_sort(arr, n): + assert n == len(arr) + + if not arr: + return + + max_value = max(arr) + + check_loop_invariant(arr, n, n) + for i in reversed(range(n)): + arr[i] = max_value + i + + check_loop_invariant(arr, n, i) + + return arr + + +def check_loop_invariant(arr, n, i): + # A[i + 1 : n] is sorted + for x, y in zip(itertools.islice(arr, i + 1, n), itertools.islice(arr, i + 2, n)): + assert x <= y + + # all elements of A[i + 1 : n] are bigger or equal to the other elements + if i + 1 >= n: + # in case there are no elements + return + + # otherwise, since the "tail" is sorted, we can assume that it is enough to + # check the other elements to the smallest value of the tail + smallest = arr[i + 1] + for element in itertools.islice(arr, i + 1): + assert smallest >= element + + +def check_vague_postcondition(original_arr, arr): + if not arr: + return + + # check ordering + for x, y in zip(arr, itertools.islice(arr, 1, len(arr))): + assert x <= y + + +def check_postcondition(original_arr, arr): + if not arr: + return + + # check ordering + for x, y in zip(arr, itertools.islice(arr, 1, len(arr))): + assert x <= y + + # get counts from original list + original_counts = {} + for value in original_arr: + original_counts[value] = 1 + original_counts.get(value, 0) + + # get counts from resulting list + counts = {} + for value in arr: + counts[value] = 1 + counts.get(value, 0) + + # if arr is permutation of original_arr then all counts must be the same + assert counts == original_counts + + +@given(lists(integers())) +@settings(max_examples=1000) +@pytest.mark.parametrize( + "postcondition", [check_vague_postcondition, check_postcondition] +) +@pytest.mark.parametrize("sorting_function", [select_sort, broken_select_sort]) +def test_select_sort(sorting_function, postcondition, numbers): + result = sorting_function(numbers[:], len(numbers)) + postcondition(numbers, result) diff --git a/files/ib002/graphs/bfs-tree/bfs_graph.dot b/files/ib002/graphs/bfs-tree/bfs_graph.dot new file mode 100644 index 0000000..abaefdf --- /dev/null +++ b/files/ib002/graphs/bfs-tree/bfs_graph.dot @@ -0,0 +1,17 @@ +graph { + a -- c + a -- e + + c -- i + c -- b + + e -- j + + i -- d + + b -- h + + d -- h + + h -- j +} \ No newline at end of file diff --git a/files/ib002/graphs/bfs-tree/bfs_graph_dark.png b/files/ib002/graphs/bfs-tree/bfs_graph_dark.png new file mode 100644 index 0000000..2b06433 Binary files /dev/null and b/files/ib002/graphs/bfs-tree/bfs_graph_dark.png differ diff --git a/files/ib002/graphs/bfs-tree/bfs_graph_light.png b/files/ib002/graphs/bfs-tree/bfs_graph_light.png new file mode 100644 index 0000000..3a47c34 Binary files /dev/null and b/files/ib002/graphs/bfs-tree/bfs_graph_light.png differ diff --git a/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge.dot b/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge.dot new file mode 100644 index 0000000..b242f2e --- /dev/null +++ b/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge.dot @@ -0,0 +1,18 @@ +graph { + a -- c + a -- e + + c -- i + c -- b + + e -- j + e -- h + + i -- d + + b -- h + + d -- h + + h -- j +} \ No newline at end of file diff --git a/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge_dark.png b/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge_dark.png new file mode 100644 index 0000000..e05d0e0 Binary files /dev/null and b/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge_dark.png differ diff --git a/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge_light.png b/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge_light.png new file mode 100644 index 0000000..63d9ee2 Binary files /dev/null and b/files/ib002/graphs/bfs-tree/bfs_graph_with_additional_edge_light.png differ diff --git a/files/ib002/graphs/bfs-tree/bfs_tree.dot b/files/ib002/graphs/bfs-tree/bfs_tree.dot new file mode 100644 index 0000000..b964dd6 --- /dev/null +++ b/files/ib002/graphs/bfs-tree/bfs_tree.dot @@ -0,0 +1,13 @@ +digraph { + a -> c + a -> e + + c -> b + c -> i + + e -> j + + b -> h + + i -> d +} \ No newline at end of file diff --git a/files/ib002/graphs/bfs-tree/bfs_tree_dark.png b/files/ib002/graphs/bfs-tree/bfs_tree_dark.png new file mode 100644 index 0000000..443fea5 Binary files /dev/null and b/files/ib002/graphs/bfs-tree/bfs_tree_dark.png differ diff --git a/files/ib002/graphs/bfs-tree/bfs_tree_light.png b/files/ib002/graphs/bfs-tree/bfs_tree_light.png new file mode 100644 index 0000000..2cf7ae4 Binary files /dev/null and b/files/ib002/graphs/bfs-tree/bfs_tree_light.png differ diff --git a/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge.dot b/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge.dot new file mode 100644 index 0000000..280cf15 --- /dev/null +++ b/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge.dot @@ -0,0 +1,12 @@ +digraph { + a -> c + a -> e + + c -> b + c -> i + + e -> h + e -> j + + i -> d +} \ No newline at end of file diff --git a/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge_dark.png b/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge_dark.png new file mode 100644 index 0000000..1b1fc63 Binary files /dev/null and b/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge_dark.png differ diff --git a/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge_light.png b/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge_light.png new file mode 100644 index 0000000..fe54693 Binary files /dev/null and b/files/ib002/graphs/bfs-tree/bfs_tree_with_additional_edge_light.png differ diff --git a/files/ib002/graphs/iterative-and-iterators/.archive b/files/ib002/graphs/iterative-and-iterators/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/ib002/graphs/iterative-and-iterators/.editorconfig b/files/ib002/graphs/iterative-and-iterators/.editorconfig new file mode 100644 index 0000000..11f2d95 --- /dev/null +++ b/files/ib002/graphs/iterative-and-iterators/.editorconfig @@ -0,0 +1,206 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +indent_style = space +tab_width = 4 + +# New line preferences +end_of_line = lf +insert_final_newline = true + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_property = false:silent + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +# Expression-level preferences +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion + +# Field preferences +dotnet_style_readonly_field = true:suggestion + +# Parameter preferences +dotnet_code_quality_unused_parameters = all:suggestion + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = false:silent +csharp_style_var_for_built_in_types = false:silent +csharp_style_var_when_type_is_apparent = false:silent + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_prefer_not_pattern = true:suggestion +csharp_style_prefer_pattern_matching = true:silent +csharp_style_prefer_switch_expression = true:suggestion + +# Null-checking preferences +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_prefer_static_local_function = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent + +# Code-block preferences +csharp_prefer_braces = true:silent +csharp_prefer_simple_using_statement = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent + +# 'using' directive preferences +csharp_using_directive_placement = inside_namespace:silent + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = false +csharp_new_line_before_else = false +csharp_new_line_before_finally = false +csharp_new_line_before_members_in_anonymous_types = false +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_open_brace = none +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case diff --git a/files/ib002/graphs/iterative-and-iterators/.gitignore b/files/ib002/graphs/iterative-and-iterators/.gitignore new file mode 100644 index 0000000..8bf1b90 --- /dev/null +++ b/files/ib002/graphs/iterative-and-iterators/.gitignore @@ -0,0 +1,448 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*[.json, .xml, .info] + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# Ionide - VsCode extension for F# Support +.ionide/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/files/ib002/graphs/iterative-and-iterators/graphs.csproj b/files/ib002/graphs/iterative-and-iterators/graphs.csproj new file mode 100644 index 0000000..ce937de --- /dev/null +++ b/files/ib002/graphs/iterative-and-iterators/graphs.csproj @@ -0,0 +1,10 @@ + + + + Exe + net5.0 + + enable + + + diff --git a/files/ib002/graphs/iterative-and-iterators/src/BFS.cs b/files/ib002/graphs/iterative-and-iterators/src/BFS.cs new file mode 100644 index 0000000..68901d9 --- /dev/null +++ b/files/ib002/graphs/iterative-and-iterators/src/BFS.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; + +namespace graphs { + class BFS where T : notnull { + private Graph graph; + + private Dictionary Distance = new Dictionary(); + private Dictionary Parent = new Dictionary(); + private Dictionary State = new Dictionary(); + + public BFS(Graph graph) { + this.graph = graph; + } + + public BFS Run() { + foreach (var vertex in graph.Vertices) { + if (ColorOf(vertex) == Color.White) { + RunFrom(vertex); + } + } + + return this; + } + + public BFS RunFrom(T start) { + State[start] = Color.Gray; + Distance[start] = 0; + Parent[start] = default(T); + + var queue = new Queue(); + queue.Enqueue(start); + + while (queue.Count > 0) { + var u = queue.Dequeue(); + + for (var iterator = graph.GetEdgesFrom(u); iterator.MoveNext();) { + var v = iterator.Current; + + if (GetOrDefault(State, v, Color.White) == Color.White) { + State[v] = Color.Gray; + Distance[v] = Distance[u] + 1; + Parent[v] = u; + + queue.Enqueue(v); + } + } + + State[u] = Color.Black; + } + + return this; + } + + private static V GetOrDefault(Dictionary flags, U u, V defaultValue) + where U : notnull { + if (flags.TryGetValue(u, out var flag)) { + return flag; + } + return defaultValue; + } + + public int DistanceTo(T u) => GetOrDefault(Distance, u, 0); + public T? ParentOf(T u) => GetOrDefault(Parent, u, default(T)); + public Color ColorOf(T u) => GetOrDefault(State, u, Color.White); + } +} diff --git a/files/ib002/graphs/iterative-and-iterators/src/DFS.cs b/files/ib002/graphs/iterative-and-iterators/src/DFS.cs new file mode 100644 index 0000000..626eba4 --- /dev/null +++ b/files/ib002/graphs/iterative-and-iterators/src/DFS.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; + +namespace graphs { + class DFS where T : notnull { + private Graph graph; + + private int time; + private Dictionary Discovered = new Dictionary(); + private Dictionary Finished = new Dictionary(); + private Dictionary State = new Dictionary(); + + public DFS(Graph graph) { + this.graph = graph; + } + + public DFS Run() { + time = 0; + + foreach (var vertex in graph.Vertices) { + if (ColorOf(vertex) == Color.White) { + RunFrom(vertex, false); + } + } + + return this; + } + + public DFS RunFrom(T start, bool reset = true) { + var path = new Stack<(T, IEnumerator)>(); + + if (reset) { + time = 0; + } + + (Discovered[start], State[start]) = (++time, Color.Gray); + path.Push((start, graph.GetEdgesFrom(start))); + + while (path.Count > 0) { + var (lastVertex, successors) = path.Peek(); + + if (!successors.MoveNext()) { + path.Pop(); + (Finished[lastVertex], State[lastVertex]) = (++time, Color.Black); + } else if (ColorOf(successors.Current) == Color.White) { + var nextVertex = successors.Current; + + (Discovered[nextVertex], State[nextVertex]) = (++time, Color.Gray); + path.Push((nextVertex, graph.GetEdgesFrom(nextVertex))); + } + } + + return this; + } + + private static V GetOrDefault(Dictionary flags, U u, V defaultValue) + where U : notnull + where V : notnull { + if (flags.TryGetValue(u, out var flag)) { + return flag; + } + return defaultValue; + } + + public int DiscoveredAt(T u) => GetOrDefault(Discovered, u, 0); + public int FinishedAt(T u) => GetOrDefault(Finished, u, 0); + public Color ColorOf(T u) => GetOrDefault(State, u, Color.White); + } +} diff --git a/files/ib002/graphs/iterative-and-iterators/src/Graph.cs b/files/ib002/graphs/iterative-and-iterators/src/Graph.cs new file mode 100644 index 0000000..220779c --- /dev/null +++ b/files/ib002/graphs/iterative-and-iterators/src/Graph.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Linq; + +namespace graphs { + enum Color { + White, Gray, Black + } + + class Graph where T : notnull { + private SortedSet vertices = new SortedSet(); + private SortedDictionary> edges = new SortedDictionary>(); + + public SortedSet Vertices { + get => vertices; + } + + public void AddVertex(T u) { + vertices.Add(u); + edges.Add(u, new SortedSet()); + } + + public void AddEdge(T u, T v) { + if (edges.TryGetValue(u, out var edgesFromU)) { + edgesFromU.Add(v); + } + } + + public bool HasEdge(T u, T v) { + if (edges.TryGetValue(u, out var edgesFromU)) { + return edgesFromU.Contains(v); + } + + return false; + } + + public IEnumerator GetEdgesFrom(T u) { + if (edges.TryGetValue(u, out var edgesFromU)) { + return edgesFromU.GetEnumerator(); + } + + return Enumerable.Empty().GetEnumerator(); + } + } +} diff --git a/files/ib002/graphs/iterative-and-iterators/src/Program.cs b/files/ib002/graphs/iterative-and-iterators/src/Program.cs new file mode 100644 index 0000000..64790fd --- /dev/null +++ b/files/ib002/graphs/iterative-and-iterators/src/Program.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace graphs { + class Program { + static Graph CreateExampleGraph() { + var vertices = new List() { + "s", "q", "t", "y", "r", "v", "w", "x", "z", "u" + }; + + var graph = new Graph(); + + foreach (var vertex in vertices) { + graph.AddVertex(vertex); + } + + graph.AddEdge("s", "v"); + graph.AddEdge("q", "s"); + graph.AddEdge("q", "w"); + graph.AddEdge("q", "t"); + graph.AddEdge("t", "y"); + graph.AddEdge("t", "x"); + graph.AddEdge("y", "q"); + graph.AddEdge("r", "y"); + graph.AddEdge("r", "u"); + graph.AddEdge("v", "w"); + graph.AddEdge("w", "s"); + graph.AddEdge("x", "w"); + graph.AddEdge("x", "z"); + graph.AddEdge("z", "x"); + graph.AddEdge("u", "y"); + + return graph; + } + + static void Main(string[] args) { + var graph = CreateExampleGraph(); + + var dfsTraversal = new DFS(graph).Run(); + foreach (var vertex in graph.Vertices) { + Console.WriteLine($"{vertex}(d: {dfsTraversal.DiscoveredAt(vertex)}, f: {dfsTraversal.FinishedAt(vertex)})"); + } + } + } +} diff --git a/files/ib002/rb-trees/rules/rb.dot b/files/ib002/rb-trees/rules/rb.dot new file mode 100644 index 0000000..f494cbc --- /dev/null +++ b/files/ib002/rb-trees/rules/rb.dot @@ -0,0 +1,47 @@ +digraph { + "Node(value=3, rank=2)" [label="3"]; #done + "Node(value=1, rank=1)" [label="1"]; #done + "Node(value=4, rank=0)" [label="4"]; #done + "Node(value=7, rank=1)" [label="7", color="red"]; #done + "Node(value=0, rank=0)" [label="0"]; #done + "Node(value=2, rank=0)" [label="2"]; #done + "Node(value=5, rank=1)" [label="5"]; #done + "Node(value=6, rank=0)" [label="6"]; #done + "Node(value=8, rank=0)" [label="8"]; #done + + "nil1" [label="nil"] + "nil2" [label="nil"] + "nil3" [label="nil"] + "nil4" [label="nil"] + "nil5" [label="nil"] + "nil6" [label="nil"] + "nil7" [label="nil"] + "nil8" [label="nil"] + "nil9" [label="nil"] + "nil10" [label="nil"] + "nil11" [label="nil"] + "Node(value=9, rank=0)" [label="9", color="red"]; #done + + "Node(value=3, rank=2)" -> "Node(value=1, rank=1)" #done + "Node(value=1, rank=1)" -> "Node(value=0, rank=0)" #done + "Node(value=1, rank=1)" -> "Node(value=2, rank=0)" #done + "Node(value=3, rank=2)" -> "Node(value=5, rank=1)" #done + "Node(value=5, rank=1)" -> "Node(value=4, rank=0)" #done + "Node(value=5, rank=1)" -> "Node(value=7, rank=1)" [color="red"] #done + "Node(value=7, rank=1)" -> "Node(value=6, rank=0)" #done + "Node(value=7, rank=1)" -> "Node(value=8, rank=0)" #done + + "Node(value=8, rank=0)" -> "nil1" + "Node(value=8, rank=0)" -> "Node(value=9, rank=0)" [color="red"] #done + + "Node(value=0, rank=0)" -> "nil2" + "Node(value=0, rank=0)" -> "nil3" + "Node(value=2, rank=0)" -> "nil4" + "Node(value=2, rank=0)" -> "nil5" + "Node(value=4, rank=0)" -> "nil6" + "Node(value=4, rank=0)" -> "nil7" + "Node(value=6, rank=0)" -> "nil8" + "Node(value=6, rank=0)" -> "nil9" + "Node(value=9, rank=0)" -> "nil10" + "Node(value=9, rank=0)" -> "nil11" +} \ No newline at end of file diff --git a/files/ib002/rb-trees/rules/rb_dark.png b/files/ib002/rb-trees/rules/rb_dark.png new file mode 100644 index 0000000..450a983 Binary files /dev/null and b/files/ib002/rb-trees/rules/rb_dark.png differ diff --git a/files/ib002/rb-trees/rules/rb_height.dot b/files/ib002/rb-trees/rules/rb_height.dot new file mode 100644 index 0000000..034ac64 --- /dev/null +++ b/files/ib002/rb-trees/rules/rb_height.dot @@ -0,0 +1,47 @@ +digraph { + "Node(value=3, rank=2)" [label="3⁽³⁾"]; #done + "Node(value=1, rank=1)" [label="1⁽²⁾"]; #done + "Node(value=4, rank=0)" [label="4⁽¹⁾"]; #done + "Node(value=7, rank=1)" [label="7⁽²⁾", color="red"]; #done + "Node(value=0, rank=0)" [label="0⁽¹⁾"]; #done + "Node(value=2, rank=0)" [label="2⁽¹⁾"]; #done + "Node(value=5, rank=1)" [label="5⁽²⁾"]; #done + "Node(value=6, rank=0)" [label="6⁽¹⁾"]; #done + "Node(value=8, rank=0)" [label="8⁽¹⁾"]; #done + + "nil1" [label="nil"] + "nil2" [label="nil"] + "nil3" [label="nil"] + "nil4" [label="nil"] + "nil5" [label="nil"] + "nil6" [label="nil"] + "nil7" [label="nil"] + "nil8" [label="nil"] + "nil9" [label="nil"] + "nil10" [label="nil"] + "nil11" [label="nil"] + "Node(value=9, rank=0)" [label="9⁽¹⁾", color="red"]; #done + + "Node(value=3, rank=2)" -> "Node(value=1, rank=1)" #done + "Node(value=1, rank=1)" -> "Node(value=0, rank=0)" #done + "Node(value=1, rank=1)" -> "Node(value=2, rank=0)" #done + "Node(value=3, rank=2)" -> "Node(value=5, rank=1)" #done + "Node(value=5, rank=1)" -> "Node(value=4, rank=0)" #done + "Node(value=5, rank=1)" -> "Node(value=7, rank=1)" [color="red"] #done + "Node(value=7, rank=1)" -> "Node(value=6, rank=0)" #done + "Node(value=7, rank=1)" -> "Node(value=8, rank=0)" #done + + "Node(value=8, rank=0)" -> "nil1" + "Node(value=8, rank=0)" -> "Node(value=9, rank=0)" [color="red"] #done + + "Node(value=0, rank=0)" -> "nil2" + "Node(value=0, rank=0)" -> "nil3" + "Node(value=2, rank=0)" -> "nil4" + "Node(value=2, rank=0)" -> "nil5" + "Node(value=4, rank=0)" -> "nil6" + "Node(value=4, rank=0)" -> "nil7" + "Node(value=6, rank=0)" -> "nil8" + "Node(value=6, rank=0)" -> "nil9" + "Node(value=9, rank=0)" -> "nil10" + "Node(value=9, rank=0)" -> "nil11" +} \ No newline at end of file diff --git a/files/ib002/rb-trees/rules/rb_height_dark.png b/files/ib002/rb-trees/rules/rb_height_dark.png new file mode 100644 index 0000000..0a9c6c7 Binary files /dev/null and b/files/ib002/rb-trees/rules/rb_height_dark.png differ diff --git a/files/ib002/rb-trees/rules/rb_height_light.png b/files/ib002/rb-trees/rules/rb_height_light.png new file mode 100644 index 0000000..1b611c7 Binary files /dev/null and b/files/ib002/rb-trees/rules/rb_height_light.png differ diff --git a/files/ib002/rb-trees/rules/rb_light.png b/files/ib002/rb-trees/rules/rb_light.png new file mode 100644 index 0000000..a73079e Binary files /dev/null and b/files/ib002/rb-trees/rules/rb_light.png differ diff --git a/files/ib002/rb-trees/rules/red-node-black-children/correct.dot b/files/ib002/rb-trees/rules/red-node-black-children/correct.dot new file mode 100644 index 0000000..785f4f9 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-node-black-children/correct.dot @@ -0,0 +1,34 @@ +digraph { + "Node(value=3, rank=2)" [label="3"]; #done + "Node(value=1, rank=1)" [label="1", color="red"]; #done + "Node(value=4, rank=0)" [label="4", color="red"]; #done + "Node(value=7, rank=0)" [label="7", color="red"]; #done + "Node(value=0, rank=0)" [label="0"]; #done + "Node(value=2, rank=0)" [label="2"]; #done + "Node(value=5, rank=1)" [label="5"]; #done + + "nil2" [label="", color=none] + "nil3" [label="", color=none] + "nil4" [label="", color=none] + "nil5" [label="", color=none] + "nil6" [label="", color=none] + "nil7" [label="", color=none] + "nil8" [label="", color=none] + "nil9" [label="", color=none] + + "Node(value=3, rank=2)" -> "Node(value=1, rank=1)" #done + "Node(value=1, rank=1)" -> "Node(value=0, rank=0)" #done + "Node(value=1, rank=1)" -> "Node(value=2, rank=0)" #done + "Node(value=3, rank=2)" -> "Node(value=5, rank=1)" #done + "Node(value=5, rank=1)" -> "Node(value=4, rank=0)" #done + "Node(value=5, rank=1)" -> "Node(value=7, rank=0)" [color="red"] #done + + "Node(value=0, rank=0)" -> "nil2" + "Node(value=0, rank=0)" -> "nil3" + "Node(value=2, rank=0)" -> "nil4" + "Node(value=2, rank=0)" -> "nil5" + "Node(value=4, rank=0)" -> "nil6" + "Node(value=4, rank=0)" -> "nil7" + "Node(value=7, rank=0)" -> "nil8" + "Node(value=7, rank=0)" -> "nil9" +} \ No newline at end of file diff --git a/files/ib002/rb-trees/rules/red-node-black-children/correct_dark.png b/files/ib002/rb-trees/rules/red-node-black-children/correct_dark.png new file mode 100644 index 0000000..a6473fa Binary files /dev/null and b/files/ib002/rb-trees/rules/red-node-black-children/correct_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-node-black-children/correct_light.png b/files/ib002/rb-trees/rules/red-node-black-children/correct_light.png new file mode 100644 index 0000000..26a58d5 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-node-black-children/correct_light.png differ diff --git a/files/ib002/rb-trees/rules/red-node-black-children/incorrect.dot b/files/ib002/rb-trees/rules/red-node-black-children/incorrect.dot new file mode 100644 index 0000000..a2428a0 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-node-black-children/incorrect.dot @@ -0,0 +1,40 @@ +digraph { + "Node(value=3, rank=2)" [label="3"]; #done + "Node(value=1, rank=1)" [label="1", color="red"]; #done + "Node(value=4, rank=0)" [label="4", color="red"]; #done + "Node(value=7, rank=0)" [label="7", color="red"]; #done + "Node(value=0, rank=0)" [label="0"]; #done + "Node(value=2, rank=0)" [label="2"]; #done + "Node(value=5, rank=1)" [label="5"]; #done + + + "nil2" [label="", color=none] + "nil3" [label="", color=none] + "nil4" [label="", color=none] + "nil5" [label="", color=none] + "nil6" [label="", color=none] + "nil7" [label="", color=none] + "nil8" [label="", color=none] + "nil9" [label="", color=none] + "nil10" [label="", color=none] + "8" [label="8", color="red"] + + "Node(value=3, rank=2)" -> "Node(value=1, rank=1)" #done + "Node(value=1, rank=1)" -> "Node(value=0, rank=0)" #done + "Node(value=1, rank=1)" -> "Node(value=2, rank=0)" #done + "Node(value=3, rank=2)" -> "Node(value=5, rank=1)" #done + "Node(value=5, rank=1)" -> "Node(value=4, rank=0)" #done + "Node(value=5, rank=1)" -> "Node(value=7, rank=0)" [color="red"] #done + + "Node(value=0, rank=0)" -> "nil2" + "Node(value=0, rank=0)" -> "nil3" + "Node(value=2, rank=0)" -> "nil4" + "Node(value=2, rank=0)" -> "nil5" + "Node(value=4, rank=0)" -> "nil6" + "Node(value=4, rank=0)" -> "nil7" + "Node(value=7, rank=0)" -> "nil8" + "Node(value=7, rank=0)" -> "8" [color="red"] + + "8" -> "nil9" + "8" -> "nil10" +} \ No newline at end of file diff --git a/files/ib002/rb-trees/rules/red-node-black-children/incorrect_dark.png b/files/ib002/rb-trees/rules/red-node-black-children/incorrect_dark.png new file mode 100644 index 0000000..397fdc5 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-node-black-children/incorrect_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-node-black-children/incorrect_light.png b/files/ib002/rb-trees/rules/red-node-black-children/incorrect_light.png new file mode 100644 index 0000000..4e5e452 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-node-black-children/incorrect_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_0.dot b/files/ib002/rb-trees/rules/red-root/br_0.dot new file mode 100644 index 0000000..8877a45 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_0.dot @@ -0,0 +1,7 @@ +digraph RBTree { +"140399805603280" [label="12"] +L140399805603280 [label="",color=none] +140399805603280 -> L140399805603280 +R140399805603280 [label="",color=none] +140399805603280 -> R140399805603280 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_0_dark.png b/files/ib002/rb-trees/rules/red-root/br_0_dark.png new file mode 100644 index 0000000..f8f9059 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_0_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_0_light.png b/files/ib002/rb-trees/rules/red-root/br_0_light.png new file mode 100644 index 0000000..4fdb365 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_0_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_1.dot b/files/ib002/rb-trees/rules/red-root/br_1.dot new file mode 100644 index 0000000..c7ff4f0 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_1.dot @@ -0,0 +1,11 @@ +digraph RBTree { +"140399805603280" [label="12"] +"140399805603280" -> "140399804142928" [color="red"] +"140399804142928" [color=red,label="5"] +L140399804142928 [label="",color=none] +140399804142928 -> L140399804142928 +R140399804142928 [label="",color=none] +140399804142928 -> R140399804142928 +R140399805603280 [label="",color=none] +140399805603280 -> R140399805603280 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_1_dark.png b/files/ib002/rb-trees/rules/red-root/br_1_dark.png new file mode 100644 index 0000000..895ef0e Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_1_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_1_light.png b/files/ib002/rb-trees/rules/red-root/br_1_light.png new file mode 100644 index 0000000..4ebd25e Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_1_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_2.dot b/files/ib002/rb-trees/rules/red-root/br_2.dot new file mode 100644 index 0000000..f4387c8 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_2.dot @@ -0,0 +1,15 @@ +digraph RBTree { +"140399805910672" [label="9"] +"140399805910672" -> "140399804142928" [color="red"] +"140399804142928" [color=red,label="5"] +L140399804142928 [label="",color=none] +140399804142928 -> L140399804142928 +R140399804142928 [label="",color=none] +140399804142928 -> R140399804142928 +"140399805910672" -> "140399805603280" [color="red"] +"140399805603280" [color=red,label="12"] +L140399805603280 [label="",color=none] +140399805603280 -> L140399805603280 +R140399805603280 [label="",color=none] +140399805603280 -> R140399805603280 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_2_dark.png b/files/ib002/rb-trees/rules/red-root/br_2_dark.png new file mode 100644 index 0000000..e31c482 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_2_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_2_light.png b/files/ib002/rb-trees/rules/red-root/br_2_light.png new file mode 100644 index 0000000..fdbf993 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_2_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_3.dot b/files/ib002/rb-trees/rules/red-root/br_3.dot new file mode 100644 index 0000000..fe0b4f9 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_3.dot @@ -0,0 +1,19 @@ +digraph RBTree { +"140399805910672" [label="9"] +"140399805910672" -> "140399804142928" +"140399804142928" [label="5"] +L140399804142928 [label="",color=none] +140399804142928 -> L140399804142928 +R140399804142928 [label="",color=none] +140399804142928 -> R140399804142928 +"140399805910672" -> "140399805603280" +"140399805603280" [label="12"] +L140399805603280 [label="",color=none] +140399805603280 -> L140399805603280 +"140399805603280" -> "140399805700368" [color="red"] +"140399805700368" [color=red,label="18"] +L140399805700368 [label="",color=none] +140399805700368 -> L140399805700368 +R140399805700368 [label="",color=none] +140399805700368 -> R140399805700368 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_3_dark.png b/files/ib002/rb-trees/rules/red-root/br_3_dark.png new file mode 100644 index 0000000..5ec0154 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_3_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_3_light.png b/files/ib002/rb-trees/rules/red-root/br_3_light.png new file mode 100644 index 0000000..a6470aa Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_3_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_4.dot b/files/ib002/rb-trees/rules/red-root/br_4.dot new file mode 100644 index 0000000..41ba8e3 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_4.dot @@ -0,0 +1,23 @@ +digraph RBTree { +"140399805910672" [label="9"] +"140399805910672" -> "140399804142928" +"140399804142928" [label="5"] +"140399804142928" -> "140399805700304" [color="red"] +"140399805700304" [color=red,label="2"] +L140399805700304 [label="",color=none] +140399805700304 -> L140399805700304 +R140399805700304 [label="",color=none] +140399805700304 -> R140399805700304 +R140399804142928 [label="",color=none] +140399804142928 -> R140399804142928 +"140399805910672" -> "140399805603280" +"140399805603280" [label="12"] +L140399805603280 [label="",color=none] +140399805603280 -> L140399805603280 +"140399805603280" -> "140399805700368" [color="red"] +"140399805700368" [color=red,label="18"] +L140399805700368 [label="",color=none] +140399805700368 -> L140399805700368 +R140399805700368 [label="",color=none] +140399805700368 -> R140399805700368 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_4_dark.png b/files/ib002/rb-trees/rules/red-root/br_4_dark.png new file mode 100644 index 0000000..0878a05 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_4_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_4_light.png b/files/ib002/rb-trees/rules/red-root/br_4_light.png new file mode 100644 index 0000000..891c044 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_4_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_5.dot b/files/ib002/rb-trees/rules/red-root/br_5.dot new file mode 100644 index 0000000..61daf82 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_5.dot @@ -0,0 +1,27 @@ +digraph RBTree { +"140399805910672" [label="9"] +"140399805910672" -> "140399804142928" +"140399804142928" [label="5"] +"140399804142928" -> "140399805700304" [color="red"] +"140399805700304" [color=red,label="2"] +L140399805700304 [label="",color=none] +140399805700304 -> L140399805700304 +R140399805700304 [label="",color=none] +140399805700304 -> R140399805700304 +R140399804142928 [label="",color=none] +140399804142928 -> R140399804142928 +"140399805910672" -> "140399805605392" +"140399805605392" [label="15"] +"140399805605392" -> "140399805603280" [color="red"] +"140399805603280" [color=red,label="12"] +L140399805603280 [label="",color=none] +140399805603280 -> L140399805603280 +R140399805603280 [label="",color=none] +140399805603280 -> R140399805603280 +"140399805605392" -> "140399805700368" [color="red"] +"140399805700368" [color=red,label="18"] +L140399805700368 [label="",color=none] +140399805700368 -> L140399805700368 +R140399805700368 [label="",color=none] +140399805700368 -> R140399805700368 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_5_dark.png b/files/ib002/rb-trees/rules/red-root/br_5_dark.png new file mode 100644 index 0000000..df8d545 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_5_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_5_light.png b/files/ib002/rb-trees/rules/red-root/br_5_light.png new file mode 100644 index 0000000..2d18350 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_5_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_6.dot b/files/ib002/rb-trees/rules/red-root/br_6.dot new file mode 100644 index 0000000..89720ef --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_6.dot @@ -0,0 +1,31 @@ +digraph RBTree { +"140399805910672" [label="9"] +"140399805910672" -> "140399804142928" +"140399804142928" [label="5"] +"140399804142928" -> "140399805700304" [color="red"] +"140399805700304" [color=red,label="2"] +L140399805700304 [label="",color=none] +140399805700304 -> L140399805700304 +R140399805700304 [label="",color=none] +140399805700304 -> R140399805700304 +R140399804142928 [label="",color=none] +140399804142928 -> R140399804142928 +"140399805910672" -> "140399805605392" [color="red"] +"140399805605392" [color=red,label="15"] +"140399805605392" -> "140399805603280" +"140399805603280" [label="12"] +L140399805603280 [label="",color=none] +140399805603280 -> L140399805603280 +"140399805603280" -> "140399805605456" [color="red"] +"140399805605456" [color=red,label="13"] +L140399805605456 [label="",color=none] +140399805605456 -> L140399805605456 +R140399805605456 [label="",color=none] +140399805605456 -> R140399805605456 +"140399805605392" -> "140399805700368" +"140399805700368" [label="18"] +L140399805700368 [label="",color=none] +140399805700368 -> L140399805700368 +R140399805700368 [label="",color=none] +140399805700368 -> R140399805700368 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_6_dark.png b/files/ib002/rb-trees/rules/red-root/br_6_dark.png new file mode 100644 index 0000000..4aa0194 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_6_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_6_light.png b/files/ib002/rb-trees/rules/red-root/br_6_light.png new file mode 100644 index 0000000..7483fe8 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_6_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_7.dot b/files/ib002/rb-trees/rules/red-root/br_7.dot new file mode 100644 index 0000000..21514cd --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_7.dot @@ -0,0 +1,35 @@ +digraph RBTree { +"140399805910672" [label="9"] +"140399805910672" -> "140399804142928" +"140399804142928" [label="5"] +"140399804142928" -> "140399805700304" [color="red"] +"140399805700304" [color=red,label="2"] +L140399805700304 [label="",color=none] +140399805700304 -> L140399805700304 +R140399805700304 [label="",color=none] +140399805700304 -> R140399805700304 +R140399804142928 [label="",color=none] +140399804142928 -> R140399804142928 +"140399805910672" -> "140399805605392" [color="red"] +"140399805605392" [color=red,label="15"] +"140399805605392" -> "140399805603280" +"140399805603280" [label="12"] +L140399805603280 [label="",color=none] +140399805603280 -> L140399805603280 +"140399805603280" -> "140399805605456" [color="red"] +"140399805605456" [color=red,label="13"] +L140399805605456 [label="",color=none] +140399805605456 -> L140399805605456 +R140399805605456 [label="",color=none] +140399805605456 -> R140399805605456 +"140399805605392" -> "140399805700368" +"140399805700368" [label="18"] +L140399805700368 [label="",color=none] +140399805700368 -> L140399805700368 +"140399805700368" -> "140399805605584" [color="red"] +"140399805605584" [color=red,label="19"] +L140399805605584 [label="",color=none] +140399805605584 -> L140399805605584 +R140399805605584 [label="",color=none] +140399805605584 -> R140399805605584 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_7_dark.png b/files/ib002/rb-trees/rules/red-root/br_7_dark.png new file mode 100644 index 0000000..3ea4864 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_7_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_7_light.png b/files/ib002/rb-trees/rules/red-root/br_7_light.png new file mode 100644 index 0000000..8e75618 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_7_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_8.dot b/files/ib002/rb-trees/rules/red-root/br_8.dot new file mode 100644 index 0000000..d025321 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/br_8.dot @@ -0,0 +1,39 @@ +digraph RBTree { +"140399805910672" [label="9"] +"140399805910672" -> "140399804142928" +"140399804142928" [label="5"] +"140399804142928" -> "140399805700304" [color="red"] +"140399805700304" [color=red,label="2"] +L140399805700304 [label="",color=none] +140399805700304 -> L140399805700304 +R140399805700304 [label="",color=none] +140399805700304 -> R140399805700304 +R140399804142928 [label="",color=none] +140399804142928 -> R140399804142928 +"140399805910672" -> "140399805605392" [color="red"] +"140399805605392" [color=red,label="15"] +"140399805605392" -> "140399805603280" +"140399805603280" [label="12"] +L140399805603280 [label="",color=none] +140399805603280 -> L140399805603280 +"140399805603280" -> "140399805605456" [color="red"] +"140399805605456" [color=red,label="13"] +L140399805605456 [label="",color=none] +140399805605456 -> L140399805605456 +R140399805605456 [label="",color=none] +140399805605456 -> R140399805605456 +"140399805605392" -> "140399805700368" +"140399805700368" [label="18"] +"140399805700368" -> "140399804318928" [color="red"] +"140399804318928" [color=red,label="17"] +L140399804318928 [label="",color=none] +140399804318928 -> L140399804318928 +R140399804318928 [label="",color=none] +140399804318928 -> R140399804318928 +"140399805700368" -> "140399805605584" [color="red"] +"140399805605584" [color=red,label="19"] +L140399805605584 [label="",color=none] +140399805605584 -> L140399805605584 +R140399805605584 [label="",color=none] +140399805605584 -> R140399805605584 +} diff --git a/files/ib002/rb-trees/rules/red-root/br_8_dark.png b/files/ib002/rb-trees/rules/red-root/br_8_dark.png new file mode 100644 index 0000000..f68c4c2 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_8_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/br_8_light.png b/files/ib002/rb-trees/rules/red-root/br_8_light.png new file mode 100644 index 0000000..d2cb42b Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/br_8_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_0.dot b/files/ib002/rb-trees/rules/red-root/rr_0.dot new file mode 100644 index 0000000..2827711 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_0.dot @@ -0,0 +1,7 @@ +digraph RBTree { +"139660435791312" [color=red,label="12"] +L139660435791312 [label="",color=none] +139660435791312 -> L139660435791312 +R139660435791312 [label="",color=none] +139660435791312 -> R139660435791312 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_0_dark.png b/files/ib002/rb-trees/rules/red-root/rr_0_dark.png new file mode 100644 index 0000000..3c63b65 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_0_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_0_light.png b/files/ib002/rb-trees/rules/red-root/rr_0_light.png new file mode 100644 index 0000000..9ac7a42 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_0_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_1.dot b/files/ib002/rb-trees/rules/red-root/rr_1.dot new file mode 100644 index 0000000..4dcbf83 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_1.dot @@ -0,0 +1,11 @@ +digraph RBTree { +"139660435791312" [label="12"] +"139660435791312" -> "139660436098128" [color="red"] +"139660436098128" [color=red,label="5"] +L139660436098128 [label="",color=none] +139660436098128 -> L139660436098128 +R139660436098128 [label="",color=none] +139660436098128 -> R139660436098128 +R139660435791312 [label="",color=none] +139660435791312 -> R139660435791312 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_1_dark.png b/files/ib002/rb-trees/rules/red-root/rr_1_dark.png new file mode 100644 index 0000000..895ef0e Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_1_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_1_light.png b/files/ib002/rb-trees/rules/red-root/rr_1_light.png new file mode 100644 index 0000000..4ebd25e Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_1_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_2.dot b/files/ib002/rb-trees/rules/red-root/rr_2.dot new file mode 100644 index 0000000..c79d728 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_2.dot @@ -0,0 +1,15 @@ +digraph RBTree { +"139660434247376" [label="9"] +"139660434247376" -> "139660436098128" [color="red"] +"139660436098128" [color=red,label="5"] +L139660436098128 [label="",color=none] +139660436098128 -> L139660436098128 +R139660436098128 [label="",color=none] +139660436098128 -> R139660436098128 +"139660434247376" -> "139660435791312" [color="red"] +"139660435791312" [color=red,label="12"] +L139660435791312 [label="",color=none] +139660435791312 -> L139660435791312 +R139660435791312 [label="",color=none] +139660435791312 -> R139660435791312 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_2_dark.png b/files/ib002/rb-trees/rules/red-root/rr_2_dark.png new file mode 100644 index 0000000..e31c482 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_2_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_2_light.png b/files/ib002/rb-trees/rules/red-root/rr_2_light.png new file mode 100644 index 0000000..fdbf993 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_2_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_3.dot b/files/ib002/rb-trees/rules/red-root/rr_3.dot new file mode 100644 index 0000000..d0396a0 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_3.dot @@ -0,0 +1,19 @@ +digraph RBTree { +"139660434247376" [color=red,label="9"] +"139660434247376" -> "139660436098128" +"139660436098128" [label="5"] +L139660436098128 [label="",color=none] +139660436098128 -> L139660436098128 +R139660436098128 [label="",color=none] +139660436098128 -> R139660436098128 +"139660434247376" -> "139660435791312" +"139660435791312" [label="12"] +L139660435791312 [label="",color=none] +139660435791312 -> L139660435791312 +"139660435791312" -> "139660435887824" [color="red"] +"139660435887824" [color=red,label="18"] +L139660435887824 [label="",color=none] +139660435887824 -> L139660435887824 +R139660435887824 [label="",color=none] +139660435887824 -> R139660435887824 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_3_dark.png b/files/ib002/rb-trees/rules/red-root/rr_3_dark.png new file mode 100644 index 0000000..e8c10fe Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_3_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_3_light.png b/files/ib002/rb-trees/rules/red-root/rr_3_light.png new file mode 100644 index 0000000..d236d68 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_3_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_4.dot b/files/ib002/rb-trees/rules/red-root/rr_4.dot new file mode 100644 index 0000000..da78acd --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_4.dot @@ -0,0 +1,23 @@ +digraph RBTree { +"139660434247376" [color=red,label="9"] +"139660434247376" -> "139660436098128" +"139660436098128" [label="5"] +"139660436098128" -> "139660435887760" [color="red"] +"139660435887760" [color=red,label="2"] +L139660435887760 [label="",color=none] +139660435887760 -> L139660435887760 +R139660435887760 [label="",color=none] +139660435887760 -> R139660435887760 +R139660436098128 [label="",color=none] +139660436098128 -> R139660436098128 +"139660434247376" -> "139660435791312" +"139660435791312" [label="12"] +L139660435791312 [label="",color=none] +139660435791312 -> L139660435791312 +"139660435791312" -> "139660435887824" [color="red"] +"139660435887824" [color=red,label="18"] +L139660435887824 [label="",color=none] +139660435887824 -> L139660435887824 +R139660435887824 [label="",color=none] +139660435887824 -> R139660435887824 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_4_dark.png b/files/ib002/rb-trees/rules/red-root/rr_4_dark.png new file mode 100644 index 0000000..c5614a0 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_4_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_4_light.png b/files/ib002/rb-trees/rules/red-root/rr_4_light.png new file mode 100644 index 0000000..80c47f8 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_4_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_5.dot b/files/ib002/rb-trees/rules/red-root/rr_5.dot new file mode 100644 index 0000000..753579b --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_5.dot @@ -0,0 +1,27 @@ +digraph RBTree { +"139660434247376" [color=red,label="9"] +"139660434247376" -> "139660436098128" +"139660436098128" [label="5"] +"139660436098128" -> "139660435887760" [color="red"] +"139660435887760" [color=red,label="2"] +L139660435887760 [label="",color=none] +139660435887760 -> L139660435887760 +R139660435887760 [label="",color=none] +139660435887760 -> R139660435887760 +R139660436098128 [label="",color=none] +139660436098128 -> R139660436098128 +"139660434247376" -> "139660435793424" +"139660435793424" [label="15"] +"139660435793424" -> "139660435791312" [color="red"] +"139660435791312" [color=red,label="12"] +L139660435791312 [label="",color=none] +139660435791312 -> L139660435791312 +R139660435791312 [label="",color=none] +139660435791312 -> R139660435791312 +"139660435793424" -> "139660435887824" [color="red"] +"139660435887824" [color=red,label="18"] +L139660435887824 [label="",color=none] +139660435887824 -> L139660435887824 +R139660435887824 [label="",color=none] +139660435887824 -> R139660435887824 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_5_dark.png b/files/ib002/rb-trees/rules/red-root/rr_5_dark.png new file mode 100644 index 0000000..b7ce250 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_5_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_5_light.png b/files/ib002/rb-trees/rules/red-root/rr_5_light.png new file mode 100644 index 0000000..e32514a Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_5_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_6.dot b/files/ib002/rb-trees/rules/red-root/rr_6.dot new file mode 100644 index 0000000..984fab5 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_6.dot @@ -0,0 +1,31 @@ +digraph RBTree { +"139660434247376" [label="9"] +"139660434247376" -> "139660436098128" +"139660436098128" [label="5"] +"139660436098128" -> "139660435887760" [color="red"] +"139660435887760" [color=red,label="2"] +L139660435887760 [label="",color=none] +139660435887760 -> L139660435887760 +R139660435887760 [label="",color=none] +139660435887760 -> R139660435887760 +R139660436098128 [label="",color=none] +139660436098128 -> R139660436098128 +"139660434247376" -> "139660435793424" [color="red"] +"139660435793424" [color=red,label="15"] +"139660435793424" -> "139660435791312" +"139660435791312" [label="12"] +L139660435791312 [label="",color=none] +139660435791312 -> L139660435791312 +"139660435791312" -> "139660435793488" [color="red"] +"139660435793488" [color=red,label="13"] +L139660435793488 [label="",color=none] +139660435793488 -> L139660435793488 +R139660435793488 [label="",color=none] +139660435793488 -> R139660435793488 +"139660435793424" -> "139660435887824" +"139660435887824" [label="18"] +L139660435887824 [label="",color=none] +139660435887824 -> L139660435887824 +R139660435887824 [label="",color=none] +139660435887824 -> R139660435887824 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_6_dark.png b/files/ib002/rb-trees/rules/red-root/rr_6_dark.png new file mode 100644 index 0000000..4aa0194 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_6_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_6_light.png b/files/ib002/rb-trees/rules/red-root/rr_6_light.png new file mode 100644 index 0000000..7483fe8 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_6_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_7.dot b/files/ib002/rb-trees/rules/red-root/rr_7.dot new file mode 100644 index 0000000..09f51a3 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_7.dot @@ -0,0 +1,35 @@ +digraph RBTree { +"139660434247376" [label="9"] +"139660434247376" -> "139660436098128" +"139660436098128" [label="5"] +"139660436098128" -> "139660435887760" [color="red"] +"139660435887760" [color=red,label="2"] +L139660435887760 [label="",color=none] +139660435887760 -> L139660435887760 +R139660435887760 [label="",color=none] +139660435887760 -> R139660435887760 +R139660436098128 [label="",color=none] +139660436098128 -> R139660436098128 +"139660434247376" -> "139660435793424" [color="red"] +"139660435793424" [color=red,label="15"] +"139660435793424" -> "139660435791312" +"139660435791312" [label="12"] +L139660435791312 [label="",color=none] +139660435791312 -> L139660435791312 +"139660435791312" -> "139660435793488" [color="red"] +"139660435793488" [color=red,label="13"] +L139660435793488 [label="",color=none] +139660435793488 -> L139660435793488 +R139660435793488 [label="",color=none] +139660435793488 -> R139660435793488 +"139660435793424" -> "139660435887824" +"139660435887824" [label="18"] +L139660435887824 [label="",color=none] +139660435887824 -> L139660435887824 +"139660435887824" -> "139660435793616" [color="red"] +"139660435793616" [color=red,label="19"] +L139660435793616 [label="",color=none] +139660435793616 -> L139660435793616 +R139660435793616 [label="",color=none] +139660435793616 -> R139660435793616 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_7_dark.png b/files/ib002/rb-trees/rules/red-root/rr_7_dark.png new file mode 100644 index 0000000..3ea4864 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_7_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_7_light.png b/files/ib002/rb-trees/rules/red-root/rr_7_light.png new file mode 100644 index 0000000..8e75618 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_7_light.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_8.dot b/files/ib002/rb-trees/rules/red-root/rr_8.dot new file mode 100644 index 0000000..33f6023 --- /dev/null +++ b/files/ib002/rb-trees/rules/red-root/rr_8.dot @@ -0,0 +1,39 @@ +digraph RBTree { +"139660434247376" [label="9"] +"139660434247376" -> "139660436098128" +"139660436098128" [label="5"] +"139660436098128" -> "139660435887760" [color="red"] +"139660435887760" [color=red,label="2"] +L139660435887760 [label="",color=none] +139660435887760 -> L139660435887760 +R139660435887760 [label="",color=none] +139660435887760 -> R139660435887760 +R139660436098128 [label="",color=none] +139660436098128 -> R139660436098128 +"139660434247376" -> "139660435793424" [color="red"] +"139660435793424" [color=red,label="15"] +"139660435793424" -> "139660435791312" +"139660435791312" [label="12"] +L139660435791312 [label="",color=none] +139660435791312 -> L139660435791312 +"139660435791312" -> "139660435793488" [color="red"] +"139660435793488" [color=red,label="13"] +L139660435793488 [label="",color=none] +139660435793488 -> L139660435793488 +R139660435793488 [label="",color=none] +139660435793488 -> R139660435793488 +"139660435793424" -> "139660435887824" +"139660435887824" [label="18"] +"139660435887824" -> "139660434506512" [color="red"] +"139660434506512" [color=red,label="17"] +L139660434506512 [label="",color=none] +139660434506512 -> L139660434506512 +R139660434506512 [label="",color=none] +139660434506512 -> R139660434506512 +"139660435887824" -> "139660435793616" [color="red"] +"139660435793616" [color=red,label="19"] +L139660435793616 [label="",color=none] +139660435793616 -> L139660435793616 +R139660435793616 [label="",color=none] +139660435793616 -> R139660435793616 +} diff --git a/files/ib002/rb-trees/rules/red-root/rr_8_dark.png b/files/ib002/rb-trees/rules/red-root/rr_8_dark.png new file mode 100644 index 0000000..f68c4c2 Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_8_dark.png differ diff --git a/files/ib002/rb-trees/rules/red-root/rr_8_light.png b/files/ib002/rb-trees/rules/red-root/rr_8_light.png new file mode 100644 index 0000000..d2cb42b Binary files /dev/null and b/files/ib002/rb-trees/rules/red-root/rr_8_light.png differ diff --git a/files/ib002/recursion/karel-1/.archive b/files/ib002/recursion/karel-1/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/ib002/recursion/karel-1/generate_mazes.py b/files/ib002/recursion/karel-1/generate_mazes.py new file mode 100644 index 0000000..8b19fd8 --- /dev/null +++ b/files/ib002/recursion/karel-1/generate_mazes.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +from itertools import product + + +def generate_map(template: str, st: int, ave: int) -> str: + return template.format(st=st, ave=ave) + + +def main(): + template = None + with open("maze_skel.kw", "r") as f: + template = f.read() + + for st, ave in product(range(1, 7), range(1, 7)): + with open("maze{:03d}.kw".format(st * 6 + ave), "w") as out: + print(generate_map(template, st, ave), file=out) + + +if __name__ == "__main__": + main() diff --git a/files/ib002/recursion/karel-1/karel_tk.py b/files/ib002/recursion/karel-1/karel_tk.py new file mode 100644 index 0000000..e988c4e --- /dev/null +++ b/files/ib002/recursion/karel-1/karel_tk.py @@ -0,0 +1,791 @@ +from dataclasses import dataclass +from enum import Enum, IntEnum +from functools import wraps +from itertools import product +from math import radians, sin, cos +from sys import stderr +import tkinter as tk +from typing import Tuple, Union + + +def check_before(precondition): + """ + Decorator for running methods before executing a method. + + Args: + call_before: Function to be called before executing a method. + + Returns: + Parametrized decorator that can be used to wrap method with the + `call_before`. + """ + + def parametrized(f): + @wraps(f) + def wrapper(self, *args, **kwargs): + if not precondition(self, *args, **kwargs, fn=f): + return + return f(self, *args, **kwargs) + + return wrapper + + return parametrized + + +def after(call_after): + """ + Decorator for running methods after executing a method. + + Args: + call_after: Function to be called after executing a method. + + Returns: + Parametrized decorator that can be used to wrap method with the + `call_after`. + """ + + def parametrized(f): + @wraps(f) + def wrapper(self, *args, **kwargs): + result = f(self, *args, **kwargs) + call_after(self, *args, **kwargs, fn=f) + return result + + return wrapper + + return parametrized + + +def skip_for_summary(f): + """ + Decorator used for skipping a function call if the Karel is running + in a summary mode. + """ + + @wraps(f) + def wrapper(self, *args, **kwargs): + if self.summary_mode: + return + return f(self, *args, **kwargs) + + return wrapper + + +class Block(IntEnum): + """ + Represents a field in the world of the Robot Karel. + It can be either clear or a wall. + """ + + Clear = 0 + Wall = -1 + + +# Constants for major angles +EAST, NORTH, WEST, SOUTH = 0, 90, 180, 270 + + +# @dataclass(frozen=True, slots=True) +@dataclass(frozen=True) +class _Direction: + """ + angle: Represents heading of the Robot Karel + """ + + angle: int + + @property + def vector(self) -> Tuple[int, int]: + """ + Get a direction vector in the current direction the robot is heading. + + Returns: + Pair of ints, representing a vector of (dx, dy). + """ + angle, x, y = radians(self.angle), 1, 0 + return ( + x * round(cos(angle)) - y * round(sin(angle)), + x * round(sin(angle)) + y * round(cos(angle)), + ) + + @property + def in_world(self) -> str: + """ + Get a character that is being put in the graphical representation of + the Robot Karel. + + Returns: + Character to be put in the world. + """ + return { + Direction.East.value: ">", + Direction.North.value: "^", + Direction.West.value: "<", + Direction.South.value: "v", + # Direction.East.value: "⮞", + # Direction.North.value: "⮝", + # Direction.West.value: "⮜", + # Direction.South.value: "⮟", + }[self] + + @property + def as_string(self) -> str: + """ + Returns a string with a direction for Tk label. + + Returns: + Label of the direction + """ + return { + Direction.East.value: "east", + Direction.North.value: "north", + Direction.West.value: "west", + Direction.South.value: "south", + }[self] + + def __add__(self, angle: int) -> "_Direction": + return _Direction((360 + self.angle + angle) % 360) + + +class Direction(Enum): + """ + Provides constants of directions Karel can face. + """ + + East = _Direction(EAST) + North = _Direction(NORTH) + West = _Direction(WEST) + South = _Direction(SOUTH) + + +class KarelWindow: + def __init__(self, karel: "Karel", scale: int, font: str): + self.size = 32 * scale + + self.steps = tk.Label(text=karel.steps, anchor="e") + self.steps.grid(row=0, column=0, sticky="e") + + self.last_cmd = tk.Label(text=karel.last_command, anchor="w") + self.last_cmd.grid(row=0, column=1, columnspan=3, sticky="w") + + tk.Label(text="CORNER").grid(row=1, column=0) + tk.Label(text="FACING").grid(row=1, column=1) + tk.Label(text="BEEP-BAG").grid(row=1, column=2) + tk.Label(text="BEEP-CORNER").grid(row=1, column=3) + + self.corner = tk.Label() + self.corner.grid(row=2, column=0) + + self.facing = tk.Label() + self.facing.grid(row=2, column=1) + + self.beep_bag = tk.Label() + self.beep_bag.grid(row=2, column=2) + + self.beep_corner = tk.Label() + self.beep_corner.grid(row=2, column=3) + + self.canvas = tk.Canvas( + width=((karel.world.width + 1) // 2 + 2) * self.size, + height=((karel.world.height + 1) // 2 + 2) * self.size, + background="black", + ) + self.canvas.grid(column=0, row=3, columnspan=4) + + self.font = f"{font} {int(12 * scale)}" + + self.__draw_world(karel.world) + self.render(karel) + + def __draw_world(self, world: "World"): + m, n = (world.height + 1) // 2, (world.width + 1) // 2 + + # NUMBERS + self.canvas.create_text( + self.size // 2, + self.size, + text="ST.", + fill="white", + anchor="s", + font=self.font, + ) + for i in range(m): + self.canvas.create_text( + self.size - 8, + (i + 2) * self.size - self.size // 2, + text=(m - i), + anchor="e", + fill="white", + font=self.font, + ) + y = ((m + 1) * self.size) + 8 + self.canvas.create_text( + (n + 1) * self.size + self.size // 2, + y, + text="AVE.", + fill="white", + anchor="n", + font=self.font, + ) + for i in range(n): + self.canvas.create_text( + (i + 2) * self.size - self.size // 2, + y, + text=(i + 1), + anchor="n", + fill="white", + font=self.font, + ) + + # BORDER + self.canvas.create_rectangle( + self.size, + self.size, + self.size * (n + 1), + self.size * (m + 1), + fill="", + outline="white", + ) + + for row, col in product(range(world.height), range(world.width)): + block = world.data[row][col] + if row % 2 == 0 and col % 2 == 0: + self.__print_beeper(world, block or ".", row // 2, col // 2) + elif block == Block.Wall: + size = self.size + x = size + col // 2 * size + y = (world.width + 1) // 2 * size - row // 2 * size + if row % 2 == 1 and col % 2 == 0: + self.canvas.create_line(x, y, x + size, y, fill="white") + elif row % 2 == 0: + x += size + self.canvas.create_line(x, y, x, y + size, fill="white") + + self.canvas.update() + + def __print_beeper( + self, world: "World", beeper: Union[str, int], row: int, column: int + ): + self.canvas.create_text( + (column + 1) * self.size + self.size // 2, + ((world.height + 1) // 2 - row) * self.size + self.size // 2, + text=str(beeper), + anchor="center", + fill="white", + font=self.font, + ) + + def render(self, karel: "Karel"): + self.facing["text"] = karel.direction.as_string + + self.steps["text"] = karel.steps + self.last_cmd["text"] = karel.last_command + self.corner["text"] = f"({(karel.x + 2) // 2}, {(karel.y + 2) // 2})" + self.beep_bag["text"] = karel.beepers + self.beep_corner["text"] = karel.world.data[karel.y][karel.x] + + i, j = (karel.y + 2) // 2, (karel.x + 2) // 2 + size = self.size + x, y = j * size, ((karel.world.height + 1) // 2 - i + 1) * size + self.canvas.create_rectangle( + x + 1, y + 1, x + size - 1, y + size - 1, fill="black" + ) + + karel_on_map = karel.direction.in_world + self.canvas.create_text( + x + size // 2, + y + size // 2, + text=karel_on_map, + font=self.font + " bold", + fill="yellow", + anchor="center", + ) + + self.canvas.update() + self.canvas.after(karel.step_delay) + + def update(self, karel: "Karel", dx: int, dy: int): + block = karel.world.data[karel.y - 2 * dy][karel.x - 2 * dx] + + i, j = (karel.y - 2 * dy) // 2, (karel.x - 2 * dx) // 2 + x, y = (j + 1) * self.size, ( + (karel.world.height + 1) // 2 - i + ) * self.size + + self.canvas.create_rectangle( + x + 1, y + 1, x + self.size - 1, y + self.size - 1, fill="black" + ) + self.__print_beeper(karel.world, block or ".", i, j) + + def error(self, karel: "Karel", message: str): + self.render(karel) + + self.last_cmd["foreground"] = "red" + self.last_cmd["text"] = f"Error Shutoff! ({message})" + + +class World: + def __init__(self, width, height, data): + self.width = width * 2 - 1 + self.height = height * 2 - 1 + self.data = [ + [0 for _ in range(self.width)] for _ in range(self.height) + ] + + if self.width > 30 or self.height > 30: + raise ValueError( + "The given world is greater than the max values of [{}x{}]".format( + 30, 30 + ) + ) + + self._parse_world(data) + + def __parse_wall(self, column, row, orientation, line): + column = column * 2 - 2 + row = row * 2 - 2 + + if column % 2 == 1 or row % 2 == 1: + raise ValueError("Wrong position of the wall") + + if orientation == "E": + column += 1 + elif orientation == "W": + column -= 1 + elif orientation == "N": + row += 1 + elif orientation == "S": + row -= 1 + else: + raise ValueError( + "Unknown wall orientation '{}' on line {} in world file".format( + orientation, line + ) + ) + + self.data[row][column] = Block.Wall + if column % 2 == 1 and row % 2 == 0: + if row + 1 < self.height: + self.data[row + 1][column] = Block.Wall + if row - 1 >= 0: + self.data[row - 1][column] = Block.Wall + else: + if column + 1 < self.width: + self.data[row][column + 1] = Block.Wall + if column - 1 >= 0: + self.data[row][column - 1] = Block.Wall + + def __parse_beepers(self, column, row, count): + column = column * 2 - 2 + row = row * 2 - 2 + self.data[row][column] = count + + def _parse_world(self, world_content): + for i, line in enumerate(world_content, 1): + if not line: + continue + + block, column, row, arg = [part.upper() for part in line.split()] + if block == "W": + self.__parse_wall(int(column), int(row), arg, i) + elif block == "B": + self.__parse_beepers(int(column), int(row), int(arg)) + else: + raise ValueError( + "Unknown block character '{}' on line {} in world file".format( + block, i + ) + ) + + +class Karel: + def __init__( + self, filename, summary_mode=False, scale=1, font="monospace" + ): + """ + Turn Karel on. + + Args: + filename: Path to the file containing Karel's world and initial + settings. + summary_mode: Disable rendering of the Karel's world in the window. + + Defaults to `False`. + scale: Change the scaling factor of the font used to render Karel's + world. + + Defaults to `1`. + font: Change the default monospace font that is used to render the + world. + + Defaults to `"monospace"`. + """ + self.summary_mode = summary_mode + + world_content = None + with open(filename) as world_file: + world_content = world_file.read() + + first_line, world = world_content.split("\n", maxsplit=1) + width, height, x, y, direction, beepers = first_line.split() + direction = direction.upper() + + self.world = World(int(width), int(height), world.split("\n")) + self.x, self.y = int(x) * 2 - 2, int(y) * 2 - 2 + + if direction == "S": + self.direction = Direction.South.value + elif direction == "W": + self.direction = Direction.West.value + elif direction == "E": + self.direction = Direction.East.value + elif direction == "N": + self.direction = Direction.North.value + else: + raise ValueError("Unknown Karel's direction") + + self.beepers = int(beepers) + + self.steps = 0 + self.step_delay = 1000 + self.is_running = True + self.last_command = "turn_on" + + self._initialize_window(scale, font) + + @skip_for_summary + def _initialize_window(self, scale, font): + """ + Initializes a window where the Karel is drawn. + """ + self._window = KarelWindow(self, scale, font) + + @skip_for_summary + def __update(self, dx, dy): + """ + Updates Karel's position in the window. + + Args: + dx: Change along the horizontal axis. + dy: Change along the vertical axis. + """ + self._window.update(self, dx, dy) + + def __render(self, fn, *args, **kwargs): + """ + Updates step counter and last command for Karel. + If the robot is not running in a summary mode, then the window + is rendered once again. + """ + if not self.is_running: + return + + self.steps += 1 + self.last_command = fn.__name__ + + if not self.summary_mode: + self._window.render(self) + + def __error(self, message): + """ + Provides error handling. + + Args: + message: Error message to be shown. + """ + if not self.summary_mode: + self._window.error(self, message) + self.is_running = False + else: + print(f"Error Shutoff! ({message})", file=stderr) + + @skip_for_summary + def __deinit(self): + tk.mainloop() + + def __check_state(self, *args, **kwargs): + """ + Assures that commands are not run while the robot is not running. + + Robot is not running when error has occurred. + """ + return self.is_running + + @check_before(__check_state) + def beepers_in_bag(self): + """ + Check if there are any beepers in the Karel's bag. + + Returns: + `True` if there is at least one beeper in Karel's beeper bag, + `False` otherwise. + """ + return self.beepers > 0 + + def no_beepers_in_bag(self): + """ + Check if there are no beepers in the Karel's bag. + + Returns: + `True` if there is no beeper in Karel's beeper bag, `False` otherwise. + """ + return not self.beepers_in_bag() + + @check_before(__check_state) + def front_is_clear(self): + """ + Check if there is no wall in front of Karel. + + Returns: + `True` if there is no obstacle in front of Karel, `False` otherwise. + """ + dx, dy = self.direction.vector + if not ( + 0 <= self.x + dx < self.world.width + and 0 <= self.y + dy < self.world.height + ): + return False + + if self.world.data[self.y + dy][self.x + dx] == Block.Wall: + return False + + return True + + def front_is_blocked(self): + """ + Check if there is a wall in front of Karel. + + Returns: + `True` if there is an obstacle in front of Karel, `False` otherwise. + """ + return not self.front_is_clear() + + @check_before(__check_state) + def __side_is_clear(self, d): + """ + Helper function for determining whether the sides of Karel are clear. + + Args: + d: Counterclockwise change in angle of Karel's heading. + + Returns: + `True` if the side after applying the `d` counterclokwise turn + is clear, `False` otherwise. + """ + original_direction = self.direction + self.direction = self.direction + d + + is_clear = self.front_is_clear() + self.direction = original_direction + + return is_clear + + def left_is_clear(self): + """ + Check if there is no wall to the left side of Karel. + + Returns: + `True` if there is no obstacle to the left side of Karel, + `False` otherwise. + """ + return self.__side_is_clear(90) + + def left_is_blocked(self): + """ + Check if there is a wall to the left side of Karel. + + Returns: + `True` if there is an obstacle to the left side of Karel, + `False` otherwise. + """ + return not self.left_is_clear() + + def right_is_clear(self): + """ + Check if there is no wall to the right side of Karel. + + Returns: + `True` if there is no obstacle to the right side of Karel, + `False` otherwise. + """ + return self.__side_is_clear(-90) + + def right_is_blocked(self): + """ + Check if there is a wall to the right side of Karel. + + Returns: + `True` if there is an obstacle to the right side of Karel, + `False` otherwise. + """ + return not self.right_is_clear() + + @check_before(__check_state) + def facing_north(self): + """ + Check if Karel is facing north. + + Returns: + `True` if Karel is facing north, `False` otherwise. + """ + return self.direction == Direction.North + + def not_facing_north(self): + """ + Check if Karel is »not« facing north. + + Returns: + `True` if Karel is »not« facing north, `False` otherwise. + """ + return not self.facing_north() + + @check_before(__check_state) + def facing_south(self): + """ + Check if Karel is facing south. + + Returns: + `True` if Karel is facing south, `False` otherwise. + """ + return self.direction == Direction.South + + def not_facing_south(self): + """ + Check if Karel is »not« facing south. + + Returns: + `True` if Karel is »not« facing south, `False` otherwise. + """ + return not self.facing_south() + + @check_before(__check_state) + def facing_east(self): + """ + Check if Karel is facing east. + + Returns: + `True` if Karel is facing east, `False` otherwise. + """ + return self.direction == Direction.East + + def not_facing_east(self): + """ + Check if Karel is »not« facing east. + + Returns: + `True` if Karel is »not« facing east, `False` otherwise. + """ + return not self.facing_east() + + @check_before(__check_state) + def facing_west(self): + """ + Check if Karel is facing west. + + Returns: + `True` if Karel is facing west, `False` otherwise. + """ + return self.direction == Direction.West + + def not_facing_west(self): + """ + Check if Karel is »not« facing west. + + Returns: + `True` if Karel is »not« facing west, `False` otherwise. + """ + return not self.facing_west() + + @check_before(__check_state) + def beepers_present(self): + """ + Check whether Karel stands on a position that has any beepers present. + + Returns: + `True` if there is at least one beeper present on the current + position, `False` otherwise. + """ + return self.world.data[self.y][self.x] > 0 + + def no_beepers_present(self): + """ + Check whether Karel stands on a position that has no beepers present. + + Returns: + `True` if there is no beeper present on the current position, + `False` otherwise. + """ + return not self.beepers_present() + + @check_before(__check_state) + @after(__render) + def step(self): + """ + Move Karel one position in the direction he's facing. + """ + if not self.front_is_clear(): + return self.__error("Can't move this way") + + dx, dy = self.direction.vector + self.x += 2 * dx + self.y += 2 * dy + self.__update(dx, dy) + + @check_before(__check_state) + @after(__render) + def turn_left(self): + """ + Turn Karel counterclockwise, i.e. left, by 90 degrees. + """ + self.direction = self.direction + 90 + + @after(__render) + def turn_off(self): + """ + Turn Karel off. + """ + self.is_running = False + self.__deinit() + + @check_before(__check_state) + @after(__render) + def put_beeper(self): + """ + Take a beeper from Karel's beeper bag and put on the current position. + """ + if self.beepers <= 0: + return self.__error("Karel has no beeper to put at the corner") + + self.world.data[self.y][self.x] += 1 + self.beepers -= 1 + + @check_before(__check_state) + @after(__render) + def pick_beeper(self): + """ + Pick a beeper from the current position and put it into Karel's + beeper bag. + """ + if self.world.data[self.y][self.x] <= 0: + return self.__error("There is no beeper at the corner") + + self.world.data[self.y][self.x] -= 1 + self.beepers += 1 + + def set_step_delay(self, delay): + """ + Set delay of a Karel's step. + + Args: + delay: Delay of one step in milliseconds. + """ + self.step_delay = delay + + def get_step_delay(self): + """ + Get current delay of a Karel's step. + + Returns: + Current delay in milliseconds. + """ + return self.step_delay diff --git a/files/ib002/recursion/karel-1/maze007.kw b/files/ib002/recursion/karel-1/maze007.kw new file mode 100644 index 0000000..b95426f --- /dev/null +++ b/files/ib002/recursion/karel-1/maze007.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 1 1 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze008.kw b/files/ib002/recursion/karel-1/maze008.kw new file mode 100644 index 0000000..de0a9b4 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze008.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 1 2 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze009.kw b/files/ib002/recursion/karel-1/maze009.kw new file mode 100644 index 0000000..18a3f09 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze009.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 1 3 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze010.kw b/files/ib002/recursion/karel-1/maze010.kw new file mode 100644 index 0000000..43ffb94 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze010.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 1 4 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze011.kw b/files/ib002/recursion/karel-1/maze011.kw new file mode 100644 index 0000000..741527d --- /dev/null +++ b/files/ib002/recursion/karel-1/maze011.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 1 5 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze012.kw b/files/ib002/recursion/karel-1/maze012.kw new file mode 100644 index 0000000..89579d9 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze012.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 1 6 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze013.kw b/files/ib002/recursion/karel-1/maze013.kw new file mode 100644 index 0000000..895731d --- /dev/null +++ b/files/ib002/recursion/karel-1/maze013.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 2 1 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze014.kw b/files/ib002/recursion/karel-1/maze014.kw new file mode 100644 index 0000000..b732cfc --- /dev/null +++ b/files/ib002/recursion/karel-1/maze014.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 2 2 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze015.kw b/files/ib002/recursion/karel-1/maze015.kw new file mode 100644 index 0000000..d028262 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze015.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 2 3 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze016.kw b/files/ib002/recursion/karel-1/maze016.kw new file mode 100644 index 0000000..79d6f8d --- /dev/null +++ b/files/ib002/recursion/karel-1/maze016.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 2 4 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze017.kw b/files/ib002/recursion/karel-1/maze017.kw new file mode 100644 index 0000000..25ce9dc --- /dev/null +++ b/files/ib002/recursion/karel-1/maze017.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 2 5 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze018.kw b/files/ib002/recursion/karel-1/maze018.kw new file mode 100644 index 0000000..8ad01cf --- /dev/null +++ b/files/ib002/recursion/karel-1/maze018.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 2 6 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze019.kw b/files/ib002/recursion/karel-1/maze019.kw new file mode 100644 index 0000000..fc9ea4f --- /dev/null +++ b/files/ib002/recursion/karel-1/maze019.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 3 1 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze020.kw b/files/ib002/recursion/karel-1/maze020.kw new file mode 100644 index 0000000..08658f6 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze020.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 3 2 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze021.kw b/files/ib002/recursion/karel-1/maze021.kw new file mode 100644 index 0000000..ea739ef --- /dev/null +++ b/files/ib002/recursion/karel-1/maze021.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 3 3 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze022.kw b/files/ib002/recursion/karel-1/maze022.kw new file mode 100644 index 0000000..3736978 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze022.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 3 4 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze023.kw b/files/ib002/recursion/karel-1/maze023.kw new file mode 100644 index 0000000..3f8b615 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze023.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 3 5 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze024.kw b/files/ib002/recursion/karel-1/maze024.kw new file mode 100644 index 0000000..1966ace --- /dev/null +++ b/files/ib002/recursion/karel-1/maze024.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 3 6 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze025.kw b/files/ib002/recursion/karel-1/maze025.kw new file mode 100644 index 0000000..b654219 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze025.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 4 1 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze026.kw b/files/ib002/recursion/karel-1/maze026.kw new file mode 100644 index 0000000..ebaf8bd --- /dev/null +++ b/files/ib002/recursion/karel-1/maze026.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 4 2 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze027.kw b/files/ib002/recursion/karel-1/maze027.kw new file mode 100644 index 0000000..924f3f5 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze027.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 4 3 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze028.kw b/files/ib002/recursion/karel-1/maze028.kw new file mode 100644 index 0000000..df6c8c2 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze028.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 4 4 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze029.kw b/files/ib002/recursion/karel-1/maze029.kw new file mode 100644 index 0000000..f742654 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze029.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 4 5 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze030.kw b/files/ib002/recursion/karel-1/maze030.kw new file mode 100644 index 0000000..54b00ec --- /dev/null +++ b/files/ib002/recursion/karel-1/maze030.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 4 6 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze031.kw b/files/ib002/recursion/karel-1/maze031.kw new file mode 100644 index 0000000..f8beac8 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze031.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 5 1 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze032.kw b/files/ib002/recursion/karel-1/maze032.kw new file mode 100644 index 0000000..0c54b03 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze032.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 5 2 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze033.kw b/files/ib002/recursion/karel-1/maze033.kw new file mode 100644 index 0000000..b03209d --- /dev/null +++ b/files/ib002/recursion/karel-1/maze033.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 5 3 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze034.kw b/files/ib002/recursion/karel-1/maze034.kw new file mode 100644 index 0000000..2682e25 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze034.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 5 4 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze035.kw b/files/ib002/recursion/karel-1/maze035.kw new file mode 100644 index 0000000..d6981b1 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze035.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 5 5 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze036.kw b/files/ib002/recursion/karel-1/maze036.kw new file mode 100644 index 0000000..35cd0b6 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze036.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 5 6 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze037.kw b/files/ib002/recursion/karel-1/maze037.kw new file mode 100644 index 0000000..5361d58 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze037.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 6 1 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze038.kw b/files/ib002/recursion/karel-1/maze038.kw new file mode 100644 index 0000000..2bf360c --- /dev/null +++ b/files/ib002/recursion/karel-1/maze038.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 6 2 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze039.kw b/files/ib002/recursion/karel-1/maze039.kw new file mode 100644 index 0000000..3f5fc81 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze039.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 6 3 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze040.kw b/files/ib002/recursion/karel-1/maze040.kw new file mode 100644 index 0000000..dd2a661 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze040.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 6 4 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze041.kw b/files/ib002/recursion/karel-1/maze041.kw new file mode 100644 index 0000000..93198c7 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze041.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 6 5 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze042.kw b/files/ib002/recursion/karel-1/maze042.kw new file mode 100644 index 0000000..d09efdc --- /dev/null +++ b/files/ib002/recursion/karel-1/maze042.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B 6 6 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze069.kw b/files/ib002/recursion/karel-1/maze069.kw new file mode 100644 index 0000000..c87840f --- /dev/null +++ b/files/ib002/recursion/karel-1/maze069.kw @@ -0,0 +1,32 @@ +6 6 1 1 E 72 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N diff --git a/files/ib002/recursion/karel-1/maze666.kw b/files/ib002/recursion/karel-1/maze666.kw new file mode 100644 index 0000000..23b6387 --- /dev/null +++ b/files/ib002/recursion/karel-1/maze666.kw @@ -0,0 +1,30 @@ +6 6 2 1 E 72 + +B 6 3 1 + +W 2 1 N +W 3 1 N +W 4 1 N + +W 2 5 N +W 3 5 N +W 4 5 N + +W 1 2 E +W 1 3 E +W 1 4 E +W 1 5 E + +W 4 2 E +W 2 3 E +W 2 4 E +W 4 5 E + +W 5 1 E +W 5 2 E +W 5 4 E +W 5 5 E +W 5 6 E + +W 6 3 N +W 6 3 S \ No newline at end of file diff --git a/files/ib002/recursion/karel-1/maze_skel.kw b/files/ib002/recursion/karel-1/maze_skel.kw new file mode 100644 index 0000000..abc53ee --- /dev/null +++ b/files/ib002/recursion/karel-1/maze_skel.kw @@ -0,0 +1,34 @@ +6 6 1 1 E 72 + +B {st} {ave} 1 + +W 1 1 E +W 1 3 E +W 1 4 E +W 1 5 N + +W 2 1 N +W 2 2 E +W 2 2 N +W 2 4 N +W 2 5 E + +W 3 2 N +W 3 3 N +W 3 4 E +W 3 5 E + +W 4 1 E +W 4 1 N +W 4 3 E +W 4 3 N +W 4 4 E +W 4 5 E + +W 5 2 E +W 5 2 N +W 5 4 E +W 5 5 N +W 5 6 E + +W 6 4 N \ No newline at end of file diff --git a/files/ib002/recursion/karel-1/skeleton.py b/files/ib002/recursion/karel-1/skeleton.py new file mode 100644 index 0000000..4b37da5 --- /dev/null +++ b/files/ib002/recursion/karel-1/skeleton.py @@ -0,0 +1,28 @@ +from karel_tk import Karel + +import sys + + +class SuperKarel(Karel): + # you can define your own helper functions on Karel here, if you wish to + + def run(self): + # TODO + pass + + +def main(): + if len(sys.argv) != 2: + print("Please provide a path to the world as an argument.") + return + + k = SuperKarel(sys.argv[1], scale=3, font="Iosevka\\ Term") + k.set_step_delay(500) + + k.run() + + k.turn_off() + + +if __name__ == "__main__": + main() diff --git a/files/ib002/recursion/karel-1/stairs.kw b/files/ib002/recursion/karel-1/stairs.kw new file mode 100644 index 0000000..d0cc80a --- /dev/null +++ b/files/ib002/recursion/karel-1/stairs.kw @@ -0,0 +1,17 @@ +9 9 1 1 E 0 +W 2 1 E +W 3 2 S +W 3 2 E +W 4 3 S +W 4 3 E +W 5 4 S +W 5 4 E +W 6 5 S +W 7 4 W +W 7 3 W +W 7 2 W +W 7 1 W + +B 3 2 1 +B 4 3 1 +B 5 4 1 diff --git a/files/ib002/recursion/karel-1/stairs2.kw b/files/ib002/recursion/karel-1/stairs2.kw new file mode 100644 index 0000000..6453ace --- /dev/null +++ b/files/ib002/recursion/karel-1/stairs2.kw @@ -0,0 +1,20 @@ +9 9 1 1 E 0 + +W 1 1 E +W 2 1 N + +W 3 2 S +W 3 2 E +W 4 3 S +W 4 3 E +W 5 4 S +W 5 4 E +W 6 5 S +W 7 4 W +W 7 3 W +W 7 2 W +W 7 1 W + +B 3 2 1 +B 4 3 1 +B 5 4 1 diff --git a/files/ib002/recursion/pyramid-slide-down/.archive b/files/ib002/recursion/pyramid-slide-down/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/ib002/recursion/pyramid-slide-down/BottomUp.java b/files/ib002/recursion/pyramid-slide-down/BottomUp.java new file mode 100644 index 0000000..31303b4 --- /dev/null +++ b/files/ib002/recursion/pyramid-slide-down/BottomUp.java @@ -0,0 +1,55 @@ +import java.util.Arrays; + +public class BottomUp { + public static int longestSlideDown(int[][] pyramid) { + int[][] slideDowns = new int[pyramid.length][]; + + slideDowns[pyramid.length - 1] = Arrays.copyOf(pyramid[pyramid.length - 1], + pyramid[pyramid.length - 1].length); + + for (int y = pyramid.length - 2; y >= 0; --y) { + int[] row = Arrays.copyOf(pyramid[y], pyramid[y].length); + + for (int x = 0; x < row.length; ++x) { + int under = slideDowns[y + 1][x]; + int toRight = x + 1 < slideDowns[y + 1].length + ? slideDowns[y + 1][x + 1] + : Integer.MIN_VALUE; + row[x] += Math.max(under, toRight); + } + + slideDowns[y] = row; + } + + return slideDowns[0][0]; + } + + public static void main(String[] args) { + System.out.print("Test #1: "); + System.out.println(longestSlideDown(new int[][] { + { 3 }, + { 7, 4 }, + { 2, 4, 6 }, + { 8, 5, 9, 3 } + }) == 23 ? "passed" : "failed"); + + System.out.print("Test #2: "); + System.out.println(longestSlideDown(new int[][] { + { 75 }, + { 95, 64 }, + { 17, 47, 82 }, + { 18, 35, 87, 10 }, + { 20, 4, 82, 47, 65 }, + { 19, 1, 23, 75, 3, 34 }, + { 88, 2, 77, 73, 7, 63, 67 }, + { 99, 65, 4, 28, 6, 16, 70, 92 }, + { 41, 41, 26, 56, 83, 40, 80, 70, 33 }, + { 41, 48, 72, 33, 47, 32, 37, 16, 94, 29 }, + { 53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14 }, + { 70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57 }, + { 91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48 }, + { 63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31 }, + { 4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23 }, + }) == 1074 ? "passed" : "failed"); + } +} \ No newline at end of file diff --git a/files/ib002/recursion/pyramid-slide-down/Greedy.java b/files/ib002/recursion/pyramid-slide-down/Greedy.java new file mode 100644 index 0000000..5dbfa21 --- /dev/null +++ b/files/ib002/recursion/pyramid-slide-down/Greedy.java @@ -0,0 +1,47 @@ +public class Greedy { + public static int longestSlideDown(int[][] pyramid, int row, int col) { + if (row == pyramid.length - 1) { + return pyramid[row][col]; + } + + if (col + 1 >= pyramid[row + 1].length + || pyramid[row + 1][col] > pyramid[row + 1][col + 1]) { + return pyramid[row][col] + longestSlideDown(pyramid, row + 1, col); + } + + return pyramid[row][col] + longestSlideDown(pyramid, row + 1, col + 1); + } + + public static int longestSlideDown(int[][] pyramid) { + return longestSlideDown(pyramid, 0, 0); + } + + public static void main(String[] args) { + System.out.print("Test #1: "); + System.out.println(longestSlideDown(new int[][] { + { 3 }, + { 7, 4 }, + { 2, 4, 6 }, + { 8, 5, 9, 3 } + }) == 23 ? "passed" : "failed"); + + System.out.print("Test #2: "); + System.out.println(longestSlideDown(new int[][] { + { 75 }, + { 95, 64 }, + { 17, 47, 82 }, + { 18, 35, 87, 10 }, + { 20, 4, 82, 47, 65 }, + { 19, 1, 23, 75, 3, 34 }, + { 88, 2, 77, 73, 7, 63, 67 }, + { 99, 65, 4, 28, 6, 16, 70, 92 }, + { 41, 41, 26, 56, 83, 40, 80, 70, 33 }, + { 41, 48, 72, 33, 47, 32, 37, 16, 94, 29 }, + { 53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14 }, + { 70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57 }, + { 91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48 }, + { 63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31 }, + { 4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23 }, + }) == 1074 ? "passed" : "failed"); + } +} \ No newline at end of file diff --git a/files/ib002/recursion/pyramid-slide-down/Naive.java b/files/ib002/recursion/pyramid-slide-down/Naive.java new file mode 100644 index 0000000..084f306 --- /dev/null +++ b/files/ib002/recursion/pyramid-slide-down/Naive.java @@ -0,0 +1,48 @@ +public class Naive { + public static int longestSlideDown(int[][] pyramid, int row, int col) { + if (row >= pyramid.length || col < 0 || col >= pyramid[row].length) { + return Integer.MIN_VALUE; + } + + if (row == pyramid.length - 1) { + return pyramid[row][col]; + } + + return pyramid[row][col] + Math.max( + longestSlideDown(pyramid, row + 1, col), + longestSlideDown(pyramid, row + 1, col + 1)); + } + + public static int longestSlideDown(int[][] pyramid) { + return longestSlideDown(pyramid, 0, 0); + } + + public static void main(String[] args) { + System.out.print("Test #1: "); + System.out.println(longestSlideDown(new int[][] { + { 3 }, + { 7, 4 }, + { 2, 4, 6 }, + { 8, 5, 9, 3 } + }) == 23 ? "passed" : "failed"); + + System.out.print("Test #2: "); + System.out.println(longestSlideDown(new int[][] { + { 75 }, + { 95, 64 }, + { 17, 47, 82 }, + { 18, 35, 87, 10 }, + { 20, 4, 82, 47, 65 }, + { 19, 1, 23, 75, 3, 34 }, + { 88, 2, 77, 73, 7, 63, 67 }, + { 99, 65, 4, 28, 6, 16, 70, 92 }, + { 41, 41, 26, 56, 83, 40, 80, 70, 33 }, + { 41, 48, 72, 33, 47, 32, 37, 16, 94, 29 }, + { 53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14 }, + { 70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57 }, + { 91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48 }, + { 63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31 }, + { 4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23 }, + }) == 1074 ? "passed" : "failed"); + } +} \ No newline at end of file diff --git a/files/ib002/recursion/pyramid-slide-down/TopDown.java b/files/ib002/recursion/pyramid-slide-down/TopDown.java new file mode 100644 index 0000000..7e0f75b --- /dev/null +++ b/files/ib002/recursion/pyramid-slide-down/TopDown.java @@ -0,0 +1,76 @@ +import java.util.TreeMap; + +public class TopDown { + record Position(int row, int col) implements Comparable { + public int compareTo(Position r) { + if (row != r.row) { + return Integer.valueOf(row).compareTo(r.row); + } + + if (col != r.col) { + return Integer.valueOf(col).compareTo(r.col); + } + + return 0; + } + } + + public static int longestSlideDown( + int[][] pyramid, + TreeMap cache, + Position position) { + int row = position.row; + int col = position.col; + + if (row >= pyramid.length || col < 0 || col >= pyramid[row].length) { + return Integer.MIN_VALUE; + } + + if (row == pyramid.length - 1) { + return pyramid[position.row][position.col]; + } + + if (!cache.containsKey(position)) { + int slideDown = Math.max( + longestSlideDown(pyramid, cache, new Position(row + 1, col)), + longestSlideDown(pyramid, cache, new Position(row + 1, col + 1))); + cache.put(position, pyramid[row][col] + slideDown); + } + + return cache.get(position); + } + + public static int longestSlideDown(int[][] pyramid) { + TreeMap cache = new TreeMap<>(); + return longestSlideDown(pyramid, cache, new Position(0, 0)); + } + + public static void main(String[] args) { + System.out.print("Test #1: "); + System.out.println(longestSlideDown(new int[][] { + { 3 }, + { 7, 4 }, + { 2, 4, 6 }, + { 8, 5, 9, 3 } + }) == 23 ? "passed" : "failed"); + + System.out.print("Test #2: "); + System.out.println(longestSlideDown(new int[][] { + { 75 }, + { 95, 64 }, + { 17, 47, 82 }, + { 18, 35, 87, 10 }, + { 20, 4, 82, 47, 65 }, + { 19, 1, 23, 75, 3, 34 }, + { 88, 2, 77, 73, 7, 63, 67 }, + { 99, 65, 4, 28, 6, 16, 70, 92 }, + { 41, 41, 26, 56, 83, 40, 80, 70, 33 }, + { 41, 48, 72, 33, 47, 32, 37, 16, 94, 29 }, + { 53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14 }, + { 70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57 }, + { 91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48 }, + { 63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31 }, + { 4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23 }, + }) == 1074 ? "passed" : "failed"); + } +} \ No newline at end of file diff --git a/files/ib002/time-complexity/extend/.archive b/files/ib002/time-complexity/extend/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/ib002/time-complexity/extend/construction.dot b/files/ib002/time-complexity/extend/construction.dot new file mode 100644 index 0000000..357e4de --- /dev/null +++ b/files/ib002/time-complexity/extend/construction.dot @@ -0,0 +1,25 @@ +digraph G { + node [shape=record]; + + a_node [label="1|2|3|4|5|6|7|8|9"] + + b_node [label="1|2|3"] + c_node [label="4|5|6"] + d_node [label="7|8|9"] + + a_node -> b_node [label="B"] + a_node -> c_node [label="C"] + a_node -> d_node [label="D"] + + b_node -> "1" + b_node -> "2" + b_node -> "3" + + c_node -> "4" + c_node -> "5" + c_node -> "6" + + d_node -> "7" + d_node -> "8" + d_node -> "9" +} \ No newline at end of file diff --git a/files/ib002/time-complexity/extend/construction_dark.png b/files/ib002/time-complexity/extend/construction_dark.png new file mode 100644 index 0000000..58e8fca Binary files /dev/null and b/files/ib002/time-complexity/extend/construction_dark.png differ diff --git a/files/ib002/time-complexity/extend/construction_light.png b/files/ib002/time-complexity/extend/construction_light.png new file mode 100644 index 0000000..d5b60de Binary files /dev/null and b/files/ib002/time-complexity/extend/construction_light.png differ diff --git a/files/ib002/time-complexity/extend/dynlist.c b/files/ib002/time-complexity/extend/dynlist.c new file mode 100644 index 0000000..3ff4633 --- /dev/null +++ b/files/ib002/time-complexity/extend/dynlist.c @@ -0,0 +1,142 @@ +#include "dynlist.h" + +#include +#include +#include + +void dynamic_array_init(struct dynamic_array_t *arr, size_t size) +{ + if (arr == NULL) + { + return; + } + + arr->data = NULL; + arr->count = 0; + arr->capacity = 0; + arr->size = size; +} + +void dynamic_array_destroy(struct dynamic_array_t *arr) +{ + if (arr == NULL) + { + return; + } + + if (arr->data != NULL) + { + free(arr->data); + arr->data = NULL; + } + arr->count = 0; + arr->capacity = 0; +} + +void *dynamic_array_at(struct dynamic_array_t *arr, size_t index) +{ + if (arr == NULL || index >= arr->count) + { + return NULL; + } + + return arr->data + index * arr->size; +} + +void *dynamic_array_front(struct dynamic_array_t *arr) +{ + if (arr == NULL || arr->count < 1) + { + return NULL; + } + + return arr->data; +} + +void *dynamic_array_back(struct dynamic_array_t *arr) +{ + if (arr == NULL || arr->count < 1) + { + return NULL; + } + + return arr->data + (arr->count - 1) * arr->size; +} + +/** + * @brief Resize the dynamic array when needed. + * @param arr Array to be resized. + * @returns true if resizing was successful or array was not resized, + * false otherwise. + */ +static bool dynamic_array_resize(struct dynamic_array_t *arr) +{ + if (arr == NULL || arr->count < arr->capacity) + { + return true; + } + + size_t new_capacity = arr->capacity ? (arr->capacity * 2) : 16; + void *new_data = realloc(arr->data, new_capacity * arr->size); + if (new_data == NULL) + { + // failed to reallocate memory + return false; + } + + arr->data = new_data; + arr->capacity = new_capacity; + return true; +} + +bool dynamic_array_push_back(struct dynamic_array_t *arr, void *data) +{ + if (arr == NULL || data == NULL) + { + return false; + } + + if (!dynamic_array_resize(arr)) + { + // failed to reallocate memory + return false; + } + + memcpy(dynamic_array_at(arr, arr->count), data, arr->size); + arr->count++; + + return true; +} + +void dynamic_array_pop_back(struct dynamic_array_t *arr) +{ + if (arr == NULL || arr->count < 1) + { + return; + } + + arr->count--; +} + +void dynamic_array_extend(struct dynamic_array_t *arr, struct dynamic_array_t *src) +{ + if (arr == NULL || src == NULL) + { + return; + } + + for (size_t i = 0; i < src->count; i++) + { + dynamic_array_push_back(arr, dynamic_array_at(src, i)); + } +} + +void dynamic_array_clear(struct dynamic_array_t *arr) +{ + if (arr == NULL) + { + return; + } + + arr->count = 0; +} diff --git a/files/ib002/time-complexity/extend/dynlist.h b/files/ib002/time-complexity/extend/dynlist.h new file mode 100644 index 0000000..e41b046 --- /dev/null +++ b/files/ib002/time-complexity/extend/dynlist.h @@ -0,0 +1,76 @@ +#include +#include + +struct dynamic_array_t +{ + char *data; + size_t count; + size_t capacity; + size_t size; +}; + +/** + * @brief Initializes dynamic array. Sets size of single element and zeroes + * everything else. + * @param arr Array to be initialized. + * @param size Size of one element in the array. + */ +void dynamic_array_init(struct dynamic_array_t *arr, size_t size); + +/** + * @brief Destroys dynamic array. Deallocates all the memory and resets fields. + * @param arr Array to be destroyed. + */ +void dynamic_array_destroy(struct dynamic_array_t *arr); + +/** + * @brief Returns pointer to the element on the given index. + * @param arr Array containing the element. + * @param index Index of the element. + * @returns Pointer to the element, NULL if index is out of bounds. + */ +void *dynamic_array_at(struct dynamic_array_t *arr, size_t index); + +/** + * @brief Returns pointer to the first element of the array. + * @param arr Array containing the element. + * @returns Pointer to the first element, NULL if no elements are + * present. + */ +void *dynamic_array_front(struct dynamic_array_t *arr); + +/** + * @brief Returns pointer to the last element of the array. + * @param arr Array containing the element. + * @returns Pointer to the last element, NULL if no elements are + * present. + */ +void *dynamic_array_back(struct dynamic_array_t *arr); + +/** + * @brief Adds element to the end of the array. + * @param arr Array where the element is to be added. + * @param data Pointer to the data, that are to be copied into the array. + * @returns true if element added successfully, false + * otherwise. + */ +bool dynamic_array_push_back(struct dynamic_array_t *arr, void *data); + +/** + * @brief Removes last element from the array. + * @param arr Array from which the last element is to be removed. + */ +void dynamic_array_pop_back(struct dynamic_array_t *arr); + +/** + * @brief Extends array with the elements from another array. + * @param arr Array to be extended. + * @param src Array from which the elements are copied. + */ +void dynamic_array_extend(struct dynamic_array_t *arr, struct dynamic_array_t *src); + +/** + * @brief Clears out the array. + * @param arr Array to be cleared. + */ +void dynamic_array_clear(struct dynamic_array_t *arr); diff --git a/files/ib015/.gitkeep b/files/ib015/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/files/ib110/.gitkeep b/files/ib110/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/files/ib111/.gitkeep b/files/ib111/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/files/pb071/bonuses/03.tar.bz2 b/files/pb071/bonuses/03.tar.bz2 new file mode 100644 index 0000000..5243e79 Binary files /dev/null and b/files/pb071/bonuses/03.tar.bz2 differ diff --git a/files/pb071/bonuses/03.tar.gz b/files/pb071/bonuses/03.tar.gz new file mode 100644 index 0000000..79580cf Binary files /dev/null and b/files/pb071/bonuses/03.tar.gz differ diff --git a/files/pb071/bonuses/03/.archive b/files/pb071/bonuses/03/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/pb071/bonuses/03/main.c b/files/pb071/bonuses/03/main.c new file mode 100644 index 0000000..921ab65 --- /dev/null +++ b/files/pb071/bonuses/03/main.c @@ -0,0 +1,264 @@ +#include +#include +#include +#include +#include + +/* If you want to see arrays before and after sorting, uncomment next line */ +// #define DEBUG_OUTPUT + +/** + * @brief Swaps two elements at given addresses of given size. + * @param left Pointer to the first element. + * @param right Pointer to the second element. + * @param size Size of the memory one element takes. + */ +void swap(void *left, void *right, size_t size) +{ + /* TODO */ +} + +/** + * @brief Get index of biggest element in the array. + * @param ptr Pointer to the first element of the array. + * @param count Count of the elements in the array. + * @param size Size of one element in the array. + * @param comp Comparator that is used to decide ordering of the elements. + * @returns Index of the biggest element given the ordering. + */ +size_t maximum(void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *)) +{ + /* Pseudocode: + * =========== + * max_index <- 0 + * FOR i <- 1 TO n - 1 DO + * IF A[i] > A[max_index] THEN + * max_index <- i + * FI + * OD + * RETURN max_index + */ + /* TODO */ + return 0; +} + +/** + * @brief Sort array in-situ using select-sort. + * @param ptr Pointer to the first element of the array. + * @param count Count of the elements in the array. + * @param size Size of one element in the array. + * @param comp Comparator that is used to decide ordering of the elements. + */ +void select_sort(void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *)) +{ + /* Pseudocode: + * =========== + * FOR i <- n - 1 DOWNTO 1 DO + * j <- MAXIMUM(A, i + 1) + * SWAP(A, i, j) + * OD + */ + /* TODO */ +} + +/** + * @brief Compares two integers that are given through generic pointers. + * @param x Pointer to the integer x. + * @param y Pointer to the integer y. + * @returns 0 if x == y, <0 if x < y, >0 otherwise. + */ +static int int_comparator(const void *x, const void *y) +{ + /* TODO */ + return 1; +} + +/** + * @brief Compares two characters by ASCII value. + * @param x Pointer to the character x. + * @param y Pointer to the character y. + * @returns 0 if x == y, <0 if x < y, >0 otherwise. + */ +static int char_comparator(const void *x, const void *y) +{ + char x_value = *(const char *) x; + char y_value = *(const char *) y; + return x_value - y_value; +} + +/** + * @brief Compares two characters by ASCII value in a reversed order. + * @param x Pointer to the character x. + * @param y Pointer to the character y. + * @returns 0 if x == y, >0 if x < y, <0 otherwise. + */ +static int char_reversed_comparator(const void *x, const void *y) +{ + char x_value = *(const char *) x; + char y_value = *(const char *) y; + return y_value - x_value; +} + +// #pragma region TESTS +/** + * @brief Check if array is sorted. + * @param ptr Pointer to the first element of the array. + * @param count Count of the elements in the array. + * @param size Size of one element in the array. + * @param comp Comparator that is used to decide ordering of the elements. + */ +static void check_if_sorted(void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *)) +{ + char *left = ptr; + char *right = (char *) ptr + size; + + for (size_t i = 0; i < count - 1; i++) { + assert(comp(left, right) <= 0); + + left += size; + right += size; + } +} + +#ifdef DEBUG_OUTPUT +/** + * @brief Print numbers from an array. + * @param array Pointer to the first element of the array. + * @param count Count of the elements in the array. + */ +static void print_numbers(int *array, size_t count) +{ + for (size_t i = 0; i < count; i++) { + printf(" %d", array[i]); + } +} +#endif + +/** + * @brief Run some basic tests on integer arrays. + */ +static void check_int_arrays() +{ + /* You are free to add any other examples you like, in case you want to add + * array with more than 10 elements, please adjust the size. + */ + + size_t examples_count = 5; + int examples[][10] = { + { -1, 50, -10, 20, 30, 0, -100 }, + { -100, 0, 30, 20, -10, 50, -1 }, + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, + { -1, -2, -3, -4, -5, -6, -7, -8, -9, -10 }, + { 0, 0, 0, 0, 0, 0, 0, 0 } + }; + + printf("[TEST] Integer arrays\n"); + for (size_t i = 0; i < examples_count; i++) { + size_t count = sizeof(examples[i]) / sizeof(int); + +#ifdef DEBUG_OUTPUT + printf("Before sorting:"); + print_numbers(examples[i], count); + putchar('\n'); +#endif + + select_sort(examples[i], count, sizeof(int), int_comparator); + +#ifdef DEBUG_OUTPUT + printf("After sorting:"); + print_numbers(examples[i], count); + printf("\n\n"); +#endif + + check_if_sorted(examples[i], count, sizeof(int), int_comparator); + } + printf("[PASS] Tests passed.\n\n"); +} + +/** + * @brief Run some basic tests on strings. Also with reversed ordering. + */ +static void check_char_arrays() +{ +#define MAX_SIZE 20 + /* You are free to add any other examples you like, in case you want to add + * strings with more than 10 characters, please adjust the size. + * mind the terminator ;) + */ + + const size_t examples_count = 5; + char examples[][MAX_SIZE] = { + "Hello World!", + "hi", + "aloha", + "LET US SORT", + "LeT uS sOrT" + }; + + printf("[TEST] Char arrays\n"); + for (size_t i = 0; i < examples_count; i++) { + size_t count = strlen(examples[i]); + + char temp_array[MAX_SIZE]; + strncpy(temp_array, examples[i], MAX_SIZE); + select_sort(temp_array, count, 1, char_comparator); + +#ifdef DEBUG_OUTPUT + printf("Before sorting: \"%s\"\n", examples[i]); + printf("After sorting: \"%s\"\n\n", temp_array); +#endif + + check_if_sorted(temp_array, count, 1, char_comparator); + } + printf("[PASS] Tests passed.\n\n"); + + printf("[TEST] Char arrays reversed\n"); + for (size_t i = 0; i < examples_count; i++) { + size_t count = strlen(examples[i]); + + char temp_array[MAX_SIZE]; + strncpy(temp_array, examples[i], MAX_SIZE); + select_sort(temp_array, count, 1, char_reversed_comparator); + +#ifdef DEBUG_OUTPUT + printf("Before sorting: \"%s\"\n", examples[i]); + printf("After sorting: \"%s\"\n\n", temp_array); +#endif + + check_if_sorted(temp_array, count, 1, char_reversed_comparator); + } + printf("[PASS] Tests passed.\n\n"); +#undef MAX_SIZE +} + +static void annotate(const char *description, bool result) +{ + printf("[TEST] %s\n", description); + assert(result); + printf("[PASS] Test passed.\n\n"); +} + +static void check_int_comparator() +{ + int a = 5, b = -10, c = -10; + + annotate("Test comparator for: a > b", int_comparator(&a, &b) > 0); + annotate("Test comparator for: b < a", int_comparator(&b, &a) < 0); + annotate("Test comparator for: b = c", int_comparator(&b, &c) == 0); + annotate("Test comparator for: a = a", int_comparator(&a, &a) == 0); + annotate("Test comparator for: b = b", int_comparator(&b, &b) == 0); + annotate("Test comparator for: c = c", int_comparator(&c, &c) == 0); +} +// #pragma endregion TESTS + +int main(void) +{ + /* Neither of those tests check for bad behaviour, like overwriting array + * with elements satisfying ordering. **I** check those :scheming: + */ + check_int_comparator(); + check_int_arrays(); + check_char_arrays(); + + return 0; +} diff --git a/files/pb071/bonuses/03/main_light.c b/files/pb071/bonuses/03/main_light.c new file mode 100644 index 0000000..c92c0dc --- /dev/null +++ b/files/pb071/bonuses/03/main_light.c @@ -0,0 +1,141 @@ +#include +#include +#include +#include + +/* If you want to see arrays before and after sorting, uncomment next line */ +// #define DEBUG_OUTPUT + +/** + * @brief Swaps two elements at given addresses. + * @param left Pointer to the first element. + * @param right Pointer to the second element. + */ +void swap(int *left, int *right) +{ + /* TODO */ +} + +/** + * @brief Get index of biggest element in the array. + * @param ptr Pointer to the first element of the array. + * @param count Count of the elements in the array. + * @returns Index of the biggest element given the ordering. + */ +size_t maximum(int *ptr, size_t count) +{ + /* Pseudocode: + * =========== + * max_index <- 0 + * FOR i <- 1 TO n - 1 DO + * IF A[i] > A[max_index] THEN + * max_index <- i + * FI + * OD + * RETURN max_index + */ + /* TODO */ + return 0; +} + +/** + * @brief Sort array in-situ using select-sort. + * @param ptr Pointer to the first element of the array. + * @param count Count of the elements in the array. + */ +void select_sort(int *ptr, size_t count) +{ + /* Pseudocode: + * =========== + * FOR i <- n - 1 DOWNTO 1 DO + * j <- MAXIMUM(A, i + 1) + * SWAP(A, i, j) + * OD + */ + /* TODO */ +} + +// #pragma region TESTS +/** + * @brief Check if array is sorted. + * @param ptr Pointer to the first element of the array. + * @param count Count of the elements in the array. + */ +static void check_if_sorted(int *ptr, size_t count) +{ + int *left = ptr; + int *right = ptr + 1; + + for (size_t i = 0; i < count - 1; i++) { + assert(*left <= *right); + + left++; + right++; + } +} + +#ifdef DEBUG_OUTPUT +/** + * @brief Print numbers from an array. + * @param array Pointer to the first element of the array. + * @param count Count of the elements in the array. + */ +static void print_numbers(int *array, size_t count) +{ + for (size_t i = 0; i < count; i++) { + printf(" %d", array[i]); + } +} +#endif + +/** + * @brief Run some basic tests on integer arrays. + */ +static void check_int_arrays() +{ + /* You are free to add any other examples you like, in case you want to add + * array with more than 10 elements, please adjust the size. + */ + + size_t examples_count = 5; + int examples[][10] = { + { -1, 50, -10, 20, 30, 0, -100 }, + { -100, 0, 30, 20, -10, 50, -1 }, + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, + { -1, -2, -3, -4, -5, -6, -7, -8, -9, -10 }, + { 0, 0, 0, 0, 0, 0, 0, 0 } + }; + + printf("[TEST] Integer arrays\n"); + for (size_t i = 0; i < examples_count; i++) { + size_t count = sizeof(examples[i]) / sizeof(int); + +#ifdef DEBUG_OUTPUT + printf("Before sorting:"); + print_numbers(examples[i], count); + putchar('\n'); +#endif + + select_sort(examples[i], count); + +#ifdef DEBUG_OUTPUT + printf("After sorting:"); + print_numbers(examples[i], count); + printf("\n\n"); +#endif + + check_if_sorted(examples[i], count); + } + printf("[PASS] Tests passed.\n\n"); +} +// #pragma endregion TESTS + +int main(void) +{ + /* Neither of those tests check for bad behaviour, like overwriting array + * with elements satisfying ordering. **I** check those :scheming: + */ + check_int_arrays(); + + return 0; +} diff --git a/files/pb071/bonuses/03/makefile b/files/pb071/bonuses/03/makefile new file mode 100644 index 0000000..c37d550 --- /dev/null +++ b/files/pb071/bonuses/03/makefile @@ -0,0 +1,12 @@ +CC=gcc +CFLAGS=-std=c99 -Wall -Wextra -Werror -Wpedantic + +main: + $(CC) $(CFLAGS) main.c -o main + +main_light: + $(CC) $(CFLAGS) main_light.c -o main_light + +check: main main_light + valgrind ./main + valgrind ./main_light diff --git a/files/pb071/bonuses/04.tar.bz2 b/files/pb071/bonuses/04.tar.bz2 new file mode 100644 index 0000000..f54dcc8 Binary files /dev/null and b/files/pb071/bonuses/04.tar.bz2 differ diff --git a/files/pb071/bonuses/04.tar.gz b/files/pb071/bonuses/04.tar.gz new file mode 100644 index 0000000..5f597fa Binary files /dev/null and b/files/pb071/bonuses/04.tar.gz differ diff --git a/files/pb071/bonuses/04/.archive b/files/pb071/bonuses/04/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/pb071/bonuses/04/CMakeLists.txt b/files/pb071/bonuses/04/CMakeLists.txt new file mode 100644 index 0000000..d3acc0a --- /dev/null +++ b/files/pb071/bonuses/04/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.0) + +# Project configuration +project(seminar04-bonus-maze) +set(SOURCES maze.h maze.c) +set(EXECUTABLE maze) + +# Executable +add_executable(maze ${SOURCES} main.c) +add_executable(test_maze ${SOURCES} cut.h test_maze.c) + +# Configure compiler warnings +if (CMAKE_C_COMPILER_ID MATCHES Clang OR ${CMAKE_C_COMPILER_ID} STREQUAL GNU) + # using regular Clang, AppleClang or GCC + # Strongly suggested: neable -Werror + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -Wall -Wextra -pedantic") +elseif (${CMAKE_C_COMPILER_ID} STREQUAL MSVC) + # using Visual Studio C++ + target_compile_definitions(${EXECUTABLE} PRIVATE _CRT_SECURE_NO_DEPRECATE) + set(CMAKE_CXX_FLAGS "/permissive- /W4 /EHsc") +endif() + +if(MINGW) + target_compile_definitions(${EXECUTABLE} PRIVATE __USE_MINGW_ANSI_STDIO=1) +endif() diff --git a/files/pb071/bonuses/04/main.c b/files/pb071/bonuses/04/main.c new file mode 100644 index 0000000..0374aae --- /dev/null +++ b/files/pb071/bonuses/04/main.c @@ -0,0 +1,8 @@ +#include "maze.h" + +#include + +int main(void) +{ + return 0; +} diff --git a/files/pb071/bonuses/04/maze.c b/files/pb071/bonuses/04/maze.c new file mode 100644 index 0000000..e216337 --- /dev/null +++ b/files/pb071/bonuses/04/maze.c @@ -0,0 +1,84 @@ +#include "maze.h" + +#include +#include +#include + +/** + * @brief Checks if pointer points inside the memory specified by upper and lower + * bound. + * @param first Start of the allocated memory. + * @param last First address that is not included in the allocated memory. + * @param pos Pointer to memory. + * @returns true if pos points to the memory [first, last), + * false otherwise. + */ +static bool within_bounds(const char *first, const char *last, const char *pos) +{ + /* TODO */ +} + +/** + * @brief Sets 2D coordinates of the pointer. + * @param map Start of the 2D memory. + * @param position Pointer to the map. + * @param width Width of one row of the map. + * @param row Output variable where the row is set. + * @param col Output variable where the column is set. + */ +static void set_coordinates(const char *map, char *position, size_t width, size_t *row, size_t *col) +{ + /* TODO */ +} + +/** + * @brief Checks if indices are within bounds of the 2D map. + * @param width Width of the map. + * @param height Height of the map. + * @param row Row to be checked. + * @param col Column to be checked. + * @returns true if row,col are within bounds of the map,.false + * otherwise. + */ +static bool within_bounds_by_index(size_t width, size_t height, size_t row, size_t col) +{ + /* TODO */ +} + +void print_maze(const char *map, char *position, char direction, size_t width, size_t height) +{ + printf("Maze:\n"); + for (size_t row = 0; row < height; row++) { + for (size_t col = 0; col < width; col++) { + const char *current = &map[row * width + col]; + + if (current == position) { + switch (direction) { + case '^': + putchar('N'); + break; + case 'v': + putchar('S'); + break; + case '>': + putchar('E'); + break; + case '<': + putchar('W'); + break; + } + continue; + } + + putchar(*current); + } + putchar('\n'); + } + putchar('\n'); +} + +enum end_state_t walk(const char *map, char *position, char direction, size_t width, size_t height) +{ + /* TODO */ + return NONE; +} diff --git a/files/pb071/bonuses/04/maze.h b/files/pb071/bonuses/04/maze.h new file mode 100644 index 0000000..bf9f42e --- /dev/null +++ b/files/pb071/bonuses/04/maze.h @@ -0,0 +1,33 @@ +#include + +enum end_state_t +{ + NONE, + FOUND_KEY, + FOUND_TREASURE, + OUT_OF_BOUNDS, + INFINITE_LOOP, +}; + +/** + * @brief Prints maze and the robot within it. + * @param map Map of the maze. + * @param position Current position of the robot. + * @param direction Direction the robot is facing, one of "^v<>". + * @param width Width of the map. + * @param height Height of the map. + */ +void print_maze(const char *map, char *position, char direction, size_t width, size_t height); + +/** + * @brief Get end state of the robot after his walk. + * @param map Map of the maze. + * @param position Initial position of the robot in the maze. + * @param direction Direction the robot is facing at the beginning. You can assume + * correctness of this value. + * @param width Width of the maze. You can assume correctness of this value. + * @param height Height of the maze. You can assume correctness of this value. + * @returns End state of the robot after his walk is finished or has been terminated + * manually. + */ +enum end_state_t walk(const char *map, char *position, char direction, size_t width, size_t height); diff --git a/files/pb071/bonuses/04/test_maze.c b/files/pb071/bonuses/04/test_maze.c new file mode 100644 index 0000000..6a4ff4f --- /dev/null +++ b/files/pb071/bonuses/04/test_maze.c @@ -0,0 +1,246 @@ +#include "maze.h" + +#define CUT_MAIN +#include "cut.h" + +static void check_result(char *map, size_t position, char direction, size_t width, size_t height, enum end_state_t expected) +{ + enum end_state_t state = walk(map, &map[position], direction, width, height); + ASSERT(state == expected); +} + +TEST(basic) +{ + SUBTEST(spawns_on_treasure) + { + check_result(("T." + ".."), + 0, + '>', + 2, + 2, + FOUND_TREASURE); + } + SUBTEST(spawns_on_key) + { + check_result(("K." + ".."), + 0, + '^', + 2, + 2, + FOUND_KEY); + } + SUBTEST(spawns_on_treasure_in_middle) + { + check_result(("..." + ".T." + "..."), + 4, + 'v', + 3, + 3, + FOUND_TREASURE); + } +} + +TEST(some_walking) +{ + SUBTEST(straight_up) + { + check_result((".T." + "..." + "..."), + 7, + '^', + 3, + 3, + FOUND_TREASURE); + } + SUBTEST(down) + { + check_result(("..........................T"), 7, 'v', 1, 27, FOUND_TREASURE); + } + SUBTEST(to_right) + { + check_result(("..........................K"), 2, '>', 27, 1, FOUND_KEY); + } + SUBTEST(to_left) + { + check_result(("K.........................."), 15, '<', 27, 1, FOUND_KEY); + } +} + +TEST(follows_directions) +{ + SUBTEST(basic) + { + check_result((">..v" + "...." + "...K" + "^..<"), + 12, + '>', + 4, + 4, + FOUND_KEY); + } + SUBTEST(no_way_to_avoid) + { + const char *directions = "<>^v"; + + for (size_t row = 0; row < 5; row++) { + for (size_t col = 0; col < 5; col++) { + for (size_t dir = 0; dir < 4; dir++) { + check_result((">>>>v" + "^>>vv" + "^^T.." + "^KTK" + ".TvT" + "...<"), + 1, + '>', + 4, + 4, + OUT_OF_BOUNDS); + } + SUBTEST(to_up) + { + check_result((".>.." + "^KTK" + ".TvT" + "...<"), + 4, + '>', + 4, + 4, + OUT_OF_BOUNDS); + } + SUBTEST(to_down) + { + check_result((".>.." + "^KTK" + ".TvT" + "...<"), + 10, + '>', + 4, + 4, + OUT_OF_BOUNDS); + } + SUBTEST(to_left) + { + check_result((".>.." + "^KTK" + ".TvT" + "...<"), + 15, + '>', + 4, + 4, + OUT_OF_BOUNDS); + } +} + +TEST(mean) +{ + SUBTEST(out_of_bounds_at_the_beginning) + { + check_result((".." + ".."), + 4, + 'v', + 2, + 2, + OUT_OF_BOUNDS); + check_result((".." + ".."), + 5, + 'v', + 2, + 2, + OUT_OF_BOUNDS); + check_result((".." + ".."), + (size_t) -1, + 'v', + 2, + 2, + OUT_OF_BOUNDS); + check_result((">T<" + "..." + "^.^"), + 10, + '^', + 3, + 3, + OUT_OF_BOUNDS); + } +} + +TEST(infinite_bonus) +{ + SUBTEST(easy) + { + check_result((">.v" + "..." + "^.<"), + 0, + 'v', + 3, + 3, + INFINITE_LOOP); + } + SUBTEST(medium) + { + check_result((">v" + "^<"), + 2, + 'v', + 2, + 2, + INFINITE_LOOP); + } + SUBTEST(hard) + { + check_result(("v.v" + "..." + "^.^"), + 0, + '>', + 3, + 3, + INFINITE_LOOP); + } + SUBTEST(harder) + { + check_result((">.v.." + "....." + "^...<" + "....." + "..>.^"), + 4, + 'v', + 5, + 5, + INFINITE_LOOP); + } +} diff --git a/files/pb071/bonuses/05-06.tar.bz2 b/files/pb071/bonuses/05-06.tar.bz2 new file mode 100644 index 0000000..d716213 Binary files /dev/null and b/files/pb071/bonuses/05-06.tar.bz2 differ diff --git a/files/pb071/bonuses/05-06.tar.gz b/files/pb071/bonuses/05-06.tar.gz new file mode 100644 index 0000000..87b5c56 Binary files /dev/null and b/files/pb071/bonuses/05-06.tar.gz differ diff --git a/files/pb071/bonuses/05-06/.archive b/files/pb071/bonuses/05-06/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/pb071/bonuses/05-06/CMakeLists.txt b/files/pb071/bonuses/05-06/CMakeLists.txt new file mode 100644 index 0000000..9273d61 --- /dev/null +++ b/files/pb071/bonuses/05-06/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.0) + +# Project configuration +project(seminar05-06-bonus-bmp) +set(SOURCES bmp.h bmp.c) +set(EXECUTABLE bmp) + +# Executable +add_executable(bmp ${SOURCES} main.c) +add_executable(test_bmp ${SOURCES} cut.h test_bmp.c) + +# Configure compiler warnings +if (CMAKE_C_COMPILER_ID MATCHES Clang OR ${CMAKE_C_COMPILER_ID} STREQUAL GNU) + # using regular Clang, AppleClang or GCC + # Strongly suggested: neable -Werror + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -Wall -Wextra -pedantic") +elseif (${CMAKE_C_COMPILER_ID} STREQUAL MSVC) + # using Visual Studio C++ + target_compile_definitions(${EXECUTABLE} PRIVATE _CRT_SECURE_NO_DEPRECATE) + set(CMAKE_CXX_FLAGS "/permissive- /W4 /EHsc") +endif() + +if(MINGW) + target_compile_definitions(${EXECUTABLE} PRIVATE __USE_MINGW_ANSI_STDIO=1) +endif() diff --git a/files/pb071/bonuses/05-06/bmp.c b/files/pb071/bonuses/05-06/bmp.c new file mode 100644 index 0000000..32865d2 --- /dev/null +++ b/files/pb071/bonuses/05-06/bmp.c @@ -0,0 +1,153 @@ +#include "bmp.h" + +#include +#include +#include +#include + +#define UNUSED(var) ((void) (var)) + +/** + * Return reversed string. + * + * Function returns a pointer to the reversed string, which has been created + * from the input parameter. If the input string is NULL or memory could not be + * allocated, function returns NULL. + * + * @param text input string + * @return reversed representation of input string, or NULL, if the string could + * not be created. + */ +char *reverse(const char *text) +{ + /* TODO */ + UNUSED(text); + return NULL; +} + +/** + * @brief Checks if key is valid. + * @param key String that is used as a key + * @returns true, if key is valid; false otherwise + */ +static bool check_key(const char *key) +{ + /* TODO */ + UNUSED(key); + return false; +} + +/** + * Function for encrypting the given plaintext by applying the Vigenère cipher. + * + * @param key Pointer to a string representing the key which will be used + * for encrypting the plaintext. The key is represented by a single + * case-insensitive word consisting of only alphabetical characters. + * @param text Pointer to a string representing the plaintext to be + * encrypted. + * @return the address of a copy of the ciphertext encrypted by the Vigenère + * cipher, or NULL if the encryption was not successful. + */ +char *vigenere_encrypt(const char *key, const char *text) +{ + /* TODO */ + UNUSED(key); + UNUSED(text); + return NULL; +} + +/** + * Function for decrypting the given ciphertext by applying the Vigenère cipher. + * + * @param key Pointer to a string representing the key which has been used + * for encrypting the ciphertext. The key is represented by a single + * case-insensitive word consisting of only alphabetical characters. + * @param text Pointer to a string representing the ciphertext to be + * decrypted. + * @return the address of a copy of the plaintext decrypted by the Vigenère + * cipher, or NULL if the decryption was not successful. + */ +char *vigenere_decrypt(const char *key, const char *text) +{ + /* TODO */ + UNUSED(key); + UNUSED(text); + return NULL; +} + +/** + * Function for bitwise encryption according to the following process: + * The character about to be encrypted is divided in half (4 bits + 4 bits). + * Subsequently, the bits in the left half are divided into two pairs and the + * values inside each pair are swapped. The four bits created by this way are + * then used in a bitwise XOR operation with the remaining 4 bits. + * + * @param text String representing the plaintext to be encrypted. + * @return a pointer to a newly created string containing the ciphertext + * produced by encrypting the plaintext, or NULL if the encryption was not + * successful. + */ +unsigned char *bit_encrypt(const char *text) +{ + /* TODO */ + UNUSED(text); + return NULL; +} + +/** + * Function for bitwise decryption - it is the inverse of the bitwise encryption + * function. + * + * @param text String representing the ciphertext to be decrypted. + * @return a pointer to a newly created string containing the plaintext produced + * by decrypting the ciphertext, or NULL if the decryption was not successful. + */ +char *bit_decrypt(const unsigned char *text) +{ + /* TODO */ + UNUSED(text); + return NULL; +} + +/** + * Function for encrypting the given plaintext by applying the BMP cipher. + * The process of encrypting by BMP: + *
    + *
  1. the provided input string is encrypted by function reverse() + *
  2. the acquired string is encrypted by function vigenere_encrypt() + *
  3. function bit_encrypt() is applied on the resulting string + *
+ * + * @param key Pointer to a string representing the key which will be used + * for encrypting the plaintext. The key is represented by a single + * case-insensitive word consisting of only alphabetical characters. + * @param text String representing the plaintext to be encrypted. + * @return the address of a copy of the ciphertext encrypted by the BMP cipher, + * or NULL if the encryption was not successful. + */ +unsigned char *bmp_encrypt(const char *key, const char *text) +{ + /* TODO */ + UNUSED(key); + UNUSED(text); + return NULL; +} + +/** + * Function for decrypting the given ciphertext by applying the BMP cipher. + * The process of decrypting by BMP is the opposite of BMP encryption. + * + * @param key Pointer to a string representing the key which has been used + * for encrypting the ciphertext. The key is represented by a single + * case-insensitive word consisting of only alphabetical characters. + * @param text String representing the ciphertext to be decrypted. + * @return the address of a copy of the plaintext decrypted by the BMP cipher, + * or NULL if the decryption was not successful. + */ +char *bmp_decrypt(const char *key, const unsigned char *text) +{ + /* TODO */ + UNUSED(key); + UNUSED(text); + return NULL; +} diff --git a/files/pb071/bonuses/05-06/bmp.h b/files/pb071/bonuses/05-06/bmp.h new file mode 100644 index 0000000..7470a3d --- /dev/null +++ b/files/pb071/bonuses/05-06/bmp.h @@ -0,0 +1,98 @@ +#ifndef _BMP_H +#define _BMP_H + +/** + * Return reversed string. + * + * Function returns a pointer to the reversed string, which has been created + * from the input parameter. If the input string is NULL or memory could not be + * allocated, function returns NULL. + * + * @param text input string + * @return reversed representation of input string, or NULL, if the string could + * not be created. + */ +char *reverse(const char *text); + +/** + * Function for encrypting the given plaintext by applying the Vigenère cipher. + * + * @param key Pointer to a string representing the key which will be used + * for encrypting the plaintext. The key is represented by a single + * case-insensitive word consisting of only alphabetical characters. + * @param text Pointer to a string representing the plaintext to be + * encrypted. + * @return the address of a copy of the ciphertext encrypted by the Vigenère + * cipher, or NULL if the encryption was not successful. + */ +char *vigenere_encrypt(const char *key, const char *text); + +/** + * Function for decrypting the given ciphertext by applying the Vigenère cipher. + * + * @param key Pointer to a string representing the key which has been used + * for encrypting the ciphertext. The key is represented by a single + * case-insensitive word consisting of only alphabetical characters. + * @param text Pointer to a string representing the ciphertext to be + * decrypted. + * @return the address of a copy of the plaintext decrypted by the Vigenère + * cipher, or NULL if the decryption was not successful. + */ +char *vigenere_decrypt(const char *key, const char *text); + +/** + * Function for bitwise encryption according to the following process: + * The character about to be encrypted is divided in half (4 bits + 4 bits). + * Subsequently, the bits in the left half are divided into two pairs and the + * values inside each pair are swapped. The four bits created by this way are + * then used in a bitwise XOR operation with the remaining 4 bits. + * + * @param text String representing the plaintext to be encrypted. + * @return a pointer to a newly created string containing the ciphertext + * produced by encrypting the plaintext, or NULL if the encryption was not + * successful. + */ +unsigned char *bit_encrypt(const char *text); + +/** + * Function for bitwise decryption - it is the inverse of the bitwise encryption + * function. + * + * @param text String representing the ciphertext to be decrypted. + * @return a pointer to a newly created string containing the plaintext produced + * by decrypting the ciphertext, or NULL if the decryption was not successful. + */ +char *bit_decrypt(const unsigned char *text); + +/** + * Function for encrypting the given plaintext by applying the BMP cipher. + * The process of encrypting by BMP: + *
    + *
  1. the provided input string is encrypted by function reverse() + *
  2. the acquired string is encrypted by function vigenere_encrypt() + *
  3. function bit_encrypt() is applied on the resulting string + *
+ * + * @param key Pointer to a string representing the key which will be used + * for encrypting the plaintext. The key is represented by a single + * case-insensitive word consisting of only alphabetical characters. + * @param text String representing the plaintext to be encrypted. + * @return the address of a copy of the ciphertext encrypted by the BMP cipher, + * or NULL if the encryption was not successful. + */ +unsigned char *bmp_encrypt(const char *key, const char *text); + +/** + * Function for decrypting the given ciphertext by applying the BMP cipher. + * The process of decrypting by BMP is the opposite of BMP encryption. + * + * @param key Pointer to a string representing the key which has been used + * for encrypting the ciphertext. The key is represented by a single + * case-insensitive word consisting of only alphabetical characters. + * @param text String representing the ciphertext to be decrypted. + * @return the address of a copy of the plaintext decrypted by the BMP cipher, + * or NULL if the decryption was not successful. + */ +char *bmp_decrypt(const char *key, const unsigned char *text); + +#endif diff --git a/files/pb071/bonuses/05-06/main.c b/files/pb071/bonuses/05-06/main.c new file mode 100644 index 0000000..19e1bd8 --- /dev/null +++ b/files/pb071/bonuses/05-06/main.c @@ -0,0 +1,8 @@ +#include "playfair.h" + +#include + +int main(void) +{ + return 0; +} diff --git a/files/pb071/bonuses/05-06/test_bmp.c b/files/pb071/bonuses/05-06/test_bmp.c new file mode 100644 index 0000000..594e8ca --- /dev/null +++ b/files/pb071/bonuses/05-06/test_bmp.c @@ -0,0 +1,251 @@ +#include "bmp.h" + +#include +#include +#include + +#define CUT_MAIN +#include "cut.h" + +void test_reverse(const char *input, const char *output) +{ + char *reversed = reverse(input); + + // check if not NULL + ASSERT(reversed != NULL); + + int result = strcmp(reversed, output); + if (result != 0) { + DEBUG_MSG("Expected: %s, but got: %s\n", output, reversed); + } + + ASSERT(strcmp(reversed, output) == 0); + free(reversed); +} + +TEST(REVERSE) +{ + SUBTEST(ABCD) + { + test_reverse("ABCD", "DCBA"); + } + SUBTEST(BADACAD) + { + test_reverse("BADACAD", "DACADAB"); + } + SUBTEST(qqsfyCCDAADQWQLLLlccaasq) + { + test_reverse("qqsfyCCDAADQWQLLLlccaasq", "QSAACCLLLLQWQDAADCCYFSQQ"); + } + SUBTEST(NULL) + { + ASSERT(reverse(NULL) == NULL); + } + SUBTEST(EMPTY) + { + char *result = reverse(""); + ASSERT(result[0] == '\0'); + free(result); + } + SUBTEST(RANDOM) + { + test_reverse("hello", "OLLEH"); + test_reverse("malloc", "COLLAM"); + test_reverse("calloc", "COLLAC"); + test_reverse("realloc", "COLLAER"); + test_reverse("everything", "GNIHTYREVE"); + test_reverse("failing", "GNILIAF"); + test_reverse("LOL", "LOL"); + test_reverse("1273912739&^%$$*((", "((*$$%^&9372193721"); + } +} + +void test_bit(const char *input, const unsigned char *output, size_t length) +{ + unsigned char *encrypted = bit_encrypt(input); + char *decrypted = bit_decrypt(encrypted); + + for (size_t i = 0; i < length; i++) { + ASSERT(encrypted[i] == output[i]); + ASSERT(decrypted[i] == input[i]); + } + + free(decrypted); + free(encrypted); +} + +TEST(BIT) +{ + SUBTEST(HELLO_WORLD) + { + const unsigned char output[] = { 0x80, 0x9c, 0x95, 0x95, 0x96, 0x11, 0xbc, 0x96, 0xb9, 0x95, 0x9d, 0x10 }; + test_bit("Hello world!", output, 12); + } + SUBTEST(MALLOC) + { + const unsigned char output[] = { 0x94, 0x98, 0x95, 0x95, 0x96, 0x9a }; + test_bit("malloc", output, 6); + } + SUBTEST(CALLOC) + { + const unsigned char output[] = { 0x9a, 0x98, 0x95, 0x95, 0x96, 0x9a }; + test_bit("calloc", output, 6); + } + SUBTEST(REALLOC) + { + const unsigned char output[] = { 0xb9, 0x9c, 0x98, 0x95, 0x95, 0x96, 0x9a }; + test_bit("realloc", output, 7); + } + SUBTEST(EVERYTHING) + { + const unsigned char output[] = { 0x9c, 0xbd, 0x9c, 0xb9, 0xb2, 0xbf, 0x91, 0x90, 0x97, 0x9e }; + test_bit("everything", output, 10); + } + SUBTEST(FAILING) + { + const unsigned char output[] = { 0x9f, 0x98, 0x90, 0x95, 0x90, 0x97, 0x9e }; + test_bit("failing", output, 7); + } + SUBTEST(LOL) + { + const unsigned char output[] = { 0x84, 0x87, 0x84 }; + test_bit("LOL", output, 3); + } + SUBTEST(GARBAGE) + { + const unsigned char output[] = { 0x32, 0x31, 0x34, 0x30, 0x3a, 0x32, 0x31, 0x34, 0x30, 0x3a, 0x17, 0xa4, 0x14, 0x15, 0x15, 0x1b, 0x19, 0x19 }; + test_bit("1273912739&^%$$*((", output, 18); + } + SUBTEST(HELLO_FI) + { + const unsigned char output[] = { 0x91, 0x9c, 0x95, 0x95, 0x96 }; + test_bit("hello", output, 5); + } + SUBTEST(BYE_FI) + { + const unsigned char output[] = { 0x9b, 0xb2, 0x9c }; + test_bit("bye", output, 3); + } +} + +void test_vigenere(const char *key, const char *input, const char *output, size_t length) +{ + char *encrypted = vigenere_encrypt(key, input); + char *decrypted = vigenere_decrypt(key, encrypted); + + ASSERT(encrypted != NULL); + ASSERT(decrypted != NULL); + + for (size_t i = 0; i < length; i++) { + ASSERT(encrypted[i] == output[i]); + ASSERT(decrypted[i] == toupper(input[i])); + } + + free(encrypted); + free(decrypted); +} + +TEST(VIGENERE) +{ + SUBTEST(HELLO_WORLD) + { + test_vigenere("CoMPuTeR", "Hello world!", "JSXAI PSINR!", 12); + } + SUBTEST(MALLOC) + { + test_vigenere("fails", "malloc", "RATWGH", 6); + } + SUBTEST(CALLOC) + { + test_vigenere("fails", "calloc", "HATWGH", 6); + } + SUBTEST(REALLOC) + { + test_vigenere("fails", "realloc", "WEIWDTC", 7); + } + SUBTEST(EVERYTHING) + { + test_vigenere("FAILS", "everything", "JVMCQYHQYY", 10); + } + SUBTEST(FAILING) + { + test_vigenere("fails", "failing", "KAQWASG", 7); + } + SUBTEST(LOL) + { + test_vigenere("oopsie", "LOL", "ZCA", 3); + } + SUBTEST(GARBAGE) + { + test_vigenere("fi", "1273912739&^%$$*((", "1273912739&^%$$*((", 18); + } + SUBTEST(HELLO_FI) + { + test_vigenere("fi", "hello", "MMQTT", 5); + } + SUBTEST(BYE_FI) + { + test_vigenere("fi", "bye", "GGJ", 3); + } +} + +void test_bmp(const char *key, const char *input, const unsigned char *encrypted_expected, const char *decrypted_expected, size_t length) +{ + unsigned char *encrypted = bmp_encrypt(key, input); + char *decrypted = bmp_decrypt(key, encrypted); + + ASSERT(encrypted != NULL); + ASSERT(decrypted != NULL); + + for (size_t i = 0; i < length; i++) { + ASSERT(encrypted[i] == encrypted_expected[i]); + ASSERT(decrypted[i] == decrypted_expected[i]); + } + + free(encrypted); + free(decrypted); +} + +TEST(BMP) +{ + SUBTEST(HELLO) + { + const unsigned char encrypted_expected[] = { 0xae, 0xae, 0xab, 0x85, 0x85 }; + test_bmp("fi", "hello", encrypted_expected, "HELLO", 5); + } + SUBTEST(FI) + { + const unsigned char encrypted_expected[] = { 0xaa, 0x82 }; + test_bmp("hello", "fi", encrypted_expected, "FI", 2); + } + SUBTEST(RANDOM) + { + const unsigned char encrypted_expected[] = { 0xa9, 0x87, 0xaf, 0x87, 0x89, 0xa2 }; + test_bmp("garbage", "random", encrypted_expected, "RANDOM", 6); + } + SUBTEST(LETS) + { + const unsigned char encrypted_expected[] = { 0x83, 0xa2, 0x81, 0x8c }; + test_bmp("see", "lets", encrypted_expected, "LETS", 4); + } + SUBTEST(how) + { + const unsigned char encrypted_expected[] = { 0x8d, 0x80, 0xaa }; + test_bmp("it", "how", encrypted_expected, "HOW", 3); + } + SUBTEST(works) + { + const unsigned char encrypted_expected[] = { 0xa9, 0x8b, 0x89, 0xa8, 0x80 }; + test_bmp("asjdljasdja", "works", encrypted_expected, "WORKS", 5); + } + SUBTEST(NOSPACES) + { + const unsigned char encrypted_expected[] = { 0x8d, 0x81, 0x82, 0x85, 0xae, 0xa0, 0x89, 0xa8, 0xa0, 0x85, 0x84, 0x89, 0x85, 0x84, 0x89, 0x8e, 0x8a, 0x84, 0x8e, 0xac, 0x84, 0xa9, 0xa8, 0xac, 0xa2 }; + test_bmp("meh", "longerTextThatHasNoSpaces", encrypted_expected, "LONGERTEXTTHATHASNOSPACES", 25); + } + SUBTEST(ayaya) + { + const unsigned char encrypted_expected[] = { 0x80, 0xa9, 0x80, 0x8e, 0xaf, 0x8e, 0x80, 0xa9, 0x80, 0x8e, 0xaf, 0x8e, 0x80, 0xa9, 0x80, 0x8e, 0xaf, 0x8e, 0x80, 0xa9, 0x80, 0x8e, 0xaf, 0x8e, 0x80, 0xa9, 0x80, 0x8e, 0xaf, 0x8e, 0x80, 0xa9, 0x80 }; + test_bmp("HUH", "ayayayayayayayayayayayayayayayaya", encrypted_expected, "AYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYA", 33); + } +} diff --git a/files/pb071/bonuses/08.tar.bz2 b/files/pb071/bonuses/08.tar.bz2 new file mode 100644 index 0000000..0d0eb4e Binary files /dev/null and b/files/pb071/bonuses/08.tar.bz2 differ diff --git a/files/pb071/bonuses/08.tar.gz b/files/pb071/bonuses/08.tar.gz new file mode 100644 index 0000000..7a9db27 Binary files /dev/null and b/files/pb071/bonuses/08.tar.gz differ diff --git a/files/pb071/bonuses/08/.archive b/files/pb071/bonuses/08/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/pb071/bonuses/08/CMakeLists.txt b/files/pb071/bonuses/08/CMakeLists.txt new file mode 100644 index 0000000..bc81069 --- /dev/null +++ b/files/pb071/bonuses/08/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.0) + +# Project configuration +project(seminar08-bonus) +set(SOURCES counting.c trees.c) + +# Executable +add_executable(counting counting.c) +add_executable(trees trees.c) + +# Configure compiler warnings +if (CMAKE_C_COMPILER_ID MATCHES Clang OR ${CMAKE_C_COMPILER_ID} STREQUAL GNU) + # using regular Clang, AppleClang or GCC + # Strongly suggested: neable -Werror + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -Wall -Wextra -pedantic") +elseif (${CMAKE_C_COMPILER_ID} STREQUAL MSVC) + # using Visual Studio C++ + target_compile_definitions(${EXECUTABLE} PRIVATE _CRT_SECURE_NO_DEPRECATE) + set(CMAKE_CXX_FLAGS "/permissive- /W4 /EHsc") +endif() + +if(MINGW) + target_compile_definitions(${EXECUTABLE} PRIVATE __USE_MINGW_ANSI_STDIO=1) +endif() diff --git a/files/pb071/bonuses/08/Makefile b/files/pb071/bonuses/08/Makefile new file mode 100644 index 0000000..5fd2c7c --- /dev/null +++ b/files/pb071/bonuses/08/Makefile @@ -0,0 +1,10 @@ +check-counting: + python3 test-bonus.py test counting + +check-counting-bonus: + python3 test-bonus.py test counting --no-global-config + +check: check-counting check-counting-bonus + +clean: + rm -rf test-*/*.out_produced diff --git a/files/pb071/bonuses/08/counting.c b/files/pb071/bonuses/08/counting.c new file mode 100644 index 0000000..66d6d29 --- /dev/null +++ b/files/pb071/bonuses/08/counting.c @@ -0,0 +1,60 @@ +#include +#include +#include + +#define UNUSED(x) ((void) (x)) + +/** + * @brief Counts occurences of any substring in the file. + * @param file File where the substring is to be counted in. + * @param substring Substring to be counted. + * @returns Count of occurences of the substring the given file. + */ +long count_anything(FILE *file, const char *substring) +{ + /* TODO */ + UNUSED(file); + UNUSED(substring); + return 0; +} + +/** + * @brief Counts ananas. Nothing more to it. + * @param file File where the ananas is to be counted in. + * @returns Count of occurences of ananas. + */ +long count_ananas(FILE *file) +{ + return count_anything(file, "ananas"); +} + +/** + * @brief Writes given number to the file, character by character. + * @param file File where the number is supposed to be written. + * @param number Number to be written. + */ +void write_number(FILE *file, long number) +{ + /* TODO */ + UNUSED(file); + UNUSED(number); +} + +/** + * @brief Main function of a program. + * @returns Exit code that denotes following: + * 0 in case of success + * 1 in case of invalid usage + * 2 in case of failure on input file + * 3 in case of failure on output file + */ +int main(int argc, char **argv) +{ + if (argc < 3 || argc > 4) { + printf("Usage: %s [string-to-be-counted]\n", argv[0]); + return 1; + } + + /* TODO */ + return 0; +} diff --git a/files/pb071/bonuses/08/counting.json b/files/pb071/bonuses/08/counting.json new file mode 100644 index 0000000..4001450 --- /dev/null +++ b/files/pb071/bonuses/08/counting.json @@ -0,0 +1,4 @@ +{ + "args": ["{test_case}.in", "{test_case}.out_produced"], + "specialized_test": ["diff", "{test_case}.out", "{test_case}.out_produced"] +} diff --git a/files/pb071/bonuses/08/test-bonus.py b/files/pb071/bonuses/08/test-bonus.py new file mode 100644 index 0000000..d0eff34 --- /dev/null +++ b/files/pb071/bonuses/08/test-bonus.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 + +from typing import Iterable, List, Any +import click + +import glob +import json +import os +from pathlib import Path +import subprocess +import tempfile + + +@click.group() +def cli() -> None: + pass + + +class TestCase: + def __init__(self, target: str, test_case: str, config: Any = None): + self.target = target + self.test_case = test_case + + self.test_case_config_path = f"{test_case}.json" + self._config = config + + @property + def config(self): + if not self._config: + self._config = load_config(self.test_case_config_path) + + return self._config + + def __preprocess(self, arr: List[str]) -> Iterable[str]: + return map( + lambda e: e.format(target=self.target, test_case=self.test_case), arr + ) + + def check_stdio(self) -> bool: + if not self.config.get("capture_stdout"): + return True + + process = subprocess.run( + [ + "diff", + f"{self.test_case}.out", + f"{self.test_case}.out_produced", + ], + capture_output=True, + ) + if process.returncode == 0: + return True + + click.secho( + f" [FAIL] Output differs from the expected\n\n{process.stdout.decode()}", fg="yellow" + ) + return False + + def check_specialized_test(self) -> bool: + manual_test = self.config.get("specialized_test") + if not manual_test: + return True + + process = subprocess.run(self.__preprocess(manual_test), capture_output=True) + if process.returncode == 0: + return True + + click.secho( + f" [FAIL] Specialized test failed\n\n{process.stdout.decode()}\n{process.stderr.decode()}", + fg="yellow", + ) + return False + + def check_stderr(self, stderr: tempfile.TemporaryFile) -> None: + stderr.seek(0) + if contents := stderr.read(): + click.secho( + f" [ LOG] Captured stderr\n\n{contents.decode()}\n", + fg="yellow" + ) + + def execute_test_case(self) -> bool: + stdin = None + stdout = None + stderr = tempfile.TemporaryFile() + success = True + + if self.config.get("has_stdin"): + stdin = open(f"{self.test_case}.in", "r") + + if self.config.get("capture_stdout"): + stdout = open(f"{self.test_case}.out_produced", "w") + + try: + self.process = subprocess.run( + [f"build/{self.target}", *self.__preprocess(self.config["args"])], + cwd=os.getcwd(), + stdin=stdin, + stdout=stdout, + stderr=stderr, + timeout=5, + ) + except subprocess.TimeoutExpired: + success = False + + self.check_stderr(stderr) + success = self.check_stdio() and success + success = self.check_specialized_test() and success + + stderr.close() + + return success + + +def load_config(path: str) -> Any: + path_to_config = Path(path) + if not path_to_config.exists(): + return None + + with open(path_to_config, "r") as config_file: + return json.load(config_file) + + +@cli.command() +@click.argument("target") +@click.option("--global-config/--no-global-config", default=True) +def test(target, global_config): + passed, failed = 0, 0 + + config = False + if global_config: + config = load_config(f"./{target}.json") + + test_cases = set( + map(lambda x: str(Path(x).with_suffix("")), glob.glob(f"test-{target}/*")) + ) + + for test_case in test_cases: + individual_config_exists = Path(f"{test_case}.json").exists() + if global_config == individual_config_exists: + continue + + click.secho(f"[TEST] {test_case}") + if TestCase(target, test_case, config).execute_test_case(): + click.secho("[PASS] Test passed.\n", fg="green") + passed += 1 + else: + click.secho("[FAIL] Test failed.\n", fg="red") + failed += 1 + + total = passed + failed + click.secho(f"Passed: {passed}/{total}\tFailed: {failed}/{total}") + + +if __name__ == "__main__": + cli() diff --git a/files/pb071/bonuses/08/test-counting/basic.in b/files/pb071/bonuses/08/test-counting/basic.in new file mode 100644 index 0000000..d50958f --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/basic.in @@ -0,0 +1 @@ +ananas diff --git a/files/pb071/bonuses/08/test-counting/basic.out b/files/pb071/bonuses/08/test-counting/basic.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/basic.out @@ -0,0 +1 @@ +1 diff --git a/files/pb071/bonuses/08/test-counting/biiiiiiig_ananas.in b/files/pb071/bonuses/08/test-counting/biiiiiiig_ananas.in new file mode 100644 index 0000000..2ce25df --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/biiiiiiig_ananas.in @@ -0,0 +1 @@ +ananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananasananas diff --git a/files/pb071/bonuses/08/test-counting/biiiiiiig_ananas.out b/files/pb071/bonuses/08/test-counting/biiiiiiig_ananas.out new file mode 100644 index 0000000..16b8206 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/biiiiiiig_ananas.out @@ -0,0 +1 @@ +1747627 diff --git a/files/pb071/bonuses/08/test-counting/biiiiiiig_nothing.in b/files/pb071/bonuses/08/test-counting/biiiiiiig_nothing.in new file mode 100644 index 0000000..9d3bcb3 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/biiiiiiig_nothing.in @@ -0,0 +1 @@ +ananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananananan diff --git a/files/pb071/bonuses/08/test-counting/biiiiiiig_nothing.out b/files/pb071/bonuses/08/test-counting/biiiiiiig_nothing.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/biiiiiiig_nothing.out @@ -0,0 +1 @@ +0 diff --git a/files/pb071/bonuses/08/test-counting/empty.in b/files/pb071/bonuses/08/test-counting/empty.in new file mode 100644 index 0000000..e69de29 diff --git a/files/pb071/bonuses/08/test-counting/empty.out b/files/pb071/bonuses/08/test-counting/empty.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/empty.out @@ -0,0 +1 @@ +0 diff --git a/files/pb071/bonuses/08/test-counting/fgetc.in b/files/pb071/bonuses/08/test-counting/fgetc.in new file mode 100644 index 0000000..6fabcac --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/fgetc.in @@ -0,0 +1,65 @@ +FGETC(3) Linux Programmer's Manual FGETC(3) + +NAME + fgetc, fgets, getc, getchar, ungetc - input of characters and strings + +SYNOPSIS + #include + + int fgetc(FILE *stream); + + char *fgets(char *s, int size, FILE *stream); + + int getc(FILE *stream); + + int getchar(void); + + int ungetc(int c, FILE *stream); + +DESCRIPTION + fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error. + + getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once. + + getchar() is equivalent to getc(stdin). + + fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buf‐ + fer. A terminating null byte ('\0') is stored after the last character in the buffer. + + ungetc() pushes c back to stream, cast to unsigned char, where it is available for subsequent read operations. Pushed-back characters will be returned in reverse order; only one pushback is guaranteed. + + Calls to the functions described here can be mixed with each other and with calls to other input functions from the stdio library for the same input stream. + + For nonlocking counterparts, see unlocked_stdio(3). + +RETURN VALUE + fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error. + + fgets() returns s on success, and NULL on error or when end of file occurs while no characters have been read. + + ungetc() returns c on success, or EOF on error. + +ATTRIBUTES + For an explanation of the terms used in this section, see attributes(7). + + ┌──────────────────────────┬───────────────┬─────────┐ + │Interface │ Attribute │ Value │ + ├──────────────────────────┼───────────────┼─────────┤ + │fgetc(), fgets(), getc(), │ Thread safety │ MT-Safe │ + │getchar(), ungetc() │ │ │ + └──────────────────────────┴───────────────┴─────────┘ + +CONFORMING TO + POSIX.1-2001, POSIX.1-2008, C89, C99. + + It is not advisable to mix calls to input functions from the stdio library with low-level calls to read(2) for the file descriptor associated with the input stream; the results will be undefined and very prob‐ + ably not what you want. + +SEE ALSO + read(2), write(2), ferror(3), fgetwc(3), fgetws(3), fopen(3), fread(3), fseek(3), getline(3), gets(3), getwchar(3), puts(3), scanf(3), ungetwc(3), unlocked_stdio(3), feature_test_macros(7) + +COLOPHON + This page is part of release 5.07 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at + https://www.kernel.org/doc/man-pages/. + +GNU 2017-09-15 FGETC(3) diff --git a/files/pb071/bonuses/08/test-counting/fgetc.json b/files/pb071/bonuses/08/test-counting/fgetc.json new file mode 100644 index 0000000..2a3c3d4 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/fgetc.json @@ -0,0 +1,4 @@ +{ + "args": ["{test_case}.in", "{test_case}.out_produced", "getc"], + "specialized_test": ["diff", "{test_case}.out", "{test_case}.out_produced"] +} diff --git a/files/pb071/bonuses/08/test-counting/fgetc.out b/files/pb071/bonuses/08/test-counting/fgetc.out new file mode 100644 index 0000000..7273c0f --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/fgetc.out @@ -0,0 +1 @@ +25 diff --git a/files/pb071/bonuses/08/test-counting/going_bananas.in b/files/pb071/bonuses/08/test-counting/going_bananas.in new file mode 100644 index 0000000..f8348bd --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/going_bananas.in @@ -0,0 +1 @@ +ananas bananas banana nanas nana diff --git a/files/pb071/bonuses/08/test-counting/going_bananas.json b/files/pb071/bonuses/08/test-counting/going_bananas.json new file mode 100644 index 0000000..a2d56e4 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/going_bananas.json @@ -0,0 +1,4 @@ +{ + "args": ["{test_case}.in", "{test_case}.out_produced", "banana"], + "specialized_test": ["diff", "{test_case}.out", "{test_case}.out_produced"] +} diff --git a/files/pb071/bonuses/08/test-counting/going_bananas.out b/files/pb071/bonuses/08/test-counting/going_bananas.out new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/going_bananas.out @@ -0,0 +1 @@ +2 diff --git a/files/pb071/bonuses/08/test-counting/lorem_empty.in b/files/pb071/bonuses/08/test-counting/lorem_empty.in new file mode 100644 index 0000000..92307c4 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/lorem_empty.in @@ -0,0 +1,31 @@ + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi auctor euismod enim a sodales. Praesent efficitur pharetra mi, et finibus nulla pellentesque euismod. Sed fringilla sed mi in aliquet. Quisque eu nibh id arcu suscipit tempus. Mauris quam urna, volutpat id iaculis non, lobortis a orci. Quisque commodo lectus sit amet nisl mattis accumsan. Proin iaculis erat in elementum dapibus. + +Aliquam commodo congue neque id porta. Aliquam dictum justo est, a vulputate diam ullamcorper ac. Etiam cursus augue eu porttitor sagittis. Fusce egestas tellus quis semper egestas. Nunc metus neque, accumsan non nulla in, fringilla tincidunt tellus. Aliquam in tempus eros. Donec ornare leo in neque pretium mattis. Morbi consequat lacus vitae justo auctor, eget interdum lorem tincidunt. Morbi at nisl lobortis, ultricies augue a, viverra libero. Phasellus sit amet magna aliquam, scelerisque lectus sit amet, euismod eros. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris in ipsum dui. Maecenas euismod est a dui euismod tristique. Maecenas tincidunt diam ut velit rutrum, a bibendum ligula pellentesque. Maecenas sit amet turpis a mi tristique vulputate non vitae metus. Aenean ut lectus ut eros maximus hendrerit at sed arcu. Nulla condimentum velit non mauris consectetur tempor. Duis fringilla ligula aliquam massa malesuada dignissim. Suspendisse dignissim arcu et augue tristique vestibulum. Nam auctor vulputate dignissim. Integer eget ultrices elit. Vivamus placerat sit amet mauris et lacinia. Maecenas lacinia ipsum blandit justo efficitur congue. Aliquam erat volutpat. Vivamus risus enim, mattis ac lacus molestie, blandit volutpat elit. + +Mauris id arcu vitae urna finibus scelerisque. Nullam dictum interdum lacinia. Nunc congue turpis malesuada velit maximus suscipit. Pellentesque quis interdum risus. Quisque leo massa, viverra in condimentum quis, pharetra ut est. Nullam vehicula tempus elit sit amet placerat. Integer elementum, mauris eget rhoncus sagittis, est massa laoreet felis, sed ultricies risus urna et mi. Proin commodo ut libero in commodo. Nullam consequat tellus non tellus cursus, eget luctus tellus tempor. Proin ante risus, convallis et ex ac, cursus auctor turpis. Integer et mauris ut enim suscipit laoreet. Nulla tortor augue, eleifend id faucibus sed, faucibus eu turpis. Sed vel nibh non tortor venenatis dignissim. Nunc vel maximus mauris. + +Mauris porta nunc eros, vel mattis augue dignissim in. Nunc tempus ac purus dignissim dapibus. Nulla sit amet ipsum dapibus, viverra dolor eu, pharetra lectus. Sed maximus felis justo. Cras nec condimentum nisl. Donec vitae metus suscipit, auctor augue in, blandit purus. Pellentesque viverra non est id mollis. Aenean fermentum nisi sit amet urna tincidunt, eget accumsan mauris bibendum. In vestibulum consectetur erat, ac gravida odio ultrices eu. Nullam quam mi, sagittis a nisl quis, vestibulum ultrices est. + +In ut tempus nibh. Morbi consectetur gravida feugiat. Morbi non eros ut dui faucibus sagittis. Duis euismod metus quis enim aliquet iaculis. Pellentesque pellentesque sed lorem vitae euismod. Aliquam luctus fringilla urna, eget hendrerit augue. Aliquam malesuada nisl id eros viverra aliquam id ut sem. Mauris vel arcu eget nisi finibus varius in vitae arcu. Maecenas aliquet gravida quam feugiat vestibulum. Maecenas id nunc sit amet nulla imperdiet pharetra quis eu lectus. In pellentesque mattis bibendum. Proin ultrices eget turpis eu accumsan. In porttitor ante eget odio mattis egestas. + +Mauris lacinia lacus vel eleifend mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec eu quam orci. Vestibulum fermentum, odio iaculis porta semper, enim lorem faucibus nisl, eu vulputate enim turpis quis massa. Cras hendrerit pulvinar ante id mattis. Phasellus vitae neque lobortis, aliquam purus in, commodo ex. Aenean suscipit metus non sollicitudin porttitor. Maecenas a justo cursus, mattis ligula ut, vestibulum felis. Curabitur dapibus finibus lectus nec porttitor. Integer fringilla, dolor in varius sodales, purus risus bibendum tortor, in eleifend risus neque a elit. Phasellus placerat enim at nulla aliquam luctus. Nunc consequat placerat ornare. Suspendisse faucibus gravida arcu id ullamcorper. + +Praesent dapibus mauris eu purus maximus vehicula. Nulla ultrices luctus eleifend. Etiam efficitur aliquam diam eu varius. Sed quis lacus volutpat, aliquet eros convallis, interdum erat. In auctor ipsum vitae massa rhoncus, nec sagittis purus gravida. Nullam condimentum fringilla euismod. Proin congue nisi ut est lacinia elementum. + +Maecenas leo ex, mattis non neque ut, rutrum pulvinar enim. Morbi malesuada mollis risus, sed faucibus eros ultrices at. Aenean aliquet in odio sit amet rhoncus. Nulla nisi neque, vestibulum a sem sed, consectetur convallis neque. Nullam ac lectus vel eros luctus tincidunt rhoncus eu dui. Pellentesque vitae lorem congue, pretium felis vel, mattis velit. Nullam nulla elit, convallis eu congue sed, ultricies nec diam. Mauris et ligula dui. Praesent sit amet laoreet dolor. Aliquam erat volutpat. Nam feugiat iaculis vestibulum. Ut eget turpis at diam interdum finibus. Aliquam dictum fermentum dui, eget lobortis nibh interdum sagittis. + +Nullam elit sapien, mollis sed convallis a, consectetur at ipsum. Integer viverra consequat turpis vel elementum. Aliquam tincidunt et est sit amet condimentum. Aenean nec sem semper, semper urna quis, aliquet ante. Duis malesuada, massa sit amet congue feugiat, sem diam accumsan lectus, at vestibulum dui libero non lectus. Maecenas nunc tortor, varius sed libero in, placerat consequat neque. Maecenas rutrum sem enim, vel hendrerit dolor luctus nec. Aliquam fringilla purus sagittis consequat pretium. Suspendisse iaculis pharetra est, eleifend elementum mauris viverra eu. Ut pellentesque tempus ipsum, ac maximus risus imperdiet ac. Nulla felis mauris, molestie eu aliquet non, pretium sit amet ante. Integer id cursus mauris. Nunc a mattis magna, nec luctus magna. Mauris sed vehicula nisi, id tincidunt mauris. Curabitur aliquam, eros vitae ultricies interdum, nunc felis placerat enim, eget maximus dui massa vel eros. Mauris turpis est, pretium ut fringilla at, lacinia non eros. + +Mauris nulla massa, facilisis ut dui at, consequat dignissim felis. Pellentesque vitae nibh sed dui convallis faucibus a et risus. In id mauris ligula. Nunc nec ante sem. Curabitur purus eros, molestie ut nunc ut, cursus hendrerit est. Mauris bibendum viverra rhoncus. Nulla varius fringilla nulla, ac hendrerit neque tincidunt sed. Morbi malesuada bibendum elementum. In hac habitasse platea dictumst. Mauris at massa sed massa auctor pellentesque quis quis est. Fusce pharetra, sem nec malesuada consectetur, sapien nisl fermentum nisi, ac volutpat sapien sapien id ligula. + +Mauris finibus ligula ac dolor feugiat, ac pellentesque felis venenatis. Cras scelerisque tempus libero, quis sollicitudin nunc pellentesque nec. Praesent pulvinar leo turpis, vel sagittis ligula dignissim ac. Nam ut bibendum diam. Etiam fermentum nunc tellus, sed ultrices neque porttitor a. Quisque placerat dignissim eros. Phasellus consectetur nisl erat, id luctus lacus scelerisque quis. Aenean mattis molestie mi, ac rhoncus felis congue id. Aliquam erat volutpat. Vestibulum ac accumsan dui. Phasellus a orci nec lacus rhoncus semper eu ac sapien. + +Sed finibus, lectus eget interdum vehicula, lorem tortor ornare urna, id lacinia eros sem eu urna. Pellentesque consectetur vulputate arcu vitae aliquam. Aenean eleifend tempor dui. Mauris lectus diam, euismod vitae posuere et, pulvinar quis nulla. Donec sagittis vestibulum mi quis molestie. Sed eu lectus quis nunc vulputate tristique. Proin imperdiet nibh lectus. Nunc sagittis risus libero, sit amet dignissim ligula mollis a. Proin auctor, eros non condimentum fringilla, dolor neque consequat augue, quis ullamcorper velit nibh id nibh. Quisque mollis sit amet justo nec ultrices. Mauris vel commodo felis, porttitor rutrum turpis. + +In et lacus quis ante commodo suscipit ac et leo. Nam in dui diam. Nulla molestie lacus ac nunc laoreet, vel lobortis nulla suscipit. Ut iaculis feugiat tincidunt. Vestibulum ut pharetra enim, vel pellentesque leo. Pellentesque sit amet rutrum mauris. Nullam ultricies augue id est interdum, sit amet consectetur eros eleifend. + +Aliquam ac pretium arcu, quis viverra mi. Mauris tincidunt tincidunt libero, id aliquam ipsum scelerisque quis. Donec vitae purus et eros dapibus pulvinar. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis efficitur tempus tortor, et sodales augue ultricies sed. Phasellus nec finibus lacus, in aliquet turpis. Maecenas id turpis augue. Nunc finibus turpis purus, aliquam tempor magna ullamcorper ut. Morbi sit amet erat gravida, egestas metus vel, porttitor diam. diff --git a/files/pb071/bonuses/08/test-counting/lorem_empty.out b/files/pb071/bonuses/08/test-counting/lorem_empty.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/lorem_empty.out @@ -0,0 +1 @@ +0 diff --git a/files/pb071/bonuses/08/test-counting/lorem_some.in b/files/pb071/bonuses/08/test-counting/lorem_some.in new file mode 100644 index 0000000..48e447f --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/lorem_some.in @@ -0,0 +1,31 @@ + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi auctor euismod enim a sodales. Praesent efficitur pharetra mi, et finibus nulla pellentesque euismod. Sed fringilla sed mi in aliquet. Quisque eu nibh id arcu suscipit tempus. Mauris quam urna, volutpat id iaculis non, lobortis a orci. Quisque commodo lectus sit amet nisl mattis accumsan. Proin iaculis erat in elementum dapibus. + +Aliquam commodo congue neque id porta. Aliquam dictum justo est, a vulputate diam ullamcorper ac. Etiam cursus augue eu porttitor sagittis. Fusce egestas tellus quis semper egestas. Nunc metus neque, accumsan non nulla in, fringilla tincidunt tellus. Aliquam in tempus eros. Donec ornare leo in neque pretium mattis. Morbi consequat lacus vitae justo auctor, eget interdum lorem tincidunt. Morbi at nisl lobortis, ultricies augue a, viverra libero. Phasellus sit amet magna aliquam, scelerisque lectus sit amet, euismod eros. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris in nananananananas dui. Maecenas euismod est a dui euismod tristique. Maecenas tincidunt diam ut velit rutrum, a bibendum ligula ananas. Maecenas sit amet turpis a mi tristique vulputate non vitae metus. Aenean ut lectus ut eros maximus hendrerit at sed arcu. Nulla condimentum velit non mauris consectetur tempor. Duis fringilla ligula aliquam massa malesuada dignissim. Suspendisse dignissim arcu et augue tristique vestibulum. Nam auctor vulputate dignissim. Integer eget ultrices elit. Vivamus placerat sit amet mauris et lacinia. Maecenas lacinia ipsum blandit justo efficitur congue. Aliquam erat volutpat. Vivamus risus enim, mattis ac lacus molestie, blandit volutpat elit. + +Mauris id arcu vitae urna finibus scelerisque. Nullam dictum interdum lacinia. Nunc congue turpis malesuada velit maximus suscipit. Pellentesque quis interdum risus. Quisque leo massa, viverra in condimentum quis, pharetra ut est. Nullam vehicula tempus elit sit amet placerat. Integer elementum, mauris eget rhoncus sagittis, est massa laoreet felis, sed ultricies risus urna et mi. Proin commodo ut libero in commodo. Nullam consequat tellus non tellus cursus, eget luctus tellus tempor. Proin ante risus, convallis et ex ac, cursus auctor turpis. Integer et mauris ut enim suscipit laoreet. Nulla tortor augue, eleifend id faucibus sed, faucibus eu turpis. Sed vel nibh non tortor venenatis dignissim. Nunc vel maximus mauris. + +Mauris porta nunc eros, vel mattis augue dignissim in. Nunc tempus ac purus dignissim dapibus. Nulla sit amet ipsum dapibus, viverra dolor eu, pharetra lectus. Sed maximus felis justo. Cras nec condimentum nisl. Donec vitae metus suscipit, auctor augue in, blandit purus. Pellentesque viverra non est id mollis. Aenean fermentum nisi sit amet urna tincidunt, eget accumsan mauris bibendum. In vestibulum consectetur erat, ac gravida odio ultrices eu. Nullam quam mi, sagittis a nisl quis, vestibulum ultrices est. + +In ut tempus nibh. Morbi consectetur gravida feugiat. Morbi non eros ut dui ananas sagittis. Duis euismod metus quis enim aliquet iaculis. Pellentesque pellentesque sed lorem vitae euismod. Aliquam luctus fringilla urna, eget hendrerit augue. Aliquam malesuada nisl id eros viverra aliquam id ut sem. Mauris vel arcu eget nisi finibus varius in vitae arcu. Maecenas aliquet gravida quam feugiat vestibulum. Maecenas id nunc sit amet nulla imperdiet pharetra quis eu lectus. In pellentesque mattis bibendum. Proin ultrices eget turpis eu accumsan. In porttitor ante eget odio mattis egestas. +anans +Mauris lacinia lacus vel eleifend mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec eu aaaaaaaaaaaaaaaaaaaaaaaaaaaaananas orci. Vestibulum fermentum, odio iaculis porta semper, enim lorem faucibus nisl, eu vulputate enim turpis quis massa. Cras hendrerit pulvinar ante id mattis. Phasellus vitae neque lobortis, aliquam purus in, commodo ex. Aenean suscipit metus non sollicitudin porttitor. Maecenas a justo cursus, mattis ligula ut, vestibulum felis. Curabitur dapibus finibus lectus nec porttitor. Integer fringilla, dolor in varius sodales, purus risus bibendum tortor, in eleifend risus neque a elit. Phasellus placerat enim at nulla aliquam luctus. Nunc consequat placerat ornare. Suspendisse faucibus gravida arcu id ullamcorper. +ananas +Praesent dapibus mauris eu purus maximus vehicula. Nulla ultrices luctus eleifend. Etiam efficitur aliquam diam eu varius. Sed quis lacus volutpat, aliquet eros convallis, interdum erat. In auctor ipsum vitae massa rhoncus, nec sagittis purus gravida. Nullam condimentum fringilla euismod. Proin congue nisi ut est lacinia elementum. + +Maecenas leo ex, mattis non neque ut, rutrum pulvinar enim. Morbi malesuada mollis risus, sed faucibus eros ultrices at. Aenean aliquet in aaaaaaaaaaaaaaaaaaaaaaaaaaaaananas sit amet rhoncus. Nulla nisi neque, vestibulum a sem sed, consectetur convallis neque. Nullam ac lectus vel eros luctus tincidunt rhoncus eu dui. Pellentesque vitae lorem congue, pretium felis vel, mattis velit. Nullam nulla elit, convallis eu congue sed, ultricies nec diam. Mauris et ligula dui. Praesent sit amet laoreet dolor. Aliquam erat volutpat. Nam feugiat iaculis vestibulum. Ut eget turpis at diam interdum finibus. Aliquam dictum fermentum dui, eget lobortis nibh interdum sagittis. + +Nullam elit sapien, mollis sed convallis a, consectetur at ipsum. Integer viverra consequat turpis vel elementum. Aliquam tincidunt et est sit amet condimentum. Aenean nec sem semper, semper urna quis, aliquet ante. Duis malesuada, massa sit amet congue feugiat, sem diam accumsan lectus, at vestibulum dui libero non lectus. Maecenas nunc tortor, varius sed libero in, placerat consequat neque. Maecenas rutrum sem enim, vel hendrerit dolor luctus nec. Aliquam fringilla purus sagittis consequat pretium. Suspendisse iaculis pharetra est, eleifend elementum mauris viverra eu. Ut pellentesque tempus ipsum, ac maximus risus imperdiet ac. Nulla felis mauris, molestie eu aliquet non, pretium sit amet ante. Integer id cursus mauris. Nunc a mattis magna, nec luctus magna. Mauris sed vehicula nisi, id tincidunt mauris. Curabitur aliquam, eros vitae ultricies interdum, nunc felis placerat enim, eget maximus dui massa vel eros. Mauris turpis est, pretium ut fringilla at, lacinia non eros. + +Mauris nulla massa, facilisis ut dui at, consequat dignissim felis. Pellentesque vitae nibh sed dui convallis faucibus a et risus. In id mauris ligula. Nunc nec ante sem. Curabitur purus eros, molestie ut nunc ut, cursus hendrerit est. Mauris bibendum viverra rhoncus. Nulla varius fringilla nulla, ac hendrerit neque tincidunt sed. Morbi malesuada bibendum elementum. In hac habitasse platea dictumst. Mauris at massa sed massa auctor pellentesque quis quis est. Fusce pharetra, sem nec malesuada consectetur, sapien nisl fermentum nisi, ac volutpat sapien sapien id ligula. + +Mauris finibus ligula ac dolor feugiat, ac pellentesque felis venenatis. Cras anaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanas tempus libero, quis sollicitudin nunc pellentesque nec. Praesent pulvinar leo turpis, vel sagittis ligula dignissim ac. Nam ut bibendum diam. Etiam fermentum nunc tellus, sed ultrices neque porttitor a. Quisque placerat dignissim eros. Phasellus consectetur nisl erat, id luctus lacus scelerisque quis. Aenean mattis molestie mi, ac rhoncus felis congue id. Aliquam erat volutpat. Vestibulum ac accumsan dui. Phasellus a orci nec lacus rhoncus semper eu ac sapien. + +Sed finibus, lectus eget interdum vehicula, lorem tortor ornare urna, id lacinia eros sem eu urna. Pellentesque consectetur vulputate arcu vitae aliquam. Aenean eleifend tempor dui. Mauris lectus diam, euismod vitae posuere et, pulvinar quis nulla. Donec sagittis vestibulum mi quis molestie. Sed eu lectus quis nunc vulputate tristique. Proin imperdiet nibh lectus. Nunc sagittis risus libero, sit amet dignissim ligula mollis a. Proin auctor, eros non condimentum fringilla, dolor neque consequat augue, quis ullamcorper velit nibh id nibh. Quisque mollis sit amet justo nec ultrices. Mauris vel commodo felis, porttitor rutrum turpis. +ananas +In et lacus quis ante commodo suscipit ac et leo. Nam in dui diam. Nulla molestie lacus ac nunc laoreet, vel lobortis nulla suscipit. Ut iaculis feugiat tincidunt. Vestibulum ut pharetra enim, vel pellentesque leo. Pellentesque sit amet rutrum mauris. Nullam ultricies augue id est interdum, sit amet consectetur eros eleifend. + +Aliquam ac pretium arcu, quis viverra mi. Mauris tincidunt tincidunt libero, id aliquam ipsum scelerisque quis. Donec vitae purus et eros dapibus pulvinar. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis efficitur tempus tortor, et sodales augue ultricies sed. Phasellus nec finibus lacus, in aliquet turpis. Maecenas id turpis augue. Nunc finibus turpis purus, aliquam tempor magna ullamcorper ut. Morbi sit amet erat gravida, egestas metus vel, porttitor diam. diff --git a/files/pb071/bonuses/08/test-counting/lorem_some.out b/files/pb071/bonuses/08/test-counting/lorem_some.out new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/lorem_some.out @@ -0,0 +1 @@ +7 diff --git a/files/pb071/bonuses/08/test-counting/mmap.in b/files/pb071/bonuses/08/test-counting/mmap.in new file mode 100644 index 0000000..8cedbc2 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/mmap.in @@ -0,0 +1,264 @@ +MMAP(3P) POSIX Programmer's Manual MMAP(3P) + +PROLOG + This manual page is part of the POSIX Programmer's Manual. The Linux implementation of this interface may differ (consult the corresponding Linux manual page for details of Linux behavior), or the interface may not be imple‐ + mented on Linux. + +NAME + mmap — map pages of memory + +SYNOPSIS + #include + + void *mmap(void *addr, size_t len, int prot, int flags, + int fildes, off_t off); + +DESCRIPTION + The mmap() function shall establish a mapping between an address space of a process and a memory object. + + The mmap() function shall be supported for the following memory objects: + + * Regular files + + * Shared memory objects + + * Typed memory objects + + Support for any other type of file is unspecified. + + The format of the call is as follows: + + pa=mmap(addr, len, prot, flags, fildes, off); + + The mmap() function shall establish a mapping between the address space of the process at an address pa for len bytes to the memory object represented by the file descriptor fildes at offset off for len bytes. The value of pa + is an implementation-defined function of the parameter addr and the values of flags, further described below. A successful mmap() call shall return pa as its result. The address range starting at pa and continuing for len + bytes shall be legitimate for the possible (not necessarily current) address space of the process. The range of bytes starting at off and continuing for len bytes shall be legitimate for the possible (not necessarily current) + offsets in the memory object represented by fildes. + + If fildes represents a typed memory object opened with either the POSIX_TYPED_MEM_ALLOCATE flag or the POSIX_TYPED_MEM_ALLOCATE_CONTIG flag, the memory object to be mapped shall be that portion of the typed memory object al‐ + located by the implementation as specified below. In this case, if off is non-zero, the behavior of mmap() is undefined. If fildes refers to a valid typed memory object that is not accessible from the calling process, mmap() + shall fail. + + The mapping established by mmap() shall replace any previous mappings for those whole pages containing any part of the address space of the process starting at pa and continuing for len bytes. + + If the size of the mapped file changes after the call to mmap() as a result of some other operation on the mapped file, the effect of references to portions of the mapped region that correspond to added or removed portions of + the file is unspecified. + + If len is zero, mmap() shall fail and no mapping shall be established. + + The parameter prot determines whether read, write, execute, or some combination of accesses are permitted to the data being mapped. The prot shall be either PROT_NONE or the bitwise-inclusive OR of one or more of the other + flags in the following table, defined in the header. + + ┌──────────────────┬──────────────────────────┐ + │Symbolic Constant │ Description │ + ├──────────────────┼──────────────────────────┤ + │PROT_READ │ Data can be read. │ + │PROT_WRITE │ Data can be written. │ + │PROT_EXEC │ Data can be executed. │ + │PROT_NONE │ Data cannot be accessed. │ + └──────────────────┴──────────────────────────┘ + If an implementation cannot support the combination of access types specified by prot, the call to mmap() shall fail. + + An implementation may permit accesses other than those specified by prot; however, the implementation shall not permit a write to succeed where PROT_WRITE has not been set and shall not permit any access where PROT_NONE alone + has been set. The implementation shall support at least the following values of prot: PROT_NONE, PROT_READ, PROT_WRITE, and the bitwise-inclusive OR of PROT_READ and PROT_WRITE. The file descriptor fildes shall have been + opened with read permission, regardless of the protection options specified. If PROT_WRITE is specified, the application shall ensure that it has opened the file descriptor fildes with write permission unless MAP_PRIVATE is + specified in the flags parameter as described below. + + The parameter flags provides other information about the handling of the mapped data. The value of flags is the bitwise-inclusive OR of these options, defined in : + + ┌──────────────────┬─────────────────────────┐ + │Symbolic Constant │ Description │ + ├──────────────────┼─────────────────────────┤ + │MAP_SHARED │ Changes are shared. │ + │MAP_PRIVATE │ Changes are private. │ + │MAP_FIXED │ Interpret addr exactly. │ + └──────────────────┴─────────────────────────┘ + It is implementation-defined whether MAP_FIXED shall be supported. MAP_FIXED shall be supported on XSI-conformant systems. + + MAP_SHARED and MAP_PRIVATE describe the disposition of write references to the memory object. If MAP_SHARED is specified, write references shall change the underlying object. If MAP_PRIVATE is specified, modifications to the + mapped data by the calling process shall be visible only to the calling process and shall not change the underlying object. It is unspecified whether modifications to the underlying object done after the MAP_PRIVATE mapping + is established are visible through the MAP_PRIVATE mapping. Either MAP_SHARED or MAP_PRIVATE can be specified, but not both. The mapping type is retained across fork(). + + The state of synchronization objects such as mutexes, semaphores, barriers, and conditional variables placed in shared memory mapped with MAP_SHARED becomes undefined when the last region in any process containing the syn‐ + chronization object is unmapped. + + When fildes represents a typed memory object opened with either the POSIX_TYPED_MEM_ALLOCATE flag or the POSIX_TYPED_MEM_ALLOCATE_CONTIG flag, mmap() shall, if there are enough resources available, map len bytes allocated + from the corresponding typed memory object which were not previously allocated to any process in any processor that may access that typed memory object. If there are not enough resources available, the function shall fail. If + fildes represents a typed memory object opened with the POSIX_TYPED_MEM_ALLOCATE_CONTIG flag, these allocated bytes shall be contiguous within the typed memory object. If fildes represents a typed memory object opened with + the POSIX_TYPED_MEM_ALLOCATE flag, these allocated bytes may be composed of non-contiguous fragments within the typed memory object. If fildes represents a typed memory object opened with neither the POSIX_TYPED_MEM_ALLO‐ + CATE_CONTIG flag nor the POSIX_TYPED_MEM_ALLOCATE flag, len bytes starting at offset off within the typed memory object are mapped, exactly as when mapping a file or shared memory object. In this case, if two processes map an + area of typed memory using the same off and len values and using file descriptors that refer to the same memory pool (either from the same port or from a different port), both processes shall map the same region of storage. + + When MAP_FIXED is set in the flags argument, the implementation is informed that the value of pa shall be addr, exactly. If MAP_FIXED is set, mmap() may return MAP_FAILED and set errno to [EINVAL]. If a MAP_FIXED request is + successful, then any previous mappings or memory locks for those whole pages containing any part of the address range [pa,pa+len) shall be removed, as if by an appropriate call to munmap(), before the new mapping is estab‐ + lished. + + When MAP_FIXED is not set, the implementation uses addr in an implementation-defined manner to arrive at pa. The pa so chosen shall be an area of the address space that the implementation deems suitable for a mapping of len + bytes to the file. All implementations interpret an addr value of 0 as granting the implementation complete freedom in selecting pa, subject to constraints described below. A non-zero value of addr is taken to be a suggestion + of a process address near which the mapping should be placed. When the implementation selects a value for pa, it never places a mapping at address 0, nor does it replace any extant mapping. + + If MAP_FIXED is specified and addr is non-zero, it shall have the same remainder as the off parameter, modulo the page size as returned by sysconf() when passed _SC_PAGESIZE or _SC_PAGE_SIZE. The implementation may require + that off is a multiple of the page size. If MAP_FIXED is specified, the implementation may require that addr is a multiple of the page size. The system performs mapping operations over whole pages. Thus, while the parameter + len need not meet a size or alignment constraint, the system shall include, in any mapping operation, any partial page specified by the address range starting at pa and continuing for len bytes. + + The system shall always zero-fill any partial page at the end of an object. Further, the system shall never write out any modified portions of the last page of an object which are beyond its end. References within the ad‐ + dress range starting at pa and continuing for len bytes to whole pages following the end of an object shall result in delivery of a SIGBUS signal. + + An implementation may generate SIGBUS signals when a reference would cause an error in the mapped object, such as out-of-space condition. + + The mmap() function shall add an extra reference to the file associated with the file descriptor fildes which is not removed by a subsequent close() on that file descriptor. This reference shall be removed when there are no + more mappings to the file. + + The last data access timestamp of the mapped file may be marked for update at any time between the mmap() call and the corresponding munmap() call. The initial read or write reference to a mapped region shall cause the file's + last data access timestamp to be marked for update if it has not already been marked for update. + + The last data modification and last file status change timestamps of a file that is mapped with MAP_SHARED and PROT_WRITE shall be marked for update at some point in the interval between a write reference to the mapped region + and the next call to msync() with MS_ASYNC or MS_SYNC for that portion of the file by any process. If there is no such call and if the underlying file is modified as a result of a write reference, then these timestamps shall + be marked for update at some time after the write reference. + + There may be implementation-defined limits on the number of memory regions that can be mapped (per process or per system). + + If such a limit is imposed, whether the number of memory regions that can be mapped by a process is decreased by the use of shmat() is implementation-defined. + + If mmap() fails for reasons other than [EBADF], [EINVAL], or [ENOTSUP], some of the mappings in the address range starting at addr and continuing for len bytes may have been unmapped. + +RETURN VALUE + Upon successful completion, the mmap() function shall return the address at which the mapping was placed (pa); otherwise, it shall return a value of MAP_FAILED and set errno to indicate the error. The symbol MAP_FAILED is de‐ + fined in the header. No successful return from mmap() shall return the value MAP_FAILED. + +ERRORS + The mmap() function shall fail if: + + EACCES The fildes argument is not open for read, regardless of the protection specified, or fildes is not open for write and PROT_WRITE was specified for a MAP_SHARED type mapping. + + EAGAIN The mapping could not be locked in memory, if required by mlockall(), due to a lack of resources. + + EBADF The fildes argument is not a valid open file descriptor. + + EINVAL The value of len is zero. + + EINVAL The value of flags is invalid (neither MAP_PRIVATE nor MAP_SHARED is set). + + EMFILE The number of mapped regions would exceed an implementation-defined limit (per process or per system). + + ENODEV The fildes argument refers to a file whose type is not supported by mmap(). + + ENOMEM MAP_FIXED was specified, and the range [addr,addr+len) exceeds that allowed for the address space of a process; or, if MAP_FIXED was not specified and there is insufficient room in the address space to effect the map‐ + ping. + + ENOMEM The mapping could not be locked in memory, if required by mlockall(), because it would require more space than the system is able to supply. + + ENOMEM Not enough unallocated memory resources remain in the typed memory object designated by fildes to allocate len bytes. + + ENOTSUP + MAP_FIXED or MAP_PRIVATE was specified in the flags argument and the implementation does not support this functionality. + + The implementation does not support the combination of accesses requested in the prot argument. + + ENXIO Addresses in the range [off,off+len) are invalid for the object specified by fildes. + + ENXIO MAP_FIXED was specified in flags and the combination of addr, len, and off is invalid for the object specified by fildes. + + ENXIO The fildes argument refers to a typed memory object that is not accessible from the calling process. + + EOVERFLOW + The file is a regular file and the value of off plus len exceeds the offset maximum established in the open file description associated with fildes. + + The mmap() function may fail if: + + EINVAL The addr argument (if MAP_FIXED was specified) or off is not a multiple of the page size as returned by sysconf(), or is considered invalid by the implementation. + + The following sections are informative. + +EXAMPLES + None. + +APPLICATION USAGE + Use of mmap() may reduce the amount of memory available to other memory allocation functions. + + Use of MAP_FIXED may result in unspecified behavior in further use of malloc() and shmat(). The use of MAP_FIXED is discouraged, as it may prevent an implementation from making the most effective use of resources. Most im‐ + plementations require that off and addr are multiples of the page size as returned by sysconf(). + + The application must ensure correct synchronization when using mmap() in conjunction with any other file access method, such as read() and write(), standard input/output, and shmat(). + + The mmap() function allows access to resources via address space manipulations, instead of read()/write(). Once a file is mapped, all a process has to do to access it is use the data at the address to which the file was + mapped. So, using pseudo-code to illustrate the way in which an existing program might be changed to use mmap(), the following: + + fildes = open(...) + lseek(fildes, some_offset) + read(fildes, buf, len) + /* Use data in buf. */ + + becomes: + + fildes = open(...) + address = mmap(0, len, PROT_READ, MAP_PRIVATE, fildes, some_offset) + /* Use data at address. */ + +RATIONALE + After considering several other alternatives, it was decided to adopt the mmap() definition found in SVR4 for mapping memory objects into process address spaces. The SVR4 definition is minimal, in that it describes only what + has been built, and what appears to be necessary for a general and portable mapping facility. + + Note that while mmap() was first designed for mapping files, it is actually a general-purpose mapping facility. It can be used to map any appropriate object, such as memory, files, devices, and so on, into the address space + of a process. + + When a mapping is established, it is possible that the implementation may need to map more than is requested into the address space of the process because of hardware requirements. An application, however, cannot count on + this behavior. Implementations that do not use a paged architecture may simply allocate a common memory region and return the address of it; such implementations probably do not allocate any more than is necessary. References + past the end of the requested area are unspecified. + + If an application requests a mapping that overlaps existing mappings in the process, it might be desirable that an implementation detect this and inform the application. However, if the program specifies a fixed address map‐ + ping (which requires some implementation knowledge to determine a suitable address, if the function is supported at all), then the program is presumed to be successfully managing its own address space and should be trusted + when it asks to map over existing data structures. Furthermore, it is also desirable to make as few system calls as possible, and it might be considered onerous to require an munmap() before an mmap() to the same address + range. This volume of POSIX.1‐2017 specifies that the new mapping replaces any existing mappings (implying an automatic munmap() on the address range), following existing practice in this regard. The standard developers also + considered whether there should be a way for new mappings to overlay existing mappings, but found no existing practice for this. + + It is not expected that all hardware implementations are able to support all combinations of permissions at all addresses. Implementations are required to disallow write access to mappings without write permission and to + disallow access to mappings without any access permission. Other than these restrictions, implementations may allow access types other than those requested by the application. For example, if the application requests only + PROT_WRITE, the implementation may also allow read access. A call to mmap() fails if the implementation cannot support allowing all the access requested by the application. For example, some implementations cannot support a + request for both write access and execute access simultaneously. All implementations must support requests for no access, read access, write access, and both read and write access. Strictly conforming code must only rely on + the required checks. These restrictions allow for portability across a wide range of hardware. + + The MAP_FIXED address treatment is likely to fail for non-page-aligned values and for certain architecture-dependent address ranges. Conforming implementations cannot count on being able to choose address values for + MAP_FIXED without utilizing non-portable, implementation-defined knowledge. Nonetheless, MAP_FIXED is provided as a standard interface conforming to existing practice for utilizing such knowledge when it is available. + + Similarly, in order to allow implementations that do not support virtual addresses, support for directly specifying any mapping addresses via MAP_FIXED is not required and thus a conforming application may not count on it. + + The MAP_PRIVATE function can be implemented efficiently when memory protection hardware is available. When such hardware is not available, implementations can implement such ``mappings'' by simply making a real copy of the + relevant data into process private memory, though this tends to behave similarly to read(). + + The function has been defined to allow for many different models of using shared memory. However, all uses are not equally portable across all machine architectures. In particular, the mmap() function allows the system as + well as the application to specify the address at which to map a specific region of a memory object. The most portable way to use the function is always to let the system choose the address, specifying NULL as the value for + the argument addr and not to specify MAP_FIXED. + + If it is intended that a particular region of a memory object be mapped at the same address in a group of processes (on machines where this is even possible), then MAP_FIXED can be used to pass in the desired mapping address. + The system can still be used to choose the desired address if the first such mapping is made without specifying MAP_FIXED, and then the resulting mapping address can be passed to subsequent processes for them to pass in via + MAP_FIXED. The availability of a specific address range cannot be guaranteed, in general. + + The mmap() function can be used to map a region of memory that is larger than the current size of the object. Memory access within the mapping but beyond the current end of the underlying objects may result in SIGBUS signals + being sent to the process. The reason for this is that the size of the object can be manipulated by other processes and can change at any moment. The implementation should tell the application that a memory reference is out‐ + side the object where this can be detected; otherwise, written data may be lost and read data may not reflect actual data in the object. + + Note that references beyond the end of the object do not extend the object as the new end cannot be determined precisely by most virtual memory hardware. Instead, the size can be directly manipulated by ftruncate(). + + Process memory locking does apply to shared memory regions, and the MCL_FUTURE argument to mlockall() can be relied upon to cause new shared memory regions to be automatically locked. + + Existing implementations of mmap() return the value -1 when unsuccessful. Since the casting of this value to type void * cannot be guaranteed by the ISO C standard to be distinct from a successful value, this volume of + POSIX.1‐2017 defines the symbol MAP_FAILED, which a conforming implementation does not return as the result of a successful call. + +FUTURE DIRECTIONS + None. + +SEE ALSO + exec, fcntl(), fork(), lockf(), msync(), munmap(), mprotect(), posix_typed_mem_open(), shmat(), sysconf() + + The Base Definitions volume of POSIX.1‐2017, + +COPYRIGHT + Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1-2017, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 7, + 2018 Edition, Copyright (C) 2018 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. In the event of any discrepancy between this version and the original IEEE and The Open Group Standard, the + original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.opengroup.org/unix/online.html . + + Any typographical or formatting errors that appear in this page are most likely to have been introduced during the conversion of the source files to man page format. To report such errors, see https://www.kernel.org/doc/man- + pages/reporting_bugs.html . + +IEEE/The Open Group 2017 MMAP(3P) diff --git a/files/pb071/bonuses/08/test-counting/mmap.json b/files/pb071/bonuses/08/test-counting/mmap.json new file mode 100644 index 0000000..d1f9b2e --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/mmap.json @@ -0,0 +1,4 @@ +{ + "args": ["{test_case}.in", "{test_case}.out_produced", "mmap"], + "specialized_test": ["diff", "{test_case}.out", "{test_case}.out_produced"] +} diff --git a/files/pb071/bonuses/08/test-counting/mmap.out b/files/pb071/bonuses/08/test-counting/mmap.out new file mode 100644 index 0000000..e522732 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/mmap.out @@ -0,0 +1 @@ +38 diff --git a/files/pb071/bonuses/08/test-counting/never_enough_random.in b/files/pb071/bonuses/08/test-counting/never_enough_random.in new file mode 100644 index 0000000..4d4d905 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/never_enough_random.in @@ -0,0 +1 @@ +Quisquam ananas quisquam dolor voluptatem quaerat ananas ipsum consectetur. ananasPorro quisquam est quisquam. Adipisci quaerat ananas ut voluptatem ut amet. Tempora ut non non. Tempora magnam porro nananason. Velit ananas ipsum numquam voluptatem magnananasam ananas ut consectetur magnam. Numquam sit ananas ipsum eius. Quiquia ananas amet labore consectetur ananas magnam. Est aliquam dolore numquam ananas diff --git a/files/pb071/bonuses/08/test-counting/never_enough_random.out b/files/pb071/bonuses/08/test-counting/never_enough_random.out new file mode 100644 index 0000000..48082f7 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/never_enough_random.out @@ -0,0 +1 @@ +12 diff --git a/files/pb071/bonuses/08/test-counting/nothing_to_see.in b/files/pb071/bonuses/08/test-counting/nothing_to_see.in new file mode 100644 index 0000000..8d41d9c --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/nothing_to_see.in @@ -0,0 +1 @@ +Ipsum consectetur aliquam ut sit quiquia. Numquam labore quiquia tempora labore magnam aliquam. Neque eius magnam eius adipisci labore numquam magnam. Quaerat numquam tempora labore. Eius quaerat est porro amet ut. Etincidunt etincidunt dolor labore adipisci. Etincidunt quiquia voluptatem numquam quiquia ut voluptatem neque. Velit dolor quiquia est. Quiquia dolor sed est quisquam quisquam. Est porro quiquia tempora numquam ipsum consectetur non. Dolore porro magnam dolorem dolore dolor ipsum. Aliquam quiquia quiquia modi quisquam eius. Dolorem tempora adipisci ut dolor dolorem. Sit quaerat ut est aliquam modi magnam. Eius dolore diff --git a/files/pb071/bonuses/08/test-counting/nothing_to_see.out b/files/pb071/bonuses/08/test-counting/nothing_to_see.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/nothing_to_see.out @@ -0,0 +1 @@ +0 diff --git a/files/pb071/bonuses/08/test-counting/random.in b/files/pb071/bonuses/08/test-counting/random.in new file mode 100644 index 0000000..560d738 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/random.in @@ -0,0 +1 @@ +Quiquia est dolore quisquam. Magnam voluptatem dolorem dolor quaerat sed. Est labore eius etincidunt. Dolore neque magnam quisquam. Labore amet velit ipsum dolorem quaerat sed modi. Numquam labore quaerat non dolor quaerat dolore. Magnam dolore porro amet porro. Dolorem quiquia adipisci dolor dolore numquam porro dolorem. Velit sit numquam sit. Modi tempora ut dolor numquam. Numquam porro eius quaerat ut. Amet sit eius etincidunt ipsum ipsum. diff --git a/files/pb071/bonuses/08/test-counting/random.out b/files/pb071/bonuses/08/test-counting/random.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/random.out @@ -0,0 +1 @@ +0 diff --git a/files/pb071/bonuses/08/test-counting/random_again.in b/files/pb071/bonuses/08/test-counting/random_again.in new file mode 100644 index 0000000..42357f1 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/random_again.in @@ -0,0 +1 @@ +Eius dolore est ipsum neque. Tempoananasra dolorem est labore ananas aliquam neque consectetur ananas dolor. Ut sed aliquam ut. Ut consectetur quiquia modi eius ananas eius. Dolore sed maananasgnam etincidunt quisquam dolor. Quaerat etincidunt aliquam etincidunt dolor ananas consectetur quaerat. Numquam ananas amet numquam esananast dolorem ananasconsectetur quisquam neque. Quisquam voluptatem consectetur non modi adipisci labore quisquam. Quiquia porro nananaseque sed magnam sed magnam porro. ananas Aliquam amet quaerat dolore quaerat. Numquam porro magnam ipsum etincidunt adipisci quisquam adipisci. diff --git a/files/pb071/bonuses/08/test-counting/random_again.out b/files/pb071/bonuses/08/test-counting/random_again.out new file mode 100644 index 0000000..b4de394 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/random_again.out @@ -0,0 +1 @@ +11 diff --git a/files/pb071/bonuses/08/test-counting/stream.json b/files/pb071/bonuses/08/test-counting/stream.json new file mode 100644 index 0000000..d66ee7a --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/stream.json @@ -0,0 +1,4 @@ +{ + "args": ["test-counting/fgetc.in", "{test_case}.out_produced", "stream"], + "specialized_test": ["diff", "{test_case}.out", "{test_case}.out_produced"] +} diff --git a/files/pb071/bonuses/08/test-counting/stream.out b/files/pb071/bonuses/08/test-counting/stream.out new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/stream.out @@ -0,0 +1 @@ +10 diff --git a/files/pb071/bonuses/08/test-counting/tough.in b/files/pb071/bonuses/08/test-counting/tough.in new file mode 100644 index 0000000..aa87532 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/tough.in @@ -0,0 +1 @@ +anananas diff --git a/files/pb071/bonuses/08/test-counting/tough.out b/files/pb071/bonuses/08/test-counting/tough.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/tough.out @@ -0,0 +1 @@ +1 diff --git a/files/pb071/bonuses/08/test-counting/tricky.in b/files/pb071/bonuses/08/test-counting/tricky.in new file mode 100644 index 0000000..7109bc1 --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/tricky.in @@ -0,0 +1 @@ +nananananananananananas aaaaaaaaaaaaaaaaaaaaaaaaaaananas ananassssssssssssssssssssss diff --git a/files/pb071/bonuses/08/test-counting/tricky.out b/files/pb071/bonuses/08/test-counting/tricky.out new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/files/pb071/bonuses/08/test-counting/tricky.out @@ -0,0 +1 @@ +3 diff --git a/files/pb071/bonuses/08/test-trees/aligned.in b/files/pb071/bonuses/08/test-trees/aligned.in new file mode 100644 index 0000000..59fdb42 --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/aligned.in @@ -0,0 +1,9 @@ +4;3 +2;2 +0;1 +-1;0 +1;0 +3;0 +6;1 +5;0 +7;0 diff --git a/files/pb071/bonuses/08/test-trees/close_call_but_not_exactly.in b/files/pb071/bonuses/08/test-trees/close_call_but_not_exactly.in new file mode 100644 index 0000000..73dc702 --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/close_call_but_not_exactly.in @@ -0,0 +1,15 @@ +5;4 +3;2 +2;1 +1;0 +nil +4;0 +8;3 +6;1 +nil +7;0 +12;2 +10;1 +9;0 +11;0 +13;0 diff --git a/files/pb071/bonuses/08/test-trees/could_be_coloured.in b/files/pb071/bonuses/08/test-trees/could_be_coloured.in new file mode 100644 index 0000000..eaf6d17 --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/could_be_coloured.in @@ -0,0 +1,11 @@ +13;3 +8;2 +1;1 +nil +6;0 +11;0 +17;2 +15;0 +25;1 +22;0 +27;0 diff --git a/files/pb071/bonuses/08/test-trees/example.in b/files/pb071/bonuses/08/test-trees/example.in new file mode 100644 index 0000000..bca1aad --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/example.in @@ -0,0 +1,15 @@ +8;4 +5;3 +3;2 +2;1 +1;0 +nil +4;0 +7;1 +6;0 +nil +11;2 +10;1 +9;0 +nil +12;0 diff --git a/files/pb071/bonuses/08/test-trees/is_coloured_in_a_sense_but_not_brother_to_the_others.in b/files/pb071/bonuses/08/test-trees/is_coloured_in_a_sense_but_not_brother_to_the_others.in new file mode 100644 index 0000000..e4bc795 --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/is_coloured_in_a_sense_but_not_brother_to_the_others.in @@ -0,0 +1,11 @@ +13;1 +8;1 +1;0 +nil +6;0 +11;0 +17;1 +15;0 +25;0 +22;0 +27;0 diff --git a/files/pb071/bonuses/08/test-trees/no_tree.in b/files/pb071/bonuses/08/test-trees/no_tree.in new file mode 100644 index 0000000..e69de29 diff --git a/files/pb071/bonuses/08/test-trees/no_tree_again.in b/files/pb071/bonuses/08/test-trees/no_tree_again.in new file mode 100644 index 0000000..607602c --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/no_tree_again.in @@ -0,0 +1 @@ +nil diff --git a/files/pb071/bonuses/08/test-trees/only_root.in b/files/pb071/bonuses/08/test-trees/only_root.in new file mode 100644 index 0000000..42a3478 --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/only_root.in @@ -0,0 +1 @@ +8;0 diff --git a/files/pb071/bonuses/08/test-trees/pretty_tree.in b/files/pb071/bonuses/08/test-trees/pretty_tree.in new file mode 100644 index 0000000..33ca88d --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/pretty_tree.in @@ -0,0 +1,3 @@ +10;1 +9;0 +11;0 diff --git a/files/pb071/bonuses/08/test-trees/two_nodes.in b/files/pb071/bonuses/08/test-trees/two_nodes.in new file mode 100644 index 0000000..6c4fe19 --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/two_nodes.in @@ -0,0 +1,3 @@ +4;1 +3;0 +nil diff --git a/files/pb071/bonuses/08/test-trees/two_nodes_other_way.in b/files/pb071/bonuses/08/test-trees/two_nodes_other_way.in new file mode 100644 index 0000000..ff17256 --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/two_nodes_other_way.in @@ -0,0 +1,3 @@ +4;1 +nil +5;0 diff --git a/files/pb071/bonuses/08/test-trees/whats_this.in b/files/pb071/bonuses/08/test-trees/whats_this.in new file mode 100644 index 0000000..656f4ec --- /dev/null +++ b/files/pb071/bonuses/08/test-trees/whats_this.in @@ -0,0 +1,7 @@ +42;2 +11;1 +nil +33;0 +314;1 +171;0 +981;0 diff --git a/files/pb071/bonuses/08/tree.png b/files/pb071/bonuses/08/tree.png new file mode 100644 index 0000000..47f96d6 Binary files /dev/null and b/files/pb071/bonuses/08/tree.png differ diff --git a/files/pb071/bonuses/08/trees.c b/files/pb071/bonuses/08/trees.c new file mode 100644 index 0000000..443fe30 --- /dev/null +++ b/files/pb071/bonuses/08/trees.c @@ -0,0 +1,85 @@ +#include +#include + +#define UNUSED(x) ((void) (x)) + +struct node +{ + int key; + int rank; + + struct node *left; + struct node *right; +}; + +struct tree +{ + struct node *root; +}; + +/** + * @brief Creates new dynamically allocated node. + * @param key Key that node holds. + * @param rank Rank that node has. + * @returns Pointer to dynamically allocated node, NULL if allocation fails. + */ +struct node * +create_node(int key, int rank) +{ + struct node *new_node = calloc(1, sizeof(struct node)); + if (new_node == NULL) { + fprintf(stderr, "create_node: Cannot allocate memory for node.\n"); + return NULL; + } + + new_node->key = key; + new_node->rank = rank; + return new_node; +} + +/** + * @brief Recursively frees node and its subtrees. + * @param node Root of the subtree to be freed. + */ +void free_node(struct node *node) +{ + if (node == NULL) { + return; + } + + free_node(node->left); + free_node(node->right); + free(node); +} + +/** + * @brief Prettyprints given tree into the file. + * @param file File for output. + * @param tree Tree to be prettyprinted. + */ +void pretty_print_tree(FILE *file, const struct tree *tree) +{ + UNUSED(file); + UNUSED(tree); +} + +/** + * @brief Loads tree from a file and returns root of it. + * @param file File where the tree is saved. + * @returns Pointer to the loaded tree, NULL if error happens or no tree is in file. + */ +struct node *load_tree(FILE *file) +{ + UNUSED(file); +} + +int main(int argc, char **argv) +{ + if (argc < 2 || argc > 3) { + printf("Usage: %s [output-file]\n", argv[0]); + return 1; + } + + /* TODO */ + return 0; +} diff --git a/files/pb071/bonuses/10.tar.bz2 b/files/pb071/bonuses/10.tar.bz2 new file mode 100644 index 0000000..02fa170 Binary files /dev/null and b/files/pb071/bonuses/10.tar.bz2 differ diff --git a/files/pb071/bonuses/10.tar.gz b/files/pb071/bonuses/10.tar.gz new file mode 100644 index 0000000..ceba562 Binary files /dev/null and b/files/pb071/bonuses/10.tar.gz differ diff --git a/files/pb071/bonuses/10/.archive b/files/pb071/bonuses/10/.archive new file mode 100644 index 0000000..e69de29 diff --git a/files/pb071/bonuses/10/CMakeLists.txt b/files/pb071/bonuses/10/CMakeLists.txt new file mode 100644 index 0000000..161ab80 --- /dev/null +++ b/files/pb071/bonuses/10/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.0) + +# Project configuration +project(seminar10-bonus) +set(SOURCES hangman.c main.c) + +# Executable +add_executable(hangman hangman.c main.c) +add_executable(test_hangman test_hangman.c hangman.c) + +# Configure compiler warnings +if (CMAKE_C_COMPILER_ID MATCHES Clang OR ${CMAKE_C_COMPILER_ID} STREQUAL GNU) + # using regular Clang, AppleClang or GCC + # Strongly suggested: neable -Werror + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -Wall -Wextra -pedantic") +elseif (${CMAKE_C_COMPILER_ID} STREQUAL MSVC) + # using Visual Studio C++ + target_compile_definitions(${EXECUTABLE} PRIVATE _CRT_SECURE_NO_DEPRECATE) + set(CMAKE_CXX_FLAGS "/permissive- /W4 /EHsc") +endif() + +if(MINGW) + target_compile_definitions(${EXECUTABLE} PRIVATE __USE_MINGW_ANSI_STDIO=1) +endif() diff --git a/files/pb071/bonuses/10/Makefile b/files/pb071/bonuses/10/Makefile new file mode 100644 index 0000000..507c644 --- /dev/null +++ b/files/pb071/bonuses/10/Makefile @@ -0,0 +1,11 @@ +check: check-unit check-functional + +check-unit: + build/test_hangman + +check-functional: + python3 test-bonus.py test hangman + python3 test-bonus.py test hangman --no-global-config + +clean: + rm -rf test-*/*.out_produced diff --git a/files/pb071/bonuses/10/hangman.c b/files/pb071/bonuses/10/hangman.c new file mode 100644 index 0000000..25ac845 --- /dev/null +++ b/files/pb071/bonuses/10/hangman.c @@ -0,0 +1,233 @@ +#include "hangman.h" + +#include +#include +#include +#include +#include +#include + +#define MAX_LENGTH 50 +#define ALPHABET_LENGTH 27 + +int get_word(const char *wordlist, char secret[]) +{ + FILE *fp = fopen(wordlist, "rb"); + if (fp == NULL) { + fprintf(stderr, "No such file or directory: %s\n", wordlist); + return 1; + } + + struct stat st; + stat(wordlist, &st); + long int size = st.st_size; + + /* FIXME: Can fall into infinite loop... */ + do { + long int random = (rand() % size) + 1; + + fseek(fp, random, SEEK_SET); + + int result = fscanf(fp, "%*s %20s", secret); + if (result != EOF) + break; + } while (1); + + fclose(fp); + + return 0; +} + +static void print_word(const char *word) +{ + for (size_t i = 0; word[i]; i++) { + printf(" %c", word[i]); + } + printf("\n"); +} + +bool word_guessed(const char secret[], const char letters_guessed[]) +{ + size_t l = strlen(secret), k=0; + + for (size_t j = 0; letters_guessed[j]; j++) { + for (size_t i = 0; secret[i]; i++) { + if (secret[i] == letters_guessed[j]) { + k++; + } + } + } + + return l <= k; +} + +void censor_word(const char secret[], const char letters_guessed[], char guessed_word[]) +{ + size_t i; + for (i = 0; secret[i]; i++, guessed_word++) { + *guessed_word = secret[i]; + + bool guessed = false; + for (int j = 0; letters_guessed[j]; j++) { + if (secret[i] == letters_guessed[j]) { + guessed = true; + } + } + + if (!guessed) { + *guessed_word = '_'; + } + } + + *guessed_word = '\0'; +} + +void get_available_letters(const char letters_guessed[], + char available_letters[]) +{ + size_t k = 0; + + for (char letter = 'a'; letter <= 'z'; letter++) { + bool to_be_put = true; + + for (size_t j = 0; letters_guessed[j]; j++) { + if (letters_guessed[j] == letter) { + to_be_put = false; + break; + } + } + + if (to_be_put) { + available_letters[k++] = letter; + } + } + available_letters[k] = '\0'; +} + +static bool been_already_guessed(const char *guessed_letters, + const char letter) +{ + for (size_t i = 0; guessed_letters[i]; i++) { + if (guessed_letters[i] == letter) { + return true; + } + } + return false; +} + +static bool is_good_guess(const char secret[], char guessed_word[], const char letter) +{ + bool result = false; + for (size_t i = 0; secret[i]; i++) { + if (secret[i] == letter) { + result = true; + break; + } + } + + if (result) { + printf("Good guess:"); + } else { + printf("Oops! That letter is not in my word:"); + } + + print_word(guessed_word); + return result; +} + +static bool guessed_whole(const char *secret, const char *guess) +{ + for (size_t i = 0; secret[i]; i++) + if (tolower(guess[i]) != secret[i]) { + return false; + } + + return true; +} + +static int get_guess(char *guess) +{ + int result = scanf("%s", guess); + if (result == 1) { + *guess = tolower(*guess); + return result; + } + + int ch = 0; + fprintf(stderr, "Input was not successful.\n"); + while (ch != EOF && (ch = getchar()) != '\n') + ; + return result; +} + +void hangman(const char secret[]) +{ + printf("Welcome to the game, Hangman!\n"); + + size_t length_of_word = strlen(secret); + printf("I am thinking of a word that is %lu letters long.\n", + length_of_word); + + int guesses = 8, no_of_guessed_letters = 0; + char available_letters[ALPHABET_LENGTH], + guessed_letters[ALPHABET_LENGTH] = { 0 }; + char guess[MAX_LENGTH]; + char guessed_word[MAX_LENGTH] = { 0 }; + get_available_letters(guessed_letters, available_letters); + + while (guesses > 0) { + printf("-------------\n"); + if (word_guessed(secret, guessed_letters)) { + printf("Congratulations, you won!\n"); + return; + } + + printf("You have %d guesses left.\n", guesses); + printf("Available letters: %s\n", available_letters); + + printf("Please guess a letter: "); + + int read_status = get_guess(guess); + if (read_status == EOF) { + fprintf(stderr, "No more input to read.\n"); + return; + } else if (read_status == 0) { + continue; + } + + if (guess[1]) { + if (guessed_whole(secret, guess)) { + printf("Congratulations, you won!\n"); + } else { + printf("Sorry, bad guess. The word was %s.\n", secret); + } + } + + if (*guess < 'a' || *guess > 'z') { + printf("Oops! '%c' is not a valid letter:", *guess); + censor_word(secret, guessed_letters, guessed_word); + print_word(guessed_word); + continue; + } + + if (been_already_guessed(guessed_letters, *guess)) { + printf("Oops! You've already guessed that letter:"); + censor_word(secret, guessed_letters, guessed_word); + print_word(guessed_word); + continue; + } + + guessed_letters[no_of_guessed_letters++] = *guess; + get_available_letters(guessed_letters, available_letters); + censor_word(secret, guessed_letters, guessed_word); + + if (!is_good_guess(secret, guessed_word, *guess)) { + guesses--; + } + } + + if (guesses == 0) { + printf("-------------\n"); + printf("Sorry, you ran out of guesses. The word was %s.\n", secret); + } +} diff --git a/files/pb071/bonuses/10/hangman.h b/files/pb071/bonuses/10/hangman.h new file mode 100644 index 0000000..2a0b8e5 --- /dev/null +++ b/files/pb071/bonuses/10/hangman.h @@ -0,0 +1,55 @@ +#include + +#define WORDLIST_FILENAME "words.txt" + +/** + * Function detects, whether player guessed the secret word + * Based on the letters player used for guessing, this function detects, + * if it is possible to construct (and guess) the secret word from this set. + * If it is possible, function returns true. If not, returns false. + * @param secret the secret word lowercase + * @param letters_guessed the lowercase letters player already used in his guessing + * @return true, if word is guess; false otherwise. + */ +bool word_guessed(const char secret[], const char letters_guessed[]); + +/** + * Function returns string representing the guessed word + * This string contains visible letters, which were guessed successfuly + * by player at their correct positions. If there are still some hidden + * letters, the character '_' will be used for their representation. + * @param secret the secret word lowercase + * @param letters_guessed the lowercase letters player already used in his guessing + * @param guessed_word the constructed string as result of this function (output parameter) + */ +void censor_word(const char secret[], const char letters_guessed[], char guessed_word[]); + +/** + * Returns all letters, which were not used for guessing + * Function returns set of lowercase letters sorted in alphabetical order. This + * set will contain all letters from the alphabet, but it ommits those, which + * were already guessed. + * @param letters_guessed the lowercase letters player already used in his guessing + * @param available_letters set of lowercase not yet used letters + */ +void get_available_letters(const char letters_guessed[], char available_letters[]); + +/** + * Starts interactive hangman game + * + * @param secret the secret word lowercase + */ +void hangman(const char secret[]); + +/** + * Returns the random word + * Function opens the file with all the words and reads randomly one of them + * into the buffer pointed by secret. Word consists of lowercase letters. + * If there is some error with reading the file, 1 is returned. + * Don't forget to initialize the random numbers in your main() function will srand() call! + * Otherwise (everything is ok), 0 is returned. + * @param wordlist path to the file with words + * @param secret buffer, where random word will be read + * @return status code + */ +int get_word(const char *wordlist, char secret[]); diff --git a/files/pb071/bonuses/10/hangman.json b/files/pb071/bonuses/10/hangman.json new file mode 100644 index 0000000..03d783f --- /dev/null +++ b/files/pb071/bonuses/10/hangman.json @@ -0,0 +1,5 @@ +{ + "args": ["{test_case}.words"], + "has_stdin": true, + "capture_stdout": true +} diff --git a/files/pb071/bonuses/10/main.c b/files/pb071/bonuses/10/main.c new file mode 100644 index 0000000..50b1ee0 --- /dev/null +++ b/files/pb071/bonuses/10/main.c @@ -0,0 +1,23 @@ +#include +#include +#include + +#include "hangman.h" + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + printf("Usage: %s path-to-wordlist\n", argv[0]); + return 1; + } + + char secret[50]; + + srand(time(NULL)); + if (get_word(argv[1], secret) != 0) { + return 1; + } + hangman(secret); + + return 0; +} diff --git a/files/pb071/bonuses/10/tdd_lifecycle.png b/files/pb071/bonuses/10/tdd_lifecycle.png new file mode 100644 index 0000000..e3668c1 Binary files /dev/null and b/files/pb071/bonuses/10/tdd_lifecycle.png differ diff --git a/files/pb071/bonuses/10/test-bonus.py b/files/pb071/bonuses/10/test-bonus.py new file mode 100644 index 0000000..d0eff34 --- /dev/null +++ b/files/pb071/bonuses/10/test-bonus.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 + +from typing import Iterable, List, Any +import click + +import glob +import json +import os +from pathlib import Path +import subprocess +import tempfile + + +@click.group() +def cli() -> None: + pass + + +class TestCase: + def __init__(self, target: str, test_case: str, config: Any = None): + self.target = target + self.test_case = test_case + + self.test_case_config_path = f"{test_case}.json" + self._config = config + + @property + def config(self): + if not self._config: + self._config = load_config(self.test_case_config_path) + + return self._config + + def __preprocess(self, arr: List[str]) -> Iterable[str]: + return map( + lambda e: e.format(target=self.target, test_case=self.test_case), arr + ) + + def check_stdio(self) -> bool: + if not self.config.get("capture_stdout"): + return True + + process = subprocess.run( + [ + "diff", + f"{self.test_case}.out", + f"{self.test_case}.out_produced", + ], + capture_output=True, + ) + if process.returncode == 0: + return True + + click.secho( + f" [FAIL] Output differs from the expected\n\n{process.stdout.decode()}", fg="yellow" + ) + return False + + def check_specialized_test(self) -> bool: + manual_test = self.config.get("specialized_test") + if not manual_test: + return True + + process = subprocess.run(self.__preprocess(manual_test), capture_output=True) + if process.returncode == 0: + return True + + click.secho( + f" [FAIL] Specialized test failed\n\n{process.stdout.decode()}\n{process.stderr.decode()}", + fg="yellow", + ) + return False + + def check_stderr(self, stderr: tempfile.TemporaryFile) -> None: + stderr.seek(0) + if contents := stderr.read(): + click.secho( + f" [ LOG] Captured stderr\n\n{contents.decode()}\n", + fg="yellow" + ) + + def execute_test_case(self) -> bool: + stdin = None + stdout = None + stderr = tempfile.TemporaryFile() + success = True + + if self.config.get("has_stdin"): + stdin = open(f"{self.test_case}.in", "r") + + if self.config.get("capture_stdout"): + stdout = open(f"{self.test_case}.out_produced", "w") + + try: + self.process = subprocess.run( + [f"build/{self.target}", *self.__preprocess(self.config["args"])], + cwd=os.getcwd(), + stdin=stdin, + stdout=stdout, + stderr=stderr, + timeout=5, + ) + except subprocess.TimeoutExpired: + success = False + + self.check_stderr(stderr) + success = self.check_stdio() and success + success = self.check_specialized_test() and success + + stderr.close() + + return success + + +def load_config(path: str) -> Any: + path_to_config = Path(path) + if not path_to_config.exists(): + return None + + with open(path_to_config, "r") as config_file: + return json.load(config_file) + + +@cli.command() +@click.argument("target") +@click.option("--global-config/--no-global-config", default=True) +def test(target, global_config): + passed, failed = 0, 0 + + config = False + if global_config: + config = load_config(f"./{target}.json") + + test_cases = set( + map(lambda x: str(Path(x).with_suffix("")), glob.glob(f"test-{target}/*")) + ) + + for test_case in test_cases: + individual_config_exists = Path(f"{test_case}.json").exists() + if global_config == individual_config_exists: + continue + + click.secho(f"[TEST] {test_case}") + if TestCase(target, test_case, config).execute_test_case(): + click.secho("[PASS] Test passed.\n", fg="green") + passed += 1 + else: + click.secho("[FAIL] Test failed.\n", fg="red") + failed += 1 + + total = passed + failed + click.secho(f"Passed: {passed}/{total}\tFailed: {failed}/{total}") + + +if __name__ == "__main__": + cli() diff --git a/files/pb071/bonuses/10/test-hangman/.gitignore b/files/pb071/bonuses/10/test-hangman/.gitignore new file mode 100644 index 0000000..bc39a05 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/.gitignore @@ -0,0 +1 @@ +!*.words diff --git a/files/pb071/bonuses/10/test-hangman/at-once-bad.in b/files/pb071/bonuses/10/test-hangman/at-once-bad.in new file mode 100644 index 0000000..9eefaad --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/at-once-bad.in @@ -0,0 +1,2 @@ +o +word diff --git a/files/pb071/bonuses/10/test-hangman/at-once-bad.out b/files/pb071/bonuses/10/test-hangman/at-once-bad.out new file mode 100644 index 0000000..ccc82bd --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/at-once-bad.out @@ -0,0 +1,10 @@ +Welcome to the game, Hangman! +I am thinking of a word that is 4 letters long. +------------- +You have 8 guesses left. +Available letters: abcdefghijklmnopqrstuvwxyz +Please guess a letter: Good guess: _ o _ _ +------------- +You have 8 guesses left. +Available letters: abcdefghijklmnpqrstuvwxyz +Please guess a letter: Sorry, bad guess. The word was goal. diff --git a/files/pb071/bonuses/10/test-hangman/at-once-bad.words b/files/pb071/bonuses/10/test-hangman/at-once-bad.words new file mode 100644 index 0000000..5d94f47 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/at-once-bad.words @@ -0,0 +1,3 @@ +goal +goal +goal diff --git a/files/pb071/bonuses/10/test-hangman/at-once.in b/files/pb071/bonuses/10/test-hangman/at-once.in new file mode 100644 index 0000000..191c7a4 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/at-once.in @@ -0,0 +1,2 @@ +e +ball diff --git a/files/pb071/bonuses/10/test-hangman/at-once.out b/files/pb071/bonuses/10/test-hangman/at-once.out new file mode 100644 index 0000000..75e84ac --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/at-once.out @@ -0,0 +1,10 @@ +Welcome to the game, Hangman! +I am thinking of a word that is 4 letters long. +------------- +You have 8 guesses left. +Available letters: abcdefghijklmnopqrstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ _ +------------- +You have 7 guesses left. +Available letters: abcdfghijklmnopqrstuvwxyz +Please guess a letter: Congratulations, you won! diff --git a/files/pb071/bonuses/10/test-hangman/at-once.words b/files/pb071/bonuses/10/test-hangman/at-once.words new file mode 100644 index 0000000..b109d45 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/at-once.words @@ -0,0 +1,3 @@ +ball +ball +ball diff --git a/files/pb071/bonuses/10/test-hangman/basic.in b/files/pb071/bonuses/10/test-hangman/basic.in new file mode 100644 index 0000000..63dc264 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/basic.in @@ -0,0 +1,16 @@ +l +e + +d + +a + +U + +u + +s + +p + +r diff --git a/files/pb071/bonuses/10/test-hangman/basic.out b/files/pb071/bonuses/10/test-hangman/basic.out new file mode 100644 index 0000000..a070bde --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/basic.out @@ -0,0 +1,40 @@ +Welcome to the game, Hangman! +I am thinking of a word that is 7 letters long. +------------- +You have 8 guesses left. +Available letters: abcdefghijklmnopqrstuvwxyz +Please guess a letter: Good guess: _ _ _ _ l _ _ +------------- +You have 8 guesses left. +Available letters: abcdefghijkmnopqrstuvwxyz +Please guess a letter: Good guess: _ _ _ _ l e _ +------------- +You have 8 guesses left. +Available letters: abcdfghijkmnopqrstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ _ l e _ +------------- +You have 7 guesses left. +Available letters: abcfghijkmnopqrstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ _ l e _ +------------- +You have 6 guesses left. +Available letters: bcfghijkmnopqrstuvwxyz +Please guess a letter: Good guess: _ u _ _ l e _ +------------- +You have 6 guesses left. +Available letters: bcfghijkmnopqrstvwxyz +Please guess a letter: Oops! You've already guessed that letter: _ u _ _ l e _ +------------- +You have 6 guesses left. +Available letters: bcfghijkmnopqrstvwxyz +Please guess a letter: Good guess: _ u _ _ l e s +------------- +You have 6 guesses left. +Available letters: bcfghijkmnopqrtvwxyz +Please guess a letter: Good guess: p u _ p l e s +------------- +You have 6 guesses left. +Available letters: bcfghijkmnoqrtvwxyz +Please guess a letter: Good guess: p u r p l e s +------------- +Congratulations, you won! diff --git a/files/pb071/bonuses/10/test-hangman/basic.words b/files/pb071/bonuses/10/test-hangman/basic.words new file mode 100644 index 0000000..37554b5 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/basic.words @@ -0,0 +1,3 @@ +purples +purples +purples diff --git a/files/pb071/bonuses/10/test-hangman/hangman.in b/files/pb071/bonuses/10/test-hangman/hangman.in new file mode 100644 index 0000000..12abcbe --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/hangman.in @@ -0,0 +1,11 @@ +a + +e + +@ + +h + +N + +hangman diff --git a/files/pb071/bonuses/10/test-hangman/hangman.out b/files/pb071/bonuses/10/test-hangman/hangman.out new file mode 100644 index 0000000..c4f947d --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/hangman.out @@ -0,0 +1,26 @@ +Welcome to the game, Hangman! +I am thinking of a word that is 7 letters long. +------------- +You have 8 guesses left. +Available letters: abcdefghijklmnopqrstuvwxyz +Please guess a letter: Good guess: _ a _ _ _ a _ +------------- +You have 8 guesses left. +Available letters: bcdefghijklmnopqrstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ a _ _ _ a _ +------------- +You have 7 guesses left. +Available letters: bcdfghijklmnopqrstuvwxyz +Please guess a letter: Oops! '@' is not a valid letter: _ a _ _ _ a _ +------------- +You have 7 guesses left. +Available letters: bcdfghijklmnopqrstuvwxyz +Please guess a letter: Good guess: h a _ _ _ a _ +------------- +You have 7 guesses left. +Available letters: bcdfgijklmnopqrstuvwxyz +Please guess a letter: Good guess: h a n _ _ a n +------------- +You have 7 guesses left. +Available letters: bcdfgijklmopqrstuvwxyz +Please guess a letter: Congratulations, you won! diff --git a/files/pb071/bonuses/10/test-hangman/hangman.words b/files/pb071/bonuses/10/test-hangman/hangman.words new file mode 100644 index 0000000..6fc78a1 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/hangman.words @@ -0,0 +1,3 @@ +hangman +hangman +hangman diff --git a/files/pb071/bonuses/10/test-hangman/no-more-tries.in b/files/pb071/bonuses/10/test-hangman/no-more-tries.in new file mode 100644 index 0000000..7269e7b --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/no-more-tries.in @@ -0,0 +1,11 @@ +a +e +b +c +q +w +p +l +m +x +z diff --git a/files/pb071/bonuses/10/test-hangman/no-more-tries.out b/files/pb071/bonuses/10/test-hangman/no-more-tries.out new file mode 100644 index 0000000..a826d59 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/no-more-tries.out @@ -0,0 +1,40 @@ +Welcome to the game, Hangman! +I am thinking of a word that is 10 letters long. +------------- +You have 8 guesses left. +Available letters: abcdefghijklmnopqrstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ _ _ _ _ _ _ _ +------------- +You have 7 guesses left. +Available letters: bcdefghijklmnopqrstuvwxyz +Please guess a letter: Good guess: _ _ _ e _ e _ _ e _ +------------- +You have 7 guesses left. +Available letters: bcdfghijklmnopqrstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ e _ e _ _ e _ +------------- +You have 6 guesses left. +Available letters: cdfghijklmnopqrstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ e _ e _ _ e _ +------------- +You have 5 guesses left. +Available letters: dfghijklmnopqrstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ e _ e _ _ e _ +------------- +You have 4 guesses left. +Available letters: dfghijklmnoprstuvwxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ e _ e _ _ e _ +------------- +You have 3 guesses left. +Available letters: dfghijklmnoprstuvxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ e _ e _ _ e _ +------------- +You have 2 guesses left. +Available letters: dfghijklmnorstuvxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ e _ e _ _ e _ +------------- +You have 1 guesses left. +Available letters: dfghijkmnorstuvxyz +Please guess a letter: Oops! That letter is not in my word: _ _ _ e _ e _ _ e _ +------------- +Sorry, you ran out of guesses. The word was undeserved. diff --git a/files/pb071/bonuses/10/test-hangman/no-more-tries.words b/files/pb071/bonuses/10/test-hangman/no-more-tries.words new file mode 100644 index 0000000..81d0515 --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/no-more-tries.words @@ -0,0 +1,3 @@ +undeserved +undeserved +undeserved diff --git a/files/pb071/bonuses/10/test-hangman/smoke.json b/files/pb071/bonuses/10/test-hangman/smoke.json new file mode 100644 index 0000000..daf4cab --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/smoke.json @@ -0,0 +1,4 @@ +{ + "args": [], + "capture_stdout": true +} diff --git a/files/pb071/bonuses/10/test-hangman/smoke.out b/files/pb071/bonuses/10/test-hangman/smoke.out new file mode 100644 index 0000000..283dd2b --- /dev/null +++ b/files/pb071/bonuses/10/test-hangman/smoke.out @@ -0,0 +1 @@ +Usage: build/hangman path-to-wordlist diff --git a/files/pb071/bonuses/10/test_hangman.c b/files/pb071/bonuses/10/test_hangman.c new file mode 100644 index 0000000..82642e4 --- /dev/null +++ b/files/pb071/bonuses/10/test_hangman.c @@ -0,0 +1,64 @@ +#include "hangman.h" + +#include +#include + +#define CUT_MAIN +#include "cut.h" + +TEST(word_guessed) +{ + SUBTEST(example_not_guessed) + { + CHECK(!word_guessed("secret", "aeiou")); + } + + SUBTEST(example_guessed) + { + CHECK(word_guessed("hi", "aeihoul")); + } + + SUBTEST(multiple_letters) + { + CHECK(word_guessed("baba", "ba")); + } +} + +TEST(censor_word) +{ + SUBTEST(example) + { + char result[30]; + censor_word("container", "arpstxgoieyu", result); + CHECK(strcmp(result, "_o_tai_er") == 0); + } + + SUBTEST(bigger_example) + { + char result[30]; + censor_word("underserved", "arpstxgoieyu", result); + CHECK(strcmp(result, "u__erser_e_") == 0); + } +} + +TEST(get_available_letters) +{ + SUBTEST(example) + { + char result[30]; + get_available_letters("arpstxgoieyu", result); + CHECK(strcmp(result, "bcdfhjklmnqvwz") == 0); + } + + SUBTEST(all) { + char result[30]; + get_available_letters("", result); + CHECK(strcmp(result, "abcdefghijklmnopqrstuvwxyz") == 0); + } + + SUBTEST(none) { + char result[30]; + get_available_letters("abcdefghijklmnopqrstuvwxyz", result); + CHECK(strcmp(result, "") == 0); + } +} diff --git a/files/pb071/test-bonus.py b/files/pb071/test-bonus.py new file mode 100644 index 0000000..d0eff34 --- /dev/null +++ b/files/pb071/test-bonus.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 + +from typing import Iterable, List, Any +import click + +import glob +import json +import os +from pathlib import Path +import subprocess +import tempfile + + +@click.group() +def cli() -> None: + pass + + +class TestCase: + def __init__(self, target: str, test_case: str, config: Any = None): + self.target = target + self.test_case = test_case + + self.test_case_config_path = f"{test_case}.json" + self._config = config + + @property + def config(self): + if not self._config: + self._config = load_config(self.test_case_config_path) + + return self._config + + def __preprocess(self, arr: List[str]) -> Iterable[str]: + return map( + lambda e: e.format(target=self.target, test_case=self.test_case), arr + ) + + def check_stdio(self) -> bool: + if not self.config.get("capture_stdout"): + return True + + process = subprocess.run( + [ + "diff", + f"{self.test_case}.out", + f"{self.test_case}.out_produced", + ], + capture_output=True, + ) + if process.returncode == 0: + return True + + click.secho( + f" [FAIL] Output differs from the expected\n\n{process.stdout.decode()}", fg="yellow" + ) + return False + + def check_specialized_test(self) -> bool: + manual_test = self.config.get("specialized_test") + if not manual_test: + return True + + process = subprocess.run(self.__preprocess(manual_test), capture_output=True) + if process.returncode == 0: + return True + + click.secho( + f" [FAIL] Specialized test failed\n\n{process.stdout.decode()}\n{process.stderr.decode()}", + fg="yellow", + ) + return False + + def check_stderr(self, stderr: tempfile.TemporaryFile) -> None: + stderr.seek(0) + if contents := stderr.read(): + click.secho( + f" [ LOG] Captured stderr\n\n{contents.decode()}\n", + fg="yellow" + ) + + def execute_test_case(self) -> bool: + stdin = None + stdout = None + stderr = tempfile.TemporaryFile() + success = True + + if self.config.get("has_stdin"): + stdin = open(f"{self.test_case}.in", "r") + + if self.config.get("capture_stdout"): + stdout = open(f"{self.test_case}.out_produced", "w") + + try: + self.process = subprocess.run( + [f"build/{self.target}", *self.__preprocess(self.config["args"])], + cwd=os.getcwd(), + stdin=stdin, + stdout=stdout, + stderr=stderr, + timeout=5, + ) + except subprocess.TimeoutExpired: + success = False + + self.check_stderr(stderr) + success = self.check_stdio() and success + success = self.check_specialized_test() and success + + stderr.close() + + return success + + +def load_config(path: str) -> Any: + path_to_config = Path(path) + if not path_to_config.exists(): + return None + + with open(path_to_config, "r") as config_file: + return json.load(config_file) + + +@cli.command() +@click.argument("target") +@click.option("--global-config/--no-global-config", default=True) +def test(target, global_config): + passed, failed = 0, 0 + + config = False + if global_config: + config = load_config(f"./{target}.json") + + test_cases = set( + map(lambda x: str(Path(x).with_suffix("")), glob.glob(f"test-{target}/*")) + ) + + for test_case in test_cases: + individual_config_exists = Path(f"{test_case}.json").exists() + if global_config == individual_config_exists: + continue + + click.secho(f"[TEST] {test_case}") + if TestCase(target, test_case, config).execute_test_case(): + click.secho("[PASS] Test passed.\n", fg="green") + passed += 1 + else: + click.secho("[FAIL] Test failed.\n", fg="red") + failed += 1 + + total = passed + failed + click.secho(f"Passed: {passed}/{total}\tFailed: {failed}/{total}") + + +if __name__ == "__main__": + cli() diff --git a/files/pb161/environment/gitignore b/files/pb161/environment/gitignore new file mode 100644 index 0000000..460090d --- /dev/null +++ b/files/pb161/environment/gitignore @@ -0,0 +1,22 @@ +* + +!*/ + +!*.gitignore +!*.clang-format +!*.clang-tidy + +!*.txt + +!*.cpp +!*.hpp + +!.revision + +# for reviews +!.review_id +readme.txt + +!makefile +!.rules.mk +!*.sh diff --git a/fonts/CascadiaCodePL.woff2 b/fonts/CascadiaCodePL.woff2 new file mode 100644 index 0000000..a3fa12b Binary files /dev/null and b/fonts/CascadiaCodePL.woff2 differ diff --git a/fonts/CascadiaCodePLItalic.woff2 b/fonts/CascadiaCodePLItalic.woff2 new file mode 100644 index 0000000..4669cf6 Binary files /dev/null and b/fonts/CascadiaCodePLItalic.woff2 differ diff --git a/fonts/JetBrainsMono-Italic[wght].woff2 b/fonts/JetBrainsMono-Italic[wght].woff2 new file mode 100644 index 0000000..ceb9552 Binary files /dev/null and b/fonts/JetBrainsMono-Italic[wght].woff2 differ diff --git a/fonts/JetBrainsMono[wght].woff2 b/fonts/JetBrainsMono[wght].woff2 new file mode 100644 index 0000000..12a1089 Binary files /dev/null and b/fonts/JetBrainsMono[wght].woff2 differ diff --git a/ib002/algorithms-correctness/postcondition-ambiguity/index.html b/ib002/algorithms-correctness/postcondition-ambiguity/index.html new file mode 100644 index 0000000..c684fbd --- /dev/null +++ b/ib002/algorithms-correctness/postcondition-ambiguity/index.html @@ -0,0 +1,30 @@ + + + + + +Vague postconditions and proving correctness of algorithms | mf + + + + + + + + + + + + + +
+

Vague postconditions and proving correctness of algorithms

Introduction

Source code used later on.

Implementation of select sort from the exercises

To implement select sort from the exercises and make it as easy to read as possible, I have implemented maximum function that returns index of the biggest element from the first nn elements.

For the sake of time and memory complexity, I am also using itertools.islice, which makes a slice, but does not copy the elements into the memory like normal slice does.

There is also a check_loop_invariant function that will be described later.

def compare_by_value(pair):
index, value = pair
return value


def maximum(arr, n):
first_n_elements = itertools.islice(enumerate(arr), n)
index, value = max(first_n_elements, key=compare_by_value)
return index


def select_sort(arr, n):
assert n == len(arr)

check_loop_invariant(arr, n, n)
for i in reversed(range(1, n)):
j = maximum(arr, i + 1)
arr[i], arr[j] = arr[j], arr[i]

check_loop_invariant(arr, n, i)

return arr

Discussed preconditions, loop invariants and postconditions

You can safely replace A with arr or array for list.

Precondition

As a precondition we have established that A represents an array of values and nn is length of the A.

Loop invariant

As for loop invariant we have established that we require two properties:

  1. A[i + 1 : n] is sorted
  2. all elements of A[i + 1 : n] are bigger or equal to the other elements

This invariant is later defined as check_loop_invariant function. It is checked before the first iteration and after each iteration.

Postcondition

For the postcondition the first suggestion was that A must be sorted. And later we have added that A' must be a permutation of A.

However at the end of the session question arose if it is really required to state in the postcondition that A' is a permutation.

So is the permutation really required?

As I have said it is better to have postconditions explicit and do not expect anything that is not stated explicitly, e.g. name suggests it. In reality we could consider it as a smaller mistake (but it has consequences).

On the other hand explicit postconditions can be used to our advantage and also help our proof of correctness.

Consequences:

  1. Property-based testing

    If we have explicit postconditions we can use them to define properties of the output from our algorithms. That way we can use property-based testing, which does not depend on specific inputs and expected outputs, but rather on randomly generated input and checking if the output conforms to our expectations (the postconditions are fulfilled).

  2. Proof of correctness

    If we can prove that algorithm is correct even for algorithm that is not correct, we have a problem. That proof has no value and is useless.

For the sake of showcasing the power of postconditions I will introduce "select sort" that is not correct, but will comply with both the loop invariant and our vague postcondition and thus pass the tests.

Implementation of the broken select sort

To make sure this thing passes everything, but our explicit postcondition with permutation will blow it up, I have designed this "select sort" as follows:

  1. If I get empty list, there is nothing to do.
  2. I find maximum in the array.
  3. For each index from the end, I will assign maximum + index. +This will ensure that even if the maximum in the original array was the first element, I will always satisfy that 2nd part of the loop invariant.
def broken_select_sort(arr, n):
assert n == len(arr)

if not arr:
return

max_value = max(arr)

check_loop_invariant(arr, n, n)
for i in reversed(range(n)):
arr[i] = max_value + i

check_loop_invariant(arr, n, i)

return arr
tip

There is also an easier way to break this, I leave that as an exercise ;)

Property-based tests for our sorts

Since we have talked a lot about proofs at the seminar, I would like to demonstrate it on the testing of the sorts. In the following text I will cover implementation of the loop invariant and both postconditions we have talked about and then test our sorts using them.

Loop invariant

To check loop invariant I have implemented this function:

def check_loop_invariant(arr, n, i):
# A[i + 1 : n] is sorted
for x, y in zip(itertools.islice(arr, i + 1, n), itertools.islice(arr, i + 2, n)):
assert x <= y

# all elements of A[i + 1 : n] are bigger or equal to the other elements
if i + 1 >= n:
# in case there are no elements
return

# otherwise, since the "tail" is sorted, we can assume that it is enough to
# check the other elements to the smallest value of the tail
smallest = arr[i + 1]
for element in itertools.islice(arr, i + 1):
assert smallest >= element

First part checks if the "ending" of the array is sorted.

In second part I have used a dirty trick of taking just the first element that is the smallest and compared the rest of the elements to it. Why is it enough? I leave it as an exercise ;)

Postcondition(s)

I have defined both the vague and explicit postconditions:

def check_vague_postcondition(original_arr, arr):
if not arr:
return

# check ordering
for x, y in zip(arr, itertools.islice(arr, 1, len(arr))):
assert x <= y


def check_postcondition(original_arr, arr):
if not arr:
return

# check ordering
for x, y in zip(arr, itertools.islice(arr, 1, len(arr))):
assert x <= y

# get counts from original list
original_counts = {}
for value in original_arr:
original_counts[value] = 1 + original_counts.get(value, 0)

# get counts from resulting list
counts = {}
for value in arr:
counts[value] = 1 + counts.get(value, 0)

# if arr is permutation of original_arr then all counts must be the same
assert counts == original_counts

Putting it together

Now that we have everything implement, we can move on to the implementation of the tests:

from hypothesis import given, settings
from hypothesis.strategies import integers, lists
import pytest

@given(lists(integers()))
@settings(max_examples=1000)
@pytest.mark.parametrize(
"postcondition", [check_vague_postcondition, check_postcondition]
)
@pytest.mark.parametrize("sorting_function", [select_sort, broken_select_sort])
def test_select_sort(sorting_function, postcondition, numbers):
result = sorting_function(numbers[:], len(numbers))
postcondition(numbers, result)

Since it might seem a bit scary, I will disect it by parts.

  1. Parameters of test function

    def test_select_sort(sorting_function, postcondition, numbers):

    We are given 3 parameters:

    • sorting_function - as the name suggests is the sorting function we test
    • postcondition - as the name suggests is the postcondition that we check
    • numbers - is random list of numbers that we will be sorting
  2. Body of the test

    result = sorting_function(numbers[:], len(numbers))
    postcondition(numbers, result)

    We pass to the sorting function copy of the numbers we got, this ensures that once we are checking the more strict postcondition, we can gather the necessary information even after sorting the list in-situ, i.e. we can check if the result is really a permutation of the numbers even though the sorting functions has modified the passed in list.

caution

Now we get to the more complicated part and it is the decorators.

  1. 1st parametrize from the bottom

    @pytest.mark.parametrize("sorting_function", [select_sort, broken_select_sort])

    This tells pytest, that we want to pass the values from the list to the parameter sorting_function. In other words, this lets us use the same test function for both the correct and incorrect select sort.

  2. 2nd parametrize from the bottom is similar, but works with the postcondition. +The reason why they are separated is pretty simple, this way they act like cartesian product: for each sorting function we also use each postcondition.

  3. @settings raises the count of tests that hypothesis runs (from default of 100(?)).

  4. @given(lists(integers())) +This means hypothesis is randomly creating lists of integers and passing them to the function, which has only one parameter left and that is numbers.

Let's run the tests!

In case you want to experiment locally, you should install pytest and hypothesis from the PyPI.

% pytest -v test_sort.py
=================================== test session starts ====================================
platform linux -- Python 3.6.8, pytest-3.8.2, py-1.7.0, pluggy-0.13.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/xfocko/git/xfocko/ib002/postcondition-ambiguity, inifile:
plugins: hypothesis-5.16.1
collected 4 items

test_sort.py::test_select_sort[select_sort-check_vague_postcondition] PASSED [ 25%]
test_sort.py::test_select_sort[select_sort-check_postcondition] PASSED [ 50%]
test_sort.py::test_select_sort[broken_select_sort-check_vague_postcondition] PASSED [ 75%]
test_sort.py::test_select_sort[broken_select_sort-check_postcondition] FAILED [100%]

========================================= FAILURES =========================================
_________________ test_select_sort[broken_select_sort-check_postcondition] _________________

sorting_function = <function broken_select_sort at 0x7fac179308c8>
postcondition = <function check_postcondition at 0x7fac1786d1e0>

@given(lists(integers()))
> @settings(max_examples=1000)
@pytest.mark.parametrize(
"postcondition", [check_vague_postcondition, check_postcondition]
)
@pytest.mark.parametrize("sorting_function", [select_sort, broken_select_sort])
def test_select_sort(sorting_function, postcondition, numbers):

test_sort.py:132:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
test_sort.py:139: in test_select_sort
postcondition(numbers, result)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

original_arr = [0, 0], arr = [0, 1]

def check_postcondition(original_arr, arr):
if not arr:
return

# check ordering
for x, y in zip(arr, itertools.islice(arr, 1, len(arr))):
assert x <= y

# get counts from original list
original_counts = {}
for value in original_arr:
original_counts[value] = 1 + original_counts.get(value, 0)

# get counts from resulting list
counts = {}
for value in arr:
counts[value] = 1 + counts.get(value, 0)

# if arr is permutation of original_arr then all counts must be the same
> assert counts == original_counts
E assert {0: 1, 1: 1} == {0: 2}
E Differing items:
E {0: 1} != {0: 2}
E Left contains more items:
E {1: 1}
E Full diff:
E - {0: 1, 1: 1}
E + {0: 2}

test_sort.py:128: AssertionError
----------------------------------- Captured stdout call -----------------------------------
Falsifying example: test_select_sort(
sorting_function=<function test_sort.broken_select_sort>,
postcondition=<function test_sort.check_postcondition>,
numbers=[0, 0],
)
============================ 1 failed, 3 passed in 6.84 seconds ============================

We can clearly see that our broken select sort has passed the vague postcondition, but the explicit one was not satisfied.

Summary

For proving the correctness of the algorithm it is better to be explicit than prove that algorithm is correct even though it is not. Being explicit also allows you to test smaller chunks of code better.

+ + + + \ No newline at end of file diff --git a/ib002/category/algorithms-and-correctness/index.html b/ib002/category/algorithms-and-correctness/index.html new file mode 100644 index 0000000..d241172 --- /dev/null +++ b/ib002/category/algorithms-and-correctness/index.html @@ -0,0 +1,33 @@ + + + + + +Algorithms and Correctness | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/category/asymptotic-notation-and-time-complexity/index.html b/ib002/category/asymptotic-notation-and-time-complexity/index.html new file mode 100644 index 0000000..4cf76db --- /dev/null +++ b/ib002/category/asymptotic-notation-and-time-complexity/index.html @@ -0,0 +1,30 @@ + + + + + +Asymptotic Notation and Time Complexity | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/category/graphs/index.html b/ib002/category/graphs/index.html new file mode 100644 index 0000000..9b694dd --- /dev/null +++ b/ib002/category/graphs/index.html @@ -0,0 +1,32 @@ + + + + + +Graphs | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/category/recursion/index.html b/ib002/category/recursion/index.html new file mode 100644 index 0000000..8218530 --- /dev/null +++ b/ib002/category/recursion/index.html @@ -0,0 +1,32 @@ + + + + + +Recursion | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/category/red-black-trees/index.html b/ib002/category/red-black-trees/index.html new file mode 100644 index 0000000..a5e77a9 --- /dev/null +++ b/ib002/category/red-black-trees/index.html @@ -0,0 +1,32 @@ + + + + + +Red-Black Trees | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/graphs/bfs-tree/index.html b/ib002/graphs/bfs-tree/index.html new file mode 100644 index 0000000..9a699fa --- /dev/null +++ b/ib002/graphs/bfs-tree/index.html @@ -0,0 +1,31 @@ + + + + + +Distance boundaries from BFS tree on undirected graphs | mf + + + + + + + + + + + + + +
+

Distance boundaries from BFS tree on undirected graphs

Introduction

As we have talked on the seminar, if we construct from some vertex uu BFS tree on an undirected graph, we can obtain:

  • lower bound of length of the shortest path between 2 vertices from the height difference
  • upper bound of length of the shortest path between 2 vertices from the path through the root

Lower bound

Consider the following graph:

+

We run BFS from the vertex aa and obtain the following BFS tree:

+

Let's consider pair of vertices ee and hh. For them we can safely lay, from the BFS tree, following properties:

  • lower bound: 22
  • upper bound: 44

By having a look at the graph we started from, we can see that we have a path ‹e,j,he, j, h› that has a length 2. Apart from that we can also notice there is another path from ee to hh and that is ‹e,a,c,i,d,he, a, c, i, d, h›. And that path has a length of 55. Doesn't this break our statements at the beginning? (I'm leaving that as an exercise ;))

Proof by contradiction

Let's keep the same graph, but break the lower bound, i.e. I have gotten a lower bound 22, but “there must be a shorter path”! ;)

Now the more important question, is there a shorter path in that graph? The answer is no, there's no shorter path than the one with length 22. So what can we do about it? We'll add an edge to have a shorter path. Now we have gotten a lower bound of 22, which means the only shorter path we can construct has 11 edge and that is ‹e,he, h› (no intermediary vertices). Let's do this!

+

Okay, so we have a graph that breaks the rule we have laid. However, we need to run BFS to obtain the new BFS tree, since we have changed the graph.

tip

Do we need to run BFS after every change?

­I am leaving that as an exercise ;)

+

Oops, we have gotten a new BFS tree, that has a height difference of 1.

tip

Try to think about a way this can be generalized for shortening of minimal length 3 to minimal length 2 ;)

+ + + + \ No newline at end of file diff --git a/ib002/graphs/iterative-and-iterators/index.html b/ib002/graphs/iterative-and-iterators/index.html new file mode 100644 index 0000000..a94a6ed --- /dev/null +++ b/ib002/graphs/iterative-and-iterators/index.html @@ -0,0 +1,27 @@ + + + + + +Iterative algorithms via iterators | mf + + + + + + + + + + + + + +
+

Iterative algorithms via iterators

Introduction

As we have talked on the seminar, iterative approach to implementing DFS is not very intuitive and is a very easy way how to create an incorrect implementation.

On the other hand, we have seen iterative implementation in the exercises and I have also prepared two from which one was similar to recursive implementation without colors from exercises and the other one used features of high-level languages.

Different implementations

Recursive DFS implementation from exercises without colors

function VisitedDFS(u: Vertex, visited: VertexSet) return VertexSet is
v: Vertex;
begin
visited.Union(To_Set(u));

for v in u.successors loop
if not Contains(visited, v) then
visited := visitedDFS(v, Visited);
end if;
end loop;

return visited;
end VisitedDFS;

This implementation is correct, does the DFS traversal as it should, however it has one “smallish” downside and that is the time complexity. The usage of set raises the time complexity, of course it is implementation dependant. However in case of either RB-tree or hash-table implementation, we get look-up in time O(n)\mathcal{O}(n) for hash-table in worst-case or O(logn)\mathcal{O}(\log n) for the other in the worst-case. Both are not ideal compared to checking color on vertex.

Iterative DFS from the exercises

procedure IterDFS(u: Vertex) is
stack: StateVector;
i, time: Integer;
v: Vertex;
begin
stack.Append(VertexState(u, 0));
u.color := Gray;
time := 1;
u.d := time;

while not stack.Is_Empty loop
u := stack.Last_Element.Vertex;
i := stack.Last_Element.NextIndex;
stack.Delete_Last;

if i < u.successors.Length then
-- search is not finished, is pushed back to stack
stack.Append(VertexState(u, k + 1));

v := u.successors.Element(i);
if v.color = White then
stack.Append(VertexState(v, 0));
v.color := Gray;
time := time + 1;
v.d := time;
end if;
else
-- u has no other successors, we can finish the search
time := time + 1;
u.f := time;
u.color := Black;
end if;
end loop;

end IterDFS;

As we can see, there is some ordering in which we search through the successors. Time complexity is OK, stack holds at most all vertices (they must be on the current path).

My iterative with path in stack

procedure DFS(start: Vertex) is
path: VertexVector;
time: Integer;
hasSuccessor: Bool;
successor: Vertex;
begin
path.Append(start);
time := 1;

start.d := time;
start.color := Gray;

while not path.Is_Empty loop
hasSuccessor := false;

for successor in path.Last_Element.successors loop
if successor.color = White then
hasSuccessor := true;

successor.d := time + 1;
successor.color := Gray;
time := time + 1;

path.Append(successor);

exit;
end if;
end loop;

if not hasSuccessor then
path.Last_Element.f := time + 1;
path.Last_Element.color := Black;

time := time + 1;
path.Delete_Last;
end if;

end loop;
end DFS;

This approach is similar to the iterative solution from the exercises, but it does not keep the index of the next successor, therefore it always iterates through all of them, which raises the time complexity.

My iterative solution with iterators

On the other hand, we do not actually have to depend on the representation of the graph. In this case, we just somehow obtain the iterator (which yields all of the succesors) and keep it in the stack.

procedure DFS(start: Vertex) is
path: StateVector;
time: Integer;
current: State;
nextVertex: Vertex;
begin
path.Append(State(start));
time := 1;

start.d := time;
start.color := Gray;

while not path.Is_Empty loop
current := path.Last_Element;

if not Move_Next(current.successors) then
path.Delete_Last;

time := time + 1;
current.vertex.f := time;

current.vertex.color := Black;
else if current.successors.Value.color = white then
nextVertex := current.successors.Value;

time := time + 1;
nextVertex.d := time;

nextVertex.color := Gray;

path.Append(State(nextVertex));
end if;
end loop;
end DFS;

( The way we manipulate with the iterators is closest to the C# implementation. Apart from the Iterator thing :) In case you tried to implement it in C++, you would more than likely need to change the check, since you would get first successor right at the beginning )

So here we don't keep indices, but the iterators. We can also check existence of other successors easily: by the iterator moving after the last successor.

Closer explanation of the iterator shenanigans follows. In the beginning, either start or when pushing new vertex, we are pushing an iterator that points just before the first successor. When populating lastVertex and successors in the while-loop, we take the element from the top of the stack. MoveNext returns true if there is an element, i.e. successor in this case. If it returns false we have nothing to do and we pop the vertex from the stack (also set finishing time and color). If we have successor we check if it has been already visited or not. If has not, we set discovery time and color accordingly, also we add it to stack.

Implementation

In case you want to play around with the code. At the beginning there is a link to the C# implementation that can be used. It has a basic representation of graph and includes BFS/DFS implementation in classes.

In Program.cs you can also find a method that returns graph we used on the seminar.

+ + + + \ No newline at end of file diff --git a/ib002/index.html b/ib002/index.html new file mode 100644 index 0000000..2e08c88 --- /dev/null +++ b/ib002/index.html @@ -0,0 +1,28 @@ + + + + + +Introduction | mf + + + + + + + + + + + + + +
+

Introduction

In this part you can find “random” additional materials I have written over the +course of teaching Algorithms and data structures I.

It is a various mix of stuff that may have been produced as a follow-up on some +question asked at the seminar or spontanously.

If you have some ideas for posts, please do not hesitate to submit them as issues +in the linked GitLab.

+ + + + \ No newline at end of file diff --git a/ib002/rb-trees/applications/index.html b/ib002/rb-trees/applications/index.html new file mode 100644 index 0000000..b9e5a44 --- /dev/null +++ b/ib002/rb-trees/applications/index.html @@ -0,0 +1,29 @@ + + + + + +Použití červeno-černých stromů | mf + + + + + + + + + + + + + +
+

Použití červeno-černých stromů

Použití

Červeno-černé stromy jsou celkem oblíbené pro implementaci ADT množiny nebo slovníku za předpokladu, že nad vkládanými klíči existuje uspořádání. Jazyky níže implementují dané datové struktury v 2 variantách a to:

  • seřazené: používají na pozadí právě červeno-černý strom
  • neseřazené: používají na pozadí hašovací tabulku

Pro srovnání, jak jsme si říkali na cvičení, červeno-černý strom má operace hledání, vkládání a mazání v časové složitosti O(logn)\mathcal{O}(\log n). Na druhou stranu hašovací tabulka má ideálně konstantní časovou složitost, ale v nejhorším případě (detaily na posledním cvičení v semestru) je to bohužel O(n)\mathcal{O}(n).

Výše jsme si ukázali nějaké předpoklady nutné pro hašovací tabulku i červeno-černý strom. Co je tedy lepší?

  • červeno-černý strom nám poskytuje stabilní časovou složitost, ale za cenu požadavku uspořádání nad prvky
  • hašovací tabulka nám poskytuje pomyslnou perfektní časovou složitost

Různé implementace

Pro ukázku použití červeno-černých stromů v implementacích standardních knihoven +jsme vybrali několik jazyků.

Pokud Vás zajímají různé implementace, tak bychom doporučili „prohrabávat“ se přes ně v následujícím pořadí: C# → Java → C++. Důvod pro zvolené pořadí vychází z toho, že C# implementace je poměrně čitelná a obsahuje množství vysvětlujících komentářů. Implementace v Javě je stejně čitelná, ačkoli již s minimem komentářů, které se maximálně odkazují na CLRS. C++ implementace je „značně poznačená“ podtržítky ;)

C++

V C++ si můžeme vybrat mezi 2 různými implementacemi (clang nebo gcc).

clang

Hlavičkové soubory, které používáme při práci s množinou nebo slovníkem (zajímavé sekce jsou vytaženy):

  • map

    template <class _Key, class _Tp, class _Compare = less<_Key>,
    class _Allocator = allocator<pair<const _Key, _Tp> > >
    class _LIBCPP_TEMPLATE_VIS map
    {
    public:
    // types:
    typedef _Key key_type;
    typedef _Tp mapped_type;
    typedef pair<const key_type, mapped_type> value_type;

    // …

    private:
    typedef __tree<__value_type, __vc, __allocator_type> __base;
  • set

    template <class _Key, class _Compare = less<_Key>,
    class _Allocator = allocator<_Key> >
    class _LIBCPP_TEMPLATE_VIS set
    {
    public:
    // types:
    typedef _Key key_type;
    typedef key_type value_type;

    // …

    private:
    typedef __tree<value_type, value_compare, allocator_type> __base;

U obou hlaviček si můžeme všimnout, že deklarují nějaký soukromý typ __base, který je aliasem pro __tree. Ten nás pak vede k hlavičce __tree.

Výňatek:

/*

_NodePtr algorithms

The algorithms taking _NodePtr are red black tree algorithms. Those
algorithms taking a parameter named __root should assume that __root
points to a proper red black tree (unless otherwise specified).



*/

gcc

Pro gcc je postup téměř stejný. Pro změnu v hlavičkách map a set nenajdeme nic, deklarace jsou až v hlavičkových souborech:

V obou se zase odkazuje na nějakou hlavičku bits/stl_tree.h, zase výňatek:

  // Red-black tree class, designed for use in implementing STL
// associative containers (set, multiset, map, and multimap). The
// insertion and deletion algorithms are based on those in Cormen,
// Leiserson, and Rivest, Introduction to Algorithms (MIT Press,
// 1990), except that
//
// (1) the header cell is maintained with links not only to the root
// but also to the leftmost node of the tree, to enable constant
// time begin(), and to the rightmost node of the tree, to enable
// linear time performance when used with the generic set algorithms
// (set_union, etc.)
//
// (2) when a node being deleted has two children its successor node
// is relinked into its place, rather than copied, so that the only
// iterators invalidated are those referring to the deleted node.

enum _Rb_tree_color { _S_red = false, _S_black = true };

struct _Rb_tree_node_base
{
typedef _Rb_tree_node_base* _Base_ptr;
typedef const _Rb_tree_node_base* _Const_Base_ptr;

_Rb_tree_color _M_color;
_Base_ptr _M_parent;
_Base_ptr _M_left;
_Base_ptr _M_right;

static _Base_ptr
_S_minimum(_Base_ptr __x) _GLIBCXX_NOEXCEPT
{
while (__x->_M_left != 0) __x = __x->_M_left;
return __x;
}

static _Const_Base_ptr
_S_minimum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT
{
while (__x->_M_left != 0) __x = __x->_M_left;
return __x;
}

static _Base_ptr
_S_maximum(_Base_ptr __x) _GLIBCXX_NOEXCEPT
{
while (__x->_M_right != 0) __x = __x->_M_right;
return __x;
}

static _Const_Base_ptr
_S_maximum(_Const_Base_ptr __x) _GLIBCXX_NOEXCEPT
{
while (__x->_M_right != 0) __x = __x->_M_right;
return __x;
}

Tady už taky vidíme nějaký kód pro nalezení minima/maxima ve stromě. Mimo jiné +ještě existuje tree.cc, kde je lze nalézt třeba funkci s následující hlavičkou:

void
_Rb_tree_insert_and_rebalance(const bool __insert_left,
_Rb_tree_node_base* __x,
_Rb_tree_node_base* __p,
_Rb_tree_node_base& __header) throw ();

Java

V Javě jsou pro nás klíčové implementace TreeSet a TreeMap.

V implementaci TreeSet si můžete povšimnout:

public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
/**
* The backing map.
*/
private transient NavigableMap<E,Object> m;

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

TreeSet v Javě tedy používá na pozadí TreeMap (což je vidět ve výchozím konstruktoru, kde se volá konstruktor přebírající NavigableMap<E, Object>, a je mu předáno new TreeMap<>()).

Co se týče TreeMap, tak hned ze začátku definice TreeMap je vidět:

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{
/**
* The comparator used to maintain order in this tree map, or
* null if it uses the natural ordering of its keys.
*
* @serial
*/
@SuppressWarnings("serial") // Conditionally serializable
private final Comparator<? super K> comparator;

private transient Entry<K,V> root;

Takže máme „nějaký kořen“ typu Entry<K,V>. Zkusíme si najít definici daného typu…

    // Red-black mechanics

private static final boolean RED = false;
private static final boolean BLACK = true;

/**
* Node in the Tree. Doubles as a means to pass key-value pairs back to
* user (see Map.Entry).
*/

static final class Entry<K,V> implements Map.Entry<K,V> {
K key;
V value;
Entry<K,V> left;
Entry<K,V> right;
Entry<K,V> parent;
boolean color = BLACK;

A máme RB-tree.

(Implementace vychází z projektu OpenJDK.)

C#

V C# se zaměříme na nejnovější vydání (.NET), které je open-source a podporováno i na operačních systémech založených na Linuxu.

Nejdříve se podíváme na implementaci slovníku (SortedDictionary).

    public class SortedDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IDictionary, IReadOnlyDictionary<TKey, TValue> where TKey : notnull
{
[NonSerialized]
private KeyCollection? _keys;
[NonSerialized]
private ValueCollection? _values;

private readonly TreeSet<KeyValuePair<TKey, TValue>> _set; // Do not rename (binary serialization)

Na první pohled máme problém, protože TreeSet není SortedSet, který by jsme čekali. Když se přesuneme na konec souboru, tak zjistíme, že TreeSet je jenom backward-compatible wrapper pro SortedSet.

Přesuneme se k SortedSet. A hned ze začátku vidíme:

    // A binary search tree is a red-black tree if it satisfies the following red-black properties:
// 1. Every node is either red or black
// 2. Every leaf (nil node) is black
// 3. If a node is red, the both its children are black
// 4. Every simple path from a node to a descendant leaf contains the same number of black nodes
//
// The basic idea of a red-black tree is to represent 2-3-4 trees as standard BSTs but to add one extra bit of information
// per node to encode 3-nodes and 4-nodes.
// 4-nodes will be represented as: B
// R R
//
// 3 -node will be represented as: B or B
// R B B R
//
// For a detailed description of the algorithm, take a look at "Algorithms" by Robert Sedgewick.

internal enum NodeColor : byte
{
Black,
Red
}

internal delegate bool TreeWalkPredicate<T>(SortedSet<T>.Node node);

internal enum TreeRotation : byte
{
Left,
LeftRight,
Right,
RightLeft
}

Vysvětlení v komentáři trochu předbíhá náplň cvičení zaměřeného na B-stromy ;)

Vztah mezi množinou a mapou

Při každé implementaci ve standardní knihovně jsme si mohli všimnout, že strom implementuje vždy jenom jeden typ:

JazykZpůsob implementace
C++mapa ukládá dvojice do množiny
Javamnožina ukládá prvky s „dummy“ hodnotou do mapy
C#mapa ukládá dvojice do množiny

Mapa vyžaduje, aby každý klíč měl přiřazenou právě jednu hodnotu, tedy klíče jsou navzájem mezi sebou unikátní. To nám umožňuje organizovat klíče do množiny, zde ale narazíme na nepříjemný problém spočívající v tom, že musíme do množiny vkladat dvojice prvků: (key, value). Tenhle přístup má ale zásadní problém:

# let's represent dictionary/map as a set
set_of_values = set()

# let's insert few pairs
set_of_values.add((1, 2))
set_of_values.add((0, 42))

# let's set key 1 to value 6
set_of_values.add((1, 6))

set_of_values

A dostaneme:

{(1, 6), (1, 2), (0, 42)}

V jednotlivých implementacích, které jste mohli vidět výše, se využívá nasledující, když:

  • mapa ukládá dvojice do množiny: Dvojice je obalená v samostatním typu, který porovnává jenom klíče
  • množina ukládá klíče do mapy: V mapě se ignorují hodnoty přiřazené klíčům
+ + + + \ No newline at end of file diff --git a/ib002/rb-trees/rules/index.html b/ib002/rb-trees/rules/index.html new file mode 100644 index 0000000..9278760 --- /dev/null +++ b/ib002/rb-trees/rules/index.html @@ -0,0 +1,107 @@ + + + + + +On the rules of the red-black tree | mf + + + + + + + + + + + + + +
+

On the rules of the red-black tree

Introduction

Have you ever thought about the red-black tree rules in more depth? Why are they +formulated the way they are? How come they keep the tree balanced? Let's go through +each of the red-black tree rules and try to change, break and contemplate about +them.

We expect that you are familiar with the following set of the rules1:

  1. Every node is either red or black.
  2. The root is black.
  3. Every leaf (nil) is black.
  4. If a node is red, then both its children are black.
  5. For each node, all simple paths from the node to descendant leaves contain the +same number of black nodes.

Each section will go into reasonable details of each rule.

1ª Every node is either red or black.

OK… This one is very simple. It is just a definition and is used in all other +rules. Not much to talk about here. Or is there?

Do I really need the nodes to be explicitly colored?

The answer is no. Balancing of the red-black trees is “enforced” by the 4th and +5th rule in the enumeration above. There are many ways you can avoid using colors.

Black height

We mentioned the 4th and 5th rule and that it enforces the balancing. What does +it mean for us?

Well, we definitely do not have to use the colors, which even as a boolean flag +would take at least 1 byte of space (and usually even more), cause… well, it is +easier for the CPU to work with words rather than single bits.

We could use the black height, couldn't we? It would mean more memory used, cause +it should be ideally big and unsigned. Can we tell the color of a node from the +black height? Of course we can, if my child has the same black height as I do, +it means that there was no black node added on the path between us and therefore +my child would be colored red.

Example of a red-black tree that keeps count of black nodes on paths to the +leaves follows:

Red-black tree with black height +Red-black tree with black height

We mark the black heights in superscript. You can see that all leaves have the +black height equal to 11. Let's take a look at some of the interesting cases:

  • If we take a look at the node with key=9\text{key} = 9, we can see that it is +coloured red and its black height is 1, because it is a leaf.

    Let's look at its parent (node with key=8\text{key} = 8). On its left side it has +nil and on its right side the 99. And its black height is still 11, cause +except for the nil leaves, there are no other black nodes.

    We can clearly see that if a node has the same black height as its parent, it +is a red node.

  • Now let's take a look at the root with key=3\text{key} = 3. It has a black height +of 3. Both of its children are black nodes and have black height of 2.

    We can see that if a node has its height 1 lower than its parent, it is a black +node.

    The reasoning behind it is rather simple, we count the black nodes all the way +to the leaves, therefore if my parent has a higher black height, it means that +on the path from me to my parent there is a black node, but the only node added +is me, therefore I must be black.

Isomorphic trees

One of the other ways to avoid using color is storing the red-black tree in some +isomorphic tree. The structure of 2-3-4 tree allows us to avoid using the color +completely. This is a bit different approach, cause we would be basically using +different tree, so we keep this note in just as a “hack”.

2ª The root is black.

This rule might seem like a very important one, but overall is not. You can safely +omit this rule, but you also need to deal with the consequences.

Let's refresh our memory with the algorithm of insert fixup:

WHILE z.p.color == Red
IF z.p == z.p.p.left
y = z.p.p.right

IF y.color == Red
z.p.color = Black
y.color = Black
z.p.p.color = Red
z = z.p.p
ELSE
IF z == z.p.right
z = z.p
Left-Rotate(T, z)
z.p.color = Black
z.p.p.color = Red
Right-Rotate(T, z.p.p)
ELSE (same as above with “right” and “left” exchanged)

T.root.color = Black
tip

If you have tried to implement any of the more complex data structures, such as +red-black trees, etc., in a statically typed language that also checks you for +NULL-correctness (e.g. mypy or even C# with nullable reference types), you +might have run into numerous issues in the cases where you are 100% sure that you +cannot obtain NULL because of the invariants, but the static type checking +doesn't know that.

The issue we hit with the insert fixup is very similar.

You might not realize the issue at the first sight, but the algorithm described +with the pseudocode above expects that the root of the red-black tree is black by +both relying on the invariant in the algorithm and afterwards by enforcing the +black root property.

If we decide to omit this condition, we need to address it in the pseudocodes +accordingly.

Usual algorithm with black rootAllowing red root
1ª insertion1ª insertion1ª insertion1ª insertion
2ª insertion2ª insertion2ª insertion2ª insertion
3ª insertion3ª insertion3ª insertion3ª insertion
4ª insertion4ª insertion4ª insertion4ª insertion
5ª insertion5ª insertion5ª insertion5ª insertion
6ª insertion6ª insertion6ª insertion6ª insertion
7ª insertion7ª insertion7ª insertion7ª insertion
8ª insertion8ª insertion8ª insertion8ª insertion
9ª insertion9ª insertion9ª insertion9ª insertion

3ª Every leaf (nil) is black.

Now, this rule is a funny one. What does this imply and can I interpret this in +some other way? Let's go through some of the possible ways I can look at this and +how would they affect the other rules and balancing.

We will experiment with the following tree: + +

We should start by counting the black nodes from root to the nil leaves based +on the rules. We have multiple similar paths, so we will pick only the interesting +ones.

  1. What happens if we do not count the nil leaves?
  2. What happens if we consider leaves the nodes with no descendants, i.e. both +of node's children are nil?
  3. What happens if we do not count the nil leaves, but consider nodes with at +least one nil descendant as leaves?
pathblack nodes1ª idea2ª idea3ª idea
3 → 1 → 0 → nil4343
3 → 5 → 7 → 8 → nil43-3
3 → 5 → 7 → 8 → 9 → nil4343

First idea is very easy to execute and it is also very easy to argue about its +correctness. It is correct, because we just subtract one from each of the paths. +This affects all paths and therefore results in global decrease by one.

Second idea is a bit more complicated. We count the nils, so the count is 44 +as it should be. However, there is one difference. Second path no longer satisfies +the condition of a leaf. Technically it relaxes the 5th rule, because we leave +out some of the nodes. We should probably avoid that.

caution

With the second idea, you may also feel that we are “bending” the rules a bit, +especially the definition of the “leaf” nodes.

Given the definition of the red-black tree, where nil is considered to be an +external node, we have decided that bending it a bit just to stir a thought about +it won't hurt anybody. 😉

4ª If a node is red, then both its children are black.

This rule might seem rather silly on the first look, but there are 2 important +functions:

  1. it allows the algorithms to “notice” that something went wrong (i.e. the +tree needs to be rebalanced), and
  2. it holds the balancing and height of the tree “in check” (with the help of +the 5th rule).

When we have a look at the algorithms that are used for fixing up the red-black +tree after an insertion or deletion, we will notice that all the algorithms need +is the color of the node.

How come it is the only thing that we need? +How come such naïve thing can be enough?

Let's say we perform an insertion into the tree… We go with the usual and pretty +primitive insertion into the binary-search tree and then, if needed, we “fix up” +broken invariants. How can that be enough? With each insertion and deletion we +maintain the invariants, therefore if we break them with one operation, there's +only one path on which the invariants were felled. If we know that rest of the +tree is correct, it allows us to fix the issues just by propagating it to the +root and abusing the siblings (which are, of course, correct red-black +subtrees) to fix or at least partially mitigate the issues and propagate them +further.

Let's assume that we do not enforce this rule, you can see how it breaks the +balancing of the tree below.

+

We can create a big subtree with only red nodes and even when keeping +the rest of the rules maintained, it will break the time complexity. It stops us +from “hacking” the black height requirement laid by the 5th rule.

5ª For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.

As it was mentioned, with the 4th rule they hold the balancing of the red-black +tree.

tip

An important observation here is the fact that the red-black tree is a +height-balanced tree.

Enforcing this rule (together with the 4th rule) keeps the tree balanced:

  1. 4th rule makes sure we can't “hack” this requirement.
  2. This rule ensures that we have “similar”2 length to each of the leaves.
AVL tree

You might have heard about an AVL tree before. It is the first self-balanced +tree to be ever introduced and works in a very similar nature as the red-black +tree, the only difference is that it does not deal with the black height, but +the height in general.

If you were to compare AVL with the red-black tree, you can say that AVL is much +more strict while red-black tree can still maintain the same asymptotic time +complexity for the operations, but having more relaxed rules.


  1. CORMEN, Thomas. Introduction to algorithms. Cambridge, Mass: MIT Press, 2009. isbn 9780262033848.
  2. red nodes still exist
+ + + + \ No newline at end of file diff --git a/ib002/recursion/karel-1/index.html b/ib002/recursion/karel-1/index.html new file mode 100644 index 0000000..52b47b6 --- /dev/null +++ b/ib002/recursion/karel-1/index.html @@ -0,0 +1,52 @@ + + + + + +Recursion and backtracking with Robot Karel | mf + + + + + + + + + + + + + +
+

Recursion and backtracking with Robot Karel

Introduction

In this exercise we will be working with a Robot Karel and with a »very« limited +resources. The point of this exercise is to show how powerful recursion and +backtracking can be even without anything else at your hand.

Your environment and problem description

Environment

You are given a robot that is present in a maze and is looking for an exit. Maze +consists of different walls and exit is marked with a single so-called “beeper”.

Walking into a wall results in a permanent damage of the robot.

Interface

You can control the robot using the following interface:

  • actions ​­— you can use them to change the current state of the robot and its +surroundings
    • robot.step() — moves robot one step further
    • robot.turn_left() — turns robot 90-degrees counter-clockwise
      • notice that you are not given turn_right or turn_around, but feel free +to implement them yourself
    • robot.pick_beeper() and opposite operation robot.put_beeper() — that +allows you to either pick or put “beeper” from or onto the current position
  • queries — you can use them to check the current state of the robot and its +surroundings
    • robot.beepers_present() — to check if there are any beepers at the robot's +current location
    • robot.left_is_clear() — to check if you can step to the left
      • analogically for front and right
caution

Helper functions / procedures are allowed. Return values are allowed.

Variables are prohibited!

Problem

Your task is to decide whether there is an exit from the maze or not. You can see +an example of a maze here:

Image of the maze

Simple problem to get familiar with the robot

If you feel completely lost after the previous description, let me start you off +with a simpler problem.

You are standing in front of the stairs, your task is to walk up the stairs.

You can see an example of such map here:

Image of the stairs

Brainstorm the idea

As a first step write down any ideas and things that you have noticed or came to +your mind. Ideally:

  • Write down a nested list of the problems, e.g.

    Example

    Problem: I want to find out whether the display on smartphone should rotate.

    • Check if display has been rotated
      • Read data from some sensor
        • From what sensor
      • In what format are the data I have read?
      • How do I communicate with the sensor?
      • What is the meaning of the data that I got?
      • How can I process it?
  • Write down list of problems that can happen, e.g.

    Example continued

    Following the same problem.

    • What if the sensor doesn't work?
    • What if the data doesn't conform to the specification?
    • What if my formulas are wrong?
  • Write down anything you consider important to solving the problem, e.g.

    Example continued once again
    • I could probably use gyroscope.
    • I should probably look up the datasheet for that module.
    • I could write some tests to verify that my computations are correct.

»Rough« pseudocode

As a next step write a mock up of a pseudocode solving the problem, you are +allowed to use comments as placeholders for bigger chunks of code.

Those comments are also a very good hints for decomposition and short, but +descriptive, commnets (if they are short enough and you decide not to factor them +out to separate functions).

tip

The smaller the function is, the easier it is to test it and argue about its +correctness.

»Proper« pseudocode

If you are satisfied with the »rough« pseudocode, it's time to convert it into +a proper one. Get rid of the uncertain pieces of functionality and replace them +with proper pseudocode, i.e. list of the things that should happen in its place.

Library

If you got here, and you actually wrote down the pseudocode, you can try your +solution after downloading the sources linked at the beginning. If you download +the ZIP-file, you can there:

  • generate_mazes.py - that was used to generate the same maze with beepers in +different locations

  • karel_tk.py - library which can run Karel given the his world

    • documentation can be found here
    • also requires Tk Python library to be installed (it should be included in +majority of Python installations)
  • *.kw - which represent multiple worlds for Karel I have prepared

  • skeleton.py - skeleton for your solution, needs to be put in the same directory +as karel_tk.py and takes path to the world as a first argument, example usage:

    $ python3 skeleton.py stairs.kw
    • of course, this file can be renamed ;)

Solution

Solution to this problem will be released as a second part, so that you can try +it out by yourself without any influence of “example solution”.

If you want to get any feedback, feel free to mail me your solution (including +all the steps that lead to your final solution, if you wish to get feedback on +those too).

+ + + + \ No newline at end of file diff --git a/ib002/recursion/pyramid-slide-down/index.html b/ib002/recursion/pyramid-slide-down/index.html new file mode 100644 index 0000000..dd41563 --- /dev/null +++ b/ib002/recursion/pyramid-slide-down/index.html @@ -0,0 +1,142 @@ + + + + + +Introduction to dynamic programming | mf + + + + + + + + + + + + + +
+

Introduction to dynamic programming

In this post we will try to solve one problem in different ways.

Problem

The problem we are going to solve is one of CodeWars katas and is called +Pyramid Slide Down.

We are given a 2D array of integers and we are to find the slide down. +Slide down is a maximum sum of consecutive numbers from the top to the bottom.

Let's have a look at few examples. Consider the following pyramid:

   3
7 4
2 4 6
8 5 9 3

This pyramid has following slide down:

   *3
*7 4
2 *4 6
8 5 *9 3

And its value is 23.

We can also have a look at a bigger example:

                75
95 64
17 47 82
18 35 87 10
20 4 82 47 65
19 1 23 3 34
88 2 77 73 7 63 67
99 65 4 28 6 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 4 68 89 53 67 30 73 16 69 87 40 31
4 62 98 27 23 9 70 98 73 93 38 53 60 4 23

Slide down in this case is equal to 1074.

Solving the problem

caution

I will describe the following ways you can approach this problem and implement +them in Java1.

For all of the following solutions I will be using basic main function that +will output true/false based on the expected output of our algorithm. Any +other differences will lie only in the solutions of the problem. You can see the +main here:

public static void main(String[] args) {
System.out.print("Test #1: ");
System.out.println(longestSlideDown(new int[][] {
{ 3 },
{ 7, 4 },
{ 2, 4, 6 },
{ 8, 5, 9, 3 }
}) == 23 ? "passed" : "failed");

System.out.print("Test #2: ");
System.out.println(longestSlideDown(new int[][] {
{ 75 },
{ 95, 64 },
{ 17, 47, 82 },
{ 18, 35, 87, 10 },
{ 20, 4, 82, 47, 65 },
{ 19, 1, 23, 75, 3, 34 },
{ 88, 2, 77, 73, 7, 63, 67 },
{ 99, 65, 4, 28, 6, 16, 70, 92 },
{ 41, 41, 26, 56, 83, 40, 80, 70, 33 },
{ 41, 48, 72, 33, 47, 32, 37, 16, 94, 29 },
{ 53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14 },
{ 70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57 },
{ 91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48 },
{ 63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31 },
{ 4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23 },
}) == 1074 ? "passed" : "failed");
}

Naïve solution

Our naïve solution consists of trying out all the possible slides and finding +the one with maximum sum.

public static int longestSlideDown(int[][] pyramid, int row, int col) {
if (row >= pyramid.length || col < 0 || col >= pyramid[row].length) {
// BASE: We have gotten out of bounds, there's no reasonable value to
// return, so we just return the ‹MIN_VALUE› to ensure that it cannot
// be maximum.
return Integer.MIN_VALUE;
}

if (row == pyramid.length - 1) {
// BASE: Bottom of the pyramid, we just return the value, there's
// nowhere to slide anymore.
return pyramid[row][col];
}

// Otherwise we account for the current position and return maximum of the
// available “slides”.
return pyramid[row][col] + Math.max(
longestSlideDown(pyramid, row + 1, col),
longestSlideDown(pyramid, row + 1, col + 1));
}

public static int longestSlideDown(int[][] pyramid) {
// We start the slide in the top cell of the pyramid.
return longestSlideDown(pyramid, 0, 0);
}

As you can see, we have 2 overloads:

int longestSlideDown(int[][] pyramid);
int longestSlideDown(int[][] pyramid, int row, int col);

First one is used as a public interface to the solution, you just pass in the +pyramid itself. Second one is the recursive “algorithm” that finds the slide +down.

It is a relatively simple solution… There's nothing to do at the bottom of the +pyramid, so we just return the value in the cell. Otherwise we add it and try +to slide down the available cells below the current row.

Time complexity

If you get the source code and run it yourself, it runs rather fine… I hope you +are wondering about the time complexity of the proposed solution and, since it +really is a naïve solution, the time complexity is pretty bad. Let's find the +worst case scenario.

Let's start with the first overload:

public static int longestSlideDown(int[][] pyramid) {
return longestSlideDown(pyramid, 0, 0);
}

There's not much to do here, so we can safely say that the time complexity of +this function is bounded by T(n)T(n), where TT is our second overload. This +doesn't tell us anything, so let's move on to the second overload where we are +going to define the T(n)T(n) function.

public static int longestSlideDown(int[][] pyramid, int row, int col) {
if (row >= pyramid.length || col < 0 || col >= pyramid[row].length) {
// BASE: We have gotten out of bounds, there's no reasonable value to
// return, so we just return the ‹MIN_VALUE› to ensure that it cannot
// be maximum.
return Integer.MIN_VALUE;
}

if (row == pyramid.length - 1) {
// BASE: Bottom of the pyramid, we just return the value, there's
// nowhere to slide anymore.
return pyramid[row][col];
}

// Otherwise we account for the current position and return maximum of the
// available “slides”.
return pyramid[row][col] + Math.max(
longestSlideDown(pyramid, row + 1, col),
longestSlideDown(pyramid, row + 1, col + 1));
}

Fun fact is that the whole “algorithm” consists of just 2 return statements +and nothing else. Let's dissect them!

First return statement is the base case, so it has a constant time complexity.

Second one a bit tricky. We add two numbers together, which we'll consider as +constant, but for the right part of the expression we take maximum from the left +and right paths. OK… So what happens? We evaluate the longestSlideDown while +choosing the under and right both. They are separate computations though, so we +are branching from each call of longestSlideDown, unless it's a base case.

What does that mean for us then? We basically get

T(y)={1, if y=rows1+2T(y+1), otherwiseT(y) = \begin{cases} 1 & \text{, if } y = rows \\ 1 + 2 \cdot T(y + 1) & \text{, otherwise} \end{cases}

That looks rather easy to compute, isn't it? If you sum it up, you'll get:

T(rows)O(2rows)T(rows) \in \mathcal{O}(2^{rows})

If you wonder why, I'll try to describe it intuitively:

  1. In each call to longestSlideDown we do some work in constant time, +regardless of being in the base case. Those are the 1s in both cases.
  2. If we are not in the base case, we move one row down twice. That's how we +obtained 2 * and y + 1 in the otherwise case.
  3. We move row-by-row, so we move down y-times and each call splits to two +subtrees.
  4. Overall, if we were to represent the calls as a tree, we would get a full +binary tree of height y, in each node we do some work in constant time, +therefore we can just sum the ones.
danger

It would've been more complicated to get an exact result. In the equation above +we are assuming that the width of the pyramid is bound by the height.

Hopefully we can agree that this is not the best we can do. 😉

Greedy solution

We will try to optimize it a bit. Let's start with a relatively simple greedy +approach.

Greedy algorithms

Greedy algorithms can be described as algorithms that decide the action on the +optimal option at the moment.

We can try to adjust the naïve solution. The most problematic part are the +recursive calls. Let's apply the greedy approach there:

public static int longestSlideDown(int[][] pyramid, int row, int col) {
if (row == pyramid.length - 1) {
// BASE: We're at the bottom
return pyramid[row][col];
}

if (col + 1 >= pyramid[row + 1].length
|| pyramid[row + 1][col] > pyramid[row + 1][col + 1]) {
// If we cannot go right or it's not feasible, we continue to the left.
return pyramid[row][col] + longestSlideDown(pyramid, row + 1, col);
}

// Otherwise we just move to the right.
return pyramid[row][col] + longestSlideDown(pyramid, row + 1, col + 1);
}

OK, if we cannot go right or the right path adds smaller value to the sum, +we simply go left.

Time complexity

We have switched from adding the maximum to following the “bigger” path, so +we improved the time complexity tremendously. We just go down the pyramid all +the way to the bottom. Therefore we are getting:

O(rows)\mathcal{O}(rows)

We have managed to convert our exponential solution into a linear one.

Running the tests

However, if we run the tests, we notice that the second test failed:

Test #1: passed
Test #2: failed

What's going on? Well, we have improved the time complexity, but greedy +algorithms are not the ideal solution to all problems. In this case there +may be a solution that is bigger than the one found using the greedy algorithm.

Imagine the following pyramid:

      1
2 3
5 6 7
8 9 10 11
99 13 14 15 16

We start at the top:

  1. Current cell: 1, we can choose from 2 and 3, 3 looks better, so we +choose it.
  2. Current cell: 3, we can choose from 6 and 7, 7 looks better, so we +choose it.
  3. Current cell: 7, we can choose from 10 and 11, 11 looks better, so we +choose it.
  4. Current cell: 11, we can choose from 15 and 16, 16 looks better, so +we choose it.

Our final sum is: 1 + 3 + 7 + 11 + 16 = 38, but in the bottom left cell we +have a 99 that is bigger than our whole sum.

tip

Dijkstra's algorithm is a greedy algorithm too, try to think why it is correct.

Top-down DP

Top-down dynamic programming is probably the most common approach, since (at +least looks like) is the easiest to implement. The whole point is avoiding the +unnecessary computations that we have already done.

In our case, we can use our naïve solution and put a cache on top of it that +will make sure, we don't do unnecessary calculations.

// This “structure” is required, since I have decided to use ‹TreeMap› which
// requires the ordering on the keys. It represents one position in the pyramid.
record Position(int row, int col) implements Comparable<Position> {
public int compareTo(Position r) {
if (row != r.row) {
return Integer.valueOf(row).compareTo(r.row);
}

if (col != r.col) {
return Integer.valueOf(col).compareTo(r.col);
}

return 0;
}
}

public static int longestSlideDown(
int[][] pyramid,
TreeMap<Position, Integer> cache,
Position position) {
int row = position.row;
int col = position.col;

if (row >= pyramid.length || col < 0 || col >= pyramid[row].length) {
// BASE: out of bounds
return Integer.MIN_VALUE;
}

if (row == pyramid.length - 1) {
// BASE: bottom of the pyramid
return pyramid[position.row][position.col];
}

if (!cache.containsKey(position)) {
// We haven't computed the position yet, so we run the same “formula” as
// in the naïve version »and« we put calculated slide into the cache.
// Next time we want the slide down from given position, it will be just
// retrieved from the cache.
int slideDown = Math.max(
longestSlideDown(pyramid, cache, new Position(row + 1, col)),
longestSlideDown(pyramid, cache, new Position(row + 1, col + 1)));
cache.put(position, pyramid[row][col] + slideDown);
}

return cache.get(position);
}

public static int longestSlideDown(int[][] pyramid) {
// At the beginning we need to create a cache and share it across the calls.
TreeMap<Position, Integer> cache = new TreeMap<>();
return longestSlideDown(pyramid, cache, new Position(0, 0));
}

You have probably noticed that record Position have appeared. Since we are +caching the already computed values, we need a “reasonable” key. In this case we +share the cache only for one run (i.e. pyramid) of the longestSlideDown, so +we can cache just with the indices within the pyramid, i.e. the Position.

Record

Record is relatively new addition to the Java language. It is basically an +immutable structure with implicitly defined .equals(), .hashCode(), +.toString() and getters for the attributes.

Because of the choice of TreeMap, we had to additionally define the ordering +on it.

In the longestSlideDown you can notice that the computation which used to be +at the end of the naïve version above, is now wrapped in an if statement that +checks for the presence of the position in the cache and computes the slide down +just when it's needed.

Time complexity

If you think that evaluating time complexity for this approach is a bit more +tricky, you are right. Keeping the cache in mind, it is not the easiest thing +to do. However there are some observations that might help us figure this out:

  1. Slide down from each position is calculated only once.
  2. Once calculated, we use the result from the cache.

Knowing this, we still cannot, at least easily, describe the time complexity of +finding the best slide down from a specific position, but we can bound it +from above for the whole run from the top. Now the question is how we can do +that!

Overall we are doing the same things for almost2 all of the positions within +the pyramid:

  1. We calculate and store it (using the partial results stored in cache). This +is done only once.

    For each calculation we take 2 values from the cache and insert one value. +Because we have chosen TreeMap, these 3 operations have logarithmic time +complexity and therefore this step is equivalent to 3log2n3 \cdot \log_2{n}.

    However for the sake of simplicity, we are going to account only for the +insertion, the reason is rather simple, if we include the 2 retrievals here, +it will be interleaved with the next step, therefore it is easier to keep the +retrievals in the following point.

    caution

    You might have noticed it's still not that easy, cause we're not having full +cache right from the beginning, but the sum of those logarithms cannot be +expressed in a nice way, so taking the upper bound, i.e. expecting the cache +to be full at all times, is the best option for nice and readable complexity +of the whole approach.

    Our final upper bound of this work is therefore log2n\log_2{n}.

  2. We retrieve it from the cache. Same as in first point, but only twice, so we +get 2log2n2 \cdot \log_2{n}.

    caution

    It's done twice because of the .containsKey() in the if condition.

Okay, we have evaluated work done for each of the cells in the pyramid and now +we need to put it together.

Let's split the time complexity of our solution into two operands:

O(r+s)\mathcal{O}(r + s)

rr will represent the actual calculation of the cells and ss will represent +the additional retrievals on top of the calculation.

We calculate the values only once, therefore we can safely agree on:

r=nlogn\begin{align*} r &= n \cdot \log{n} \\ \end{align*}

What about the ss though? Key observation here is the fact that we have 2 +lookups on the tree in each of them and we do it twice, cause each cell has +at most 2 parents:

s=n2(2logn)s=4nlogn\begin{align*} s &= n \cdot 2 \cdot \left( 2 \cdot \log{n} \right) \\ s &= 4 \cdot n \cdot \log{n} \end{align*}
tip

You might've noticed that lookups actually take more time than the construction +of the results. This is not entirely true, since we have included the +.containsKey() and .get() from the return statement in the second part.

If we were to represent this more precisely, we could've gone with:

r=3nlogns=2nlogn\begin{align*} r &= 3 \cdot n \cdot \log{n} \\ s &= 2 \cdot n \cdot \log{n} \end{align*}

On the other hand we are summing both numbers together, therefore in the end it +doesn't really matter.

(Feel free to compare the sums of both “splits”.)

And so our final time complexity for the whole top-down dynamic programming +approach is:

O(r+s)O(nlogn+4nlogn)O(5nlogn)O(nlogn)\mathcal{O}(r + s) \\ \mathcal{O}(n \cdot \log{n} + 4 \cdot n \cdot \log{n}) \\ \mathcal{O}(5 \cdot n \cdot \log{n}) \\ \mathcal{O}(n \cdot \log{n})

As you can see, this is worse than our greedy solution that was incorrect, but +it's better than the naïve one.

Memory complexity

With this approach we need to talk about the memory complexity too, because we +have introduced cache. If you think that the memory complexity is linear to the +input, you are right. We start at the top and try to find each and every slide +down. At the end we get the final result for new Position(0, 0), so we need to +compute everything below.

That's how we obtain:

O(n)\mathcal{O}(n)

nn represents the total amount of cells in the pyramid, i.e.

y=0pyramid.length1pyramid[y].length\sum_{y=0}^{\mathtt{pyramid.length} - 1} \mathtt{pyramid}\left[y\right]\mathtt{.length}
caution

If you're wondering whether it's correct because of the second if in our +function, your guess is right. However we are expressing the complexity in the +Bachmann-Landau notation, so we care about the upper bound, not the exact +number.

Can this be optimized?

Yes, it can! Try to think about a way, how can you minimize the memory +complexity of this approach. I'll give you a hint:

O(rows)\mathcal{O}(rows)

Bottom-up DP

If you try to think in depth about the top-down DP solution, you might notice +that the core of it stands on caching the calculations that have been already +done on the lower “levels” of the pyramid. Our bottom-up implementation will be +using this fact!

tip

As I have said in the top-down DP section, it is the easiest way to implement +DP (unless the cached function has complicated parameters, in that case it might +get messy).

Bottom-up dynamic programming can be more effective, but may be more complicated +to implement right from the beginning.

Let's see how we can implement it:

public static int longestSlideDown(int[][] pyramid) {
// In the beginning we declare new array. At this point it is easier to just
// work with the one dimension, i.e. just allocating the space for the rows.
int[][] slideDowns = new int[pyramid.length][];

// Bottom row gets just copied, there's nothing else to do… It's the base
// case.
slideDowns[pyramid.length - 1] = Arrays.copyOf(pyramid[pyramid.length - 1],
pyramid[pyramid.length - 1].length);

// Then we need to propagate the found slide downs for each of the levels
// above.
for (int y = pyramid.length - 2; y >= 0; --y) {
// We start by copying the values lying in the row we're processing.
// They get included in the final sum and we need to allocate the space
// for the precalculated slide downs anyways.
int[] row = Arrays.copyOf(pyramid[y], pyramid[y].length);

// At this we just need to “fetch” the partial results from “neighbours”
for (int x = 0; x < row.length; ++x) {
// We look under our position, since we expect the rows to get
// shorter, we can safely assume such position exists.
int under = slideDowns[y + 1][x];

// Then we have a look to the right, such position doesn't have to
// exist, e.g. on the right edge, so we validate the index, and if
// it doesn't exist, we just assign minimum of the ‹int› which makes
// sure that it doesn't get picked in the ‹Math.max()› call.
int toRight = x + 1 < slideDowns[y + 1].length
? slideDowns[y + 1][x + 1]
: Integer.MIN_VALUE;

// Finally we add the best choice at this point.
row[x] += Math.max(under, toRight);
}

// And save the row we've just calculated partial results for to the
// “table”.
slideDowns[y] = row;
}

// At the end we can find our seeked slide down at the top cell.
return slideDowns[0][0];
}

I've tried to explain the code as much as possible within the comments, since it +might be more beneficial to see right next to the “offending” lines.

As you can see, in this approach we go from the other side3, the bottom of +the pyramid and propagate the partial results up.

How is this different from the greedy solution???

If you try to compare them, you might find a very noticable difference. The +greedy approach is going from the top to the bottom without any knowledge of +what's going on below. On the other hand, bottom-up DP is going from the bottom +(DUH…) and propagates the partial results to the top. The propagation is +what makes sure that at the top I don't choose the best local choice, but +the best overall result I can achieve.

Time complexity

Time complexity of this solution is rather simple. We allocate an array for the +rows and then for each row, we copy it and adjust the partial results. Doing +this we get:

O(rows+2n)\mathcal{O}(rows + 2n)

Of course, this is an upper bound, since we iterate through the bottom row only +once.

Memory complexity

We're allocating an array for the pyramid again for our partial results, so +we get:

O(n)\mathcal{O}(n)
tip

If we were writing this in C++ or Rust, we could've avoided that, but not +really.

C++ would allow us to copy the pyramid rightaway into the parameter, so we +would be able to directly change it. However it's still a copy, even though we +don't need to allocate anything ourselves. It's just implicitly done for us.

Rust is more funny in this case. If the pyramids weren't used after the call of +longest_slide_down, it would simply move them into the functions. If they +were used afterwards, the compiler would force you to either borrow it, or +clone-and-move for the function.


Since we're doing it in Java, we get a reference to the original array and we +can't do whatever we want with it.

Summary

And we've finally reached the end. We have seen 4 different “solutions”4 of +the same problem using different approaches. Different approaches follow the +order in which you might come up with them, each approach influences its +successor and represents the way we can enhance the existing implementation.


source

You can find source code referenced in the text +here.


  1. cause why not, right!?
  2. except the bottom row
  3. definitely not an RHCP reference 😉
  4. one was not correct, thus the quotes
+ + + + \ No newline at end of file diff --git a/ib002/tags/applications/index.html b/ib002/tags/applications/index.html new file mode 100644 index 0000000..49afbd2 --- /dev/null +++ b/ib002/tags/applications/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "applications" | mf + + + + + + + + + + + + + +
+

One doc tagged with "applications"

View All Tags
+ + + + \ No newline at end of file diff --git a/ib002/tags/backtracking/index.html b/ib002/tags/backtracking/index.html new file mode 100644 index 0000000..5154ef8 --- /dev/null +++ b/ib002/tags/backtracking/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "backtracking" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/balanced-trees/index.html b/ib002/tags/balanced-trees/index.html new file mode 100644 index 0000000..d8410cd --- /dev/null +++ b/ib002/tags/balanced-trees/index.html @@ -0,0 +1,27 @@ + + + + + +2 docs tagged with "balanced trees" | mf + + + + + + + + + + + + + +
+

2 docs tagged with "balanced trees"

View All Tags
+ + + + \ No newline at end of file diff --git a/ib002/tags/bfs/index.html b/ib002/tags/bfs/index.html new file mode 100644 index 0000000..a188329 --- /dev/null +++ b/ib002/tags/bfs/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "bfs" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/bottom-up-dp/index.html b/ib002/tags/bottom-up-dp/index.html new file mode 100644 index 0000000..429c252 --- /dev/null +++ b/ib002/tags/bottom-up-dp/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "bottom-up-dp" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/c/index.html b/ib002/tags/c/index.html new file mode 100644 index 0000000..c6135de --- /dev/null +++ b/ib002/tags/c/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "c" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/csharp/index.html b/ib002/tags/csharp/index.html new file mode 100644 index 0000000..c4247c8 --- /dev/null +++ b/ib002/tags/csharp/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "csharp" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/dynamic-array/index.html b/ib002/tags/dynamic-array/index.html new file mode 100644 index 0000000..ebdc28a --- /dev/null +++ b/ib002/tags/dynamic-array/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "dynamic array" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/dynamic-programming/index.html b/ib002/tags/dynamic-programming/index.html new file mode 100644 index 0000000..3075355 --- /dev/null +++ b/ib002/tags/dynamic-programming/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "dynamic-programming" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/exponential/index.html b/ib002/tags/exponential/index.html new file mode 100644 index 0000000..96a030e --- /dev/null +++ b/ib002/tags/exponential/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "exponential" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/graphs/index.html b/ib002/tags/graphs/index.html new file mode 100644 index 0000000..f1b958c --- /dev/null +++ b/ib002/tags/graphs/index.html @@ -0,0 +1,27 @@ + + + + + +2 docs tagged with "graphs" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/greedy/index.html b/ib002/tags/greedy/index.html new file mode 100644 index 0000000..22e7fe3 --- /dev/null +++ b/ib002/tags/greedy/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "greedy" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/index.html b/ib002/tags/index.html new file mode 100644 index 0000000..10af9ff --- /dev/null +++ b/ib002/tags/index.html @@ -0,0 +1,25 @@ + + + + + +Tags | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/iterative/index.html b/ib002/tags/iterative/index.html new file mode 100644 index 0000000..6953706 --- /dev/null +++ b/ib002/tags/iterative/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "iterative" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/iterators/index.html b/ib002/tags/iterators/index.html new file mode 100644 index 0000000..8e13c6b --- /dev/null +++ b/ib002/tags/iterators/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "iterators" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/java/index.html b/ib002/tags/java/index.html new file mode 100644 index 0000000..9695095 --- /dev/null +++ b/ib002/tags/java/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "java" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/karel/index.html b/ib002/tags/karel/index.html new file mode 100644 index 0000000..2e10bc5 --- /dev/null +++ b/ib002/tags/karel/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "karel" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/postconditions/index.html b/ib002/tags/postconditions/index.html new file mode 100644 index 0000000..fe84660 --- /dev/null +++ b/ib002/tags/postconditions/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "postconditions" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/python/index.html b/ib002/tags/python/index.html new file mode 100644 index 0000000..55a77a4 --- /dev/null +++ b/ib002/tags/python/index.html @@ -0,0 +1,28 @@ + + + + + +3 docs tagged with "python" | mf + + + + + + + + + + + + + +
+

3 docs tagged with "python"

View All Tags
+ + + + \ No newline at end of file diff --git a/ib002/tags/recursion/index.html b/ib002/tags/recursion/index.html new file mode 100644 index 0000000..9a53621 --- /dev/null +++ b/ib002/tags/recursion/index.html @@ -0,0 +1,28 @@ + + + + + +3 docs tagged with "recursion" | mf + + + + + + + + + + + + + +
+

3 docs tagged with "recursion"

View All Tags
+ + + + \ No newline at end of file diff --git a/ib002/tags/red-black-trees/index.html b/ib002/tags/red-black-trees/index.html new file mode 100644 index 0000000..ea62d19 --- /dev/null +++ b/ib002/tags/red-black-trees/index.html @@ -0,0 +1,27 @@ + + + + + +2 docs tagged with "red-black trees" | mf + + + + + + + + + + + + + +
+

2 docs tagged with "red-black trees"

View All Tags
+ + + + \ No newline at end of file diff --git a/ib002/tags/sorting/index.html b/ib002/tags/sorting/index.html new file mode 100644 index 0000000..d537305 --- /dev/null +++ b/ib002/tags/sorting/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "sorting" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/testing/index.html b/ib002/tags/testing/index.html new file mode 100644 index 0000000..ac1ba13 --- /dev/null +++ b/ib002/tags/testing/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "testing" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/time-complexity/index.html b/ib002/tags/time-complexity/index.html new file mode 100644 index 0000000..3382a87 --- /dev/null +++ b/ib002/tags/time-complexity/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "time complexity" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/tags/top-down-dp/index.html b/ib002/tags/top-down-dp/index.html new file mode 100644 index 0000000..2490883 --- /dev/null +++ b/ib002/tags/top-down-dp/index.html @@ -0,0 +1,26 @@ + + + + + +One doc tagged with "top-down-dp" | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ib002/time-complexity/extend/index.html b/ib002/time-complexity/extend/index.html new file mode 100644 index 0000000..5e9833a --- /dev/null +++ b/ib002/time-complexity/extend/index.html @@ -0,0 +1,31 @@ + + + + + +Time complexity of ‹extend› | mf + + + + + + + + + + + + + +
+

Time complexity of ‹extend›

Introduction

Each year there is a lot of confusion regarding time complexity of the extend operation on the lists in Python. I will introduce two specific examples from previous year and also will try to explain it on one of the possible implementations of extend operation.

Technicalities

At the beginning we should clear some of the “myths” regarding extending of the lists. There is a common misunderstanding regarding differences between a += b, a.extend(b) and a + b.

  • a.extend(b) - adds all elements from b to a.

    Time complexity: O(n)\mathcal{O}(n), where nn denotes the length of b.

  • a += b - equivalent to a.extend(b)

  • a + b - constructs a new list that contains elements from a followed by +elements from b.

    Time complexity: O(m+n)\mathcal{O}(m + n), where m,nm, n denote the length of +a and b respectively.

    Space complexity: O(m+n)\mathcal{O}(m + n), where m,nm, n denote the length of +a and b respectively, since we construct new list.

Example #1

Let us assume function that uses divide & conquer strategy to return indices at which we can find specific element in any list.

def recursive_find_in_list(
values: List[Any], key: Any, lower: int, upper: int
) -> List[int]:
if lower == upper:
return [lower] if values[lower] == key else []

indices = []
mid = (lower + upper) // 2

indices.extend(recursive_find_in_list(values, key, lower, mid))
indices.extend(recursive_find_in_list(values, key, mid + 1, upper))

return indices


def find_in_list(values: List[Any], key: Any) -> List[int]:
return recursive_find_in_list(values, key, 0, len(values) - 1)

This implementation works nicely, extend is linear (with the respect to the length of the list that is being appended).

Let us try to dissect the way this function works on some specific input (that will be pushed to the extreme, just in case ;)

find_in_list([1] * 5000, 1). What shall be the result of this? Since we have key = 1 and the list contains only 1s, we should get list of all indices.

If we were to draw a tree of call hierarchy of recursive_find_in_list, we would notice that in sum it is still linear to the length. However we use extend!

In the leaves of the tree we return lists of length 1. In this case it means calling extend 5000-times at the second-to-last level of the tree on the 1-element long lists, next level 2500 calls on 2-elements long lists, next one 1250 on 4-elements long lists, etc. At the top-level we get 2 calls on 5000/2-element long lists.

A lot of extend calls, right? And the lengths of the lists are growing (in this example, second call happens on 2500-elements long lists).

Because of the extend in each level of the tree (call hierarchy) we traverse all of the elements. That means:

O(nlogn)\mathcal{O}(n \cdot \log n)

because we have logn\log n levels in the tree and nn elements at each level.

Example #2

As we could observe in the example above, extend iterates over all of the elements that it adds. In case of recursive calls, it results in iterating over the same elements multiple times.

Consider constructing of this list:

Rendered construction of the list +Rendered construction of the list

Let us assume that you extend the result with the list that you get from the recursive call.

  • B iterates through 1, 2 and 3; returns [1, 2, 3]

  • C iterates through 4, 5 and 6; returns [4, 5, 6]

  • D iterates through 7, 8 and 9; returns [7, 8, 9]

  • now we return those lists to the calls from A), so each of the extend calls iterates through:

    • 1, 2, 3 that was returned from B
    • 4, 5, 6 that was returned from C
    • 7, 8, 9 that was returned from D

    and returns [1, 2, 3, 4, 5, 6, 7, 8, 9]

If the recursion had bigger depth and/or more elements, it would iterate through them more than twice, therefore it does not take constant time to do nor some constant multiple of the input, since it traverses all of the elements in each of the levels.

Implementation of extend

There is an example of dynamic array:

For the sake of Algorithms and Data Structures I we consider APPEND operation, i.e. adding the element to the end of the list, to have time complexity O(1)\mathcal{O}(1) (amortized; which is out of the scope of IB002).

If we have a look at the extend implementation in this dynamic array example:

void dynamic_array_extend(struct dynamic_array_t *arr, struct dynamic_array_t *src)
{
if (arr == NULL || src == NULL)
{
return;
}

for (size_t i = 0; i < src->count; i++)
{
dynamic_array_push_back(arr, dynamic_array_at(src, i));
}
}

Apart from checking edge cases, we can notice that we run for-loop over the elements from the other array and add them one-by-one to the arr. Time complexity of this operation is time dependant on the src array.

In this specific implementation, you could also resize the memory allocated for the array in one go and copy whole src array in one go. However even if you did so, it would be still dependant on the size of the src array. Cause you still need to copy count(src)elementSize(src)\texttt{count}(src) \cdot \texttt{elementSize}(src) bytes. From that we can assume that for specific instance of array the elementSize(src)\texttt{elementSize}(src) is fixed, therefore we consider it a constant. That way we are getting O(count(src))\mathcal{O}(\texttt{count}(src)) as a time complexity of our extend operation.

+ + + + \ No newline at end of file diff --git a/img/blog/aoc-2022/04-week-4/calendar.png b/img/blog/aoc-2022/04-week-4/calendar.png new file mode 100644 index 0000000..d7c9bff Binary files /dev/null and b/img/blog/aoc-2022/04-week-4/calendar.png differ diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000..c01d54b Binary files /dev/null and b/img/favicon.ico differ diff --git a/img/ib002/karel-1/maze.png b/img/ib002/karel-1/maze.png new file mode 100644 index 0000000..914cb66 Binary files /dev/null and b/img/ib002/karel-1/maze.png differ diff --git a/img/ib002/karel-1/stairs.png b/img/ib002/karel-1/stairs.png new file mode 100644 index 0000000..9d1d8b1 Binary files /dev/null and b/img/ib002/karel-1/stairs.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..c21ab7b --- /dev/null +++ b/index.html @@ -0,0 +1,25 @@ + + + + + +mf | mf + + + + + + + + + + + + + +
+

mf

blog and additional materials for courses at φ

About Me

I'm working in Red Hat in the Packit team and studying at FI MUNI while also tutoring some courses there.

Content

On this page you can find my blog or unofficial materials I have written over the course of teaching multiple courses at the FI.

Mastodon

Feel free to contact me on any of the following Mastodon accounts: Fosstodon or Hachyderm.io

+ + + + \ No newline at end of file diff --git a/opensearch.xml b/opensearch.xml new file mode 100644 index 0000000..120ccc0 --- /dev/null +++ b/opensearch.xml @@ -0,0 +1,11 @@ + + + mf + Search mf + UTF-8 + https://blog.mfocko.xyz/img/favicon.ico + + + https://blog.mfocko.xyz/ + \ No newline at end of file diff --git a/pb071/bonuses/seminar-03/index.html b/pb071/bonuses/seminar-03/index.html new file mode 100644 index 0000000..d575bfb --- /dev/null +++ b/pb071/bonuses/seminar-03/index.html @@ -0,0 +1,41 @@ + + + + + +3rd seminar | mf + + + + + + + + + + + + + +
+

3rd seminar

caution

Deadline for the submission of the bonus is March 16th 24:00.

tip

In case you have any questions, feel free to reach out either by email, Discord +or just by submitting an issue here.

This assignment has two versions. For the light version you can get 1.5 K₡. For +the full fat 3 K₡. You can choose only one of them.

To both of them you are given some basic tests. You can also have a look at the +code used by the tests and use it to your advantage.

Details can be found in the doxygen comments included in the source files.

Light version (main_light.c)

Source

For the light version you have 3 functions to finish:

  1. swap - that swaps two ints passed by pointers.
  2. maximum - that returns index of the biggest int in the array.
  3. select_sort - that sorts passed array using Select Sort.

Full fat version (main.c)

Source

For the full fat version you have 4 functions to implement:

  1. swap - that swaps two variables passed by pointers.
  2. maximum - that returns index of the biggest element in the array using the +comparator.
  3. select_sort - that sorts passed array using Select Sort.
  4. int_comparator - that is used for generic sort and maximum

To 2nd and 3rd function you are given a pseudocode that you can use to implement +it.

Function pointers

In the skeleton of the “full fat” version you might have noticed a weird type +signature of both the maximum and select_sort functions. Those functions get +passed a function pointer to the comparator that you use for comparing the +respective elements in the passed in array.

If we take the parameter from one of the functions from the skeleton:

int (*comp)(const void *, const void *)

comp is a function pointer to a function that takes two pointers of unspecified +type, i.e. pure address to the memory (you don't know what stored in there), and +returns an int.

You can pass the function by simply using its name. (There is no need to use & +to get its address.) And you can also call the function by “calling” the function +pointer, e.g. comp(left, right).

Submitting

For submitting the bonus assignment you can follow the same procedure as for +submitting the homeworks, that is:

  1. On branch main add the provided skeleton.
  2. Checkout new branch seminar-bonus-03.
  3. Add your solution to the newly created branch.
  4. Create a MR to the main branch with me (@xfocko) as the reviewer.
Directory structure for bonuses

Ideally create a directory seminar-bonuses in the root of your repository with +bonuses in their own subdirectories.

Structure of your repository can look like this:

.
├── bonuses
│ └── seminar-03
├── hello
├── hw01
├── hw02
├── seminar-01
├── seminar-02
└── seminar-03

or

.
├── bonus-seminar-03
├── hello
├── hw01
├── hw02
├── seminar-01
├── seminar-02
└── seminar-03

Structure of the bonuses is entirely up to you, just keep it consistent.

+ + + + \ No newline at end of file diff --git a/pb071/bonuses/seminar-04/index.html b/pb071/bonuses/seminar-04/index.html new file mode 100644 index 0000000..f607df6 --- /dev/null +++ b/pb071/bonuses/seminar-04/index.html @@ -0,0 +1,46 @@ + + + + + +4th seminar | mf + + + + + + + + + + + + + +
+

4th seminar

caution

Deadline for the submission of the bonus is March 23th 24:00.

tip

In case you have any questions, feel free to reach out either by email, Discord +or just by submitting an issue here.

For this bonus you can get 3 K₡ and another 0.5 K₡ for the bonus part of it.

Source

Introduction

In this task you are given a 2D map for a robot. The map contains multiple markers:

  • ^v<> - which denote the directions the robot will be facing when he steps into +the cell or starts on it.
  • K - denotes the key.
  • T - denotes the treasure.

In case robot lands at the beginning on unknown field, e.g. . in the tests, he +faces the direction that is given through the parameter.

Your task is to write the walk function that returns end result of the walk. +Walk can end in multiple ways:

  • FOUND_TREASURE - when you find the treasure
  • FOUND_KEY - when you find the key
  • OUT_OF_BOUNDS - when the robot falls off the map
  • INFINITE_LOOP - in case you will implement the bonus
  • NONE - which is used right now as a default return in the skeleton, has no meaning +later on

Hard requirement

There is only one hard requirement that tests cannot check.

You are not allowed to use any indexing related to map or your current position +in your implementation.

Reason for this requirement is for you to get used to working with pointers. And +for the implementation of this task it is much easier to use just the pointers.

Example of run

For a better understanding of your task, I will describe a simple walk with corresponding +function call.

const char *map = (
">.v"
".K<"
"..."
);

walk(map, &map[6], '^', 3, 3);

For this call, you should return FOUND_KEY. Let us walk through the walk ;)

  1. Robot is placed at the bottom left corner, there is no direction specified, so +he follows the direction given by parameter (upwards, denoted as N(orth), +so that we can differentiate markers on the map with the robot when using printing +function).

    >.v
    .K<
    N..
  2. Moves up:

    >.v
    NK<
    ...
  3. Moves up (now covers >), changes direction to right:

    E.v
    .K<
    ...
  4. Moves to right:

    >Ev
    .K<
    ...
  5. Moves to right, faces south:

    >.S
    .K<
    ...
  6. Moves down, faces west:

    >.v
    .KW
    ...
  7. Moves left, founds key, returns FOUND_KEY:

    >.v
    .W<
    ...

Bonus part

For the bonus part you are supposed to return INFINITE_LOOP in case the robot +is stuck in the infinite loop. There are three tests for it. If you pass only the +easy and medium one, you can get 0.25 K₡ for doing your best and trying it out. :)

Easter eggs

  • Statistics

    LanguageFilesLinesBlanksCommentsCodeComplexity
    C4458345836633
    test_maze.c225902164
    sol.maze.c14115289824
    maze.c84830465
    main.c82060
    C Header133319110
    maze.h33319110
    CMake12546152
    CMakeLists.txt2546152
    Total6516418339235
  • Majority of the line count in solution is caused by the formatting :)

  • Included headers can be interpreted as hints, same goes for the unimplemented +static functions which you can use, but are not required.

  • Given CMakeLists.txt will generate 2 binaries, test_maze and maze.

    • test_maze runs the tests you are given.
    • maze runs the main.c, where you can debug, print mazes and whatever else +you want.
  • I keep only one copy of cut.h in my repository, so you need to download it from +here and place it into the directory where you have your source code.

    • Or you can use the one you have from the latest homework, git will keep it +only once, so it doesn't take up more space.
  • I would recommend cloning this repository and copying the maze directory to +your own repository, since there are multiple files and it may be easier for you.

In case you have any questions, feel free to reach out to me.

Submitting

For submitting the bonus assignment you can follow the same procedure as for +submitting the homeworks, that is:

  1. On branch main add the provided skeleton.
  2. Checkout new branch seminar-bonus-04.
  3. Add your solution to the newly created branch.
  4. Create a MR to the main branch with me (@xfocko) as the reviewer.
+ + + + \ No newline at end of file diff --git a/pb071/bonuses/seminar-05-06/index.html b/pb071/bonuses/seminar-05-06/index.html new file mode 100644 index 0000000..7e2c937 --- /dev/null +++ b/pb071/bonuses/seminar-05-06/index.html @@ -0,0 +1,46 @@ + + + + + +5th and 6th seminar | mf + + + + + + + + + + + + + +
+

5th and 6th seminar

For this bonus you can get at maximum 2.5 K₡.

Source

Introduction

In this bonus you will implement few functions that will be used together for +implementing a very special cipher.

Task no. 1: Reverse (0.5 K₡)

Write a function char* reverse(const char* text) that returns copy of the input +string in reversed order (also uppercase).

In case you are given NULL, return NULL.

Example (more in tests):

char* reversed = reverse("Hello world!");

printf("%s\n", reversed);
// "!DLROW OLLEH"

if (reversed != NULL) {
free(reversed);
}

Task no. 2: Vigenère (0.5 K₡)

Vigenère cipher is similar to the Caesar cipher, but you also have a key that is +used for encrypting (or decrypting).

Your task is to write two functions:

  • char* vigenere_encrypt(const char* key, const char* text) for encrypting
  • char* vigenere_decrypt(const char* key, const char* text) for decrypting

In both of those you should return uppercase characters.

Meaning of the parameters you are given:

  • key - String that represents key that is used for *crypting. It consists of +one word and can have only characters of the alphabet. Does not matter if they +are uppercase or lowercase.
  • text - String that is to be *crypted.

Function returns address of the encrypted (or decrypted) string. Or NULL in case +error occurs.

Example:

char *encrypted = vigenere_encrypt("CoMPuTeR", "Hello world!");

printf("%s\n", encrypted);
// "JSXAI PSINR!"

if (encrypted != NULL) {
free(encrypted)
}

Bonus part (0.5 K₡)

If you can utilize helper function that would do both encrypting and decrypting, +you can gain 0.5 K₡.

Usage of true/false to decide path in code is prohibited. It leads to merging +of both functions into one. Point of this part is to discover a way to do this +generically in such way that there are no separate paths for one or the other. One +function with no branching for both of them, parametrization is your friend :)

Task no. 3: Bit madness (0.5 K₡)

This is a state of the art crypto. Please do not share :)

For encrypting:

  1. Split the character that is to be encrypted in halves (4 and 4 bits each).
  2. Bits in 1st half are to be split into pairs. Swap bits in those pairs.
  3. Then use the 4 bits that you created in the 2nd step for XOR with the other +4 bits.

This simple and ingenious principle will be illustrated on the following example. +String we want to encrypt is Hello world!. We need to encrypt each letter separately, +so we will demonstrate on letter H:

  1. Letter H is represented in ASCII as 72.

    72 represented in binary is: 01001000. So first 4 bits are: 0100 and last +4 bits are 1000.

  2. First half of bits (0100) consists of 2 pairs (01 and 00) which we swap +(01 ~> 10 and 00 ~> 00). That way we get 1000.

  3. That half is used for xor with the other 4 bits:

        1000  // second half
    XOR 1000 // first half after 2nd step
    --------
    0000
  4. Now we combine both halves (first one is 1000, which we got from the 2nd step +and second one is 0000, which we got from the 3rd step) and get 10000000, +which is encrypted character H using this method.

In case of decryption, reverse those steps.

Your task is to implement functions:

  • unsigned char* bit_encrypt(const char* text)
  • char* bit_decrypt(const unsigned char* text)

Example:

unsigned char* encrypted = bit_encrypt("Hello world!");

for (int i = 0; i < 12;i++) {
printf("%x ", encrypted[i]);
//80 9c 95 95 96 11 bc 96 b9 95 9d 10
}

if (encrypted != NULL) {
free(encrypted);
}

Task no. 4: All combined to BMP (0.5 K₡)

Authors of the BMP cipher are non-disclosed :)

Create pair of functions:

  • unsigned char* bmp_encrypt(const char* key, const char* text)
  • char* bmp_decrypt(const char* key, const unsigned char* text)

BMP cipher consists of following steps for encrypting:

  1. Reverse the input string
  2. Use Vigenere on the string you got from step #1
  3. Use bit madness on the string you got from step #2

For decrypting, reverse the steps.

Submitting

In case you have any questions, feel free to reach out to me.


Ideally submit the assignment through the merge request. Step-by-step tutorial is +present here. For setting assignee my xlogin is xfocko.

In case you do not want to experiment on GitLab, send me the source code via email, +but please prefix subject with: [PB071/14][seminar-05-06]

Deadline for the submission of the bonus is April 21th 24:00.

+ + + + \ No newline at end of file diff --git a/pb071/bonuses/seminar-08/index.html b/pb071/bonuses/seminar-08/index.html new file mode 100644 index 0000000..2e4cb70 --- /dev/null +++ b/pb071/bonuses/seminar-08/index.html @@ -0,0 +1,50 @@ + + + + + +8th seminar | mf + + + + + + + + + + + + + +
+

8th seminar bonus assignment

Source

Introduction

In this bonus you can implement two tasks, one of them has a bonus part with generic +solution.

One is focused on counting ananas or in case of generic version any substring in +the file, but with a restriction on the function you use.

Other one has a more algorithmic spirit.

For this bonus you can get at maximum 2.5 K₡.

Warning

DO NOT COMMIT test data to your own git repository, since the tests include +files that exceed 10MB by themselves. Even if they are on separate branch, they +take up the space.

Testing

For testing you are provided with python script (requires click to be installed: +pip3 install --user click) and Makefile that provides following targets:

  • check-counting - runs the counting tests
  • check-counting-bonus - runs the counting tests with bonus implemented
  • check - runs both counting and counting-bonus tests
  • clean - removes output files from the test runs

Task no. 1: Counting (0.75 K₡)

Your first task is to make smallish program that counts occurences of specific +(or given) word from file and writes the number to other file.

Usage of the program is:

Usage: ./counting <input-file> <output-file> [string-to-be-counted]

Arguments that are passed to the program represent:

  • <input-file> - path to the file where we count the words
  • <output-file> - path to the file where we output the count
  • (optional argument) [string-to-be-counted] - in case you implement bonus, +otherwise we default to word ananas ;)

In skeleton you are given 3 empty, but documented, functions to implement.

  1. count_anything - function accepts input file and substring to be counted in +the file, returns the count.
  2. count_ananas - same as count_anything, but specialized for ananases, the +default implementation from the skeleton expects you to implement count_anything +and therefore it just calls the other function.
  3. write_number - function that writes the number to the file, why would you +need the function is explained later :)

Requirements

For manipulation with the files you are only allowed to use fopen, fclose, +fgetc and fputc. Functions like fprintf (except for stderr or logging) and +fscanf are forbidden.

In case you struggle and want to use one of those functions, the solution will be +penalized by 50% of points.

Bonus part (0.75 K₡)

Bonus part of this assignment is to implement count_anything rather than count_ananas.

Smaller hint: This task does not need dynamic allocation :) You just need one +good helper function and the right idea ;)

Task no. 2: Weird trees (1 K₡)

In this task we are crossing our paths with algorithms and data structures. +Your task is to write a program that constructs tree from the file that is given +as an argument and pretty-prints it.

Input file consists of lines, that include key and rank in form key;rank +or nil. Why would we have nil in a file? The file represents pre-order iteration +through the tree. Leaves never have rank different than 0, so you can safely assume +2 non-existing nils in the input after you read such node ;)

Example input fileTree it represents
8;4
5;3
3;2
2;1
1;0
nil
4;0
7;1
6;0
nil
11;2
10;1
9;0
nil
12;0

tree

In this task you are only provided with different trees in the test-trees directory. +Implementation and format of the pretty-print is totally up to you. :)

Example of mine for the tree above:

8 (rank = 4)
+-- 5 (rank = 3)
| +-- 3 (rank = 2)
| | +-- 2 (rank = 1)
| | | +-- 1 (rank = 0)
| | +-- 4 (rank = 0)
| +-- 7 (rank = 1)
| +-- 6 (rank = 0)
+-- 11 (rank = 2)
+-- 10 (rank = 1)
| +-- 9 (rank = 0)
+-- 12 (rank = 0)

Can you find out what are those trees? :)

Submitting

In case you have any questions, feel free to reach out to me.


Ideally submit the assignment through the merge request. Step-by-step tutorial is +present here. For setting assignee my xlogin is xfocko.

In case you do not want to experiment on GitLab, send me the source code via email, +but please prefix subject with: [PB071/14][seminar-08]

Deadline for the submission of the bonus is May 4th 24:00.

+ + + + \ No newline at end of file diff --git a/pb071/bonuses/seminar-10/index.html b/pb071/bonuses/seminar-10/index.html new file mode 100644 index 0000000..5935f3e --- /dev/null +++ b/pb071/bonuses/seminar-10/index.html @@ -0,0 +1,53 @@ + + + + + +10th seminar | mf + + + + + + + + + + + + + +
+

10th seminar

Source

Introduction

For this bonus you are given almost finished project - The Hangman Game. Your +task is to try the game, in case you find any bugs point them out and cover as +much of the game as possible with tests.

For this bonus you can get at maximum 2 K₡.

ItemBonus
Fixing bugs from failing tests0.25
word_guessed0.50
Hidden bug0.50
Extending tests, undetectable bugs or evil bug0.37
Refactor0.38

Project

Project consists of 2 source files - hangman.c and main.c.

main.c is quite short and concise, there is nothing for you to do.

hangman.c contains implementation of the game. In case you feel lost, consult +the documentation in hangman.h that represents an interface that can be used +for implementing the game.

Apart from those sources this project is a bit more complicated. Game loop is +realised via single encapsulated function that complicates the testing. Because +of that, there are 2 kinds of tests:

  • Unit tests - that are present in test_hangman.c and can be run via:

    $ make check-unit

    They cover majorly functions that can be tested easily via testing framework.

  • Functional tests - same as in seminar-08 and are focused on testing the +program as whole. Basic smoke test is already included in usage test case.

    They can be run via:

    $ make check-functional

    When testing hangman function (the game loop), it is suggested to create +functional tests.

    When submitting the files for review, please leave out functional tests that +were given as a part of the assignment, so that it is easier to navigate, I +will drag the common files myself. :)

Whole test suite can be run via:

$ make check

Summary of the gameplay

  1. Secret word gets chosen from the file that's path is given as an argument.
  2. You get 8 guesses.
  3. Invalid characters don't count.
  4. Already guessed characters don't count, even if not included in the secret.
  5. You can guess the whole word at once
    • If you get it right, you won, game ends.
    • If you don't get it right, you get to see the secret, game ends.
  6. In case of end of input, game finishes via force.
  7. In case of invalid input, no guesses are subtracted, game carries on.
  8. Letters and words are not case sensitive.

Suggested workflow

As we have talked about on the seminar, I suggest you to follow +Test-Driven Development +in this case.

TDD workflow

In our current scenario we are already in the stage of refactoring and fixing the +bugs. Therefore try to follow this succession of steps:

  1. Try to reproduce the bug.
  2. Create a test that proves the presence of the bug.
  3. Fix the bug.

In case you are submitting the bonus via GitLab, it is helpful to commit tests +before commiting the fixes, so that it is apparent that the bug is manifested. +Example of git log (notice that the first line represents latest commit):

feat: Implement fizz_buzzer
test: Add tests for fizz_buzzer
fix: Fix NULL-check in print_name
test: Add test for NULL in print_name

Tasks

As to your tasks, there are multiple things wrong in this project.

  1. There are 2 "bugs" that cannot be detected via tests, i.e. they are not bugs +that affect functionality of the game.

  2. There is one evil bug in get_word. It is not required to be fixed ;) Assign +it the lowest priority.

  3. There are some tests failing. Please try to figure it out, so you have green +tests for the rest :)

  4. We have gotten a bug report for word_guessed, all we got is

    doesn't work when there are too many as

    Please try to replicate the bug and create a tests, so we don't get any +regression later on.

  5. One hidden bug :) Closely non-specified, we cannot reproduce it and we were +drunk while playing the game, so we don't remember a thing. :/

  6. Try to cover as much code via the tests as possible. We are not going to look +at the metrics, but DRY is violated a lot, so as a last task try to remove as +much of the duplicit code as possible.

    Tests should help you a lot in case there are some regressions.


In case you wonder why there are always 3 same words in the file with words, it +is because of the get_word bug. It is not a bug that can be easily fixed, so +it is a not requirement at all and you can still get all points for the bonus ;)

Dictionary

Submitting

In case you have any questions, feel free to reach out to me.


Ideally submit the assignment through the merge request. Step-by-step tutorial +is present here. For setting assignee my xlogin is xfocko.

In case you do not want to experiment on GitLab, send me the source code via +email, but please prefix subject with: [PB071/14][seminar-10]

Deadline for the submission of the bonus is May 17 24:00.

+ + + + \ No newline at end of file diff --git a/pb071/category/bonuses/index.html b/pb071/category/bonuses/index.html new file mode 100644 index 0000000..6e3c4f1 --- /dev/null +++ b/pb071/category/bonuses/index.html @@ -0,0 +1,38 @@ + + + + + +Bonuses | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pb071/category/practice-exams/index.html b/pb071/category/practice-exams/index.html new file mode 100644 index 0000000..ee65e63 --- /dev/null +++ b/pb071/category/practice-exams/index.html @@ -0,0 +1,32 @@ + + + + + +Practice Exams | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pb071/index.html b/pb071/index.html new file mode 100644 index 0000000..abcb6dc --- /dev/null +++ b/pb071/index.html @@ -0,0 +1,25 @@ + + + + + +Introduction | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pb071/mr/index.html b/pb071/mr/index.html new file mode 100644 index 0000000..3b5d45d --- /dev/null +++ b/pb071/mr/index.html @@ -0,0 +1,49 @@ + + + + + +Submitting merge requests | mf + + + + + + + + + + + + + +
+

Submitting merge requests for review

This tutorial aims to show you how to follow basic git workflow and submit changes +through Merge Requests for review.

The rudimentary idea behind aims for changes to be present on a separate branch +that is supposedly merged into the default branch. Till then changes can be reviewed +on Merge Request and additional changes may be made based on the reviews. Once +the changes satisfy requirements, the merge request is merged.

Tutorial

Use this tutorial only for bonus assignments made by your tutors or in case +you need to make up for the absence.

Step #1 - Starting from the clean repository

In your repository (either locally or on aisa) type git status and check if your +repository is clean and you are present on the main branch (master, main or +trunk). If you do not know what your default branch is, it is probably master +and you should not be on any other branch.

Output of the command should look like this:

aisa$ git status
On branch master # Or main or trunk.
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

In case you are on different branch or there are uncommitted changes, +do not continue!!! Clean your repository (commit the changes or discard +them), before you continue.

Step #2 - Create new branch

In your repository write command:

aisa$ git checkout -b BRANCH
Switched to a new branch 'BRANCH'

Instead of BRANCH use some reasonable name for the branch. For example if you +are working on the seminar from 3rd week, name the branch seminar-03.

Step #3 - Do the assignment

Download the skeleton for the seminar assignment, extract and program. For example +if you are working on 3rd seminar, you can do so by:

aisa$ wget https://www.fi.muni.cz/pb071/seminars/seminar-03/pb071-seminar-03.zip
aisa$ unzip pb071-seminar-03.zip
# Now you should have directory 'seminar-03'.
aisa$ rm pb071-seminar-03.zip
aisa$ cd seminar-03
# You can work on the assignment.

Step #4 - Commit and upload the changes to GitLab

The same way you add and commit files for the homework assignments, you do for +the seminar.

Now you can upload the changes to GitLab. git push is not enough, since repository +on GitLab does not know your new branch. You can solve this by adding arguments:

aisa$ git push origin BRANCH
...
remote: To create a merge request for BRANCH, visit:
remote: https://gitlab.fi.muni.cz/login/pb071/merge_requests/new?merge_request%5Bsource_branch%5D=BRANCH
...

In the output you should have a link for creating a merge request. If you see this +link, open it and skip next step.

Step #5 - Creating a merge request manually

  1. Open your repository on GitLab.
  2. On the left panel click on Merge Requests.
  3. Click on New Merge Request.
  4. In Source branch select login/pb071 and BRANCH, which you created.
  5. In Target branch select login/pb071 and your default branch you have seen +in the output of the first command. (most likely master)
  6. Click on Compare branches and continue.

Step #6 - Set assignees

On the page that is opened, please check at the top that you are creating merge +request from your new branch to your default branch (one of master, main +or trunk).

Then in the field Assignees set your tutors based on the seminar group. You can +use login for a quick look up.

In the end click on Submit merge request.

Step #7 - Return to default branch

Homework assignments can be submitted only from branches specified in the rules +for the course. Because of that, before you do anything else, you should switch +back to your default branch.

First of all, same as in step #1, check that your repository is clean with git status. +For the sake of safety, do not continue without clean repository. Then with command +git checkout BRANCH switch to your default branch BRANCH.

If you do not know which branch is your default, try git branch that outputs all branches in your repository. Default branch is typically master, but can +be main or trunk.

aisa$ git status
# Check if repository is clean

# If you know, what is your default branch, you can skip next command.
aisa$ git branch
# Find the default branch in the list; should be one of the `master`, `main` or
# `trunk` and you should not have more than one of those.
# In case the list clears the terminal and you cannot see shell prompt, you can
# press `q` to quit the pager.

aisa$ git checkout master

Adapted from: https://www.fi.muni.cz/~xlacko1/pb071/mr.html

+ + + + \ No newline at end of file diff --git a/pb071/pexam/cams/index.html b/pb071/pexam/cams/index.html new file mode 100644 index 0000000..cc13a33 --- /dev/null +++ b/pb071/pexam/cams/index.html @@ -0,0 +1,56 @@ + + + + + +Practice exam C | mf + + + + + + + + + + + + + +
+

Watching Cams

Exam environment
  • During the exam you will be provided with a barebone exam session on the +faculty computers.
  • In browser you are only allowed to have the following tabs open:
  • You are not allowed to use your own source code, e.g. prepared beforehand +or from the seminars.
  • You have 5 minutes to read through the assignment and ask any follow-up +questions should be there something unclear.
  • You have 60 minutes to work on the assignment, afterward your work will be +discussed with your seminar tutor.

Your task is to write a program cams that will be processing input from the +cams that are capable of identifying license plates on the cars and then +print out summary based on the input data. Your contributions to the society are +very much appreciated and may (or may not) be used for (each or none) of the +following purposes1:

  • stalking people leaving and coming back home,
  • retroactively making people pay for the parking,
  • providing evidence of people speeding on highways,
  • tracking people that don't pay tolls, or
  • convict employees leaving the work prematurely.

Format of the input file

Input for your program consists of the data from the cameras. You will be given +the data from the cameras as a path to a file and user should also be able to +specify - (i.e. stdin) as the path.

Each “scan” (i.e. reading) of the cameras consists of the following data:

  • camera ID: non-negative integer identifying a camera

  • plate: string of unknown length that can consist of any characters apart +from whitespace

  • timestamp: date and time of the scan as an unsigned integer (represented as +a UNIX time)

    tip

    When programming on UN*X(-like) systems, you can assume that the time_t +structure from the system header time.h is the unsigned int that you +are provided in the input file.

And they are compiled into one reading such as:

camera_ID: plate timestamp

There should be always at least one space in between each part of the +reading. Readings are separated by the commas, which may, but don't have to, be +accompanied by whitespace around.

Examples

Few examples of the data from the cameras follow

10: ABC-12-34 1664608712, 289: XYZ-98-76         1665416417,
25: ABC-12-34 1633078256 , 42: TryToCatchMe 1671602419,
11: EL9-987 1679541338 ,2 : Foo-666 1683170082,42: YourMum 1683170082,
42: TryToCatchMe 1671602419 , 1234: TryToCatchMe 1671602419,
19: ABC-12-34 1664659649, 69:YouShould-not-pLaCe-4ny-expectations%on^the(input 1680307994,
9 : 9B9-161 1665416417 , 10: 1a1-999 1671602419,1:lmao 1633078256,
16: ABC-12-34 1664609012

Format of the output

info

All the examples consider using data from the example of the input.

You are expected to print out the dates and cameras that has captured the +license plate for each of them (in a sorted fashion).

If there are multiple scans present and the timespan (i.e. time difference +between the scans is bigger than 60 minutes, you should separate them by a +newline). For example:

*** ABC-12-34 ***
25: Fri Oct 1 10:50:56 2021

10: Sat Oct 1 09:18:32 2022
16: Sat Oct 1 09:23:32 2022

19: Sat Oct 1 23:27:29 2022
tip

Since you are given the timestamp in a time_t compatible type on UN*X, you +can safely use ctime(3) for printing the timestamp as a human readable time +when outputting the date and time.

tip

For a better readability you can include one more newline after the last line +of the output.

Example usage

You can also have a look at example usage of your program. We can run your +program from the shell like

$ ./cams example_1.txt

And it will produce an output:

*** ABC-12-34 ***
25: Fri Oct 1 10:50:56 2021

10: Sat Oct 1 09:18:32 2022
16: Sat Oct 1 09:23:32 2022

19: Sat Oct 1 23:27:29 2022

*** EL9-987 ***
11: Thu Mar 23 04:15:38 2023

*** Foo-666 ***
2: Thu May 4 05:14:42 2023

*** TryToCatchMe ***
42: Wed Dec 21 07:00:19 2022
42: Wed Dec 21 07:00:19 2022
1234: Wed Dec 21 07:00:19 2022

*** XYZ-98-76 ***
289: Mon Oct 10 17:40:17 2022

*** YouShould-not-pLaCe-4ny-expectations%on^the(input ***
69: Sat Apr 1 02:13:14 2023

*** YourMum ***
42: Thu May 4 05:14:42 2023

Requirements and notes

  • Define structures (and enumerations, if applicable) for the parsed +information from the files.
  • For keeping the “records”, use some dynamic data structure.
    • Don't forget to consider pros and cons of using specific data structures +before going through implementing.
  • You are not required to produce 1:1 output to the provided examples, they +are just a hint to not waste your time tinkering with a user experience.
  • If any of the operations on the input files should fail, +you are expected to handle the situation accordingly.
  • Failures of any other common functions (e.g. functions used for memory +management) should be handled in the same way as they were in the +homeworks and seminars.
  • Your program must free all the resources before exiting.

  1. Subject to NDA.
+ + + + \ No newline at end of file diff --git a/pb071/pexam/garbage_collect/index.html b/pb071/pexam/garbage_collect/index.html new file mode 100644 index 0000000..755a7f8 --- /dev/null +++ b/pb071/pexam/garbage_collect/index.html @@ -0,0 +1,49 @@ + + + + + +Practice exam B | mf + + + + + + + + + + + + + +
+

Garbage Collection

Exam environment
  • During the exam you will be provided with a barebone exam session on the +faculty computers.
  • In browser you are only allowed to have the following tabs open:
  • You are not allowed to use your own source code, e.g. prepared beforehand +or from the seminars.
  • You have 5 minutes to read through the assignment and ask any follow-up +questions should be there something unclear.
  • You have 60 minutes to work on the assignment, afterward your work will be +discussed with your seminar tutor.

You have gotten into a trouble during your regular upgrade of your archLinux1 +installation… You've been carelessly running the upgrades for months and forgot +about clearing up the caches.

Your task is to write a program garbage_collect that will evaluate the shell +history provided as a file and will try to find files or directories that are +suspiciously big and decide which of them should be deleted to free some space.

Format of the shell history

You are provided one file consisting of the captured buffer of the terminal. You +can see only two commands being used:

  1. cd ‹somewhere› that changes the current working directory.

    At the beginning you start in the root of the filesystem (i.e. /).

    You are guaranteed that ‹somewhere› is:

    • . that is a current working directory (i.e. does nothing),
    • .. that moves you up one level (in case you are in /, does nothing), or
    • is a valid directory in the current working directory.
    caution

    There are no guarantees or restrictions on the names of the files or +directories!

  2. ls that will list files in the current working directory and their +respective sizes. If there is a directory in the current working it has dir +instead of the size.

$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ cd .
$ cd .
$ cd .
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k

For this input, you will get following file system:

- / (dir, size=48381165)
- a (dir, size=94853)
- e (dir, size=584)
- i (file, size=584)
- f (file, size=29116)
- g (file, size=2557)
- h.lst (file, size=62596)
- b.txt (file, size=14848514)
- c.dat (file, size=8504156)
- d (dir, size=24933642)
- j (file, size=4060174)
- d.log (file, size=8033020)
- d.ext (file, size=5626152)
- k (file, size=7214296)

Format of the output

Your program should support 2 switches:

  • -gt ‹min_size› that will print out suspiciously big files.
  • -f ‹total_size› ‹min_unused› that will print out a file to be deleted.

-gt ‹min_size›

With this switch you are provided one additional argument:

  • min_size that is the lower bound (inclusive) for size of any file or +directory that is supposed to be listed.

When your program is being run with this switch, it is is supposed to print out +all files and directories that are bigger than the provided min_size.

-f ‹total_size› ‹min_unused›

With this switch you are provided two additional arguments:

  • total_size that is a total size of the filesystem2.
  • min_unused that is a minimum of free space required for an upgrade.

Your program should find exactly one file or a directory that is of the +smallest size, but big enough to free enough space for the upgrade to proceed.

In other words, if that file or directory is deleted, following should hold:

total_sizeusedmin_unused\mathtt{total\_size} - \mathtt{used} \geq \mathtt{min\_unused}

Example usage

You can have a look at the example usage of your program. We can run your +program from the shell like

$ ./garbage_collect shell_history.txt -gt 10000000
24933642 /d
14848514 /b.txt
48381165 /

$ ./garbage_collect shell_history.txt -f 70000000 30000000
24933642 /d

Requirements and notes

  • Define structures (and enumerations, if applicable) for the parsed +information from the files.
  • For keeping the “records”, use some dynamic data structure.
    • Don't forget to consider pros and cons of using specific data structures +before going through implementing.
  • You are not required to produce 1:1 output to the provided examples, they +are just a hint to not waste your time tinkering with a user experience.
  • If any of the operations on the input files should fail, +you are expected to handle the situation accordingly.
  • Failures of any other common functions (e.g. functions used for memory +management) should be handled in the same way as they were in the +homeworks and seminars.
  • Your program must free all the resources before exiting.

  1. Also applies to Fedora, but… we use arch btw 😉
  2. duh!
+ + + + \ No newline at end of file diff --git a/pb161/environment/index.html b/pb161/environment/index.html new file mode 100644 index 0000000..7444780 --- /dev/null +++ b/pb161/environment/index.html @@ -0,0 +1,62 @@ + + + + + +Environment | mf + + + + + + + + + + + + + +
+

Environment

Required tools per OS

Windows

Most likely WSL, VM or VPS. If you consider setting up either of those PITA, then +VSCode + SSH to aisa might be the best option for you.

VSCode @ aisa

Be careful when using VSCode on aisa, most notably:

  1. VSCode can leave lingering processes running in the background that can „eat +up“ your quota for running processes. +AFAIK UNIX team has implemented some periodic clean up of those.
  2. Disk quota can be also affected, because of the C/C++ extension toolkit that +has a cache for IntelliSense.

Either of those will be linux distros, so jump to next section.

Linux

Majority (if not all) of the provided materials include makefile (contains absolute +path, so in case of linting and compiling, you need to adjust to your needs). You +basically need following list of tools:

  • gcc - for compiling
  • clang-tidy - for linting (depends on distribution, might be provided with +clang itself or in separate package, e.g. clang-tools-extra)
  • clang-format - for your own sanity of keeping consistent formatting
  • make - since you are provided makefiles and it might be quickest to set up
  • valgrind - in case you manage to create memory errors in your code

In case of Fedora it is following set of packages:

sudo dnf install -y clang clang-tools-extra valgrind gcc make
# If you decide to use google test: add `gtest` or `llvm-googletest` for clang

macOS

In case of macOS you should be able to find all of the packages in brew.sh, except +valgrind, not sure if you can solve with podman/docker.

There is also an alterantive to homebrew, that is nixpkgs.

nix(OS)

In case you run nixOS or linux distribution with nixpkgs or you use nixpkgs as a +replacement for homebrew on macOS. You should be fine with the following config:

with import <nixpkgs> {};
stdenv.mkDerivation {
name = "cppenv";
buildInputs = [
clang-tools

gnumake

gmock # used for google test
valgrind # not sure about macOS though
];
}

IDEs

Choice of the IDE is mostly up to you, you do not need to use IDE at all ;)

I would probably recommend VSCode + appropriate extension or CLion if you are used +to the JetBrains IDEs.

git

I recommend you using some basic versioning for your code, even though you submit +only the sources on aisa. There are specific reasons why I suggest it:

  • if you build a commit, tag and submit habit, you might be able to address +some of the smaller problems in your sources even before submission; more info +in the pre-commit section

In case you are planning to use git branches for separating different +assignments and/or merge requests I suggest you to keep specifications and +skeletons on your default branch, since frag on aisa automatically downloads +everything that is not present and by that can create conflicts when switching +branches.

Commit conventions

When creating smaller and well defined commits, you can more easily argue about +correctness of your implementation and also identify bugs, since they are better +contained.

Since frag creates a lot of support files (majority of them are dotfiles, i.e. +hidden files), I recommend you to use following +gitignore configuration that +should cover most of the scenarios.

Pre-commit basically allows you to "check" your code before committing. It functions +as a git hook, i.e. you want to make a commit, pre-commit checks it before-hand.

In case of C++ there are few use-cases:

  • formatting

  • linting

  • building and/or running tests, in case you feel like masochist

    However this might be a challenging task to implement, since most of the tasks +are published from the beginning.

In case of formatting and linting, there are already existing hooks (there is a +list of supported ones on the page), but there is also an option for you setting +it up yourself (it is just a matter of specifying command and files it should run +on).

Formatting

For formatting you can the following git hook.

This hook follows the formatting conventions defined by the .clang-format file +that is looked up recursively all the way to the root of the filesystem, therefore +it is ideal to keep it in the root of the git repository.

You can look up the different codestyles here.

Testing

I have tried 2 frameworks for testing, one of them will be probably showcased in +lectures. If you have not picked one yet, you can take an inspiration from the +following.

catch2

It is quite popular, only one header-file, also might be easier to set up.

Might feel slow to compile, this can be addressed by having one object file with +precompiled main for tests, e.g.

/* File: catch_main.cpp
* Compile it with: g++ $(CXXFLAGS) -c catch_main.cpp
*
* Once you have source file with tests, e.g. test_something.cpp, compile it in
* a similar fashion: g++ $(CXXFLAGS) -c test_something.cpp $(LDLIBS)
*
* And link them together:
* g++ catch_main.o test_something.o -o test_something
*
* Now you can run ./test_something and if you change it, you do not need to compile
* the main again.
*/
#define CATCH_CONFIG_MAIN
#include "catch.hpp"

Google Test

It is faster compared to catch2, even if you do not precompile the main. Might +be more complicated to set up, since there are multiple files (it is not one header +file). Not very user friendly on aisa. However can be installed through package +manager.

+ + + + \ No newline at end of file diff --git a/pb161/index.html b/pb161/index.html new file mode 100644 index 0000000..44a1cad --- /dev/null +++ b/pb161/index.html @@ -0,0 +1,25 @@ + + + + + +Introduction | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/search/index.html b/search/index.html new file mode 100644 index 0000000..4812ba9 --- /dev/null +++ b/search/index.html @@ -0,0 +1,25 @@ + + + + + +Search the documentation | mf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..29f860b --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://blog.mfocko.xyz/blogweekly0.5https://blog.mfocko.xyz/blog/2023/08/02/coprweekly0.5https://blog.mfocko.xyz/blog/aoc-2022/1st-weekweekly0.5https://blog.mfocko.xyz/blog/aoc-2022/2nd-weekweekly0.5https://blog.mfocko.xyz/blog/aoc-2022/3rd-weekweekly0.5https://blog.mfocko.xyz/blog/aoc-2022/4th-weekweekly0.5https://blog.mfocko.xyz/blog/aoc-2022/introweekly0.5https://blog.mfocko.xyz/blog/archiveweekly0.5https://blog.mfocko.xyz/blog/leetcode/sort-diagonallyweekly0.5https://blog.mfocko.xyz/blog/tagsweekly0.5https://blog.mfocko.xyz/blog/tags/%F0%9F%8F%ADweekly0.5https://blog.mfocko.xyz/blog/tags/adminweekly0.5https://blog.mfocko.xyz/blog/tags/advent-of-codeweekly0.5https://blog.mfocko.xyz/blog/tags/advent-of-code-2022weekly0.5https://blog.mfocko.xyz/blog/tags/coprweekly0.5https://blog.mfocko.xyz/blog/tags/cppweekly0.5https://blog.mfocko.xyz/blog/tags/iteratorsweekly0.5https://blog.mfocko.xyz/blog/tags/leetcodeweekly0.5https://blog.mfocko.xyz/blog/tags/red-hatweekly0.5https://blog.mfocko.xyz/blog/tags/rustweekly0.5https://blog.mfocko.xyz/blog/tags/vpsweekly0.5https://blog.mfocko.xyz/contributionsweekly0.5https://blog.mfocko.xyz/ib002/tagsweekly0.5https://blog.mfocko.xyz/ib002/tags/applicationsweekly0.5https://blog.mfocko.xyz/ib002/tags/backtrackingweekly0.5https://blog.mfocko.xyz/ib002/tags/balanced-treesweekly0.5https://blog.mfocko.xyz/ib002/tags/bfsweekly0.5https://blog.mfocko.xyz/ib002/tags/bottom-up-dpweekly0.5https://blog.mfocko.xyz/ib002/tags/cweekly0.5https://blog.mfocko.xyz/ib002/tags/csharpweekly0.5https://blog.mfocko.xyz/ib002/tags/dynamic-arrayweekly0.5https://blog.mfocko.xyz/ib002/tags/dynamic-programmingweekly0.5https://blog.mfocko.xyz/ib002/tags/exponentialweekly0.5https://blog.mfocko.xyz/ib002/tags/graphsweekly0.5https://blog.mfocko.xyz/ib002/tags/greedyweekly0.5https://blog.mfocko.xyz/ib002/tags/iterativeweekly0.5https://blog.mfocko.xyz/ib002/tags/iteratorsweekly0.5https://blog.mfocko.xyz/ib002/tags/javaweekly0.5https://blog.mfocko.xyz/ib002/tags/karelweekly0.5https://blog.mfocko.xyz/ib002/tags/postconditionsweekly0.5https://blog.mfocko.xyz/ib002/tags/pythonweekly0.5https://blog.mfocko.xyz/ib002/tags/recursionweekly0.5https://blog.mfocko.xyz/ib002/tags/red-black-treesweekly0.5https://blog.mfocko.xyz/ib002/tags/sortingweekly0.5https://blog.mfocko.xyz/ib002/tags/testingweekly0.5https://blog.mfocko.xyz/ib002/tags/time-complexityweekly0.5https://blog.mfocko.xyz/ib002/tags/top-down-dpweekly0.5https://blog.mfocko.xyz/searchweekly0.5https://blog.mfocko.xyz/talksweekly0.5https://blog.mfocko.xyz/ib002/weekly0.5https://blog.mfocko.xyz/ib002/algorithms-correctness/postcondition-ambiguityweekly0.5https://blog.mfocko.xyz/ib002/category/algorithms-and-correctnessweekly0.5https://blog.mfocko.xyz/ib002/category/asymptotic-notation-and-time-complexityweekly0.5https://blog.mfocko.xyz/ib002/category/graphsweekly0.5https://blog.mfocko.xyz/ib002/category/recursionweekly0.5https://blog.mfocko.xyz/ib002/category/red-black-treesweekly0.5https://blog.mfocko.xyz/ib002/graphs/bfs-treeweekly0.5https://blog.mfocko.xyz/ib002/graphs/iterative-and-iteratorsweekly0.5https://blog.mfocko.xyz/ib002/rb-trees/applicationsweekly0.5https://blog.mfocko.xyz/ib002/rb-trees/rulesweekly0.5https://blog.mfocko.xyz/ib002/recursion/karel-1weekly0.5https://blog.mfocko.xyz/ib002/recursion/pyramid-slide-downweekly0.5https://blog.mfocko.xyz/ib002/time-complexity/extendweekly0.5https://blog.mfocko.xyz/pb071/weekly0.5https://blog.mfocko.xyz/pb071/bonuses/seminar-03weekly0.5https://blog.mfocko.xyz/pb071/bonuses/seminar-04weekly0.5https://blog.mfocko.xyz/pb071/bonuses/seminar-05-06weekly0.5https://blog.mfocko.xyz/pb071/bonuses/seminar-08weekly0.5https://blog.mfocko.xyz/pb071/bonuses/seminar-10weekly0.5https://blog.mfocko.xyz/pb071/category/bonusesweekly0.5https://blog.mfocko.xyz/pb071/category/practice-examsweekly0.5https://blog.mfocko.xyz/pb071/mrweekly0.5https://blog.mfocko.xyz/pb071/pexam/camsweekly0.5https://blog.mfocko.xyz/pb071/pexam/garbage_collectweekly0.5https://blog.mfocko.xyz/pb161/weekly0.5https://blog.mfocko.xyz/pb161/environmentweekly0.5https://blog.mfocko.xyz/weekly0.5 \ No newline at end of file diff --git a/talks/index.html b/talks/index.html new file mode 100644 index 0000000..3fa9ef5 --- /dev/null +++ b/talks/index.html @@ -0,0 +1,25 @@ + + + + + +Talks | mf + + + + + + + + + + + + + +
+

Talks

Featured talks I presented on various events.

Packit: RPM integration, all in one

Do you want to automate how you build and test your RPM packages? Do you maintain any package in Fedora and want to automate the releases? Or are you just interested in CI/CD on GitHub or GitLab, Fedora and integration of upstream projects with RPM-based Linux distributions? In this session, we are going to deep-dive into features of Packit that can help you do your day-to-day job.
  • DevConf.cz
  • Brno, Czechia
  • 6/2023

Also presented on:

  • DevConf.cz Mini in Brno, Czechia (3/2023)

Credits to Paweł Kosiec for implementing his own React components for talks.

+ + + + \ No newline at end of file